《自制編程語言》學習筆記
本倉庫內容
- 《自制編程語言》源碼
src/sparrow.tgz
- 《自制編程語言》讀書筆記
docs/*
- 《自制編程語言》樣章閱讀
reference/自制編程語言-樣章.pdf等
相關站點
- GitBook訪問地址:https://yifengyou.gitbooks.io/sparrow/content/
- GitHub訪問地址:https://github.com/yifengyou/sparrow/
Something I hope you know before go into the coding~
First, please watch or star this repo, I'll be more happy if you follow me.
Bug report, questions and discussion are welcome, you can post an issue or pull a request.
參考書目
內容簡介
該書全面從腳本語言和虛擬機介紹開始,講解了詞法分析的實現、一些底層數據結構的實現、符號表及類的結構符號表,常量存儲,局部變量,模塊變量,方法存儲、虛擬機原理、運行時棧實現、編譯的實現、語法分析和語法制導自頂向下算符優先構造規則、調試、查看指令流、查看運行時棧、給類添加更多的方法、垃圾回收實現、添加命令行支持命令行接口。
該書旨在用C語言完成一個簡單的腳本語言(A object-oriented script language)。
編程語言用C,編譯環境x86
基礎開發環境
- 宿主操作系統采用CentOS 6.8
- 編譯器Gcc版本 gcc version 4.4.7 20120313(高版本可能需要解決編譯問題,看下面常見問題解決)
《自制編程語言》目錄
- 第0章-一些可能令人迷惑的問題
- 第1章-設計一種面向對象腳本語言
- 第2章-實現詞法分析器
- 第3章-類與對象
- 第4章-原生方法及基礎實現
- 第5章-自上而下算符優先—TDOP
- 第6章-實現語法分析與語義分析
- 第7章-虛擬機
- 第8章-內建類及其方法
- 第9章-垃圾回收
- 第10章-命令行及調試
- 勘誤
常見問題
- 編譯報錯
vm/core.o:在函數‘primObjectIs’中:
/root/github/sparrow/src/c4/b/vm/core.c:103:對‘getClassOfObj’未定義的引用
vm/core.o:在函數‘primObjectType’中:
/root/github/sparrow/src/c4/b/vm/core.c:129:對‘getClassOfObj’未定義的引用
collect2: error: ld returned 1 exit status
makefile:9: recipe for target 'spr' failed
make: *** [spr] Error 1
解決方法:
修改makefile文件,在CFLAGS中添加-fgnu89-inline
CC = gcc
#CFLAGS = -g -DDEBUG -lm -Wall -I object -I vm -I compiler -I parser -I include -I cli -I gc -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers
CFLAGS = -g -lm -Wall -I object -I vm -I compiler -I parser -I include -I cli -I gc -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers -fgnu89-inline
TARGET = spr
DIRS = object include cli compiler parser vm gc
CFILES = $(foreach dir, $(DIRS),$(wildcard $(dir)/*.c))
OBJS = $(patsubst %.c,%.o,$(CFILES))
$(TARGET):$(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(CFLAGS)
clean:
-$(RM) $(TARGET) $(OBJS)
r: clean $(TARGET)
修改過后必須先make clean
一下,你應該知曉makefile是根據時間撮判斷,那么先前編譯通過的,但是並沒有報錯不會再次編譯,畢竟你也沒有改過源碼文件,時間撮也沒有變。
那么如何批量替換呢??考驗shell腳本編程功底,一句話搞定式
find . -name "makefile" | xargs perl -pi -e 's/-Wsystem-headers/-Wsystem-headers -fgnu89-inline/g'
之后便可在高版本gcc中編譯,本人使用的版本是gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3) 運行在Ubuntu 18.04.1 LTS x64