1. История языков высокого уровня



Дата17.06.2016
өлшемі298.58 Kb.
#143129
1. История языков высокого уровня.
С конца 1940-х годов, то есть с момента создания первых вычислительных машин, предпринимались усилия по упрощению и автоматизации кодирования программ. Использовались библиотеки подпрограмм с автоматической компоновкой. Создавались различные системы символического кодирования. Уже тогда в обиход были введены термины ассемблер (Морис Уилкс) и компилятор (Грейс Хоппер). Эти слова в английском языке означают по сути одно и то же: сборщик, собиратель.

Прообразом современных языков высокого уровня является Планкалкюль - язык, созданный в 1945 году талантливым немецким инженером Конрадом Цузе (Konrad Zuse). Однако Планкалкюль так и не был реализован.

Первыми по-настоящему распространенным языками стали Фортран, Алгол и Кобол.

Фортран (Fortran) считается первым языком программирования высокого уровня. Язык разработан в компании IBM. Работы по созданию языка и компилятора начались в 1954 году. Проект был инициирован сотрудником IBM Джоном Бэкусом. Он предложенил реализовать язык, облегчающий программирование выпущенного незадолго до этого компьютера IBM-704.

Была создана группа из десяти человек под руководством Бэкуса. Компилятор окончательно отладили в 1957 году, и он стал распространяться среди пользователей IBM-704. Несмотря на первоначальные опасения, что компилятор не сможет обеспечить качество машинного кода, сопоставимое с качеством ручного кодирования, проект оказался очень успешным. Уже через год большинство программ для компьютеров IBM-704 записывалось на Фортране. Достаточной эффективности получаемой машинной программы удалось добиться благодаря тому, что язык был довольно простым и не содержал конструкций, порождающих неэффективный код. Название языка происходит от сокращения слов FORmula TRANslation - перевод формул. Запись формул в привычном виде была одной из важных возможностей языка. Фортран был ориентирован на программирование вычислительных задач, в нем отсутствовали средства обработки нечисловой информации. Эту направленность Фортран сохранил — он до сих пор используется в основном для научно-технических расчетов.

Уже к началу 1960-х годов Фортран был реализован на многих типах машин. Появились и стали популярными его новые версии Фортран II, Фортран IV. Важным моментом в судьбе Фортрана стала его стандартизация в 1966 году Американским национальным институтом стандартов (ANSI). Появление ANSI-стандарта еще больше способствовало распространению языка. Именно в этой версии, практически совпадавшей с Фортраном IV, язык в течение 1960-х и 1970-х годов оставался самым распространенным языком программирования в мире.

В нашей стране пик популярности Фортрана пришелся на 1970-е годы и начало 1980-х. Тогда в СССР произошел переход от выпуска машин оригинальных архитектур к производству ЕС ЭВМ, которые повторяли серию компьютеров IBM/360, а затем IBM/370. Одним из самых популярных компиляторов на этих компьютерах был американский Фортран IV. Существовали и оригинальные отечественные реализации Фортрана для машин «Минск-22», «Минск-32», БЭСМ-6 и других.


Алгол-60. В 1958 американская Ассоциация по вычислительной технике (Association for Computing Machinery, ACM) и европейское Общество по прикладной математике и механике (GAMM) создали совместный комитет по разработке стандарта международного алгебраического языка. Первоначально этот язык называли IAL (International Algebraic Language), затем он получил название Алгол (Algol, ALGOrithmic Language — алгоритмический язык). В состав комитета входил и Джон Бэкус — «отец» Фортрана. На заседании комитета, состоявшемся в мае 1958 года в Швейцарском федеральном техническом университете (Eidgenossische Technische Hochschule, ETH) в Цюрихе, был принят первый вариант такого языка. Позднее эту, в общем-то, предварительную версию стали называть Алгол-58.

В течение некоторого времени новый язык обсуждался и осмысливался. В частности, Бэкус пришел к выводу о необходимости формального описания Алгола. Основываясь на идеях американского лингвиста Ноама Хомского (Noam Chomsky), опубликовавшего в те годы свои пионерские работы по теории языков, Бэкус предложил для описания Алгола формальную нотацию, получившую название БНФ — Бэкуса нормальная форма.

В январе 1960 года комитет по Алголу собрался в Париже в расширенном составе для доработки языка. Среди новых участников был датский астроном Петер Наур, предложивший переработанный вариант Алгола, синтаксис которого был описан им с помощью БНФ. С тех пор существует другая расшифровка абревиатуры БНФ — Бэкуса-Наура форма. Принятый на конференции язык и называется Алгол-60.

В 1962 году спецификации Алгола были уточнены и опубликованы в так называемом «Пересмотренном сообщении» [Алгоритмический язык, 1965]. В «Модифицированном сообщении» в 1976 году сделаны еще ряд поправок

В Западной Европе и в СССР появление Алгола-60 было встречено с энтузиазмом, в то время как в Соединенных Штатах язык натолкнулся на серьезное противодействие, поскольку был конкурентом Фортрана, за которым стояли коммерческие интересы могущественной IBM. Довольно быстро появились трансляторы Алгола. В числе первых были трансляторы, разработанные в СССР. Уже весной 1962 года в космическом КБ С. П. Королева был запущен в эксплуатацию транслятор ТА-1, разработанный группой В. А. Степанова под руководством Святослава Сергеевича Лаврова для машины М-20. Это был первый отечественный транслятор с языка высокого уровня. Правда, входной язык ТА-1 был подмножеством полного Алгола и не включал самых трудных для реализации конструкций. Однако исключенными из языка оказались в основном те возможности, которые и в дальнейшем не нашли поддержки в языках программирования.

Годом позже, весной 1963 года заработал транслятор ТА-2 для той же машины М-20, созданный в Институте прикладной математики АН СССР (ИПМ) под руководством Михаила Романовича Шура-Бура. В ТА-2 был реализован практически полный Алгол-60, включая рекурсию.

Третьим был разработанный под руководством Андрея Петровича Ершова в Новосибирске Альфа-транслятор. Работа над Альфа-системой автоматизации программирования началась уже с появлением Алгола-58. Входной язык Альфа-транслятора представлял собой расширенное подмножество Алгола. Особенностью Альфа-транслятора была глубокая оптимизация, позволившая формировать машинный код, лишь на 30 % по размеру и на 20 % по скорости уступавший коду, полученному при программировании вручную. Альфа-транслятор обладал и мощными средствами отладки. Работа по Альфа-системе была завершена в 1964 году. Многие решения, примененные в этой системе, продолжают использоваться в современных оптимизирующих компиляторах.
Кобол . В те же годы, когда появились Фортран и Алгол — языки для программирования научно-технических задач, была осознана и потребность в средствах разработки учетно-бухгалтерских систем. Компьютеры пришли в бизнес. Был создан язык Кобол (COBOL, COmmon Business Oriented Language — универсальный язык, ориентированный на бизнес). Произошло это в США, да и где же еще могло произойти.

В нашей стране потребность в подобных языках в те годы еще не сформировалась. Да и бизнеса (как и еще некоторых важных вещей) в СССР не существовало. Вычислительные машины довольно долго не использовались для повседневных нужд предприятий. Хотя отечественные ЭВМ появились не намного позже американских и европейских, выпускались они в небольших количествах (к примеру, машина М-20, для которой создали несколько трансляторов Алгола, была изготовлена в количестве всего 20 экземпляров) и применялись для выполнения расчетов, связанных с техническими разработками и научными исследованиями в основном оборонной направленности.

Кобол разработан в 1960 году комитетом КОДАСИЛ (CODASYL, Conference on Data Systems Languages — конференция по языкам систем обработки данных), организованным министерством обороны США. В состав комитета вошли представители ведущих американских компьютерных фирм. Инициировала создание этого комитета Грейс Хоппер.

Класс задач, на которые ориентирован Кобол (экономические задачи, как у нас было принято говорить), не предполагает сложных вычислений. Тут не нужен синус. Зато необходимо обрабатывать большие объемы данных, формировать должным образом оформленные выходные документы. Кобол содержит развитые средства структурирования, обработки, сортировки и редактирования данных большого объема, хранящихся в файлах. Имеются средства генерации отчетов.


ПЛ/1. Programming Language number One, сокращенно PL/I, — язык программирования номер один — таково полное оригинальное название этого языка, немало говорящее о замыслах его создателей. ПЛ/1 разработан и реализован в течение 1963-1966 годов. Разработку языка вел комитет, созданный компанией IBM и ассоциацией пользователей компьютеров IBM. Кроме специалистов IBM в комитет вошли также представители ряда американских промышленных компаний. Работы по языку ПЛ/1 велись в рамках создания серии компьютеров IBM/360. Возглавлял разработку Джордж Рэдин (George Radin). Вот как он писал о поставленной задаче [Рэдин, 1967]: «Комитет стремился к тому, чтобы язык мог удовлетворить программистов различных уклонов: программистов научных и коммерческих задач, программистов задач, решаемых в реальном масштабе времени, и программистов систем, а также к тому, чтобы как начинающие, так и опытные программисты могли использовать возможности языка в соответствии со своим уровнем».

Поставленная задача была выполнена, хотя предварительно намеченные сроки окончания работы и были нарушены. Был создан действительно мощный и универсальный язык. Однако, как показал дальнейший ход событий, подход, примененный при создании ПЛ/1, оказался все же неудачным. Главным недостатком этого языка считают чрезмерную сложность, точнее громоздкость, поскольку трудных для понимания концепций он, в общем-то, не содержит, но количество заложенных в язык разнообразных возможностей необычайно велико. Полная документация по ПЛ/1 для ЕС ЭВМ занимала свыше 2000 страниц.


Алгол-68. Другой попыткой создания универсального языка в 1960-е годы стала разработка Алгола-68. После публикации Пересмотренного сообщения обАлголе-60 в 1962 году его дальнейшая судьба была передана в руки Рабочей группы ИФИП — Международной федерации по обработке информации (Iternational Federation for Information Processing, IFIP). В состав группы входили как авторы Алгола-60, так и новые участники. Задачей группы было выработать подмножество Алгола-60, создать спецификации средств ввода-вывода и разработать новый язык, который должен был стать наследником Алгола-60.

От участников группы поступило много предложений по развитию языка. В мае 1965 года Никлаусу Вирту (Niklaus Wirth) было поручено обобщить эти предложения, объединив их в единый проект. Предварительный вариант Н. Вирта, как вспоминал в дальнейшем Тони Хоар, участник группы, произвел на него сильное впечатление. Это был язык, в котором были устранены недостатки Алгола-60 и добавлены некоторые новые возможности, удобные и безопасные, которые к тому же могли быть легко и эффективно реализованы. Хоар и ряд других участников подключились к окончательной доработке проекта. Ко времени очередного заседания группы в Сент-Пьер де Шартез в октябре 1965 года это был проект совершенного и практичного языка. (В дальнейшем этот язык был реализован на IBM/360 и получил в честь Н. Вирта название Algol W.)

Однако на заседании, к которому был подготовлен проект Н. Вирта, комитет по Алголу в первую очередь рассмотрел другой проект, предложенный Аадом ван Вейнгаарденом (Aad van Wijngaarden), одним из авторов Алгола-60. Это был, как пишет Хоар, неполный и непонятный документ, определявший весьма амбициозный язык, не соответствовавший первоначальным предложениям. Несмотря на возражения Хоара, именно этот проект и был принят для дальнейшей работы. Последовала серия доработок. С каждым разом проект становился сложнее, спецификации радикально менялись от одного варианта к другому. В проекте было большое количество ошибок, исправлявшихся в последний момент, сроки затягивались. Хоар с сожалением отмечает, что многие члены группы не только не стремились упростить и без того сложный язык, но, наоборот, настаивали на добавлении усложняющих его возможностей. Наконец, 20 декабря 1968 года на заседании в Мюнхене язык был принят и получил название Алгол-68. Несколько членов группы направили ИФИП отчет с особым мнением, но отчет этот был отвергнут.

Алгол-68 — сложный язык. Но его сложность имеет несколько иную природу, нежели сложность ПЛ/1. Если ПЛ/1 просто объемен, то сложность Алгола-68 в том, что его механизмы носят предельно обобщенный характер. Авторы языка создали мощную, универсальную, но весьма изощренную конструкцию, для понимания которой требуется немалое напряжение. Даже для описания синтаксиса Алгола-68 формализма БНФ оказалось недостаточно. Алгол-68 определен с помощью грамматик А. ван Вейнгаардена, которые являются обобщением БНФ и, несомненно, не облегчают понимание языка.

Сложность Алгола-68, а также отсутствие поддержки со стороны ведущих компьютерных компаний привели к тому, что язык не получил широкого распространения. Несколько реализаций было осуществлено в Европе, сначала — подмножеств языка, а к середине 1970-х — и полного Алгола-68.

В СССР внимание на Алгол-68 обратили уже в момент его появления. Особый энтузиазм и настойчивость проявила группа из Ленинградского университета, возглавляемая Г. С. Цейтиным и А. Н. Тереховым. В 1969 году, еще до опубликования официального сообщения о языке, группа приступила к реализации Алгола-68. Лишь к 1976 году была завершена предварительная версия компилятора. ЕС ЭВМ, для которой предназначался компилятор, появилась только в 1974 году, поэтому анализирующая часть транслятора, написанная на Алголе-60, работала на машине ODRA 1204, а синтезирующая, написанная на ассемблере, — на ЕС ЭВМ. Еще два года ушло на переписывание транслятора на Алгол-68, компиляцию новой версии с помощью старой, потом новой версии с помощью ее же самой и отладку на ЕС ЭВМ. В 1978 году компилятор был готов и передан для использования. Затем он был еще несколько модернизирован и с 1979 года использовался в Ленинградском университете для обучения студентов и в промышленных разработках. В 1988 году компилятор был перенесен на IBM PC-совместимые компьютеры.


Бейсик. Система с разделением времени представляет собой достаточно мощный компьютер, к которому подключены терминалы. Центральная машина обслуживает терминалы по очереди, уделяя каждому небольшой квант времени, измеряемый миллисекундами. Поскольку цикл обслуживания терминалов достаточно мал, у каждого пользователя создается иллюзия, что он монопольно подключен к компьютеру. В качестве терминалов в таких системах первоначально использовались телетайпы. Такая интерактивная система на базе компьютера General Electric была развернута в 1964 году в Дартмутском колледже (США) благодаря усилиям руководителя факультета математики этого колледжа Джона Кемени (J°hn Kemeny) и директора вычислительного центра Томаса Курца (Thomas Kurtz). Они же реализовали и новый язык для этой системы, который назвали BASIC (Бейсик).

Официальная расшифровка названия языка — Beginner's All-purpose Symbolic Instruction Code — многоцелевой код (язык) символических команд для начинающих, — довольно неуклюжа. Однако вполне очевидно, что авторам было важно само слово «basic», означающее по-английски «базисный, основной». Кроме того, в англо-говорящей среде хорошо известен «Basic English» — упрощенный вариант английского языка, предложенный в 1930 году лингвистом Чарльзом Огденом (Charles Ogden). Огден отобрал 850 слов, с помощью которых, по его мнению, можно объяснить значение всех других. Примечательно, что среди этих слов было всего 14 глаголов. Грамматика также была предельно упрощена. Basic English предназначался для первоначального освоения английского как второго языка, и продвигался в качестве международного языка. Выбирая название языка для начинающих, Кемени и Курц, наверняка, имели в виду аналогию с Basic English.

Первые две программы на Бейсике были запущены совместно в системе с разделением времени Дартмутского колледжа 1 мая 1964 года. Первоначальная версия Бейсика была очень проста. Предусматривалось 14 видов операторов (а в Basic English 14 глаголов!) и возможность работы только с вещественными числами. В течение 1964-1971 годов авторами было внесено в язык много дополнений: средства работы с матрицами, строками, файлами, форматный вывод. В Дартмутских реализациях Бейсика использовались компиляторы.

Вскоре на Бейсик обратили внимание компании, производящие вычислительную технику. Бейсик стали включать в состав программного обеспечения своих мини-компьютеров фирмы Hewlett-Packard, Digital Equipment (DEC) и другие. По-настоящему массовым языком Бейсик стал с появлением персональных компьютеров в конце 1970-х — начале 1980-х годов. Практически все модели первых ПК оснащались интерпретатором Бейсика, который иногда даже записывался в постоянное запоминающее устройство машины и был готов к работе сразу после включения компьютера. Иногда Бейсик оказывался единственным приемлемым средством программирования на таких компьютерах. Тогда же Бейсик получил широкое распространение в системе школьного образования, куда он попал вместе с персональными компьютерами.

Каждая модель компьютера имела свой диалект Бейсика. Разработчики непременно вносили в язык изменения, обусловленные как особенностями машин, так и желанием расширить возможности языка. Большинство реализаций Бейсика на ПК включали средства для работы с графикой и звуком. Хотя некоторое ядро языка все же сохранялось, но с тех пор говорить о Бейсике, как о едином языке, довольно трудно. Эта ситуация изрядно угнетала авторов языка, переживавших за свое детище. Были предприняты попытки стандартизации Бейсика. В 1978 году принят ANSI-стандарт «минимального Бейсика», а в 1988, при непосредственном участии Дж. Кемени и Т. Курца — «стандартного Бейсика». Однако эти стандарты не оказали заметного влияния на развитие языка, которое оставалось стихийным.
Бейсик от Microsoft. Легенда гласит, что интерпретатор Бейсика для компьютера Altair, разработанный в 1975 году Биллом Гейтсом (Bill Gates) вместе со своим школьным товарищем Полом Алленом (Paul Allen), стал первым продуктом компании Microsoft. С тех пор Microsoft уделяет Бейсику немалое внимание. Вначале вместе с операционной системой MS DOS Microsoft поставляла обладавшие скромными возможностями интерпретаторы Бейсика (BASICA, GW-BASIC), которые реально могли использоваться лишь для решения ученических задач и написания несложных прикладных программ. Но затем в конце 80-х была выпущена система программирования QuickBasic. Ее упрощенный вариант QBasic входил в комплект MS DOS. Система имела интегрированную среду разработки с полноценным редактором программ. Входной язык был значительно расширен по сравнению с существовавшими до этого диалектами Бейсика. В то же время из языка был исключен ряд команд, предназначавшихся для работы с текстом программы: run, list и т. п. Необходимость в них пропала в связи с появлением интегрированной среды. В состав системы входил компилятор. Система стала пригодна для разработки больших программ.

В 1991 году был выпущен новый продукт Microsoft — Visual Basic. Это была первая среда визуального программирования для Windows — операционной системы с графическим пользовательским интерфейсом, начинавшей приобретать тогда все большую популярность. Разработка прикладных программ для Windows с помощью традиционных систем программирования была трудным делом. Требовались знание непростой организации Windows и масса усилий для создания графического пользовательского интерфейса. Система Visual Basic избавляла программиста от этих проблем. Интерфейс стало возможным просто рисовать, пользуясь имеющимися инструментами. А от разработки программы целиком программист был освобожден. Его часть работы состояла теперь лишь в написании процедур обработки событий для тех элементов, которые он выбрал при создании пользовательского интерфейса (окна, меню, кнопки, списки и т. д.).


Паскаль. Создатель языка Паскаль — Никлаус Вирт (Niklaus Wirth). После отклонения рабочей группой ИФИП его проекта усовершенствования Алгола-60 Н. Вирт, работая в Стэнфордском университете (США), осуществил реализацию предложенного им языка на компьютере IBM/360. Этот язык в дальнейшем получил название Алгол W и применялся в ряде университетов для целей обучения.

В 1967 году Н. Вирт вернулся в родную Швейцарию, а через год организовал группу из трех помощников (У. Амман (U. Ammann), Э. Мармье (Е. Marmier), Р. Шилд (R. Schild)) для реализации языка, который мы знаем теперь под именем Паскаль. Разработка Паскаля преследовала несколько целей. Во-первых, это стремление получить язык, пригодный для систематического обучения программированию и способствующий формированию правильного стиля. Во-вторых, язык должен был стать инструментом для разработки системных программ (компиляторов, операционных систем). В-третьих, при проектировании было обращено внимание на возможность компактной и эффективной реализации.

В Паскале нашли дальнейшее развитие идеи Алгола-60 и Алгола W. Одной из важнейших новаций языка была последовательно, ясно и полно реализованная концепция типов данных. Она стала практическим воплощением теории структурной организации данных, активно развивавшейся в те годы Ч. Э. Р. Хоаром.

Предварительное описание Паскаля было опубликовано в 1968 году. Первый компилятор (написанный на самом Паскале) заработал в 1970 году. С 1972 года Паскаль стал использоваться в ЕТН при обучении программированию. В 1973 году в язык были внесены некоторые изменения и было опубликовано Пересмотренное сообщение о языке. Этот авторский вариант языка мы и будем называть Паскалем, или стандартным Паскалем, в отличие от многочисленных последующих модификаций.

Первый компилятор не обеспечивал генерации машинного кода, сопоставимого по эффективности с кодом, получаемым для такой же машины трансляцией с Фортрана. Поэтому была предпринята еще одна реализация, осуществленная Урсом Амманом и обеспечившая получение эффективных программ. Этот компилятор был распространен во многих университетах и в промышленности. Однако по-настоящему широкую известность Паскалю принесла реализация, выполненная в ЕТН и основанная на трансляции программы в П-код (в оригинале — P-code) — машинный код не существующей реально, а спроектированной специально для этих целей вычислительной машины. Работа такой машины, исполняющей П-код, имитируется программой-интерпретатором. Такой подход позволяет получить транслятор, легко переносимый на разные компьютеры и операционные системы. Для переноса достаточно написать сравнительно несложную программу-интерпретатор. Именно с этим проектом связано само понятие П-кода (П — от Паскаль), который в дальнейшем неоднократно использовался при реализации языков программирования.

Цели, поставленные Н. Виртом при создании Паскаля, без сомнения, были достигнуты. Язык до сих пор остается одним из наиболее приемлемых средств обучения программированию. В Паскале впервые была последовательно реализована концепция строгой статической типизации, предусматривающая возможно более полный контроль соответствия типов на стадии компиляции. Последующее развитие показало правильность этой концепции. Некоторые языки в своей эволюции прошли путь от почти полного ее отрицания до признания и развития. Идеи, впервые воплощенные в Паскале, нашли продолжение в последующих, «паскале-подобных» языках: Ада, Модула-2, Оберон. И даже такие, казалось бы, не похожие внешне на Паскаль языки, как Ява и Си#, впитали в себя его концепции. В 1982 году был принят стандарт ISO на язык Паскаль, а в 1990 году — его новая редакция. Однако этот стандарт не оказал существенного влияния на развитие языка.

В нашей стране Паскаль заметили с опозданием. Во второй половине 70-х в центре внимания были ЕС ЭВМ (клоны IBM/360) с их Фортраном и ПЛ/1. Многие ведущие специалисты по программированию, вышедшие из математической среды, явно отдавали предпочтение Алголу-68. Написанное в 1974 году классическое руководство по Паскалю Н. Вирта и К. Йенсен было издано по-русски лишь в 1982 году [Йенсен, 1982], став первой общедоступной книгой по языку. Хотя к этому времени уже существовали реализации Паскаля на БЭСМ-6, Эльбрус-1 и ЕС ЭВМ, они оставались неизвестными для многих программистов. Широкую известность Паскаль приобрел лишь в первой половине 1980-х с появлением микрокомпьютеров и выходом книг по языку.
Язык Си. Язык Си (С — «си», третья буква алфавита английского языка) создан в ходе работ по операционной системе UNIX, разработка которой велась в Bell Laboratories. Язык разработан и реализован на миникомпьютере PDP-11 в 1972 году Деннисом Ритчи (Dennis Ritchie).

Название языка происходит от его предшественников языков BCPL и В («би» — вторая буква в алфавите). Язык В был разработан и использован Кеном Томпсоном (Ken Thompson) при создании первого варианта UNIX. BCPL и В — бестиповые языки, которые предназначались в первую очередь для манипуляций с находящимися в памяти данными безотносительно к их природе. Такая потребность неизбежно возникает при разработке системных программ. Си и создавался в первую очередь как инструмент для разработки операционной системы UNIX. И хотя типы в языке Си имеются, он унаследовал от BCPL и В весьма либеральное к ним отношение, предоставляя программисту максимальную свободу для манипуляций данными, не ограниченную жесткими правилами совместимости.

Хотя Д. Ритчи не называет другие языки, кроме BCPL и В, в качестве предшественников, в языке Си можно увидеть черты Алгола-60 и Алгола-68. Создавая инструмент для собственных разработок, Д. Ритчи и К. Томпсон ставили на первое место гибкость этого инструмента. Язык должен был давать возможность выполнять любые манипуляции данными, которые доступны при программировании на языке ассемблера. При этом, в отличие от языка ассемблера, должны быть обеспечены большая выразительность и удобство при записи программы. В частности, необходимыми элементами являются достаточные средства структурного программирования и удобные правила оформления подпрограмм и передачи параметров. Именно таким и оказался язык Си. Однако гибкость при обращении с данными достигнута за счет отказа от высокоуровневых механизмов контроля, в частности контроля соответствия типов. Ответственность за это соответствие возлагается на программиста. Си, без сомнения, предоставляет больше возможностей делать ошибки, чем языки, основанные на строгой типизации.

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

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

В 1973 году система UNIX была переписана на Си. Лишь несколько сот строк ядра операционной системы оставались запрограммированны на ассемблере. С этого времени Си и UNIX неразрывно связаны. Разработчики UNIX и Си предприняли специальные усилия по созданию переносимой версии языка и компилятора для него. Благодаря этому стала мобильной и была перенесена на компьютеры различных архитектур и ОС UNIX.

В конце 70-х благодаря распространению UNIX язык Си стал широко известным и популярным. Этому способствовал и выход великолепной книги по языку, написанной Д. Ритчи в сравторстве с Брайаном Керниганом (Brian Kernighan). Книга Кернигана и Ритчи стала классикой жанра и даже получила специальное сокращенное название K&R. Описание языка, данное в этой книге, в течение последующих лет исполняло роль фактического стандарта. Хотя описание Си в K&R оставалось не вполне строгим и формальным.

В 1989 году Американским национальным институтом стандартов (ANSI) был принят стандарт Си, получивший повсеместное признание в качестве эталона языка. В 1990 этому стандарту был придан статус международного (ISO/IEC 9899: 1990). ANSI Си является одним из наиболее переносимых языков программирования, реализованным практически на любых компьютерах. Он часто используется как промежуточный язык при реализации других языков. Разработка для нового языка конвертора в ANSI Си вместо компилятора в машинный код облегчает задачу создателей транслятора и одновременно обеспечивает переносимость нового языка на многие платформы. При этом можно заметить, что недостаточная надежность Си не играет в этом случае никакой роли, поскольку программы на Си, сгенерированные автоматически, заведомо избавлены от языковых ошибок (при условии, что сам конвертор работает правильно).

В 1999 году международной организацией но стандартизации (ISO) принят обновленный стандарт языка Си — ISO/IEC 9899:1999.
Ада. Проблемой унификации языков программирования, необходимостью снизить затраты на разработки и повысить надежность одним из первых озаботилось министерство обороны США — Пентагон. В начале 1975 года была создана рабочая группа, в задачу которой входили выбор или разработка единого языка высокого уровня.Через три месяца после начала работы группа сформулировала предварительный вариант требований к языку, которые получили название «соломенных». Далее в ходе консультаций с широким кругом специалистов требования уточнялись. Появились «деревянные» (1975), «оловянные» (1976), «железные» (1978), «стальные» (1979). Уже на этапе «оловянных» требований стало ясно, что ни один из существующих языков не удовлетворяет им в полной мере. Поэтому в 1977 году был объявлен открытый конкурс на создание нового языка.

Участникам конкурса было рекомендовано взять в качестве прототипа Паскаль, Алгол-68 или ПЛ/1. На конкурс было представлено более полутора десятков проектов. Четыре были отобраны для дальнейшего рассмотрения. Им были даны условные названия Зеленый, Красный, Желтый и Синий. Во всех четырех проектах в качестве основы был выбран Паскаль. Разработчиков Желтого проекта, представленного компанией SRI International, консультировали Н. Вирт и Ч. Э. Р. Хоар.

После шестимесячного срока, предоставленного авторам для более детальной проработки своих предложений, проекты были вновь оценены с привлечением большого числа экспертов. Для финального этапа конкурса выбрали Зеленый и Красный языки. После еще одного года, отведенного на доработку и тщательный анализ представленных языков, было вынесено окончательное решение. Второго мая 1979 года на заседании рабочей группы Зеленый язык был признан победителем и назван Ада.

Название языку дано в честь Августы Ады Байрон Кинг, графини Лавлейс (Augusta Ada Byron King, Countess of Lovelace), дочери английского поэта Джорджа Байрона. Ада Байрон считается первым в истории программистом. До наших дней дошел документ, в котором Ада дает описание программы вычисления чисел Бернулли для аналитической машины Чарльза Бэббиджа, английского математика и изобретателя XIX века, с которым она сотрудничала.

Язык Ада разработан группой специалистов французской компании СИ Honeywell Bull под руководством Жана Ичбиа (Jean D. Ichbiah). Ада значительно сложнее Паскаля. Автор Паскаля Н. Вирт видел в этом источник серьезных проблем: «Слишком много всего вываливается на программиста. Я не думаю, что, изучив треть Ады, можно нормально работать. Если вы не освоите всех деталей языка, то в дальнейшем можете споткнуться на них, и это приведет к неприятным последствиям». На это Ж. Ичбиа возражал: «Иногда Вирт верит в малые решения больших проблем. Я не верю в такие миражи. Крупные проблемы требуют крупных решений». Последний тезис довольно часто выдвигается как оправдание сложности программных систем и языков программирования, хотя, при всей внешней убедительности, не имеет на самом деле достаточных обоснований.

«Язык для сложного мира» — такой девиз сопровождает эмблему языка Ада. Сложность языка Ада таила в себе и другую опасность. Хотя сам язык, предназначенный для использования в чрезвычайно ответственных военных системах, содержал достаточные механизмы контроля, источником ненадежности могли оказаться ошибки в компиляторах, поскольку любой компилятор Ады неизбежно оказывается очень большим. Надо сказать, что эта опасность была осознана своевременно: разработаны строгие процедуры аттестации компиляторов Ады. В1980 году были сформулированы «каменные» (STONEMAN) требования к программному окружению, которое должно сопровождать каждую реализацию Ады. В 1983 году принят американский ANSI-стандарт языка Ада, а в 1987 году совпадающий с ним международный стандарт ISO.

После принятия стандарта и появления промышленных компиляторов язык Ада стал обязательным для многих военных применений в США, а также в странах НАТО. В гражданской сфере распространенность языка Ада существенно меньше. Он используется в крупномасштабных проектах, связанных с авиацией, транспортом, системами связи.

В нашей стране язык Ада был встречен с энтузиазмом. Достаточно сказать, что русские переводы книг по языку стали выходить уже через два года после его появления (очень оперативно по меркам тех лет). Общедоступные книги по Аде появились даже раньше, чем книги по Паскалю и Си. Видимо, перспективы Ады представлялись нашим аналитикам предпочтительными. Ада был официальным языком «потенциального противника», и уже поэтому заслуживал повышенного внимания.

В отличие от Паскаля и Си, возникших в результате личной инициативы их авторов, язык Ада был создан по государственному плану. На государственную основу поставили и продвижение Ады в СССР. Была образована Рабочая группа по языку Ада при Госкомитете по науке и технике. Несколько коллективов разработчиков занимались реализацией Ады. Однако до широкого использования языка, как в военной, так и в гражданской сфере, дело не дошло. Известно, однако, что программное обеспечение авионики (авиационной электроники) на ряде отечественных самолетов (аэробус Ил-96М, летающая лодка Бе-200 КБ Г. М. Бериева) написано на языке Ада. Но это уже события нового времени, и речь, по-видимому, идет об импорте западных программных технологий и авионики. Ада используется в программном обеспечении Международной космической станции, построенной совместными усилиями США и России.
Модула-2. Язык Модула-2 разработан в ходе реализации проекта рабочей станции Lilith. Этот проект, инициированный, вдохновляемый и руководимый автором языка Паскаль Никлаусом Виртом, был запущен в ЕТН (Цюрих, Швейцария) в конце 1977 года. Основной идеей была совместная разработка аппаратуры и программного обеспечения, свободная от каких-либо ограничений, требующих совместимости с существующими аппаратными и программными платформами. Компьютер проектировался таким образом, чтобы максимально упростить компиляцию программ с языка высокого уровня, обеспечивая при этом высокую эффективность. Идея подчинения компьютерной архитектуры потребностям трансляции с языков высокого уровня, а именно на таких языках пишется подавляющее число программ, — один из основных тезисов, пропагандируемых Н. Виртом.

Все программы планировалось написать на одном языке. Но ни один из существующих языков Вирта не устраивал. Язык должен был поддерживать, подобно Паскалю, хорошие возможности структурирования, обеспечивать высокий уровень абстракции, гарантировать надежность и в то же время предоставлять средства низкого уровня для непосредственного доступа к аппаратуре. Кроме этого, язык должен быть достаточно прост, чтобы разработка компилятора (конечно же, на самом этом языке) могла быть выполнена за разумное время, а сомнений в правильной работе этого компилятора не возникало. Предложенный Н. Виртом язык был назван Модула-2. Название подчеркивает основную его особенность - наличие модулей — раздельно компилируемых частей программы со строгим интерфейсом, определяющим их взаимодействие. Модула-2 — потомок Паскаля и экспериментального языка Модула, использовавшегося Н. Виртом для исследований по мультипрограммированию. Значительное влияние на Модулу-2 оказал также язык Mesa, с которым Н. Вирт познакомился в исследовательском центре компании Xerox в Пало-Альто (PARC), где он провел свободный от лекций год (1976).

Основная работа по спецификации и реализации языка происходила в 1978—1979 годах. Первый компилятор Модулы-2 заработал в 1979 году на мини-компьютере PDP-11. С его помощью велась разработка программного обеспечения для Lilith. В дальнейшем он подвергся нескольким модернизациям.

Описание нового языка было опубликовано в 1980 году. Позднее, в 1983, в язык были внесены изменения. В 1984 году Н. Вирт разработал новый компилятор Модулы-2 для Lilith, благодаря однопроходной схеме трансляции работавший в пять раз быстрее прежнего. Благодаря простоте языка размер компилятора составил всего около 5 тысяч строк. Новый язык быстро стал известным благодаря большому интересу к работам Н. Вирта, который к тому времени приобрел значительный авторитет в компьютерном мире. Появились коммерческие компиляторы Модулы-2 для различных платформ. Первым был компилятор фирмы Logitech. На IBM PC-совместимых компьютерах получил известность компилятор компании TopSpeed, образованной бывшими сотрудниками'фирмы Borland. В корпорации IBM Модулу-2 использовали для программирования операционной системы компьютеров AS/400. В1996 году был принят стандарт ISO на язык Модула-2.

Несмотря на свои очевидные достоинства, язык Модула-2 не получил слишком большого распространения. Этому можно найти несколько объяснений. Во-первых, в 1983 году появился Turbo Pascal — выдающаяся в техническом отношении система, обладавшая высокой скоростью работы, компактностью и удобством в использовании. Успех первой версии позволил компании Borland вложить достаточные средства в развитие и продвижение Turbo Pascal. Большое число потенциальных пользователей Модулы-2 были привлечены бурно развивавшимся и активно продвигаемым Turbo Pascal. Это при том, что язык Turbo Pascal безусловно уступал Модуле-2 по качеству реализации механизма модульного программирования и многим другим критериям. С другой стороны, в 1980-е годы продолжилось распространение операционной системы UNIX, основным языком которой был Си. Язык Си и последовавший за ним Си++ были поддержаны крупными разработчиками коммерческого программного обеспечения. Потерпев поражение в конкурентной борьбе с Borland на рынке компиляторов языка Паскаль, корпорация Microsoft сосредоточила свои усилия на продвижении средств разработки на языках Си и Си++ (наряду с Visual Basic). Си и Си++ стали и основными языками операционной системы Windows. В свою очередь, Borland также уделила немалое внимание Си и Си++, поскольку не могла ограничиться в своих системах языком, который не соответствовал стандартам и не применялся за рамками этих систем.

Судьба языка Модула-2 в нашей стране аналогична его мировой судьбе — высокий интерес вначале и не слишком большое распространение в дальнейшем. Перевод книги Н. Вирта «Программирование на языке Модула-2» был выпущен почти сразу вслед за книгами по Паскалю. Модула-2 была реализована на отечественных компьютерах, в частности, в системе Эльбрус. На компьютерах с системой команд PDP-11 (СМ-4, Электроника-60, ДВК) получили некоторое распространение компиляторы ЕТН.


Си++ — один из самых известных и распространенных языков объектно-ориентированного программирования. Именно Си++ в конце 1980-х и начале 1990-х был в центре того ажиотажа, который возник вокруг ООП. Язык формировался более 10 лет. В 1980 году сотрудник Bell Laboratories Бьерн Строуструп (Bjarne Stroustrup), стремясь улучшить Си, обеспечив поддержку абстракции данных и объектно-ориентированного программирования, ввел в Си понятие класса, заимствованное из языка Симула-67. Кроме того, были добавлены контроль и преобразование типов параметров функций и некоторые другие возможности. В течение нескольких лет язык, получивший название «Си с классами», использовался в исследовательской группе Б. Строуструпа.

В 1983-1984 годах в язык были внесены добавления: виртуальные функции, совместное использование (перегрузка, переопределение) операций (как в Алголе-68 и Аде). В новой реализации язык получил остроумное название Си++ (увеличенный, расширенный Си), предложенное Риком Маскитти (Rick Mascitti).

В 1985 году Б. Строуструп опубликовал первую книгу с описанием Си++: «The C++ Programming Language», Addison-Wesley, 1985. С этого времени началось распространение языка, стали появляться его реализации для разных платформ. Интересно отметить, что в течение нескольких лет Си++ был реализован только с помощью конвертора в язык Си (транслятор cfront), и только в конце 80-х появились компиляторы, не использующие Си в качестве промежуточного языка. Это объясняется, во-первых, желанием обеспечить простой перенос языка на разные платформы, используя мобильность Си — компиляторы Си существуют для любых систем, а во-вторых — сложностью Си++. В дальнейшем язык постоянно расширялся. Были добавлены множественное наследование, шаблоны, обработка исключений. В 1989 году, с созданием объединенного комитета ANSI/ISO начался процесс стандартизации языка, растянувшийся на долгие годы. В ходе стандартизации в язык вносились все новые добавления: логический тип, пространства имен и др. В1993-1994 годах в проект стандарта включено описание библиотеки ввода-вывода и библиотеки стандартных шаблонов (Standard Template Library, STL), предложенной сотрудником компании Hewlett-Packard А. Степановым. Стандарт принят в 1998 году (ISO/IEC 14882-1998).

В 90-е годы было осуществлено большое число реализаций Си++. Системы программирования на языке Си++ были выпущены и активно продвигались компаниями Microsoft (Microsoft C++, Visual C++) и Borland (Turbo C++, Borland C++, C++ Builder). В компании Microsoft Си++ стал основным языком системного программирования. Получил признание компилятор Watcom C++, отличавшийся высокой степенью оптимизации создаваемого кода. Развитыми возможностями обладает IBM Visual Age C++. Широко известен компилятор g++, разработанный в рамках проекта GNU3.

В конце 90-х обозначилась тенденция монополизации рынка компиляторов Си++. На платформе Windows доминирующее положение занял компилятор Visual C++ компании Microsoft. Располагая значительными ресурсами, Microsoft сумела довести продукт до определенной степени совершенства, обеспечив, в частности, высокий уровень оптимизации создаваемого компилятором машинного кода. Обладая форой перед конкурентами, Visual C++ обеспечивает и наилучшую интеграцию с системой Windows.

Высокую степень оптимизации кода, учет особенностей конкретных моделей микропроцессоров, выпускаемых компанией Intel, обеспечивает компилятор Intel C++. В его разработку и совершенствование, начиная с 2000 года, вносит вклад Нижегородская лаборатория Intel. Известен проект создания компилятора Си++, осуществленный в лаборатории Открытых информационных технологий ВМиК МГУ (руководитель В. А. Сухомлин, ведущие разработчики Е. А. Зуев, А. Н. Кротов), который, по утверждению авторов, превосходит по степени соответствия стандарту Си++ многие коммерческие системы. Размер этой программы — около 200 тыс. строк на Си и Си++.


2. Компиляция и предмет ТЯП
Под компиляцией будем понимать переделку всей исходной программы в последовательность машинных команд.

Под интерпретацией будем понимать компиляцию небольших частей исходной программы (порядка одной строки) с немедленным выполнением полученного машинного кода.

Таким образом в любом случае все сводится к компиляции.

Схема работы компилятора



Схема работы интерпретатора

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

Схема компилятора/интерпретатора


Лексический анализатор выкидывает из текста все лишнее (комментарии) и разбивает текст на лексемы – неделимые смысловые единицы (идентификаторы, зарезервированные слова, знаки операций и т.д.)

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

Синтаксический анализ уточняет и конкретизирует некоторые существенные особенности программы, связанные с обрабатываемыми программой данными (их типами, значениями и пр.)
3. Представление о назначении и структуре языка Бэкуса-Наура.
Чтобы описать алгоритм трансляции какого-то языка (например, языка программирования высокого уровня Паскаль), прежде всего надо строго определить, что именно подается на вход транслятора.

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

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

В данном параграфе дается представление об одном из важнейших метаязыков этой области – так называемой Форме Бэкуса-Наура (БНФ). Фрагментарно этот язык знаком каждому программисту по отрывкам спецификаций (описаний) различных программ и синтакcических конструкций. Например в системе помощи Borland C++ Builder для ключевого слова __property без труда найдем:




::=


__property [
] = "{"
"}"


::= "[" [ ] "]" [
]



::=
[ ,
]



::= read =



::= write =



::= stored =



::= stored =



::= default =



::= nodefault



::= index =

Конечно, подобное описание того, что такое __property (свойство) неподготовленному человеку ничего не говорит. Но если сказать, что __property - это такая своеобразная синтаксичечкая конструкция внутри описания класса, которая, как правило, объединяет пару методов этого класса, например в виде:

__property TColor ColorLine={read = GetColorLine ,write = SetColorLine }

то уже можно кое о чем догадаться.

Например, <type> - это какой-то тип языка (базовый или определенный программистом). Вообще, выражение в скобках <> означает некую сущность – смысловую едининицу БНФ. Внутри скобок можно писать все, что угодно. Это будет просто пояснением для человека. Так <data/function id> обозначает данное класса или метод класса.

Символ ::= можно на человеческий язык перевести как “это”.

Квадратные скобки [ и ] заключают в себя необязательную часть – может быть, а может и не быть. Это не касается "[" или "]" – тут скобки обозначают самих себя.

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

Все, что в указанные скобки не входит – это литеры, которые пишутся как есть.

Язык Бэкуса-Наура использует еще один символ, о котором пока не говорилось. Это знак “|”, означающий союз “или”. Как правило он используется для того, чтобы несколько высказываний вида

<Объект>::=Определение1

<Объект>::=Определение2

<Объект>::=Определение3

Заменить одним



<Объект>::=Определение1| Определение2| Определение3

Но его можно использовать также внутри квадратных или фигурных скобок. Например,



<Буква> ::= a|b|c|…|z|_|A|B|C|…|Z

<Цифра> ::= 0|1|2|3|4|5|6|7|8|9

<Идентификатор> ::= <Буква>{<Цифра>|<Буква>}
Таким образом язык Бэкуса-Наура представляет собой ряд высказываний вида

<Объект> ::= Определение объекта
Если у нас есть описание на БНФ, допустим, языка Паскаль и надо доказать, что какая-то последовательность литер является правильно написанной программой, то мы должны суметь “логически” вывести этот факт из утверждений описания.

Например, цепочка литер _aa2 является идентификатором потому, что


<Идентификатор> ::= <Буква>{<Цифра>|<Буква>} =>

<Идентификатор> ::= <Буква><Буква><Буква><Цифра> =>

_aa2 – это <Идентификатор>
Что собственно за логика здесь используется? Просто подстановки. Раз есть правила

<Буква> ::= _

<Буква> ::= a

<Цифра> ::= 2

<Идентификатор> ::= <Буква><Буква><Буква><Цифра>,

То заменив в последнем утверждении <Буква><Буква><Буква> на _aa, а <Цифра> - на 2, получим, что _aa2 – также <Идентификатор>.



С точки зрения строгой логики каждое высказывание БНФ вида

<Объект> ::= Определение

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

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




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

    Басты бет