Языки программирования. Лекция 3



Дата16.07.2016
өлшемі89.46 Kb.
#204091
Языки программирования. Лекция 3.

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


Условно можно выделить три периода развития ЯП:

1. Эмбриональный период (50-60-е годы) - появляются первые ЯП, соответствующие различным языковым нишам (рассмотрено на прошлой лекции); стихийный поиск и занятие языковых ниш; часто для нового проекта разрабатывался новый язык программирования (пример: HAL – для космической станции, JOVIAL- для военных применений). Некоторый языки того периода послужили «питательной средой» для последующих ЯП – Алгол 60, Симула 67 (разработан для имитационного моделирования на базе Алгола, в нем появилось понятие класса, появилось ключевое слово new для создания объектов класса, понятие наследования, идея о том, что объекты класса должны существовать в динамической памяти – ими занимается динамически сборщик мусора). Бьерн Страуструп разрабатывал Си++ , используя концепции Симулы. Период закончился попыткой создания универсального ЯП – PL/I и Алгол 68, оба языка не пошли в первую очередь из-за своей сложности. Так на сложном языке не получиться писать простые и понятные программы.

2. Устойчивый рост (60-80-е годы).

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

  • Примерно в это же время появился Си, который занял нишу системного программирования – программирование ОС, драйверов. Ранее эту нишу занимали только машинные языки. Во избежание проблемы 2000, многие программы реинженировались с ассемблера и Кобола на Си. Эта ниша для языка, который можно описать как ассемблер, не зависящий от конкретной архитектуры. Первые попытки создания высокоуровневого ассемблера вылились в создание языков: CPL (Cambridge Programming Laboratory)-> BCPL (расширение CPL)-> B -> Cи. В Си появилось понятие типа для эффективного открепления памяти, а как следствие появилась адресная арифметика. На языке Си была создана более или менее переносимая ОС Unix. Большинство системного программного обеспечение сейчас разрабатывается на Си. Сейчас нет ни одного процессора, который появился бы без Си.

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

Так с начала 70-ых годов появление ЯП, стало не стихийным, а достаточно осмысленным. Появились языки модульного программирования, основанные на понятие абстрактного типа данных – CLU, Модула. Появилось направление доказательного программирования. Количество новых языков стало меньше, но общий объем был очень велик.

Исследование направленное на выяснение затрат при разработке программного продукта показало следующее:

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

Было проведено другое исследование по поиску средств к снижению расходов. Выяснилось, что активно используется очень много ЯП (в одном Пентагоне около 350), что затрудняет сопровождение программ, при смене сотрудников, аппаратуры и прочего. Было принято решение о создании нескольких (а позже одного) основных ЯП, так кА лидеров среди используемых языков или универсального языка не было. Паскаль не годился на роль базового индустриального языка, Си был не распространен.


  • Было выработано несколько требований (порядка 6 итераций). Было выяснено, что все эти требования можно выполнить одним ЯП (всё это уточнялось в 1975-1978 года). В 1979 году был проведен тендер по созданию этого языка. Было выбрано 3 языка - прародителя - ПЛ/1, Алгол 68 и... Паскаль. Из 12 языков во второй тур вышли 4 языка. И все 4 языка были основаны на языке Паскаль. Языки Красный и Зелёный вышли в финал. Красный язык подошёл, так как его посчитали нестабильным из-за частых смен спецификаций, и был выбран Зелёный – позже Ада (его разрабатывали французы, Жан Ишбиа). Проигравшая фирма стала разрабатывать соответствующую систему валидации. Была разработана специальная система – Ada Compiler Validation System, для сертификации компиляторов. В 1980 году был принят стандарт Ада, а окончательный стандарт и первые сертифицированные компиляторы появились в 1983 году. Язык получился не простой, но традицией стало создание не только Language Reference Manual (LRM), но и обоснование – Rationale. Создание Ады – это третья попытка создания универсального ЯП. Создатели языка писали, что при дизайне языка работали 3 вещи:

1. надежность (язык создавался для встроенных систем реального времени – системы с гарантированным временем отклика)

2. эффективность (так как такие системы обладают минимумом ресурсов)

3. читабельность (так программы на Аде легко читать, но тяжело писать, с этой точки зрения самый краткий язык – Си. Текст программы должен сам себя документировать – так как его часто изучают и пересматривают)

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

Ада 83 должна была стать единственным языком для разработки встроенных систем реального времени, эта цель не была достигнута, и можно сказать что проект потерпел неудачу. По Аде можно было изучать технологию программирования в том виде, в котором она сложилась к началу 80-ых годов. Безусловно, Ада неплохой язык, который умно спроектирован, затрачены огромные средства, вызвал интерес по всему миру. Однако сложность языка, как следствие сложный компилятор, как следствие очень сложные программные системы. Кроме того, какую нишу занимала Ада? Какая ниша может быть у универсального языка? Так нишу системного программирования занимал Си, другие ниши так же заняты. Открылась ниша объектно-ориентированного программирования, но ее занял в 1983 году Си++. Таким образом Ада как единый язык программирования провалился.


  • В 1980 году появился язык Модула-2 (автор - Вирт) – очень интересный язык. В 1988 году появился Оберон. В 1992 году появился Оберон-2. Модула-2 и язык Ада были в какой-то степени антиподами. Они появились примерно в одно и тоже время. Описание Модулы-2 - 40 страниц, языка Ада - несколько сот страниц. Проблемные области, для которых создавались языки примерно одинаковые. Модула 2 создавался как язык системного программирования – в основе концепции надежности и эффективности, этим же Модула отличается от Си, так как надежность не была целью разработчиков Си. В Модуле были средства организации параллельного и квазипараллельного программирования – так Модула вполне могла использоваться для систем реального времени. Тут присутствуют два принципа языкового дизайна.

  1. Принцип обоснованности языковых конструкций (принцип сундучка) – для каждой осмысленной технологической потребности в ЯП должна быть конструкция, отвечающей этой потребности (Так индустриальное программирование не возможно без раздельной трансляции). По этому принципу был создан язык Ада, его аппарат раздельной трансляции наиболее мощный.

  2. Принцип минимальности языковых конструкций (принцип чемоданчика) – в язык должны включаться те, и только те языковые конструкции, без которых функционирование языка в данной проблемной области невозможно. Так для Модулы 2 эта область системное программирование, и обеспечивается надежное и эффективное системное программирование.

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

Появлением Ады 85 и Модулы два ознаменовался некий рубеж.



3.Консолидация (90-е и т.д.)

Небольшое число языков используется, небольшое число добавляется каждый год, еще меньше языков получают широкое распространение, при этом довольно много старых языков. То же самое происходило в архитектуре машин, и на рынке ОС. С появлением 32-битной архитектуры она была реализована в микропроцессорах архитектур SPARK, IA-32, ARM, NS-32, Z-8000,... А выжили всего первые три... Да и то SPARC потихонечку выходит из употребления. Из новых - в основном, IA-64 (Intel) и 32/64 (AMD). Из ОС остается Linux, Windows, некоторые версии Unix, многие ОС выходят из употребления, однако появляются новые – хотя и в небольшом количестве, новые вытесняют старые.



  • Практически все языки, которые появились в 80-ые – 90-ые годы так или иначе связаны с концепцией объектно-ориентированного программирования. Первый язык ООП - 1972 год, SmallTalk (окончательная его версия - 1980 год). 1983 год - язык Си++, в 1985 его объявление было широко опубликовано. Си++ - объектное расширение языка Си. Си++ относится к объектно-императивной парадигме, до этого все языки относились исключительно к императивной парадигме (за исключением PROLOG логическое программирование, и LISP – функциональная парадигма).

  • Си++ был не первой попыткой объектного расширения языка. В 80-ые годы более известным был Object Pascal (не путать с Delphi). Это было объектное расширение классического Паскаля, появившееся в 70-ые годы. На Object Pascal были написаны первые версии ОС для компьютеров Макинтош. В Windows 3.0 в header-файлах фирмы Microsoft встречался способ вызова Паскаль. Он характеризуется тем, что параметры передаются через стек, параметры в стек кладет вызывающая программа, а из стека их выбрасывает сама процедура или функция. В стандартном вызове Си – вызывающая программа и кладет и выбрасывает параметры из стека, так как список параметров может быть переменной длины. В архитектурах есть два варианта команды – ret n (вариант Паскаль) и ret (вариант Си). Так фирма Microsoft использовала такой, же графический интерфейс как Макинтош, изначально этот интерфейс был написан на Паскале, потом переписали на Си, на ключевое слово Pascal осталось.

  • Первым объектным расширением Си был Object C, еще до Си++. Система программирования Delphi опирается на систему программирования Turbo Pascal. Turbo Pascal с некоторой стороны расширяет Паскаль, и похож не только на Object Pascal но и на Модула 2. В настоящее время ЯП системы Delphi тоже называется Object Pascal. Однако Си++ стал самым популярным расширением по двум причинам:

  1. был основан на очень эффективном и достаточно популярном языке системного программирования

  2. полностью расширил этот язык, старые программы полностью совместимы с Си++ (это не было обеспечено ни Object Pascal, ни в языке системы Delphi)

