簡體   English   中英

用gcc擴展c編程語言

[英]extending the c programming language with gcc

我想編寫自己的編程語言作為c編程語言的擴展。 我正在發明的整個編程語言只是簡單的轉換為有效的c代碼。 例如:

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

會轉化為:

void* TcpConnection_connect(char *addr)

所做的一切都是簡單的名稱替換。 這只是我想提供的擴展的一個例子。 另一個簡單的擴展是函數重載(這將連接到函數名稱末尾的參數類型。

在任何情況下,結果都是完全有效的C代碼。 有沒有辦法在不進入gcc代碼的情況下這樣做?

您可以編寫一個預處理器來解析您的語言並將其編譯為C,然后將其傳遞給gcc。 這就是C ++早期實現的工作原理。 但是,您可能更喜歡破解LLVM的clang,它旨在支持多種C系列語言,並且作為LLVM的一部分,其設計也更加模塊化,更易於擴展。

對於原型設計,可能只需要使用您選擇的語言編寫的預處理器(C,Perl,Python ...),然后將其構建到Makefile規則中。 只是為了獲得一個簡單,低成本的方式來嘗試一切......

使用不同的文件擴展名,然后將.foo轉換為.c。

你可以在http://cil.sourceforge.net/上破解一些東西

Clang是另一種選擇,但它不是最有用的代碼重寫工具,修改其解析器前端並不容易。

我做了類似的事情,使用一些C99宏魔法和Perl為自定義字節碼格式嵌入匯編語言。

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

轉變

x3_asm(exit = find val(0))

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

通過Perl腳本獲取管道

((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 -

它比嚴格必要的更復雜,但我發現C預處理器在我的自定義預處理器之前運行是有益的,而且我也喜歡使用編譯指示,源保持合法C.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM