-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

程序設計語言:實踐之路(第3版)

( 簡體 字)
作者:韓江,陳玉類別:1. -> 程式設計 -> 綜合
譯者:
出版社:電子工業出版社程序設計語言:實踐之路(第3版) 3dWoo書號: 32988
詢問書籍請說出此書號!

缺書
NT售價: 640

出版日:7/1/2012
頁數:880
光碟數:1
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121170676
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

合配套光盤使用本書

《程序設計語言——實踐之路》包括一張配套光盤,其中包含了一些高級的或者可選的主題,以及完整的第5章:目標機體系結構和第16章:代碼改進。這個配套光盤的內容在正文中以幾種不同的方式引用或標識:
■ “深度探索”段落
在“深度探索”段落對可選讀內容進行了簡要的概述。
■ 目錄表
光盤內容包含在目錄表中,使讀者可以很方便地識別出位于光盤中的章節內容。目錄條目的形式如下所示:
2.4 理論基礎 13 100
2.4.1 有窮自動機 13  
2.4.2 下推自動機 18  
這里你可以看到第2.4節在正文98頁有簡單介紹(在該頁還可以找到“深度探索”簡介段落),而該節及其小節的全部內容則在配套光盤中的第13至18頁。
■ 引用點
在正文中的標記表示對配套光盤中“深度探索”內容的引用。
■ 練習
用于個人自學、高階的挑戰性問題或研究項目,在正文中標為“深度探索”作為練習。
■ 第5章和第16章的全部內容
整個第5章和第16章的內容都以單獨的PDF文件的形式存放在配套光盤中。這兩章在正文中有簡介,也包含在目錄中。

譯 者 序

Michael Scott的《程序設計語言——實踐之路》(Programming Language Pragmatics)是一本優秀的教科書。在網絡時代計算技術飛速發展的背景下,各種創新的軟硬件設計理念及實踐如雨后春筍般層出不窮,如何將大量的信息組織起來,并突出其核心內容,是類似教材的作者們所面臨的現實挑戰。而Scott這本教材最大的特點就在于,它緊緊抓住了處于計算機科學技術領域中心位置的主題——程序設計語言,為讀者深入地探討了程序設計語言及其實現的關鍵概念,同時將筆觸延伸到編譯技術、軟件系統甚至軟硬件體系結構等諸多領域。
本書系統地介紹了與程序設計語言相關的各種基本概念,內容涉及語言處理方面的具體細節,以及各種語言范式。作者在討論各個主題時,將對語言概念的描述與如何實現這些概念的具體說明從整體上結合在了一起,講解清晰,并且給出了大量的實例。這樣,就使得讀者通過學習本書,不僅能“知其然”——了解各種程序設計語言的實現中所做出的具體選擇,還能夠“知其所以然”——了解這些語言的設計者做出這些選擇背后的邏輯和取舍。
本書的編排方式也非常靈活,各章的內容相對獨立,每章都有大量隨堂練習和課后習題,以幫助讀者鞏固學到的知識,并啟發他們做進一步的思考。隨書附帶的光盤上還包含了許多較深入的內容。根據需要,這本教科書可以通過不同的方式組織起來,用于側重點不同的教學課程,讀者自學時也可以根據自己的情況自由選讀。
作者在本書(第3版)中對內容做了大量的更新,最明顯的就是增加了關于運行時程序管理的全新的第15章,以及關于并發的第12章的很多改寫,增加了一些較新的主題。這一版本更新了大量的實例(例如用X86上的C代碼代替了Pascal),并且更多地采用了C#、Java 5、Python和Eiffel等現代語言的例子。作者對第3版的改進還體現在許多細節方面,足以反映出作者之用心。
本書在翻譯的過程中,得到了博文視點總經理郭立老師的支持與指導,她對IT專業書籍翻譯的質量非常重視,使我們對本書的翻譯不敢有絲毫的懈急,力求達到精益求精。感謝本書的策劃編輯劉皎,是她持續的鼓勵給予我們信心讓我們繼續下去。還要感謝那些為本書的翻譯做出貢獻的所有人,他們都是默默無聞的后臺工作者。
誠然,限于譯者水平,書中難免含有一些錯誤和理解不到位的地方,敬請讀者朋友批評指正。我們的聯系方式是Changchuan@gmail.com。
譯者
2011年中秋節于北京


本書所獲贊譽

計算機在21世紀的日常生活中已經無處不在,這說明程序設計語言處于計算機科學教育的中心是合理的。程序設計語言將計算機科學的理論基礎(各種問題解決算法的來源)和現代計算機體系結構(相應的程序在其上生成解決方案)聯系在一起。在后Internet時代,計算技術的發展日新月異,關于計算的教科書的結構必須組織起關于某個主題的信息,而不只是討論這個主題。在這本書中,Michael Scott為讀者廣泛并全面地呈現了程序設計語言及其實現的關鍵概念,其方式非常適合計算機科學這一主題。
——摘自Barbara Ryder,Virginia Tech所寫的序言

《程序設計語言——實踐之路》是一本關于語言設計和實現的出色的入門書。它不僅展示了支撐我們所使用的語言的理論,還展示了計算機體系結構的發展對這些理論的指引,以及這些理論繼續發展以面對利用多核硬件的挑戰的方式。
——Tim Harris,微軟研究院

Michael Scott為我們呈現了一本名副其實的著作——《程序設計語言——實踐之路》。除了覆蓋傳統的語言論題之外,這本書還深入到了有時比較模糊,但總是必需的各領域的程序設計細節。本書的這一新版本依然覆蓋了現代語言的基礎,并且包含關于現代運行時環境(包括虛擬機)的新材料和更新的內容。對于任何希望為現實世界的應用開發語言的讀者來說,這本書都不啻為一本絕佳的入門讀物。
——Perry Alexander,Kansas大學

