Common Lisp を組み込み言語として (ECL を使用して) 使用した経験のある人はいますか? もしそうなら、ECL は Lua と比べてどれくらい優れていますか?
2 に答える
私はこれまでCLを組み込んだことがありませんが、Luaと2つの特定のScheme実装(Gambit-CとGNU Guile)の両方で組み込みました。
私の意見では、Schemeは柔軟性があり、肥大化しすぎないため、優れた組み込み言語になります。Gambit-Cは、インタプリタスクリプトを実行し、コードをCにコンパイルできるため、この点で特に優れています。私のテストでは、Gambit-Cで生成されたCコードは、手書きのCよりも少し遅いだけでした(たとえば、 Cで0.030秒実行された特定のテストは、Gambitでは0.040でした!)。Gambitには、非常に優れたFFI(外部関数インターフェイス)もあります。これは、基本的に、Cライブラリへのバインディングを書き込むための特別な構文を備えたSchemeです(ObjCおよびC ++も直接サポートされています)。Gambitには、いくつかのデバッグ機能を備えた非常に優れたreplもあります。
Guileもかなり素晴らしく、実際にはLuaよりも高速に実行されます(私が現在知っている最速のインタプリタ言語-Guileは近年大きな進歩を遂げました)。しかし、Gambit-Cは非常に高速なコードにコンパイルできるため、最終バージョンでインタプリタコードを使用する予定がない限り、通常はGuileをあまり使用しません。
Luaにはクロージャがありますが、Schemeのように継続を取得することはできず、マクロも取得できません。ただし、妥当な量の機能的な処理を実行することは可能です。完全な機能を備えたオブジェクトシステム(CLのCLOSなど)はありませんが、テーブルがあり、クラスベースの継承とプロトタイプベースの継承の両方を非常に簡単に実装できます。また、ルアは優れています一緒に仕事をするのは本当に楽しいCAPIです。スタックベースであり、メモリ管理のLua側についてまったく心配する必要がないように設計されています。APIは非常に明確でよく整理されており、優れたドキュメントとサンプルコードがたくさんあります。Luaはコンパイルできませんが、バイトコードを使用します(常に-コードをLua VMに送信すると、常にそのコードが最初にバイトコードにコンパイルされてから実行されます)。
さて、Common Lispに関しては、おそらく埋め込みにあまり適した言語にはならないだろうと思います。この理由は、CLが巨大であるということだけです。一般に、軽量言語を埋め込むことが望ましいのは、提供されたプラットフォーム/ライブラリを使用し、外部のものはそれほど多くないためです。
ですから、Gambit-C、Guile、Luaのいずれでも間違いはないと思います。それらはすべて本当に素晴らしいでしょう。CLは強力ですが、埋め込むには大きすぎると思います。