Языки программирования. Прошлое и будущее. С.Бобровский (1012869), страница 5
Текст из файла (страница 5)
Для создателей экономических продуктов уже давно выпускаются простые, дешевые и эффективные языки, не только PL/В. Использовать дружелюбные (а не «человеконенавистнические») системы программирования — в интересах и производителей, и потребителей. Существенно сокращаются сроки разработки, повышается надежность программного обеспечения, облегчаются процессы модификации и совершенствования приложений.
Конечно, вряд ли язык PL/B может стать реальным конкурентом уже существующим и массово распространенным коммерческим версиям компиляторов C++. Однако он имеет неплохую сферу применения в качестве языка описания сценариев, встраиваемого в корпоративные и финансовые системы.
Языки сценариев («скрипт-языки»)
Скрипт не забыт
Языки программирования принято делить на пять поколений. Однако в эту классификацию не укладывается большая группа языков описания сценариев или так называемых скрипт-языков. Программы на скрипт-языках обычно вставляются в формате исходных текстов в приложения для их гибкой настройки, или, наоборот, служат мощным средством для объединения программного обеспечения, написанного на других языках. Но большинство разработчиков считают скрипт-языки только вспомогательным инструментом. Например, язык JavaScript обычно воспринимается как урезанный вариант Java и используется в основном для создания бегущих строчек в браузере.
Программисты иногда даже возмущаются отсутствием в JavaScript типизации, что говорит о полном непонимании предназначения этого языка. Ведь JavaScript обладает уникальными возможностями по интеграции объектов Windows (например, для автоматического управления браузером Internet Explorer, который является OLE-объектом). При работе со сценариями JavaScript использовать переменные конкретных типов неудобно или невозможно.
В своей классической статье «Сценарии — высокоуровневое программирование 21 века» Джон Аустираут, создатель скрипт-языка Tcl/Tk, назвал скрипт-языки языками системной интеграции, потому что они ориентированы на работу не с элементарными данными, а с объектами операционной среды. Это позволяет эффективно использовать возможности операционной системы, интегрируя ее ресурсы с помощью языков, которые на высоком уровне, без написания тысяч строк кода, двумя-тремя командами позволяют легко манипулировать системными объектами и «склеивать» их в одно целое. По мнению Аустираута, принципы объектно-ориентированного программирования не завоевали должной популярности только потому, что их пытаются реализовывать на уровне примитивных операторов языков третьего поколения (3GL) типа C++, что приводит к громоздкому и неуклюжему коду, а не на уровне свойств и методов самих объектов. В отличие от 3GL-языков, в современных скрипт-языках парадигма объектно-ориентированного программирования воплощена наиболее полно. Она присутствовала даже в старых скрипт-языках типа командных языков MS-DOS или Unix/Linux, которые позволяют довольно эффективно работать с объектами операционной системы: файлами и программами.
Практически все скрипт-языки относятся к интерпретируемым (в последнее время для ускорения интерпретации все более активно используется компиляция в промежуточный код). Это связано с тем, что для работы с объектами операционной системы язык должен обладать высокой гибкостью, а процесс выполнения системных программ часто зависит от многих факторов, которые трудно предусмотреть на этапе компиляции. Для повышения гибкости в скрипт-языках обычно отсутствует строгая типизация. Основной элемент данных в этих языках — строка, которую при работе с двоичными объектами нередко надо интерпретировать как последовательность байтов. Кроме того, при настройке крупной системы постоянно возникает нужда в быстром создании или модификации небольших программ, для чего удобнее использовать интерпретаторы. Конечно, скрипт-языки проигрывают компилируемым SGL-языкам в производительности (оператор С транслируется в среднем в 3-7 машинных команд, а для выполнения одного оператора скрипт-языка требуются сотни тысяч команд), но позволяют разрабатывать программное обеспечение в десятки раз быстрее. К тому же они легче в изучении, что очень важно при подготовке персонала для сопровождения операционной системы и компьютерных сетей.
Perl — язык альтруистов
Уже давно подтверждено практикой, что наиболее популярные языки программирования создаются не рабочими группами, а специалистами-одиночками. Это, впрочем, касается всех сфер деятельности, которые можно трактовать как искусство, а не как ремесло. Так было, в частности, с языками С (Д. Ритчи) и Паскалем (Н. Вирт). В 80-е годы Ларри Уолл разработал язык Perl (Practical Extraction and Report Language). Первоначально Perl задумывался как средство эффективной обработки больших текстовых файлов, генерации текстовых отчетов и управления задачами. Одна из первых реализаций интерпретатора Perl прекрасно проявила себя в среде Unix/Linux, где Perl использовался в качестве командного языка. А сегодня вообще трудно представить Unix/Linux без Perl. Для этого языка написано немало компиляторов, которые удобны при создании многократно используемых утилит. Но для большинства задач по-прежнему применяются интерпретаторы, которые очень просты и позволяют использовать всю мощь операционной среды, под управлением которой работают. За это, конечно, приходится расплачиваться производительностью.
Язык Perl во многом основан на языке С и имеет схожий, но более компактный, синтаксис. В частности, вообще отсутствует типизация. В язык добавлен ряд новых функциональных возможностей, например, хэш- или ассоциативные массивы, мощные операторы THnaforeach и т. д. Но язык Perl имеет и качественные отличия от С. Так, в нем введено понятие динамического массива и списка. При сложной обработке текстов не обойтись и без операций сопоставления с образцом, которые реализованы в языке весьма элегантно.
По мощности Perl значительно превосходит С. Кроме того, в язык в качестве стандартных введено много часто используемых функций работы со строками, массивами, всевозможные средства преобразования данных, управления процессами, работы с системной информацией и других. Виртуальная PerZ-машина позволяет работать с произвольными по величине данными, а интерпретатор языка оптимизирован для быстрого сканирования текста. В него также встроена поддержка более безопасного выполнения программ в сравнении с С. Например, выход указателя за границы массива не приведет к порче памяти. Глубина рекурсии, без которой обрабатывать тексты и списки неудобно, не ограничена.
При работе с большими массивами текстовых строк, которые требуются, например, при считывании файлов в буфер, используются хэш-массивы. Они позволяют очень быстро сканировать объемные тексты и эффективно осуществлять операции сопоставления с образцом, для чего используются специальные эвристические алгоритмы. Встроены в Perl разнообразные и понятные любому программисту функции поддержки работы в сети, как локальной, так и глобальной.
Благодаря наличию в языке Perl мощных встроенных средств обработки данных этот язык легко осваивают начинающие пользователи. Если человек знает С, то перейти на Perl ему не составит никакого труда. С другой стороны, в погоне за мощностью язык Perl усугубил и без того не слишком наглядный процесс программирования на С. Иногда сложно понять, что делает программа, уместившаяся в трех строчках. С учетом этих особенностей язык Perl редко используют для коллективной разработки больших программ, да он для этого и не предназначался.
Скорее, этот язык подходит для создания всевозможных утилит и особенно Web-сценариев. Популярность этого языка резко пошла вверх, когда сеть Интернет стала все больше восприниматься как Всемирная Паутина. Текстовый язык HTML идеально подходил для анализа и генерации Wife-страниц с помощью сценариев Perl. Эти особенности языка в сочетании с поддержкой передачи данных в Сети через кокеты и возможностью обращения к функциям операционной системы сделали этот язык одним из самых популярных языков программирования для Интернета. Сегодня на языке Perl написаны тысячи сценариев, которые активно используются во всем мире. В частности, всевозможные счетчики, формы запросов с произвольной структурой управляющих элементов или утилиты поиска на Web-узле страниц с заданными ключевыми словами занимают всего несколько сотен (до 500) строк кода. Поэтому многие провайдеры поддерживают Perl, правда, обычно требуя, чтобы пользователи предварительно отдавали свои сценарии ЖеЬ-мастеру на тестирование.
Имеются реализации Perl в виде языка сценариев, которые вставляются в исходном виде в код HTML наподобие сценариев JavaScript. Здесь надо отметить принципиальное отличие обычной Peri-программы, которая хоть и распространяется только в исходных текстах, но выполняется целиком на сервере, от сценария PerlScript, интерпретацию которого берет на себя клиентская машина.
Интересно, что многие PerZ-программисты считают язык Java, более раскрученный для программирования в Сети, бесперспективным. На изучение более мощного языка Perl требуется значительно меньше времени, чем на изучение Java. Если же необходимо написать большую программу для Сети, можно использовать более знакомый Си++. Конечно, язык Java имеет и ряд преимуществ, но он вовсе не конкурирует с языком Perl, занимая совершенно другую нишу. Программы на языке Java представляют собой интерпретируемый двоичный код. На этом языке можно написать, например, сетевую игрушку, но все государственные организации, особенно имеющие отношение к национальной безопасности, никогда не запустят на своей сети непроверенный двоичный Java-код, так как бреши есть в любой программной системе. А программы на Perl распространяются в исходных текстах — таково требование создателя языка — и профессиональным программистам не представляет труда протестировать их.
Победил Perl и другого конкурента. Для сложной обработки текстов долгое время использовался язык СНОБОЛ, созданный в начале 1960-х годов. Он обладает очень мощными средствами сопоставления с образцом, ориентированными на анализ текстовой информации. Но с появлением персональных компьютеров СНОБОЛ полностью отошел на второй план, так как был ориентирован на пакетную обработку данных. В нем совершенно отсутствуют средства поддержки пользовательского интерфейса, а, кроме того, по синтаксису текст программы на СНОБОЛе напоминает текст на Фортране из-за обилия меток, которые определяют результат сопоставления (переход по успеху/неуспеху). Программа выглядит слишком запутанной по сравнению с элегантным кодом Perl.
Распространялся и распространяется язык Perl только бесплатно — таково условие его создателя. Этот язык уже давно перерос рамки проекта GNU (свободно распространяемое программное обеспечение для Unix/Linux), в рамках которого был создан первоначально. Поддержку пользователей, разработку новых версий интерпретаторов и компиляторов для своего любимого языка PerZ-программисты осуществляют бесплатно. В конце 90-х годов вышла пятая версия Perl. Реализация языка была полностью пересмотрена автором. Изменился синтаксис Perl — добавились конструкции, упрощающие чтение исходного кода. Значительно информативнее стали предупреждения и сообщения об ошибках. Грамматика, описывающая Perl 5.x, сократилась в два раза. Почти на две трети уменьшилось количество ключевых слов. При этом сохраняется полная совместимость синтаксиса со старыми версиями языка. Кроме того, стало возможным создавать двоичные PerZ-модули с помощью компилятора, хотя такая особенность востребована в основном в задачах, где на первый план выходит производительность работы системы.
В пятой версии Perl сделана попытка сориентировать язык на создание достаточно крупных программ. Введено понятие пакета для поддержки модульной структуры. Пакеты могут трактоваться как классы с виртуальными методами — в языке реализованы основные понятия объектно-ориентированного программирования. Расширен список баз данных, к которым в языке Perl организован встроенный доступ. С помощью документированного PerZ-интерфейса можно части кода на этом языке встраивать в программы на C/C++ и, наоборот, подключать библиотеки Си к PerZ-программам.
На момент написания книги (начало 2003 года) вышла версия языка Perl 5.8.O. Она характеризуется улучшенной поддержкой текста в формате Unicode, оптимизированными режимами ввода/вывода, возможностью эффективного выполнения нескольких процессов, повышенной точностью вычислений с плавающей запятой. РегГ-система без проблем работает под управлением Unix/Linux, Windows, VMS, OS/2,AmigaOS, на ряде 64-разрядных платформ.
Грядет и шестая версия Perl. Ларри Уолл решил, что она будет создана уже не им одним, а всем сообществом Регl-программистов. В результате должна появиться универсальная система, по идеологии напоминающая систему Java. Сценарий на Perl 6 будет преобразован компилятором в переносимый байт-код. Самое главное, чтоРегl-технология позволит готовить программу на любых языках программирования. Такое решение, получившее название Parrot, доступно в виде альфа-версии 0.0.9 на сайте www.parrotcode.org. Пока оно объединяет три компилятора.
Получить подробную информацию о текущей, пятой версии Perl можно по адресу www.perl.org.