⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000005.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>From:&nbsp;<A HREF="mailto:u8123033@cc.nctu.edu.tw">u8123033@cc.nctu.edu.tw</A>&nbsp;(Paladin&nbsp;Mu)&nbsp;<BR>Newsgroups:&nbsp;cis.comp,cis.announce&nbsp;<BR>Subject:&nbsp;[资讯人园地]&nbsp;Compiling&nbsp;a&nbsp;Compiler&nbsp;!&nbsp;<BR>Organization:&nbsp;Dept.&nbsp;of&nbsp;Computer&nbsp;&amp;&nbsp;Information&nbsp;Science,&nbsp;NCTU,&nbsp;Taiwan&nbsp;<BR>&nbsp;<BR>[资讯人园地]&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;o&nbsp;m&nbsp;p&nbsp;i&nbsp;l&nbsp;i&nbsp;n&nbsp;g&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;C&nbsp;o&nbsp;m&nbsp;p&nbsp;i&nbsp;l&nbsp;e&nbsp;r&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CIS&nbsp;85&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;穆信成&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;UNIX是以C语言写成的。使用C语言的其中一个优点是造成了UNIX的可携性。&nbsp;<BR>另一方面,工作站的销售对象是需要大量计算的工程师、科学家等等;因此不同&nbsp;<BR>於PC,在工作站级以上的电脑上,compiler是一项附在作业系统中的基本配备。&nbsp;<BR>UNIX系统中必定附有C&nbsp;compiler。既然要保持可携性,&nbsp;UNIX系统里面所附的的C&nbsp;<BR>compiler也得和UNIX系统一样,用C写作。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;C&nbsp;compiler本身,也是用C写的。当一个语言的compiler&nbsp;也用该语言本身来&nbsp;<BR>写的时候,&nbsp;&nbsp;便会发生一些有趣的事情。&nbsp;&nbsp;也许您会问,&nbsp;&nbsp;既然电脑上面已经有&nbsp;<BR>C&nbsp;compiler了,那麽我们要再去compile另一个compiler的source&nbsp;code作什麽?&nbsp;<BR>答案可能是,原有的内建C&nbsp;compiler可能比较简陋或著老旧,因此我们想把新的&nbsp;<BR>compiler用旧的compiler编译,然後当成系统内建的compiler用。换句话说,我&nbsp;<BR>们就这麽扩充了系统的内建compiler。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;Glasgow大学的GRASP计划,也用这样的过程发展他们的Haskell&nbsp;compiler。&nbsp;<BR>Haskell是一个functional&nbsp;language(85级同学记得Programming&nbsp;Language课中&nbsp;<BR>提到的functional&nbsp;programming吗?)。Functional&nbsp;programming总是带有较多&nbsp;<BR>的学术味而缺乏实用经验。Haskell语言本身仍有不少需要再扩充的空间。GRASP&nbsp;<BR>计划用&nbsp;Haskell&nbsp;来写Haskell&nbsp;compiler:先从简单的写起,&nbsp;产生一个最原始的&nbsp;<BR>Haskell&nbsp;compiler,然後用这套原始的Haskell语言写一个功能较强的&nbsp;compiler&nbsp;<BR>(把原来的Haskell扩充了),再用第二版的&nbsp;Haskell&nbsp;语言写第三版的compiler&nbsp;<BR>....。由於都是compiler,因此并不会减低效率。一个好处是,每次扩充语言,&nbsp;<BR>接下来立刻用新的语言写compiler,於是我们可以立刻看出新加功能是否有用处?&nbsp;<BR>该怎麽用?如此累积的经验,正可以作Haskell语言以後发展设计的参考。GRASP&nbsp;<BR>计划的理想就是″把functional&nbsp;proramming带出实验室″。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;UNIX的创造人之一,Ken&nbsp;Thompson,在他的&nbsp;Turing&nbsp;Award&nbsp;Lecture中,便&nbsp;<BR>由这个主题加以发挥,说了一些有趣的故事。C&nbsp;是一个被拿来写作业系统的语言。&nbsp;<BR>写作业系统的人很难忍得住诱惑,不在系统里面装些後门的。想想看,如果我写&nbsp;<BR>作业系统时,偷偷在login&nbsp;的部份加一段程式码,使得全世界的这套作业系统只&nbsp;<BR>要看到我的account和密码就让我进去,给我root权限,这该是多爽呀。&nbsp;但是我&nbsp;<BR>不能直接在&nbsp;login&nbsp;的&nbsp;source&nbsp;code&nbsp;里面这样写,否则一下就被人抓到了(既然&nbsp;<BR>source&nbsp;code流通,就是要给人看的呀)。&nbsp;该怎麽办呢?就从compiler里面动手&nbsp;<BR>脚,称作patch1吧:在compiler中多加一道手续,&nbsp;如果发现被compile的原始程&nbsp;<BR>式″疑似″在作login动作,就把它开个漏洞,让我进得去。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;但是这样也不见得行得通。Compiler以後也会改版,新版的compiler可能不&nbsp;<BR>是我在写。装系统的人也不见得用我的compiler。怎麽办呢?於是我在compiler&nbsp;<BR>的source&nbsp;code中作第二次手脚,称作patch2:如果这个compiler觉得在compile&nbsp;<BR>的程式″疑似″另一个&nbsp;compiler&nbsp;的&nbsp;source&nbsp;的话,就加入上面的patch1和这个&nbsp;<BR>patch2本身。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;好,现在作业系统推出了,CC1&nbsp;是我写的内建compiler,其中有我动的两个&nbsp;<BR>手脚。现在某人在compile&nbsp;UNIX,&nbsp;不得不用这个compiler。然而CC1&nbsp;中已经有了&nbsp;<BR>patch1,於是一旦compile到login,&nbsp;compile出来的login程式就被动了手脚。只&nbsp;<BR>要看到我的名字,就一定让我进系统,给我root权限。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;,--------.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-------------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,-----------.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;login&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;Compiled&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;login&nbsp;&nbsp;&nbsp;|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;source&nbsp;|=====&gt;|&nbsp;&nbsp;&nbsp;by&nbsp;CC2&nbsp;&nbsp;&nbsp;&nbsp;|=====&gt;|&nbsp;&nbsp;Program&nbsp;&nbsp;|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;(clean)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;patch&nbsp;1作用&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|(受感染了!)|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;`--------'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-------------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`-----------'&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;既然&nbsp;compiler&nbsp;CC1会作怪,&nbsp;那麽自己写&nbsp;compiler&nbsp;总可以了吧?&nbsp;然而,C&nbsp;<BR>compiler还是得用C写,写好了之後,用谁来compile呢?&nbsp;只有用CC1来compile。&nbsp;<BR>CC1发现新写的CC2是一个compiler的source&nbsp;code,於是&nbsp;patch2&nbsp;就发挥作用了。&nbsp;<BR>CC1会在CC2中也加入patch1和patch2。於是CC2也被″污染″了。&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;,--------.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-------------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;,-----------.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;CC2&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;Compiled&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;CC2&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;source&nbsp;|=====&gt;|&nbsp;&nbsp;&nbsp;by&nbsp;CC1&nbsp;&nbsp;&nbsp;&nbsp;|=====&gt;|&nbsp;&nbsp;Program&nbsp;&nbsp;|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;(clean)|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;patch&nbsp;2作用&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|含&nbsp;patch1,2|&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;`--------'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+-------------+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`-----------'&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -