使用GCC扩展C编程语言

13

我想写一个扩展自C语言的编程语言。我正在发明的整个编程语言只是简化的缩写,可以转换为有效的C代码。例如:

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

将被翻译为:

void* TcpConnection_connect(char *addr)

所做的一切都只是简单的名称替换。这只是我想提供的扩展中的一个示例。另一个简单的扩展是函数重载(这将在函数名结尾处连接其参数的类型)。

无论如何,结果是完全有效的C代码。有没有不用进入gcc代码就可以做到这一点的方法?

4个回答

14

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


3

对于原型设计,也许只需要选择一种你熟悉的语言(如C、Perl、Python等)编写预处理器,然后将其构建到Makefile规则中。这样可以轻松、低成本地尝试所有功能...

使用不同的文件扩展名,将.foo转换为.c。


2

我曾经类似地嵌入汇编语言到自定义的字节码格式中,使用了一些 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语言规范。


1

你可以在http://cil.sourceforge.net/的基础上进行一些黑客操作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接