用gcc扩展c编程语言

时间:2011-01-18 21:14:18

标签: c gcc compiler-construction programming-languages translation

我想编写自己的编程语言作为c编程语言的扩展。我正在发明的整个编程语言只是简单的转换为有效的c代码。例如:

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

会转换为:

void* TcpConnection_connect(char *addr)

所做的一切都是简单的名称替换。这只是我想提供的扩展的一个例子。另一个简单的扩展是函数重载(这将连接到函数名称末尾的参数类型。

在任何情况下,结果都是完全有效的C代码。有没有办法在不进入gcc代码的情况下这样做?

4 个答案:

答案 0 :(得分:14)

您可以编写一个预处理器来解析您的语言并将其编译为C,然后将其传递给gcc。这就是C ++早期实现的工作原理。但是,您可能更喜欢破解LLVM的clang,它旨在支持多种C系列语言,并且作为LLVM的一部分,其设计也更加模块化,更易于扩展。

答案 1 :(得分:2)

对于原型设计,可能只需使用您选择的语言编写的预处理器(C,Perl,Python ...),然后将其构建到Makefile规则中。只是为了获得一种简单,低成本的方式来尝试全部......

使用其他文件扩展名,然后将.foo转换为.c。

答案 2 :(得分:1)

您可以在http://cil.sourceforge.net/

之上破解某些内容

Clang是另一种选择,但它不是最有用的代码重写工具,修改它的解析器前端并不那么容易。

答案 3 :(得分:1)

我做了类似的事情,使用一些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。