最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

自制編程語言

2023-06-05 17:02 作者:遲到的火龍果  | 我要投稿

鏈接:https://pan.baidu.com/s/1xDbDLHZ-lQhN-dJN99qSUA?pwd=hgbi?

提取碼:hgbi

  只需編程基礎(chǔ)。
  從零開始自制編程語言。
  支持面向?qū)ο?、異常處理等高級機制。

內(nèi)容簡介

  《圖靈程序設(shè)計叢書:自制編程語言》手把手地教讀者用C語言制作兩種編程語言:crowbar與Diksam。crowbar是運行分析樹的無類型語言,Diksam是運行字節(jié)碼的靜態(tài)類型語言。這兩種語言都具備四則運算、變量、條件分支、循環(huán)、函數(shù)定義、垃圾回收等功能,最終版則可以支持面向?qū)ο?、異常處理等高級機制。所有源代碼都提供下載,讀者可以一邊對照書中的說明一邊調(diào)試源代碼。這個過程對理解程序的運行機制十分有幫助。

第1章 引子
1.1 為什么要制作編程語言
1.2 自制編程語言并不是很難
1.3 本書的構(gòu)成與面向讀者
1.4 用什么語言來制作
1.5 要制作怎樣的語言
1.5.1 要設(shè)計怎樣的語法
1.5.2 要設(shè)計怎樣的運行方式
補充知識 “用戶”指的是誰?
補充知識 解釋器并不會進行翻譯
1.6 環(huán)境搭建
1.6.1 搭建開發(fā)環(huán)境
補充知識 關(guān)于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 生成執(zhí)行文件
2.2.5 理解沖突所代表的含義
2.2.6 錯誤處理
2.3 不借助工具編寫計算器
2.3.1 自制詞法分析器
補充知識 保留字(關(guān)鍵字)
補充知識 避免重復(fù)包含
2.3.2 自制語法分析器
補充知識 預(yù)讀記號的處理
2.4 少許理論知識--LL(1)與LALR(1)
補充知識 Pascal/C 中的語法處理訣竅
2.5 習(xí)題:擴展計算器
2.5.1 讓計算器支持括號
2.5.2 讓計算器支持負數(shù)

第3章 制作無類型語言crowbar
3.1 制作crowbar ver.0.1語言的基礎(chǔ)部分
3.1.1 crowbar是什么
3.1.2 程序的結(jié)構(gòu)
3.1.3 數(shù)據(jù)類型
3.1.4 變量
補充知識 初次賦值兼做變量聲明的理由
補充說明 各種語言的全局變量處理
3.1.5 語句與結(jié)構(gòu)控制
補充知識 elif、elsif、elseif的選擇
3.1.6 語句與運算符
3.1.7 內(nèi)置函數(shù)
3.1.8 讓crowbar支持C 語言調(diào)用
3.1.9 從crowbar中調(diào)用C 語言(內(nèi)置函數(shù)的編寫)
3.2 預(yù)先準(zhǔn)備
3.2.1 模塊與命名規(guī)則
3.2.2 內(nèi)存管理模塊MEM
補充知識 valgrind
補充知識 富翁式編程
補充知識 符號表與扣留操作
3.2.3 調(diào)試模塊DBG
3.3 crowbar ver.0.1的實現(xiàn)
3.3.1 crowbar的解釋器--CRB_Interpreter
補充知識 不完全類型
3.3.2 詞法分析--crowbar.l
補充知識 靜態(tài)變量的許可范圍
3.3.3 分析樹的構(gòu)建--crowbar.y 與create.c
3.3.4 常量折疊
3.3.5 錯誤信息
補充知識 關(guān)于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章 數(shù)組和mark-sweep垃圾回收器
4.1 crowbar ver.0.2
4.1.1 crowbar的數(shù)組
4.1.2 訪問數(shù)組元素
4.1.3 數(shù)組是一種引用類型
補充知識 “數(shù)組的數(shù)組”和多維數(shù)組
4.1.4 為數(shù)組添加元素
4.1.5 增加( 模擬) 函數(shù)調(diào)用功能
4.1.6 其他細節(jié)
4.2 制作mark-sweep GC
4.2.1 引用數(shù)據(jù)類型的結(jié)構(gòu)
4.2.2 mark-sweep GC
補充知識 引用和immutable
4.2.3 crowbar棧
4.2.4 其他根
4.2.5 原生函數(shù)的形式參數(shù)
4.3 實現(xiàn)GC 本身
4.3.1 對象的管理方法
4.3.2 GC 何時啟動
4.3.3 sweep階段
補充知識 GC 現(xiàn)存的問題
補充知識 Coping GC
4.4 其他修改
4.4.1 修改語法
4.4.2 函數(shù)的模擬
4.4.3 左值的處理
4.4.4 創(chuàng)建數(shù)組和原生函數(shù)的書寫方法
4.4.5 原生指針類型的修改