Micheal Scott對《程序設計語言——實踐之路》一書的新版本從整體和局部兩個方面做了改進。其中的變化包括增加了更多有見地的例子,將Pascal和MIPS的例子換成C和Intel 86的,以及關于運行時系統的新的一章。這一章中更加深入討論了關于現代語言的設計和實現問題。
——Eileen Head,Binghamton大學

這個新版本為這一動態領域帶來了黃金般的標準,同時在一本教科書的三個關鍵方面保持了絕好的平衡,這三個方面是:廣度、深度和清晰。
——Christopher Vickery,CUNY的Queens學院

《程序設計語言——實踐之路》一書全面覆蓋了程序設計語言的理論和實現。Michael Scott使用關于最流行的和最有影響力的程序設計語言的幾百個例子,良好地解釋了各種概念及其實際的意義。在第3版新增的關于運行時系統的一整章中,包含了虛擬機、即時編譯和符號調試等新主題。
——William Calhoun,Bloomsburg大學



關于作者

Michael L. Scott是Rochester大學計算機科學系的教授和原系主任。1985年他由麥迪遜的Wisconsin大學獲得計算機科學博士學位。他的研究興趣在于程序設計語言、操作系統以及高級計算機體系結構的交叉領域,重點關注并行和分布式計算。他是Lynx分布式程序設計語言的設計者,與他人合作設計了Charlotte和Psyche并行操作系統、Bridge并行文件系統、Cashmere和InterWeave共享存儲系統,以及事務性存儲實現的RSTM套件。他與John Mellor-Crummey合作設計的MCS互斥鎖被用在許多商業性和學術性的系統中。與Maged Michael、Bill Scherer和Doug Lea設計的一些其他算法出現在java.util.concurrent標準庫中。2006年他和Mellor-Crummey博士共同分享了ACM SIGACT/SIGOPS Edsger W. Dijkstra的分布式計算獎。
Scott博士是美國計算機協會(Association for Computing Machinery,ACM)的會員,IEEE的高級會員,Concerned Scientists聯合會和社會責任計算機專業工作者協會的會員,曾為各種程序委員會和資助評審委員會服務,作為負責人或協作研究者從事過來自NSF、ONR、DARPA、NASA、國防部、福特基金會、數字設備公司(現為HP)、Sun、IBM、Intel和微軟資助的許多項目。作為超過100篇論文出版物的作者,他曾擔任過2003年ACM操作系統原理研討會以及2008年ACM SIGPLAN并行程序設計的原理和實踐研討會的主席。2001年他獲得了Rochester大學的“Robert和Pamela Georgen本科生教學杰出貢獻獎”。







獻給我的父母,
Dorothy D.Scott和Peter Lee Scott,
他們是子女的楷模,
在人文價值方面是我們杰出的表率。





21世紀的日常生活中計算機已經無處不在,這說明程序設計語言處于計算機科學教育的中心是合理的。程序設計語言將計算機科學的理論基礎(各種問題解決算法的來源)和現代計算機體系結構(相應的程序在其上生成解決方案)聯系在一起。在后Internet時代,計算技術的發展日新月異,計算的教科書的結構必須組織起關于某個主題的信息,而不只是討論這個主題。在這本書中,Michael Scott為讀者廣泛并全面地呈現了程序設計語言及其實現的關鍵概念,其方式非常適合計算機科學這一主題。
Scott這本書的最大的優點在于,它將對語言概念的描述與如何實現這些概念的具體說明從整體上結合在了一起。這些討論非常深入,第3版中更新了反映最新研究和實踐的內容,除基本的信息之外,還為對特定主題感興趣的讀者提供了補充材料。即使有選擇地去掉一些內容,教授本書的講師還是可以整理出一份本書各主題的一個內在統一的子集。此外,Scott使用了來自真實語言的大量實例來說明關鍵問題。對于感興趣或有目標的讀者,可以在本書的配套光盤中找到其他一些深入的和高級的討論與練習,從而使興趣和能力不同的學生可以根據自己在程序設計語言及編譯方面的基礎情況進行進一步的探索。
在過去的幾年中,我使用Scott的教科書講授一門時長一學期的比較程序設計語言課程。我向學生們強調,我給他們的目標是學習如何來學習程序設計語言,而不是掌握關于任何一門程序設計語言的細節。這門課的目的是教會學生一種在其職業生涯中學習新語言(在計算機科學領域中必然會遇到這種情況)的有組織的架構。到目前為止,我特別喜歡Scott關于程序設計語言范式(即函數式、邏輯式、面向對象語言和腳本語言)的內容,我的課堂資料也是按這種方式組織的。不過,我還在其中包含了一些基礎性的知識,如存儲組織、名字和位置、作用域、類型以及廢料收集,這些都受益于將語言概念連接到其實現細節的呈現方式。Scott的講解直奔主題并且非常直觀,具有清晰的展示和良好的實例。討論往往與前面展現的資料相互獨立,從而使得從課程大綱中選擇主題更加容易。此外,網上還有一些補充的教學材料。
對于我來說,本書的這一版本使我最感興趣的部分,是關于運行時環境和虛擬機(VM)的全新的第15章,以及對關于并發的第12章的大量更新。鑒于當前對虛擬化的關注,在書中包含關于VM(例如Java的JVM和CLI)的一章,有助于學生們理解這個重要的主題,同時說明了現代語言如何獲得跨許多平臺的可移植性。對動態編譯和二元翻譯的討論,提供了對書中前面展示的傳統編譯模型的一個對照。Scott在此包含的這種較新的編譯技術確定很重要,有助于學生們可以更好地理解,為了支持書中所描述的較新的動態語言功能我們需要些什么。此外,對符號調試和性能分析的討論,展示了軟件開發周期中遍布的各種程序設計語言和編譯器技術。
類似地,Scott對第12章增加了一些討論,其內容是近期研究所關注的較新的主題(例如存儲一致模型、軟件事務性存儲)。將并發作為一種程序設計范式的討論,可以放在程序設計語言的課程中,而不僅是放在操作系統的課程中。在這種課程中,可以很容易地比較和對比語言設計的各種選擇,以及它們所隱含的實現方面的考慮。這種對語言設計、編譯、操作系統和體系結構之間界限的混合,反映了當前實踐中的軟件開發。這種事實也在Scott的這本第3版中得到了體現。
除了這些重要的變化之外,這一版本還更新了大量的實例(例如用X86上的C代碼代替了Pascal),并且用C#、Java 5、Python和Eiffel等現代語言增強了討論。用多種程序設計語言來展現例子,可以幫助學生理解那些重要的基礎通用概念,而不是它們語法上的區別。
總之,Michael Scott的這本書是一本關于程序設計語言及其實現的優秀教科書。這本第3版為學生提供了很好的參考,可作為大學課程的補充資料。這本教科書可以通過不同的方式組織起幾種不同“風格”的課程,每一種都覆蓋大多數但不是全部的章節。本書的內容清晰且全面,同時討論了彼此支持的語言設計和實現問題。
恭喜Michael為這本優秀的教科書創作了出色的第3版!

