Языки программирования, 02 лекция (от 07 сентября)

Материал из eSyr's wiki.

Перейти к: навигация, поиск

Предыдущая лекция | Следующая лекция

Содержание

Этапы развития ЯП

1954–1957 — появление языка FORTRAN, первого языка программирования. Через 10 лет после выхода FORTRAN, в 1967 в США уже использовалось более 400 языков. Тем не менее из всего многообразия языков можно выделить некоторое количество знаковых.

Экологические ниши

Научно-технические расчеты — FORTRAN

Версии FORTRAN: FORTRAN I (1957), FORTRAN II, FORTRAN IV (1964), FORTRAN 66 (1966), FORTRAN 77 (1977), FORTRAN 96 (1996)

Ряд свойств языка FORTRAN показывает, что он неприменим для создания надёжных программ.

Пример: Фортран глотает пробелы, что резко повышает число ошибок

  • цикл
(FORTRAN)  
DO 10 I=1,3
  операторы
10: CONTINUE

Здесь трижды выполняется тело цикла

  • он же, но с ошибкой
(FORTRAN)  
DO 10 I=1.3
  операторы
10: CONTINUE

Здесь переменной DO10I присваивается 1.3, затем однажды выполняется тело цикла. Согласно одной из легенд, такого рода ошибка привела к аварии на космическом корабле «Маринер-1», повлекшей его уничтожение.

Надёжность программы — свойство программы, которое обратно пропорционально количеству ошибок в ней.

Аксиома. Абсолютно надёжных программ не бывает.

Форма записи языковых конструкций на FORTRAN не способствует созданию надёжных программ (пример с точкой вместо запятой), тем не менее, FORTRAN — самый успешный язык программирования. Стандарты FORTRAN выпускались в 1966, 1977, 1996 годах, самой популярной версией является стандарт FORTRAN 1977 года. Успешность FORTRAN связана с успешностью занятия экологической ниши языка программирования.

Языки программирования подобны биологическим видам, в среде языков программирования, также, как и в биологической среде, выживают одни виды и вымирают другие. При этом даже более приспособленным видам трудно выгнать из ниши того, кто ее уже занял. Экологической нишей для ЯП является его проблемная область. Самой первой проблемной областью являлись научно-технические расчёты, FORTRAN же был транслятором формул, что следует из его названия (FORTRAN = Formula Translator).

В научно-технических расчётах основной сложностью является построение математической модели, программы достаточно просты. НТР характеризуются малым объёмом данных и большим объёмом вычислений над ними.

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

Мобильность ПО — переносимость ПО с одной системы на другую.

Самым важным оказалось наличие единого ЯП, тем самым появилась мобильность знаний. В результате, необходимость изучения системы команд отдана на откуп узкому количеству человек.

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

Algol-60

Algol-60 (Algol-58) — сделаны научной группой во главе с IFIP — язык для обмена алгоритмами между учёными различных стран и специальностей. Впервые для описания синтаксиса был применён формальный язык (БНФ). Algol получился достаточно простым и достаточно мощным. Например, программы на Algol впервые имели блочную структура, также была возможность использования рекурсии. В результате Algol стал стандартом для изучения в университетах и т. д.

Роль Algol-60 не только как учебного языка, но и как языка-предтечи, например, для языка Pascal.

Основная проблема Algol-60 в том, что по своей структуре Algol-60 был похож на FORTRAN и заточен под НТР, посему они претендовали на одну нишу. FORTRAN вытеснил Algol из ниши НТР. Важным в этой нише является быстродействие и совместимость, характеризуются они простотой программ.

Быстродействие языка (эффективность) — усреднённое отношение времени выпонения программ, написанных на ЯП, к времени выполнения программам, написанных на ассемблере машины.

Эффективность = Plang / Pasm

FORTRAN достиг такого уровня, что для FORTRAN О — оптимизированной версии (IBM выпускала две версии FORTRAN — FORTRAN H (для отладки) и FORTRAN О) этот показатель был равен 1.04. Для Algol он находился в прелелах 7–10. В Algol были неэффективные способы передачи параметров в функции. Кроме того, существовавшие в то время архитектуры не были приспособлены к реализации Algol-60, например к блочной структуре программ. Для такой структуры характерно хранение данных в стеке, аппаратной реализации которого тогда не делали, и стек приходилсь моделировать вручную. Язык оказался слишком неэффективный.

Коммерческие задачи — COBOL

Ещё одной нишей, появившейся чуть позднее, являются коммерческие задачи — приложения по обработке коммерческой информации. Они характерны малым объёмом простых вычислений над большим объёмом данных, и для таких приложений требовался интенсивный ввод-вывод. В результате в 1959 году появился язык COBOL (Common-Oriented Business Language).

IBM в те годы выпускала две линейки компьютеров — 709 для научных вычислений, и на котороых основным языком программирования являлся FORTRAN, и 14хх для коммерческих задач, которые были ориентированы на интенсивный ввод-вывод.