Многие языки, которые развивались и появлялись в 80-ые годы были основаны на императивной парадигме (тот же самый оператор присваивания), только добавляли концепцию наследования и концепцию полиморфизма. 1988 год - язык Eiffel. 1988 год - язык Оберон. Введено понятие "расширение типа", "наследование"; всё остальное - сужение конструкций Модулы-2; абсолют принципа минимальности, однако не хватало динамического связывания, компилятор с языка Оберон – 4000 строк. Была идея вместо виртуальных функций сделать указатели на функции. В расширении компилятора Оберон-2 было реализовано динамическое связывание методов, и Оберон-2 стал похож на полный объектно-ориентированный язык. Оберон-2 - минимальный, но полностью функциональный объектно-ориентированный язык.

    • В 1995 году появился язык Java. Была развернута беспрецедентная маркетинговая кампания. Java четвертая попытка внедрения единого языка программирования. Говорилось, что если есть проект, который включает в себя сеть на основе транспортного протокола TCP/IP, то Java как раз тот язык, который нужен. Java позиционировался с одной стороны как ООЯ, в котором большое внимание уделено надежности, с другой стороны как не особенно сложный язык (проще чем Си). Java основан на понятии байт-кода и связанной с ним Java Virtual Machine (интерпретатор байт-кода) – идея обеспечения единой реализации языка. Семантика байт-кода должна быть строго и формально описана. Была полностью специфицирована специальная виртуальная машина Java (интерпретатор байт-кода, стандартные библиотеки). Java-компилятор переводит код программы в байт-код, который затем интерпретируется при помощи JVM, в байт-коде есть вызов библиотек. Надо только перевести JVM и соответствующие библиотеки на новую платформу, чтобы на ней можно было выполнять все программы на языке Java. Современная версия Java 2. Технология Java – это набор библиотек и инструментов. Основной упор делается не на язык, а на совокупность технологий. Несмотря на все это – Java не стал единым языком программирования.

    • В споре какой язык считать лучшим, речь уже идет не о самом языке, а о технологии программирования. Один их современных подходов, предложенных технологией .NET - другая альтернатива единого языка программирования. Пусть будет то язык, который нравится, а общим сделаем набор библиотек. Были созданы технологии CTS (унифицированная система типов), CLS (единая библиотека времени исполнения), ADO_NET. И все языки, включённые в эту систему, обладают одним набором коллекций/классов, одним "сборщиком мусора". В эту систему вошли языки VBasic («сильно подкрученный» под требования .NET), Visual Fox Pro, JScript, ASP, C++. Необходим был язык, который заполнял бы брешь между VBasic'ом и С++. На это место хорошо подходил был Delphi. Но этим языком стал C# (который стал "родным" для .NET'а). Си# похож на Java и на Delhi. Тут все равно какой язык, главное единая технология программирования.

Итак, говоря о ООП, будем упоминать, что есть Ада 95, Си++, Оберон 2 и есть семейство Си# -Java –Delhi, которые семантически очень сильно похожи друг ан друга.


Достарыңызбен бөлісу:




©www.dereksiz.org 2022
әкімшілігінің қараңыз

    Басты бет