Barbara G. Ryder
美國弗吉尼亞理工大學計算機科學系教授



前 言

計算機程序設計的課程,讓普通學生第一次接觸到計算機科學領域。在上這種課程之前,大多數學生已經在自己的生活中使用著計算機,用來發送電子郵件、玩計算機游戲、瀏覽網頁、做文字處理、參加社交網絡,以及從事大量其他事情,而且在他們還沒有寫出自己的程序之前,就已經開始關注這些應用系統的工作方式了。在獲得了作為程序員的一定能力之后(假定已經學過很好的有關數據結構和算法的課程),很自然地,下一步就是想知道程序設計語言是如何工作的。本書就是對此提供一個解釋。它的目標很簡單,就是采用盡可能容易理解和最精確的語言,采用普通本科生愿意閱讀并易于接受的風格。這一目標反應了我的一種信念:如果我們真的能很好地解釋一件事情究竟是怎樣的,學生總是會希望理解更多東西,并樂于去接觸更多的材料。
在常規的有關“系統”的教學計劃中,數據結構(或者再加上計算機組織結構)之后的內容被分別歸入到不同領域的一批課程中,如程序設計語言、編譯器構造、計算機體系結構、操作系統、網絡、并行和分布式計算、數據庫管理系統,可能還有軟件工程、面向對象的設計、圖形學,或者用戶界面系統。這種安排方式存在一個缺點,就是這一課程表在不斷增長,但是本科課程教學計劃中的學期數卻保持不變。或許更重要的是,有關計算機科學最有趣的許多進展,都處在這些科目之間的邊界上。例如,RISC革命造成計算機體系結構和編譯器構造之間持續25年的聯盟。最近幾年,重新熱起來的對虛擬機的興趣,使操作系統內核、編譯器以及語言的運行時系統之間的分界線變得很模糊了。如今許多程序被常規地嵌在網頁、電子報表和用戶界面中。隨著多核處理器的出現,原來只有系統程序員才會用到的并發技術,現在已經開始影響日常的程序設計了。
與此同時,教育工作者和研究者也越來越認識到必須關注這些相互關系。特別是在高等教育的核心教學計劃中出現一種集中的趨勢。許多學校不是給普通學生有關兩三個狹窄科目的深入探討,同時又在其他方面留下很大的空缺,而是重整了有關程序設計語言和操作系統的課程,使之涵蓋范圍更廣泛的科目,再提供一些更專業的后續課程。這一趨勢在很大程度上是ACM/IEEE-CS計算教程2001所提出的認識的發展。在這一教程中強調了本領域的成長、對于廣度日益增長的需要、教學計劃設計靈活性的重要意義,以及對于畢業生的總體目標:“必須有一種系統層面的認識,該認識應適于幫助理解理論和實踐之間的相互作用,熟悉常見的研究課題,并能隨著本領域的發展而更新”[CR01,第11.1節,有修改]。
《程序設計語言——實踐之路》的第1版和第2版很幸運地跟上了這種趨勢。第3版繼續并加強了對集成學習的重視程度,并繼續以關于程序設計語言設計的討論為中心。
本書的核心就是討論程序設計語言是如何工作的問題。其中并沒有列舉許多不同語言的細節,而是重點關注學生可能遇到的有關所有語言之基礎的那些概念,通過各種各樣的具體例子來闡釋這些概念,并努力探索解釋不同語言的設計之所以采納不同方式背后的那些利弊權衡。類似地,本書也不去討論如何構造一個編譯器或者解釋器(那只是極少數的程序員最終需要完整參與的工作),它將重點關注編譯器對輸入的源程序做了些什么事情,以及為什么要那樣做。語言的設計和實現在這里被放在一起考察,其中特別強調它們之間相互作用的各種方式。
第3版中的變化
《程序設計語言——實踐之路》的第3版與第2版相比,有以下不同。
1. 關于虛擬機和運行時程序管理的一章新內容。
2. 對介紹并發的一章進行了大量修訂。
3. 在許多地方反映了該領域中近期出現的變化。
4. 根據來自講授該課程教師的反饋,以及對廣為人知的主題進行重新思考,對本書進行了一些改進。
第1項也許是最明顯的變化。它反映了托管代碼和腳本語言日益廣泛的使用。第15章首先從整體上介紹了虛擬機,然后詳細討論了兩個使用最廣泛的實例:JVM和CLI。這章還介紹了動態編譯、二進制翻譯、自反、調試器、分析器,以及現代語言系統中出現的越來越復雜的運行系統機制的其他方面。
第2項也反映了這一領域不斷發展的事實。隨著多核處理器的傳播,并發語言對于主流計算機來說已經越來越重要了,而且這一領域還在不斷地變化發展。對第12章(并發)的改動包括關于非阻塞同步、存儲一致性模型和軟件事務性存儲的各小節,以及關于OpenMP、Erlang、Java 5和用于.NET的Parallel FX的更多內容。
其他新內容(第3項)遍布在本書中的各個地方。第5.4.4節從體系結構的角度介紹了多核的創新。第8.7節討論了串行和并發語言中的事件處理。第14.2節中,關于gcc的討論不僅包括RTL,也包括更新的GENERIC和Gimple中間形式。全書的引用內容都做了更新,以反映最新的發展情況,如Java 6、C++’0X、C# 3.0、F#、Fortran 2003、Perl 6和Scheme R6RS。
最后,第4項包含了對本書中幾乎所有小節的改進。其中,更新最多的主題包括貫穿第1章的例子(從Pascal/MIPS改為C/x86),自舉(第1.4節),掃描(第2.2節),表驅動語法分析(第2.3.2節和第2.3.3節),閉包(第3.6.2、3.6.3、8.3.1、第8.4.4、8.7.2和9.2.3節),宏(第3.7節),求值順序和嚴格性(第6.6.2節和第10.4節),小數類型(第7.1.4節),數組形狀和分配(第7.4.2節),參數傳遞(第8.3節),內部(嵌套)類(第9.2.3節),單體(第10.4.2節)和第11章的Prolog實例(現在遵循ISO)。
為了容納新的內容,關于某些主題的討論被壓縮了。這樣的情況包括模塊(第3章和第9章),循環控制(第6章),補償類型(第7章),Smalltalk類繼承關系(第9章),元循環解釋(第10章),互聯網絡(第12章)和線程創建語法(第12章)。其他一些內容被放到了本書的配套光盤上。這些內容包括第5章(目標機體系結構),聯合(第7.3.4節),懸空引用(第7.7.2節),消息傳遞(第12.5節)和XSLT(第13.3.5節)。在全書中,原來用現在已不流行的語言編寫的例子,都在恰當的情況下替換為更新的等價語言。
整體上看,本書的印刷本只比原來多了30頁,不過配套光盤上多了將近100頁新內容。此外還新增了14個“設計和實現”旁白,70多個新例子,數量相當的新“檢查你的理解”問題,以及超過60個新的章節后練習和探索。在創建一個一致且全面的索引時付出了相當的努力。正如前面兩個版本一樣,Morgan Kaufmann繼續承諾以合理的成本來提供最佳的圖書:本書的第3版比同類書籍更便宜,但是內容更多,也更全面。
配套光盤
為了減小本書的物理體積,為新材料讓出位置,使學生可以在瀏覽本書時重點關注最基本的材料,大約350頁更高級的或者更外圍的材料被放入隨書配套的光盤中。光盤中的各節在書的正文中都用一段關于其主題的簡介,以及一個總結省略部分的“深度探索”段落來表示。
需要注意的是,將一些材料安排在光盤上并不構成對這些材料技術重要性的判斷,而只是反映了一個事實:所有值得包含的材料已經超過了一卷書或者一門課程的容量。由于側重點和教學進度各不相同,大多數教師可能會安排學生自己閱讀配套光盤上的材料,并且會略過印刷出的教科書中的某些特定章節。我的意圖只是將那些大部分課程可能涵蓋的材料放在印刷形式的教科書中。
光盤上還包含了正文中所有主要代碼片段的可編譯副本(包括二十幾種語言),以及對在線資源的指引。
關于設計和實現的旁白
與前兩版一樣,本書第3版重點強調了語言設計對于實現選擇的影響,以及預期的實現方式對于語言設計的影響。第3版用超過135個“設計和實現”旁白,突出了這方面的聯系和相互影響。有關這些旁自的更多細節將在第9頁(第1章)說明。附錄B給出了所有旁白的目錄。
編號并加標題的實例
第3版中的實例緊密地編織在討論中。為使讀者更容易找到特定的實例,記住它們的內容,并更容易在其他地方引用這些實例,我們給每個實例都顯示一個頁邊注,標明其編號和標題。全文和配套光盤里大約有1000個這樣的實例,附錄C是有關它們的詳細目錄。
練習的安排
復習題放在本書中各主要小節的后面,大約10頁就出現一處。它們直接基于前面的正文內容,并且有著較短和直截了當的答案。
更詳細的問題放在各章的最后。它們分為練習和探索兩類。前者一般比各節后面的復習題更有挑戰性,它們適合作為課下作業或簡單的課題。后者中的問題更加開放,需要做一些基于網絡或圖書館的研究工作,需要明顯更多一些的時間,或者是形成一種客觀的認識。對于注冊的教師,可以從密碼保護的網址得到習題解答(不包括探索題),需要者請訪問textbooks.elsevier.com/web/9780123745149。
如何使用本書
《程序設計語言——實踐之路》涵蓋了計算教程200l報告[CR01]中PL“知識單元”的幾乎所有材料。本書特別適合CS 341模塊課程(程序設計語言的設計),也可以被用于CS 340(編譯器構造)或CS 343(程序設計范型)。它包括了CS 344(函數式程序設計)和CS 346(腳本語言)中的主要內容。圖0.1給出的是使用本教程的幾條可能路徑。