Тем не менее, у COBOL тоже имелись недостатки в архитектуре. Например, в языке COBOL стандартным представлением даты была структура фиксированного вида MMDDYY, что явилось одной из основной причин проблемы 2000 года. В настоящее время данный язык является практически мёртвым, он умер только из-за проблемы 2000. До этого момента он держал нишу довольно крепко.

Кстати, именно проблема 2000 послужила одним из стимулов к разработкам в области реверсного инжиниринга (перевода программ с одного языка на другой), поскольку пользователям COBOL при миграции на другие языки хотелось сохранить и повторно использовать написанные проекты.

Символьная обработка — LISP

Ещё один знаковый язык — LISP (LISt Processing). Используется для задач символьной обработки, ИИ. Существует множество диалектов, самый популярный — Common LISP. Не применяется для индустриальных программ, т. к. низкоэффективен (использует списки и деревья, основная операция — применение функции, чем он и силён). Тем не менее, именно с LISP начинается история функционального программирования.

Ниши разобраны

1961 год. Уже тогда были разобраны все ниши: для системного программирования применялся ассемблер, для прикладного программирования — LISP, COBOL, для научного применения — FORTRAN, для обучения — Algol-60.

1960–1980: Поиски Священного Грааля

До 1980 года происходил экстенсивный рост количества языков программирования. Джон Саммит в 1967 году наcчитал 400 языков, применяемых в США.

Тем не менее, в то время появилось много известных языков. То время характеризовалось поиском Священного Грааля — единого универсального языка программирования, который применялся бы во всех областях. Первой с этой проблемой столкнулась IBM, которая поняла, что поддерживать две линейки накладно, посему в 1961 году они начали работу над проектом IBM 360 (360 градусов — полный круг решаемых задач), им хотелось иметь единый ЯП.

Первая попытка создания единого языка программирования — PL/1

1964 — появление NPL (New Programming Language), позднее переименованного в PL/1. Создавался комитетом. В нём были смешаны основные ЯП. Конструкции из FORTRAN, Блочная структура из Algol, понятие записи из Кобола. Майерс сказал — «PL/1 был бы хорошим языком программирования, если из него выкинуть 80 процентов возможностей».

В PL/1 могло быть до 30 атрибутов у типов данных — это слишком много. Все запомнить невозможно, поэтому вводились правила-умолчания. IBM выпускала две версии трансляторов (по аналогии с FORTRAN) — PL O (отладочный) и PL F (быстрый), но они были немного разными — программа, работающая после трансляции отладочной версией, могла вылетать во время работы после трансляции быстрой. Да и спецификации языка чуть отличались.

Только IBM вложила в PL/1 несколько миллиардов, но как язык для промышленных приложений PL/1 провалился из-за своей большой сложности.

Анекдот:
— Что такое верблюд?
— Это лошадь, созданная комитетом.

Вторая попытка — Algol-68

Algol-68 — вторая попытка создания универсального языка, создан IFIP, состав которой отличался от группы, создавшей Algol-60. Специально для описания языка были придуманы W-грамматики (W от Вирт), которые позволяли описывать и синтаксис, и семантику языка. Язык являлся технически совершенным. В частности, в Algol-68 была попытка создать ортогональный язык.

Ортогональность языковых конструкций означает их независимость. То есть языковые конструкции независимы и все, что угодно - оператор.

Например, в Pascal конструкция

(Pascal)
for  i := i1 to i2 do

не является ортогональной, т. к. накладываются ограничения, например, на тип данных.

Выражения и операторы не являются ортогональными.

В Algol-68 выражение, после которого стоит «;» (точка с запятой) превращается в оператор. И у операторов есть значения. Везде, где может стоять выражение, может стоять оператор, и наоборот. Таким образом, Algol-68, в отличие от даже C, практически полностью ортогональный язык.

Пересмотренное сообщение об Algol-68 вышло через 11 лет. В нём были эпиграфы из Винни-Пуха. Больше ничего там читать невозможно. Algol-68 — первый и последний язык, в котором формально описана семантика.

Algol-68 оказался слишком сложным. Был сделан транслятор, скорость которого была несколько операторов в минуту, а эффективность получаемого кода на уровне Algol-60. В результате Algol-68 никакую нишу не занял.

Аналогичная история произошла с UNIX. Изначально разрабатывался MULTIX, но из него вышли некоторые люди и начали писать UNIX (MULTIX — много, UNIX — одиночка).


  • 1964 — PL/1
  • 1968 — Algol-68

Оба провалились из-за сложности, и своей миссии не выполнили. С другой стороны, потребность в едином языке была очень высокой.

В 1958 году на языке JOVIAL запрограммировали первые противоракетные сооружения. Так они и работали десятки лет. Но для сопровождения все время нужно было обучать новых программистов. И так дела обстояли со всеми мало-мальски крупными проектами.

