發表於2024-12-13
圖靈程序設計叢書:自製編程語言 pdf epub mobi txt 電子書 下載
隻需編程基礎。
從零開始自製編程語言。
支持麵嚮對象、異常處理等高級機製。
前橋和彌(Maebasi Kazuya),1969年齣生,著有《徵服C指針》、《徹底掌握C語言》、《Java之謎和陷阱》等。其一針見血的“毒舌”文風和對編程語言深刻的見地受到廣大讀者的歡迎。
劉卓,2004年開始從事對日軟件開發工作,其間還從事技術及軟件工程相關培訓工作。自2011年開始從事電力行業産品研發。持續關注企業級應用架構和Web客戶端技術。
徐謙,6年技術開發及項目經驗,曾以技術工程師身份赴日本工作兩年,後歸國聯閤創辦互聯網公司,現居上海繼續創業中。主要從事PHP方嚮的Web開發。熱愛開源,曾嚮Zend Framework等知名PHP開源項目貢獻代碼,並於Github自主研發運維EvaThumber等開源項目獲得國內社區認可。樂於分享技術心得,個人技術博客avnpc.com在國內PHP圈小有影響。
吳雅明,13年編程經驗。其中7年專注於研發基於Java EE和.NET的開發框架以及基於UML 2.0模型的代碼生成工具。目前正帶領團隊開發雲計算PaaS平颱及雲計算自動化配置部署的係統。譯著有《徵服C指針》等。
第1章 引子
1.1 為什麼要製作編程語言
1.2 自製編程語言並不是很難
1.3 本書的構成與麵嚮讀者
1.4 用什麼語言來製作
1.5 要製作怎樣的語言
1.5.1 要設計怎樣的語法
1.5.2 要設計怎樣的運行方式
補充知識 “用戶”指的是誰?
補充知識 解釋器並不會進行翻譯
1.6 環境搭建
1.6.1 搭建開發環境
補充知識 關於bison與flex的安裝
1.6.2 本書涉及的源代碼以及編譯器
第2章 試做一個計算器
2.1 yacc/lex是什麼
補充知識 詞法分析器與解析器是各自獨立的
2.2 試做一個計算器
2.2.1 lex
2.2.2 簡單正則錶達式講座
2.2.3 yacc
2.2.4 生成執行文件
2.2.5 理解衝突所代錶的含義
2.2.6 錯誤處理
2.3 不藉助工具編寫計算器
2.3.1 自製詞法分析器
補充知識 保留字(關鍵字)
補充知識 避免重復包含
2.3.2 自製語法分析器
補充知識 預讀記號的處理
2.4 少許理論知識--LL(1)與LALR(1)
補充知識 Pascal/C 中的語法處理訣竅
2.5 習題:擴展計算器
2.5.1 讓計算器支持括號
2.5.2 讓計算器支持負數
第3章 製作無類型語言crowbar
3.1 製作crowbar ver.0.1語言的基礎部分
3.1.1 crowbar是什麼
3.1.2 程序的結構
3.1.3 數據類型
3.1.4 變量
補充知識 初次賦值兼做變量聲明的理由
補充說明 各種語言的全局變量處理
3.1.5 語句與結構控製
補充知識 elif、elsif、elseif的選擇
3.1.6 語句與運算符
3.1.7 內置函數
3.1.8 讓crowbar支持C 語言調用
3.1.9 從crowbar中調用C 語言(內置函數的編寫)
3.2 預先準備
3.2.1 模塊與命名規則
3.2.2 內存管理模塊MEM
補充知識 valgrind
補充知識 富翁式編程
補充知識 符號錶與扣留操作
3.2.3 調試模塊DBG
3.3 crowbar ver.0.1的實現
3.3.1 crowbar的解釋器--CRB_Interpreter
補充知識 不完全類型
3.3.2 詞法分析--crowbar.l
補充知識 靜態變量的許可範圍
3.3.3 分析樹的構建--crowbar.y 與create.c
3.3.4 常量摺疊
3.3.5 錯誤信息
補充知識 關於crowbar中使用的枚舉型定義
3.3.6 運行--execute.c
3.3.7 錶達式評估--eval.c
3.3.8 值--CRB_Value
3.3.9 原生指針型
3.3.10 變量
3.3.11 字符串與垃圾迴收機製--string_pool.c
3.3.12 編譯與運行
第4章 數組和mark-sweep垃圾迴收器
4.1 crowbar ver.0.2
4.1.1 crowbar的數組
4.1.2 訪問數組元素
4.1.3 數組是一種引用類型
補充知識 “數組的數組”和多維數組
4.1.4 為數組添加元素
4.1.5 增加( 模擬) 函數調用功能
4.1.6 其他細節
4.2 製作mark-sweep GC
4.2.1 引用數據類型的結構
4.2.2 mark-sweep GC
補充知識 引用和immutable
4.2.3 crowbar棧
4.2.4 其他根
4.2.5 原生函數的形式參數
4.3 實現GC 本身
4.3.1 對象的管理方法
4.3.2 GC 何時啓動
4.3.3 sweep階段
補充知識 GC 現存的問題
補充知識 Coping GC
4.4 其他修改
4.4.1 修改語法
4.4.2 函數的模擬
4.4.3 左值的處理
4.4.4 創建數組和原生函數的書寫方法
4.4.5 原生指針類型的修改
第5章 中文支持和Unicode
5.1 中文支持策略和基礎知識
5.1.1 現存問題
5.1.2 寬字符(雙字節)串和多字節字符串
補充知識 wchar_t 肯定能錶示1 個字符嗎?
5.1.3 多字節字符/ 寬字符之間的轉換函數群
5.2 Unicode
5.2.1 Unicode的曆史
5.2.2 Unicode的編碼方式
補充知識 Unicode可以固定(字節)長度嗎?
5.3 crowbar book_ver.0.3的實現
5.3.1 要實現到什麼程度?
5.3.2 發起轉換的時機
5.3.3 關於區域設置
5.3.4 解決0x5C問題
補充知識 失敗的 #ifdef
5.3.5 應該是什麼樣子
補充知識 還可以是彆的樣子--Code Set Independent
第6章 製作靜態類型的語言Diksam
6.1 製作Diksam Ver 0.1語言的基本部分
6.1.1 Diksam的運行狀態
6.1.2 什麼是Diksam
6.1.3 程序結構
6.1.4 數據類型
6.1.5 變量
6.1.6 語句和流程控製
6.1.7 錶達式
6.1.8 內建函數
6.1.9 其他
6.2 什麼是靜態的/ 執行字節碼的語言
6.2.1 靜態類型的語言
6.2.2 什麼是字節碼
6.2.3 將錶達式轉換為字節碼
6.2.4 將控製結構轉換為字節碼
6.2.5 函數的實現
6.3 Diksam ver.0.1的實現--編譯篇
6.3.1 目錄結構
6.3.2 編譯的概要
6.3.3 構建分析樹(create.c)
6.3.4 修正分析樹(fix_tree.c)
6.3.5 Diksam的運行形式--DVM_Executable
6.3.6 常量池
補充知識 YARV 的情況
6.3.7 全局變量
6.3.8 函數
6.3.9 頂層結構的字節碼
6.3.10 行號對應錶
6.3.11 棧的需要量
6.3.12 生成字節碼(generate.c)
6.3.13 生成實際的編碼
6.4 Diksam虛擬機
6.4.1 加載/ 鏈接DVM_Executable到DVM
6.4.2 執行--巨大的switch case
6.4.3 函數調用
第7章 為Diksam引入數組
7.1 Diksam中數組的設計
7.1.1 聲明數組類型的變量
7.1.2 數組常量
補充知識 D 語言的數組
7.2 修改編譯器
7.2.1 數組的語法規則
7.2.2 TypeSpecifier結構體
7.3 修改DVM
7.3.1 增加指令
補充知識 創建Java 的數組常量
補充知識 C 語言中數組的初始化
7.3.2 對象
補充知識 ArrayStoreException
7.3.3 增加null
7.3.4 哎!還缺點什麼吧?
第8章 將類引入Diksam
8.1 分割源文件
8.1.1 包和分割源代碼
補充知識 #include、文件名、行號
8.1.2 DVM_ExecutableList
8.1.3 ExecutableEntry
8.1.4 分開編譯源代碼
8.1.5 加載和再鏈接
補充知識 動態加載時的編譯器
8.2 設計Diksam中的類
8.2.1 超簡單的麵嚮對象入門
8.2.2 類的定義和實例創建
8.2.3 繼承
8.2.4 關於接口
8.2.5 編譯與接口
8.2.6 Diksam怎麼會設計成這樣?
8.2.7 數組和字符串的方法
8.2.8 檢查類的類型
8.2.9 嚮下轉型
8.3 關於類的實現--繼承和多態
8.3.1 字段的內存布局
8.3.2 多態--以單繼承為前提
8.3.3 多繼承--C++
8.3.4 Diksam的多繼承
補充知識 無類型語言中的繼承
8.3.5 重寫的條件
8.4 關於類的實現
8.4.1 語法規則
8.4.2 編譯時的數據結構
8.4.3 DVM_Executable中的數據結構
8.4.4 與類有關的指令
補充知識 方法調用、括號和方法指針
8.4.5 方法調用
8.4.6 super
8.4.7 類的鏈接
8.4.8 實現數組和字符串的方法
8.4.9 類型檢查和嚮下轉型
補充知識 對象終結器(finalizer)和析構函數(destructor)
第9章 應用篇
9.1 為crowbar引入對象和閉包
9.1.1 crowbar的對象
9.1.2 對象實現
9.1.3 閉包
9.1.4 方法
9.1.5 閉包的實現
9.1.6 試著跟蹤程序實際執行時的軌跡
9.1.7 閉包的語法規則
9.1.8 普通函數
9.1.9 模擬方法(修改版)
9.1.10 基於原型的麵嚮對象
9.2 異常處理機製
9.2.1 為crowbar引入異常
9.2.2 setjmp()/longjmp()
補充知識 Java 和C# 異常處理的不同
9.2.3 為Diksam引入異常
補充知識 catch 的編寫方法
9.2.4 異常的數據結構
9.2.5 異常處理時生成的字節碼
9.2.6 受查異常
補充知識 受查異常的是與非
補充知識 異常處理本身的是與非
9.3 構建腳本
9.3.1 基本思路
9.3.2 YY_INPUT
9.3.3 Diksam的構建腳本
9.3.4 三次加載/ 鏈接
9.4 為crowbar引入鬼車
9.4.1 關於“鬼車”
9.4.2 正則錶達式常量
9.4.3 正則錶達式的相關函數
9.5 其他
9.5.1 foreach 和迭代器(crowbar)
9.5.2 switch case(Diksam)
9.5.3 enum(Diksam)
9.5.4 delegate(Diksam)
9.5.5 final、const(Diksam)
附錄A crowbar語言的設計
附錄B Diksam語言的設計
附錄C Diksam Virtual Machine 指令集
編程語言實用化指南--寫在最後
參考文獻
在一些C的入門書中都有這樣一句話:為瞭提高移植性而適當地使用#ifdef。以我的理解,“適當地使用”其實就是“盡量彆用”的意思。因此,這次我(在處理器切換時)使用瞭#ifdef,這對我來說也是一次失敗。
根據處理器不同而使用#ifdef選擇不同代碼片段的話,會使代碼變得很難理解。另外,像這樣分散的代碼通常很難進行充分的測試。在理想狀態下,所有#ifdef的組閤可以伴隨著每日構建進行自動化測試,這感覺還不錯,但是我認為這在實際中很難實現。
如果是為瞭提高移植性,那麼也可以不使用#ifdef來處理各種分支,隻要寫一個盡可能適應各種處理器的代碼不是就行瞭嗎?
編程方麵的著作《程序設計實踐》中有以下記載。
如果我們對於條件編譯持否定態度,那麼就會由此發生一些問題。先不說最麻煩的。條件編譯基本上都不可能進行測試。(中間省略)在對其中一個#ifdef代碼塊進行測試的同時,如果想測試另外的#ifdef代碼塊,除非改變環境使另一個#ifdef代碼塊生效,否則無法進行驗證。
(中間省略)
由此我們得知。讓我們感興趣的是。在所有目標環境中都可以運行的共通性功能。
5.3.1節決定瞭crowbar不處理閤成字符和UCS2範圍以外的字符。
如果隻是為瞭對應中文的話,這樣的設計(指5.3.1節中提到的設計方式)就沒問題瞭。但如果想要完美地實現,恐怕就需要考慮以下幾點(以Unicode為前提)。
1.內部錶現也要使用UTF.8
如果考慮閤成字符的話,就不可能讓字符有固定長度。如果想要取得字符串的第n個字符,每次都必須從字符串的開頭掃描,所以還是算瞭吧。
2.不使用mbtowc()係列函數,自己實現全部的轉換
如果自己保存轉碼錶,就要根據不同的情況使用不同的轉碼錶。比如,在需要和Java兼容的時候要使用Java的轉碼錶,如果要在Windows對話框中顯示一個字符串的時候又要使用Windows的轉碼錶等。
mbtowc()係列函數不僅意味著“在所有的處理器中,總是可以返迴所期望結果”,還錶示“如果自己保存轉碼錶的話,所有轉換都要自己進行”。
作為一個還算現實的做法(隻要能處理好中文就可以瞭),我製作的這個語法處理器,正好解決瞭所有的問題。如果一味追求結果而不能實現也是沒有意義的。
……
這本書是為那些想獨立製作一門編程語言的人而寫的。
一聽到這個話題,有的人會想:太瘋狂瞭,製作編程語言肯定很有難度吧?有人會懷疑:製作編程語言能有什麼用呢?其實這些都是誤解。
製作編程語言在技術層麵上其實並不難,隻要掌握一些基礎知識即可。而且,製作編程語言對於我們深入理解日常使用的C、Java、JavaScript 等語言都有幫助。在一些應用程序的內置腳本語言中,我們也經常會因為種種限製從而萌生製作替代語言的想法。因此,自製編程語言並不是少數極客的個人癖好,它對大多數程序員都頗具實用價值。
日本關於製作編程語言的書已經很多瞭,其中一些還被選定為大學教科書。這些書中常齣現有限狀態機、NFA、LL(1)、LR(1)、SLA 等專業詞匯,同時還大量使用∩、∈等數學符號,對於不熟悉這部分理論知識的人(包括我自己在內)來說非常難以讀懂。針對這種現狀,本書會偏重實踐,避免枯燥的理論。
本書將分彆製作兩種編程語言:crowbar 與Diksam。crowbar 是運行分析樹的無類型語言,Diksam 是運行字節碼的靜態類型語言。無論哪種語言,都具備四則運算、變量、條件分支、循環、函數定義、垃圾迴收等功能,最終版則可以支持麵嚮對象、異常處理等高級機製。總之,作為現代編程語言所必須具備的功能都基本覆蓋瞭(唯一可能沒實現的就是多綫程瞭吧)。所有源代碼都提供下載,讀者可以一邊對照書中的說明一邊調試源代碼,這樣應該不難理解整個程序的運行機製。
當然,要一次實現如此多功能的編程語言,對於初學者而言可能有點吃力,因此本書會詳細介紹crowbar、Diksam 的製作步驟,請放心。
在製作編程語言的過程中,我體會到瞭一種無法用語言形容的快樂。其實無論在日本或其他地區,世界上還有很多人都在嘗試自製編程語言,這正是編程語言不斷增加的原因。如果以本書為契機,有朝一日你也嚮本已混亂的巴比倫之塔再添一門新語言的話,作為本書作者,這將是無上的光榮。
很不錯,下次會再次購買的。
評分薄薄一本書,但是評價貌似很不錯
評分代碼與內容結閤,用的ide可能不太熟練,確實是本入門好書,對整體有個大概瞭解,慢慢在看吧
評分書非常好 雖然沒看但比同價的書要厚很多
評分不錯,很好的書,適閤用C係計算機語言的同學。
評分不錯哦,很全很實用的書,很好
評分很實用,性價比高,五星好評
評分還在研讀,這個係列的書很好
評分看瞭一部分,主要是藉助於第三方的工具進行詞法和語法設計的一門書,其中也有部分說明簡單的自製詞法解析器和語法分析器,作者始終是站在一種分享經驗的角度進行闡述,感覺像是在相互交流一般,很不錯,很有收獲
圖靈程序設計叢書:自製編程語言 pdf epub mobi txt 電子書 下載