Подтвердить что ты не робот

Встроенный язык: Lua vs Common Lisp (ECL)

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

4b9b3361

Ответ 1

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

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

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

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

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

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