Парадигма | мультипарадигма : структурированная, основанная на прототипах |
---|---|
Разработано | Стивен Уайт |
Разработчик | Стивен Уайт и Павел Кертис |
Впервые появился | 1990 г. |
Стабильный выпуск | 1.8.1 / 10 января 2001 г. |
Печатная дисциплина | динамичный |
Основные реализации | |
MOO | |
Под влиянием | |
Алгол, Лисп, Схема, Smalltalk, Самостоятельная, C, Ада, MUF | |
Под влиянием | |
CoolMUD, ColdC |
Язык программирования MOO - это относительно простой язык программирования, используемый для поддержки сервера MOO. Он динамически типизирован и использует объектно-ориентированную систему, основанную на прототипах, с синтаксисом, примерно заимствованным из школы языков программирования Ada.
Стивен Уайт является автором первого МОО сервера и языка в 1990 году с использованием C. В течение года к проекту присоединился Павел Кертис, выпустив первую версию LambdaMOO Server. LambdaMOO запускается и поддерживается исключительно на добровольной основе, и теперь у него есть собственный проект SourceForge. Хотя последний упакованный выпуск был в 2001 году, разработка все еще продолжается в CVS проекта на Sourceforge.net. Некоторый дополнительный код также доступен на Github.net.
Уайт описывает MOO как «мешанину c-подобных операторов и структур управления, подобных Ada, в сочетании с одиночным наследованием в стиле прототипа».
В языке есть поток управления явной обработкой исключений, а также традиционные конструкции цикла. Иерархия глаголов и свойств предоставляет значения по умолчанию для объектов-прототипов с преобладающими значениями ниже в иерархии. Эта иерархия объектов поддерживается посредством делегирования «родительскому» свойству объекта, что приводит к форме единственного наследования. Специальные связанные с безопасностью атрибуты объектов, команд и свойств включают владение, а также флаги чтения, записи и выполнения. Программы MOO компилируются в виде байтового кода с неявной декомпиляцией при редактировании, что обеспечивает каноническую форму программ.
Программы MOO ортогонально постоянны через периодические контрольные точки. Объекты идентифицируются уникальным целочисленным идентификатором. Неиспользуемые данные программы удаляются с помощью автоматической сборки мусора (реализованной путем подсчета ссылок ). Однако сами объекты MOO не собираются мусором и вручную удаляются их владельцами или суперпользователями (также известными как мастера) в процессе, называемом «переработка».
MOO явно является многопользовательской системой, и программы (глаголы) создаются любым количеством подключенных пользователей. Различают «драйвер» (среда выполнения) и «ядро» (программы, написанные на языке MOO). Подавляющее большинство функций работающего MOO обрабатывается «внутри ядра».
Среда выполнения поддерживает многозадачность с использованием метода квантования времени на основе возмездия. Глаголы выполняются с монопольным доступом к базе данных, поэтому для поддержания синхронизации не требуется явной блокировки. Простой обмен сообщениями TCP / IP (совместимый с telnet) используется для связи с клиентскими сокетами, каждый из которых идентифицируется с «игроком» в системе представления виртуальной реальности.
Язык поддерживает слабые ссылки на объекты по номерам, а также на свойства и глаголы через строки. Существуют встроенные функции для получения списков свойств и глаголов, предоставляющие языковой среде средства отражения. Сервер также поддерживает сопоставление глаголов с подстановочными знаками, поэтому один и тот же код можно легко использовать для обработки нескольких команд с похожими именами и функциями.
Доступные типы последовательностей в MOO - это списки и строки. Оба поддерживают произвольный доступ, а также операции головы и хвоста, аналогичные тем, которые доступны в Lisp. Все операции со списками и строками являются неразрушающими, и все типы данных, не являющиеся объектами, неизменяемы. Встроенные функции и библиотеки позволяют также использовать списки как ассоциативные массивы, а также упорядоченные и неупорядоченные наборы.
MOO имеет очень простой набор управляющих структур, причем for-in-list является единственной «необычной» функцией.
if (lt;exprgt;) lt;statementsgt;; elseif (lt;exprgt;) lt;statementsgt;; else lt;statementsgt;; endif
for lt;variablegt; in [lt;numbergt;..lt;numbergt;] lt;statementsgt;; endfor
for lt;variablegt; in (lt;list valuegt;) lt;statementsgt;; endfor
while (lt;expressiongt;) lt;statementsgt;; endwhile
try lt;statementsgt;; except lt;variablegt; (lt;error codegt;) lt;statementsgt;; endtry
Классическую программу Hello World можно записать в MOO как:
@program hello:run player:tell("Hello to the world of MOO!");.
Более интересный пример:
@program toy:wind if (this.location == player) if (this.wound lt; this.maximum) this.wound = this.wound + 2; player:tell("You wind up the ", this.name,"."); player.location:announce(player.name, " winds up the ", this.name,"."); if (this.wound gt;= this.maximum) player:tell("The knob comes to a stop while winding."); endif else player:tell("The ",this.name," is already fully wound."); endif else player:tell("You have to be holding the ", this.name,"."); endif.