圖0.1 課程路線圖。較暗的區塊表示配套光盤中的“深度探索”補充內容。節序號表示沒有與補充內容對應的斷開的部分。
作為自學或一學年的課程(圖0.1中的軌跡F),我建議從頭到尾通讀本書,當遇到每個“深度探索”部分時再轉到相應的配套光盤上的內容。在羅切斯特大學作為一學期的課程時(軌跡R.本書最初就是為它開發的),我們也覆蓋了本書的大部分內容,但不包括大部分光盤上的章節,自下而上的語法分析(第2.3.3節)和第14章(構造可運行程序)的第二部分內容,以及第15章(運行時程序管理)。
一些章(第2、4、5、14、15和16章)比其他的章更著重強調實現問題。這些章與其他更多關注語言的章之間的順序可以在一定限度內調整。許多學生可能已經熟悉了第5章的一些材料,多半是來自一門有關計算機組織結構的課程,因此我們將第5章放在了配套光盤上。有些學生可能也熟悉第2章的一些材料,可能是來自一門有關自動機理論的課程。在這種情況下,該章的大部分內容可以很快讀過去,只是可能要在某些實際問題上(例如從語法錯誤中恢復,或者實際掃描器與經典的有窮自動機的差異方面)多停留一下。
如果用于更傳統的程序設計語言課程(圖0.1中的軌跡P),那么可以排除有關掃描器和語法分析器的內容,加上第4章的所有內容,還可以減少對其他章節中與實現有關的材料的重視程度。在此基礎上可以增加一些光盤內容,如ML類型系統(第7.2.4節),多重繼承(第9.5節),Smalltalk(第9.6.1節),lambda演算(第10.6節)和謂詞演算(第11.3節)。
本書也在一些學校里被用于有關編譯器的引論性課程(圖0.1的軌跡C)。典型的課程安排是去掉第3部分的大多數內容(第10到13章),以及通篇中更多強調設計的材料。包含所有有關掃描和語法分析的材料,第14到16章,以及其他光盤材料的某種混臺。
對于那些采用4學季制的學校,一種常見的選擇方案是開一學期的引論性課程和兩個隨后的選修課程(圖0.1的軌跡Q)。引論課程可以覆蓋第1、3、6、7章的主要內容(不包括光盤材料),再加上第2和第8章的前一半。后面一學季的面向語言的課程可以覆蓋第8章的其余部分,整個第3部分,以及第6到第8章的光盤材料。或許再加上一些有關形式語義學、類型系統或其他相關論題的補充材料。后一學季的面向編譯器的課程可以包含第2章的其余部分,第4到第5章和第14到第15章,以及第3章和第8和第9章的光盤材料,或許再加上一些有關自動代碼生成、更富進取性的代碼優化、程序設計工具等等方面的材料。
無論采用哪條路徑學習這本教科書,我都假定大多數讀者已經對至少一種高級命令式程序設計語言有了相當的經驗。具體是哪種語言都沒有關系。書中例子取自各種不同的語言,但總是有足夠的注釋和其他討論,使不熟悉該語言的讀者也能比較容易地理解它們。附錄A包含了超過50種不同語言的簡單介紹。這里的算法都是采用自明的非形式的偽代碼。真正的程序設計語言代碼使用的字體是“typewriter”字體,偽代碼用的字體是“sans-serif”字體。
輔助材料
除了作為正文章節的補充外,配套光盤中還包括其他一些資源:
■ 對萬維網上一些語言手冊和教程的鏈接;
■ 對一些開源編譯器和解釋器的鏈接;
■ 書中所有不那么簡單的實例的完整源代碼;
■ 對文本內容和配套光盤內容的搜索引擎。
更多的資源可以從textbooks.elsevier.com/web/9780123745149找到(你可能需要隨時檢查,以保證鏈接正確)。對于采用本書的教師,還通過一個密碼保護的頁面提供了:
■ 全書中所有圖形的可編輯的PDF源文件;
■ 可編輯的PowerPoint幻燈片;
■ 大部分練習的解答;
■ 對于較大項目的建議。
第3版致謝
在準備第3版的過程中,我有幸得到了很多人的真誠幫助。許多同行提供了有關第2版中的勘誤和反饋信息,包括Gerald Baumgartner、Manuel E. Bermudez、William Calhoun、Betty Cheng、Yi Dai、Eileen Head、Nathan Hoot、Peter Ketcham、Antonio Leitao、Jingke Li、Annie Liu、Dan Mullowney、Arthur Nunes-Harwitt、Zongyan Qiu、Beverly Sanders、David Sattari、Parag Tamhankar、Ray Toal、Robert van Engelen、GarrettWollman和JingguoYao。在一些情況下,由于時間不夠,來自2004年課堂實驗的好建議并沒有在第2版中體現出來。我很高興終于有機會將它們放到第3版中。無疑我還要感謝列在第1和第2版的致謝中的另外許多人,他們作為評閱人、采用者和讀者,為前兩版的工作提供了許多幫助并使其成功。
第3版的外部評閱人提供了大量有益的建議。我要感謝Perry Alexander(Kansas大學)、Hans Boehm(HP實驗室)、Stephen Edwards(Columbia大學)、Tim Harris(微軟研究院)、Eileen Head(Binghamton大學)、Doug Lea(SUNY Oswego)、Jan-Willem Maessen(Sun公司實驗室)、Maged Michael(IBM實驗室)、Beverly Sanders(Florida大學)、Christopher Vickery(紐約城市大學皇后學院)和Garrett Wollman(MIT)。Hans、Doug和Maged細致地審閱了第12章的各個部分。Tim和Jan對第10章的各部分提供了同樣的幫助。Mike Spear幫助審查圖12.18中的事務性存儲實現。Xiao Zhang提供了第15.3.3節的指針部分。在本版中剩下的問題都應該由我本人負責。
在準備第3版的過程中,我總結了20多年來在Rochester大學為高年級本科生講授這些材料的經驗。我要感謝我的所有學生,感謝他們的熱情和反饋意見。我還要感謝我的同事和研究生學生,以及系里的行政、秘書和技術人員,感謝他們為我提供了這么好的工作環境。最后,我要感謝Barbara Ryder,正是她對第1版直率的評論,幫助我開始準備第2版,我很榮幸能邀請到她作為序的作者。
正如在前兩版工作中一樣,Morgan Kaufmann出版社的工作人員對此工作真誠投入,包括專業上的和個人的。我特別感謝高級開發編輯Nate McFadden,他用非凡的耐心、良好的幽默感和對細節的敏感,幫助我完成了本書的這一版和前一版;感謝管理本書出版的Marilyn Rash;感謝開始作為編輯,后來作為出版人的Denise Penrose,他盡職的管理工作一直影響著本書。
最重要的是,我要感謝我的妻子Kelly和我們的女兒Erin和Shannon,感謝她們在這看不到盡頭的寫作和修改中的耐心和支持。計算是一種美好的專業,而家庭則是最要緊的。

