История языков программирования. 1980-е
Когда-то давно в программировании не существовало понятия «объекты», а сегодня уже трудно представить достаточно мощный язык, хотя бы частично не использующий принципы ООП. И хотя объектное программирование зародились ещё в 1960-х, именно 1980-е стали тем временем, когда оно стало мейнстримом.
Но начать следует с аппаратной части. В 1979 году свет увидел легендарный процессор Intel 8088, который дал мощный толчок развитию персональных компьютеров. Так как IBM PC уже по сути стал стандартом, то отныне все машины поддерживали любые языки программирования без необходимости их урезать и адаптировать.
Философия программирования
Несмотря на то, что формально программирование перестало зависеть от машин ещё в 1950-х, лишь теперь это обрело реальный смысл. Разработчики наконец избавились от необходимости задумываться об особенностях языка на том или ином компьютере, что в конечном счёте привело к развитию идей структурного, неимперативного и объектно-ориентированного программирования.
Simula
Вне всяких сомнений, самой большой революцией 80-х годов стало появление объектно-ориентированных языков. Однако первопроходцем принято считать язык Simula, разработанный в 1967 году в Норвежском Вычислительном Центре тремя учёными – Оле-Йоханом Далем, Бьорном Мирхаугом и Кристен Нигаард.
Однако, как мы помним, это было время комитетов в программировании. Более того, так как язык был разработан в небольшом скандинавском университете тремя людьми без соответствующего опыта, шансы получить мировое признание у Simula 67 были нулевые.
Язык был развитием Algol 60 и на первый взгляд не содержал ничего нового. Реальная же важность Simula 67 заключалась в философии разделения самой программы и её экземпляра. До этого большинство программистов не разделяло эти понятия. Даль и Нюгор, напротив, были озадачены именно созданием симуляций (отсюда и название языка).
Чтобы понять отличие, рассмотрим пример, пусть будет автомобиль. В традиционных языках (Fortran, Algol, BASIC или Cobol) вам необходимо писать подпрограмму или модуль для каждого автомобиля, хотя все они будут более или менее одинаковыми. В Simula 67 был реализован иной подход – вы создаёте лишь один модуль, определяющий автомобиль как набор переменных, процедур и функций, а затем просто создаёте экземпляры с частными параметрами.
С этой простой идеи начала развиваться философия объектно-ориентированного программирования. Это сегодня мы говорим о классах, объектах, экземплярах и наследовании, но всё это появилось ещё в Симуле, просто потребовалось время для совершенствования идей и массового внедрения в программирование.
Smalltalk
Следующим важным шагом в развитии объектно-ориентированных языков стал Smalltalk.
Алан Кей жил на западном побережье США в эпицентре аппаратной революции. Главным его стремлением было создать компьютер, с которым мог работать даже ребёнок. Устроившись на работу в Xerox Palo Alto, Кей создал специальную исследовательскую группу. С компьютером не получилось, зато на свет появились Smalltalk 72 и 76, заимствовавшие идеи Simula. Об этом странном норвежском языке Кей прочитал в одном из научных журналов, идея ему понравилось и он положил её в основу своих разработок. Однако в 1981 году Кей покинул проект, после чего акценты Smalltalk изменились.
Отныне группа получила название «группа концепций программного обеспечения», а Smalltalk 80 позиционировался как «серьезный язык». Большой вклад в это внесли Адель Голдберг, Дэвид Робинсон, Ларри Теслер, Дэн Ингаллс и Питер Деат.
Smalltalk стал первым полноценным объектно-ориентированным языком и задал тренд на долгие годы. Кроме того, со Smalltalk связано ещё одно эпохальное событие. На этом языке был написана первая графическая среда. Однажды в Xerox Palo Alto зашёл Стив Джобс, восхитился этой разработкой и завербовал Ларри Теслера для создания LISA – предшественника первого Macintosh. Окна, иконки, мышь – всё это берёт начало здесь.
Объекты и другие языки
Объектно-ориентированный подход стал настолько популярен в конце 80-х годов, что многие традиционные языки стали включать в себя этот подход. Бьёрн Страуструп из компании AT&T расширил возможности языка C и создал C++. Были и другие расширения, даже более удачные, но Страуструп обладал соответствующими полномочиями, потому именно его вклад в программирование оказался историческим.
Главная особенность C++ – это полноценное расширение для C. Вам даже не нужен был компилятор, потому что это было реализовано в виде препроцессора, который преобразовал С++ в C. Каждая машина, поддерживающая родительский язык, могла поддерживать и новый объектно-ориентированный.
Таким образом, к концу 1980-х годов практически каждый программист был знаком либо с Basic, либо с C++.
Неимперативное программирование
Сегодня кажется, что объекты – суть всех популярных языков программирования, но в 1980-х годах не было однозначного мнения о лучшем подходе. Поэтому каждая новая идея была зафиксирована и считалась важным прорывом.
Стандартные языки программирования создавали программы, которые при выполнении могли быть куда сложнее, чем они описаны в коде. Например, цикл может выглядеть так, как будто это всего лишь несколько строк инструкций. Но при запуске это приводило к тысячам инструкций и динамической интерпретации. Это различие между статическим текстом и фактической реализацией программы использовалось в объектно-ориентированных языках, позволяя запущенному коду приводить к появлению любого количества экземпляров.
В неимперативном программировании есть чёткое различие между статическим и динамическим текстом программы. Есть два различных способа, с помощью которых это может быть достигнуто: функциональные и логические языки программирования.
Функциональные языки, такие как Lisp, FP и Hope, желали покончить с императивным программированием, настаивая, что применение частных случаев неэффективно по сравнению с обобщающими математическими функциями. К примеру, в императивном программировании выражение:
означает, что каждый раз, когда выполняется эта часть программы, А меняет значение, то есть фактически не имеет ни одного значения. Функциональные языки используют рекурсию для создания новых переменных и поэтому А не использует значения до момента запроса. Рекурсия также используется для замены циклов, поэтому время выполнения кода соизмеримо с полным временем выполнения программы. Единственная проблема заключается в том, что многие программисты находят рекурсию сложной. Тем не менее, самый известный функциональный язык, LISP, разработанный Джоном МакКарти из Массачусетского технологического института в 1959 году, по-прежнему имеет своих поклонников. И он по-прежнему является основным языком для ИИ в той или иной форме.
Логическое программирование
Самый успешный из логических языков — Prolog. Он основан на идее написания программ как набора логических операторов и использования перебора для автоматического определения результатов.
Формально этот подход освобождает программиста от беспокойства о том, как получается результат – в программу включаются только факты и их анализ. Сложность в Prolog заключается в том, что ему необходимы фундаментальные прорывы в логике, точнее, в автоматических процедурах проверки. Без этого Prolog не слишком функциональный и производительный язык.
Самой важной частью истории Prolog является его принятие японцами в 1981 году в рамках проекта десятилетия. Это стимулировало многих программистов в США, чтобы пересмотреть их использование Lisp в качестве первого выбора для программирования ИИ.
Турбо-языки
Было бы несправедливо обойти программирование 80-е годов, не упомянув семейство турбо-диалектов от Borland.
Turbo Pascal был первым из высокопроизводительных компиляторов нового поколения с простой средой разработки. Его создатель Андерс Хейлсберг (который, кстати, продолжил разработку C# для Microsoft) стал еще одним примером скандинавского влияния на вычисления.
Turbo Pascal прошёл путь от медленного и трудного в использовании интерпретатора до быстрого, интерактивного, адаптированного для всех машин компилятора, который приглянулся многим программистам.
После успеха Turbo Pascal появились интегрированные среды Turbo C, Turbo BASIC и Turbo Prolog.
Вдали от мейнстрима
Modula 2 был предложением Никлауса Вирта в качестве замены Pascal. По сути, это было обновление, включающее в себя идеи параллельного программирования. В 1980 году появилось Modula 2, более универсальное расширение, которое включало функции объектно-ориентированного программирования.
Это была первая реализация того, как один модуль может «видеть» данные, только используя интерфейс между ними, что позволяет программисту сосредоточиться на том, что делает модуль, а не на том, как он это делает. Эта простая идея описывает возможность скрытия и инкапсуляции данных, которые являются одной из основ объектно-ориентированного метода.
Modula 2 наследовала слишком много алгольных идей, поэтому мировой славы не получила. С другой стороны, на свет появилась Ada – пожалуй, последний из суперязыков. Она была создана очередным комитетом по заказу Министерства Обороны США и является возвратом к идеям Algol/Сobol. Ada – универсальный язык, который включает в себя невероятный диапазон функций. По этой причине его можно использовать для создания хоть объектно-ориентированной, хоть функциональной программы. Короче говоря, для всего.
В СССР
Однако комитетские языки тоже не теряли влияние. В Советском Союзе был выпущены ГОСТы на Алгол-68 и Фортран. Также в образовании стали закрепляться Basic и Pascal, которые стали для нескольких поколений фундаментом в мире программирования.
Именно так зарождался новый виток программирования – универсальных языков, понятных даже ребёнку, способных решать даже самые сложные задачи.
Если Вам понравилась статья, ставьте лайк и подписывайтесь на канал! Будет много интересного!
Как появились языки программирования: исторический экскурс в истоки мира программирования
Языки программирования создавались и разрабатывались в течение многих лет. Некоторые из них до сих пор находятся в процессе развития, так как потребности потребителя растут, разрабатывается новое «железо» и программистам приходится искать новые решения, а также принципы работы с инновациями.
Само понятие «язык программирования» можно трактовать как формальную знаковую систему, которую программисты используют для написания компьютерных программ. Однако, о языке машин инженеры стали задумываться намного раньше, чем у них появилась возможность писать на нем и создавать программы.
Идею о создании языка машин впервые в 19 веке высказал ученый Чарльз Бэббидж. Его считают основателем и отцом первого в мире компьютера. На тот момент его идеи были лишь предположениями. Он не знал о мониторах и микросхемах, но ему удалось точно описать основные принципы работы вычислительных машин. Со временем инженеры сделали грандиозный вывод о том, что эффективное использование компьютеров заключается в правильно подобранных алгоритмах.
Пик развития языков программирования пришелся на 50-е годы 20 века. Тогда, чтобы программировать, инженерам приходилось знать полностью всю архитектуру компьютера и понимать его машинные коды. В 50-е ты не мог быть программистом, если не знал, как собирается компьютер и из чего он состоит. У компьютеров того времени даже клавиатуры не было, но были перфокарты, которые не очень упрощали будни тогдашнего инженера-программиста.
Когда человеку нужно упростить свой труд, сделать его более автоматизированным, он начинает придумывать новые идеи и изобретать то, что могло бы облегчить ему жизнь. Так начали появляться первые языки программирования.
В то время инженеры-программисты были вынуждены детально изучать все машинные команды, а потом внимательно писать код, каждый раз тщательно его проверяя. Чтобы как-то упростить задачу, программистам требовалось перевести цифровые обозначения операций в буквы. Так появился первый язык программирования – Ассемблер (от английского assemble – собирать). Сейчас его считают языком низкого уровня программирования, но в свое время он произвел настоящий фурор. Программы, написанные на Ассемблере, были достаточно эффективны и работоспособны.
Затем программистам понадобилось создать язык более высокого уровня, который бы ориентировался на написание и запуск алгоритмов. В 1954 году был изобретен новый язык программирования – FORmula TRANslator или просто FORTRAN. Он жив до сих пор и достаточно востребован в Data Science. Существует множество версий Фортрана, но первая и оригинальная из множества версий использовалась еще на перфокартах, как и Ассемблер. Затем внедрение новых типов цифровых устройств побудило программистов не стоять на месте и создавать новые языки машин.
После Фортрана в 1958 году изобрели Algorithmic Language или Algol. Его создали на основе обособленных блоков. Это алгоритмический язык, которым сейчас уже никто не пользуется. По сути его можно назвать мертвым. Однако, в 58 году он был очень востребованным, так как предназначался для научных отчетов и публикаций.
Стремление программистов преобразовать язык программирования в подобие человеческого языка повлияло на создание COBOL в 1959 году. Его синтаксис значительно отличался от Ассемблера и Фортрана и был похож на естественный английский. Это стало новым веянием в мире программирования, так как у программистов появилась возможность работать с текстом и записями, а не машинным кодом.
Все вышеперечисленные языки программирования уже стали историей. Они очень стары и ими практически никто не пользуется. На их основе были созданы более современные языки, такие как С, С++, С#, Java и многие другие. О них мы подготовили для вас серию нарративов, которые мы начнем публиковать со следующей недели. У вас будет возможность подробнее ознакомиться с преимуществами и историей современных языков программирования. Вся информация будет простой и понятной.
Если мы сумели вас заинтересовать – подписывайтесь на наш канал. Дальше – все самое интересное!
История языков программирования: 1950-е
Программирование появилось задолго до 50-х годов XX века. Первые идеи высказал ещё Чарльз Бэббидж (1792-1871), которого по праву считают отцом компьютера. Он не знал о транзисторах, микросхемах и мониторах, но достаточно точно описал основные принципы, на которых будут строится все вычислительные машины. Развила идею графиня Ада Лавлейс (1815-1852). Её место в истории до сих вызывает немало споров, но одно абсолютно точно – именно Ада фактически стала первым известным программистом. Благодаря её трудам стало понятно, что путь к эффективному использованию машин – алгоритмы, описанные в коде.

Аналитическая машина Бэббиджа
Но программирование не могло развиваться в отрыве от компьютеров. Без них это просто игры разума, абстракция, вне зависимости от качества идей. Поэтому вплоть до 1950-х языки программирования представляли из себя набор машинных инструкций, часто узкоспециализированные и вымирающие вместе с целевым устройством.
Суть проблемы
Сегодня вам не надо ничего знать об архитектуре компьютера, для большинства программистов вообще важен только язык, всё остальное – вторично. В 1950-х всё было иначе – приходилось работать с элементарными машинными кодами, а это практически всё равно что программировать при помощи паяльника.
Ещё одной проблемой было то, что за разработку языков отвечали люди, непосредственно связанные с созданием компьютеров – в первую очередь инженеры и лишь вынужденно программисты. Потому они и представляли язык в виде последовательности номеров операций и ячеек памяти. Грубо говоря, это выглядело так:
01 x y – добавление содержимого ячейки памяти y к ячейке x;
02 x y – аналогичная процедура с вычитанием.
В итоге код программы превращался в бесконечную череду цифр:
Сегодня такой код вам покажется ужасом, но в начале 1950-х был нормой.

Компьютер 1940-х годов
Программистам приходилось долго учиться машинным командам, потом внимательно писать код, а после завершения ещё несколько раз его перепроверять – риск ошибки был велик. Проблемы возникла, когда развитие машин стало тормозиться нехваткой кадров для написания программ. Требовалось срочное решение.
Первый сборщик
Решение лежало на поверхности: необходимо перевести цифровые обозначения операций в буквы. То есть вместо «01 10 15» использовать «ADD 10 15». Это требовало дополнительного перевода символов в машинную команду, но, учитывая проблему, жертва была минимальна.
Решение оказалось настолько очевидным, что доподлинно неизвестно, кто первым изобрёл язык Ассемблера. Вероятнее всего, он появился одновременно сразу в нескольких местах. За название и популяризацию ответственными принято считать авторов книги «The preparation of programs for a digital computer» Уилкса, Уилера и Гилла. Нетрудно догадаться, что название Ассемблер происходит от английского слова assemble – собирать, монтировать, что вполне точно описывает процесс. Позднее символы стали касаться не только простейших операций, но и адресации, что значительно упростило читаемость кода.
Сейчас это кажется элементарным решением, но тогда реализация была сложным процессом, требующим созданий таблиц соответствия, присовения обозначения каждой ячейке памяти. Это привело к трём фундаментальным вещам:
Это стало катализатором языкового прорыва.
Компиляторы и предубеждения
Ассемблер позволил создать простые превращения. Например, перевод 01 в ADD. Макроассемблер расширил эту идею и подарил программистам возможность сворачивать несколько инструкций в одну. К примеру, если в программе вы постоянно добавляли значение в ячейку памяти и проверяли, не переполнена ли она, всё это можно было записать в макрос INCRT и использовать его, меняя лишь переменные. По сути, макроассемблеры превратились в первые языки высокого уровня.
Но в таком подходе заключалась важная проблема – каждый раз перед созданием кода необходимо было сворачивать базовые операции в макросы. Требовался инструмент, который освободит программистов от постоянного копирования. Так появился компилятор.
Теперь-то мы знаем, что благодаря компилятору мы можем создать язык программирования с абсолютно любым синтаксисом, главное, чтобы он грамотно переводил наш код в машинные команды. А в то время специалисты скептически относились к языкам высокого уровня. Частично это было обусловлено производительностью компьютеров – упрощение синтаксиса со сложными трансформациями дорого обходилось, могло вернуть технологический прогресс на несколько лет назад. Частично причиной были эмоции – было тяжело отойти от формы машинных команд, потерять контроль над процессами. Программисты всерьёз боялись, что после компиляции они не смогут понять исполняемые команды. Сегодня нам наплевать, как выглядит машинный код, а в те времена это казалось важной проблемой.
Тем не менее компилятор стал единственным выходом из ситуации, но здесь проявилась другая трудность – арифметические выражения. Их исполнение не совпадает с тем, как машина читает код. Из школьного курса мы знаем порядок вычислений в выражении «2+3*5», но машина читает код в одном направлении, так что ответ будет неверным. Да, указанный пример можно решить, создав макрос, но для сложных выражений уровня «(2 + 3 * 5 + 4/6) * 10 + 16- (14 + 15) * 8» требовался принципиально иной подход.
Эпоха новой формации
Найти алгоритм анализа стека удалось Джону Бэкусу, создателю Фортрана. Он начал работать над ним в 1954 году и ему потребовалось почти 5 лет, чтобы доказать право языков высокого уровня на существование. Полное название Фортрана – The IBM Formula Translating System, или FORmula TRANslator. Несмотря на 60-летний возраст, он остаётся одним из самых популярных языков программирования и невероятно востребован в Data Science. За это время мы видели множество версий: Fortran 1, II, 66, 77, 90, 95, 2008, а в следующем году выйдет ещё одна (планировался Fortran 2015, но из-за задержек название может смениться на 2018). Именно в Фортране впервые были одновременно реализованы многие атрибуты языка высокого уровня, среди которых:
Ещё одним важным наследием Фортрана, о котором даже не догадываются современные программисты, является использование ограничений для переменных для целых чисел. Все они должны были начинаться с одного из 6 символов I, J, K, L, M, N (происходит от I-Nteger). Именно отсюда взялась привычка для перечислений брать переменные i, j и т.д.

IBM 704 – машина, на которой был создан Fortran
При этом Фортран оставался языком, приближенным к машинам. Например, там существовало такое:
Причиной была архитектура компьютера IBM, которой требовалась команда для использования нужного регистра: отрицательного, нулевого или положительного. Близость к машинам проявлялась и в известной команде GOTO (позднее она была унаследована Basic), означавший прямой переход к той или иной команде.
Возвращаясь к проблеме арифметических выражений, алгоритм перебора стека (то есть анализа всей строки) не был эффективным решением, но он доказал, насколько реализация может быть простой и логичной.
Языки для каждого
Fortran 1 был научным языком, в его основе лежали операции с комплексными числами и с плавающей запятой. Он даже не умел обрабатывать текст, для этого приходилось преобразовывать его в специальные коды. Поэтому Фортран оказался непригоден для бизнеса, где был специально создан язык Cobol.
Синтаксис у него принципиально иной, максимально приближенный к естественному английскому языку. Практически не было арифметики, только выражения вида:
Cobol стал олицетворением максимального удаления от прежнего машинно-арифметического мышления к общечеловеческому. И главное – теперь можно было работать с текстом и записями.
Следующим фундаментальным языком стал Algol (ALGOrithmic Language), предназначенный для научных отчётов и публикаций. В нём впервые появились естественные для нас вещи:
Именно из Алгол произошли C, C ++, C #, Java и многие другие популярные сегодня языки.
Четвёртым китом 1950-х стал Лисп (LISt Processing language), разработанный специально для обслуживания искусственного интеллекта. Главной его особенность стала работа не с императивными данными, а с функциями. Для этого Джону Маккарти пришлось предусмотреть множество механизмов для нормальной работы: динамическую типизацию, автоматическое распределение памяти, сборщик мусора. В конечном счёте, именно Лисп стал прародителем таких языков, как Python и Ruby, а сам до сих пор активно применяется в ИИ.
Таким образом, 1950-е изменили образ мышления программистов, подарили четыре фундаментальных языка и поставили мир на рельсы компьютерной революции.
В следующий раз поговорим о том, как развивались языки и мир программирования в 1960-е.
Этим текстом я хочу начать цикл статей об истории развития языков программирования. Он является адаптированной версией этого сборника.
Программирование появилось задолго до 50-х годов XX века. Первые идеи высказал ещё Чарльз Бэббидж (1792-1871), которого по праву считают отцом компьютера. Он не знал о транзисторах, микросхемах и мониторах, но достаточно точно описал основные принципы, на которых будут строится все вычислительные машины. Развила идею графиня Ада Лавлейс (1815-1852). Её место в истории до сих вызывает немало споров, но одно абсолютно точно – именно Ада фактически стала первым известным программистом. Благодаря её трудам стало понятно, что путь к эффективному использованию машин – алгоритмы, описанные в коде.

Аналитическая машина Бэббиджа
Но программирование не могло развиваться в отрыве от компьютеров. Без них это просто игры разума, абстракция, вне зависимости от качества идей. Поэтому вплоть до 1950-х языки программирования представляли из себя набор машинных инструкций, часто узкоспециализированные и вымирающие вместе с целевым устройством.
Суть проблемы
Сегодня вам не надо ничего знать об архитектуре компьютера, для большинства программистов вообще важен только язык, всё остальное – вторично. В 1950-х всё было иначе – приходилось работать с элементарными машинными кодами, а это практически всё равно что программировать при помощи паяльника.
Ещё одной проблемой было то, что за разработку языков отвечали люди, непосредственно связанные с созданием компьютеров – в первую очередь инженеры и лишь вынужденно программисты. Потому они и представляли язык в виде последовательности номеров операций и ячеек памяти. Грубо говоря, это выглядело так:
01 x y – добавление содержимого ячейки памяти y к ячейке x;
02 x y – аналогичная процедура с вычитанием.
В итоге код программы превращался в бесконечную череду цифр:
Сегодня такой код вам покажется ужасом, но в начале 1950-х был нормой.

Компьютер 1940-х годов
Программистам приходилось долго учиться машинным командам, потом внимательно писать код, а после завершения ещё несколько раз его перепроверять – риск ошибки был велик. Проблемы возникла, когда развитие машин стало тормозиться нехваткой кадров для написания программ. Требовалось срочное решение.
Первый сборщик
Решение лежало на поверхности: необходимо перевести цифровые обозначения операций в буквы. То есть вместо «01 10 15» использовать «ADD 10 15». Это требовало дополнительного перевода символов в машинную команду, но, учитывая проблему, жертва была минимальна.
Решение оказалось настолько очевидным, что доподлинно неизвестно, кто первым изобрёл язык Ассемблера. Вероятнее всего, он появился одновременно сразу в нескольких местах. За название и популяризацию ответственными принято считать авторов книги «The preparation of programs for a digital computer» Уилкса, Уилера и Гилла. Нетрудно догадаться, что название Ассемблер происходит от английского слова assemble – собирать, монтировать, что вполне точно описывает процесс. Позднее символы стали касаться не только простейших операций, но и адресации, что значительно упростило читаемость кода.
Сейчас это кажется элементарным решением, но тогда реализация была сложным процессом, требующим созданий таблиц соответствия, присовения обозначения каждой ячейке памяти. Это привело к трём фундаментальным вещам:
Это стало катализатором языкового прорыва.
Компиляторы и предубеждения
Ассемблер позволил создать простые превращения. Например, перевод 01 в ADD. Макроассемблер расширил эту идею и подарил программистам возможность сворачивать несколько инструкций в одну. К примеру, если в программе вы постоянно добавляли значение в ячейку памяти и проверяли, не переполнена ли она, всё это можно было записать в макрос INCRT и использовать его, меняя лишь переменные. По сути, макроассемблеры превратились в первые языки высокого уровня.
Но в таком подходе заключалась важная проблема – каждый раз перед созданием кода необходимо было сворачивать базовые операции в макросы. Требовался инструмент, который освободит программистов от постоянного копирования. Так появился компилятор.
Теперь-то мы знаем, что благодаря компилятору мы можем создать язык программирования с абсолютно любым синтаксисом, главное, чтобы он грамотно переводил наш код в машинные команды. А в то время специалисты скептически относились к языкам высокого уровня. Частично это было обусловлено производительностью компьютеров – упрощение синтаксиса со сложными трансформациями дорого обходилось, могло вернуть технологический прогресс на несколько лет назад. Частично причиной были эмоции – было тяжело отойти от формы машинных команд, потерять контроль над процессами. Программисты всерьёз боялись, что после компиляции они не смогут понять исполняемые команды. Сегодня нам наплевать, как выглядит машинный код, а в те времена это казалось важной проблемой.
Тем не менее компилятор стал единственным выходом из ситуации, но здесь проявилась другая трудность – арифметические выражения. Их исполнение не совпадает с тем, как машина читает код. Из школьного курса мы знаем порядок вычислений в выражении «2+3*5», но машина читает код в одном направлении, так что ответ будет неверным. Да, указанный пример можно решить, создав макрос, но для сложных выражений уровня «(2 + 3 * 5 + 4/6) * 10 + 16- (14 + 15) * 8» требовался принципиально иной подход.
Эпоха новой формации
Найти алгоритм анализа стека удалось Джону Бэкусу, создателю Фортрана. Он начал работать над ним в 1954 году и ему потребовалось почти 5 лет, чтобы доказать право языков высокого уровня на существование. Полное название Фортрана – The IBM Formula Translating System, или FORmula TRANslator. Несмотря на 60-летний возраст, он остаётся одним из самых популярных языков программирования и невероятно востребован в Data Science. За это время мы видели множество версий: Fortran 1, II, 66, 77, 90, 95, 2008, а в следующем году выйдет ещё одна (планировался Fortran 2015, но из-за задержек название может смениться на 2018). Именно в Фортране впервые были одновременно реализованы многие атрибуты языка высокого уровня, среди которых:
Ещё одним важным наследием Фортрана, о котором даже не догадываются современные программисты, является использование ограничений для переменных для целых чисел. Все они должны были начинаться с одного из 6 символов I, J, K, L, M, N (происходит от I-Nteger). Именно отсюда взялась привычка для перечислений брать переменные i, j и т.д.

IBM 704 – машина, на которой был создан Fortran
При этом Фортран оставался языком, приближенным к машинам. Например, там существовало такое:
Причиной была архитектура компьютера IBM, которой требовалась команда для использования нужного регистра: отрицательного, нулевого или положительного. Близость к машинам проявлялась и в известной команде GOTO (позднее она была унаследована Basic), означавший прямой переход к той или иной команде.
Возвращаясь к проблеме арифметических выражений, алгоритм перебора стека (то есть анализа всей строки) не был эффективным решением, но он доказал, насколько реализация может быть простой и логичной.
Языки для каждого
Fortran 1 был научным языком, в его основе лежали операции с комплексными числами и с плавающей запятой. Он даже не умел обрабатывать текст, для этого приходилось преобразовывать его в специальные коды. Поэтому Фортран оказался непригоден для бизнеса, где был специально создан язык Cobol.
Синтаксис у него принципиально иной, максимально приближенный к естественному английскому языку. Практически не было арифметики, только выражения вида:
Cobol стал олицетворением максимального удаления от прежнего машинно-арифметического мышления к общечеловеческому. И главное – теперь можно было работать с текстом и записями.
Следующим фундаментальным языком стал Algol (ALGOrithmic Language), предназначенный для научных отчётов и публикаций. В нём впервые появились естественные для нас вещи:
Именно из Алгол произошли C, C ++, C #, Java и многие другие популярные сегодня языки.
Четвёртым китом 1950-х стал Лисп (LISt Processing language), разработанный специально для обслуживания искусственного интеллекта. Главной его особенность стала работа не с императивными данными, а с функциями. Для этого Джону Маккарти пришлось предусмотреть множество механизмов для нормальной работы: динамическую типизацию, автоматическое распределение памяти, сборщик мусора. В конечном счёте, именно Лисп стал прародителем таких языков, как Python и Ruby, а сам до сих пор активно применяется в ИИ.
Таким образом, 1950-е изменили образ мышления программистов, подарили четыре фундаментальных языка и поставили мир на рельсы компьютерной революции.
В следующий раз поговорим о том, как развивались языки и мир программирования в 1960-е.
