如何自创一门计算机语言

  1. 需要有基本的编译原理常识。构造基本的编译原理常识,一方面来自于对已有语言的使用经验,了解基本术语。比如用C,那么起码知道语言要素包括宏、表达式、语句、语句块、函数、指针等;还知道C语言有编译、链接和执行三个阶段。这些基本概念对宏观掌握学习进程是很有必要的。另外一方面编译原理的常识,要来自图书。比如龙书、SICP。在这一步,得知道大部分语言的处理都要分为词法、语法、语义和代码生成四个阶段。每个阶段,分别是做什么的。
  2. 了解具体的编译算法。了解到什么程度,取决于使用第三方工具,还是需要自己从字符开始处理。个人建议,乔姆斯基文法体系、(扩展)巴克斯范式(EBNF),正则表达式,和LL(1)的递归下降分析法是必须要掌握的。对LL(k),LR(k)要有概念。其中,四则运算表达式的分析是很好的练习。
  3. 对语法的感觉。初学者设计语言的难度有两点。第一,不知道什么样的语法/语义是需要的;第二,不知道设计的文法能否实现。如果练习过递归下降法,应该已经有了基本的感觉。这个时候可以试图实现熟悉的语言。一些常用语言的Grammar Rule都是可以查到的。虽然这些语法,特别是C++,可能是上下文相关的所以用书上的办法难以实现,但是可以实现它的一个子集。通过这样的练习,能对掌握的分析算法能完成什么样的工作就有了个大致的体验。
  4. 深入了解自己的领域,明确需求。是需要一个类似于自然语言的脚本,还是只是一个表达式。经过3阶段的训练已经有了独立撰写语法的能力。可以写一个基础版本的出来。
  5. 实现自己的语言,特别是词法和语法部分。这一步最好能Log出尽可能多的信息,例如词列表并打印出分析树。
  6. 当有了分析树后,就可以去做语义分析了。对于初学者而言,语言的规模要尽可能小,这样语言的解释和语义分析可以合为一体,不用担心哪个部分算是代码生成,哪个部分算是语义分析。所以这一步最好能把解释器也写出来。这一步的要求很简单,知道符号表是做什么的,学会归纳和推导类型,能正确的处理分支和循环语句(如果有的话)。
  7. 设计一门类似于ASM的VM语言,可以是堆栈机模型,也可以是寄存器机模型。撰写代码生成从语法树上生成这个VM语言出来。并写一个VM的执行器。这一步看起来无从下手,实际上只要肯写,不出一个礼拜就知道怎么做了。一开始这个VM语言可以只用做整数的加减乘除就行了,以后可以慢慢加其他比较重要的特性,比如运行栈啦、代码地址啦,跳转啦等等。另外,把LLVM作为目标也是不错的选择,起码指令的解释不用自己费工夫了,LLVM的手册读起来也很容易。那个Tutorial写的特别好。

至此,语言就初步建立完成了。但是因为一开始能力有限,所以设计出来的语言是磕磕巴巴的。这个时候可以选择:

  • 向某个现有的语言靠拢;
  • 自己去了解现有语言的机制并进行权衡。这个时候什么动态/静态类型,函数是first class,类和对象才是该考虑的问题。这个时候一定要多读、多用现有的语言。拜编译器经验所赐,会站在一个不同角度上来对待现有的语言;
  • 学习Functional Programming,这对设计更好用的文法、更快的编写和修改编译器都有莫大的帮助。例如可以使用Combinator在C++中以类似于DSL的方式配置语法;
  • 剩下的就是在Language领域无止尽的挖掘了。上下文相关的语法、语法糖的设计、运行时的辅助机制(例如async,await这些广义上的控制流语句),GC,类型推导和静态分析等等。;
  • 最后也是最重要的,充分理解需求,才能在诸多语言要素间做出取舍。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 04:34:36

如何自创一门计算机语言的相关文章

201671010111 2016-2017-2《Java程序设计》新学期一门新语言的新学习

大学第三个学期的学习开始了,一门新的语言--java列进了本学期的学习任务当中.带着一份憧憬却又难免有点惧怕,课本是从未有过的厚大,老师说带着我们将它读薄.似乎有了征服的力量. 第一节理论课老师告诉大家这学期的课程将施行"反转课堂教学法".对于从来都是以上课老师在讲,我们学的上课方式进行学习的我们而言.前期难免是有点困难的,但是我们会努力地去做到这些并追求做得更好.这样的上课方式可以提升我们自主学习的能力,培养我们的自学兴趣,使得我们在学习上处于主动方,而不只是被动的在学,在接受.&q

Perl,第一种后现代计算机语言

