代码之家  ›  专栏  ›  技术社区  ›  Dervin Thunk

在C中添加新特性需要哪些步骤?

  •  3
  • Dervin Thunk  · 技术社区  · 16 年前

    假设我只想通过添加一个新的 原始的 数据类型到C,比如 boolean . 做这个需要什么?

    编辑 我不太清楚。我想设计一种新的语言,它的语法与C完全相同,但是有一堆新的原始数据类型。该语言应该输出C代码,然后我将使用GCC编译可执行文件/对象文件。

    4 回复  |  直到 16 年前
        1
  •  5
  •   Jonathan Leffler    16 年前

    在评论中,您说您建议的语言(我称之为ext-c,用于扩展c)是一种DSL,旨在面向狭窄的受众(您自己、您的学生),然后您需要:

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

    看一看 Cfront 作为一个可能的想法来源。

    看看ibm informix esql/c(作为ibm informix clientsdk或csdk的一部分从ibm免费提供);有一个控制编译的脚本“esql”和一个预处理器“esql c”,它实际解析esql/c源并生成相应的c代码。程序员运行“esql”脚本来编译esql/c程序;他们不手动运行“esql c”程序,除非他们有异常反常和受虐倾向。

    请注意,任何DSL中比较棘手的部分之一就是与调试器的集成。您可以安排预处理器生成' #line 指示,有时有帮助,有时有阻碍。(在我的手稿库里,我有一篇评论 γ线 指令;我在需要调试中间C代码但仍然设法引用原始源代码时使用它。)您也可以看到lex和yacc(以及变体)如何在其输出中处理这个问题。在默认情况下(成功编译时),最好让预处理器清除中间文件,但要提供一个选项,以便保留中间文件以供检查。请注意,如果预处理器不保证所有的输出都是有效的C-因为它只是将部分输入复制到输出,而没有像C编译器那样验证它-那么您需要确保用户(程序员)可以知道源错误在原始文件中的位置,即使C编译器发现了错误,而不是ext-c编译器。

    IBMInformix4GL编程语言是一种完整的语言,由它的主编译器完全解析,然后(稍微简化)生成C代码。有一个剧本 c4gl 控制编译和链接以及预处理器/编译器 i4glc1 (而且,因为我过于简化, i4glc2 , i4glc3 和 i4glc4 太)。如果生成的C代码未能编译,则表明i4gl编译器中有一个bug——这不是用户的错误。

        2
  •  2
  •   Bojangles Vincent Baillet    16 年前

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

    您可以用任何语言(甚至是C本身)来编写解析器——任何可以接收、更改文本文件并将其写出的内容,无论是到另一个文件,还是到stdout,以便gcc读取和编译。

    希望这有帮助

    詹姆斯

        3
  •  1
  •   jay.lee    16 年前

    关于您的数据类型示例:不能将任意数据类型转换为C.Boolean,因为它比现有类型简单,并且可以很容易地用任何整数类型(通常是 #define 不管怎样)。但是假设你想要一个256比特长的整数,我们称之为 超长 . 这个 超长 类型不能直接转换为C代码,因为C中没有等效的数据类型。

    但是如果你只想把简单的东西翻译成C,听起来仅仅使用C预处理器就容易多了。

        4
  •  0
  •   Chris    16 年前

    如果您希望它得到广泛的支持,您需要说服ISO将它包含在他们的下一个标准中。据我所知,在这一点上修改c并没有太大的动力。所有有趣的事情都发生在C++中,比如C++ 0x。