Альтернативы Lua как встроенному языку?
Я работаю над встроенной системой под управлением Linux на DSP. Теперь мы хотим сделать некоторые его части скриптовыми и ищем хороший встраиваемый язык скриптов. Эти сценарии должны хорошо интегрироваться с существующей базой кода C++, быть небольшими и быстрыми.
Я понимаю, что Lua - отраслевой выбор для подобных проблем. Мы, вероятно, пойдем с Lua, потому что он проверен и подтвержден стабильностью и так далее. Тем не менее, как язык программирования, он имеет несколько причудливых углов.
Итак, какие есть альтернативы для встраиваемых языков?
РЕДАКТИРОВАТЬ:
Это примерно через год.
Мы фактически использовали Lua в нашей встроенной системе, и она работает на удивление хорошо. Со временем мы добавили все больше и больше поддержки сценариев во все больше и больше частей проекта, и это действительно помогло реализовать его.
Производительность выдающаяся, правда. Даже довольно сложные операции, включающие поиск по длинным массивам или операции со сложными строками, работают на удивление хорошо. Мы вообще никогда не сталкивались с проблемами производительности Lua.
Взаимодействие с функциями C очень просто и работает очень хорошо. Это позволило нам безболезненно развивать систему сценариев.
Наконец, мы были поражены тем, насколько гибкой оказалась Луа. Наш интерпретатор Lua должен работать в системе с нестандартным распределителем памяти и без поддержки двойного типа данных. В одном заголовочном файле есть два хорошо документированных места, которые нам пришлось изменить, чтобы заставить Lua работать в этой системе. Это действительно хорошо подходит для встраивания!
9 ответов
Поскольку вы говорите "встроенная система", "маленький и быстрый" и "хорошо интегрируете", я бы сказал, что вы правы, что Lua - номер один, если не единственный выбор. Но я больше не согласен с тем, что у языка программирования есть "причудливые углы". Во-первых, книга "Программирование на Lua" просто великолепна, одна из лучших книг, которые я когда-либо читал. Во-вторых, некоторые "причудливые углы" происходят из-за того, что язык очень ортогональный и чистый, что в конечном итоге является преимуществом, а не недостатком. Я считаю, например, JavaScript намного хуже. Если вы читаете "Хорошие части Javascript", автор подробно объясняет, почему некоторые конструкции в языке являются ошибками проектирования и почему следует избегать нового оператора. В Lua все не так, плохие части были удалены, например, причудливое повышение стоимости было заменено на стандартную синтаксическую область видимости в версии 5.x.
На самом деле, я считаю, что Lua - это язык с гораздо менее причудливыми углами, чем большинство других языков! Мы используем его в коммерческом проекте, и мы более чем довольны.
Я искренне рекомендую Lua для вашего случая использования. Тем не менее, Forth - это альтернатива, особенно для встроенных устройств с ограниченными ресурсами, о которой пока не упоминалось.
Там всегда Лисп.:) Но это подчеркивает тот факт, что Lua на самом деле менее "причудливый", чем большинство языков. Он был разработан для непрограммистов и читается как псевдокод. Он имеет чистую, унифицированную семантику (вложенные функции первого класса с лексической областью видимости; множественное присваивание; множественные возвращаемые значения; единый, гибкий механизм структурирования данных с синтаксисом чистого конструктора и т. Д.), Что делает его очень простым для изучения, чтения, записи и т. Д. Это также оказывается неожиданно мощным и выразительным (правильные вызовы хвоста, продолжения, метапрограммирование и т. Д.).
Единственный действительно "изворотливый" аспект Lua - это то, что индекс массива равен 1, и тот факт, что он не заимствует соглашения C, как все остальные (~=
скорее, чем !=
, --
скорее, чем //
и т. д.), но они в основном причудливы глазами программистов, привыкших к C-подобным языкам.
Альтернативой может быть Squirrel, который вдохновлен Lua, имеет схожие цели, но С-подобный синтаксис. Я не использовал это, хотя, так что я не знаю хорошо, что это соответствует его целям.
Более свежая альтернатива - крапивник:
Wren - это небольшой, быстрый язык параллельных сценариев на основе классов.
Wren - это язык сценариев. Wren предназначен для встраивания в приложения. У него нет зависимостей, небольшая стандартная библиотека и простой в использовании C API. Он компилируется чисто как C99, C++98 или что-то более новое.
Tcl был спроектирован с нуля, чтобы быть встроенным языком, и существует уже несколько десятилетий. Кроме того, это идеальный выбор для разработки предметно-ориентированного языка из-за его высокой расширяемости.
Я не знаю много о мире DSP, но когда вы гугляете "dsp lua" и "dsp tcl", вы получаете вдвое больше хитов для Tcl.
С вашими требованиями (небольшая занимаемая площадь, небольшие причуды и интеграция с C++) я могу думать только о Common Lisp.
Некоторые люди в этом другом вопросе SO рекомендуют CFFI для интеграции его с C.
Но я бы остался с Луа, если бы я был там, где ты.
Вы рассматривали Python? Есть хорошее руководство по расширению и встраиванию. Если вы используете Boost, Boost Python является библиотекой для кажущейся интеграции между C++ и Python.
Я понимаю, что Lua - отраслевой выбор для подобных проблем.
Смелое утверждение! Я хотел бы предположить, что если вы уже используете Linux, выбор широко открыт. Сам Linux отнюдь не является "отраслевым выбором" для встраиваемых систем; "индустрия" гораздо более раздроблена, чем эта.
Язык, который реализуется практически в любой системе, независимо от производительности, размера и ОС (или даже без ОС), - это Forth. Возможно, не самый модный язык, но легко реализуемый и расширяемый.
Другим кандидатом может быть ch, который является встраиваемым интерпретатором C/C++, поэтому вы можете использовать один и тот же язык для скомпилированного и скриптового кода.
Попробуйте Pocketpy и его живую демо-версию .
Pocketpy — это легкий (~10000 LOC) интерпретатор Python для написания игровых сценариев, построенный на C++17 с использованием STL.
Он призван стать альтернативой lua для написания игровых сценариев с элегантным синтаксисом, мощными функциями и конкурентоспособной производительностью. pkpy чрезвычайно легко встроить с помощью одного заголовочного файла Pocketpy.h без внешних зависимостей.