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

向C添加新特性需要哪些步骤?,c,programming-languages,C,Programming Languages,假设我想创建一种新的编程语言,只需向C添加一个新的基元数据类型,比如boolean。要做到这一点需要什么 编辑:我在这里说得不太清楚。我想设计一种新的语言,其语法与C语言完全相同,但有一系列新的原始数据类型。这种语言应该输出C代码,然后我将使用GCC编译可执行文件/对象文件。如果您希望它得到广泛支持,您需要说服ISO将其包括在其下一个标准中。据我所知,在这一点上,修改C的动力并不大。所有有趣的事情都在C++中发生,比如C++ 0x.< /p> 我想你可以编写一个shell脚本,或者在你的新语言和

假设我想创建一种新的编程语言,只需向C添加一个新的基元数据类型,比如
boolean
。要做到这一点需要什么


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

如果您希望它得到广泛支持,您需要说服ISO将其包括在其下一个标准中。据我所知,在这一点上,修改C的动力并不大。所有有趣的事情都在C++中发生,比如C++ 0x.< /p> 我想你可以编写一个shell脚本,或者在你的新语言和GCC之间的一个预处理器,把你添加的小比特转换成普通的C语法。将其视为一个层,就像GCC的预处理器一样

您可以用任何语言编写解析器,即使是C本身——任何可以接收、更改文本文件并将其写出的语言,可以是另一个文件,也可以是标准输出,以便GCC读入和编译

希望这有帮助


James

关于您的数据类型示例:您不能将任意数据类型转换为C。您可以,因为它比现有类型更简单,并且可以很容易地用任何整数类型表示(通常是
#定义
d)。但是如果你想要一个256bit长的整数,我们称之为超长。这种超长类型永远不能直接转换为C代码,因为C中没有等效的数据类型


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

在评论中,你说你建议的语言(我称之为Ext-C,用于扩展C)是一种面向有限受众(你自己,你的学生)的DSL,那么你需要:

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

看看IBMInformixESQL/C(作为IBMInformixClientSDK或CSDK的一部分从IBM免费获得);有一个脚本“esql”控制编译,还有一个预处理器“esqlc”,它实际解析esql/C源代码并生成相应的C代码。程序员运行“esql”脚本来编译esql/C程序;他们不会手动运行“esqlc”程序,除非他们有反常的反常和受虐倾向

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


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

语言只是一组终端符号和语法。可以使用编译器、解释器或人工将其翻译成任何目标语言。(不是开玩笑。在我年轻的时候,我确实手动将Z80汇编程序翻译成实际的机器代码字节。)这些都不是设计语言所必需的。(虽然如果有办法实际使用一门语言,它有助于普及该语言。
:)
)@Dervin,但你的问题也让我有点困惑。。。语言设计是一回事,实现解析器、编译器或transpiler等,因为该语言是另一回事,两者是相互独立的。对于语言设计,通常参考编译器书籍,如经典的“龙书”(编译器设计原则),用于实现解析器等。我只需要查找lex/yacc或flex/bison教程/书籍。您可以使用macro@fuzzy. 哇!请容忍我。我说的是数据类型,一种语言的原语。#define在您看来是否像一个原始数据类型?如果包含
,C99有一个类型
bool
(它还定义宏
true
false
,并且
bool\u true\u false\u定义了
);它的类型是
\u Bool
,与是否包含
无关。谢谢,但这将是研究某些算法的DSL。。。我用过,也许