11

私は自分のプログラミング言語をCプログラミング言語の拡張として書いてみたいと思います。私が発明しているプログラミング言語全体は、有効なCコードに変換される単純な略語です。たとえば、次のように行われていることすべてが単純な名前の置き換えであるgccでcプログラミング言語を拡張

void* TcpConnection_connect(char *addr) 

namespace TcpConnection { 
    void* connect(char *addr) 
} 

はに変換します。これは私が提供したい拡張機能のほんの一例です。もう一つの単純な拡張は、関数のオーバーロードです(これは、関数名の終わりに引数の型を連結します)。

いずれの場合でも、結果は完全に有効なCコードです。 gccコード?

答えて

13

言語を解析してCにコンパイルしてgccに渡すプリプロセッサを書くことができます。これはC++の初期実装がどのように機能したかですが、LLVMのclang、これはいくつかのC言語をサポートするように設計されており、LLVMの一部としてモジュール化され、拡張が容易なように設計されています。

2

プロトタイプ用には、あなたの選択した言語(C、Perl、Pythonなど)で書かれているものをMakefileルールに組み込みます。他のファイル拡張子を使用し、.fooを.cに変換してください。

0

あなたはクランが別のオプションですhttp://cil.sourceforge.net/

の上に何かをハック可能性がありますが、それは最も有用なコード書換ツールではありませんし、そのパーサのフロントエンドを変更すると、その簡単ではありません。

1

C99マクロマジックとPerlを使用して、カスタムバイトコード形式のアセンブリ言語を埋め込むのに似たようなことをしました。

マクロ

#define x3_pragma_(...) _Pragma(#__VA_ARGS__) 
#define x3_asm(...) ((const struct x3instruction []){ \ 
    x3_pragma_(X3 ASM __VA_ARGS__) \ 
}) 

取得するPerlスクリプトにパイプます

((const struct x3instruction []){ 
#pragma X3 ASM exit = find val(0) 
}) 

x3_asm(exit = find val(0)) 

変換

((const struct x3instruction []){ 
{ { { X3_OPFINDVAL, { .as_uint = (0) } }, { X3_OPEXIT, { 0 } } } }, 
}) 
GCCとのperlの

サンプル呼び出しは次のようになります。

gcc -E foo.c | perl x3pp.pl | gcc -o foo.o -x c - 

それはstricly必要以上に複雑だが、私はそれが有益なCプリプロセッサは私のカスタムプリプロセッサの前に実行されることがわかった、と私も使用していることを言っていますプラグマ、ソースは正当なままです。

関連する問題