问问题描述
答精选答案

这是
一个五百行的C语言文件
,实现了一个最基础的Scheme解释器。具有除掉之外所有的语言特性。此外没有垃圾收集模块,没有释放任何内存,因为我的目标不是写一个完备的Scheme解释器。基本上是想到哪写到哪,没有多少注释但是变量名都比较幼稚,适合一口气从头读到尾。写一个解释器不仅仅是对初级编译原理知识点的总结和运用,更是将自己培养为代码、程序乃至编程语言的设计师路上必经的一步。比如我不喜欢一个过于复杂的词法结构,希望词法分析器对应的函数不要超过100行,那么就取消了布尔值字面量,只要在标准库里加两句话:
也就行了。那么对应的,我也可以把内建函数的数量降至最少,比如对布尔值的或与非操作就可以用普通的函数实现:
但是表达“空值”的呢?这个值是必要的,对于一些不应当返回任何值的函数和特殊形式(比如所有的断言都为假),必须依赖以维持“一切都是表达式”的原则。因此这个值就要对应着一个解释内部的类型,那么我们要怎样生成这个值呢?一种策略是把它写进词法分析器,还有一种策略是用一些看起来不那么“直观”的方式,比如:
这当中的取舍完全取决于语言的设计者,也就是解释器的编写者。站在语言的使用者的对立面进行一定的思考,对于理解其他语言中的设计有好处。
标准的Scheme中“钦定”了以列表作为其基础的也是唯一的复合数据结构,比如的结果,是可以像普通的、用构建起来的列表一样,用和进行操作的。但我们完全可以创建新的数据结构,甚至用别的数据结构替换之作为基础数据结构。这是一个与语言提供的“编程模型”息息相关的特性。比如说,你可以提供一组内建函数,对可以随机读写的数组进行封装,那么恭喜你,你写的已经不是LISP了,而是一种新的,应当被成为ARRAP(array processor)的语言的解释器。再比如说,你完全可以用普通函数定义如下一套使用Church编码的列表:
使用这一套接口创建的列表和Scheme通过创建的列表是不“兼容”的。它们有什么区别?如何提供合适的,使它和的返回值可以使用一套接口操作?这都是很值得思考的问题。
接下来我计划在这个五百行程序的基础上添加和一个读取文件的内建函数,然后用Scheme写成一个从Scheme编译到汇编的编译器完成自举,欢迎围观。
本文来自作者[独行丨翁妞妞。在]投稿,不代表公众科技网立场,如若转载,请注明出处:https://www.cpst.net.cn/changshijingxuan/202609/1581412.html
评论列表(4条)
我是公众科技网的签约作者“独行丨翁妞妞。在”!
希望本篇文章《c语言的基本模块有哪些》能对你有所帮助!
本站[公众科技网]内容主要涵盖:教育咨询,知识百科
本文概览:这是一个五百行的C语言文件,实现了一个最基础的Scheme解释器。具有除掉之外所有的语言特性。此外没有垃圾收集模块,没有释放任何内存,因为我的目标不是写一个完备的Scheme解释器。基本上是想到哪写到哪,没有多少注释但是变量名都比较幼稚,适合一口气从头读到尾。写一个解释器不仅仅是对初级编译原理知识点的总结和运用,更是将自己培养为代码、程序乃至编程语言的设计师路上必经的一步。比如我不喜欢一个过于复杂的词法结构,希望词法分析器对应的函数不要超过100行,那么就取消了布尔值字面量,只要在标准库里加两句话:也就行