| Lua: что это такое |
|
| Добавил(а) microsin |
|
Lua это лёгкий, быстрый и встраиваемый (embeddable) язык сценариев, созданный в Бразилии для расширения возможностей приложений, написанных на C/C++[1]. Проще говоря, Lua не предназначен для написания больших программ "с нуля". Его главная сила в том, что его можно встроить в уже готовое приложение (игру, графический редактор, сервер), чтобы дать пользователям или разработчикам возможность писать скрипты для гибкой настройки и автоматизации. [Ключевые характеристики Lua] • Встраиваемый: Lua — это библиотека на чистом C. Вы добавляете её в свой проект, и она позволяет программе на C вызывать Lua-код, а Lua-коду — вызывать функции C. Из-за этого его часто называют "клеем" для соединения разных компонентов. Где используется Lua. Lua очень популярен в разработке игр (World of Warcraft, Angry Birds, Roblox) и встраиваемых системах. Также его используют в таких приложениях, как Adobe Photoshop Lightroom. Ключевой структурой данных в Lua являются таблицы — ассоциативные массивы, которые одновременно заменяют собой и массивы, и словари, и объекты. В настоящее время многие языки программирования озабочены тем, как помочь вам писать программы размером в сотни тысяч строк. Для этого они предлагают вам пакеты, пространства имён, сложные системы типов, мириады конструкций и тысячи страниц документации, которые нужно изучить. Библиотека Lua устроена иначе. Вместо этого она пытается помочь вам решить свои проблемы только с помощью сотней строк, или даже меньше. Чтобы достичь этой цели, Lua опирается на расширяемость, как и многие другие языки. Однако, в отличие от большинства других языков, Lua легко расширяется не только программным обеспечением, написанным на самом Lua, но и программным обеспечением, написанным на других языках, таких как C и C++. Lua изначально разрабатывалась для интеграции с программным обеспечением, написанным на C и других традиционных языках программирования. Эта двойственность языков даёт множество преимуществ. Lua это очень крошечный и простоя язык отчасти потому, что он не пытается делать то, с чем C уже отлично справляется, т. е. не пытается обеспечивать чистую производительность, низкоуровневые операции, или взаимодействие со сторонним программным обеспечением. Для этих задач Lua полагается на мощь C. А что Lua действительно предлагает, так это то, в чем C не слишком хорош: хорошую удаленность от аппаратуры, динамические структуры, отсутствие избыточности, легкость тестирования и отладки. Для этого в Lua есть безопасное окружение (safe environment), автоматическое управление памятью и превосходные средства для работы со строками и другими видами данных динамического размера. Будучи расширяемым языком, Lua в то же время является и языком-"клеем". Lua поддерживает компонентный подход к разработке программного обеспечения, при котором мы создаём приложение, склеивая вместе уже существующие высокоуровневые компоненты. Обычно эти компоненты написаны на компилируемом, статически типизированном языке, таком как C или C++; Lua — это тот клей, с помощью которого мы соединяем и связываем эти компоненты. Как правило, компоненты (или объекты) представляют собой более конкретные, низкоуровневые понятия (такие как виджеты и структуры данных), которые не подвержены множеству изменений в ходе разработки программы, и на которые приходится основная часть процессорного времени итоговой программы. Lua придаёт приложению окончательную форму, которая вероятно, будет сильно меняться на протяжении жизненного цикла продукта. Однако в отличие от других "клеевых" технологий, Lua при этом является и полноценным языком. Поэтому мы можем использовать Lua не только для склеивания компонентов, но и для их адаптации и переформирования, или даже для создания совершенно новых компонентов. Конечно, Lua — не единственный скриптовый язык на свете. Есть и другие языки, которые можно использовать для более или менее тех же целей, например Perl, Tcl, Ruby, Forth и Python. Следующие особенности выделяют Lua среди этих языков; хотя некоторые из этих особенностей есть и в других языках, ни один другой язык не предлагает похожего профиля: • Расширяемость (extensibility): расширяемость Lua настолько примечательна, что многие рассматривают Lua не как язык, а как набор инструментов для построения предметно-ориентированных языков. Lua был спроектирован с нуля так, чтобы его можно было расширять — как посредством кода на самом Lua, так и посредством внешнего кода на C. В качестве доказательства такой концепции он реализует большую часть своей собственной базовой функциональности через внешние библиотеки. Lua действительно легко связать с языком C/C++ и другими языками, такими как Fortran, Java, Smalltalk, Ada и даже с другими скриптовыми языками. • Простота: Lua простой и маленький язык. В нем всего лишь несколько (но мощных) концепций. Эта простота делает Lua лёгким для изучения и способствует компактности реализации. Его полный дистрибутив (исходный код, руководство плюс бинарные файлы для некоторых платформ) свободно помещается на дискете. • Эффективность: Lua имеет довольно эффективную реализацию. Независимые тесты производительности показывают, что Lua — один из самых быстрых языков в области скриптовых (интерпретируемых) языков. • Портируемость: когда мы говорим о портируемости (portability), речь идёт не о запуске Lua как на Windows, так и на Unix-платформах. Мы говорим о запуске Lua на всех платформах, о которых мы когда-либо слышали: NextStep, OS/2, PlayStation II (Sony), Mac OS-9 и OS X, BeOS, MS-DOS, мейнфреймы IBM, EPOC, PalmOS, оценочная плата MCF5206eLITE, RISC OS, а также, разумеется, все разновидности Unix и Windows. Исходный код для каждой из этих платформ практически одинаков. Lua не использует условную компиляцию для адаптации своего кода к разным машинам; вместо этого он придерживается стандартного ANSI (ISO) C. Благодаря этому обычно не нужно адаптировать его к новой среде: если у вас есть компилятор ANSI C, вам достаточно просто скомпилировать Lua — "из коробки". Значительная часть мощности Lua исходит от его библиотек. И это не случайно. Одна из главных сильных сторон Lua — его расширяемость за счёт новых типов и функций. Этой силе способствуют многие особенности. Динамическая типизация допускает высокую степень полиморфизма. Автоматическое управление памятью упрощает интерфейсы, поскольку нет необходимости решать, кто отвечает за выделение и освобождение памяти или как обрабатывать переполнения. Функции высшего порядка и анонимные функции обеспечивают высокую степень параметризации, делая функции более универсальными. Lua поставляется с небольшим набором стандартных библиотек. При установке Lua в сильно ограниченной среде, например на embedded-системах, возможно разумной идеей будет тщательно выбирать, какие именно библиотеки вам нужны. Более того, если ограничения жёсткие, легко заглянуть в исходный код библиотек и выбрать одну за другой те функции, которые следует оставить. Однако помните, что Lua довольно мал (даже со всеми стандартными библиотеками), и в большинстве систем вы можете использовать весь пакет без каких-либо опасений. Lua: это компилируемый код, или интерпретируемый? Короткий ответ: Lua — это интерпретируемый язык, но с важной оговоркой: перед выполнением код компилируется в промежуточный байт-код. Если разбирать по шагам, происходит вот что: 1. Компиляция в байт-код. Когда вы запускаете `.lua` файл, стандартная реализация Lua (написанная на C) не интерпретирует исходный текст напрямую. Сначала встроенный компилятор транслирует ваш код в компактный байт-код — набор инструкций для виртуальной машины Lua. 2. Исполнение байт-кода. Затем полученный байт-код исполняется виртуальной машиной (VM), которая является интерпретатором этого байт-кода. Такая схема даёт Lua несколько преимуществ: • Скорость: интерпретировать байт-код быстрее, чем каждый раз разбирать исходный текст. Сравнение с другими языками: • Python, Java, C# — работают по той же схеме: компиляция в байт-код + виртуальная машина (хотя Java иногда называют "компилируемым" из-за строгой типизации и JIT). Итак, Lua — интерпретируемый язык с компиляцией в байт-код. Это гибридная модель, которая сочетает гибкость интерпретации с производительностью, близкой к компилируемым языкам, и при этом остаётся очень лёгкой для встраивания. Как проверить, установлен ли Lua на хосте разработки? Вот несколько способов проверить, установлен ли Lua на вашем хосте разработки. Выбирайте в зависимости от вашей ОС и того, что именно нужно узнать. 1. Проверка через терминал (универсальный способ). Откройте терминал (Linux/macOS) или командную строку/PowerShell (Windows) и выполните: lua -v Или: lua --version Если Lua установлен, выведется что-то вроде: `Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio` Если не установлен — ошибка вида `command not found` (Linux/macOS) или `'lua' is not recognized...` (Windows). Обратите внимание: версия может быть `lua5.1`, `lua5.3`, `lua5.4` и т.д. В таком случае проверяйте конкретный бинарник: lua5.4 -v 2. Где искать исполняемый файл. Чтобы узнать путь к установленному Lua: Linux/macOS: which lua Windows (PowerShell): Get-Command lua 3. Проверка через пакетные менеджеры Linux: #Debian/Ubuntu # Fedora/RHEL # Arch macOS (Homebrew): brew list | grep lua Windows (Chocolatey / Scoop, powershell): choco list --local-only | findstr lua 4. Проверка через интерпретатор (интерактивно). Если `lua -v` сработал, можно зайти в REPL и проверить версию изнутри: lua Затем в появившемся приглашении `>`: print(_VERSION) Выведет, например: `Lua 5.4` Выйти: `Ctrl+D` (Linux/macOS) или `Ctrl+Z` + Enter (Windows). 5. Проверка наличия заголовков и библиотек (для встраивания в C/C++). Если вы собираетесь встраивать Lua в C-проект, одного бинарника `lua` недостаточно — нужны заголовочные файлы и библиотека `liblua`. Linux/macOS: # Заголовки # Библиотеки Через pkg-config (если установлен): pkg-config --list-all | grep lua Windows (vcpkg / MSYS2, powershell): vcpkg list | findstr lua 6. Быстрый "шпаргалочный" скрипт. Универсальная проверка одной строкой (Linux/macOS): for v in lua lua5.4 lua5.3 lua5.2 lua5.1 luajit; do command -v $v >/dev/null 2> \ 7. Как установить, если Lua не установлен: - Debian/Ubuntu: `sudo apt install lua5.4 liblua5.4-dev` $ lua -v Все предложенные варианты можно разделить на две принципиально разные категории: сам язык Lua (разные версии) и Tarantool (это не Lua, а платформа, которая его использует). [Сам язык: Lua 5.1, 5.2, 5.3, 5.4] Это разные версии одного и того же языка. Они отличаются синтаксисом, возможностями и встроенными библиотеками. Главное правило: разные версии не совместимы на уровне бинарного кода (ABI), поэтому программы и C-библиотеки нужно перекомпилировать под конкретную версию. Lua 5.1. Ключевая особенность: "Классика". Не имеет встроенного типа для целых чисел — все числа являются числами с плавающей точкой (double). Для чего он нужен: если вам нужно запускать старый код или игры (например, World of Warcraft), которые писались под эту версию. Lua 5.2. Ключевая особенность: переходная версия. Всё ещё только числа с плавающей точкой, но появилось много синтаксического сахара (`goto`, `_ENV` для управления глобальными переменными). Для чего нужен: редко используется как основной выбор, скорее как "мостик" между версиями. Lua 5.3. Ключевая особенность: современный стандарт. Появились настоящие 64-битные целые числа (`integer`) и побитовые операторы. Также добавлена библиотека `utf-8`. Для чего нужен: если вам нужна точная целочисленная арифметика (например, для работы с ID, флагами или криптографией). Lua 5.4. Ключевая особенность: самая новая и быстрая версия. Улучшена сборка мусора, добавлены атрибуты `< const>` и `< close>` для управления ресурсами. Для чего нужен: Если вы начинаете новый проект и хотите использовать все последние фишки языка. [Tarantool: это не просто Lua] Tarantool — это не альтернатива Lua. Это целая платформа (NoSQL база данных + сервер приложений), написанная на C. Что внутри: в Tarantool используется LuaJIT [3], который на 100% совместим с Lua 5.1. Это значит, что синтаксис и поведение языка там — как в старом добром Lua 5.1. Зачем устанавливать: если вы хотите использовать Lua не просто как язык, а как часть высоконагруженной базы данных для создания быстрых веб-приложений или кэша. [Что выбрать?] • Учите язык или пишете скрипты для общего использования: ставьте Lua 5.4 (если нет причин для обратного) или Lua 5.3 (если нужна максимальная совместимость с современными библиотеками). Если вы просто хотите начать изучать язык, то смело выбирайте lua5.4. [Ссылки] 1. Lua about site:lua.org. |