看板Programming
标 题Re: [问题] 如何学写COMPILER? [纯抛砖引玉]
发信站KKCITY (Wed Apr 25 16:05:00 2007)
转信站ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!news.ee.ttu!news.n
※ 引述《[email protected] (汀)》之铭言:
> 我印象中 BNF 可以描述 context-sensitive 的 syntax,
> 受到较多限制的 BNF 才会变成 context-free 和 regular expression,
> 所以我才说 BNF 可以高兴怎样写就怎样写,
> 但是 parser 不见得做得出来。
举个例子? 能用 BNF 不能用 machine 做 parse 的语法?
不能 compile 是有的, 如 int a[100000000000000]
很多 code gen 和 library 都是直接用 BNF 语法的
> > C++ 也还是老旧的, template 不是新观念, 而且 C++ 连
> > obj dynamic linking 都没搞定, 本质上跟 C 是一样的
> > C++ 本来还是个 C 的 code generator: cfront
> > yacc 算是 4GL, goal oriented, 还比 C++ 新得多
> > 新应该是指 style, 而不是订规格的日期
> 我讲的 80 年代 programming 技术,
3GL 是 50 年代 programming 技术, template 从 lisp(196x), forth 就有
OO 语言的历史比 C 还久, smalltalk(1969) 就有 dynamic typing
yacc 远比 template, OO 先进得多!
C++ 只是把这些 196x-197x 的东西换个用辞, 大家基本上停留在 3GL
旧没有不好, 像 assembly 还不是要学会,
商用 compiler 也还是在用 4GL, 含 yacc
很多所谓的 "library" 是 4GL interpreter, 如 SQL
写 compiler 用 4GL 很快很省事, bug 好不好抓跟程式架构有关,
不然 perl 和一堆无法 BNF 的语言 parser 为何大多用 yacc?
> 指的是 yacc 这个工具 (无论是设计或是产生出来的 code),
> 跟 C++ 是不是新东西倒没什麽关联性,
> 重点是 2007 年用 yacc 去生 parser 的 code 已经非常不合时宜了,
> 做 parser 有更方便更容易除错的 language-level library 可以使用。
> 至於 public private protected friend 这类东西,
> 会不懂的大概也只剩下 10 年前还是学生的叔叔伯伯姑姑阿姨了,
这些东西懂了吗? 记得了吗?
继承以後的改变背起来了吗?
不然 java 把 virtual 换成 interface 是为何,
常常有人 C++ 写完编不起来去乱 public,
不然就是不知 call 得是 parent method 还是 child
> 现在的学生成天都在摸 Java 和 C# 这类东西,
> 已经是绝对不可能不会的特性。
> 「新语言机制」是因应「旧语言技巧」而产生的,
> 所以如果你用不到,
> 那麽不会本来就没差,
> C 语言本身简单,
> 但也因此有各种旁门左道的技巧得学,
C 语法就一点点还能用啥奇招?
再奇怪也跳不出 C 语法呀, inline assembly 之类是写 OS 必需的,
C++ 不能写 OS, 又有不明确的 memory map, 自然少人用 inline assembly
比 C 高阶的东西用途都是受限的, 这就是为何 C++ 反而萎缩被 java, C# 吃掉
还会出来拔掉一堆东西的 embedded C++
要比省打字工, 4GL 更省, 要做 data structure, pascal, java, c# 也可以
要效能, 大家都乖乖用 C+asm 写的 library 去了
> 甚至还没有书可以学全,
> 更没有一套标准 (充其量只不过是公约),
C 连 calling convention 都标准化, 跨 compiler 的 linking 都可以,
C++ 原来 function name encoding 还算有标准, 现在不同家的 obj file 无法互通
更不用说语法捡查都不一样, gcc3->gcc4 一堆东西不能 compile
visual c 5.1->6.0->.net 也是, 更不用说 borland, ibm 只做了半套 template
C 从来没发生过旧 code 不能 compile, 或 obj file 不能 link
如 linux kernel 还可用各种不同 compiler, 很多平台是没有 gcc 的
> 新一代的语言把这些技巧标准化、通用化、光明正大化、语言机制化,
> 并不代表学的人就是什麽都要学会才行,
--
┌─────◆KKCITY◆─────┐▇─┐ 优质连线服务隆/重/豋/场!!
│ bbs.kkcity.com.tw │┴ └─▇ KKADSL 带你环游全世界
└──《From:59.120.53.7
》──┘ KKADSL ┴ http://adsl.kkcity.com.tw
--