7

コンパイラが存在し、自己修正コードをサポートするプログラミング言語を探しています。Lisp がこれらの機能をサポートしていると聞いたことがありますが、これらの機能を備えた C/C++/D ライクな言語がもっとあるのではないかと思っていました。

私の言いたいことを明確にするために:

実行時に何らかの方法でプログラムコードにアクセスし、コマンドの削除、コマンドの追加、変更など、あらゆる種類の変更を適用できるようにしたいと考えています。あたかも自分のプログラムの AstTree を持っているかのように。もちろん、コンパイルされた言語でそのツリーを持つことはできないので、別の方法で行う必要があります。コンパイルでは、自己変更コマンドをバイナリの同等の変更に変換して、コンパイルされたコードで実行時に機能するようにする必要があります。

私は VM に依存したくありません。それが私がコンパイルした意味です :)

4

7 に答える 7

10

おそらく、Lisp がこのようになっているのには理由があるのでしょうか? Lisp は、他の言語をプログラムし、コードとデータのシンボリック表現で計算するように設計されました。コードとデータの境界はなくなりました。これは、プログラミング言語の設計と実装に影響を与えます。

Lisp には、新しいコードを生成し、そのコードを変換して実行するための構文機能があります。したがって、事前に解析されたコードも、他のプログラムで使用されるのと同じデータ構造 (シンボル、リスト、数字、文字など) を使用しています。

Lisp は実行時にそのデータを認識します - その型またはクラスについてすべてを照会できます。クラスは、関数と同様にオブジェクトそのものです。したがって、プログラミング言語とプログラムのこれらの要素もファーストクラスのオブジェクトであり、そのように操作できます。動的言語は「動的型付け」とは何の関係もありません。

「動的言語」とは、プログラミング言語の要素 (メタクラスやメタオブジェクトプロトコルなど) とプログラム (そのクラス、関数、メソッド、スロット、継承など) を実行時に参照できることを意味します。実行時に変更できます。

おそらく、これらの機能を言語に追加すればするほど、Lisp のようになります。Lisp は、単純で動的なプログラム可能なプログラミング言語のほぼ極大値だからです。これらの機能のいくつかが必要な場合は、他のプログラム言語のどの機能を放棄する必要があるか、または放棄する意思があるかを考えてください。たとえば、単純なデータとしてのコード言語の場合、C 構文モデル全体が実用的ではない場合があります。

したがって、C ライクで「動的言語」はあまり適していない可能性があります。構文は全体像の一部です。しかし、C 構文モデルでさえ、動的言語を簡単に扱うには限界があります。

于 2009-11-03T21:49:48.623 に答える
3

C# では常に自己変更コードが許可されています。

  • C# 1 では、基本的にコードをその場で作成してコンパイルすることができました。
  • C# 3 では「式ツリー」が追加されました。これは、オブジェクト モデルと抽象構文ツリーを使用してコードを動的に生成する限定的な方法を提供しました。
  • C# 4 は、「動的言語ランタイム」のサポートを組み込むことで、その上に構築されています。これはおそらく、コンパイルされた言語で .NET プラットフォーム上で LISP のような機能に到達するのと同じくらい近いでしょう。
于 2009-11-03T21:10:12.177 に答える
2

(ほとんどの場合) 移植可能なコード生成のために、 LLVMでC++ を使用することを検討することをお勧めします。C パース ツリーで動作するようにclangを取り込むこともできます(clang は現在 C++ を完全にサポートしていませんが、C++ 自体で記述されていることに注意してください)。

たとえば、C++ で自己変更コアを記述して、clang と LLVM とのインターフェイスを作成し、プログラムの残りの部分を C で記述できます。メイン プログラムの解析ツリーを自己変更コードと一緒に保存し、それを clang at で操作します。ランタイム。Clang を使用すると、AST ツリーを何らかの方法で直接操作してから、マシン コードまでコンパイルできます。

コンパイルされた言語で AST を操作するということは、プログラムにコンパイラ (またはインタプリタ) を含めることを常に意味することに注意してください。LLVM は、このための簡単なオプションです。

于 2009-11-03T21:10:11.583 に答える
1

JavaScirpt + V8 (Chrome JavaScript コンパイラ)

JavaScript は

  • 動的
  • 自己修正(自己評価)(定義によっては、一種の)
  • C に似た構文を持っています (これも一種の動的な構文です)。

V8 でコンパイルできるようになりました: http://code.google.com/p/v8/

于 2009-11-03T21:22:21.060 に答える
0

「動的言語」は、さまざまな概念をカバーする広義の用語です。動的型付けは、コンパイル済み言語である C# 4.0 でサポートされています。Objective-C は、動的言語のいくつかの機能もサポートしています。しかし、自己修正コードをサポートするという点では、Lisp に近いものはありません。

このようなダイナミズムと自己修正コードをサポートするには、実行時に呼び出すフル機能のコンパイラが必要です。これが通訳者の本当の姿です。

于 2009-11-03T21:09:39.743 に答える
0

グルービーにしてみてください。これは、実行時にコンパイルされる動的な Java-JVM ベースの言語です。独自のコードを実行できる必要があります。

http://groovy.codehaus.org/

それ以外の場合は、常に Perl や PHP などを使用していますが、それらは C/C++/D のような言語ではありません。

于 2009-11-03T21:19:17.337 に答える
0

私は VM に依存したくありません。それが私がコンパイルした意味です :)

それだけなら、Python または Ruby をお勧めします。どちらも独自の仮想マシンと JVM および .Net CLR で実行できます。したがって、任意のランタイムを選択できます。2 つのうち、Ruby はより多くのメタプログラミング機能を備えているようですが、Python は他のプラットフォームでより成熟した実装を備えているようです。

于 2009-11-03T21:58:26.960 に答える