Встроенный язык: Lua vs Common Lisp (ECL) - PullRequest
23 голосов
/ 11 июля 2010

Есть ли у кого-нибудь опыт работы с Common Lisp в качестве встроенного языка (с использованием ECL)? Если да, то насколько хорош ECL по сравнению с Lua?

1 Ответ

24 голосов
/ 13 июля 2010

Я раньше не встраивал CL, но я сделал это как с Lua, так и с двумя конкретными реализациями Scheme (Gambit-C и GNU Guile).

Схема, на мой взгляд, является отличным встроенным языком, потому что он гибкий и не слишком раздутый. Gambit-C особенно хорош для этого, потому что он позволяет вам запускать интерпретированные сценарии, а также компилировать ваш код до C. В моих тестах сгенерированный C-код Gambit-C был лишь немного медленнее, чем рукописный C (например, конкретный тест, который пробежал 0,030 с в С, был 0,040 в Гамбите!). Gambit также имеет действительно хороший FFI (интерфейс сторонних функций), который по сути является просто Scheme со специальным синтаксисом для записи привязок к библиотекам C (ObjC и C ++ также поддерживаются напрямую). Gambit также имеет очень хороший репл с некоторыми возможностями отладки.

Guile также довольно хорош, и на самом деле он работает быстрее, чем Lua (самый быстрый интерпретируемый язык, который я знаю в настоящее время - Guile добился значительных успехов за последние годы). Но поскольку Gambit-C может компилироваться в действительно быстрый код, я обычно не использую Guile так часто, если не собираюсь использовать интерпретированный код в окончательной версии.

У Lua есть замыкания, но вы не получите продолжения, как в Схеме, и вы также не получите макросов. Тем не менее, все еще возможно сделать разумное количество функциональных вещей. У него не будет полнофункциональной объектной системы (например, CLOS в CL), но у нее есть таблицы, и их можно легко использовать для реализации наследования на основе классов и наследования на основе прототипов. Кроме того, у Lua есть превосходный C API, с которым действительно приятно работать. Он основан на стеке и разработан таким образом, что вам вообще не нужно беспокоиться о Lua-стороне управления памятью. API очень прост и хорошо организован, и есть много отличной документации и примеров кода. Lua не может скомпилировать, но он использует байт-код (всегда - когда вы отправляете код на виртуальную машину Lua, он всегда сначала компилирует этот код в байт-код, а , а затем запускает его).

Теперь, что касается Common Lisp, я думаю, что он, вероятно, не очень хороший язык для встраивания. Причина этого в том, что CL огромен. Как правило, желательно встраивать облегченный язык, потому что он будет использовать платформу / библиотеки, которые вы предоставите ей, а не так много внешних вещей.

Итак, я думаю, вы не ошибетесь ни с Gambit-C, ни с Guile, ни с Lua. Они все будут действительно хорошими. CL мощный, но я просто думаю, что он слишком большой для встраивания.

...