看板Programming
标 题Re: [问题] 如何学写COMPILER? [纯抛砖引玉]
发信站政大狂狷年少 (Wed Apr 18 02:45:16 2007)
转信站ptt!ctu-reader!ctu-gate!news.nctu!newsfeed.nthu!news.cs.nthu!WHSHS
※ 引述《[email protected] ( )》之铭言:
> ※ 引述《[email protected] (汀)》之铭言:
> > 而且是针对 flex & bison 的:
> > 当初 4.0 之所以把 C++ parser 整个拿纯 C 手工重写,
> > 有一大原因就是 flex & bison 生出来的 code 太难 debug 了,
> > 而 C++ 的 syntax 又是极其复杂 (对 compiler 而言),
> C++ 语法不复杂, 但是容易搞错, 排列组合过多
对人来说是这样,
对 compiler 来说比较难处理。
> parser 对 compiler 来说是很小的一部份, 甚至该当成独立的模组
本来就是如此,
但是就 user 的角度来看,
送合法的 syntax 进去连 parsing 都不过,
那後面的东西什麽都不用谈。
> C++ 的 templates 是 define 扩充版, 这玩意个人认为比 define 更难 debug
> trace 的时候还更是困难, 跳来跳去, 而且不同 compiler 连 STL 版本都不同
> 不是每个写 C++ 的人都会去钻一堆特殊写法, 可读性不是只针对 C++ 上瘾者
C++ 没有什麽所谓的特殊写法,
基础书籍 (圣经本) 读过一遍什麽都可以看得懂,
只是有没有那个毅力去慢慢解析而已。
#define 根本连 debug 都不用讲,
因为没有一种 debugger 能 step into macro,
如果你用 #define 做了一个 function-like macro 内含 100 行 code,
你用 debugger 去 step into 也是直接一口气飞过那 100 行,
如果这 100 行里面有问题根本求助无门
(好吧,自己复制贴上去再取代文字是一种方法),
而 template 你却可以直接很快乐的 step into。
至於 trace 这种东西是有技巧的,
没事你不需要进去看 STL 写了什麽,
会拿 debugger 去 step into 到 STL 里面的人大概也是因为不懂 STL,
该用 step over (next) 的时候就该用 step over,
什麽都 into 进去那还得了,
不管是 debug 还是 trace 都不应该是这样玩的。
有非常多人在 debug C++ 程式都忘记了一件事,
今天是因为很多 C++ compiler 不支援 export,
所以才把 template 相关的 library 实作码放在 header 上,
以致於它的实作码在多数情况下是可见的,
结果在 debug 的时候就傻傻的 step into 进去,
这是不对的,
就像你在 debug C 程式的时候,
你不会闲到 step into 进 printf()、strcpy() 之类的 lib function 一样,
你没有理由在使用 STL 的时候 step into 到 vector::push_back() 里面。
唯一受人诟病的应该是 template 实际引数表示法的易读性,
像是 string 会被展开成 std::basic_string<...> 一大串的状况,
但这种东西其实是 compiler 和 debugger 偷懒没加工所致,
其实如果每套 STL 实作能提供相关的资讯档,
这个资讯档以 compiler 和 debugger 规范的某种公约来撰写,
这类讯息就能够被化简,
事实上就算没有化简,
写了几个月的人多少有能力去抓到重点是哪,
抓不到重点的大概也是白学白写了。
> 真正优良的程式靠的是规划, 如 mozilla 用的 apple coding style
> mozilla 的程式非常好 debug, 其中的 javascript parser 比 C++ 不知麻烦多少倍
当你使用到 library 或是 tool (code generator) 时,
debug 的难度本来就会上升,
这时跟「自己写的部分」的程式规划优劣没有什麽关联性,
library 通常会提供「逐步建构」和「启动」的介面,
而 tool 通常是事先建构好再产生一个启动介面,
前者 user 可以很清楚的知道过程 (主要流程还是自己写的 code),
所以非常的容易 debug 和 trace,
後者的主要流程则是被 tool 自动产生,
像是从一个都是数字的巨大 array 读出某某值做一些事情,
然後送进 case label 成千上万又都是 magic number 的 switch 叙述里,
只有次要流程才是自己写的 code,
何者容易 debug 其实显而易见。
> javascript 充满着例外, 不完整的语句也还是要能跑, 它的 parser 才算经典
就我所知 browser 有权利拒绝这种东西并送出错误讯息,
只是因为 user 会觉得这种 browser 很难用,
所以不少 browser 才设计容错机制应对,
但是容错机制跟语法复杂度是两个不同面向的技术,
跟 C++ parser 牵涉的复杂度有着本质上的不同,
并没有任何可以加以比较的空间存在。
--
Name: Tseng, Ling-hua E-mail Address:
[email protected]
School: National Tsing Hua University Department: Computer Science
Interesting: C++, Compiler, PL/PD, OS, VM, Large-scale software design
Researching: Software pipelining for VLIW architectures
Homepage:
https://it.muds.net/~uranus
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │
* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮
< IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰
* From:61-230-229-51.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不驯;属於年少的轻狂色彩 ◎
1F:推 Dungeon:推220.141.249.204 04/18 23:20
2F:推 Arton0306:推 123.195.22.165 04/29 16:08
3F:推 twisters121:再推 61.70.53.157 05/01 16:35