当你在纠结学Python还是Java时,大二学生已经开始造编程语言了!
作者:媒体转发 时间:2019-02-22 21:08
我在之前的文章中说过多次,大学生在校期间应该去搞定那些基础知识,因为大学生没有工作的压力,有大块的时间,基础知识相对枯燥,要想有成就感,可以做一些简单的系统,例如一个简单的编程语言,一个有基本功能的OS......
杨韬是我的知识星球“码农翻身”的一个大学生,他在星球提到做了一个简单的编程语言解释器,我建议他把过程给写出来, 就是这篇文章了。

下文的“我”就是杨韬。
为什么要自己写一个解释器?
从大学开始学习编程, 现在已经快两年了, 接触了不少的编程语言。最开始入门学了C语言; 后来想写安卓软件, 学了Java; 接着接触后台开发,学了Python; 后面又陆续地接触Go, Dart, C++。 仔细算算, 已经接触过6门语言了!
但是仔细想想我似乎又什么也没有学到,过年回家的时候, 遇到一个对计算机很感兴趣的四年级的小朋友(ps: 小朋友会写一点点python, html, 现在的小孩也太强了), 问了我诸如计算机上面的程序是怎么跑起来的, 代码是怎么运行这种看似很基础的问题, 可悲的是我居然对这些问题似懂非懂, 不能给小朋友很清楚地解释出来。
我都不好意思说自己是学计算机的了, 居然连这些基础的问题都没有搞清楚。 这是促使我去深入学习编译原理, 计算机组成原理和操作系统这些基础知识的重要原因。
学习编译原理最简单的方法(对我来说)大概是自己实现一门编程语言, 虽然费时费力, 不过能对整个过程有个清晰的了解。
另外一个重要原因是有一种想要自己写一门语言的冲动。 尤其是在学了这么多门语言之后就会萌生出这样的念头。不同的语言有不同的让我喜欢的特性: Python有漂亮简洁的语法, 静态语言Go实现了像动态语言一样的鸭子类型的接口, Dart有很多语法糖和方便的异步… (当然这些特性是仁者见仁, 智者见智的)。
但是又不能找到一门语言,具备所有自己喜欢的特性, 那就自己写一个好了,可以把自己喜欢的特性都加上。
学习的过程
学校的编译原理的课程安排在了大三, 我还没有学过, 所以一切都是从0开始。 我先看了前桥和弥写的《自制编程语言》一书, 这本书的实战性很强, 没有介绍太多的理论知识, 而是直接教你怎么写编程语言。
我从这本书中了解了写一门编程语言的大致过程和大致的思路。 不过书中的很多解释不够充分, 对于完全没有接触过编译技术的人来说还是有点费解(也可能是我自己理解能力不够好)。
我也是在自己了解了大致思路后就开始自己尝试写, 然后再回过头来看书, 看作者提供的源代码, 才能比较好地了解作者是在干嘛。
还有一些书中内容介绍的不够充分, 比如yacc和lex的使用。 这种工具毕竟比较流行, 网上找找别人写的博客多看看, 自己再多尝试就能很好地掌握。
因为更喜欢在实战中学习, 所以前期只是了解了大致思路没有特别深入的学习理论知识, 就直接开始码代码了。 在具体实现的过程中遇到问题, 再去看书或是网上寻找答案。
设计和实现
我选择写一个动态语言的解释器, 而不是静态语言的编译器。
之所以要写解释器, 不是因为我更偏好动态语言, 其实相比而言我更喜欢静态语言。 真正的原因是, 我觉得这只是第一次尝试, 很多东西都不会, 肯定会写得很烂的,不如先就写动态语言, 等真正学得比较好了, 再回过头来写一门自己喜欢的语言。
正式开始写代码前, 我还要给这门语言取个名字,虽然只是个练手的项目, 不过还是得有个名字吧。 取名字还正不是一件容易得事, 就像给函数或者类取一个恰如其分的名字一样。
听说恰当的函数名或类名还能反应整个项目的设计是否合理, 逻辑清晰, 语言的名字似乎并没有这样的意义。
我脑袋里闪过的第一个名字是Cactus(仙人球, 仙人掌)。 我觉得很喜欢这个名字, 就把Cactus暂时留个我要写的静态语言了(希望我真的会写, 没有白留)。 仙人球是植物(正好是静态的), 同样带刺的动物是刺猬(Hedgehog)。 动物是动态的, 正好符合我要写的动态语言, 于是就叫Hedgehog了。
前面提到了lex和yacc, 我在自己写的编程语言里面也使用了这两个工具做词法分析和语法分析。 既然是自己要写一门语言为什么还要用别的工具呢? 当然不能以”不重复造轮子”作为借口, 我就是为了造轮子才想要自己写编程语言的, 真正的目的是为了简单。