在吴涛大哥的博客上提到这篇文章<Perl,第一种后现代计算机语言>,原文链接:http://www.wall.org/~larry/pm.html 尝试翻译一下(已经发了邮件给Larry Wall,并且征得他的许可),有些句子太哲学,翻译不懂,作者是Perl的设计者,只供学习阅读使用.这里感谢我的英语八级同事在一些翻译上给予我很大的帮助.这篇东西拖的有点久,是我15年的计划之一,现在竟然把这个任务拖到了16年了,毕竟自己在这新的一年里有新的目标,所以会把旧的坑先给填上,后面的一些地方翻译的不是

如何入门计算机语言,变身菜鸟程序员

身边非计算机专业的同学.朋友蛮多的,说自己也就只会写几行Hello world!. 计算机高级语言分为面向对象 和 面向过程的语言. 所有语言都可以用面向过程的方式去开发,但是面向对象不一定了,C语言就是一门只能面向过程的语言. 现在大家经常能听到的 譬如 C++,C#,Python,Java,go等等等等 都是支持面向对象的. 且不分过程还是对象 一门计算机语言,它需要什么?也就是所有的计算机语言它们有什么共同点? 1. 变量  强类型的语言 比如c java等都需要指定一个变量的数据类型,像

看武侠学编程_以九宫格为例介绍强大的声明式语言Prolog

如果要给众多编程语言分个类,你可能会把它们分成低级语言和高级语言,或者分成面向对象语言和面向过程语言.然而,更多中国程序员所不太熟悉的另外一种划分方式将会把计算机语言分成命令式和声明式两大阵营.之所以说大家可能不太熟悉这种划分,那是因为我们平常所使用绝大部分语言都是命令式的.但事实上你确实也应该注意到另外一大阵营的存在. 命令式编程(ImperativeProgramming)是现今最为广泛使用的编程范型.读者所熟知的众多计算机语言,如C.C++.Java.Pascal.Basic.Python

我与Visual Basic的那些事儿

公元2000年,IEEE计算机协会的一份期刊<Computing in Science & Engineering>上,两位客座编辑Francis Sullivan和Jack Dongarra遴选出了20世纪科学与工程的实践与发展上最具影响力的十大算法[1].随后,Barry Cipra又在SIAM News上发表文章对这十大算法进行了综述[2].2016年,SIAM的主席Nick Higham对原来的十大算法列表进行了些许调整,并给出了自己的名单[3].两份名单在十大算法中的七项上基

还在吐槽翻译的外版书质量差吗?谈谈我个人的理解

很难想象哪个学习计算机技术的人是没看过这方面书籍的,如果只是在网上看看技术贴,那样得来的知识绝对是离散的,不系统的.而要真正学好一门学问(比如一门计算机语言或者一门技术),一本好书的作用是不言而喻的.很多人抱怨国人在技术图书方面抄来抄去,不求甚解,虽然出版图书者甚众,但最终成为精品者却凤毛麟角.于是,更多读者热衷于外版书.但显然,并非所有国人的外语水平都足以在阅读原版书籍时毫无障碍.那么退而求其次,寻求翻译版就成为一种看似不得已的选择. 不幸的是,网上对于翻译版书籍的吐槽可以说从未消停.我也看过

C语言课程学习的总结

本学期c语言的学习接近尾声,对此颇有感触,感受良多,随着考试的结束,c语言学习也告了一段落. c语言是一门计算机语言,用最原始的方法输入计算机,向我们展示它的神奇.它可以让我们更好的了解计算机,与计算机交流. 同时也是我们往后学习的基础,是重中之重.所以,c语言的学习对我们是很重要的. 在本学期的c语言学习中,遇到了不少的困难,但有些还是可以解决的.对于c语言的学习,虽然不是很会,但是也有自己的看法. 首先,在c语言的学习中,上课前自己要懂得去预习,尤其是一些知识点的概念和用法,还有教材的经典例

Life is short, you need Python

今年四五月份的时候我打算学一门计算机语言. 计算机语言实在是很多,选哪一个? 其实这个选择就和去市场买菜类似,想明白了自己的需求才能做好决定.你想做什么饭,就去买什么菜.想做南瓜粥,就要去买南瓜,想要做番茄炒蛋,就得买西红柿鸡蛋. 因为我没有编程基础,所以就想要选择一个容易入门的,所以就选了python. 图片中衣服上印着“人生苦短,我用python”这句话的人正是python之父,Guido van Rossum(吉多•范罗苏姆). 1989年圣诞,Monty Python"s Flying

Java 中的 i = i++

转载:http://soft.chinabyte.com/database/279/11431779.shtml 关键字:Java 学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试: JAVA: public class test { public static void main(String args[]) { inti,j; i=0; for(j=0;j<5;j++