От двоичного кодирования к системам автоматической генерации кода

Вид материалаДокументы

Содержание


Третье поколение
Рождение языков пятого поколения
Фортран: программисты свой выбор сделали — еще 40 лет назад
Fortran IF 1964 года, затем, по мере появления новых языков с новыми идеями, в 19 78 году был принят новый стандарт Fort ra n
Nasa cosmic
Borland вскоре выпустила свой Turbo Pascal
Iso/iec 8652:1985(е).
GNAT: компилятор GNUAda95
Jovial: веселый язык программирования
Pl/i, fortran
Turbo Pascal
PL/I (ПЛ/1 в советской версии) такова. В середине 60-х годов компания IBM
Jet Propulsion Laboratory
MS-DOS, Windows, OS/2, Unix/Linux, AS/400, IBM RS/6000 AIX, DEC, VM, MVS, VSE
IBM. В ее версиях языка VisualAge PL/I
PL/B: язык для бизнесменов
Языки сценариев («скрипт-языки»)
Perl — язык альтруистов
Perl мощных встроенных средств обработ­ки данных этот язык легко осваивают начинающие пользователи. Если человек знает С, то пер
HTML наподобие сценариев " onclick="return false">
...
Полное содержание
Подобный материал:
  1   2   3   4   5   6



Глава 2 • Языки программирования — прошлое и будущее


С. .Бобровский.

«Программная инженерия»

С.Петербург, изд-во «Питер», 2003.


Глава 2

Языки программирования: прошлое и будущее

От двоичного кодирования к системам автоматической генерации кода

Языки программирования по своим возможностям и времени создания принято делить на несколько поколений (Generation Language, GL). Каждое следующее поколение качественно отличается от предыдущего по функциональной мощности. На сегодняшний день насчитывают пять поколений языков программирования.

В первое поколение (1GL) входят языки, созданные в 40-50-е годы, когда компьютеры только появились на свет. В то время программы писались в машинных кодах, то есть каждая компьютерная команда вместе с ее операндами вводилась в ЭВМ в двоичном виде. Это требовало огромных усилий по вводу цифровых текстов и приводило к множе­ству трудноуловимых ошибок. Конечно, ни о каких мало-мальски боль­ших проектах речи идти не могло. Ситуация качественно изменилась в середине 50-х годов, когда был написан первый ассемблер. Это само по себе можно считать подвигом, учитывая довольно сложную логику программы. Хотя этот ассемблер был в сегодняшнем понимании непол­ноценным, он позволял задавать названия команд в символическом виде и указывать числа не только в двоичном, но и в десятичном или шестнадцатеричном формате, что существенно облегчило работу про­граммистов.

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

Расцвет второго поколения языков программирования (2GL) пришелся на конец 50-х — начало 60-х годов. Был создан символический ассемб­лер, позволявший писать программы без привязки к конкретным адре­сам памяти. В него было введено понятие переменной, и он, по сути, стал первым настоящим (хотя и машинно-ориентированным) языком программирования со своим компилятором. Скорость создания и эффективность работы программ резко возросли. Ассемблеры активно применяются и в настоящее время, как правило, для создания про­грамм, максимально использующих возможности аппаратуры: различ­ных драйверов, модулей стыковки с нестандартным оборудованием и других. В некоторых областях, например, в машинной графике, на ассемблере пишут библиотеки, эффективно реализующие стандартные алгоритмы обработки изображений. Кроме того, среди программистов просто есть немало людей, предпочитающих использовать ассемблер в своей работе. Как правило, это специалисты, хорошо разбирающиеся в электронике и схемотехнике.

Третье поколение языков программирования (3GL) принято относить к 60-м годам. В это время родились языки, которые называют универ­сальными языками высокого уровня — с их помощью можно решать задачи из любых областей. Это общеизвестные Фортран, Кобол, Алгол и другие. Такие качества новых языков, как относительная простота, независимость от конкретного компьютера и возможность использова­ния мощных синтаксических конструкций позволили резко повысить производительность труда программистов. Кроме того, понятная боль­шинству пользователей процедурная идеология этих языков позволила привлечь к написанию небольших программ (как правило, расчетного или учетного характера) большое количество специалистов из неком­пьютерных областей.

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


