Еще один «летний» язык программирования

15 июнь, 2005 - 23:00Андрей Зубинский

По всем правилам журналистики начинать статью надо с какой-нибудь дикой банальности. Например, с констатации того факта, что за окном – лето. А летом, понятное дело, очень хочется солнца, воды и веселья. А вот «копошиться» в деталях и нюансах чего-нибудь сложного (и тем более сомнительно полезного) летом ну совсем не хочется...

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

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

Во-вторых, на фоне франко-голландского неприятия европейского единения на основе общей конституции совершенно незамеченным осталось еще одно весьма интересное событие европейского масштаба – выступление Иисуса Вилласанте (Jesus Villasante), главы комитета программных технологий информационного общества Еврокомиссии (EC Information Society). Несмотря на свое имя, как бы призывающее к терпимости, господин Вилласанте был не по-европейски нетолерантен. Он фактически обвинил ряд крупных корпораций в использовании дешевых ресурсов сообщества разработчиков программ с открытыми исходными текстами. Больше того, Вилласанте назвал характер этого использования «субподрядным», при котором сообщество теряет самостоятельный коммерческий потенциал и становится дешевой рабочей силой межнациональных корпораций. Фрагменты выступления Вилласанте на прошедшей в Нидерландах конференции открытого ПО (Holland Open Software Conference) заслуживают цитирования: «IBM спрашивает покупателя: "Вы хотите закрытое или открытое ПО?" И если покупатель отвечает "Открытое", IBM говорит: "Тогда вы хотите открытое ПО IBM"». Досталось на орехи от Вилласанте не только корпорациям, и даже не только сообществу открытого ПО (которое он назвал «полной неразберихой» – complete mess), но и всей Европе в целом. О ней Вилласанте сказал так: «Я думаю, что в Европе в настоящее время нет индустрии программного обеспечения. Она есть сегодня в Америке, она, возможно, будет завтра в Китае или Индии. И нам (речь идет об участниках конференции открытого ПО. – Прим. автора ) решать – быть ли ей в Европе». Один из способов, благодаря которым индустрия ПО в Европе будет существовать, по мнению Вилласанте, таков – самостоятельная разработка коммерческих программных продуктов силами сообщества открытого ПО.

Какие из этих двух фрагментов можно сделать выводы? Да какие угодно. Именно поэтому автор их делать не станет – в конце концов, нельзя лишать людей удовольствия видеть в фактах только то, что им нравится. Разве что пару слов об очевидном сказать стоит (хотя бы потому, что очевидное всегда трудно заметить). Об эффекте «инвестиций из зарплаты», да и о самой зарплате, допускающей такое и не являющейся чем-то исключительным (как-никак 10 тысяч человек – это не плакатная парочка буржуев в цилиндрах), ранее никогда не упоминали ни сторонники, ни самые ярые противники коммерческой модели развития ПО. Позиция Вилласанте интересна хотя бы потому, что это все-таки не болтливый всезнайка «из Интернета», а человек всеевропейского уровня. И наконец, самое очевидное: за окном – лето, посему никаких программ больше сотни килобайт и никаких статей больше четырех страниц я вам предлагать не буду.

Lua, успокой меня, мне нужен твой свет...

Перефразированные слова песни орденоносного Бориса Гребенщикова,
хотя... Lua – это та же луна, но над Бразилией

Начнем мы, как обычно, с попытки автора отвертеться от ответа на вечно главный вопрос современности: «А кому оно надо?» Действительно, зачем учить «еще один язык программирования», если этих языков на хорошем портале (например, здесь – dmoz.org/Computers/Programming/Languages/) собрано, ни много ни мало, несколько сотен? Так вот – на этот вопрос каждый должен найти свой ответ. В случае с Lua (а язык, о котором пойдет речь, именно так называется), правда, есть кое-какие претендующие на объективность соображения. Во-первых, очень элегантная разработка (пока поверьте на слово) – именно элегантная. Во-вторых, Lua существенно отличается от большинства интерпретируемых языков. Задумайтесь сами, много ли вы знаете интерпретаторов, способных легко «перемолоть» программу размером в несколько десятков мегабайтов? Однако для Lua это вполне нормально. А какие языки вообще приспособлены к созданию многомегабайтовых программ? Для Lua это тоже норма – язык создавался в академической среде, в том числе и для описания данных в научных программах и системах автоматизации эксперимента. Многие ли языки при внешне традиционном синтаксисе обладают богатым набором свойств и возможностей, например, присущих функциональным и объектно-ориентированным? Много ли есть языков, вся выразительность и богатство конструкций которых строится на одной-единственной абстракции? А в Lua все именно так. И наконец, о самом по-летнему ленивом в Lua – текст лицензии этой распространяемой свободно открытой программы не просто краток, а изысканно краток. Лицензия описывается всего четырьмя предложениями из 167 слов. Первым предложением утверждается авторское право, вторым разрешается делать с Lua все, что вздумается (использовать, копировать, модифицировать, продавать, включать в продаваемые продукты и т. д.), третьим требуется сохранение во всех случаях текста лицензии, четвертым традиционно снимается всякая ответственность с правообладателя.

