Эволюция языков программирования

Вид материалаДокументы
Подобный материал:
1   2   3   4   5
ортогональный язык.

Алго́л 68 (англ. Algol 68 от англ. algorithmic — алгоритмический и англ. language — язык) — процедурный императивныйвысокоуровневый язык программирования, потомок языка Алгол, существенно доработанный. Разрабатывался в период 1964-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 запрограммировали первые противоракетные сооружения. Так они и работали десятки лет. Но для сопровождения все время нужно было обучать новых программистов. И так дела обстояли со всеми мало-мальски крупными проектами.

В 1963 году в Дартмурском колледже (Dartmouth College) был создан язык программирования BASIC (Beginners’ All-Purpose Symbolic Instruction Code — многоцелевой язык символических инструкций для начинающих). Язык задумывался в первую очередь как средство обучения и как первый изучаемый язык программирования. Он предполагался легко интерпретируемым и компилируемым. Надо сказать, что BASIC действительно стал языком, на котором учатся программировать (по крайней мере, так было еще несколько лет назад; сейчас эта роль отходит к Pascal). Было создано несколько мощных реализаций BASIC, поддерживающих самые современные концепции программирования (ярчайший пример — Microsoft Visual Basic).

Бе́йсик (от BASIC, сокращение от англ. Beginner’s All-purpose Symbolic Instruction Code — универсальный код символических инструкций для начинающих; англ. basic — основной, базовый) — семейство высокоуровневых языков программирования.

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

Одной из «визитных карточек» Эдсгера Дейкстры стало высказывание: «Студентов, ранее изучавших Бейсик, практически невозможно обучить хорошему программированию. Как потенциальные программисты они подверглись необратимой умственной деградации». Однако, это высказывание цитируется вне контекста, в котором Дейкстра подверг критике и многие другие популярные в то время языки.

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

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

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

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

Си (англ. C) — стандартизированный процедурный язык программирования, разработанный в начале 1970-х годов сотрудниками Bell Labs Кеном Томпсоном и Денисом Ритчи как развитие языка Би. Си был создан для использования в операционной системе UNIX. С тех пор он был портирован на многие другие операционные системы и стал одним из самых используемых языков программирования. Си ценят за его эффективность. Он является самым популярным языком для создания системного программного обеспечения. Его также часто используют для создания прикладных программ. Несмотря на то, что Си не разрабатывался для новичков, он активно используется для обучения программированию. В дальнейшем синтаксис языка Си стал основой для многих других языков

В 1972 году Керниганом и Ритчи был создан язык программирования C. Он создавался как язык для разработки операционной системы UNIX. C часто называют «переносимым ассемблером», имея в виду то, что он позволяет работать с данными практически так же эффективно, как на ассемблере, предоставляя при этом структурированные управляющие конструкции и абстракции высокого уровня (структуры и массивы). Именно с этим связана его огромная популярность и поныне. И именно это является его ахиллесовой пятой. Компилятор C очень слабо контролирует типы, поэтому очень легко написать внешне совершенно правильную, но логически ошибочную программу.

В 1986 году Бьярн Страуструп создал первую версию языка C++, добавив в язык C объектно-ориентированные черты, взятые из Simula (см. ниже), и исправив некоторые ошибки и неудачные решения языка. C++ продолжает совершенствоваться и в настоящее время, так в 1998 году вышла новая (третья) версия стандарта, содержащая в себе некоторые довольно существенные изменения. Язык стал основой для разработки современных больших и сложных проектов. У него имеются, однако же, и слабые стороны, вытекающие из требований эффективности.

В 1995 году в корпорации Sun Microsystems Кеном Арнольдом и Джеймсом Гослингом был создан язык Java. Он наследовал синтаксис C и C++ и был избавлен от некоторых неприятных черт последнего. Отличительной особенностью языка является компиляция в код некоей абстрактной машины, для которой затем пишется эмулятор (Java Virtual Machine) для реальных систем. Кроме того, в Java нет указателей и множественного наследования, что сильно повышает надежность программирования.

В 1999–2000 годах в корпорации Microsoft был создан язык C#. Он в достаточной степени схож с Java (и задумывался как альтернатива последнему), но имеет и отличительные особенности. Ориентирован, в основном, на разработку многокомпонентных Интернет-приложений.

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

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

Отрицательной чертой языка было отсутствие в нем средств для разбиения программы на модули. Вирт осознавал это и разработал язык Modula-2 (1978), в котором идея модуля стала одной из ключевых концепций языка. В 1988 году появилась Modula-3, в которую были добавлены объектно-ориентированные черты. Логическим продолжением Pascal и Modula являются язык Oberon и Oberon-2. Они характеризуются движением в сторону объектно- и компонентно- ориентированности.

Паскаль (англ. Pascal) — высокоуровневый язык программирования общего назначения. Один из наиболее известных языков программирования, широко применяется в промышленном программировании[4], обучении программированию в высшей школе, является базой для большого числа других языков.

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

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

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

50% — вложено в систему после того, как её приняли в разработку — сопровождение (maintenance)

25% — тестирование и исправление ошибок

15% — составление документации и спецификаций

10% — написание кода

При первом запуске системы ПРО она стреляла по Луне — явная ошибка, которую трудно выявить на этапе проектирования.

Отсюда следует острая необходимость сопровождения.

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

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

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

Pascal

Algol-68

PL/1

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

В 1983 году под эгидой Министерства Обороны США был создан язык Ada. Язык замечателен тем, что очень много ошибок может быть выявлено на этапе компиляции. Кроме того, поддерживаются многие аспекты программирования, которые часто отдаются на откуп операционной системе (параллелизм, обработка исключений). В 1995 году был принят стандарт языка Ada 95, который развивает предыдущую версию, добавляя в нее объекно- ориентированность и исправляя некоторые неточности. Оба этих языка не получили широкого распространения вне военных и прочих крупномасштабных проектов (авиация, железнодорожные перевозки). Основной причиной является сложность освоения языка и достаточно громоздкий синтаксис (значительно более громоздкий, чем Pascal).

А́да (Ada) — язык программирования, созданный в 19791980 годах в результате проекта, предпринятого Министерством обороны США с целью разработать единый язык программирования для встраиваемых систем (то есть систем управления автоматизированными комплексами, работающими в реальном времени). Имелись в виду, прежде всего, бортовые системы управления военными объектами (кораблями, самолётами, танками, ракетами, снарядами и т. п.). Перед разработчиками не стояло задачи создать универсальный язык, поэтому решения, принятые авторами Ады, нужно воспринимать в контексте особенностей выбранной предметной области. Язык назван в честь Ады Лавлэйс.

Создатели 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 — ко внутреннему условию или ко внешнему. Эта неоднозначность была найдена Кнутом.

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

Все основные идеи появились в первые 15–20 лет, всё новое — хорошо забытое старое.

Второй этап развития языков программирования

Второй этап развития языков программирования (20–25) лет. Знаменовался экспоненциальным ростом ЯП и тремя попытками создания универсальных языков программирования: PL/1Algol-68Ada. Все три проекта были обречены на неудачу. Все три языка провалились из-за повышенной сложности. Pascal и С отличает предельная простота.

Два основных принципа дизайна ЯП

Создание ЯП аналогично собиранию вещей в путь.

принцип сундучка — брать все то, что в принципе может понадобиться

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

Ключевое понятие — технологическая потребность.

Какие свойства критичны с точки зрения индустриального программирования:

Технологические потребности

Особенно — раздельная компиляция

Объектная ориентация

Производительность кода

Недостаток Ada и Modula-2 — они не являются объектно-ориентированными языками. Но Modula-2 все равно лучше, так как проще.

1967 — Simula-2

В