原文网址:http://www.wikihow.com/Create-a-Programming-Language
作者:TandraS, Leona, JirachiQueen, Nicole Willson and 10 others
翻译:龙之冰点
很多人对他们每天都在使用的编程语言感到不解和困惑。一些人喜欢把要处理的问题抽象化,而另一些人则不喜欢,他们希望更有"标准"特色。无论你是一个职业IT人员,还是业余爱好者,很多时候你都会想要创建一个新的编程语言。
步骤
1. 熟悉术语。
编译器作者通常使用不知名的术语,先读一读编译器说明再进行下一步,确保你已经知道了所有需要知道的知识。
2。 确定你的编程语言要解决的问题。
它只针对特定领域的问题吗?还是一种通用的编程语言?
3. 想一想你的语言的语义和语法。
o 你允许直接指针访问吗?
o 你的语言是什么类型的?
o 它是静态还是动态语言?
o 内存模型是怎样的呢? 你要使用垃圾回收机制还是手动内存管理?(如果你使用垃圾回收机制,要准备自己写一个或者把现有的回收机制移植到你的语言里)
o 如何处理并发线程? 你要使用简单的线程/锁定模型还是一些更复杂的东西,比如Linda或Actor模型?(因为现在的计算机都是多核的了)
o 是否嵌入原始函数到语言里?还是所有功能都从库导入?
o 你的语言使用哪种编程模式? 函数?面向对象?原型 (像是javascript)?面向方面?(译注:AOP)面向模板?或者是什么全新的东西?
o 你的语言准备怎样连接已有的库和语言(主要是C)? 这一点很重要,如果你创建的是一个特定领域的语言。
o 最后一个问题你在第二步里已经回答过了,这将帮助你进入下一步。
4. 想一想别人会用你的语言运行什么样的特殊任务。
比如,"他们也许会想要控制机器人直线行走"或"他们也许会想要创建移动应用程序",又或者"他们也许想要用它来创建网页应用"。
5. 对上面例子中的语法进行试验。
o 谨慎一点,一定要保证语言的上下文无关性,你的语法分析器和你自己都会在稍后表示感谢。
6. 写出正式的语法规定。
7. 确定你的语言是解释型还是编译型的。
解释型意味着你的用户会经常在编辑器中编辑程序并直接解释运行,而编译型意味着你的用户会写好程序、编译并运行。
8. 写一个前端扫描器和分析器,或者找一个工具帮你完成这些事。
o 还要想一想你的编译器/解释器会怎样警告用户的语法错误。
9. 使用分析器信息输出对象代码或中间表示。
分析器创建AST树,再从AST树使用三地址指令或它老哥SSA创建对象代码,然后建立语法表,以此来定义你的函数、全局变量等等。(通常是一个二叉树)
o 取决于你的语言特性,你可能会想要创建虚拟指针表或者类的信息表(为了反射机制RTTI)。
10. 编写执行器或代码生成器,把所有东西组合起来。
11. 编写许多测试程序测试你的语言。
o 你要建立相应方案强调你的语法正确性,你的编译器要接受在你的定义范围内的所有东西,拒绝不在范围内的任何东西。
12. 考虑用户会怎样调试他们自己的程序。
13. 如果你的语言使用了一个标准库,你会想要把它写下来。
还有垃圾回收机制或其它你需要的运行时功能。
o 具体来说,如果你写一个编译器,操作系统会在你的代码运行前执行一些操作,比如分配所有的全局变量。
14. 发布你的语言和说明书,为它准备一些例子说明你可以用它来做什么。
o 不要忘记写下该怎样与现有的库和语言整合,还有怎样使用运行时功能和(或)标准库。
提示
开始设计你的语言但不要编写任何代码,直到你不满足了并且已经解决了所有(或大多数)设计相关的问题或难点,在早期更改设计要比后期容易得多。
为了你的编译器/解释器,你需要充分了解你的目标平台(操作系统和库),你将在平台上使用并控制它。
警告
如果你不知道自己在做什么,那么设计编程语言是件很困难的事, 这需要大量的练习。
想一想你是否真的需要一个新的语言,你的语言有哪些其它语言没有的东西(可能是一些功能的组合或者单一的某个功能)。
为语言设计准备些时间,因为一旦你写完了编译器,离开了设计原点,你将很难再对你的语言进行大的改动。
不要尝试将多种语言的特性组合起来,像是由X语言、Y语言和Z语言组合而成(编程语言的发展历史已经告诉我们,这样创建的语言永远也不会成功,而人们会愿意使用C语言替代PL/I语言。
你所需要的:
耐心。
语言特性和语言设计的知识 (建议阅读《Programming Language Design Concepts》一书,作者David A. Watt)。
编译器理论知识(鉴于你将为你自己的语言设计编译器/解释器,你的程序实现就是理论的实践。
使用你的语言(记住,像C和Lisp这样被广泛使用的语言都是为特定需求设计的,比如创造Unix系统和符号计算)。
2 responses
原来你的博客比我的还懒得更新~
@民警小刘
是很久没更新了 存了点东西没发