Данный реферат написан по статье: R. Ierusalimschy, L. H. de

advertisement
Данный реферат написан по статье:
R. Ierusalimschy, L. H. de Figueiredo, W. Celes,
The evolution of Lua,
Proceedings of ACM HOPL III (2007) 2-1–2-26.
В данной статье рассматриваются рождение и эволюция Lua, в ней рассказывается, как
Lua превратился из простого языка для конфигурирования в мощный (но все еще простой)
язык, поддерживающий расширенные семантики, анонимные функции полные контексты
лексического анализа, хвостовую рекурсию и сопрограммы.
Авторы статьи - сотрудники Tecgraph, подразделения Католического Университета Рио
де Жанейро, являются создателями языка Lua. Roberto Ierusalimschy – был доцентом на
кафедре Компьютерных наук в Католическом университете, интересовался вопросами языков
программирования и компиляторов. Luiz Hnerique de Figueiredo был профессором, и
областью его интересов была математика и компьютерная графика. Waldemar Celes – был
аспирантом на той же кафедре и интересовался приложениями компьютерной графики.
Статья состоит из шести частей, введения и заключения.
В введении дается краткая характеристика языка Lua и основные сведения об областях
его применения.
В первой части статьи, обзоре, даются общие сведения о синтаксисе и важных
особенностях, таких как типизация, переменные, таблицы, функции и т.п. Также
рассказывается о механизме конструкторов. Значительная часть посвящена сравнению Lua и
Scheme. В конце обзора перечисляются качества Lua, которые закладывались в основу при
разработке.
Вторая часть статьи, предыстория, рассказывает о экономической ситуации в Бразилии
в 90-х годах, и о том как это влияло на процессы происходящие в недрах организаций
связанных с компьютерными технологиями. Также дается писание и особенности языков
DEL и SOL, который стали прародителями Lua.
В третьей части рассказывается о рождении языка и начальных требованиях, которые
были выдвинуты для реализации.
В четвертой части рассказываться об истории развития Lua. Дается описание каждой
версии Lua с первой по пятую. Также дается таблица особенностей для каждой версии и
некоторые характеристики, такие как количество библиотек, функций прикладного
интерфейса, количество регистров и тип виртуальной машины.
В пятой части дается детальное описание развития в внедрения каждой особенности
Lua, таких как типы данных, таблицы, строки, комментарии, функции, контекст лексического
анализа, сопрограммы, расширяемые семантики, прикладной интерфейс, пользовательские
данные и средства рефлексии.
В шестой части проводится ретроспектива развития языка и авторский взгляд на
ошибки и удачные решения.
В заключении подводится итог а также выделяется ряд особенностей, которые делают
Lua очень удобным языком сценариев для игровых приложений.
Lua — язык сценариев, появился в 1993 году, в Католическом Университете Рио де
Жанейро. С того момента Lua эволюционировал и стал широко используемым в различных
областях, таких как роботехника, распределенные вычисления, обработка изображений,
текстовые редакторы и многие другие. Также Lua является одним лидирующих языков
сценариев в разработке игр.
С самого начала Lua разрабатывался как простой, быстрый, легкий в подключении
язык. Эти принципы разработки до сих пор в силе. Основная характерная черта Lua и явное
выражение ее простоты — это предлагаемый им единственный тип структур данных —
таблицы, который является термином Lua для обозначения ассоциативных массивов. Хотя,
большинство языковых сценариев предлагают ассоциативные массивы, ни в одном языке
ассоциативные массивы не играю такую центральную роль. Таблицы предоставляют
простую и эффективную реализацию для модулей, объектов основанных на прототипах,
объектов классов, записей, массивов, множеств списков и многих других типов данных.
Синтаксически Lua напоминает язык Modula и использует обычные ключевые слова.
Семантически Lua имеет много общего с языком Scheme, хотя это не сразу заметно,
так как синтаксически они очень разные. Следующие особенности делают Lua и Scheme
похожими:
1. переменные типизированы динамически;
2. переменные никогда не хранят структурные данные;
3. имена функций не имеют особенного статуса;
4. все функции являются функциями первого класса.
Основное различие Lua и Scheme — Lua предоставляет таблицы, как единственное
средство для хранения данных. Таблицы могут хранить значения любых типов и
использовать значения любых типов в качестве ключей.
Lua предоставляет выразительный синтаксис для создания таблиц в форме
конструкторов. Простейшим конструктором является выражение '{}', которое создает пустую
таблицу. Возможны следующие варианты:
{“Sun”, “Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”}
или
{lat=-22.9, long=-43.23, city= “Rio de Janeiro”}
Таблицы индексируются с использованием квадратных скобок: 't[2]'. Существует
несколько улучшенный вариант обращения с использованием точки: 't.x', которые
эквивалентен 't[“x”]'.
Комбинация таблиц и конструкторов
назначения и процедурного описания данных.
превращает Lua в мощный язык общего
Lua также является языком расширения, так как она помогает расширить приложение
за счет конфигурирования, макросов и других пользовательских настроек. Lua спроектирован
с целью встраивания в другие приложения, так, что пользователь сможет настраивать
поведение приложения путем написания программ на Lua, которые имеют доступ к сервисам
и данным приложения.
Lua также является расширяемым языком, так как он предлагает пользовательские
данные (userdata) для хранения данных и расширяемую семантику для манипулирования
данными обычным образом. Lua предоставляет небольшое ядро, которое может быть
расширено за счет написания функций как на C, так и на Lua.
По мнению авторов, следующие важные особенности Lua проистекают из её
реализации:
1. Портируемость — Lua написана на строгом ANSI C, что позволяет собрать ее на
большинстве платформ.
2. Легкость внедрения — Lua спроектирована с целью упростить внедрение.
3. Маленький размер — исходный код и документация занимает лишь 835k дискового
пространства.
4. Эффективность — считается, что Lua самый быстрый язык сценариев.
Хотя эти особенности являются особенностями реализации, они возможно только
благодаря архитектуре Lua. Простота Lua – ключевой фактор позволяющий небольшую и
эффективную реализацию.
По мнению авторов, одной из серьезных исторических предпосылок создания Lua
являлась политика товарного барьера, который создавался с целью ускорения развития
собственных технологий. Таким образом, любые попытки приобрести программное или
аппаратное обеспечение сталкивались с бюрократическими сложностями.
Tecgraf, нуждался в некоторых инструментах, и, в силу товарного барьера, была
вынуждена разрабатывать их самостоятельно. Одним из крупнейших партнеров Tecgraph,
являлась компания Petrobras, бразильская нефтяная компания. Для нее Tecgraph поставлял
программы интерактивной визуализации. В 1993 году, Tecgraph разработал два простых
языка: DEL и SOL. Один из них использовался для формирования входных данных, а второй
конфигурированния генератора отчетов. В статье подробно рассматриваются особенности
этих языков.
В разделе истории Lua представлена временная шкала, на которой отмечены годы и
месяцы релизов Lua различных версий. Авторы отмечают, что время между выпусками
растет, что свидетельствует о росте стабильности и зрелости продукта.
Возможности Lua росли от версии к версии. Но не смотря на это, некоторые
возможности, такие как условная компиляция и встроенные функции были удалены.
Некоторая свобода действий касательно особенностей Lua обусловлена в том числе и тем,
что стремясь поддерживать простоту Lua, создатели не поддерживали обратной
совместимости.
Первая реализация Lua (версия 1.0) была достаточно успешна в Tecgraph. Более того,
привлекла пользователей из других подразделений Tecgraph. По сравнению с другими
программируемым метафайлами, Lua была настоящим языком программирования и успешно
сочетала возможности процедурного и декларативного описания.
Однако, использование Lua для описания больших объемом данных требовало
быстрый компилятор. Изначально для лексического анализа использовался Lex, но позже
лексер был переписан, что удвоило скорость компиляции. Улучшенная версия получила
номер 1.1 и была выпущена в 1994 году.
Еще одной особенностью Lua был механизм рефлексии, которые был представлен
функциями type и nextvar. Первая функция возвращала тип переменной, а вторая —
следующую переменную в таблице.
Изначально Lua распространялась в исходных текстах через FTP. Lua 1.1. имела
достаточно ограниченную лицензию: она была свободна в использовании в академических
целях, но ограниченна для коммерческих.
Позже, для версии 2.1 создатели написали свою собственную лицензию, однако она не
оправдала ожиданий. И только в мае 2002 года после долгих обсуждений была выбрана MIT
лицензия.
Не смотря на определенной давление со стороны пользователей, и их желание
добавить объектно ориентированную парадигму, создатели Lua не хотели менять
программную парадигму Lua. Более того, как считали авторы, Lua и не нуждалась в ООП
подходах.
С другой стороны, авторы хотели предоставить возможность программировать на Lua
в ООП-стиле. Вместо изменения модели, они решили обеспечить гибкий механизм, который
позволил бы построить любую модель, которая потребуется пользователю.
Таким образом в Lua версии 2.1 появился механизм расширяемых семантик и
механизм нейтрализации сбоев. Механизм нейтрализации сбоев был определен для
индексации таблиц, арифметических операций, конкатенации и вызова функций.
Еще одной особенностью Lua 2.0 стала возможность предварительной сборки. То есть,
пользователь, вместо компиляции программ в текстовом виде, мог загрузить байткод,
собранный заранее с помощью утилиты luac.
В Lua 2.2 были расширены возможности отладки. Теперь они представляли собой
функции C API, которые позволяли обращаться к стеку и отдельным переменным.
Для версии Lua 2.4 создателями было решено добавить функции по обработке строк, с
целью покрыть возможности, которые предоставляли такие языки как Snobol, Icon, Awk и
Pearl.
Как отмечают авторы, одним из важнейших событий в истории Lua стала публикация
статьи о Lua в журнале Software: Practise & Expirience. Эта статья обратила на Lua внимание
академических кругов по всему миру. А позже, еще одна статья была опубликована в
журнале Dr. Dobb's Journal, который был весьма популярен среди программистов.
В Lua 3.0 был внесен ряд усовершенствований. В частности, в версии 2.0, функция
нейтрализации сбоев могла быть установлен на событие лишь в одном экземпляре, что
ограничивало существование нескольких модулей. В Lua 3.0 были добавлены теги, благодаря
которым, появилась возможность устанавливать несколько функций нейтрализации сбоев на
один и тот же пользовательский тип.
Для обеспечения возможностей функционального программирования были добавлены
анонимные функции и функциональные замыкания через т.н. внешние локальные
переменные.
Еще одной важной особенностью Lua 3.0 стала возможность создания нескольких
объектов виртуальной машины, что весьма важно для многих приложений, например для
web-серверов.
Lua 4.0 была выпущена в ноябре 2000 года. В ней был улучшен механизм
реентерабельности. Также, практически полностью был переработан механизм
взаимодействия хост-программы и Lua.
В Lua 4.0 был также представлен оператор for. Изначально, создатели не планировали
использовать оператор for, так как оператор while был более общим, однако он создавал
большое число логических ошибок, вроде забытого обновления счетчиков цикла.
Оператор for был спроектирован в двух вариантах: численный цикл и цикл обхода
таблиц. Также был добавлен высокоуровневый оператор foreach, который вызывал
определенную функцию для каждого элемента таблицы.
Как отмечают авторы, одной из сложнейших задач, с которой они столкнулись при
создании Lua 4.1 стала поддержка многопоточнсти. Появление этой задачи было обусловлено
ростом интереса к многопоточным приложениям, однако реализация на Lua требовала
ответов на многие серьезные вопросы. Во-первых, возникала проблема с выбором способа
реализации потоков, который возникал по причине разной реализации многопоточности на
разных платформах. Во-вторых, как полагают, авторы не существует способа написать
корректную программу, в которой тривиальные выражения могут дать непредсказуемый
результат в условиях вытесняющий многозадачности. Тем не менее, задача многопоточности
была решена путем добавления нескольких стеков.
Еще одно важной особенностью Lua 4.1 стала регистровая виртуальная машина,
которая позволила заметно увеличить производительность.
В конечном итоге, версия 4.1 так и не была выпущена под этим номером. Изменения
по сравнению в версией 4.0 были стол значительны, что создатели решили дать номер 5.0.
В версию 5.1, которая на данный момент является финальной были добавлены
инкрементальный сборщик мусора и система модулей.
------В заключение про игры!
Download