ランタイム クラスの作成をサポートするフレームワーク/言語のリストをまとめようとしています。たとえば、.NET では、System.Reflection.Emit
ライブラリを使用して、実行時に新しいクラスを生成できます。これ(またはそのバリエーション)をサポートする他のフレームワーク/言語について言及できれば、それは本当に役に立ちます。
ありがとう :)
ランタイム クラスの作成をサポートするフレームワーク/言語のリストをまとめようとしています。たとえば、.NET では、System.Reflection.Emit
ライブラリを使用して、実行時に新しいクラスを生成できます。これ(またはそのバリエーション)をサポートする他のフレームワーク/言語について言及できれば、それは本当に役に立ちます。
ありがとう :)
Objective-Cはそれをサポートしています(objc_allocateClassPair)
JavaScript では関数はオブジェクトです。したがって、次のような関数定義が与えられます。
function Foo(x, y, z)
{
this.X = x;
this.Y = y;
this.Z = z; var g = function()
}
次のように新しいオブジェクトを作成できます。
var obj = new Foo(a,b,c);
しかし JavaScript では、実行時に関数を作成できます。
function MakeFoo(x, y, z, f) //where parameter f is a function
{
var g = function()
{
this.X = x;
this.Y = y;
this.Z = z;
this.DoSomething = f;
}
return g;
}
var my_class = MakeFoo(a, b, c, function() { /* Do Stuff */ });
var obj = new my_class();
obj.DoSomething();
Python、Ruby などの動的言語 ...
あなたが何を意味するかに応じて、どの言語でも可能です。
たとえば、C++ はできます。一見すると、これはばかげています。C++ は静的に型付けされたコンパイル済み言語です。つまり、プロジェクトに LLVM ライブラリを含めるだけです。これはコンパイラのバックエンドであり、これを使用してクラスを記述し、コンパイルし、LLVM JIT を使用して実行することができます。これらはすべて、アプリケーションの実行時に実行できます。
IIRC、gcc バックエンドは C で記述されているため、そのコードを理解しようとする場合は、原則として、クラスさえ持たない言語を使用して実行時にクラスを定義できます。
いずれにせよ、あなたの仕事の一部は、クラスが正確に何であるかを定義することです。クラスは、さまざまな型システムを持つさまざまなフロントエンド言語をサポートすることになっているため、コンパイラのバックエンドには組み込まれていません。
もちろん、私はこのアプローチを推奨しているわけではありません - それが可能であることを指摘しているだけです。