如何開發編譯器?
聽輪子叔說VS是用當前版本開發新版?
那麼編譯器是用什麼工具或哪些語言開發的?PS:題主現在大一,計算機網路專業,有一點C、Obj-C基礎。我希望在iOS平台上開發C的編譯器,需要學習哪些東西。看了輪(@vczh )叔的進入2012 -- 回顧我走過的編程之路,很是慚愧。現在,感覺自己一直在搬磚。不知道在學校的這幾年能不能做出一個能用的編譯器?
熟悉IDE:Xcode
做個編譯器這種事情現在已經太簡單了,去看一下LLVM的文檔,試一下它給的幾個例子,然後試著自己實現一個BrainFuck的解析器吧。
別看這BrainFuck的語法真的很Fuck,但是玩起來挺有趣的。
像 @徐辰 大大就用LLVM寫了個帶JIT的BrainFuck解析器(windoze/brainfuck · GitHub),而且在test裡面居然用BrainFuck寫出了OO(brainfuck/oobrain.b at master · windoze/brainfuck · GitHub)!23333333
另外,學一下Haskell也可以很方便實現一個編譯器的,這門語言用來寫Parser感覺就像它就是為寫Parser而生的一樣,有一篇經典的文章Write Yourself a Scheme in 48 Hours。
不過少年,你真的要在iOS上做開發么?能,只要認真學,且不要在iOS上寫編譯器。
先看個簡版的吧:http://zserge.com/blog/cucu-part1.html
之前也寫過幾個parser,最近在寫 CodeParse/hobby_script at master · lfkdsk/CodeParse · GitHub 這個,一個能跑在JVM上的解釋器,相應的後端還沒有寫,不過目前也已經很完善了,能使用一些基礎的數據結構。例如這個就是模仿Java中的ArrayList的動態數組實現。
class ArrayList {
DEFAULT_SIZE = 1;
theItems = 0;
theSize = 0;
function Initial(){
Clear();
};
function Clear(){
theSize = 0;
ensureCapacity(DEFAULT_SIZE);
};
function Size(){
theSize;
};
function IsEmpty(){
theSize == 0;
};
function ensureCapacity(newSize){
if (newSize &> theSize){
old = theItems;
theItems = &
for (i = 0; i &< Size(); i = i + 1) { theItems[i] = old[i]; } } }; function Add(value) { add(Size(),value); }; function add(index,value){ if(length(theItems) == Size()){ ensureCapacity(Size() * 2 + 1); } for (i = theSize; i &> index; i = i - 1) {
theItems[i] = theItems[i - 1];
}
theItems[index] = value;
theSize = theSize + 1;
};
function Get(index){
if(index &> -1){
if(index &< Size() + 1){
theItems[index];
}
}
}
function Set(index,value){
if (index &> -1){
if(index &< Size() + 1){
theItems[index] = value;
}
}
}
function Remove(index){
removeItem = theItems[index];
for(i = index;i &< Size() -1;i = i + 1){
theItems[i] = theItems[i + 1];
}
theSize = theSize - 1;
removeItem;
}
function PrintList(){
for(i = 0;i &< Size();i = i + 1){
logInfo(theItems[i] + " ");
}
}
}
list = ArrayList.Initial();
目前還在擴展中,另外這個倉庫里還有好幾個相關的Parser,可以看看。
別的不說,請區分osx和ios,前者是蘋果電腦,後者是蘋果手機
蘋果手機是沒法開發編譯器的
看看我的編譯器吧Xiang1993/jack-compiler · GitHub
個人覺得編譯器就是解釋器,就是翻譯機,就是映射工具,就是函數,就是文檔型應用程序。最簡單的,將JSON等代碼翻譯。
從一種表達方式到另一種表達方式
聚集於習慣的常用的表達,就是應用。而要完全映射,又何必,複雜度就是代碼本身,當然可以是熟悉它,簡化當下高頻度使用方法。面向硬體的編譯器——一來命題就太大了,填坑不易。一個將別人的研究成果認識與收歸己用的過程。C,C++,Java都可以寫出編譯器,工具就是這些語言的編譯器。網易雲課堂上有一門編譯原理的課,我認真上完之後反正是受益匪淺。那門課現在已經結課了,下一次開課是在五月份,如果你想看,私信我,我可以把我的賬號借你。
說一下做過的編譯器前端部分動態生成語法樹,詞法解析,主要利用狀態機,更高級點nfa轉行dfa,其實解析起來也沒有大家說的那麼難,會基本的數據結構,了解狀態機的理論就可以寫出初版,最有意思的是寫完可以算是學習編程的一個里程碑但是,最麻煩的地方在於很多很多的細節要處理,迭代添加功能,要做成商業版的就需要大量精力了,orz,比如llvm這種,做下去應該會得到很多乾貨,太懶真堅持不下去,等以後有精力再來大戰三百回合總的來說,做一個玩具很簡單,難得是前期理論學習和花時間維護,github就有很多玩具,實現了自己簡單的腳本語言推薦三本書編譯器前端部分的,由淺入深:遊戲腳本高級編程(讓你知道這貨到底在什麼地方有用,有學習下去動力,不然做了幹什麼,還不如看動漫)parsing techniques——a practical guide(需要點英語基礎)編譯原理(龍書),這個最開始看起來畢竟蛋疼,不推薦一開始拿這個入門
GitHub - qc1iu/tiger-comp: miniJava language compiler 這個編譯器可以看一下。有前端有後端,還帶有一個垃圾收集器。
推薦閱讀:
※constexpr對編譯時間影響大嗎?
※深入研究編譯器、程序設計語言理論須要學習哪些數理邏輯學的內容?
※想裸寫編譯器,除了編譯原理外還有那些資料可以參考?應該從什麼開始寫起?(用c/c++)?
※關於typedef的疑問?
※大學3年立志像輪子哥寫個編譯器,可能嗎?