С.Бобровский, О Фортране и других языках программирования (1012867), страница 9
Текст из файла (страница 9)
Но уже зарождается новое поколение языков, которые определят будущее развитие компьютерной индустрии. Это будут усовершенствованные версии Java, предназначенные не только для Интернета; интерактивные языки виртуального моделирования типа (A)VRML; встроенные языки различных систем работы с хранилищами данных (например, SQLWindows); языки быстрой разработки приложений, интегрированные с СА5.Е-системами; различные диалекты декларативных языков на основе Пролога. Для задач, требующих интенсивных вычислений, можно будет использовать параллельные версии подобных языков, благо появление первых недорогих мультипроцессорных персональных компьютеров (с 2-4 процессорами) не за горами. С их массовым распространением на рынке быстро появятся и относительно дешевые параллельные системы программирования. Сначала это будет, конечно, апробированный на суперкомпьютерах Фортран и, возможно, Модула или Ада, а затем появятся реализации и других языков. И не вызывает сомнения, что среди этой «новой волны» одно из наиболее достойных мест займет язык Smalltalk.
Последние новости об этом языке можно найти на сайте www.smalltalk.org.
Форт еще жив
Я долго думал, к какому поколению отнести этот язык. Его вполне можно причислить не то, что к третьему, а даже ко второму поколению, так как Форт допускает низкоуровневое кодирование. Но, припомнив историю С, сразу понял, что это, конечно, язык четвертого поколения. Форт создавался для тех же целей, что и С, но по потенциальной мощности вполне сопоставим с языками типа Smalltalk.
Этот удивительный язык появился на свет в начале 70-х годов благодаря стараниям Чарльза Мура. Он стал своего рода ответом на потребности программистов в языке, с одной стороны, обладающим мощными и гибкими выразительными средствами, а с другой — пригодным для эффективной реализации на компьютерах с небольшими объемами памяти. А самое главное, язык обязан был выдавать очень быстрый и компактный код. То есть была нужна подходящая замена ассемблеру, так как из-за медленных компьютеров с ограниченными ресурсами использовать существовавшие в то время языки программирования для ряда задач не представлялось возможным.
Однако ветвь Форта для большинства проектов оказалась тупиковой. Появившийся примерно в то же время язык С, который создавался с аналогичными целями, быстро завоевал всемирное признание. Про Форт многие программисты, решающие «глобальные» задачи, быстро забыли. Почему же это произошло?
Исходно Форт задумывался как цельная система, содержащая интерпретатор, компилятор, отладчик и редактор. Сегодня этим никого не удивишь, но для того времени это было весьма оригинально и удобно. Форт-система была сама написана на Форте, то есть являлась полностью переносимой и не зависящей от оборудования.
Но самое интересное, что Форт ограничивался очень небольшим набором синтаксических конструкций. Реализовать его в базовом виде можно очень быстро, и поэтому Форт-система без проблем была реализована на множестве платформ. Это связано не с числом конструкций языка, а с самой идеологией Форта, на которой надо остановиться немного поподробнее.
Форт работает с памятью только в виде виртуального стека. Все операции в нем осуществляются над данными, хранящимися на вершине стека, и записываются последовательно — в обратной польской форме. Например, при выполнении двух команд + / сначала произойдет сложение двух чисел с вершины стека. Сами числа будут удалены оттуда, а на их место будет положена сумма. Затем произойдет деление этой суммы на следующее число в стеке. То есть если в стеке были записаны числа 3 5 8, то эти две команды выполнят действие (3+5)/8. Управляющие структуры, которых довольно мало: условный оператор и оператор цикла, — также основаны на анализе данных, хранящихся на вершине стека. Например, проверяется, лежат ли там логические значения ИСТИНА или ЛОЖЬ.
Все! На этом описание языка почти заканчивается. Конечно, есть еще переменные и возможность работы с адресами. Однако без наличия структур, позволяющих вычленять управляющие последовательности команд в отдельные модули, например в подпрограммы, язык программирования существовать не может. Форт содержит оригинальные средства, позволяющие гибко и наглядно описывать структуру решаемой задачи.
Любой последовательности команд можно поставить в соответствие «слово» — обычный идентификатор. Например, вышеприведенные команды можно «обозвать» СЛОЖ_ДЕЛ с помощью такой строки:
: СЛОЖ_ДЕЛ + / ;
Слово СЛОЖ_ДЕЛ записывается в специальный словарь Форт-системы и становится доступным для дальнейшего использования наряду с обычными командами. Для достижения большей эффективности это «слово» может быть откомпилировано. Так можно легко описывать довольно сложные процессы вычислений, группировать их в слова и затем работать уже только с ними, зная, какие действия со стеком они выполняют. Например, управляющие команды для процессора микроволновой печи можно задать в таком виде:
температура 200 объект курица жарить
Форт-системы обычно очень компактны. Ядро занимает 10-15 Кбайт (!), а получающийся код по объему и эффективности не уступает ассемблеру.
Но есть, конечно, у Форта и недостатки, причем они оказались настолько существенными, что чаша весов при выборе языка, способного заменить ассемблер, быстро склонилась в сторону С. Основная проблема заключается в сложности восприятия текста, записанного в обратной польской форме, и, соответственно, в трудоемкой отладке. Чем дальше язык отходит от привычной для человека формы описания алгоритма, тем тяжелее с ним работать и тем больше ошибок возникает на этапе разработки. Язык Форт позволяет создавать очень эффективные программы, но с появлением быстродействующих компьютеров скорость работы и тем более небольшие объемы памяти, занимаемые программой, практически перестали играть важную роль. На первый план вышли языки, обладающие максимально выразительными средствами.
Сегодня Форт используется преимущественно для программирования микропроцессоров, где его качества проявляются наиболее выгодно. Такая ниша довольно объемна, и Форт уверенно чувствует себя в ней. Этот факт, в частности, подтверждают несколько стандартов языка, обновляемых с завидной регулярностью. Скорость обновления диктуется самой идеологией Форт-системы, как переносимого и не зависящего от платформы продукта. Американский национальный стандарт описывает версию ANS Forth, такие компании, как IBM, HP, Sun, Apple и другие, поддерживают стандарт IEEE 1275 от 1994 года.
Форт не только не сдается, но даже пытается бороться со своим главным конкурентом — языком С. Существуют специальные трансляторы из С в Форт, причем их создатели утверждают, что код, преобразованный из С в Форт, для большинства вычислительных задач работает значительно быстрее! Имеются, соответственно, и обратные трансляторы, из Форта в С, но об эффективности подобных преобразований их разработчики предпочитают не распространяться.
Как это бывает практически со всеми необъектными языками, родившимися достаточно давно, рано или поздно в них пытаются добавить понятие объекта. Но если в одни языки это понятие вписывается органично, как, например, в Аду, то в Форте эти попытки привели к потере гибкости и не получили большого распространения.
Бесплатных версий Форта в мире довольно много. Информацию о них можно найти на сайте www.forth.org. Из коммерческих версий Форта можно выделить кросс-платформный вариант SwiftForth (www.forth.com). Вообще, множество версий языка Форт практически для всех мыслимых платформ объясняется максимальной простотой языка. Вы можете найти Форт для Windows и OS/2, для компьютеров Amiga и Macintosh, для систем Sun и так далее. И стоят они недорого — от 100 до 300 долларов.
Для ряда задач, где требуется действительно быстрая переработка и анализ числовой информации, Форт пока незаменим, так как относительная простота языка в сочетании с его гибкостью и широкой распространенностью позволяют решать эти задачи очень эффективно, не прибегая к ассемблеру.
Пропел ли Пролог свою «лебединую песню»?
Пролог по праву считается одним из наиболее ярких языков программирования. Заложенная в него концепция логического программирования с годами только набирает популярность.
В отличие от подавляющего большинства других языков Пролог (Prolog) обычно рассматривается в одном контексте с понятием «логическое программирование». Сторонники этого направления считают. Что человек должен не задавать компьютеру последовательность команд на некоем ориентированном на компьютер языке, а описывать саму задачу в абстрактных логических терминах, не оперирующих определениями «байт» или «указатель». Иными словами, надо создать своего рода модель анализируемой проблемы и попытаться получить положительные или отрицательные результаты этого анализа.
У многих людей, знакомых с логическим программированием, обычно возникают ассоциации с японским проектом компьютеров пятого поколения, все программное обеспечение которых создавалось на базе Пролога. Некоторые эксперты считают, что этот проект фактически провалился, и причиной этому послужили некоторые присущие Прологу функциональные ограничения (хотя это не так — см. главу «Как японцы компьютерный мир осчастливили»).
Строго говоря, Пролог не является языком программирования в чистом виде. С одной стороны, это оболочка экспертной системы, с другой — интеллектуальная база данных, и, что самое важное, не реляционная. Математическая модель, лежащая в основе Пролога, довольно сложна, и по мощности системы формирования запросов к базе с этим языком не сравнится ни одна из коммерческих СУБД.
Фактически Пролог является не процедурным, а декларативным языком. Человек лишь описывает структуру задачи, а «внутренний мотор» Пролога сам ищет решение. Более того, в языке вообще не существует понятия последовательности команд — она скрыта в математической модели языка. Хотя, конечно, небольшой список «линейных» операторов типа repeat присутствует, но он ограничен возможностями использования лишь для конкретных случаев.
Математическая модель Пролога основана на теории исчисления предикатов, в частности, на процедурной интерпретации Хорновых дизъюнктов (содержащих не более одного заключения) Роберта Ковальского из Эдинбурга. Ее в алгоритмическом, машинно-ориентированном виде, выразил коллега Ковальского Маартен ван Эмден. Надо сказать, что работы этих ученых из-за большой сложности их практической реализации на компьютерах (по тем временам) подвергались большой критике со стороны американских специалистов по искусственному интеллекту.
Автор языка Пролог Алан Колмероэ начал работу над полноценной компьютерной реализацией трудов Ковальского в 1972 году во французском университете Марсель-Экс. Он составил алгоритм формальной интерпретации процесса логического вывода и разработал систему автоматического доказательства теорем, которая была написана на Фортране. Она-то и послужила прообразом Пролога. Название языка произошло от Programmation en Logique — ЛОГическое Программирование. Говорят, что придумала это название жена Алана. В первое время, в начале 70-х годов, Пролог был не очень популярен. Как и Лисп, он пребывал в забвении, вызванном отсутствием хороших реализаций. Но вскоре появились первые компиляторы с этого языка. В частности, прекрасная реализация Дэвида Уоррена для компьютера DEC-W в Эдинбурге стала своего рода стандартом, сохранившимся до сегодняшнего дня. Эффективность этой версии заставила специалистов по искусственному интеллекту по-новому взглянуть на Пролог. В некоторых приложениях, типичных для Лиспа, таких как обработка списков, Пролог уже не уступал своему конкуренту. В дальнейшем это стимулировало ряд специалистов по логическому программированию к переходу на использование Пролога.
В качестве типовых данных Пролог использует элементарные единицы данных, так называемые атомы: строки символов и числа. Из атомов составляются списки и бинарные деревья. Сама «программа» строится как последовательность фактов и правил, а затем формулируется утверждение, которое Пролог будет пытаться доказать с помощью введенных правил.
Таким способом можно описывать очень сложные проблемы, которые система Пролог будет решать автоматически. Для этого используется метод сопоставления и рекурсивного поиска. Вообще рекурсия играет в Прологе не меньшую роль, чем в Лиспе, хотя и носит декларативный характер.
Сразу после появления эдинбургской версии Пролога было успешно осуществлено несколько проектов, которые ранее казались очень сложными для реализации. Появилась возможность создания интеллектуальных нереляционных баз знаний с иерархической структурой на основе стандартного механизма с гибкой организацией очень сложных запросов. Были написаны эффективные программы для решения переборных задач, в частности из области молекулярной биологии и проектирования СБИС, где требовалось учитывать либо сложные внутренние структуры, либо большое число правил, описывающих организацию объекта. Хорошо зарекомендовал себя Пролог в качестве экспертной оболочки. А задачи грамматического разбора прямо-таки просились быть решенными на Прологе. Что весьма характерно, первый высокопроизводительный компилятор этого языка (эдинбургская версия) был написан на самом Прологе! И немудрено, ведь все формальные синтаксические описания грамматик в форме Бэкуса прекрасно записываются в терминах Пролога.
Но в силу своей специфичности и сильной ориентированности на встроенные алгоритмы поиска доказательств Прологу не суждено было воплотиться в конкретном стандарте, который получил бы массовое признание. На сегодня имеется стандарт ISO/IEC 13211-1:1995, но он поддерживается далеко не всеми коммерческими системами, имеющими различные принципы реализации и цели, для которых планируется использовать эти системы. Фактически первым и единственным стандартом осталась версия языка, созданная в Эдинбурге для PDP в 70-е годы! И хотя ее поддерживают не все сегодняшние системы, их разработчики обычно прилагают к своим продуктам препроцессор, переводящий программу данного диалекта к эдинбургскому виду.
Долгое время среди разработчиков языка шла напряженная борьба между сторонниками оригинальной семантики Пролога и специалистами, стремившимися пожертвовать ясной структурой языка ради повышения эффективности реализации. В частности, стала играть роль последовательность правил в базе данных. Дело в том, что для быстрого получения ответа удобно начинать с использования, например, самых простых или самых эффективных с точки зрения человека правил.