第5章 中文支持和Unicode
5.1 中文支持策略和基礎(chǔ)知識
5.1.1 現(xiàn)存問題
5.1.2 寬字符(雙字節(jié))串和多字節(jié)字符串
補充知識 wchar_t 肯定能表示1 個字符嗎?
5.1.3 多字節(jié)字符/ 寬字符之間的轉(zhuǎn)換函數(shù)群
5.2 Unicode
5.2.1 Unicode的歷史
5.2.2 Unicode的編碼方式
補充知識 Unicode可以固定(字節(jié))長度嗎?
5.3 crowbar book_ver.0.3的實現(xiàn)
5.3.1 要實現(xiàn)到什么程度?
5.3.2 發(fā)起轉(zhuǎn)換的時機
5.3.3 關(guān)于區(qū)域設(shè)置
5.3.4 解決0x5C問題
補充知識 失敗的 #ifdef
5.3.5 應(yīng)該是什么樣子
補充知識 還可以是別的樣子--Code Set Independent

第6章 制作靜態(tài)類型的語言Diksam
6.1 制作Diksam Ver 0.1語言的基本部分
6.1.1 Diksam的運行狀態(tài)
6.1.2 什么是Diksam
6.1.3 程序結(jié)構(gòu)
6.1.4 數(shù)據(jù)類型
6.1.5 變量
6.1.6 語句和流程控制
6.1.7 表達式
6.1.8 內(nèi)建函數(shù)
6.1.9 其他
6.2 什么是靜態(tài)的/ 執(zhí)行字節(jié)碼的語言
6.2.1 靜態(tài)類型的語言
6.2.2 什么是字節(jié)碼
6.2.3 將表達式轉(zhuǎn)換為字節(jié)碼
6.2.4 將控制結(jié)構(gòu)轉(zhuǎn)換為字節(jié)碼
6.2.5 函數(shù)的實現(xiàn)
6.3 Diksam ver.0.1的實現(xiàn)--編譯篇
6.3.1 目錄結(jié)構(gòu)
6.3.2 編譯的概要
6.3.3 構(gòu)建分析樹(create.c)
6.3.4 修正分析樹(fix_tree.c)
6.3.5 Diksam的運行形式--DVM_Executable
6.3.6 常量池
補充知識 YARV 的情況
6.3.7 全局變量
6.3.8 函數(shù)
6.3.9 頂層結(jié)構(gòu)的字節(jié)碼
6.3.10 行號對應(yīng)表
6.3.11 棧的需要量
6.3.12 生成字節(jié)碼(generate.c)
6.3.13 生成實際的編碼
6.4 Diksam虛擬機
6.4.1 加載/ 鏈接DVM_Executable到DVM
6.4.2 執(zhí)行--巨大的switch case
6.4.3 函數(shù)調(diào)用

第7章 為Diksam引入數(shù)組
7.1 Diksam中數(shù)組的設(shè)計
7.1.1 聲明數(shù)組類型的變量
7.1.2 數(shù)組常量
補充知識 D 語言的數(shù)組
7.2 修改編譯器
7.2.1 數(shù)組的語法規(guī)則
7.2.2 TypeSpecifier結(jié)構(gòu)體
7.3 修改DVM
7.3.1 增加指令
補充知識 創(chuàng)建Java 的數(shù)組常量
補充知識 C 語言中數(shù)組的初始化
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 加載和再鏈接
補充知識 動態(tài)加載時的編譯器
8.2 設(shè)計Diksam中的類
8.2.1 超簡單的面向?qū)ο笕腴T
8.2.2 類的定義和實例創(chuàng)建
8.2.3 繼承
8.2.4 關(guān)于接口
8.2.5 編譯與接口
8.2.6 Diksam怎么會設(shè)計成這樣?
8.2.7 數(shù)組和字符串的方法
8.2.8 檢查類的類型
8.2.9 向下轉(zhuǎn)型
8.3 關(guān)于類的實現(xiàn)--繼承和多態(tài)
8.3.1 字段的內(nèi)存布局
8.3.2 多態(tài)--以單繼承為前提
8.3.3 多繼承--C++
8.3.4 Diksam的多繼承
補充知識 無類型語言中的繼承
8.3.5 重寫的條件
8.4 關(guān)于類的實現(xiàn)
8.4.1 語法規(guī)則
8.4.2 編譯時的數(shù)據(jù)結(jié)構(gòu)
8.4.3 DVM_Executable中的數(shù)據(jù)結(jié)構(gòu)
8.4.4 與類有關(guān)的指令
補充知識 方法調(diào)用、括號和方法指針
8.4.5 方法調(diào)用
8.4.6 super
8.4.7 類的鏈接
8.4.8 實現(xiàn)數(shù)組和字符串的方法
8.4.9 類型檢查和向下轉(zhuǎn)型
補充知識 對象終結(jié)器(finalizer)和析構(gòu)函數(shù)(destructor)

