web-dev-qa-db-ja.com

非常に基本的なスクリプトをアプリケーションに埋め込む

基本的にスクリプトインタープリターとして機能するC++アプリケーションをプログラムする必要がありますが、非常に基本的で限られたスクリプトを使用します。

スクリプトの形式は次のようになります。

processedA = doProcessA(source)
processedB = doProcessB(source)
destination = mix(processedA, processedB)

これは、私のC++アプリケーションでこれが発生するはずであることを示しています(擬似コード):

while(source)
{
  processedA = doProcessA(*source);
  processedB = doProcessB(*source);
  *destination = mix(processedA, processedB);
  source++;
  destination++;
}

私の言語を解釈するための私の選択肢が何であるかわかりません。解析は簡単なはずです。自分の言語のインタープリターを作成する必要がありますか、どういうわけかllvmを使用してフローをコンパイルする必要がありますか(方法はわかりません)、c ++バインディングを備えたスクリプト言語を使用する必要がありますか?

また、これを適度に高速にする必要があります(制限はありませんが、高速であるほど良いです)。

1
m fran

多くの簡単に埋め込むことができるインタプリタがあります。特にGNU guile (および他のSchemeバリアント、たとえば libscheme )、 Lua =、 Tcl 、さらにはPython、 OCaml 、Perl(たとえば、 parrot )、 NekoVM ..

ソフトウェアが十分に普及し、その(上級)ユーザーがスクリプトを作成することを許可されている場合(つまり、スクリプト機能が文書化され、アクセス可能または構成可能である場合)、一部のリモートユーザーが多くを使用する(さらには悪用する)可能性があることに注意してください)スクリプト機能。

したがって、質問の暗黙の前提(「非常に基本的なスクリプト」)は最終的には誤りになります。ある時点で、スクリプトはもはや基本的ではなくなります!

これが、スクリプト言語が(見慣れた見た目で)十分に優れたプログラミング言語でなければならない理由です。 一部の奇妙なユーザーは最終的に数千行をコーディングします。(ところで、この社会的な問題はおそらく、Tclの有名な著者であるOusterhoutが過小評価したものです:彼は最初に最初の小さなスクリプトのTclですが、最終的には巨大なTclスクリプトを作成する人もいましたが、実際のプログラミング言語に必要な機能が意図的に欠けているため、Tclが負担になりました...効率的なデータ構造、モジュール性など。それ以来、Tclは改善されました。大幅に。)。

何らかの理由で既存のインタープリターを製品に埋め込むことができず(または望まない)、独自のスクリプトインタープリターを作成することにした場合(これは何ヶ月もの作業を意味します!)、独自の言語を設計する前に、いくつかのプログラミング言語とスクリプト言語を学習します(そして、あなたにインスピレーションを与えた言語を文書化します)。解釈されたスクリプトの適切な内部表現(少なくともいくつかの [〜#〜] ast [〜#〜] 、できればいくつかの バイトコード )を持つように注意してください。特に読む スコットの本:プログラミング言語の語用論 そして クエイネクの本:小さな断片のLISP そしていくつかの研究 ドメイン固有言語 ; ガベージコレクション 、そしておそらく アプリケーションチェックポインティング永続性 について読んでください。

JITコンパイル テクニックの使用を検討できます(例: llvmlibjitlibgccjitluajit ...)代わりに、C(またはC++)コードをその場で生成してコンパイルし、プラグインとしてdlopen-することも検討できます( [〜# 〜]メルト[〜#〜] )。現在のマシンは、 [〜#〜] repl [〜#〜] インタラクションと互換性を持たせるのに十分な速度です。

アプリケーションにインタプリタを埋め込むと、アーキテクチャに大きな影響が発生し、おそらく変更されるか、大幅に変更されるはずです。アプリケーションの設計、および上級ユーザーによるアプリケーションの使用方法に影響を与えます。

スクリプト言語はほとんどの場合 チューリング完全 であることを忘れないでください(それを避けるために設計に特別な注意を払わない限り)。 停止問題 を決して忘れないでください。

オーディオ処理の世界では、 Faustine (Karim Barkati、Haisheng Wang、Pierre Jouvelotによる)と FaustGrame フランスのチームによる)について読んでください。 )。

既存のものを使用してください-=より良いホイールが利用可能で、使用するのに安価な場合は、わざわざホイールを再発明しないでください。

Luaは最も一般的なC/C++埋め込みスクリプトインタープリターのようです。それをC++プログラムに埋め込むことに関するYouTubeチュートリアル、または codeproject もあります。

3
gbjbaanb