向C添加新功能需要哪些步骤?

时间:2010-09-26 19:36:59

标签: c programming-languages

假设我想通过向C添加新的原始数据类型来创建新的编程语言,比如boolean。需要做什么?

编辑:我在这里并没有说清楚。我想设计一种新语言,语法与C完全相同,但有一堆新的原始数据类型。这种语言应输出C代码,然后我将使用GCC编译可执行文件/目标文件。

4 个答案:

答案 0 :(得分:5)

在评论中,你说你提出的语言(我称之为Ext-C,对于扩展C)是一个针对狭隘观众(你自己,你的学生)的DSL,那么你需要:

  • 编写代码来解析Ext-C,识别哪些部分是纯C,哪些部分是Ext-C。
  • 编写代表Ext-C转换为C的C代码生成器。
  • 将其组装到预处理器中,该预处理器读取Ext-C源文件并写入C源文件。
  • 编写一个编译器脚本(或程序),处理参数解析并在Ext-C文件上运行Ext-C预处理器,然后再运行C编译器进行其余的翻译。

Cfront视为一种可能的想法来源。

查看IBM Informix ESQL / C(可从IBM免费获得,作为IBM Informix ClientSDK或CSDK的一部分);有一个控制编译的脚本'esql'和一个实际解析ESQL / C源并生成相应C代码的预处理器'esqlc'。程序员运行'esql'脚本来编译ESQL / C程序;他们不会手动运行'esqlc'程序,除非他们有异常的反常和自虐条纹。

请注意,任何DSL的一个棘手部分是与调试器的集成。您可以安排预处理器生成“#line”指令,这些指令有时会有所帮助,有时甚至会阻碍。 (在我的脚本库中,我有一个注释#line指令;当我需要调试中间C代码但仍然设法引用回原始源代码时,我使用它。)你可以看到lex如何和yacc(和变体)也在它们的输出中处理它。默认情况下(在成功编译时)让预处理器清理中间文件也是一个好主意,但要提供一个选项,以便中间文件可供检查。请注意,如果您的预处理器不保证所有输出都是有效的C - 因为它只是将输入的一部分复制到输出而不像C编译器那样验证它 - 那么您需要确保用户(程序员)可以告诉即使C编译器而不是Ext-C编译器发现错误,源错误仍在原始文件中。

IBM Informix 4GL编程语言是一种完整的语言,由其主编译器完全解析,然后(过度简化)生成C代码。有一个脚本c4gl来控制编译和链接,还有一个预处理器/编译器i4glc1(因为我过度简化了i4glc2i4glc3和{{ 1}})。如果生成的C代码无法编译,则表明I4GL编译器中存在错误 - 这不是用户的错误。

答案 1 :(得分:2)

我猜你可以在新语言和GCC之间编写一个shell脚本或预处理器,将你添加的小位转换成普通的C语法。可以把它想象成一个层,就像GCC的预处理器一样。

你可以用任何语言编写解析器,甚至是C本身 - 任何将文本文件输入,更改并将其写出的文件,或者写入另一个文件或stdout以供GCC读入和编译。

希望这有帮助

詹姆斯

答案 2 :(得分:1)

关于您的数据类型示例:您不能将任何任意数据类型转换为C.布尔值,因为它比现有类型更简单,并且可以很容易地用任何整数类型表示(因为它通常是{{1}无论如何)。但是说你想要一个像256位长整数的东西,我们称之为 superlong 。此 superlong 类型永远不能直接转换为C代码,因为C中没有等效的数据类型。

但是如果你只想将简单的东西翻译成C语,那么使用C预处理器听起来会更容易。

答案 3 :(得分:0)

如果您希望广泛支持它,您需要说服ISO将其包含在下一个标准中。据我所知,目前修改C的动力并不大。所有有趣的东西都发生在C ++中,比如C ++ 0x。