Зачем нам нужен встраиваемый язык программирования, такой как Lua?

Каковы типичные варианты использования встраиваемого языка программирования? Правильно ли я понимаю, что такой язык должен быть встроен в какое-то программное окружение и иметь возможность запускаться оттуда?


person Vladimir Kostyukov    schedule 04.10.2013    source источник
comment
Встроенные языки обычно используются для настройки конечным пользователем. Обычно они очень высокого уровня (т. е. динамически типизированы, собраны из мусора и т. д.) и проще в использовании, чем язык, на котором написано приложение. Иногда это делается, даже если язык никогда не предназначен для использования конечными пользователями, так что внутренний персонал (часто менее технический, например, дизайнеры) может реализовать часть приложения на языке более высокого уровня на более высоком уровне абстракции или таким образом, чтобы компоненты, которые могут часто изменяться, могли быть изменены без перекомпиляции приложения.   -  person Mud    schedule 04.10.2013
comment
@Mud, спасибо, что указали на сборку мусора! Я забыл этот очень важный момент в своем ответе. Я отредактирую его, чтобы интегрировать этот аспект.   -  person Lorenzo Donati -- Codidact.com    schedule 04.10.2013
comment
Вы лучше знакомы с этим, чем вы думаете. Каждый день миллиарды людей используют встраиваемый язык программирования: JavaScript. Он встроен в их веб-браузеры. Он выполняется в среде веб-страницы и получает доступ к объектной модели HTML-документа страницы, а также к окнам и тому подобному браузера. Lua также используется для написания фильтров в Wireshark.   -  person Tom Blodget    schedule 05.10.2013


Ответы (2)


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

Введение

Lua написан на C (почти полностью совместим со стандартом C89; несовместимые функции могут быть легко отключены при необходимости с помощью переключателей времени компиляции) и был разработан для легкой интеграции с кодом C. В контексте Lua «интегрированный» означает две разные, но связанные вещи:

  1. Вы можете легко написать код C, который можно использовать в качестве библиотеки для кода Lua. Интеграция достигается либо статическим, либо динамическим связыванием вашего кода C с кодом движка Lua. Затем на связанную библиотеку можно ссылаться в вашем коде Lua с помощью функции Lua require.

  2. Механизм Lua можно легко встроить в приложение C, т. е. связать (опять же, статически или динамически) с кодом приложения C. Затем приложение C может взаимодействовать с кодом Lua, используя интерфейс программирования приложения C Lua (Lua C -API).

Примечание: это можно сделать, приложив немного больше усилий, также с помощью приложения C++.

Преимущества встраивания движка Lua

Если ваше приложение на C включает Lua, многие, если не большинство, операций можно делегировать механизму Lua, то есть либо коду, написанному с использованием функций C-API, либо, что еще лучше, коду Lua. Код Lua может быть встроен как строки C внутри вашего кода C или сохранен как внешние сценарии Lua.

Наличие части логики вашего кода, реализованной с использованием кода Lua, имеет несколько преимуществ:

  • Lua проще (менее сложно) в изучении и использовании, чем C, и он гораздо более высокоуровневый. Он поддерживает мощные абстракции, такие как замыкание функций и объектную ориентацию (особым образом, используя таблицы Lua и метаметоды).

  • Lua — это динамический язык: он не требует «автономной» компиляции. Вы можете изменить текст вашего сценария Lua, и это все, что вам нужно для изменения поведения вашего приложения (дополнительные шаги по компиляции и связыванию не требуются). Это упрощает разработку и отладку приложений.

  • Lua — более безопасный язык, чем C: действительно сложно написать код Lua, который демонстрирует неопределенное поведение, как это предполагалось в контексте C/C++. Если сценарий Lua терпит неудачу, он терпит неудачу "громко". Более того, Lua поддерживает механизм исключений (хотя и с другим синтаксисом, чем C++), который можно использовать для реализации управления ошибками гораздо более простым способом по сравнению с C.

  • Lua, как и большинство динамических языков, является сборщиком мусора. Это означает, что программист избавлен от ручного управления динамической памятью, что является основной причиной ошибок, утечек, нестабильности и лазеек в системе безопасности в языках, в которых отсутствует сборка мусора.

  • Lua может «есть свою собачью еду», т. е. вы можете построить строку во время выполнения (даже в самом Lua), и если это допустимый код Lua, ваша программа может выполнить его на лету. Это то, что нечасто встречается даже в других динамических языках (все же это не LISP, но он становится ближе и с гораздо более читаемым синтаксисом). Это позволяет Lua-скриптам:

    • использовать мощные текстовые методы метапрограммирования, когда код Lua может генерировать другой код Lua и выполнять его на лету;

    • реализовать доменные языки (DSL) простым способом; Код Lua может загружать во время выполнения другой код Lua, созданный таким образом, чтобы отражать конкретную проблемную область, в которой он используется (синтаксис Lua прост, но достаточно гибок, чтобы допускать такие вещи);

    • может быть легко использован в качестве языка конфигурации: ваше приложение (написанное на смеси C и Lua) может использовать некоторые файлы lua в качестве файлов конфигурации без необходимости создавать специальный парсер для определенного формата файла конфигурации. Поэтому вам не нужно анализировать *.properties, *.csv, *.ini или любой другой формат, который вы бы выбрали, если бы у вас не было возможности использовать файлы Lua для этой цели.

  • Движок Lua занимает очень мало памяти (несколько сотен килобайт), обладая мощными возможностями. С очень небольшим количеством строк кода C и кучей файлов Lua вы можете создать законченное приложение, для которого в противном случае потребовались бы тысячи строк кода C. стандартный автономный интерпретатор Lua можно рассматривать просто как пример внедрения Lua в приложении C!

  • Lua имеет очень либеральную лицензию с открытым исходным кодом, что позволяет без особых проблем использовать его даже в коммерческих приложениях. . Это также позволяет модифицировать его исходный код, чтобы адаптировать его к особым потребностям.

  • Небольшой объем памяти и легко настраиваемые исходные коды C делают Lua идеальным кандидатом для переноса на встроенные системы или небольшие микрокомпьютерные системы (микроконтроллеры и т. д.). Многие части стандартных дистрибутивов Lua могут быть удалены, что уменьшит ядро ​​​​движка Lua до ~ 100 КБ. В качестве примера возьмем проект eLua, модифицированный дистрибутив Lua, предназначенный для встраиваемых устройств.

person Lorenzo Donati -- Codidact.com    schedule 04.10.2013
comment
ответ добавлен в закладки для последующего повторного чтения -- Аплодисменты за усилия! :) - person Archit; 17.08.2019

Lua и другие языки сценариев предоставляют различные преимущества в зависимости от ваших потребностей.

  • Обеспечьте быструю итерацию разработки.
  • Разрешить изменения кода во время выполнения, такие как перезагрузка вашего пользовательского интерфейса в World of Warcraft, которая перезагружает все сценарии без остановки самого игрового движка или выхода из системы.
  • Предоставьте пользователям отдельный API для своего приложения, чтобы пользователи могли расширять его, не раскрывая общественности важные части вашей системы. Например, текстовые редакторы, предоставляющие макроязык, позволяющий интегрировать пользовательское поведение, не предоставляя вам беспрепятственный доступ к внутренним компонентам самого редактора.

Область применения действительно весьма обширна и зависит от разработчика.

person Ian    schedule 04.10.2013