Первая в мире компьютерная программа. Кем были первые программисты? Ада Августа не останавливается в своих научных расчетах

Многие считают это ремесло непонятным настолько, что нет никаких шансов разобраться в принципах даже теоретически.
Попытаюсь объяснить как это происходит, что называется, на пальцах.

Для написания программ используются языки программирования, которые разделяют на низкоуровневые, высокоуровневые и сверхвысокоуровневые, а какой из них какой и чем отличается станет ясно чуть позже. Но забегая вперед добавлю, что каждый язык создан для определенных задач и не всегда одну и ту же задачу можно реализовать на разных языках.
Для понятности, буду приводить примеры на бытовых приборах и задачах, с которыми мы сталкиваемся каждый день.
Итак, задача - нарезать хлеб к обеду. Для человека простейшая задача - чего его там резать-то, взял и нарезал, правда?
Самый главный навык программиста, без которого ничего не получится - умение разделять задачу на последовательность действий. Чем ниже уровень языка программирования, тем более детально нужно описывать эту последовательность.

Приведу пример, как выглядела бы программа по нарезке хлеба для нашего тела

Задача "нарезать хлеба" на языке программирования высокого уровня

1.Открыть правой рукой хлебницу;
__2.Взять булку хлеба правой рукой;
__3.Положить хлеб на разделочную доску; (предположим, что доска уже лежала на столе)
__4.Открыть правой рукой верхний ящик стола;
__5.Найти блестящий нож, длиной 20 см, с черной ручкой;
__6.Взять нож в правую руку;
__7.Поднести нож к хлебу;
__8.Зафиксировать хлеб левой рукой, взявшись за левый край булки;
__9.Расположить нож строго над правым ребром булки хлеба;
__10.Повторять следующие действия 5 раз:
____10.1.Отступить влево на сантиметр;
____10.2.Повторять следующие действия, пока лезвие ножа не не коснется доски:
________10.2.1.Прижать нож к хлебу;
________10.2.2.Совершить ножом возвратно поступательное движение вперед-назад;
____10.3.Поднять нож вверх;
__11.Положить нож в ящик;
__12.Отпустить левой рукой хлеб.
Все, программа по нарезке хлеба в количестве пяти кусков готова, можно ее продолжить, описав стирание крошек со стола, укладывания нарезанных кусочков на тарелочку и т.д.

Отладка программы

Запускаем программу и смотрим, как она работает:
Ой... вместе с пятым куском и палец отрезал...
чёрт! остановить программу!
Я же не написал как именно нужно зафиксировать хлеб левой рукой, схватился как попало и большой палец торчал в сторону...
Возвращаемся к строчке "Зафиксировать хлеб левой рукой, взявшись за левый край булки;"
После нее пишем:
"Поджать большой палец левой руки влево, к ладони;"
Запускаем программу
Ой... на строчке "Положить нож в ящик;" нож упал на пол...
Проклятье! оказывается, стол стоит немного под наклоном и ящик сам закрылся...
Возвращаемся к коду и перед строчкой "Положить нож в ящик;" пишем "Открыть правой рукой верхний ящик стола;"
Заметили ошибку? Нет?!
Как мы можем открыть ящик правой рукой, если в этой руке нож? Значит, сначала нужно положить нож на стол, потом открыть ящик, снова взять нож и т.д.
И делаем мы это до тех пор, пока хлеб не будет нарезан как следует, без повреждения мебели и пальцев.
Вот, примерно так происходит отладка
С опытом начинаешь писать программы, которые работают с первого раза, допуская минимум ошибок, а проверка "открыт ли ящик", перед складыванием в него чего-то, входит в привычку.

Когда какие-то операции совершаются постоянно, такие как нарезка хлеба, мойка посуды и т.д., то программисты их описывают в виде процедур.
Процедура - набор определенных действий, спрятанный под одной командой.
Таким образом, текст программы, который я приводил выше, можно поместить в процедуру под названием НарезатьХлеба(параметр), где в качестве параметра будем указывать количество кусков

в результате, программа с использованием процедур будет выглядеть так:
__ЗайтиНаКухню();
__НарезатьХлеба(5);
__ПоставитьХлебНаСтол();
__ПомытьПосуду();
и нет предела совершенству

Теперь о языке низкого уровня

на нем пришлось бы описывать эту задачу еще более детально, вплоть до того, какими пальцами и с каким усилием нужно держать нож, что "открыть ящик" - это совершить последовательность действий все той же рукой с использованием кисти, пальцев, мышц предплечья, усилий в килограммах на сантиметр и т.д. Пришлось бы даже описать что такое правая рука, где она находится и не забыть проверить есть ли она вообще в наличии...
Но когда-то, не было и низкоуровневых языков программирования и его писали на машинных кодах, т.е. программа выглядела в виде последовательностей единиц и нулей, это были темные времена.

Стоит немного рассказать что такое высокоуровневый язык и зачем нужен низкоуровневый, если проще писать на высокоуровневом?
Высокоуровневый язык был написан на низкоуровневом, в него были заложены команды, в виде процедур, подразумевающие последовательность действий, таких как "открыть ящик", "взять нож в руку" и т.д. но если по какой-то причине потребуется взять нож только двумя пальцами, потому что ручка сломана или отсутствует, например, то сделать этого не удастся, ибо команда "взять нож в руку" подразумевает использование всех пяти пальцев. Для таких ситуаций в высокоуровневых языках есть возможность делать вставки кода на низкоуровневом языке и вместо стандартной команды "взять нож в руку" пишется код на низком уровне под нож со сломанной ручкой.
Человек все эти операции делает не задумываясь, но машина так не умеет, ей нужно подробно объяснить что, как и в какой последовательности.
Сверхвысокоуровневые языки являются узкоориентированными на определенные задачи, например, для работы на кухне, они включают набор специальных команд и код на них выглядел бы примерно, как программа с использованием процедур, что описана выше.

Вы наверняка сталкивались с тем, что какие-то программы работают только под Windows, например, и их нет под Android или наоборот, хотя функции, казалось бы, обычные, и почему на телефон с Windows Phone нельзя установить Android?
Объясню на примере все той же программы для кухни: в тексте программы сказано "Найти блестящий нож, длиной 20 см, с черной ручкой в верхнем ящике стола", например, это для Windows. Однако, в андройде нет верхнего ящика стола, ножи там хранятся в настенном шкафу, т.е. процедура открытия ящика должна быть заменена на процедуру открытия шкафа, согласитесь - они разные! Но и нож там лежит длиной не 20 см, а в 25, он вовсе не блестящий и ручка у него не черная, а синяя. Поэтому, чтобы нарезать хлеба, нужно существенно переписать программу, хотя результат будет такой же. Для этого существуют кросплатформенные программы, которые могут работать под разными системами, т.е. на разных кухнях, ибо программисты предусмотрели оба варианта. Это, конечно, замечательно, но у них есть и минусы: если у вас всегда используется только кухня с ящиками в столах, то зачем вам код, который умеет работать со шкафами? А место он занимает. Это все равно что купить микроволновку, у которой в комплекте идут две дверки, одна предназначена для открывания влево, а другая вправо и еще у этой печки есть ниша, в которую можно положить ненужную дверку, но из-за этой ниши микроволновка выше на 10 мс. Вы поставите нужную дверку, а ниша будет занимать место.

Графиня
Ада Лавлейс

На технологической выставке в 1834 г. Чарльз Бэббидж впервые публично заявил о своей новой разработке – , прабабушке современного компьютера.

Естественно, его речь была насыщена математическими терминами и логическими выкладками, которые неподготовленному человеку понять было сложно.

А Ада Лавлейс (1815-1852) не только все поняла, но и забросала Чарльза вопросами по существу проблемы.

Бэббидж был поражен остротой ума девушки, к тому же, Ада была почти ровесницей его рано умершей дочери.

Кто же была эта девушка?

Ада Августа Лавлейс, урожденная Байрон, родилась 10 декабря 1815 года в семье известного английского поэта лорда Байрона и его жены Анабеллы. Через месяц после рождения ребенка лорд Байрон покинул семью и никогда больше не видел свою дочь.

Анабелла сделала все возможное, чтобы ее дочь никогда не стала поэтессой. Она нанимала дочери выдающихся в то время учителей, чтобы заинтересовать ее математикой и музыкой, и вполне в этом преуспела. Во время тяжелой болезни Ада, на три года потерявшая способность ходить, продолжала свои занятия.

В 1834 году на технологической выставке одержимость юной леди математикой обрела воплощение. Открылась новая, отличная возможность при помощи математики заставить машину помогать человеку решать математические задачи! Впоследствии Бэббидж руководил научными занятиями Ады, посылал ей статьи и книги, представляющие интерес, и знакомил со своими работами.

Забегая далеко вперед, по своему опыту могу сказать, что когда я в студенческие годы начала писать свои первые программы на ЭВМ, то тоже была буквально потрясена возможностями машины в области математических расчетов. И по объему вычислений, и по быстродействию, и по отсутствию ошибок в расчетах ЭВМ, конечно, все делала классно!

В 1835 году Ада выходит замуж за лорда Кинга, который впоследствии получил титул графа Лавлейса. У них родилось два сына и дочь, но ни дети, ни муж, ни светская жизнь не могли оторвать Аду от ее любимой математики. Не зря ее называли «Повелительницей чисел»!

В 1842 г. итальянский математик Луис Менебреа, преподаватель баллистики Туринской артиллеристской академии, опубликовал “Очерк Аналитической машины, изобретенной Чарльзом Бэббиджем”. Книга была написана на французском языке, и Бэббидж обратился к Аде Августе с просьбой перевести ее на английский язык.

Графиня Лавлейс, резонно рассудив, что ее матери вполне достаточно, чтобы заниматься с внуками и с многочисленным штатом домашней прислуги, с радостью вернулась в мир математики. Ада Августа решила полностью посвятить себя любимой науке, работе над машиной Бэббиджа и ее широкой популяризации.

Кстати, муж ее полностью поддерживал. Наверное, поэтому его фамилия вошла в историю вычислительной техники.

В течение девяти месяцев графиня работала над текстом книги, попутно дополнив ее собственными комментариями и замечаниями. Именно эти комментарии и замечания сделали ее известной в мире науки, а заодно и ввели в историю.

В одном из своих примечаний она самостоятельно написала первую в истории человечества компьютерную программу - алгоритм, представляющий собой список операций для вычисления чисел Бернулли.

Предвосхищая “этапы” компьютерного программирования, Ада Лавлейс, так же как и современные математики, начинает с постановки задачи, затем выбирает метод вычисления, удобный для программирования, и лишь затем переходит к составлению программы.

“Примечания” Лавлейс заложили основы современного программирования. Одним из важнейших понятий программирования служит понятие цикла, которому она дает следующее определение:

“Под циклом операций следует понимать любую группу операций, которая повторяется более одного раза”.

Организация циклов в программе значительно сокращает ее объем. Без такого сокращения практическое использование аналитической машины было бы нереальным, т. к. она работала с перфокартами, и требовалось бы огромное их количество для каждой решаемой задачи.

«Можно с полным основанием сказать, Аналитическая машина точно так же плетет алгебраические узоры, как ткацкий станок Жаккарда воспроизводит цветы и листья»

– писала графиня Лавлейс. Она была одна из немногих, кто понимал, как работает машина и каковы ее перспективы.

Уже в то время Ада Лавлейс отдавала себе полный отчет в колоссальных возможностях универсальной вычислительной машины.

Вместе с тем она прекрасно понимала границы этих возможностей:

“Желательно предостеречь против преувеличения возможностей аналитической машины. Аналитическая машина не претендует на то, чтобы создавать что-то действительно новое. Машина может выполнить все то, что мы умеем ей предписать. Она может следовать анализу; но она не может предугадать какие-либо аналитические зависимости или истины. Функции машины заключаются в том, чтобы помочь нам получить то, с чем мы уже знакомы”.

Вместе с тем уже в 40-х годах 19 века она разглядела в машине то, о чем боялся думать ее изобретатель Бэббидж: «Суть и предназначение машины изменятся от того, какую информацию мы в нее вложим. Машина сможет писать музыку, рисовать картины и покажет науке такие пути, которые мы никогда и нигде не видели».

В своей первой и, к сожалению, единственной научной работе Ада Лавлейс рассмотрела большое число вопросов, актуальных и для современного программирования. Примечания графини Лавлейс к книге Луиса Менебреа занимают всего 52 страницы. Собственно, это все, что оставила Ада Лавлейс для истории. Но эта краткость - сестра огромного таланта. Даже 52 страницы могут перевернуть окружающий мир до неузнаваемости.

Когда появились первые компьютеры? Дать ответ на этот вопрос не так просто, поскольку нет одной единственно правильной классификации электронно-вычислительных машин, а также формулировок, что можно к ним относить, а что - нет.

Первое упоминание

Само слово "компьютер" было впервые документировано в 1613 году и означало человека, который выполняет расчеты. Но в XIX веке люди поняли, что машина никогда не устает работать, и она может выполнять работу гораздо быстрее и точнее.

Чтобы начать отсчет эры вычислительных машин, чаще всего берут 1822 год. Первый компьютер изобрел английский математик Чарльз Бэббидж. Он создал концепцию и приступил к изготовлению разностной машины, которая считается первым автоматическим устройством для вычислений. Она была способна подсчитывать несколько наборов чисел и делать распечатку результатов. Но, к сожалению, из-за проблем с финансированием Бэббидж так и не смог завершить ее полноценную версию.

Но математик не сдавался, и в 1837 году он представил первый механический компьютер, названный аналитической машиной. Это был самый первый компьютер общего назначения. В это же время началось его сотрудничество с Адой Лавлейс. Она переводила и дополняла его труды, а также сделала первые программы для его изобретения.

Аналитическая машина состояла из таких частей: арифметико-логического устройство, блок интегрированной памяти и устройство для контроля движения данных. Из-за денежных трудностей она также не был завершена при жизни ученого. Но схемы и разработки Бэббиджа помогли другим ученым, которые создавали первые компьютеры.

Спустя почти 100 лет

Как ни странно, за целый век вычислительные машины почти не продвинулись в своем развитии. В 1936-1938 годах немецкий ученый Конрад Цузе создал Z1 - это первый электромеханический программируемый двоичный компьютер. Тогда же, в 1936 году, Алан Тьюринг построил машину Тьюринга.

Она стала основой для дальнейших теорий о компьютерах. Машина эмулировала действия человека, следующего списку логических указаний, и печатала результат работы на бумажной ленте. Аппараты Цузе и Тьюринга — это первые компьютеры в современном понимании, без которых не появились бы компьютеры, к которым мы привыкли сегодня.

Все для фронта

Вторая мировая война повлияла и на развитие ЭВМ. В декабре 1943 году компания Tommy Flowers представила засекреченную машину под названием «Коллос», которая помогала британским агентам взламывать шифры немецких сообщений. Это был первый полностью электрический программируемый компьютер. О его существовании широкая общественность узнала лишь в 70-х годах. С тех пор ЭВМ привлекли внимание не только ученых, но и министерств обороны, которые активно поддерживали и финансировали их разработку.

Насчет того, какой цифровой компьютер считать первым, идут споры. В 1937-1942 годах профессор Айовского университета Джон Винсент Атанасов и Клифф Берри (аспирант) разрабатывали свой компьютер ABC. А в 1943-1946 Дж. Преспер Эккерт и Д. Мокли, ученые Пенсильванского университета, построили мощнейший ENIAC весом в 50 тонн. Таким образом, Атанасов и Берри создали свою машину раньше, но поскольку она так никогда и не была полностью функционирующей, то часто звание «самый первый компьютер» достается ENIAC.

Первые коммерческие образцы

С огромными габаритами и сложностью конструкции компьютеры были доступны только военным ведомствам и крупным университетам, которые собирали их самостоятельно. Но уже в 1942 г. К. Цузе начал работу над четвертой версией своего детища - Z4, и в июле 1950 года продал его шведскому математику Эдуарду Стиефелю.

А первые компьютеры, которые начали выпускаться массово, это модели с лаконичным названием 701, произведенные IBM 7 апреля 1953 года. Всего их было продано 19701 штук. Конечно же, это все еще были машины, предназначенные только для крупных учреждений. Для того чтобы стать действительно массовыми, им нужно было еще несколько важных совершенствований.

Так, в 1955 году 8 марта заработал «Вихрь» — компьютер, который был изначально задуман во времена Второй мировой войны в качестве тренажера для пилотов, но к моменту своего создания подоспевший к началу Холодной войны. Тогда он стал основой для разработки SAGE - подсистемы противовоздушной обороны, разработанной для автоматического наведения на цель самолетов-перехватчиков. Ключевыми особенностями «Вихря» стали наличие оперативной памяти объемом 512 байт и вывод графической информации на экран в режиме реального времени.

Технику в массы

Компьютер TX-O, представленный в 1956 году в Массачусетском технологическом институте, был первым, в котором использовались транзисторы. Это позволило сильно уменьшить стоимость и габариты техники.

Затем команда ученых, которые занимались разработкой TX-O, покинула институт, основала компанию Digital Equipment Corporation и в 1960 году представила компьютер PDP-1, начавший эру миникомпьютеров. Их размер был не больше одной комнаты или даже шкафа, и они были предназначены для более широкого круга клиентов.

Ну а первые компьютеры-десктопы стала выпускать компания Hewlett Packard в 1968 году.


Первую компьютерную программу написала женщина, мать троих детей и аристократка. И написала она ее еще до того, как появился первый в мире компьютер.

Княгиня Лавлейс или Ада А. Байрон-Кинг - дочь великого британского поэта лорда Байрона. Ее отец бросил ее мать еще когда она была маленькой. Мать чрезвычайно радовалась тому, что ее маленькая дочурка сильно увлеклась математикой, хотя были и попытки пойти по стопам отца и писать стихи. Однажды в 12 лет она показала матери исчерканные листки бумаги, на ней юная Ада изобразила чертеж летательного аппарата.

В 17 лет приставленная ко двору, девушка не стала искать себе ухажера, а примкнула к исследователю математику Чарьзу Бэббиджу. Ее так увлекал идея автоматический счетной машинки, которая считалась безумием в то время, что все свои силы тратила на ее проектирование. Бэббиджа вдохновляло то, что Наполеон уже заказывал нечто подобное и его придворным ученным не удалось закончить изобретение из-за развязавшейся войны.

Бэббидж придумал название для своей будущей машины и назвал ее «дифференциальной». В 1882 году ученый заинтриговал Адмиралтейство Британии и те стали спонсорами его разработок. Размер машины был огромный, она должна была занимать целую комнату и вычислять с точностью до 10-го знака дроби. За 10 лет ученый построил только один блок своего устройства. Идея аналитической машины захватывала Бэббиджа, он по сути предложил миру схему почти современного компьютера. Центральный процессор он называл мельницей, были перфокарты, программы-инструкции. Машина состояла из множества зубчатых колес и должна была приводиться в действие паром. В 1871 году Чарльз Бэббидж умер и правительство Англии решило, что никто больше не способен изобрести подобную машину и закрыла проект.

Но тем не менее 13 июля 1843 года Ада прислала математику письмо, в нем она изложила алгоритм машинных вычислений чисел Бернулли. Ада считала, что обработка данных машиной вовсе не обязана быть аналитической или арифметической, она считала это заблуждением. Цифры машина понимает так же как и буквы или другие символы. Графиня считала, что в будущем машины смогут писать музыку и даже стихи.

У самой же было развлечение - поиск формулы, которая позволила бы всегда побеждать в тотализаторе на скачках. Ада умерла в возрасте 37 лет, прожила столько же как и ее отец и была похоронена в той же усыпальнице, что и лорд Байрон. В день ее рождения - 10 декабря, во многих странах отмечают День программиста, а в 70-е Пентагон назвал в ее честь язык программирования ADA.

Если коротко, то новые языки программирования и другие инструменты создаются на основе уже существующих. Полная аналогия с другими областями техники, где новые станки и материалы позволяют создавать всё более совершенные станки и материалы. Как все станки начались с палки-копалки и кремниевого рубила, так и языки программирования начались с перфокарт и нечитаемого двоичного кода.

Центральный процессор вашего компьютера понимает только программы, написанные на языке ноликов и единичек. Например, команда «прибавить константу 5 к числу, записанному в регистре AL» записывается так:

0000 0100 0000 0101

Здесь 0000 0100 - код операции «прибавить число к регистру AL», а 0000 0101 - двоичное представление числа 5.

На заре индустрии для ввода программы в компьютер нужно было либо перещёлкнуть сотни тумблеров на специальной панели (тумблер ВЫКЛ - нолик, тумблер ВКЛ - единичка), либо пробить дырочки в специальной перфокарте. Ошиблись в одной ячейке из тысячи - программа будет работать неправильно, будьте добры сами найти ошибку методом пристального взгляда.

Ясно, что такой способ программирования жутко неудобен и подвержен ошибкам. Чтобы не тратить время на это занудство, ленивые программисты начали думать, как переложить неблагодарную работу на машину.

Можно один раз хорошенько помучиться и написать на языке ноликов и единичек вспомогательную программу, которая называется ассемблер («сборщик»). Этот волшебный ассемблер принимает на вход человеко-читаемый текст и преобразует его в нолики и единички. Например, та же самая команда «прибавить константу 5 к числу, записанному в регистре AL» записывается на языке ассемблера x86 так:

Думаю, вы согласитесь, что это всё-таки более читаемо, чем 0000 0100 0000 0101. Здесь хотя бы понятно, что речь идёт о сложении (ADD) и числе 5. Теперь уже дело ассемблера преобразовать эту строчку в 0000 0100 0000 0101. На языке ассемблера сложно писать большие программы, процессоры разных производителей могут требовать разных ассемблеров, но всё равно это был большой шаг вперёд.

Дальше инженерную мысль было не остановить. Нужно один раз помучиться, чтобы написать на ассемблере компилятор языка программирования, например Фортрана. Потом ещё немного помучиться, чтобы написать на Фортране компилятор Алгола. Затем передохнуть, помучиться и написать на Алголе компилятор языка CPL. Ещё немного мучений, и можно на основе CPL написать компилятор языка C. Дальше можно уже не мучиться и в свое удовольствие писать на C компиляторы C++, Java, C# и других современных языков. Впрочем, никто не запретит использовать Java чтобы написать ассемблер x86 и замкнуть рекурсию.