红尘踏破逍遥境
回首何处是人间

原文网址: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

发表回复 取消回复