编译器如何工作的?不知道你想过没有。
查看代码
这里的代码有很大的改进空间,甚至有一些错误的处理,但可以看出一些基本的思想。用js实现了一个初步的lisp解释器。
参考文章
这篇文章是用一种不太熟悉的语言写的,仔细阅读还是可以理解作者想要表达的思想,他考虑到了初学者的局限,里面的推荐书籍很不错。
学习函数式程序设计真的有很多好处(逼格),带来了一些思想(胡思乱想),会想到以前没注意的地方(如各个系统的报错信息)。会思考程序的运行情况(让代码容易调试),会经常重构代码(这个可能和经验有关),慢慢理解语言的类型信息(这个也可能和看的书籍有关)。总之,你懂的。
学习编译原理的主要一个方面,是想理解为什么我的语言不能这么做,我怎么才能实现这些功能。另一方面,由于工作的关系,我已经用过四五种编程语言了,它们语法不一,有时候很累的。我不想再羡慕别人学过某些神奇的语言了。
到处都写到"解释器的主要过程: 解析语言>生成中间表示>最后产生输出"。但是具体如何?不打开箱子,怎么能心甘。做为非科班出身,去实现一些经典程序,补习基础理论当然是很有必要的。
希望自己尽快实现一些有价值的东西,整天做着别人设计的模块,感觉是在混工资呀。如果我熟悉某种语言,那么我可以表达一些我的想法。如果暂时没有想法,看看别人在做什么应该是不错的。
如果对js不熟悉,对函数式不熟悉。不用怕,我推荐一篇Java写的四则运算解析和简单json解析的文章。 如果对这些没有兴趣,你喜欢操作XML,那么我要送出一篇XML解析相关的。
当你看不懂上面的文章,也许你基础不够好或者工作内容的关系没有接触到一些预备知识,需要我的另外一篇文章 补充一下数据类型基的文章。
郑重说明,大多数人是愚蠢的,包括我自己。很多知识是网上或书上看来的记忆碎片,毕竟没有原创的东西。写文章的原因,整天抄代码,抄文章来体验一把(看看写作有什么不同,我以前作文都是低分)。
写代码只能在特定条件下,运行结果不出错误。文章肯定只能引起少数人的共鸣,但是哪怕一个人也是值得的。
最近在多看阅读里面看了一些技术书,当然大多数看不懂,只好安慰自己道懂一点也好。前段时间阅读了几本投资类书籍,那里的作家用完全不同的思维和词汇,关心完全不同的问题。我们很多时候都忘了自己想要做的事情,跳出一个领域然后再回来,也许会有所不同。
对于一般的语法形式,如Pascal之类需要一定的语法解析步骤,首先做词法分析再做语法分享,才能生成想要的程序结构(lexer->parser->ast)。这个过程可以手写,或者利用工具,由于语法多变复杂,实现起来有一定的难度。核心的当然是根据程序结构做处理,如if语句,function定义语句,很多人是到不了这一步的,反而错过了很多重要的东西。接下来,树的遍历,需要一些基本算法支持,加上错误处理,高级的还有优化,就会变得很复杂。
只有简化问题,才能得到一点点答案。参考的文章里面用的是s表达式这种数据结构(e1 e2),类似于线性表,以后看程序的时候希望能看到结构,而不是字符串。