Появление С и Pascal. Простота против сложности

Этимология названия языка C: CPL (Cambribge Programming Language) — BCPL — B — C

1969 — появление языка С — «машинонезависимого ассемблера» (Деннис Ритчи). В нём впервые ввод-вывод был выведен из языка. Язык оказался достаточно мощным, чтобы на нём написать системные библиотеки, в т. ч. библиотеку ввода-вывода. Чёткая экологическая ниша — cистемное программирование, как замена языку ассемблера.

В 1969 году Вирт написал Pascal. «Мне надоело» — сказал Вирт о том, что раньше он просто не мог объяснять студентам язык, который нельзя объяснить логично. Pascal очень быстро занял образовательную нишу. Дейкстра: «Языки типа FORTRAN и COBOL калечат мозги и поэтому их преподавание должно приравниваться к преступлению». На основе Pascal создано множество более современных и удачных ЯП (Turbo Pascal, Delphi), используемых в индустриальном программировании.

В результате, простота оказалась лучше сложности.

Третья попытка — Язык Ada

В Пентагоне поняли, что денег на программистов уходит много.Проанализировали расходы на ПРО систем реального времени. И получилось:

  • 50% — вложено в систему после того, как её приняли в разработку — сопровождение (maintenance)
  • 25% — тестирование и исправление ошибок
  • 15% — составление документации и спецификаций
  • 10% — написание кода
При первом запуске системы ПРО она стреляла по Луне — явная ошибка, которую трудно выявить на этапе проектирования.
Отсюда следует острая необходимость сопровождения.

Дорогое сопровождение засчёт отсутствия стандартизации языка.

Как оказалось, в Пентагоне (Минобороны) использовалось 350 языков, из них 10 популярных, остальные крайне редки, поэтому и так дорого сопровождение. Так почему же оружие стандартизировано, а ЯП нет?

Как следствие, было принято решение в унифицировать ЯП — в результате которого должны были быть выбраны порядка трёх ЯП. Вначале был создан Комитет и первый список требований, потом второй список требований и т. д. В ходе анализа требований выяснилось, что достаточно одного ЯП, «Стальные требования». Изначально было выделено три языка, на которые должен быть похож кандидат:

  • Pascal
  • Algol-68
  • PL/1

Был объявлен тендер, и из 12 языков были выбраны 4, все на основе Pascal, на втором этапе был выбран один, который назвали языком Ada (1980). Окончательный стандарт языка вышел в 1983 году. Стандарт запрещал как создание над-, так и подмножеств. К тому же планировалось, что Пентагон будет закупать программы только на языке Ada. Также был создан верификатор программ. Также предполагалось использовать только сертифицированные компиляторы.

Создатели Ada — французская группа. Кроме того, она написала обоснование проекта, в котором были указаны основные особенности дизайна языка:

  • Надёжность
    • Статический контроль — проверки при трансляции (например, выход за границы массива для a[10])
    • Квазистатический контроль — проверки при выполнении (выход за границы массива для a[i])
  • Эффективность
    • Все, что летает, стреляет и падает в реальном времени, должно реагировать быстро. Ada не была столь быстра.
  • Читабельность
    • Обязательное требование для maintance

Механизм обработки исключений впервые появился в языке Ada.

Главным понятием в Ada было понятие АТД (Абстрактный Тип Данных).

Тем не менее, язык Ada оказался черезчур сложным. Сложный язык — сложный компилятор. Скорость трансляции — 3 строки в минуту.

Объектно-ориентированные языки программирования

Появилась новая парадигма — ООП. Она довольно быстро завоевала популярность, посему не объектно-ориентированные языки или погибли, или в них добавили ООП (Pascal, C)

  • 1980 — SmallTalk V
  • 1983 — C++
  • и другие объектные ЯП.
  • 1980 — Modula-2 (описание на 40 страниц)

Ada вымерла, т. к. не поддерживала объектно-ориентированную парадигму, была очень сложна и очень медленна.

1995 — Ada 95, включившая в себя еще и объектно-ориентированную парадигму. Стало еще сложнее и неподъемнее. Больше грааль не искали.

Неоднозначности в языках программирования

Например, в Algol-60: Условие записывается в двух формах:

(Algol-60)
if  b then
  S1
(Algol-60)
if  b then
  S1
else
  S2

Если записать

(Algol-60)
if  B then
  S
if  B then
  S1
else
  S2

то возникает неоднозначность: непонятно, куда относится S2 — ко внутреннему условию или ко внешнему. Эта неоднозначность была найдена Кнутом.


Языки Программирования


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28


Календарь

чт вт чт вт чт вт чт вт чт вт
Сентябрь
  05 07 12 14 19 21 26 28
Октябрь
  03 05 10 12 17 19 24 26 31
Ноябрь
02 14 16 21 23 28 30
Декабрь
05 07 12 14

Материалы к экзамену
Сравнение языков программирования


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы