看板Programming
标 题Re: [问题] 如何学写COMPILER? [纯抛砖引玉]
发信站政大狂狷年少 (Sun Apr 29 19:03:00 2007)
转信站ptt!ctu-reader!ctu-gate!news.nctu!newsfeed.nthu!news.cs.nthu!WHSHS
※ 引述《[email protected] ( )》之铭言:
> hand-written 当然 faster, 不是说用 LL grammar faster,
> 为了 faster 而用 3GL 硬干也是我说过的两种极端之一
> LL 跟 LALR 的 performance 并无差别, 一个 top-down 一个 buttom-up
> 两种不同哲学, 就如开一家汽车工厂
> buttom-up 的会先卖轮胎, 引擎 (japan), top-down 先卖设计图, 车壳 (us)
差别是存在的,
因为 LALR 的做法是以 table 为主,
用 3GL 手工写大都是把 function pointers 塞到 struct array 里去,
然後被 lookup 出来的时候执行某一个,
这会让 C compiler 的 interprocedural analaysis 无用武之地,
相较之下呼叫 named function 的 recursive descent parser 会获得较佳的效率。
> 跟新旧无关, 最新的 STLport & uClibc 是会挂点的
> 要用旧的才能, 但 sigc++ 又不一定了
> 所以 toolchain 是现实问题, 不是 upgrade 会好的
> PIC, 8051, DSP 更是没别的 toolchain 可选
你要用新的 STLport,
那就要用新的 boost,
试试看 boost 1.35 吧。
不然的话就换 glibc 吧,
一般来说装不起 glibc 的系统,
通常连用 C++ 都不会考虑才对,
这其实不是 boost 可移植性不佳的问题,
而是 uclibc 的问题,
不能因为这样就把责任推托给 boost。
> yacc or ANTLR 等 4GL 在 compile time 就能找出该 grammar 有无定义失当
> spirit 无法, 是因为 C++ compiler 又不认识 LL,
> 关 runtime 做多余的 checking 什麽事
如果你说的是这个,
那的确是不少人选 ANTLR 而不选 spirit 的理由,
如果指的是 type checking,
那 spirit 会有比较好的表现,
事实上,
我用 spirit 的习惯是先把 grammar 送进自己写的 tool 来 checking,
之後才会动手写 code,
毕竟保证 grammar 符合 LL 的需求并非 spirit 的责任。
换个角度来说,
像是 yacc 这种硬性限制在 LALR(1) 的 checking 方法是不太好的,
我一直对 yacc 为什麽不能弹性支援到 LALR(k) 感到不解,
为什麽只能吐出 error 告诉 programmer 这样不行,
而且这麽多年来都没有什麽重大改进和突破。
> C 只要一开始有一个 compiler 出来, 卖 library 针对它写了 library
> 後面的 compiler 非要能跟它 link, calling convention 自然一样,
> 要能用之前的 header file, data structure 自然一样
C 被设计出来的时间点和环境跟 UNIX 密不可分,
C++ 没有这个些优势,
这才是主要原因,
C++ 照着跟 C 相同的模式走,
但这个年代 internet 和 open source 盛行,
ABI 不一样抓 source 重编就好了,
library 造成的强制性减弱,
C 并不是没有受到影响,
新出现的 architecture 如果没有制订 calling convention,
第一套 library 又是 open source 的话,
也不见得会有人去遵循第一套 toolchain 的做法。
> > 我不懂「只在内部使用」的意思,
> 就是 C++ 没有把 class 做成 binary library 的机制
> 因为 static typing 不能继承 binary class, 也没 reflection
但是这个跟 C 一样只要有 header file 就能 call 到 object method 了啊,
header file 有提供 base class 定义式就能继承它,
virtual function call 也能正确的运作,
就算没把 class 本身编译进 object file 在这方面并不会有影响,
顶多就是不能做 reflection 罢了。
> 如果真的一切向方便看齐, obj C 远比 C++ 好用,
> dynamic typing 也不过就比 static typing 多吃一点点 cpu,
> apple 就是 objC 拥护者, 但是也没别人了
往方便看齐我倒是会选 Java 或 smalltalk。
> lisp/forth 的 template 也比 C++ 强大, 但是 C++ 为何较多人用?
> 看起来要像 C 就是程式语言的包袱
这是因为 C++ 因写法而异效能可高可低,
最高可以逼近 C 甚至偶尔超越,
C 能写的东西 C++ 都能写 (而不单是语言外观相像),
Lisp 和 Forth 一开始却都没有这些背景。
--
╔═══╗ ┼────────────────────────╮
║狂狷 ║ │
* Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮
║ 年少║ ┼╮
< IP:140.119.164.252 > ╰─╮
╚╦═╦╝ ╰
* From:61-230-218-171.dynamic.hinet.net
─╨─╨─ KGBBS ─ ◎ 遨翔"BBS"的狂狷不驯;属於年少的轻狂色彩 ◎
1F:推 meltice:为什麽这一连串的讨论我都有看没有懂... 122.146.34.139 04/29 20:14
2F:→ meltice:我只会用STL的vector 至於boost没用过 122.146.34.139 04/29 20:15
3F:推 liptonbin:K只要变大一点 table会变很大 速度也变 211.76.38.229 04/29 22:45
4F:→ liptonbin:慢~不是吗!? 211.76.38.229 04/29 22:48
5F:推 tinlans:如果是人手工的话就可以作弊不会变大, 61.230.218.171 04/30 06:17
6F:→ tinlans:tool 应该也要提供类似的方法才对啊。 61.230.218.171 04/30 06:17