看板Programming
标 题Re: [问题] 如何学写COMPILER? [纯抛砖引玉]
发信站政大狂狷年少 (Fri Apr 27 22:42:34 2007)
转信站ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.cs.nthu!WHSHS
> rule1 =
> (xxxx >> yyyy >> zzzz)[&action1]
> | (aaa >> bbb)[&action2]
> | ...
> ;
> 虽然在更复杂的情形下 spirit 的版本会看起来乱一点,
> 但是 programmer 用 debugger 跳进去的时候大都可以看到完整的 rule,
> 而且他们也有办法选择要不要 step into 到里面去,
> debug 起来自然容易,
> 不是作者的人看起来也比较简明易懂。
重看了一下,
我想也许我需要补上一些说明,
一次回太多,
容易造成片段部分的字省到常让人看错意思。
这边和前面的 yacc 并非对等比较,
spirit 和 yacc 的 debugging 方式不同,
上文所说的「跳进去的时候」,
跟使用 yacc 的状况是完全不同的,
事实上使用 yacc 的情形并没有对应的 runtime 时间点,
因为对等的时间点发生在 run yacc 的时候。
spirit 的 debugging 重心有别於 yacc,
template metaprogramming (TMP) 厉害的地方在於提前侦测错误,
尤其是将 runtime 的 bug 往前提到 compile-time,
所以用 yacc 的角度去类比 spirit 可能会对上文造成错误解读;
事实上在很多 yacc 要到 runtime 才 debug 得出来的 cases,
spirit 可以在 compile-time 侦测 (包括 yacc 在 union 运用上会有的问题);
这也有 trade-off,
就是 error messages 长度的问题,
但是熟悉 TMP 的 programmer,
或是熟悉如何使用以 TMP 设计的 lib 的 programmer 而言,
就能很快抓到重点并找出问题,
毕竟就是某处写错造成 type mismatch,
而这个「某处」事实上也有明确的行号。
grammar 和 semantic actions 搭配上的错误,
在使用 spirit 的状况下是在 compile-time 就能侦测,
除非是 dynamic parser,
但这用 debugger 一步一步走都会「路过」,
所以并不难追踪;
而自订的 semantic actions 设计内容的错误,
第一因为它不是 $ 来 $ 去的东西,
第二它的 breakpoint 非常好下 (跟 yacc 的状况比起来),
只要不是呆到进了 parse() 还在用 step 走的人,
拖到 runtime 才出现的 bug 也比 yacc 好抓得多。
不必怀疑为什麽进了 parse() 就不该用 step 走,
这就跟没有人无聊到把 .y 生出来的 .c 里面所有的 #line 全拔了,
然後进去看 yyparse() 里面那堆由 yacc 所生出来的 C code 一样。
--
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-220-241.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不驯;属於年少的轻狂色彩 ◎