
Полная версия
Сборник языков программирования А-я
137
Limbo (лимбо) — системный язык программирования, созданный в Bell Labs как часть операционной системы Inferno (развитие идей Plan 9). Появился в середине 1990 х; его авторы стремились получить переносимый, безопасный язык для написания распределённых служб и приложений в гетерогенной среде. Limbo сочетает черты C, Pascal и Newsqueak: у него статическая типизация, модульность, сборка мусора и встроенная поддержка параллелизма через каналы и процессы («нити»).
Ключевая особенность — ориентация на распределённые вычисления: каналы позволяют безопасно передавать данные и синхронизировать задачи между разными машинами; язык абстрагирует сетевую сложность, делая распределённую систему похожей на локальную. Limbo компилируется в байт код, исполняемый виртуальной машиной Dis, — это обеспечивает переносимость между архитектурами.
Хотя Inferno и Limbo не стали массовыми, они важны как пример целостной распределённой ОС и языка под неё: идеи Limbo повлияли на подходы к параллелизму, безопасности и переносимости.
138
Lisp (лисп) — один из старейших высокоуровневых языков программирования, созданный Джоном Маккарти в 1958 году; стал фундаментом функционального программирования и долгое время был основным языком исследований в области искусственного интеллекта. Его базовая структура данных — списки, а код представлен в виде символических выражений (S выражений): и данные, и программы имеют одинаковую форму, что даёт гомоиконичность и позволяет коду манипулировать собственным представлением.
Важная особенность — мощная система макросов: они работают на уровне синтаксических структур и позволяют создавать новые языковые конструкции, фактически проектируя предметно ориентированные языки внутри Lisp. Язык поддерживает функции первого класса, рекурсию, динамическую типизацию и разные модели вычислений.
Сегодня распространены диалекты Common Lisp и Scheme, а также современный Clojure (на JVM). Lisp применяют в ИИ, обработке символьной информации, метапрограммировании, а также в инструментах вроде Emacs Lisp и AutoLISP.
139
Logo (лого) — образовательный язык программирования, созданный Сеймуром Пейпертом и коллегами в 1967 году на базе идей Lisp. Его главная цель — сделать программирование доступным детям: язык построен вокруг простой метафоры «черепашьей графики» (Turtle Graphics), где команды вроде FORWARD, RIGHT, PENUP заставляют виртуальную «черепашку» рисовать на экране, наглядно демонстрируя результат каждого действия.
Синтаксис Logo близок к естественному языку и интуитивно понятен: программы состоят из понятных команд и легко расширяются через определение собственных процедур, что развивает алгоритмическое мышление. Язык поддерживает рекурсию, списки и базовые управляющие конструкции, сохраняя при этом низкий порог входа.
Помимо графики, Logo применяли в робототехнике (управление реальными «черепашками»-роботами) и в педагогических экспериментах по конструктивистскому обучению.
\140
Lua (луа) — лёгкий, быстрый, динамически типизированный скриптовый язык, разработанный в 1993 году в Бразилии. Его философия — минимализм и максимальная встраиваемость: интерпретатор компактен (менее 200 КБ), а C API позволяет легко интегрировать Lua в приложения на C/C++ и другие языки.
Главная структура данных в Lua — таблицы: они служат и массивами, и словарями, и объектами, позволяя гибко моделировать разные абстракции. Язык поддерживает функции первого класса, замыкания, корутины и простую модель ООП на базе таблиц и метатаблиц. Нумерация индексов начинается с 1 — это характерная особенность, отличающая Lua от большинства языков.
Lua широко применяют как встраиваемый язык сценариев: в игровых движках (Roblox, Love2D, Defold), в аддонах (World of Warcraft), в инфраструктуре (Redis, Nginx, NeoVim).
141
Lucid (люсид) — декларативный язык потоковых (dataflow) вычислений, разработанный Биллом Уоджем и Эдом Эшкрофтом в 1970 х как математически чистая модель параллельных и недетерминированных процессов. В Lucid каждая переменная — это бесконечный поток значений, а программа — система уравнений, описывающих преобразования и связи между потоками. Ключевой оператор fby («за которым следует») задаёт порядок во времени: например, n = 1 fby n + 1 порождает поток 1, 2, 3, …
Язык ориентирован не на пошаговое управление состоянием, а на описание зависимостей: выражения ждут поступления нужных значений, прежде чем вычисляться. Lucid задумывался как инструмент для верификации и понятного моделирования параллелизма, а не как массовый прикладной язык. Он повлиял на развитие реактивного и потокового программирования и остаётся важным примером «не фон неймановской» модели вычислений.
142
Lustre (лустр) — синхронный реактивный язык для разработки систем реального времени, созданный в 1987 году (INRIA, Франция). Его основная ниша — надёжные встроенные и критические системы (авиация, железнодорожный транспорт, энергетика), где важно гарантировать временные характеристики и отсутствие гонок данных.
В Lustre программа — это набор уравнений над потоками: переменные представляют бесконечные последовательности значений, меняющихся по тактам, а логика описывает зависимости между ними. Язык детерминирован и ориентирован на формальную верификацию: модели на Lustre удобно проверять на корректность с помощью инструментов вроде Kind 2 или Lesar.
Lustre повлиял на промышленные стандарты и инструменты (например, на модель синхронных языков в SCADE) и остаётся важным примером «гарантированно предсказуемого» программирования.
M
143
M4— универсальный макропроцессор общего назначения, разработанный Брайаном Керниганом и Деннисом Ритчи в 1977 году как развитие более ранних макросредств UNIX. Это не язык для написания конечных приложений, а инструмент текстовой подстановки: он преобразует входной поток текста, раскрывая макросы, подставляя аргументы, включая файлы и выполняя простые вычисления.
Ключевые возможности: определение и вызов макросов с аргументами, условные конструкции, арифметические операции, работа с файлами и даже вызов внешних команд ОС. M4 Тьюринг полноценен, но применяется не как основной язык, а как этап сборки. Он лежит в основе GNU Autoconf (генерирует скрипты configure) и активно используется для генерации конфигураций (например, в sendmail) и шаблонов документации.
Исторически важен как эталон мощного макроязыка вне конкретного языка программирования; показывает, как на уровне текста можно автоматизировать повторяющиеся паттерны и централизованно управлять вариациями кода.
144
Maple (мэпл) — язык программирования в составе одноимённой системы компьютерной алгебры (разработчик — Maplesoft, Канада), ведущей историю с 1982 года. Это процедурный язык с элементами функционального стиля: поддерживает циклы, условия, процедуры, модули, рекурсию и мощные средства символьных преобразований. Его главная сила — в тесной интеграции с математическим ядром: символьное дифференцирование, интегрирование, разложение в ряды, решение уравнений, работа с матрицами и спецфункциями доступны как встроенные операции, а не как внешние библиотеки.
Синтаксис языка напоминает смесь Pascal и BASIC — это снижает порог входа для инженеров и преподавателей. Maple активно используют в вузах для обучения и в науке для аналитических выкладок, где важно не просто получить число, а вывести формулу. Система даёт и графические средства (2D/3D), и экспорт в LaTeX, и интерфейсы к другим средам.
145
Mathematica (матема́тика) — язык системы компьютерной алгебры от Wolfram Research (первая версия — 1988 год), сегодня известный также как Wolfram Language. Это мультипарадигменный язык: в нём органично сочетаются процедурный, функциональный стили и, что особенно важно, парадигма правил преобразований — вычисления строятся как применение шаблонов и подстановок к выражениям.
Главная сила Mathematica — в единой среде для символьных, численных и графических вычислений: система умеет аналитически решать уравнения, считать с произвольной точностью, строить сложные 3D визуализации и генерировать код для других языков. Интерфейс в виде «ноутбуков» (notebook) объединяет код, формулы, графики и текст — это делает инструмент популярным в образовании и науке. Язык содержит десятки тысяч встроенных функций и знаний (включая базы данных по физике, химии, географии), а также средства интеграции с внешними системами.
146
MATLAB (матла́б) — язык и среда технических вычислений от The MathWorks (первая версия — 1984 год), изначально созданный Кливом Молером как инструмент для удобной работы с матрицами и линейной алгеброй. Его ядро построено вокруг матричных операций: даже скаляр — это матрица 1×1, а основной лозунг сообщества — «думай векторно» (Think vectorized). Язык интерпретируемый, поддерживает скрипты и функции, а в новых версиях — объектно ориентированные конструкции.
MATLAB объединяет вычисления, визуализацию и программирование в единой среде: в нём есть готовые наборы функций (toolboxes) для обработки сигналов, управления системами, компьютерного зрения, машинного обучения и др. Тесная связка с Simulink позволяет моделировать динамические и встроенные системы. Язык широко используют в вузах (особенно для курсов по численным методам и теории управления) и в инженерии — от прототипирования алгоритмов до генерации кода для встраиваемых систем.
147
Mercury (мёркьюри) — чисто декларативный логико функциональный язык, разработанный в Мельбурнском университете (авторы — Zoltán Somogyi, Fergus Henderson, Thomas Conway); первая публичная версия появилась в 1995 году. Он создан как эволюция Prolog: сохраняет выразительность логического программирования, но устраняет главные слабые места Prolog — низкую производительность и слабую статическую проверку.
Mercury сочетает строгую статическую типизацию (в духе Haskell) с системой режимов (modes), которая явно описывает поток данных в предикатах, и декларациями детерминизма — это позволяет компилятору агрессивно оптимизировать код и выявлять ошибки ещё на этапе компиляции. Язык ориентирован на «программирование в крупном масштабе»: модульная система, отдельные компиляции и мощные инструменты анализа делают его пригодным для больших надёжных проектов.
Mercury компилируется в C, Java, LLVM и др., достигая производительности, сопоставимой с императивными языками. Применяется в задачах, где важны формальная корректность и скорость: верификация, обработка правил, сложные символьные вычисления.
148
ML — семейство статически типизированных функциональных языков, родоначальником которого стал MetaLanguage (разработан Робином Милнером в 1973 году как часть системы автоматического доказательства теорем LCF). Ключевая особенность — система типов Хиндли — Милнера: она обеспечивает строгую типобезопасность и при этом почти не требует явных аннотаций типов — вывод типов делает код лаконичным, но надёжным.
В ML преобладают неизменяемые данные, функции первого класса, сопоставление с образцом и мощная модульная система. Наиболее известные представители семейства — Standard ML (SML) и OCaml: SML ценят за формальную строгость и используют в верификации и преподавании теории языков, OCaml — в компиляторах, финансовом ПО и в основе Coq (системы доказательств). ML повлиял на дизайн Haskell, Rust, Swift и других языков: идеи вывода типов, алгебраических типов данных и модульности стали индустриальным стандартом.
149
Modula (модула) — язык программирования, созданный Никлаусом Виртом в середине 1970 х как развитие Pascal; экспериментальная реализация появилась в 1975 году. Главная инновация Modula — явная поддержка модулей как базовых структурных единиц: каждый модуль имеет интерфейс (что видно снаружи) и реализацию (внутренние детали), что позволяет скрывать сложность, разделять компиляцию и чётко контролировать зависимости. Язык сохраняет синтаксическую близость к Pascal, но добавляет средства для системного программирования — в том числе прямой доступ к памяти и аппаратуре.
Modula задумывалась как инструмент для создания надёжного системного ПО с контролируемой сложностью; она стала прямым предшественником Modula 2 (1978), который уже получил широкое распространение. Хотя сама Modula осталась экспериментальной, её концепция модульности и разделения интерфейса/реализации стала стандартом индустрии: похожие модели позже появились в Ada, Java, C#, современных системах пакетов и модульных сборках.
150
Modula-2 — структурированный модульный язык, созданный Никлаусом Виртом в 1978 году как зрелая реализация идей модульности после экспериментальной Modula. Язык развивает Pascal, но целенаправленно проектируется для надёжного системного программирования: его ядро — чёткое разделение на модуль определений (интерфейс) и модуль реализации, строгий контроль экспорта и импорта имён, а также запрет на неконтролируемые побочные эффекты.
Modula 2 даёт средства низкоуровневой работы (прямое управление памятью, адресация, нетипизированные данные) и базовые примитивы параллелизма, сохраняя при этом строгую статическую типизацию и отказ от оператора GOTO ради предсказуемости кода. Язык использовался для системного ПО ЭВМ Lilith и оказал сильное влияние на индустрию: его модель модулей легла в основу Ada, а архитектурные идеи прослеживаются в Oberon, Java и современных модульных системах.
151
MUMPS (мампс, от Massachusetts General Hospital Utility Multi Programming System) — язык и одновременно модель данных, разработанный в 1966–1970 годах в Массачусетской больнице общего профиля (MGH) для автоматизации медицинских записей. Его главная особенность — неразрывная интеграция языка и базы данных: основой хранения служат многомерные разреженные массивы («глобалы», обозначаются через ^), которые сразу хранятся на диске и поддерживают транзакции, блокировки и быстрый обход по индексам.
MUMPS — интерпретируемый язык с динамической типизацией, где основными типами выступают строки и числа; он ориентирован на высоконагруженные многопользовательские системы с интенсивной обработкой транзакций. Синтаксис предельно лаконичен, допускает сокращения команд (например, S вместо SET, W вместо WRITE), а логика строится вокруг манипуляций с глобалами.
Исторически стал фундаментом крупных медицинских систем (VistA для ветеранов США, EPIC) и банковских решений; современные платформы (InterSystems IRIS, GT.M) сохраняют совместимость с MUMPS, добавляя SQL и объектные модели.
N
152
Napier88 (Нейпир88, в честь Джона Непера в 1988г) — ортогонально персистентный язык программирования, разработанный в Университете Сент Эндрюс (Шотландия) под руководством Рона Моррисона при участии Фреда Брауна, Ричарда Коннора, Алана Дирла и других как экспериментальная платформа для исследования постоянного хранения данных без явных операций ввода вывода. Ключевая идея — «ортогональная персистентность»: любые объекты могут существовать неограниченно долго, и программисту не нужно отдельно заботиться о сохранении или загрузке состояния — всё, что достижимо из корневого объекта, автоматически сохраняется в хранилище.
Язык сочетает строгую полиморфную систему типов (с параметрическими и рекурсивными типами) и структурную эквивалентность типов, что упрощает компоновку независимо подготовленных модулей. Napier88 поддерживает абстракции, управление пространствами имён, параллелизм и транзакции; программы исполняются на Persistent Abstract Machine (PAM). Хотя язык остался академическим прототипом (проект свернули вскоре после 1989 года), его идеи повлияли на модели персистентных систем, типы в CORBA и архитектуры вроде CLR. Отдельно стоит отметить, что Napier88 стал одним из первых надёжно реализованных языков, где полиморфизм и персистентность были интегрированы на системном уровне, задав вектор для будущих сред долговременного хранения состояний.
153
Nemerle (немерле, Земноморье) — мультипарадигменный статически типизированный язык для платформы .NET (также поддерживается Mono), разработанный в Вроцлавском университете (начало — 2003 год) и позднее связанный с JetBrains. Он объединяет объектно ориентированный, функциональный и императивный стили, делая упор на мощную систему метапрограммирования: макросы позволяют расширять синтаксис и создавать предметно ориентированные языки (DSL) прямо в коде.
Ключевые особенности: вывод типов в духе ML, сопоставление с образцом (pattern matching), частичное применение функций и выразительные макросы, близкие по духу к Lisp. Nemerle задумывался как эволюция C# с функциональными и метапрограммистскими возможностями: он совместим с экосистемой .NET, но даёт более гибкие средства абстракции. Применяется в инструментах генерации кода, DSL и экспериментальных фреймворках; интересен как пример глубокой интеграции макросов в типобезопасный язык общего назначения.
154
NewLISP (Нью Лисп) — лёгкий динамически типизированный Lisp диалект (автор — Лутц Мюллер, первая версия — 1991 год), спроектированный как компактный скриптовый язык общего назначения. Он сохраняет классический S выразительный синтаксис Лиспа, но упрощает ряд концепций: использует динамическую область видимости по умолчанию, имеет встроенные средства для работы с текстом, сетью и XML, а также поддерживает объектно подобные контексты (пространства имён) вместо строгой ООП модели.
NewLISP отличается малым размером среды выполнения (порядка 100 КБ), быстрым запуском и предсказуемым управлением памятью без классической сборки мусора. Применяется для CGI скриптов, системного администрирования, обработки текста, прототипирования и встраивания в приложения как скриптовый движок. Сочетает простоту Lisp с практичностью для повседневных задач, оставаясь при этом совместимым с лисповской культурой функционального мышления.
155
NewtonScript (НьютонСкрипт) — динамический прототипно ориентированный язык, разработанный Уолтером Смитом в Apple (середина 1990 х) специально для платформы Newton (КПК MessagePad и eMate). Его главная особенность — модель объектов на основе делегирования (прототипов, а не классов): объекты («фреймы») хранят данные и поведение, наследуя свойства через цепочки прототипов и контейнеров, что идеально подходило для гибкого проектирования интерфейсов и форм на маленьком экране.
Язык оптимизирован под жёсткие ограничения устройств: малое количество оперативной памяти, энергопотребление и необходимость быстрой реакции на события. В NewtonScript активно использовались «слоты» (поля объектов), специальные механизмы _proto и _parent для наследования, а также отложенное вычисление и компактная упаковка данных в формате NSOF. Язык повлиял на развитие динамических языков (в частности, вдохновил дизайн Io) и продемонстрировал жизнеспособность прототипной модели вне академической среды. Применялся для создания приложений под Newton OS (1993–1998), включая обработку рукописного ввода и управление данными в «супах» (soup) — гибких хранилищах записей.
156
Nim (ним) — мультипарадигменный статически типизированный язык (автор — Андреас Румпф, первая версия — 2008 год), сочетающий синтаксическую простоту Python с производительностью C. Он поддерживает процедурную, объектно ориентированную и функциональную парадигмы, а также мощное метапрограммирование через макросы, работающие с AST.
Nim компилируется в C, C++ или JavaScript, что даёт высокую скорость и широкую переносимость. В языке есть гибкая система управления памятью: по умолчанию — автоматический сборщик мусора с локальными кучами на поток, но можно использовать ручное управление или особые типы (например, owned). Богатая стандартная библиотека и пакетный менеджер Nimble упрощают разработку.
Язык применяют для системного программирования, высоконагруженных сервисов, игр и скриптов.
157
NXC(Not eXactly C) — язык программирования для роботов LEGO Mindstorms (NXT и EV3), созданный как упрощённая C подобная альтернатива родной среде LEGO. Он позволяет писать компактные, быстрые программы с привычным C синтаксисом: циклы, условия, функции, указатели и прямой доступ к моторам и датчикам. NXC транслируется в байт код NXT, поэтому работает быстрее и гибче, чем стандартная графическая среда LEGO.
Язык поддерживает многозадачность, прямой контроль таймеров и портов, а также низкоуровневые вызовы, что делает его популярным в образовательных робототехнических проектах и соревнованиях. NXC не требует сложной настройки: достаточно подключить робота и загрузить программу.
O
158
Oberon (оберон) — минималистичный статически типизированный язык, созданный Никлаусом Виртом в 1988 году как развитие Modula 2 для реализации компактной и надёжной операционной системы (Project Oberon). Его философия — «настолько просто, насколько возможно, но не проще»: в языке нет лишних конструкций, зато есть строгая модульность, автоматическое управление памятью (сборка мусора) и компонентно ориентированный подход.
Oberon поддерживает расширяемые типы и полиморфизм через конструкцию WITH, а инкапсуляция обеспечивается на уровне модулей. На базе Oberon появились версии Oberon 2, Oberon 07, Component Pascal и Active Oberon — они добавляли методы, циклы и средства для параллелизма. Язык повлиял на дизайн Java, Go и других языков, а его экосистема (например, BlackBox Component Builder) до сих пор используется в образовании и для надёжных встраиваемых решений.
159
Occam (оккам) — Название дано в честь философа Уильяма Оккама, автора принципа «бритвы Оккама» («не следует множить сущности без необходимости») — этот лаконичный подход стал своего рода девизом языка. В русскоязычной среде закрепился именно такой вариант произношения, без англицированных искажений.
Язык параллельного программирования, разработанный в начале 1980 х компанией Inmos под руководством Дэвида Мэя специально для транспьютеров. Его теоретическая основа — модель взаимодействующих последовательных процессов (CSP) Энтони Хоара: параллельные процессы обмениваются данными через каналы по принципу «рандеву», без общей памяти, что позволяет формально доказывать корректность программ.
Ключевые конструкции: PAR (параллельное выполнение), SEQ (последовательное), IF, WHILE, ALT (альтернативный выбор) и репликатор FOR. Синтаксис минималистичен, а отступы задают область действия — скобки не нужны. Occam тесно связан с архитектурой транспьютеров: язык задумывался как их «родной» высокоуровневый инструмент. Идеи Occam повлияли на JCSP (Java), occam π и современные подходы к безопасной параллельности.
160
Oforth (офорт) — объектно ориентированный диалект Forth (автор — М. Франк Бенсусан), сочетающий классический стековый подход Forth с полноценной объектной моделью. В отличие от «чистого» Forth, Oforth изначально проектировался с встроенной поддержкой ООП: классы, методы, динамическое связывание и расширяемые («незакрытые») классы, к которым можно добавлять новые методы в любой момент.
Язык сохраняет стековую семантику и постфиксную нотацию Forth, но заменяет низкоуровневые операции на высокоуровневые абстракции. Он поддерживает замыкания, генераторы и коллекции, а также кроссплатформенность (JVM, .NET). Oforth ориентирован на DSL, прототипирование и задачи, где важны компактность кода и гибкость расширения. В нём сделан упор на скорость диспетчеризации методов при сохранении динамичности — для этого используют виртуальные таблицы, собираемые на лету.
161
Oil (Object Interaction Language) — объектно ориентированный интерпретируемый язык для распределённых многоагентных систем и робототехники (разработка Университета Колорадо). Его базовая идея — «интенции» (намерения): примитив языка задаёт цель (например, «доставить объект»), а система динамически подбирает реализацию среди доступных агентов. OIL поддерживает динамическое обнаружение сервисов, разрешение интенций, параллельное выполнение и отказоустойчивость при сбоях агентов. Язык построен поверх Python и транслируется в него, что даёт гибкость прототипирования. Применяется в мультироботных системах: навигация, распределение задач, совместное восприятие среды.
162
Oil (язык для Unix оболочек, проект Oilshell) — современный язык сценариев и оболочка (shell) из проекта Oilshell (автор — Andy Chu), задуманный как эволюция Bash с упором на предсказуемость и удобство написания скриптов. В проекте два режима: OSH (совместимый с Bash) и собственно Oil — новый язык с более чистым синтаксисом. Oil улучшает работу с массивами, регулярными выражениями («egg expressions»), переменными и функциями, добавляет типизированные конструкции и лучшее управление ошибками. Язык ориентирован на то, чтобы shell стал полноценным языком программирования, а не только интерактивной оболочкой. Применяется для автоматизации, CI/CD, системных скриптов, где важна читаемость и надёжность.