第9章 應(yīng)用篇
9.1 為crowbar引入對象和閉包
9.1.1 crowbar的對象
9.1.2 對象實現(xiàn)
9.1.3 閉包
9.1.4 方法
9.1.5 閉包的實現(xiàn)
9.1.6 試著跟蹤程序?qū)嶋H執(zhí)行時的軌跡
9.1.7 閉包的語法規(guī)則
9.1.8 普通函數(shù)
9.1.9 模擬方法(修改版)
9.1.10 基于原型的面向?qū)ο?br>9.2 異常處理機制
9.2.1 為crowbar引入異常
9.2.2 setjmp()/longjmp()
補充知識 Java 和C# 異常處理的不同
9.2.3 為Diksam引入異常
補充知識 catch 的編寫方法
9.2.4 異常的數(shù)據(jù)結(jié)構(gòu)
9.2.5 異常處理時生成的字節(jié)碼
9.2.6 受查異常
補充知識 受查異常的是與非
補充知識 異常處理本身的是與非
9.3 構(gòu)建腳本
9.3.1 基本思路
9.3.2 YY_INPUT
9.3.3 Diksam的構(gòu)建腳本
9.3.4 三次加載/ 鏈接
9.4 為crowbar引入鬼車
9.4.1 關(guān)于“鬼車”
9.4.2 正則表達式常量
9.4.3 正則表達式的相關(guān)函數(shù)
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語言的設(shè)計
附錄B Diksam語言的設(shè)計
附錄C Diksam Virtual Machine 指令集
編程語言實用化指南--寫在最后
參考文獻

查看全部↓

精彩書摘

  在一些C的入門書中都有這樣一句話:為了提高移植性而適當(dāng)?shù)厥褂?ifdef。以我的理解,“適當(dāng)?shù)厥褂谩逼鋵嵕褪恰氨M量別用”的意思。因此,這次我(在處理器切換時)使用了#ifdef,這對我來說也是一次失敗。
  根據(jù)處理器不同而使用#ifdef選擇不同代碼片段的話,會使代碼變得很難理解。另外,像這樣分散的代碼通常很難進行充分的測試。在理想狀態(tài)下,所有#ifdef的組合可以伴隨著每日構(gòu)建進行自動化測試,這感覺還不錯,但是我認為這在實際中很難實現(xiàn)。
  如果是為了提高移植性,那么也可以不使用#ifdef來處理各種分支,只要寫一個盡可能適應(yīng)各種處理器的代碼不是就行了嗎?
  編程方面的著作《程序設(shè)計實踐》中有以下記載。
  如果我們對于條件編譯持否定態(tài)度,那么就會由此發(fā)生一些問題。先不說最麻煩的。條件編譯基本上都不可能進行測試。(中間省略)在對其中一個#ifdef代碼塊進行測試的同時,如果想測試另外的#ifdef代碼塊,除非改變環(huán)境使另一個#ifdef代碼塊生效,否則無法進行驗證。
 ?。ㄖ虚g省略)
  由此我們得知。讓我們感興趣的是。在所有目標(biāo)環(huán)境中都可以運行的共通性功能。


自制編程語言的評論 (共 條)

分享到微博請遵守國家法律
普定县| 金华市| 宁国市| 中牟县| 万宁市| 靖远县| 交口县| 罗定市| 孝感市| 晴隆县| 隆昌县| 沁水县| 蓬溪县| 萨迦县| 兰坪| 明水县| 梁平县| 水城县| 通海县| 博客| 宁城县| 常州市| 马关县| 塔城市| 永宁县| 萨嘎县| 双牌县| 拜城县| 绥中县| 彭阳县| 昌江| 龙井市| 柳州市| 昭平县| 黄梅县| 柞水县| 邯郸县| 瑞金市| 白城市| 同德县| 合水县|