С начала 70-х годов по настоящее время тянется период языков чет­вертого поколения (4GL). После первых восторгов по поводу безгранич­ных способностей ЭВМ возможности существующих языков програм­мирования стали более понятными. Несмотря на рождение новых технологий (объектно-ориентированное программирование, визуаль­ное программирование, CASE-методологии, системный анализ), про­цесс создания больших программных комплексов оставался очень тру­доемкой задачей. Для реализации крупных проектов требовался более цельный подход к решаемым задачам, чем предлагали имевшиеся сред­ства разработки. Языки 4GL частично снимали эту проблему. Цель их создания — в первую очередь увеличение скорости разработки проек­тов, снижение числа ошибок и повышение общей надежности работы больших программных комплексов, возможность быстрого и легкого внесения изменений в готовые проекты, упрощение самих языков для конечного пользователя, активное внедрение технологий визуальной разработки и так далее. Все средства разработки четвертого поколения имеют мощные интегрированные оболочки и обладают простым и удоб­ным пользовательским интерфейсом. Они чаще всего используются для проектирования баз данных и работы с ними (встроенные языки СУБД), что объясняется возможностью формализации всех понятий, используемых при построении реляционных баз данных. Языки 4GL активно применяются в специализированных областях, где высоких результатов можно добиться, используя не универсальные, а проблем­но-ориентированные языки, оперирующие конкретными понятиями узкой предметной области. Как правило, в эти языки встраиваются мощные примитивы, позволяющие одним оператором описать такую функциональность, для реализации которой на языках младших поко­лений требуются тысячи строк кода.

Однако пользователям, использующим языки 4GL для создания закон­ченных приложений, по-прежнему необходимо кодировать программу вручную, используя обычный последовательный ввод команд. При этом сохраняется главный недостаток языков предыдущих поколений. Все они в значительной степени ориентированы на чуждую человеческому мышлению чисто компьютерную идеологию (работа с памятью, пере­менными, базами данных, последовательностями абстрактных опера­торов и т. п.), что требует от людей хорошего понимания принципов функционирования компьютера и операционных систем. Кроме того, парадигма функционального программирования по-прежнему присут­ствует в языках 4GL во всей полноте, не позволяя перейти при разра­ботке программных систем к более высокому уровню абстракций.

Рождение языков пятого поколения относится к настоящему времени. Довольно неожиданно вокруг самого названия 5GL разгорелись жаркие

споры. Возникло несколько программистских «школ», представители каждой из которых имеют свое мнение о том, какие средства разработки считать языками пятого поколения, а какие — нет. Например, на стра­ницах лондонского журнала SURPRISE (SURueys and PResentations in Information Systems Engineering), выпускаемого при поддержке бри­танских министерств по электронике и вычислительной технике, пуб­ликуются статьи известных специалистов в компьютерной области: профессоров Лондонского научного колледжа, разработчиков популяр­ных английских программ и других. Представители «английского» направления рассматривают средства разработки пятого поколения в более широком аспекте, чем это принято делать в отношении обычных языков программирования. Они считают, что к системам 5GL можно отнести не только новые мощные языки, но и системы создания про­грамм, ориентированные на непрограммиста. Подобные системы отличаются стремлением предоставить конечному пользователю-неспециалисту богатые возможности создания прикладных программ с помощью визуальных средств разработки без знания программи­рования.

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

Исходные тексты обычно генерируются на языках более низкого уровня (как правило — третьего поколения). Благодаря автоматическому про­цессу генерации текстов программы результирующий код получается хоть и неэффективным, но высоконадежным и не содержащим ошибок. Правда, при этом возникает проблема совместимости с имеющимися на рынке компиляторами. После генерации кода созданного приложения необходимо перевести его в машинное представление. Для этого требуется тесная интеграция с имеющимися коммерческими компиляторами, легкая настройка, ориентированная на пользователя-непрограммиста и соответствие получаемого кода требованиям конкретных средств разработки. В боль­шинстве случаев из-за острой конкурентной борьбы решить проблему совместимости в целом не удается, поэтому системы разработки 5GL ориентируются обычно на определенные версии компиляторов.

В целях обеспечения возможности создания программ, решающих самые разные задачи, разработчики стараются использовать богатый многолетний опыт программной индустрии. Системы пятого поколе­ния имеют открытую архитектуру и нередко поддерживают большое количество продуктов третьих фирм, предоставляя пользователю воз­можность интеграции с готовыми решениями для различных областей. Это могут быть всевозможные визуальные редакторы, генераторы отче­тов, стандартные библиотеки, удобные Мастера (Wizards) быстрого создания типовых приложений, CAS-E-системы, средства интеграции с базами данных и т. п. Чем больше приложений удается объединить в одном пакете, тем большими возможностями он обладает.

В большинстве подобных систем используются усовершенствованные технологии, воплощенные в средствах более низкого уровня. Напри­мер, возможность «мышиного» создания программ без ручного набора текстов, с использованием средства визуального проектирования про­граммного обеспечения, взята из современных систем разработки 4GL. Другое перспективное направление, заимствованное из 4GL, — мето­ды программной инженерии. Различные формальные нотации, поддер­живаемые CAS-E-системами, позволяют с помощью мыши быстро созда­вать заготовки программ и сценарии SQL, описывающие структуру баз данных. Ряд современных языков 5GL создан на основе успешно реали­зованных продуктов 4GL, и граница между этими поколениями сильно размыта. Пока системы разработки пятого поколения только появля­ются на свет, и нередко аббревиатура 5GL используется больше для рек­ламы — дескать, смотрите, мы впереди конкурентов!

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

Однако значительно большая группа специалистов считает, что языки пятого поколения являются именно языками программирования, тре­бующими от разработчика соответствующей квалификации и умения составлять программы вручную. Сторонники этого мнения под язы­ками 5GL понимают специализированные языки, оперирующие не абстрактными переменными, а понятиями своей предметной области, например бухгалтерскими счетами или ферзями и пешками. Это, как правило, узкоспециализированные языки, предоставляющие программисту мощные высокоуровневые возможности обработки информации из конкретной области знаний. К языкам пятого поколения относят также интегрированные с базами знаний и экспертными системами программные комплексы с собственными языками программирования. Типичный пример — созданная в Австралии самообучающаяся ней­ронная сеть LISA со встроенным языком описания фактов, сущностей и взаимосвязей между ними, на торговой марке которой гордо красует­ся « 5GL».

Несмотря на внешнюю противоположность определений языков 5GL (прикладные пакеты или языки программирования), для реализации конкретных продуктов, подпадающих под то или иное определение, используются достижения одних и тех же компьютерных областей. В обоих случаях мы наблюдаем стремление предоставить программи­сту средства разработки, использующие наиболее естественные для человеческого мышления понятия. При этом неважно, как реализова­но это желание: в виде усовершенствованных средств визуального про­ектирования или в виде новых мощных языков программирования, оперирующих привычными терминами. Наиболее актуальными для систем 5GL станут достижения в следующих областях:
  • логическое программирование (Пролог-подобные языки и машины
    вывода);
  • объектно-ориентированное программирование;
  • исследовательское программирование (проект сложен и неясен, но средства разработки позволяют быстро создать шаблон программы и включать в него работающие фрагменты, постепенно приближаясь к конечному результату);
  • использование естественных языков для создания программ;
  • технологии управления базами знаний;
  • методы обработки и анализа текстовой информации (энциклопедии, Wefo-страницы, документы) с возможностью смыслового поиска и т.д.

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

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

Языки 5GL, ориентированные на конкретные области применения, могут уже в ближайшее время завоевать самую широкую популяр­ность. Наиболее перспективны продукты, позволяющие создавать при­ложения для работы с базами данных. Базы данных — это область информатики, наиболее успешно поддающаяся формализации. Нагляд­ное подтверждение этому — тенденции развития практически всех известных СУБД корпоративного уровня. Вслед за встроенными язы­ками СУБД появляются и другие проблемные языки программирова­ния.

Кроме того, универсальные языки логического программирования наподобие Пролога, основанные на мощных математических аппара­тах, совсем не канули в Лету, как может иногда показаться читателю российской компьютерной прессы, где мелькают сплошные «Си» и «Явы». Языки логического программирования продолжают более чем успешно развиваться; другое дело, что для их грамотного применения требуется высокая культура программирования (и проектирования) по сравнению с тем же C++. Они нужны для несколько иных задач, чем создание коробочных бухгалтерий (хотя для этих целей они также под­ходят значительно лучше С или Паскаля). Неудивительно, что в на­шей стране мощными зарубежными средствами разработки, реализу­ющими алгоритмы искусственного интеллекта или имеющими в своей основе уникальные математические теории, нередко наиболее актив­но интересуется ФАПСИ. Это явствует хотя бы из открытых семина­ров ведущих российских фирм-дистрибьюторов соответствующих продуктов. Хочется надеяться, что рано или поздно и коммерческие фирмы поймут выгоду использования хоть и дорогих, но очень мощных по своим возможностям систем для создания приложений сверхвысокого уровня.

Так что смерть языкам программирования (и профессии программиста вместе с ними) в ближайшие лет пятьдесят не грозит. А дальше будет видно.


Третье поколение

Фортран: программисты свой выбор сделали — еще 40 лет назад

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

Язык программирования FORTRAN (FORmula TRANslation) был самым первым языком высокого уровня, получившим широкое распростра­нение. Он возник в конце 50-х годов, когда шли горячие дискуссии о самой необходимости создания подобных языков. Программисты, раз­рабатывавшие программы исключительно на ассемблере, выражали сильное сомнение в возможности появления высокопроизводительно­го языка высокого уровня.

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

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

Из-за широкого распространения языка и появления множества про­грамм на Фортране (преимущественно вычислительного характера) насущным стал вопрос его стандартизации. Сначала это был стандарт

Fortran IF 1964 года, затем, по мере появления новых языков с новыми идеями, в 19 78 году был принят новый стандарт Fort ra n 77(/77)с большим числом синтаксических расширений, носящих более современ­ный и более гибкий характер. Сегодня наиболее распространенным является стандарт Fortran 90 (f90) и его очередной пересмотренный вариант Fortran 95.

Огромное количество библиотек для Фортрана, начиная от статисти­ческих комплексов и кончая пакетами управления спутниками NASA COSMIC, потребовало строгой совместимости новых стандартов языка с предыдущими версиями для обеспечения корректной трансляции старых текстов программ новыми компиляторами. Поэтому тщатель­ной проработке стандарта именно в отношении Фортрана всегда уде­лялось особое внимание.

В новые версии языка вносились и ненужные дополнения, которые выглядят как следование моде и желание сохранить популярность Фор­трана (это, например, расширения, связанные с динамическим выделе­нием памяти), и полезные вещи (модульная организация программы, работа с частями массивов и другие). Все же сегодня этот язык нельзя назвать перспективным для изучения, так как его синтаксис сильно устарел. Однако разработчикам крупных систем, которым часто прихо­дится решать вычислительные задачи, совсем не обязательно каждый раз брать в руки учебник по математике и «начинать творить» с нуля. В 90% подобных случаев то, что вы ищете, уже давным-давно было реа­лизовано и отлажено на Фортране.

Я сам был свидетелем разработки двух схожих между собой наукоем­ких проектов. Вычислительные алгоритмы, написанные с десяток лет назад для машин типа VAX с диалоговым вводом данных в текстовом режиме, переписывались с помощью Microsoft Fortran (операторы вво­да/вывода заменялись на обращения к внешним функциям). Из этих модулей формировались библиотеки DLL, а сама графическая оболочка разрабатывалась на C++. И все прекрасно работало. Причем в первом подобном проекте я участвовал в 1993 году, а во втором — ровно через десять лет (правда, в последнем случае вместо Microsoft Fortran исполь­зовался Intel Fortran). Популярность Фортрана за это время в научном мире ничуть не понизилась.

Поэтому «безбедная жизнь» Фортрану обеспечена надолго. Есть и еще одна ниша — параллельные вычисления, где строгая семантика языка позволяет получать высокопроизводительные программы. Обычно исполь­зуется стандарт f90, немного расширенный набором операторов для указания пригодных к распараллеливанию частей программы. Парал­лельный Фортран имеет свой стандарт HPF (High Performance Fortran).

Ярые поклонники Фортрана, девизом которых стала легендарная фраза: «Зачем мне изучать другие языки, когда я могу все написать на Форт­ране?» — тем не менее, ощущали его очевидную непригодность для крупномасштабных проектов, связанную с привязанностью к синтак­сису 50-х годов. Они попытались ввести в него модные идеи объектно-ориентированного программирования. К счастью, объектный Фортран в качестве стандарта так и не появился, иначе он представлял бы собой что-то типа Мерседеса с движком от Запорожца.

Среди бесплатно распространяемых версий Фортрана наиболее извес­тен f2c, реализованный для всех Unix/Linux-систем и преобразующий текст Фортран-программы в Си-код (ftp://netlib.att.com). Для MS-DOS имеется версия bcf77, распространяемая бесплатно для студентов (ftp.uni-stuttgart.de). Отметим Watcom Fortran (www.watcom.org), генериру­ющий высокоэффективный код, а также прекрасную серию Intel-ком-пиляторов. А вообще различные по качеству компиляторы Фортрана имеются на абсолютно всех компьютерных платформах.

Программисты часто спрашивают: «А чем этот Фортран лучше, напри­мер, Си?» Конечно, у каждого языка есть свои плюсы, и у Фортрана это, в первую очередь, фактическое отсутствие машинно-ориентиро­ванных конструкций и определенные гарантии в отношении правиль­ности исполнения вычислительных операций. Например, если при использовании Си-компилятора для 16-разрядных платформ целочис­ленное сложение 32000+1000 может дать отрицательное число, то в Фор­тране такие «проколы» отсутствуют, причем тщательно отслеживается накопление погрешности при вычислениях с большим числом знаков после запятой. Кроме того, программ, реализующих самые разные мате­матические алгоритмы, на Фортране написано столько, что переписы­вать их на другие языки просто глупо. А вообще на подобные «наезды» — «Си лучше!» — в конференции Интернета comp.lang.fortran обычно отве­чают: «А чего ты тогда сюда пишешь?»

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


Так что про Фортран забывать никак нельзя. Использовать его в каче-1стве инструментария в задачах системной интеграции, наверное, не имеет смысла, но то, что было наработано лучшими программистами за 20-30 лет, вполне может ускорить процесс разработки программ. По крайней мере, программных «кирпичиков» для Фортрана суще­ствует несравненно больше, чем для других языков программирования.