看板Programming
标 题Re: [问题] 如何学写COMPILER? [纯抛砖引玉]
发信站KKCITY (Wed Apr 18 14:44:48 2007)
转信站ptt!ctu-reader!ctu-peer!news.nctu!netnews.chu!Leo.mi.chu!zoonews.ee.nt
※ 引述《[email protected] (汀)》之铭言:
> ※ 引述《[email protected] ( )》之铭言:
> > C++ 语法不复杂, 但是容易搞错, 排列组合过多
> 对人来说是这样,
> 对 compiler 来说比较难处理。
parser 只是负责把 C++ code 转成内部 structure,
会出问题通常是内部表示 data structure 没规划好
因为 template/class 产生的资料量超大, worst case 没估好爆掉
不然就是写的人误解 C++ 语法
C++ 对人应该是比对机器复杂, 人可记不得那麽多解读优先顺序
可以用 BNF 都算好 parse
> > C++ 的 templates 是 define 扩充版, 这玩意个人认为比 define 更难 debug
> > trace 的时候还更是困难, 跳来跳去, 而且不同 compiler 连 STL 版本都不同
> > 不是每个写 C++ 的人都会去钻一堆特殊写法, 可读性不是只针对 C++ 上瘾者
> C++ 没有什麽所谓的特殊写法,
> 基础书籍 (圣经本) 读过一遍什麽都可以看得懂,
> 只是有没有那个毅力去慢慢解析而已。
> #define 根本连 debug 都不用讲,
> 因为没有一种 debugger 能 step into macro,
因为 MACRO 不能搞一大片 code, 写的时候就会避免了
在 C++ 也还是可以用 define, 烂人还不是照用
> 而 template 你却可以直接很快乐的 step into。
再加上继承, overloading 这些可能跨过无数 header, source
追进去早忘了上层是啥 datatype
> 至於 trace 这种东西是有技巧的,
> 没事你不需要进去看 STL 写了什麽,
自己写的 template 难道不用 debug?
用 STL 套在自己的 class 上不用 trace?
无法预期会挂在那才会去 trace, 当然要任何点都能 trace
不然 assembly level trace 做给谁用
> 会拿 debugger 去 step into 到 STL 里面的人大概也是因为不懂 STL,
> 该用 step over (next) 的时候就该用 step over,
> 什麽都 into 进去那还得了,
> 不管是 debug 还是 trace 都不应该是这样玩的。
> 有非常多人在 debug C++ 程式都忘记了一件事,
> 今天是因为很多 C++ compiler 不支援 export,
所以用 template 写东西, 不能 crossplatform, 连 compiler version 都有差
产生的语法错误讯息还超难懂, 熟也只能熟一个 compiler
C++ 做过头, 规定太多, 才会有 java, c# 跑出来
> 所以才把 template 相关的 library 实作码放在 header 上,
> 以致於它的实作码在多数情况下是可见的,
> 结果在 debug 的时候就傻傻的 step into 进去,
> 这是不对的,
> 就像你在 debug C 程式的时候,
> 你不会闲到 step into 进 printf()、strcpy() 之类的 lib function 一样,
> 你没有理由在使用 STL 的时候 step into 到 vector::push_back() 里面。
> 唯一受人诟病的应该是 template 实际引数表示法的易读性,
真正优良的程式靠的是规划, 用那一种 library, tool, language 都没用
第一个 pascal compiler 用 pascal 写,
第一个 java compiler 用 java 写,
compiler 跟语言本身一起完成, 靠的就是切割得好
--
┌─────◆KKCITY◆─────┐ KKBOX◤歌名╱歌手╱歌词╱专辑◢搜寻
│ bbs.kkcity.com.tw │ ★ http://www.kkbox.com.tw ★
└──《From:59.120.53.7
》──┘ 超过100家唱片公司合法授权 音乐尽情下载
--
1F:→ ykjiang:Java compiler 用 Java 写没问, 203.73.175.9 04/18 17:39
2F:→ ykjiang:问题是它写好後要怎麽变成 bytecode? 203.73.175.9 04/18 17:40
3F:推 abcdefghi: en.wikipedia.org/wiki/Java_compiler 140.113.23.107 04/18 21:10
4F:→ abcdefghi:第一个 javac 是用 C 写的. 140.113.23.107 04/18 21:12
5F:→ abcdefghi: en.wikipedia.org/wiki/Pascal_program 140.113.23.107 04/18 21:16
6F:→ abcdefghi:ming_language 140.113.23.107 04/18 21:16
7F:→ abcdefghi:第一个pascal compiler用 fortran 写的. 140.113.23.107 04/18 21:16