5

私は非常に多くの文字列操作を行う C プログラムに取り組んできましたが、ある種の特別なケースの処理のために微調整して再コンパイルする必要が非常に頻繁にありました。優れた文字列操作をサポートするスクリプト言語を埋め込むことは、このプロジェクトにとって理にかなっているかもしれないと考えていました。

Cプログラムへの埋め込みが容易でありながら、最高の文字列操作サポートを提供する言語は?

追加の背景として...

  • パフォーマンスはかなり重要です (特に起動時間)
  • 複数のプラットフォームで簡単にコンパイルする必要がある (Linux、Solaris、Win32 (理想的には MinGW を使用)、Darwin)
  • 5年後も存在する言語である必要がある

私は Python (おそらく重すぎる?) と Lua (おそらく文字列操作に重点を置いていない?) を少し調べましたが、それらについて十分に理解しているわけではなく、他にどのような選択肢があるのか​​ もわかりません。

4

8 に答える 8

10

Luaを使って後悔したことはありません。

アプリケーションに埋め込むのは非常に簡単です。実際、今では通常Cアプリケーションを作成せず、Cライブラリを作成してLuaから制御するだけです。

テキスト操作は最高の機能ではありませんが、Cだけの場合よりもはるかに優れています。また、LPEGライブラリを使用すると、パーサーの作成がほぼ簡単になり、正規表現を恥ずかしく思うことができます(ただし、必要に応じて、正規表現に似た構文がいくつかあります)。

于 2009-08-15T03:55:08.010 に答える
5

Luaは、他の選択肢よりも際立っています。

...埋め込みが簡単でありながら、文字列操作のサポートに最適ですか?

Lua はC に組み込まれるように設計されています。API は明確で使いやすい。ドキュメントは素晴らしいです。

他のいくつかの応答は、Lua の文字列機能を中傷しています。彼らは Lua を過小評価していると思います。Lua の文字列機能は、実際には「単なる連結」と正規表現の完全な複雑さの間のスイート スポットを見つけます。文字列のフォーマット機能は非常に強力で、「バッファ」またはテーブルを介して文字列を蓄積するのは簡単で効率的です。

文字列のスキャンは、私の意見では、設計の最良の部分の 1 つです。「または」パターンはありませんが、それ以外の場合は、非常に強力でエレガントな「キャプチャ」機能を含む、正規表現から得られるもののかなりの部分を提供します。たとえば、すべての文字をキャプチャして関数を適用することで、文字列を 16 進数に変換できます。

s:gsub('.', function(c) return string.format("%02x", string.byte(c)) end)

または、非英数字、非スペース文字を 8 進数にエスケープできます。

s:gsub('[^%w%s]', function(c) return string.format([[\%03o]], string.byte(c)) end)

ここに表示されている機能の一部:

  • 文字列スキャンのエスケープ文字は です。これは、文字列引用のエスケープ文字で%ある とは異なり\ます。この決定は素晴らしく、それだけで賞を受賞するはずです:-)

  • 文字をエスケープする必要がない[[...]] など、リテラル文字列を引用するメカニズムは複数あります。バックスラッシュを含む文字列を生成または照合する場合 (LaTeX など)、これは天の恵みです。

コンテキストフリー パーサーのフル パワーが必要な場合は、Lua の設計者の 1 人が作成したライブラリであるLPEGをいつでも使用できます。

パフォーマンスはかなり重要です (特に起動時間)

Lua は常にパフォーマンス賞を受賞しています。起動は非常に高速です。システム全体 (コンパイラ、ライブラリ、ガベージ コレクタ、ランタイム システムを含む) は 150 KB に収まります。一時停止時間を回避するために、Lua はインクリメンタル ガベージ コレクションを提供します。SO の質問も参照してください。なぜ Lua は他のスクリプト言語よりも速いのですか?

スクリプトをプリコンパイルすることで起動をさらに高速化できますが、これを行う必要があるとは思いませんでした。また、(ソース コードとは対照的に)コンパイルされたコードは移植性がないため、プリコンパイルは通常、解決するよりも多くの問題を引き起こします。

複数のプラットフォームで簡単にコンパイルする必要がある

Lua は純粋な ANSI C を使用してコンパイルし、POSIX も必要としません。PalmOS PDA で動作するバージョンがあります。

5年後も存在する言語である必要があります。

Lua は 1993 年から存在しています。さらに、最も多くのサポートを提供しているチームの 2 人のメンバーは、PUC-Rio の終身教授です。ルアは彼らの生計です。最後に、システム全体のコードはわずか 17,000 行です。明日、Rio が地図から外れても、学部の優れたコンパイラ コースを持っている人なら誰でもシステムを手に入れて維持することができます。ボランティアはたくさんいるでしょう。

Python と Lua について少し調べましたが、それらについて十分に知りません。

SO の質問を参照 してください。Lua と Python のどちらのゲーム スクリプト言語を使用するのが良いですか? .

于 2009-08-15T15:49:25.173 に答える
3

人々は、何年もの間、より大きなプロジェクトにtclを組み込んでいます。何かにtclを使わなければならなかったので久しぶりです...

tclを他のプログラミング言語と一線を画すものの1つは、すべてが文字列であるということです。

参考までに、文字列関数に関するtclドキュメントを次に示します。

tclはperlよりも埋め込むのが簡単かもしれませんが、@MatthewScharleyの推論に同意する必要があります。また、tclはそのパフォーマンスで正確に知られていませんが、おそらくそれは近年変更されています。

とにかく、Cアプリケーションへのtclの埋め込みに関するtcl wikiリンクと、ページからの関連する引用は次のとおりです。

「既存のC(またはC ++)アプリケーションにTclインタープリターを埋め込むにはどうすればよいですか?」非常によくある質問です。それは簡単で、Perlや一般的にPythonで同じことをするよりも確かにはるかに簡単です。さらに、この種の「埋め込み可能性」はTclの当初の目標の1つであり、多くのプロジェクトがそれを実行しています。利用可能なトピックの完全な議論はありませんが、ここで概要を説明できます。(RWT 2002年10月14日)


もう1つの方法は、Luaを使用して、選択した別のC文字列ライブラリで拡張することです(たとえば、GoogleはThe Better String Libraryを提供します)。

Luaをアプリケーションにコンパイルしたら、C関数をLuaのインタープリターに「拡張」できます。または、組み込みの文字列関数で十分かもしれません。

確かにいくつかのオプションがあります。

于 2009-08-15T03:41:59.533 に答える
3

さまざまなスクリプト言語の埋め込みAPIの相対的なメリットに関する優れた調査論文があります。

H. Muhammad and R. Ierusalimschy. C APIs in extension
and extensible languages. Journal of Universal Computer
Science, 13(6):839–853, 2007.

優れた文字列操作と優れた埋め込みAPIの両方を組み合わせることを検討すると、次の順序で提案します。

  • Ruby:正規表現の構文サポートを含む優れた文字列サポート。適切に設計された埋め込みAPI、非常に使いやすい。
  • Lua:文字列のサポートがどのようになっているのかはわかりませんが、埋め込みに最適な言語になるはずです。
  • Python:Rubyよりも埋め込みが簡単ではなく、文字列機能を使用するのが少し難しいです。しかし、それはパイレックスを持っているので、それを埋め込むためのより簡単な方法かもしれません。
  • PHP:厄介なAPI、厄介な言語。埋め込みSAPIは実際には二流市民ですが、機能します。文字列操作機能はたくさんあります。それでも、私はそれをお勧めしません。
  • Perl :(私が聞いた限りでは)埋め込むのは厄介ですが、文字列のサポートはもっと良いかもしれません。

TCLについてコメントすることはできませんが、埋め込み用に設計されていると聞きました。

于 2009-08-15T11:02:04.560 に答える
1

Python はまったく重量級ではありません。埋め込むのは非常に簡単で (こちらは公式ガイドですが、多くのチュートリアルも見つけることができます)、非常に強力で、文字列処理に最適で、全体的に快適で使いやすい言語です。それはボーナスである巨大なユーザーコミュニティとサポートベースを持っています.

Python は、多数の実際のアプリケーションにも組み込まれています。私がすぐに思いつく 1 つのクールな例は、Civilization IV ゲームです。そのほとんどは、C++ API 上の Python スクリプトで実行されます。

于 2009-08-15T07:10:23.763 に答える
1

同意しない人もいるかもしれませんが、Sara GolemanはPHP の拡張と埋め込みに関する素晴らしい本を出版しています。これは、最も広く使用されている言語の 1 つになりつつあります... :)

PHP 文字列のサポートは、Perl ほどではありませんが、非常に便利です。

Cで書かれていると言いましたか?</my2cents>

于 2009-08-15T07:01:58.663 に答える
0

Perl。その(元の)存在理由は文字列操作です。

于 2009-08-15T03:37:18.217 に答える