Lua – проект и достижения

Размеры дистрибутивов Lua не должны вызывать мыслей о несерьезности стоящего за ними проекта. Создание языка началось почти 12 лет назад – в 1993 г. Команда разработчиков из католического университета Рио-де-Жанейро невелика – Роберто Иерусалимский (Roberto Ierusalimschy), Вольдемар Целес (Waldemar Celes) и Луис Энрике (Luiz Henrique). Изначально язык задумывался как описательный – для удобства формирования больших массивов данных при решении задач вычислительного эксперимента и машинного моделирования. За 12 лет язык претерпел множество изменений и ряд серьезных архитектурных модификаций. Сегодняшняя популярность Lua такова, что Microsoft выделила разработчикам грант на создание .NET-версии языка. Во многих играх Lua используется в качестве «скриптового движка» благодаря уникальному сочетанию быстродействия, легкости встраивания в программы и поддержке «расширяемой семантики».

Раз уж создатели языка Lua разрешают делать с ним все что угодно, попробуйте хотя бы для начала обзавестись исполняемой бинарной версией интерпретатора для вашей платформы. Пользователям Unix-совместимых ОС можно (и нужно) прибегнуть к традиционному способу – загрузке исходных текстов (URL файла последней на момент написания статьи версии www.lua.org/ftp/lua-5.0.2.tar.gz, его размер, как и обещано, – 185 KB) и компиляции-сборке. C последней процедурой проблем быть не должно – Lua написан на ANSI стандартном C, и написан образцово-мобильно (кстати, изучающим C можно порекомендовать поработать с исходными текстами Lua, но, естественно, осенью). Пользователи ОС семейства Windows могут загрузить один из многих готовых бинарных комплектов, например со страницы Филиппа Ости (Philippe Lhoste). В этом дистрибутиве размером 130 KB собран «полный боекомплект», необходимый для изучения и использования Lua, – интерпретатор, байт-код-компилятор, руководство по Lua (на английском языке) и reg-файл для ассоциирования файлов с расширением .lua с соответствующими приложениями. Установка этого «дистрибутива» крайне проста – создайте каталог (скажем, C:Lua) и распакуйте в него содержимое архива. Откройте файл luafile-en.reg текстовым редактором и замените слова ProgCmdLine на Lua. Запустите обновленный и сохраненный reg-файл. Теперь ваша персональная копия Lua готова к употреблению. Любители интеллектуальных развлечений на свежем воздухе могут установить Lua на свой карманный компьютер. Например, на любой семейства Pocket PC (URL исполняемого файла для карманных машинок с процессором ARM – luaforge.net/frs/download.php/53/Lua.exe; заметьте, это не инсталлятор программы, а именно исполняемый файл, который надо скопировать в какой-либо каталог КПК). В дополнение к этому файлу размером 130 KB вам понадобится «довесок» – консоль Pocket PC, чей инсталлятор занимает целых 90 KB (URL – www.symbolictools.de/public/pocketconsole/bin/pocketconsole/pocketconsole_arm_setup.exe; в отличие от предыдущего exe-файла это именно инсталлятор, запускаемый на «большом» ПК).

Итак, не откладывая в долгий ящик, начнем с традиционной первой программы. Создадим файл, назовем его p_lua_first.lua и запишем в него следующую программу:

print(«My first Lua-programm!»)
Еще один «летний» язык программирования
Рис. 1
Еще один «летний» язык программирования
Рис. 2
Еще один «летний» язык программирования
Рис. 3

Теперь запустим файл и посмотрим результат. Так как он стратегически важен (большой путь начинается с первого маленького шага), то продемонстрируем его сразу двумя снимками экранов – настольного компьютера и КПК (рис. 1 и 2 соответственно).

Несмотря на более чем скромную логику, с помощью этой нашей программы можно исследовать ряд важных особенностей языка и его реализации. Во-первых, в силу того что p_lua_first.lua исполняется, она, очевидно, является фрагментом кода, который может исполняться (диковинная формулировка, но что поделаешь...). Такие фрагменты кода в Lua принято называть «ломтями» или «кусками» (но в дальнейшем мы все-таки будем использовать оригинальный термин chunk). Определение chunk не налагает никаких ограничений на оформление фрагмента кода – им может быть и файл, и даже строка кода в интерактивном режиме работы интерпретатора. Во-вторых, мы можем не просто исполнить этот chunk, а скомпилировать его с помощью компилятора в байт-код (в Windows-дистрибутиве он называется LuaC.exe). В результате запуска LuaC.exe с параметром – полным именем файла p_lua_first.lua, будет создан файл байт-кода с именем luac.out. Его содержимое, естественно, радикальным образом отличается от исходного текста (рис. 3). Но теперь давайте попробуем данный файл указать в качестве параметра интерпретатору (в Windows-дистрибутиве – программе Lua.exe). Интерпретатор успешно выполнит и его (это видно в окне консоли на рис. 3). Мы открыли первое свойство интерпретатора Lua – он сам определяет, что поступило на его вход – исходный текст или байт-код. Никаких дополнительных указаний от пользователя не требуется.

Попробуем несколько усложнить тот же самый пример – создадим два файла с именами c_01.lua, содержащий одну строчку sz="My second Lua programm", и c_02.lua, состоящий также из одной строки print(sz). Пока все совершенно очевидно: в первом файле объявляется переменная с именем sz, содержащая строку "My second Lua programm", во втором файле выводится «на печать» содержимое переменной sz. Давайте попробуем запустить файл c_02.lua. Он выполнится, и результатом станет специальное уникальное значение nil (о нем мы поговорим позднее). А вот теперь продемонстрируем специфику chunk именно как «ломтя» кода. Давайте передадим интерпретатору Lua эти два «ломтя». Такое действие можно выполнить с помощью специального спецификатора -l, за которым следует полное имя файла. Например, если полные имена файлов выглядят так: c:LuaProgrammsc_01.lua и c:LuaProgrammsc_02.lua, то наберем и запустим следующую команду:

Lua.exe -l c:LuaProgrammsc_01.lua -l c:LuaProgrammsc_02.lua

Результатом ее исполнения будет выведенная строка "My second Lua programm". Это действительно существенное отличие от многих языков, в которых файл с исходным текстом обладает определенной дополнительной семантикой (например, неявной семантикой модуля). В Lua же файл – это действительно просто «ломоть» кода. Причем представлен ли этот «ломоть» в исходном тексте или же он уже откомпилирован в байт-код, интерпретатору совершенно безразлично. Если с помощью компилятора LuaC.exe оттранслировать c_02.lua в байт-код и переименовать получившийся файл, например, в c_02.bla (расширение можно выбирать, к слову, произвольно – интерпретатор все равно правильно определит, что ему поступило на вход), то результат выполнения следующей команды будет точно таким же, как и предыдущей:

Lua.exe -l c:LuaProgrammsc_01.lua -l c:LuaProgrammsc_02.bla

Пока мы использовали интерпретатор Lua в так называемом пакетном режиме – передавали ему на исполнение «ломти» кода. Естественно, что как и у любых интерпретируемых языков программирования, у Lua есть и интерактивный режим работы. Просто запустите на исполнение программу Lua.exe – и вы попадете в среду Lua. В ней вы можете набирать «ломти» кода и сразу же их исполнять, активировав нажатием Enter). Функция Lua, с которой стоит начинать знакомство с интерактивным режимом Lua, – dofile(). В полном соответствии с именем она позволяет прочесть и выполнить файл-«ломоть» Lua-программы. вы можете повторить предыдущий пример в интерактивном режиме так:

dofile("c_01.lua")
dofile("c_02.bla")

Чтобы завершить работу в интерактивном режиме интерпретатора Lua, необходимо или ввести символ конца файла (в Windows – Ctrl-Z), или вызвать без всяких параметров библиотечную функцию Lua os.exit() (просто набрать строку os.exit() и нажать Enter).

Итак, первый шаг в Lua мы сделали, и пути назад уже нет. Пусть в этой статье мы «долго запрягали» – не переживайте, в продолжении непременно «поедем», но с летней скоростью.