Michael L. Scott
2008年12月于紐約 羅徹斯特
內容簡介:

這是一本很有特色的計算機教材,其核心是討論程序設計語言的基本原理和技術。本書融合了傳統的程序設計語言教科書和編譯教科書的有關知識,并增加了一些有關匯編層體系結構的材料,以滿足沒學過計算機組織的學生們的需要。書中通過各種語言的例子,闡釋了程序設計語言的重要基礎概念,討論了各種概念之間的關系,解釋了語言中許多結構的形成和發展過程,以及它們演化為今天這種形式的根源。書中還詳細討論了編譯器的工作方式和工作過程,說明它們對源程序做了什么,以及為什么要那樣做。書的每章最后附有復習題和一些更具挑戰性的練習與探索。這些練習的特別價值在于引導學生進一步深入理解各種語言和技術。本書第3版新增了關于運行時程序管理的討論,對關于并發的一章做了重大的改寫,并更新了大量的實例。
這本教材在美國大學已使用了二十余年,目前被歐美許多重要大學用于“程序設計語言”或者“軟件系統”課程。

目錄:

第1部分 基礎 3
第1章 引言 5
1.1 語言設計的藝術 7
1.2 程序設計語言的譜系 10
1.3 為什么要研究程序設計語言? 14
1.4 編譯和解釋 16
1.5 程序設計環境 24
1.6 編譯概覽 25
1.6.1 詞法和語法分析 27
1.6.2 語義分析和中間代碼生成 29
1.6.3 目標代碼生成 33
1.6.4 代碼改進 33
1.7 總結和注記 35
1.8 練習 36
1.9 探索 37
1.10 有關參考文獻 39
第2章 程序設計語言的語法 41
2.1 描述語法:正則表達式和上下文無關文法 42
2.1.1 單詞和正則表達式 43
2.1.2 上下文無關文法 46
2.1.3 推導和語法分析樹 48
2.2 掃描 51
2.2.1 生成一個有窮自動機 55
2.2.2 掃描器代碼 60
2.2.3 表格驅動的掃描 63
2.2.4 詞法錯誤 63
2.2.5 編譯指示 65
2.3 語法分析 67
2.3.1 遞歸下降 70
2.3.2 表格驅動的自上而下語法分析 76
2.3.3 自下而上的語法分析 87
2.3.4 語法錯誤 1 99
2.4 理論基礎 13 100
2.4.1 有窮自動機 13  
2.4.2 下推自動機 18  
2.4.3 文法和語言類 19  
2.5 總結和注記 101
2.6 練習 102
2.7 探索 108
2.8 有關參考文獻 109
第3章 名字、作用域和約束 111
3.1 約束時間的概念 112
3.2 對象生存期和存儲管理 114
3.2.1 靜態分配 115
3.2.2 基于棧的分配 117
3.2.3 基于堆的分配 118
3.2.4 廢料收集 120
3.3 作用域規則 121
3.3.1 靜態作用域 123
3.3.2 嵌套子程序 124
3.3.3 聲明的順序 127
3.3.4 模塊 132
3.3.5 模塊類型和類 136
3.3.6 動態作用域 139
3.4 作用域的實現 29 143
3.4.1 符號表 29  
3.4.2 關聯表和中心引用表 33  
3.5 作用域中名字的含義 144
3.5.1 別名 144
3.5.2 重載 146
3.5.3 多態性及相關概念 148
3.6 引用環境的約束 151
3.6.1 子程序閉包 153
3.6.2 一級值和非受限生存期 154
3.6.3 對象閉包 157
3.7 宏擴展 159
3.8 分別編譯 39 161
3.8.1 C的分別編譯 40  
3.8.2 包和自動頭文件推理 42  
3.8.3 模塊分層結構 43  
3.9 總結和注記 162
3.10 練習 163
3.11 探索 171
3.12 有關參考文獻 172
第4章 語義分析 175
4.1 語義分析器所扮演的角色 176
4.2 屬性文法 180
4.3 屬性求值 182
4.4 動作例程 191
4.5 屬性的空間管理 49 196
4.5.1 自下而上求值 49  
4.5.2 自上而下求值 54  
4.6 語法樹的標注 197
4.7 總結和注記 204
4.8 練習 205
4.9 探索 209
4.10 有關參考文獻 210
第5章 目標機體系結構 65 213
5.1 存儲器層次結構 66  
5.2 數據表示 68  
5.2.1 整數算術 69  
5.2.2 浮點數算術 72  
5.3 指令集體系結構 75  
5.3.1 尋址模式 75  
5.3.2 條件和分支 76  
5.4 體系結構和實現 78  
5.4.1 微程序設計 79  
5.4.2 微處理器 80  
5.4.3 RISC 81  
5.4.4 多線程和多核 82  
5.4.5 兩個示例體系結構:x86和MIPS 84  
5.5 為新型處理器做編譯 91  
5.5.1 保持流水線滿 91  
5.5.2 寄存器分配 96  
5.6 總結和注記 101  
5.7 練習 103  
5.8 探索 107  
5.9 有關參考文獻 109  
第2部分 語言設計的核心問題 217
第6章 控制流 219
6.1 表達式求值 220
6.1.1 優先級和結合性 222
6.1.2 賦值 224
6.1.3 初始化 233
6.1.4 表達式中的順序問題 235
6.1.5 短路求值 238
6.2 結構化和非結構化的流程 241
6.2.1 goto的結構化替代品 242
6.2.2 繼續 245
6.3 順序執行 246
6.4 選擇 247
6.4.1 短路條件 248
6.4.2 Case/Switch語句 251
6.5 迭代 256
6.5.1 枚舉控制的循環 256
6.5.2 組合循環 261
6.5.3 迭代器 262
6.5.4 lcon的生成器 111 268
6.5.5 邏輯控制的循環 268
6.6 遞歸 270
6.6.1 迭代和遞歸 271
6.6.2 應用序和正則序求值 275
6.7 非確定性 115 277
6.8 總結和注記 278
6.9 練習 279
6.10 探索 285
6.11 有關參考文獻 287
第7章 數據類型 289
7.1 類型系統 290
7.1.1 類型檢查 291
7.1.2 多態性 291
7.1.3 “類型”的含義 293
7.1.4 類型的分類 294
7.1.5 正交性 301
7.2 類型檢查 303
7.2.1 類型等價 303
7.2.2 類型相容性 310
7.2.3 類型推理 314
7.2.4 ML類型系統 125 316
7.3 記錄(結構)與變體(聯合) 317
7.3.1 語法和運算 318
7.3.2 存儲布局及其影響 319
7.33 with語句 135 323
7.3.4 變體記錄(聯合) 139 324
7.4 數組 325
7.4.1 語法和操作 326
7.4.2 維數、上下界和分配 330
7.4.3 內存布局 335
7.5 字符串 342
7.6 集合 344
7.7 指針和遞歸類型 345
7.7.1 語法和操作 346
7.7.2 懸空引用 149 356
7.7.3 廢料收集 357
7.8 表 364
7.9 文件和輸入/輸出 153 367
7.9.1 交互式I/O 153  
7.9.2 基于文件的I/O 154  
7.9.3 正文I/O 156  
7.10 相等檢測和賦值 368
7.11 總結和注記 371
7.12 練習 373
7.13 探索 379
7.14 有關參考文獻 380
第8章 子程序和控制抽象 383
8.1 回顧棧的布局 384
8.2 調用序列 386
8.2.1 區頭向量 169 389
8.2.2 案例研究:在MIPS上實現C,在x86上實現Pascal 173 389
8.2.3 寄存器窗口 181 390
8.2.4 內聯展開 391
8.3 參數傳遞 393
8.3.1 參數模式 394
8.3.2 名字調用 185 402
8.3.3 特殊目的的參數 403
8.3.4 函數返回 408
8.4 泛型子程序和模塊 410
8.4.1 不同的實現方法 412
8.4.2 泛型參數的約束條件 414
8.4.3 隱式實例化 416
8.4.4 C++、Java和C#中的泛型 189 417
8.5 異常處理 418
8.5.1 異常的定義 421
8.5.2 異常的傳播 423
8.5.3 異常的實現 425
8.6 協作程序 428
8.6.1 棧分配 430
8.6.2 轉移 432
8.6.3 迭代器的實現 201 433
8.6.4 離散事件模擬 205 433
8.7 事件 434
8.7.1 順序處理程序 434
8.7.2 基于線程的處理程序 436
4.8 總結和注記 438
8.9 練習 439
8.10 探索 446
8.11 有關參考文獻 447
第9章 數據抽象和面向對象 449
9.1 面向對象程序設計 451
9.2 封裝和繼承 460
9.2.1 模塊 460
9.2.2 類 463
9.2.3 嵌套(內層類) 465
9.2.4 類型擴展 466
9.2.5 不使用繼承擴展 468
9.3 初始化和終結處理 469
9.3.1 構造函數的選擇 470
9.3.2 引用和值 472
9.3.3 執行順序 475
9.3.4 廢料收集 477
9.4 動態方法約束 478
9.4.1 虛方法和非虛方法 480
9.4.2 抽象類 482
9.4.3 成員查找 482
9.4.4 多態性 486
9.4.5 對象閉包 489
9.5 多重繼承 215 491
9.5.1 語義歧義性 217  
9.5.2 復本式繼承 220  
9.5.3 共享繼承 222  
9.5.4 混入式繼承 223  
9.6 重溫面向對象的程序設計 492
9.6.1 Smalltalk的對象模型 227 493
9.7 總結和注記 494
9.8 練習 495
9.9 探索 498
9.10 有關參考文獻 499
第3部分 其他程序設計模型 503
第10章 函數式語言 505
10.1 歷史淵源 506
10.2 函數式程序設計的概念 507
10.3 Scheme回顧/簡介 509
10.3.1 約束 512
10.3.2 表和數 513
10.3.3 相等檢測和檢索 514
10.3.4 控制流和賦值 515
10.3.5 程序作為表 517
10.3.6 一個擴展的實例:DFA模擬 519
10.4 重溫求值順序 521
10.4.1 嚴格求值和惰性求值 523
10.4.2 I/O:流和單體 525
10.5 高階函數 530
10.6 理論基礎 237 534
10.6.1 lambda 演算 239  
10.6.2 控制流 242  
10.6.3 結構 244  
10.7 函數式程序設計展望 534
10.8 總結和注記 537
10.9 練習 538
10.10 探索 542
10.11 有關參考文獻 543
第11章 邏輯式語言 545
11.1 邏輯式程序設計的概念 546
11.2 Prolog 547
11.2.1 歸結和合一 549
11.2.2 表 550
11.2.3 算術 551
11.2.4 搜索/執行順序 552
11.2.5 一個較大的實例:九宮棋 554
11.2.6 命令式控制流 557
11.3 理論基礎 253 566
11.3.1 子句形式 254  
11.3.2 局限性 255  
11.3.3 Skolem 257  
11.4 邏輯式程序設計的展望 566
11.4.1 沒有覆蓋的邏輯部分 566
11.4.2 執行順序 567
11.4.3 否定和“閉世界”假設 568
11.5 總結和注記 570
11.6 練習 571
11.7 探索 573
11.8 有關參考文獻 573
第12章 并發 575
12.1 基礎和動力 576
12.1.1 多線程程序的各種情況 579
12.1.2 多處理器體系結構 581
12.2 并發程序設計基礎 586
12.2.1 通信和同步 587
12.2.2 語言和庫 588
12.2.3 創建線程的語法 589
12.2.4 線程的實現 598
12.3 實現 603
12.3.1 忙等待同步 604
12.3.2 非阻塞算法 607
12.3.3 內存一致模型 610
12.3.4 調度器的實現 613
12.3.5 信號量 617
12.4 語言級機制 619
12.4.1 管程 619
12.4.2 條件臨界區域 624
12.4.3 Java中的同步 626
12.4.4 事務存儲 629
12.4.5 隱式同步 633
12.5 消息傳遞 263 637
12.5.1 通信對方的命名 263  
12.5.2 發送 267  
12.5.3 接收 272  
12.5.4 遠程過程調用 278  
12.6 總結和注記 638
12.7 練習 640
12.8 探索 645
12.9 有關參考文獻 647
第13章 腳本語言 649
13.1 什么是腳本語言? 650
13.1.1 公共特性 652
13.2 問題領域 655
13.2.1 外殼(命令)語言 655
13.2.2 文字處理和報表生成 663
13.2.3 數學和統計 667
13.2.4 “粘結”語言和通用腳本 668
13.2.5 擴充語言 676
13.3 萬維網腳本 680
13.3.1 CGI腳本 680
13.3.2 嵌入式服務器端腳本 681
13.3.3 客戶端腳本 686
13.3.4 Java小程序 686
13.3.5 XSLT 287 689
13.4 新特征 691
13.4.1 名字和作用域 691
13.4.2 串和模式匹配 696
13.4.3 數據類型 704
13.4.4 面向對象 710
13.5 總結和注記 717
13.6 練習 718
13.7 探索 723
13.8 有關參考文獻 724
第4部分 對實現的近距離考查 727
第14章 構造可運行的程序 729
14.1 后端編譯器結構 729
14.1.1 一種可行的多階段組織 730
14.1.2 階段和遍 734
14.2 中間形式 303 734
14.2.1 Diana 303  
14.2.2 gcc中間形式 306  
14.2.3 基于棧的中間形式 736
14.3 代碼生成 738
14.3.1 一個屬性文法實例 738
14.3.2 寄存器分配 741
14.4 地址空間組織 744
14.5 匯編 746
14.5.1 指令發射 748
14.5.2 為名字指定地址 749
14.6 連接 750
14.6.1 重定位和名字解析 751
14.6.2 類型檢查 751
14.7 動態連接 311 754
14.7.1 與定位無關的代碼 312  
14.7.2 完全動態連接(惰性連接) 313  
14.8 總結和注記 755
14.9 練習 756
14.10 探索 758
14.11 有關參考文獻 759
第15章 運行時程序管理 761
15.1 虛擬機 764
15.1.1 Java虛擬機 766
15.1.2 公共語言基礎架構 775
15.2 機器碼的遲綁定 784
15.2.1 即時和動態編譯 785
15.2.2 二進制翻譯 791
15.2.3 二進制重寫 795
15.2.4 移動代碼和沙箱 797
15.3 審查/自反 799
15.3.1 自反 799
15.3.2 符號調試 806
15.3.3 性能分析 809
15.4 總結和注記 811
15.5 練習 812
15.6 探索 815
15.7 有關參考文獻 816
第16章 代碼改進 321 817
16.1 代碼改進的階段 323  
16.2 窺孔優化 325  
16.3 基本塊內的冗余刪除 328  
16.3.1 一直使用的實例 328  
16.3.2 值編號 331  
16.4 全局冗余刪除和數據流分析 336  
16.4.1 SSA(靜態單賦值)形式和全局值編號 336  
16.4.2 全局公共子表達式刪除 339  
16.5 循環改進I 346  
16.5.1 循環不變量 347  
16.5.2 歸納變量 348  
16.6 指令調度 351  
16.7 循環改進II 355  
16.7.1 循環展開和軟件流水線 355  
16.7.2 循環重排 359  
16.8 寄存器分配 366  
16.9 總結和注記 370  
16.10 練習 377  
16.11 探索  
16.12 有關參考文獻  
附錄A 本書中提到的程序設計語言 819
附錄B 語言設計和語言實現 831
附錄C 編號示表 835
序: