瞎扯淡 吐槽一下现在的程序语言教科书

ptmagic · 2013年07月08日 · 最后由 ptmagic 回复于 2013年07月11日 · 6705 次阅读

为什么没有一门语言是能够自己写一个自己的编译器,来作为教材的,貌似看到 Haskell 有说怎么实现数据结构的,scheme 有说自己怎么做编译器还是解释器的(sicp)。其余的语言就没有消息了........

教科书还是重理论吧,貌似教程和演讲有一些..

ruby 的有个半小时写解释器的演讲: 还有个 jsjs,不过是用 emscripten 转的,有个 paper: http://jeffterrace.com/docs/jsjs.pdf

编译器不好写啊,另外 SICP 也没实现 scheme

本身自己描述自身就是难点。 摘自知乎: 在编译原理的世界里,自举是一个很重要的话题。一个很经典的例子:GCC 语言的编译器是 C 语言写的,但第一个 GCC 编译器是用另一个编译器编译的;那么顺着这个根源向下跟踪,我们迟早必须回答这个问题,即世界上第一个编译器是什么语言写的——答案是汇编。那么这样下去,我们最终发现,任何程序设计语言都不能完全用自己描述自己。

还可以挖下去: 汇编编译成机器码, 而通过数字逻辑电路设计 CPU, 就是实现机器码的解释器

但数字逻辑电路, 可以用编程语言描述和验证...

#4 楼 @luikore 数字逻辑电路只是逻辑被验证了,电路其实没有 ...

#5 楼 @bhuztez 然后模拟电路可以用虚拟仪器软件验证, VI 软件就是编程语言实现的, 对电路描述语言的解释器...

#4 楼 @luikore 当时看了你的熊和物理圣剑,去学习 Haskell 去了,可惜 Haskell 目前已知的传闻有实现了 perl 6 ,和 1000 行 Haskell 实现 java,结果发现学起来各种脑裂

让我想起 gcc 后门的故事。因为通过机器码写入,后续的 gcc 都是通过 gcc 编译出来的,所以,永远都有这个漏洞……

#2 楼 @bhuztez 额,我不求别的,能用 common lisp 实现 Haskell 或者 ruby 不?

#6 楼 @luikore 要是真可以,新工艺直接上就行了

#7 楼 @ptmagic -_- 果咩那塞! 用 haskell 基本是写编译器的 hello world 的... 但编译器不仅仅是 parse 和 AST, 各方面都有很深的水...

haskell 做的话, parsec 一上来就 PEG, 缺少各种文法基础和 monad 熟悉度的话还是有点不明所以. 你想整的语言的文法基本是 CFG 描述的, 在 LtU 找设计文档抄到 happy 之类的基于 CFG 工具里, 文法解析基本就好了...

非 haskell 实现可以用 bison / antlr 做文法解析

#9 楼 @ptmagic 你可以去看看 Guile

#10 楼 @bhuztez 理论是的, 但完整电路验证的计算复杂度是 non-polynomial 的, 结果往往只能做近似...

#11 楼 @luikore 应该是除了 parse 和 AST,都有很深的水

#13 楼 @luikore 对了,lazy 的坑你还没填呢

#15 楼 @bhuztez 算填了吧... 原理上就和我回的那帖一样, 只展开 ast 而不做计算...

#16 楼 @luikore 你回的那个就是错的

The Little Schemer 的最后就实现了一个简单的 scheme 解释器,这本小书非常有趣。

#16 楼 @luikore 用 haskell 基本是写编译器的 hello world 的.....................................................我觉得用 lisp 更靠谱点

#19 楼 @ptmagic 但一般人也就只能写写Hello, world! ...

#18 楼 @edgar_wang_cn 额,貌似我在看 common lisp ,scheme 宏不够猛

#17 楼 @bhuztez 模糊的要求只能得到模糊的实现... 我实现了一个完全 lazy, 我怎么知道它是不是你要的... 或者你要的 lazy 是一个函数? 还是把整个程序的语义都变成 lazy? 如果是后者的话, 程序如何去区分 IO 来 "flush" pure 操作攒下来的 AST? 或者你还要我设计一个类似 monad 的东西去区分 pure / non-pure ...

需求里 test case 都没有太伤人了...

#22 楼 @luikore 参考 SICP ,整个程序的语义都变成 lazy,自己琢磨去...

#21 楼 @ptmagic parser 和 AST 变换什么的只是处理语法层面的代码花的时间 只占一小部分 。后端代码生成将花掉你 90% 的时间,另外,运行期支持库也要花掉你另外 90% 的时间。

#24 楼 @bhuztez lisp 的宏貌似比较适合干这事啊,lisp 的 parser 的时间应该是理论最短的吧,同样生成新代码的时间最长的,应该是 python 和 haskell 这种靠缩进来控制语法结构的的语言吧。lisp 这方面毫无压力啊

#23 楼 @bhuztez -_- 好费劲, 是 ch4.2 么, 吃饭回来给你写一个

#26 楼 @luikore 你的好费劲就是吃顿饭的功夫 -_- !!!!!!!

#27 楼 @ptmagic 是我的错, 一开始就没仔细看书...

#25 楼 @ptmagic 我是说写代码的时间,不是运行时间。语法层面的处理其实都还算简单的。语义层面的不匹配才是真花时间的地方。

#28 楼 @luikore lisp 写编译器是不是很牛逼?还有就是关于 scheme 还是 commonlisp 哪个适合写编译器

#30 楼 @ptmagic 不了解... 如果 lisp 有类似 esoteric languages implemented in ruby 这样的书的话应该也挺牛逼的

话说作者还写过自制 OS, 萌化版自制 CPU 之类的奇书...

#31 楼 @luikore 看不懂日文。这书干嘛的?有说 ruby 写出 python,haskell,prolog 的编译器的具体步骤吗?

#32 楼 @ptmagic 书里介绍的不是这些普通的语言, 是 18 种像 HQ9+ 之类的奇怪语言的实现法...

#33 楼 @luikore 有英文版没?

#34 楼 @ptmagic 大概没, 太小众了出版商赚不到钱...

#35 楼 @luikore 看到 F 大推荐过... 发现好贵

3 楼那个说法根本就是错的。自举确实很难,但是不是不能实现。

语言书就讲语言,编译留给编译书,有什么好吐槽的 会写编译器的,看了语言书/spec 就能自己实现,用不着语言教科书来废话

#38 楼 @reus 对啊,我想的是为什么没有语言书讲一些基本的语言后,就用这些语法来自举生成整个编程语言。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号