История языков программирования. 1980-е

Объекты, функции и зачатки современного программирования.
7 минут13018

Когда-то давно в программировании не существовало понятия «объекты», а сегодня уже трудно представить достаточно мощный язык, хотя бы частично не использующий принципы ООП. И хотя объектное программирование зародились ещё в 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. Каждая машина, поддерживающая родительский язык, могла поддерживать и новый объектно-ориентированный.

Другими значимыми расширениями существующих языков были ответвления Pascal - Microsoft и Borland. Хоть они и не были совместимы, в подходах они схожи. Fortran, Lisp и Forth тоже включили объектно-ориентированные расширения, но в сравнении с C++ это были незначительные доработки. Появились и новые языки, вроде Ada и Modula 2, которые включали некоторые аспекты объектно-ориентированного метода.

Таким образом, к концу 1980-х годов практически каждый программист был знаком либо с Basic, либо с C++.

Неимперативное программирование

Сегодня кажется, что объекты – суть всех популярных языков программирования, но в 1980-х годах не было однозначного мнения о лучшем подходе. Поэтому каждая новая идея была зафиксирована и считалась важным прорывом.

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

В неимперативном программировании есть чёткое различие между статическим и динамическим текстом программы. Есть два различных способа, с помощью которых это может быть достигнуто: функциональные и логические языки программирования.

Функциональные языки, такие как Lisp, FP и Hope, желали покончить с императивным программированием, настаивая, что применение частных случаев неэффективно по сравнению с обобщающими математическими функциями. К примеру, в императивном программировании выражение:

А = А + 1

означает, что каждый раз, когда выполняется эта часть программы, А меняет значение, то есть фактически не имеет ни одного значения. Функциональные языки используют рекурсию для создания новых переменных и поэтому А не использует значения до момента запроса. Рекурсия также используется для замены циклов, поэтому время выполнения кода соизмеримо с полным временем выполнения программы. Единственная проблема заключается в том, что многие программисты находят рекурсию сложной. Тем не менее, самый известный функциональный язык, LISP, разработанный Джоном МакКарти из Массачусетского технологического института в 1959 году, по-прежнему имеет своих поклонников. И он по-прежнему является основным языком для ИИ в той или иной форме.

Логическое программирование

Самый успешный из логических языков — Prolog. Он основан на идее написания программ как набора логических операторов и использования перебора для автоматического определения результатов.

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

Самой важной частью истории Prolog является его принятие японцами в 1981 году в рамках проекта десятилетия. Это стимулировало многих программистов в США, чтобы пересмотреть их использование Lisp в качестве первого выбора для программирования ИИ.

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

Турбо-языки

Было бы несправедливо обойти программирование 80-е годов, не упомянув семейство турбо-диалектов от Borland.

Turbo Pascal был первым из высокопроизводительных компиляторов нового поколения с простой средой разработки. Его создатель Андерс Хейлсберг (который, кстати, продолжил разработку C# для Microsoft) стал еще одним примером скандинавского влияния на вычисления.

Turbo Pascal прошёл путь от медленного и трудного в использовании интерпретатора до быстрого, интерактивного, адаптированного для всех машин компилятора, который приглянулся многим программистам.

После успеха Turbo Pascal появились интегрированные среды Turbo C, Turbo BASIC и Turbo Prolog.

Вдали от мейнстрима

Есть два других языка, которые оказали реальное влияние в 80-е годы и заслуживают упоминания, но не вписываются ни в какую опрятную категорию - Modula 2 и Ada.

Modula 2 был предложением Никлауса Вирта в качестве замены Pascal. По сути, это было обновление, включающее в себя идеи параллельного программирования. В 1980 году появилось Modula 2, более универсальное расширение, которое включало функции объектно-ориентированного программирования.

Это была первая реализация того, как один модуль может «видеть» данные, только используя интерфейс между ними, что позволяет программисту сосредоточиться на том, что делает модуль, а не на том, как он это делает. Эта простая идея описывает возможность скрытия и инкапсуляции данных, которые являются одной из основ объектно-ориентированного метода.

Modula 2 наследовала слишком много алгольных идей, поэтому мировой славы не получила. С другой стороны, на свет появилась Ada – пожалуй, последний из суперязыков. Она была создана очередным комитетом по заказу Министерства Обороны США и является возвратом к идеям Algol/Сobol. Ada – универсальный язык, который включает в себя невероятный диапазон функций. По этой причине его можно использовать для создания хоть объектно-ориентированной, хоть функциональной программы. Короче говоря, для всего.

В СССР

Однако комитетские языки тоже не теряли влияние. В Советском Союзе был выпущены ГОСТы на Алгол-68 и Фортран. Также в образовании стали закрепляться Basic и Pascal, которые стали для нескольких поколений фундаментом в мире программирования.

Именно так зарождался новый виток программирования – универсальных языков, понятных даже ребёнку, способных решать даже самые сложные задачи.

prologsmalltalkистория языков программирования
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!