出版時間:2012-7 出版社:電子工業(yè)出版社 作者:Scott 頁數(shù):847 字數(shù):1135000
Tag標簽:無
前言
譯 者 序 Michael Scott的《程序設(shè)計語言——實踐之路》(Programming Language Pragmatics)是一本優(yōu)秀的教科書。在網(wǎng)絡(luò)時代計算技術(shù)飛速發(fā)展的背景下,各種創(chuàng)新的軟硬件設(shè)計理念及實踐如雨后春筍般層出不窮,如何將大量的信息組織起來,并突出其核心內(nèi)容,是類似教材的作者們所面臨的現(xiàn)實挑戰(zhàn)。而Scott這本教材最大的特點就在于,它緊緊抓住了處于計算機科學(xué)技術(shù)領(lǐng)域中心位置的主題——程序設(shè)計語言,為讀者深入地探討了程序設(shè)計語言及其實現(xiàn)的關(guān)鍵概念,同時將筆觸延伸到編譯技術(shù)、軟件系統(tǒng)甚至軟硬件體系結(jié)構(gòu)等諸多領(lǐng)域?! ”緯到y(tǒng)地介紹了與程序設(shè)計語言相關(guān)的各種基本概念,內(nèi)容涉及語言處理方面的具體細節(jié),以及各種語言范式。作者在討論各個主題時,將對語言概念的描述與如何實現(xiàn)這些概念的具體說明從整體上結(jié)合在了一起,講解清晰,并且給出了大量的實例。這樣,就使得讀者通過學(xué)習(xí)本書,不僅能“知其然”——了解各種程序設(shè)計語言的實現(xiàn)中所做出的具體選擇,還能夠“知其所以然”——了解這些語言的設(shè)計者做出這些選擇背后的邏輯和取舍?! ”緯木幣欧绞揭卜浅l`活,各章的內(nèi)容相對獨立,每章都有大量隨堂練習(xí)和課后習(xí)題,以幫助讀者鞏固學(xué)到的知識,并啟發(fā)他們做進一步的思考。隨書附帶的光盤上還包含了許多較深入的內(nèi)容。根據(jù)需要,這本教科書可以通過不同的方式組織起來,用于側(cè)重點不同的教學(xué)課程,讀者自學(xué)時也可以根據(jù)自己的情況自由選讀?! ∽髡咴诒緯ǖ?版)中對內(nèi)容做了大量的更新,最明顯的就是增加了關(guān)于運行時程序管理的全新的第15章,以及關(guān)于并發(fā)的第12章的很多改寫,增加了一些較新的主題。這一版本更新了大量的實例(例如用X86上的C代碼代替了Pascal),并且更多地采用了C#、Java 5、Python和Eiffel等現(xiàn)代語言的例子。作者對第3版的改進還體現(xiàn)在許多細節(jié)方面,足以反映出作者之用心?! ”緯诜g的過程中,得到了博文視點總經(jīng)理郭立老師的支持與指導(dǎo),她對IT專業(yè)書籍翻譯的質(zhì)量非常重視,使我們對本書的翻譯不敢有絲毫的懈急,力求達到精益求精。感謝本書的策劃編輯劉皎,是她持續(xù)的鼓勵給予我們信心讓我們繼續(xù)下去。還要感謝那些為本書的翻譯做出貢獻的所有人,他們都是默默無聞的后臺工作者。 誠然,限于譯者水平,書中難免含有一些錯誤和理解不到位的地方,敬請讀者朋友批評指正?! ∽g者 2011年中秋節(jié)于北京
內(nèi)容概要
這是一本很有特色的計算機教材,其核心是討論程序設(shè)計語言的基本原理和技術(shù)。本書融合了傳統(tǒng)的程序設(shè)計語言教科書和編譯教科書的有關(guān)知識,并增加了一些有關(guān)匯編層體系結(jié)構(gòu)的材料,以滿足沒學(xué)過計算機組織的學(xué)生們的需要。書中通過各種語言的例子,闡釋了程序設(shè)計語言的重要基礎(chǔ)概念,討論了各種概念之間的關(guān)系,解釋了語言中許多結(jié)構(gòu)的形成和發(fā)展過程,以及它們演化為今天這種形式的根源。書中還詳細討論了編譯器的工作方式和工作過程,說明它們對源程序做了什么,以及為什么要那樣做。書的每章最后附有復(fù)習(xí)題和一些更具挑戰(zhàn)性的練習(xí)與探索。這些練習(xí)的特別價值在于引導(dǎo)學(xué)生進一步深入理解各種語言和技術(shù)。本書第3版新增了關(guān)于運行時程序管理的討論,對關(guān)于并發(fā)的一章做了重大的改寫,并更新了大量的實例。
這本教材在美國大學(xué)已使用了二十余年,目前被歐美許多重要大學(xué)用于“程序設(shè)計語言”或者“軟件系統(tǒng)”課程。
作者簡介
作者:(美)Scott
書籍目錄
第1部分 基礎(chǔ)
第1章 引言
1.1 語言設(shè)計的藝術(shù)
1.2 程序設(shè)計語言的譜系
1.3 為什么要研究程序設(shè)計語言?
1.4 編譯和解釋
1.5 程序設(shè)計環(huán)境
1.6 編譯概覽
1.6.1 詞法和語法分析
1.6.2 語義分析和中間代碼生成
1.6.3 目標代碼生成
1.6.4 代碼改進
1.7 總結(jié)和注記
1.8 練習(xí)
1.9 探索
1.10 有關(guān)參考文獻
第2章 程序設(shè)計語言的語法
2.1 描述語法:正則表達式和上下文無關(guān)文法
2.1.1 單詞和正則表達式
2.1.2 上下文無關(guān)文法
2.1.3 推導(dǎo)和語法分析樹
2.2 掃描
2.2.1 生成一個有窮自動機
2.2.2 掃描器代碼
2.2.3 表格驅(qū)動的掃描
2.2.4 詞法錯誤
2.2.5 編譯指示
2.3 語法分析
2.3.1 遞歸下降
2.3.2 表格驅(qū)動的自上而下語法分析
2.3.3 自下而上的語法分析
2.3.4 語法錯誤
2.4 理論基礎(chǔ)
2.4.1 有窮自動機 13
2.4.2 下推自動機 18
2.4.3 文法和語言類 19
2.5 總結(jié)和注記
2.6 練習(xí)
2.7 探索
2.8 有關(guān)參考文獻
第3章 名字、作用域和約束
3.1 約束時間的概念
3.2 對象生存期和存儲管理
3.2.1 靜態(tài)分配
3.2.2 基于棧的分配
3.2.3 基于堆的分配
3.2.4 廢料收集
3.3 作用域規(guī)則
3.3.1 靜態(tài)作用域
3.3.2 嵌套子程序
3.3.3 聲明的順序
3.3.4 模塊
3.3.5 模塊類型和類
3.3.6 動態(tài)作用域
3.4 作用域的實現(xiàn)
3.4.1 符號表
3.4.2 關(guān)聯(lián)表和中心引用表
3.5 作用域中名字的含義
3.5.1 別名
3.5.2 重載
3.5.3 多態(tài)性及相關(guān)概念
3.6 引用環(huán)境的約束
3.6.1 子程序閉包
3.6.2 一級值和非受限生存期
3.6.3 對象閉包
3.7 宏擴展
3.8 分別編譯
3.8.1 C的分別編譯
3.8.2 包和自動頭文件推理
3.8.3 模塊分層結(jié)構(gòu)
3.9 總結(jié)和注記
3.10 練習(xí)
3.11 探索
3.12 有關(guān)參考文獻
第4章 語義分析
4.1 語義分析器所扮演的角色
4.2 屬性文法
4.3 屬性求值
4.4 動作例程
4.5 屬性的空間管理
4.5.1 自下而上求值
4.5.2 自上而下求值
4.6 語法樹的標注
4.7 總結(jié)和注記
4.8 練習(xí)
4.9 探索
4.10 有關(guān)參考文獻
第5章 目標機體系結(jié)構(gòu)
5.1 存儲器層次結(jié)構(gòu)
5.2 數(shù)據(jù)表示
5.2.1 整數(shù)算術(shù)
5.2.2 浮點數(shù)算術(shù)
5.3 指令集體系結(jié)構(gòu)
5.3.1 尋址模式
5.3.2 條件和分支
5.4 體系結(jié)構(gòu)和實現(xiàn)
5.4.1 微程序設(shè)計
5.4.2 微處理器
5.4.3 RISC
5.4.4 多線程和多核
5.4.5 兩個示例體系結(jié)構(gòu):x86和MIPS
5.5 為新型處理器做編譯
5.5.1 保持流水線滿
5.5.2 寄存器分配
5.6 總結(jié)和注記
5.7 練習(xí)
5.8 探索
5.9 有關(guān)參考文獻
第2部分 語言設(shè)計的核心問題
第6章 控制流
6.1 表達式求值
6.1.1 優(yōu)先級和結(jié)合性
6.1.2 賦值
6.1.3 初始化
6.1.4 表達式中的順序問題
6.1.5 短路求值
6.2 結(jié)構(gòu)化和非結(jié)構(gòu)化的流程
6.2.1 goto的結(jié)構(gòu)化替代品
6.2.2 繼續(xù)
6.3 順序執(zhí)行
6.4 選擇
6.4.1 短路條件
6.4.2 Case/Switch語句
6.5 迭代
6.5.1 枚舉控制的循環(huán)
6.5.2 組合循環(huán)
6.5.3 迭代器
6.5.4 lcon的生成器
6.5.5 邏輯控制的循環(huán)
6.6 遞歸
6.6.1 迭代和遞歸
6.6.2 應(yīng)用序和正則序求值
6.7 非確定性
6.8 總結(jié)和注記
6.9 練習(xí)
6.10 探索
6.11 有關(guān)參考文獻
第7章 數(shù)據(jù)類型
7.1 類型系統(tǒng)
7.1.1 類型檢查
7.1.2 多態(tài)性
7.1.3 “類型”的含義
7.1.4 類型的分類
7.1.5 正交性
7.2 類型檢查
7.2.1 類型等價
7.2.2 類型相容性
7.2.3 類型推理
7.2.4 ML類型系統(tǒng)
7.3 記錄(結(jié)構(gòu))與變體(聯(lián)合)
7.3.1 語法和運算
7.3.2 存儲布局及其影響
7.33 with語句
7.3.4 變體記錄(聯(lián)合)
7.4 數(shù)組
7.4.1 語法和操作
7.4.2 維數(shù)、上下界和分配
7.4.3 內(nèi)存布局
7.5 字符串
7.6 集合
7.7 指針和遞歸類型
7.7.1 語法和操作
7.7.2 懸空引用
7.7.3 廢料收集
7.8 表
7.9 文件和輸入/輸出
7.9.1 交互式I/O
7.9.2 基于文件的I/O
7.9.3 正文I/O
7.10 相等檢測和賦值
7.11 總結(jié)和注記
7.12 練習(xí)
7.13 探索
7.14 有關(guān)參考文獻
第8章 子程序和控制抽象
8.1 回顧棧的布局
8.2 調(diào)用序列
8.2.1 區(qū)頭向量
8.2.2 案例研究:在MIPS上實現(xiàn)C,在x86上實現(xiàn)Pascal
8.2.3 寄存器窗口
8.2.4 內(nèi)聯(lián)展開
8.3 參數(shù)傳遞
8.3.1 參數(shù)模式
8.3.2 名字調(diào)用
8.3.3 特殊目的的參數(shù)
8.3.4 函數(shù)返回
8.4 泛型子程序和模塊
8.4.1 不同的實現(xiàn)方法
8.4.2 泛型參數(shù)的約束條件
8.4.3 隱式實例化
8.4.4 C++、Java和C#中的泛型
8.5 異常處理
8.5.1 異常的定義
8.5.2 異常的傳播
8.5.3 異常的實現(xiàn)
8.6 協(xié)作程序
8.6.1 棧分配
8.6.2 轉(zhuǎn)移
8.6.3 迭代器的實現(xiàn)
8.6.4 離散事件模擬
8.7 事件
8.7.1 順序處理程序
8.7.2 基于線程的處理程序
4.8 總結(jié)和注記
8.9 練習(xí)
8.10 探索
8.11 有關(guān)參考文獻
第9章 數(shù)據(jù)抽象和面向?qū)ο?br />9.1 面向?qū)ο蟪绦蛟O(shè)計
9.2 封裝和繼承
9.2.1 模塊
9.2.2 類
9.2.3 嵌套(內(nèi)層類)
9.2.4 類型擴展
9.2.5 不使用繼承擴展
9.3 初始化和終結(jié)處理
9.3.1 構(gòu)造函數(shù)的選擇
9.3.2 引用和值
9.3.3 執(zhí)行順序
9.3.4 廢料收集
9.4 動態(tài)方法約束
9.4.1 虛方法和非虛方法
9.4.2 抽象類
9.4.3 成員查找
9.4.4 多態(tài)性
9.4.5 對象閉包
9.5 多重繼承
9.5.1 語義歧義性
9.5.2 復(fù)本式繼承
9.5.3 共享繼承
9.5.4 混入式繼承
9.6 重溫面向?qū)ο蟮某绦蛟O(shè)計
9.6.1 Smalltalk的對象模型
9.7 總結(jié)和注記
9.8 練習(xí)
9.9 探索
9.10 有關(guān)參考文獻
第3部分 其他程序設(shè)計模型
第10章 函數(shù)式語言
10.1 歷史淵源
10.2 函數(shù)式程序設(shè)計的概念
10.3 Scheme回顧/簡介
10.3.1 約束
10.3.2 表和數(shù)
10.3.3 相等檢測和檢索
10.3.4 控制流和賦值
10.3.5 程序作為表
10.3.6 一個擴展的實例:DFA模擬
10.4 重溫求值順序
10.4.1 嚴格求值和惰性求值
10.4.2 I/O:流和單體
10.5 高階函數(shù)
10.6 理論基礎(chǔ)
10.6.1 lambda 演算
10.6.2 控制流
10.6.3 結(jié)構(gòu)
10.7 函數(shù)式程序設(shè)計展望
10.8 總結(jié)和注記
10.9 練習(xí)
10.10 探索
10.11 有關(guān)參考文獻
第11章 邏輯式語言
11.1 邏輯式程序設(shè)計的概念
11.2 Prolog
11.2.1 歸結(jié)和合一
11.2.2 表
11.2.3 算術(shù)
11.2.4 搜索/執(zhí)行順序
11.2.5 一個較大的實例:九宮棋
11.2.6 命令式控制流
11.3 理論基礎(chǔ)
11.3.1 子句形式
11.3.2 局限性
11.3.3 Skolem
11.4 邏輯式程序設(shè)計的展望
11.4.1 沒有覆蓋的邏輯部分
11.4.2 執(zhí)行順序
11.4.3 否定和“閉世界”假設(shè)
11.5 總結(jié)和注記
11.6 練習(xí)
11.7 探索
11.8 有關(guān)參考文獻
第12章 并發(fā)
12.1 基礎(chǔ)和動力
12.1.1 多線程程序的各種情況
12.1.2 多處理器體系結(jié)構(gòu)
12.2 并發(fā)程序設(shè)計基礎(chǔ)
12.2.1 通信和同步
12.2.2 語言和庫
12.2.3 創(chuàng)建線程的語法
12.2.4 線程的實現(xiàn)
12.3 實現(xiàn)
12.3.1 忙等待同步
12.3.2 非阻塞算法
12.3.3 內(nèi)存一致模型
12.3.4 調(diào)度器的實現(xiàn)
12.3.5 信號量
12.4 語言級機制
12.4.1 管程
12.4.2 條件臨界區(qū)域
12.4.3 Java中的同步
12.4.4 事務(wù)存儲
12.4.5 隱式同步
12.5 消息傳遞
12.5.1 通信對方的命名
12.5.2 發(fā)送
12.5.3 接收
12.5.4 遠程過程調(diào)用
12.6 總結(jié)和注記
12.7 練習(xí)
12.8 探索
12.9 有關(guān)參考文獻
第13章 腳本語言
13.1 什么是腳本語言?
13.1.1 公共特性
13.2 問題領(lǐng)域
13.2.1 外殼(命令)語言
13.2.2 文字處理和報表生成
13.2.3 數(shù)學(xué)和統(tǒng)計
13.2.4 “粘結(jié)”語言和通用腳本
13.2.5 擴充語言
13.3 萬維網(wǎng)腳本
13.3.1 CGI腳本
13.3.2 嵌入式服務(wù)器端腳本
13.3.3 客戶端腳本
13.3.4 Java小程序
13.3.5 XSLT
13.4 新特征
13.4.1 名字和作用域
13.4.2 串和模式匹配
13.4.3 數(shù)據(jù)類型
13.4.4 面向?qū)ο?br />13.5 總結(jié)和注記
13.6 練習(xí)
13.7 探索
13.8 有關(guān)參考文獻
第4部分 對實現(xiàn)的近距離考查
第14章 構(gòu)造可運行的程序
14.1 后端編譯器結(jié)構(gòu)
14.1.1 一種可行的多階段組織
14.1.2 階段和遍
14.2 中間形式
14.2.1 Diana
14.2.2 gcc中間形式
14.2.3 基于棧的中間形式
14.3 代碼生成
14.3.1 一個屬性文法實例
14.3.2 寄存器分配
14.4 地址空間組織
14.5 匯編
14.5.1 指令發(fā)射
14.5.2 為名字指定地址
14.6 連接
14.6.1 重定位和名字解析
14.6.2 類型檢查
14.7 動態(tài)連接
14.7.1 與定位無關(guān)的代碼
14.7.2 完全動態(tài)連接(惰性連接)
14.8 總結(jié)和注記
14.9 練習(xí)
14.10 探索
14.11 有關(guān)參考文獻
第15章 運行時程序管理
15.1 虛擬機
15.1.1 Java虛擬機
15.1.2 公共語言基礎(chǔ)架構(gòu)
15.2 機器碼的遲綁定
15.2.1 即時和動態(tài)編譯
15.2.2 二進制翻譯
15.2.3 二進制重寫
15.2.4 移動代碼和沙箱
15.3 審查/自反
15.3.1 自反
15.3.2 符號調(diào)試
15.3.3 性能分析
15.4 總結(jié)和注記
15.5 練習(xí)
15.6 探索
15.7 有關(guān)參考文獻
第16章 代碼改進
16.1 代碼改進的階段
16.2 窺孔優(yōu)化
16.3 基本塊內(nèi)的冗余刪除
16.3.1 一直使用的實例
16.3.2 值編號
16.4 全局冗余刪除和數(shù)據(jù)流分析
16.4.1 SSA(靜態(tài)單賦值)形式和全局值編號
16.4.2 全局公共子表達式刪除
16.5 循環(huán)改進I
16.5.1 循環(huán)不變量
16.5.2 歸納變量
16.6 指令調(diào)度
16.7 循環(huán)改進II
16.7.1 循環(huán)展開和軟件流水線
16.7.2 循環(huán)重排
16.8 寄存器分配
16.9 總結(jié)和注記
16.10 練習(xí)
16.11 探索
16.12 有關(guān)參考文獻
附錄A 本書中提到的程序設(shè)計語言
附錄B 語言設(shè)計和語言實現(xiàn)
附錄C 編號示表
章節(jié)摘錄
版權(quán)頁: 插圖: 超級計算機 超級計算雖然與計算機行業(yè)的其他領(lǐng)域相比在財務(wù)上相形見絀,但是它在計算機技術(shù)的發(fā)展以及人類知識的進步方面,始終扮演著遠超其實際投入的角色。超級計算機隨著時間的推移已經(jīng)發(fā)生了巨大的變化,并且仍然繼續(xù)以非常快的速度發(fā)展著。不過,它們始終都是并行的機器。 由于緩存一致性的復(fù)雜性,很難構(gòu)造出大型的共享存儲機器。SGI銷售擁有512個處理器(1024個核)的機器。Cray構(gòu)造出了更大的共享存儲機器,但是并不能緩存遠程的位置。然而,傳統(tǒng)的向量機器在很大程度上不僅被大型多處理器機器替代,而且也被相當(dāng)數(shù)量的較小多處理器或非常多的連接到高性能網(wǎng)絡(luò)上的商用(主流)單處理器機器替代。隨著網(wǎng)絡(luò)技術(shù)“向下流淌”到更廣泛的市場中,這些機器又被由商用處理器(通常是多核的)和商用網(wǎng)絡(luò)(吉比特以太網(wǎng)或無限帶寬)組成的集群取代。截止到2008年,集群已經(jīng)在從大量的服務(wù)器場到除極快的超級計算機站點之外的所有領(lǐng)域中都處于優(yōu)勢地位。Google、Amazon或eBay等大規(guī)模在線服務(wù)通常都是由成百甚至上千個處理器支持的(以Google為例,這一數(shù)字也許達到數(shù)十萬)。 如今最快的機器是由特殊的高密度、低功能多核芯片構(gòu)成的。IBM的BlueGene/P系統(tǒng)使用了4核、16瓦PowerPC處理器。IBM最近完成的RoadRunner系統(tǒng)(2008年6月時世界上最快的系統(tǒng))使用的是90瓦PowerXCell處理器,與Sony Playstation 3中使用的處理器類似。每個Cell處理器都包含一個雙線程PowerPC和8個小向量核。根據(jù)當(dāng)前的趨勢,看起來未來的高端和商用機器,都將變得越來越密集和多樣化。 從程序設(shè)計語言的角度來看,超級計算的特殊挑戰(zhàn)在于適應(yīng)不統(tǒng)一的訪問時間和(在大多數(shù)情況下)缺少硬件對跨整個機器共享訪問的支持。如今的超級計算機在編程時,主要是使用消息傳遞庫(特別是MPI)和局部及遠程存儲訪問之間存在顯著區(qū)別的語言和庫來進行的。
編輯推薦
《程序設(shè)計語言:實踐之路(第3版)》在美國大學(xué)已使用了二十余年,目前被歐美許多重要大學(xué)用于“程序設(shè)計語言”或者“軟件系統(tǒng)”課程?!冻绦蛟O(shè)計語言:實踐之路(第3版)》適合高年級本科生或者一年級研究生使用,許多內(nèi)容對專業(yè)程序員也很有價值。
名人推薦
對于語言設(shè)計和實現(xiàn)而言,本書是一本出色的入門書。它不僅闡述了我們使用的那些語言背后的理論基礎(chǔ),還闡明了計算機體系結(jié)構(gòu)的發(fā)展是如何引導(dǎo)這些理論的,以及這些理論將如何繼續(xù)發(fā)展,以面對利用多核硬件的挑戰(zhàn)。 ——Tim Harris,微軟研究院
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載