开发

 

如果你仅仅有一般程序设计的基础,直接要设计一门语言是有难度的。结合我个人的经验,以下路径应该比较适合语言初学者:

  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,类型推导和静态分析等等。 在这点上更有发言权;
  • 最后也是最重要的,充分理解你的需求,才能在诸多语言要素间做出取舍。

第一件事情是先把语言设计出来。设计语言(尤其语义)需要的知识是形式语言理论、类型论等,而非编译原理。在这阶段要考虑的东西包括:
  1. 编译还是动态解释?(JIT 也算编译哦)
  2. 静态类型还是动态类型?
  3. 函数是不是 first class?
  4. 是否要引入宏?
  5. 是否要引入对象?如果是,是否要引入类?它们之间关系如何?
  6. 等等等等……
等你设计完语义就要设计语法。语法设计很繁琐,因为要处理歧义。
等上面的都做完,就可以写编译器了。
 
 

你要学牛顿站在巨人的肩膀上看问题(不过不是让你去学他怎么骂胡克)。因此在设计一门语言之前,你应该把目前重要(不一定代表流行)的语言全部学会,包含但不限于


C#:面向对象做得最好的,而且很多语言的yield return和await就是从这里抄的,而且人家还有披着linq皮的monad。

Haskell:包含了最多纯函数式和类型推导的内容

erlang:什么是actor

prolog:原来写程序还可以通过描述一个对象(不是以方程的形式)来让计算机自己求解

lisp:你得从这里学会continuation passing style

delphi:跟C#差不多,但是人家是用引用计数的,而且不对class做任何垃圾收集

ruby:人家的DSL做得多好

perl和:主要是学习如何把regex/xml什么的完美的嵌入到语法里面

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓当然我觉得最重要的是↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

C++:著名的多范式语言(如果你连小小的模板元编程都搞不定我觉得你还是不要试图创造语言了,没戏的),

菊苣最近还在持续更新C++模板的教程

 

F#:告诉你函数式也是可以不纯并且面向对象的,而且作为一门函数式语言,完全贯彻了【我自己也能做控制流】的思想,完爆上面的yield return和await——这个功能叫computation expression——如果你牛逼甚至可以写library来完爆erlang

↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


你还可以来看一下我做的 也是一门自带cps变换、语法上的描述能力跟lisp的宏毫无区别的、严肃的编程语言,只是长得跟别人略有不同。哦,对了,我还实现了multiple dispatch,好像我还没有在什么靠谱的语言里面看到如此重要的feature,能与之一比的也就只有ruby的open class了,至少它可以用迂回猥琐的方法来实现等价于multiple dispatch的东西。


当然,站在程序设计语言的角度上,有一些大家很喜欢的语言,纯粹是当做反面教材来用的。反面教材的标准就是,所有的feature都没有一个是站在所有语言的顶端的(看我上面的例子明白什么是“至少xxx功能比别的语言都好”)。包含但不限于:

python、javascript、go、C


===========================================================


一门语言在程序语言的角度上是不是好,跟他的library毫无关系,跟他能够写出怎样的library才有关系。一个library还不存在,有可能代表他写不出来,也有可能代表只是没人去写。当你试图创造一门语言的时候,你就不能以大众的标准来衡量他,譬如说【我大python有numpy!】。其实哪个语言不能有numpy?只是没做罢了。所以在numpy这一点上,大部分语言都是一样——能做。你关心的就是这些,能,还是不能。而不是有,还是没有。譬如说【我大go有channel!】——这是微软很多年前的后来改名叫midori的C#操作系统项目早就给C#实验性添加的东西就不说了,F#的computation expression也好,erlang的actor也好,哪个不比go的channel强?再说了,Java的库为什么用起来就是不如C#的舒服,这完全是因为Java的语法导致的,而不是人类的想象力导致的。


好了,当你能够准确的指出上面所说的所有语言的任何功能的好处、坏处、解决的问题、带来的坑之后,你大概就可以站在巨人的肩膀上来设计一门语言了。然后你要关心的问题就变成了:


1、我想用这门语言来解决什么问题(你说他是general purpose的也可以),因此需要什么样的语法,才能提供称手的library。

2、怎样实现他才够牛逼。

3、到底有没有比别的语言好的地方(否则就跟go一样成为反面教材了,新的都不是好的,好的都不是新的)。

4、学习设计指令集和虚拟机,或者JIT(也就是说要编译成x86)。


当你学会了设计,也学会了实现的时候。估计也差不多熬成大牛了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

对雪书空武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值