С.Бобровский, О Фортране и других языках программирования (1012867), страница 7
Текст из файла (страница 7)
Сценарные языки применяются для самых разных целей, однако чаще всего эти цели укладываются в стандартный набор программистских задач: реализация набора функциональных возможностей и создание удобного пользовательского интерфейса. Однако с приходом в Интернет большого числа некомпьютерных компаний и пользователей-неспециалистов появился совсем другой спектр интересов. Возникла настоятельная потребность расширения текстовых ресурсов Сети трехмерными мультимедийными возможностями. Одним из наиболее интересных вариантов удовлетворения этой потребности оказался язык VRML.
В последнее время апологетами Повсеместно Протянутой Паутины предпринимаются все более решительные действия по дальнейшей «виртуализации» этой сети. Как грибы, вырастают новые технологии создания полноценных виртуальных пространств, и на их основе создаются новые продукты, призванные как можно точнее моделировать окружающий нас мир.
Проблема перехода из плоскостной модели статичных WWW-страничек в третье измерение — в трехмерный и полностью интерактивный виртуальный мир, стоит сегодня перед Интернетом, пожалуй, на одном из первых мест. В начале 1994 года был разработан язык VRML (Virtual Reality Modeling Language), предназначенный специально для организации виртуального трехмерного интерфейса в WWW. Его развитием занимается VRML-консорциум www.vrml.org. Этот язык позволял описывать в текстовом виде трехмерные сцены, освещение и тени, текстуры (покрытия объектов) и, соответственно, создавать свои миры, путешествовать по ним, осматривать их со всех сторон, вращать в любых направлениях, масштабировать, регулировать освещение и так далее. Основным преимуществом этого языка было компактное описание сцен: требовалось передавать по сети не многомегабайтные мультимедийные ролики, а небольшие текстовые странички объемом в несколько килобайт. Задача визуализации возлагалась на браузер.
Однако первая версия VRML по сути ничем не отличалась от языка HTML для описания обычных двумерных страничек, с той лишь разницей, что с помощью VRML 1.0 создавались трехмерные пространства. В странички VRML (со стандартным расширением .WRL) можно было вставлять ссылки на другие трехмерные объекты (просто указывать URL-aдpec) или на страницы HTML. Однако, несмотря на то, что все объекты этих миров можно было обходить, рассматривать и «трогать» мышкой, тем не менее, не то что контакта с пользователем, даже элементарных процессов движения отдельных объектов с помощью VRML 1.0 сымитировать не получалось. В принципе, есть возможность немного «оживить» такие миры с помощью сценариев CGI, но это требует больших усилий профессиональных программистов. Кроме того, первая версия языка позволяла оперировать со слишком ограниченным набором трехмерных объектов, таких как куб, конус, цилиндр, сфера и сконструированные из полигонов объекты, которые можно было покрывать различными материалами. Фактически VRML — это типичный декларативный язык, не содержащий никаких команд, и состоящий только из описаний сцен.
За первой версией языка появилась следующая (VRML 1.1), но она сразу же «умерла», так и не получив распространения. В нее была добавлена поддержка звукового сопровождения и простенькой анимации, но этого жаждущим зрелищ Гражданам Земли оказалось мало.
Наконец в 1996 году была разработана принципиально новая версия VRML 2.O. В ней появилась, в частности, полноценная поддержка мультимедиа, а самое главное, были добавлены элементы интерактивности. И сами описания сцен стали более походить на описания объектов в привычном стиле объектно-ориентированного программирования — со своими событиями и методами, хотя сам язык по-прежнему остался декларативным. Правда, по своей структуре он стал куда более объектно-ориентированным, в частности, в нем появились понятия прототипа, аналога базового класса или шаблона из C++.
Реакции объектов (в терминологии VRML — узлов) на события виртуального мира реализуются путем описания маршрутов событий (которые могут быть различных типов) между узлами. Сами же события генерируются так называемыми сенсорами, которые срабатывают, например, при щелчке пользователя мышью, при виртуальном контакте с узлом, по таймеру и т. п. Элемент времени, кстати, несет значительно большую смысловую нагрузку при создании виртуальных миров, чем, допустим, событие WM_TIMER для программирующих в Windows. Дело в том, что теперь с помощью VRML появилась возможность описывать анимированные сцены, в которых узлы (все-таки привычнее говорить «объекты», но ничего не поделаешь — стандартная терминология) теперь могут самостоятельно «шевелиться». Вы можете создать трехмерный образ человека с помощью иерархии подчиненных узлов, как это делается, например, в 3D Studio, и в зависимости от количества времени, прошедшего с момента запуска программы, заставить определенные узлы перемещаться в заданной последовательности, имитируя хождение по комнатам и другие действия.
Более того, в языке VRML 2.0 введена поддержка исполнения сценариев, написанных на других языках программирования, например, на Java или VBScript. Это позволяет наполнить виртуальные миры функциональностью, действием, и реализовать сценарии, которые возможны только при использовании обычных процедурных языков программирования. Продумана даже возможная несовместимость браузеров — введены механизмы разрешения различных противоречий.
Последняя версия VRML 2.52 поддерживает множество открытых стандартов и технологий, в том числе MPEG-4 и Java3D.
Классика жанра
В заключение рассмотрим экзотические языки программирования, которые хотя и были созданы десятки лет назад, но остаются вне конкуренции при решении множества задач, прежде всего из области искусственного интеллекта и обработки знаний. На базе некоторых из них (например, на Прологе) японская индустрия строит всю свою информационную стратегию.
Лисп: история одного преступления в отношении языка программирования
Не секрет, что в России наиболее популярными языками программирования являются С, C++ и Паскаль. И нередко ассемблер. Это довольно
сильно отличает нашу страну от остального мира, где программы для Windows часто пишут на языке Visual Basic.
Но существует еще очень много других языков, как известных, так и незаслуженно забытых. Причем для ряда задач их использование дает •весьма ощутимые преимущества, позволяя отвлечься от семантики языка и деталей реализации и полностью сконцентрироваться на поставленной задаче. При этом обеспечиваются не только высокое качество, надежность и эффективность получаемых программ, но и наглядность и быстрота разработки.
Одним из таких языков является LISP (LISt Processing — обработка списков). Его придумал в 1956 году профессор Массачусетского технологического института Джон Маккарти для занятий со студенческой научной группой. Язык предназначался для анализа и разбора английских фраз в рамках проекта по искусственному интеллекту «Принимающий советы». Сначала это были версии для первых компьютеров IBM и DEC. Более или менее законченный вариант — LISP 1.5 — появился в 1965 году.
Лисп, как следует из его названия, предназначен для обработки списков, состоящих из атомов — абстрактных элементов, которые представляют собой формально неограниченные по длине цепочки символов. Они могут трактоваться как строки в более привычном понимании, числа или представлять собой некие логические структуры с вложенными на неограниченную глубину подсписками в виде иерархических деревьев. Например, любая фраза является для Лисп типичным списком. По требованиям языка список должен быть заключен в скобки. Для обработки списков используется функциональная модель, базирующаяся на теории лямбда-исчисления Черча. Фактически, программа на Лиспе представляет собой набор лямбда-функций, при этом работа со списками осуществляется с помощью базового набора примитивов типа CAR/CDR (взять первый элемент списка, который сам может быть списком/получить список без первого элемента). Таких примитивов в минимальном наборе всего 13 штук. С их помощью и, главное, благодаря рекурсивной системе обработки информации, Лисп позволяет очень компактно описывать функции, для реализации которых на других языках программирования потребовались бы сотни и тысячи строчек кода.
Как оказалось, на Лиспе очень удачно описываются и программируются задачи, в которых требуется обработка абстрактной структурной информации. Это такие задачи, как автоматическое доказательство теорем, понимание естественного языка и окружающего мира, логические исчисления, написание компиляторов. Этот язык оказался столь мощным, что сегодня значительное число интеллектуальных систем четвертого поколения используют его диалекты в качестве основного языка разработки.
После первых впечатляющих успехов актуальной стала задача эффективной реализации языка. Сначала все Лисп-системы были интерпретируемыми, что позволяло достичь определенной гибкости, но сильно замедляло сам процесс работы программы. Автор Лиспа опубликовал в 1965 году свою книгу «LISP 1.5 Programmer's Manual », в которой описал не только язык, но и структуру так называемой виртуальной Лисп-машины, некоей абстрактной схемы функционирования Лисп-системы, а также формальное определение структуры компилятора и интерпретатора. Этот труд стал образцом классического описания языка программирования и его окружения, и на него ссылаются вплоть до сегодняшнего дня. Удивительная ясность и простота Лиспа в сочетании с его мощностью и оригинальной идеологией сделала его не просто языком программирования, а своего рода способом формального описания алгоритмов. Кроме того, многие идеи, заложенные в языке Лисп (например, «сборка мусора», или оптимизация памяти, освобождение ее от «висячих ссылок»), актуальны и по сей день.
Примерно к этому времени относится и первое совершенное в отношении Лиспа преступление, лишившее его основного преимущества перед другими языками — прозрачности структуры программы. Кто-то, я не знаю точно, может быть, это был сам Великий (Джон Маккарти), ввел в программу примитив PROG, позволяющий писать операторы последовательно, один за другим, как в Фортране или Алголе, и, что самое страшное, добавил оператор GO (goto), без которого примитив PROG, очевидно, был лишен всякого смысла. С этого момента развитие Лиспа пошло под откос.
В начале 70-х годов Лисп-машина была реализована в ряде компьютеров таких фирм, как Xerox и Texas Instruments. Для повышения эффективности функционирования она была «воплощена в железе» (как сказали бы сейчас, «система была зашита в ПЗУ»).
В конце 70-х годов бурно расцвела теория искусственного интеллекта и стали актуальными средства для реализации ее идей. Язык Лисп пережил второе рождение. Было создано множество вариантов языка практически для всех платформ и операционных систем. Именно тогда появились два диалекта, которые стали основоположниками сегодняшних стандартов. Это, прежде всего, Scheme Lisp, который точнее всего унаследовал чистоту оригинальной идеологии своего родоначальника. Пройдя глубокую математическую переработку, эта версия, по-прежнему ограничиваясь небольшим числом базовых примитивов (полное
описание языка занимает всего 50 страниц), позволила сосредоточиться на ключевых деталях при решении ряда математических задач, требующих формального описательного аппарата. Например, оригинальной и многообещающей оказалась идея engines — параллельных процессов. Поэтому в большинстве научных групп используется именно эта версия Лиспа.
Второй диалект, Common Lisp (CL), наоборот, отличался очень большой библиотекой разнообразных функций, чуть ли не превосходящих по количеству аналогичные библиотеки Фортрана(!). Его, конечно, значительно удобнее использовать для реализации конкретных проектов, требующих, помимо простого анализа списочных структур, еще и больших объемов вычислительной работы и организации хорошего графического интерфейса. Описание этого диалекта занимает уже около 1300 страниц, в него введено довольно много возможностей обычных процедурных языков типа Си, например, строгая типизация, которая в оригинальном Лиспе отсутствовала вообще.
Язык CL сильно отличается от языка LISP 1.5 60-х годов. Хотя он и включает в себя все базовые возможности, в реальных проектах обычно используется не рекурсивная, а линейная структура программы, более соответствующая человеческой психологии и более близкая к привычным языкам. Однако из-за отказа от оригинальной идеологии, требовавшей очень четко формализовать задачу в почти математических терминах, сразу возникли проблемы, характерные для обычных задач проектирования и реализации крупных проектов.
После активного распространения Unix в 80-х годах получила широкое распространение версия Portable Standard Lisp, реализованная на большинстве платформ, и, наконец, Common Lisp стал фактическим стандартом. А 8 декабря 1994 года в Американском институте национальных стандартов было зарегистрировано официальное описание этого языка ANSI X3.226:1994 (X3J13), которое действует и сегодня.
Всплеск интереса к объектно-ориентированному программированию не обошел и Лисп. В него были добавлены понятия объекта, метода, наследования и вскоре появился объектный стандарт Common Lisp Object System (CLOS). При этом изобретатели стандарта не понимали или не хотели понять, что такое искусственное расширение языка, не соответствующее его идеологии, лишь усложняет Лисп и лишает его как оригинальной ясности, так и эффективности.
Современные реализации Лиспа представляют собой большие программные комплексы, близкие к СА5£-системам. Несмотря на то что язык Лисп был придуман около 40 лет назад, он относится скорее к 4GL-классу.
Манипулирование объектами на абстрактном уровне, хотя и требует подчас не визуального, а конкретного кодирования, делает ненужным программирование рутинных операций, а наличие обширных библиотек, обеспечивающих быструю реализацию множества примитивов, позволяет получить более эффективный и надежный код, чем при ручном программировании аналогичных задач на C++. Например, программирование задач автоматического интеллектуального перевода на С может показаться совершенно абсурдным. (Интересно, а на чем пишут свои «переводчики» наши программисты?) Кстати, имеется большое число «компиляторов», переводящих текст задачи на Лиспе в код на языке С.