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

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

Содержание


Haskell следует отнести повышенные требования к памяти (из-за рекурсии) и не очень высокое быстродействие. Впрочем, последняя ве
NET готовится облегченная версия языка Haskell
Mercury сам написан на языке Mercury.
NET — противодействие системе Java)
NET) компиляторы и интерпретаторы для разных платформ, в том числе и для Windows.
Подобный материал:
1   2   3   4   5   6

Пишется на чем угодно — разрабатывается только в Visual Studio

Существует еще как минимум с десяток не менее популярных языков программирования, по различным причинам не упомянутых в данной книге, хотя вполне этого заслуживающих. Так, одним из сценарных языков, завоевавших большую популярность в России, безусловно является РНР. Буквально за считанные годы набрал известность раз­работанный в Microsoft язык С#, напоминающий Java. Распростра­ненная Интернет-технология Flash также содержит встроенный режим программирования. Кроме того, в немалом количестве отечественных систем автоматизации имеются собственные внутренние сценарные языки. Например, должность «программист 1C» уже стала фактиче­ским стандартом.

Интересную возможность объединения множества языков программи­рования в одной оболочке предложила корпорация Microsoft. Посмот­рим, какие новые языки она предлагает разработчикам.

Несколько лет назад корпорациямicrosoft выпустила бета-версию среды разработки Visual Studio.NET, в которой реализована идея общего язы­кового окружения (Common Language Runtime, CLR). Коммерческая версия должна появиться в 2003 году. Тексты программ на различных языках программирования должны транслироваться не в команды про­цессора, а в промежуточный байт-код на языке MSIL (просматривается четкая аналогия с технологией Java, основным конкурентом системы Windows). Это дает разработчикам ряд несомненных удобств, например доступ к общей библиотеке стандартных классов. На уровне CLR реали­зованы поддержка объектной технологии, сборка мусора, проверка безопасности, многопотоковость, вызов удаленных процедур и другие функции.

Одно из важнейших достоинств идеи CLR — возможность создания про­грамм, написанных на разных языках программирования, а также раз­работки и отладки приложений в единой оболочке Visual Studio.NET. В стандартный комплект поставки Microsoft войдут, по всей види­мости, языки С#, C++ и Visual Basic.NET. Кроме того, корпорация Microsoft предложила ряду компаний реализовать их собственные рас­ширения Visual Studio.NET для других языков программирования. Это такие достаточно известные языки, как Smalltalk, Component Pascal, Oberon, Perl, Fujitsu COBOL (его рекомендовал к переносу на .NET сам Билл Гейтс), а также целый ряд менее известных, но во многих случаях гораздо более полезных языков. Хочется надеяться, что выпуск их ../У-ЕТ-версий принесет им заслуженную популярность.

Среди языков, готовящихся к ../УЕТ-реализации, немало языков ( ционального программирования. Они отличаются от обычных, п дурных (императивных) языков тем, что написанная на них про ма — это не линейная последовательность операторов, а выраж Вместо механического выполнения, производится вычисление жения с активным использованием рекурсии, методов сопоставь с образцом и т. д. При этом обычно требуется достаточно мощное и нительное ядро, реализующее сложные алгоритмы поддержки bi лений. Классический пример такого языка — Лисп.

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

Операторы SQL делают, что надо получить от базы данных (программист просто пишет команду «дайте мне данные, связанные таким-то образом»), но не уточняют, как их получить — эта задача возлагается на сервер базы данных.

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


Haskell

Это функциональный язык со строгой типизацией, базирующий лямбда-исчислениях (как Лисп). Он обладает прозрачной для программиста семантикой. Язык Haskell (www.haskell.org) создавался для повышения производительности работы программистов при создании больших систем. Как показал опыт таких компаний, как Ericsson ( язык Haskell применялся при разработке телекоммуникационных приложений) и Software AG (на языке Haskell написана экспертная Natural Expert), скорость создания программного обеспечения возрастала в 9-25 раз по сравнению с аналогичными проектами, где использовались C/C++.

Отличительная особенность языка Haskell — возможность использования собственного синтаксиса для формального описания требований к проекту, что позволяет безболезненно переходить от проектированию к программированию. Этот язык дает возможность писать простой, краткий и наглядный код, обеспечивая несложными средствами инкапсуляцию и полиморфизм. Так, рекурсивное описание процедуры быстрой сортировки занимает всего пять строчек. Использовать такую про­цедуру можно с данными любых типов, допускающих сравнение.

Все задачи управления памятью возлагаются на исполняющую среду. Программисту не надо заботиться о выделении и освобождении динами­ческой памяти. Кроме того, среда реализует так называемое «ленивое вычисление»: в ходе выполнения программы происходит вычисление только тех данных, которые реально запрашиваются. Например, вычи­сление параметров процедуры, заданных в виде выражений, выполня­ется только в том случае, если в ходе выполнения процедуры происхо­дит обращение к ним.

К недостаткам языка Haskell следует отнести повышенные требования к памяти (из-за рекурсии) и не очень высокое быстродействие. Впрочем, последняя версия Haskell 98 отличается неплохими показателями.

К переносу на платформу .NET готовится облегченная версия языка Haskell под названием Mondrian (www.mondrian-script.org). По синтаксису этот язык напоминает Си и Java.


Scheme

Это диалект Лиспа с упрощенной семантикой и расширенными спосо­бами формирования и вычисления выражений, синтаксического раз­бора и сопоставления с образцом.

В языке Scheme (rover.cs.nwu.edu/~scheme) реализован целый ряд нововве­дений, которые применительно к языкам программирования рассмат­ривались до недавнего времени лишь теоретически. В частности, не делается явного различия между целыми числами, числами с плаваю­щей запятой и комплексными значениями (число — оно и есть число). Лямбда-запись дополнена блочными конструкциями и обычными линей­ными процедурами. С их помощью синтезируются все важнейшие управляющие структуры. Сами процедуры трактуются как объекты: их можно, например, создавать динамически или возвращать в каче­стве результата работы функции. Передача данных в процедуры допус­кается только по значению — это требует предварительного вычисле­ния всех параметров (в отличие от «ленивого вычисления» в языке Haskell).

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

Интересно, что Sc/ie/ne-приложение работает в статическом объ< памяти. Объекты явно уничтожить невозможно, это забота внутрен го механизма сборки мусора. Для повышения эффективности вып нения Sc/zeme-программ в ограниченном пространстве ОЗУ в интерп таторе реализованы экономные алгоритмы поддержки рекурсивв вычислений.


Eiffel

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

В языке Eiffel (www.eiffel.com) сделана попытка совместить процессы г ектирования и разработки программного обеспечения. С теоретичес точки зрения этот язык позволяет выявлять на этапе компиляции неточности в исходных текстах, способные привести к ошибкам ] мени выполнения.

В Eiffel -программах обязательны к активному и систематическому применению средства контроля промежуточных значений и типов обрабатываемых данных. В ряде языков это выполняется с помощью простого макроса или процедуры assert, вызывающей прерывание, если результат проверки неудовлетворителен. Но подобный подход требует как минимум программистской дисциплины и дополнительных усилий по подготовке assert -проверок. А для языка Eiffel такие средств это его неотъемлемая часть. К тому же они расширены так называемой разработкой по контракту. Для каждой функции и метода необходимо определить их контракт по отношению к вызывающей функции: требования к типам и диапазонам параметров, обрабатываемых в теле функции, переменных и возвращаемых значений. На основе контрактов можно, в частности, автоматически генерировать документацию к текстам Eiffel - программ.

Встроенная система сборки мусора освобождает программиста от необходимости явного удаления объектов из памяти.

К недостаткам языка Eiffel можно отнести сложность реализации теоретической модели языка — на этапе компиляции обычно выявляются не все ошибки. В основном это связано со сложностью отслеживания корректности преобразования типов при множественном наследова­нии.

Бесплатный компилятор SmartEiffel для Windows можно найти по адресу elj.sourceforge.net. Вопросам стандартизации языка посвящен сайт www.eiffel-nice.org.


Mercury

Этот логический функционально-декларативный язык со строгой типи­зацией создавался для реализации крупных программных проектов на основе декларативных технологий. При проектировании языка Mercury (www.cs.mu.oz.au/research/mercury/) были учтены недостатки дру­гих популярных декларативных языков типа Пролога. К ним относятся логические ошибки и противоречия в пользовательских базах знаний, которые не удается выловить компиляторами, а также невысокая ско­рость исполнения готового приложения.

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

Компилятор Mercury сам написан на языке Mercury. Он выполняет детальную интеллектуальную проверку исходного текста и содержи­мого логической базы. На Прологе такие проверки реализовать невоз­можно.

Тексты Мегсигу-программ более наглядны, чем тексты программ, написанных на Прологе, а готовые Мегсигг/-приложения работают в два раза быстрее самой эффективной на сегодня реализации Пролога (Aquarius Prolog) и в десятки раз быстрее других реализаций. При этом с ростом объема Пролог-программы (базы знаний) скорость ее выпол­нения (логического вывода) снижается нелинейно: чем больше про­грамма, тем медленнее она работает. Для Mercury эта зависимость линейна.


Python

Этот объектный язык с очень простым синтаксисом позволяет дина­мически создавать сложные типы данных и выполнять динамическое приведение типов. Содержит развитую систему прерываний (с ее помо­щью иногда имитируется работа не включенного в язык оператора goto) и большое число стандартных библиотек. Язык Python обеспечивает интерфейсы ко многим внешним системам и С-библиотекам.

Язык Python (www.python.org) часто применяют в качестве языка сцена­риев для написания приложений Интернета, так как он включает мно­жество средств, поддерживающих сокеты и протоколы Интернета (HTTP, почтовые и другие). Сценарии, написанные на этом языке, без изменений работают на платформах MS-DOS, Windows, Unix/Linux, Macintosh, OS/2. Язык Python хорошо подходит для обработки тек­стов, организации и синхронизации параллельных процессов, интегра­ции приложений в гетерогенных сетях. Рг/£/шп-программы либо интер­претируются, либо компилируются в промежуточный байт-код, который, в свою очередь, можно конвертировать в С-код или постав­лять в виде законченного приложения вместе с интерпретатором. Без интерпретатора распространять Pyi/юп-приложение довольно сложно. Необходимо поддерживать гибкие возможности языка по работе с дина­мическими типами и функцию исполнения Рг/£/юп-выражений, задан­ных в виде внешней строки (такую строку можно конструировать «на лету»). Поэтому в комплект поставки языка Python обычно входит биб­лиотека времени выполнения, позволяющая вызывать Python-upo-граммы из внешних приложений, вычислять выражения языка Python и обращаться к методам Рг//гоп-объектов.

Поклонникам функциональных языков Python предлагает возмож­ность записи программы в лямбда-форме.


Standard ML

Это абстрактный функциональный язык, не привязанный к машин­ным характеристикам. Программисту не надо заботиться об управле­нии памятью и проблемах с висячими ссылками или знать внутренние способы представления данных. В языке SML (research.microsoft.com/ Projects/SML.NET/index.php) реализованы технологии сопоставления с образ­цом, а также допускаются рекурсивные определения структур данных. Этот язык используется в основном для разработки компиляторов и интерпретаторов, систем анализа и верификации кода, доказательства теорем и других подобных задач.

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

В языке Oz (www.mozart-oz.org) объединены практически все основные программные концепции: от обычной императивной (командной) и объектной до функциональной и логической. Может показаться, что такие технологии, как интеллектуальный поиск в базе знаний, сопо­ставление с образцом и возможность распределенной работы по вирту­альным асинхронным каналам, свалены в этом языке в одну кучу. На самом же деле после практического изучения можно достаточно быстро оценить стройность, элегантность и продуманность этого языка.

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

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


Java

Из принципиальных (одна из целей .NET — противодействие системе Java) и юридических (судебные разбирательства с компанией Sun) соображений компания Microsoft не собирается своими силами поддер­живать современные версии Java в среде .NET, но можно не сомневаться, что этим займутся другие фирмы. Пока подобной работой занимается фирма Rational Software (www.rational.com).

Для большинства из рассмотренных языков на указанных сайтах до­ступны свободно распространяемые (пока что несовместимые с .NET) компиляторы и интерпретаторы для разных платформ, в том числе и для Windows.


Заключение

Мы рассмотрели ряд как достаточно известных, так и забытых (заслу­женно или, чаще, незаслуженно) языков программирования. Вряд ли им суждено второе рождение — гораздо вероятнее появление новых более совершенных языков, ориентированных на новые аппаратные архитектуры. Какими будут эти новые, шестые, седьмые, -надцатые поколения? Когда-нибудь мы об этом узнаем. Одно несомненно: в каче­стве базовых концепций в них будут всегда использоваться описанные в книге идеи, которые были разработаны в середине и конце XX века.