自己動手寫basic直譯器 一
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
自己動手寫basic直譯器
刺蝟@http://blog.csdn.net/littlehedgehog
注: 文章basic解釋原始碼摘自樑肇新先生的《程式設計高手箴言》(據他所說這個程式碼也是網上摘錄的),原始碼解讀參考《java程式設計藝術》。《java程式設計藝術》裡面自然是java版了(可能旭哥更加適合點兒),我這裡還是解讀的C版basic直譯器程式碼。
那些客套話我們就不扯那麼多了,啥寫編譯器是多少程式設計師夢想阿,多牛逼阿之類云云這之類的話我們就不聊了,主要是這裡是C(不是java),C程式沒java那麼多套路,直接單刀赴會了。
這個是我們要解釋的程式主幹原始碼,先不妨也看看。+點選瀏覽+
好了既然我們是寫basic直譯器,那我們至少先要明白兩件事情:第一,什麼是直譯器;第二,basic語法這個至少要了解大概吧。
第一,什麼是直譯器?
編譯器大家應該都知道,GCC,VC++(當然這個不純粹是編譯器了),簡單的說呢,編譯器將程式的原始碼轉化為可執行程式碼的形式。通常情況下,這種可執行程式碼由計算機的CPU指令組成,因此可以直接在計算機上執行。而直譯器就不同了,它順序讀入程式的原始碼,然後依次執行每一條語句。因此,直譯器並不真正將原始碼轉化為目的碼,而是直接執行程式。
先說第一個為什麼寫basic? 因為basic語法簡單,你聽名字也大概知道了,比如我不會選擇advance作為編寫目標,名字就比較嚇人。
basic我們不來詳細講了,因為我們做得這個直譯器本來就很小,沒涉及到多少東東,有需要的可以google一下。這裡先貼一小段程式碼,混個臉熟:
- PRINT "A Simple Small BASIC Program" '列印字串
- FOR X = 1 TO 10 'for迴圈
- GOSUB 100 '跳到標號100 語句執行 注意這裡100是標號
- NEXT '下一個x 表示x要加一
- END ‘程式結束
- 100 PRINT X '這裡相當於C中函式
- RETURN '返回
關鍵字處理是個大麻煩,因為我們面對不同關鍵字,要做出不同反應來。這個還是後話,眼前我們還是把主要框架先看看。
第一步 裝載原始碼
用過gcc麼?鬱悶 gcc都沒用過!看來在windows下生活滋潤慣了,學計算機還是要來open source陣營阿,話扯遠了。我們用gcc編譯c檔案時,都是gcc -o target source 。 所以我們也仿照這格式,直接用命令列 (圖形介面我們就不用實現了,再說俺也不懂)。
- main (int argc,char *argv[])
- {
- char *p_buf;
- char *t;
- if (argc!=2) {
- printf ("usage: %s <filename>/n",argv[0]);
- exit (1);
- }
- /* allocate memory for the program */
- if (!(p_buf=(char *)malloc(PROG_SIZE))) {
- printf ("allocation failure");
- exit (1);
- }
- /* load the program to execute */
- if (!load_program(p_buf,argv[1])) exit(1);
- }
- /* Load a program */
- load_program (char *p,char *fname)
- {
- FILE *fp;
- int i=0;
- if (!(fp=fopen(fname,"rb"))) return 0;
- i=0;
- do {
- *p = getc(fp);
- p++;i++;
- } while (!feof(fp)&&i<PROG_SIZE);
- *(p-2) = '/0'; /* null terminate the program */
- fclose (fp);
- return 1;
- }
給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow
相關文章
- 動手試試ClassLoader,直譯器,JIT
- 用java寫一個lisp 直譯器JavaLisp
- Python3 動手自己寫谷歌翻譯Python谷歌
- 自己動手寫PromisePromise
- 前端與編譯原理——用JS寫一個JS直譯器前端編譯原理JS
- 前端與編譯原理——用 JS 寫一個 JS 直譯器前端編譯原理JS
- 自己動手寫一個持久層框架框架
- 自己動手編譯OpenJDK編譯JDK
- 「 giao-js 」用js寫一個js直譯器JS
- 自己動手寫Impala UDF
- 手寫一個自己的PromisePromise
- 自己動手寫SQL執行引擎SQL
- 自己動手寫json解析器0x01-分詞JSON分詞
- Ipython 直譯器Python
- 自己動手寫一個能操作redis的客戶端Redis客戶端
- 自己動手寫個 Android客戶端Android客戶端
- 自己動手寫事件匯流排(EventBus)事件
- 自己動手寫Android資料庫框架Android資料庫框架
- 自己動手寫Vector【Cherno C++教程】C++
- 然並卵系列:來寫個 Brainfuck 直譯器吧AI
- Node.js REPL(互動式直譯器)Node.js
- 自己動手擼一個cron表示式解析器
- 直譯器模式(Interpreter)模式
- python直譯器在哪Python
- 你也可以手寫自己的Promise(一)Promise
- 自己手寫一個SpringMVC框架(簡化)SpringMVC框架
- WPF啟動流程-自己手寫Main函式AI函式
- 用java寫lisp 直譯器 (10 實現物件和類)JavaLisp物件
- 精讀《手寫SQL編譯器-回溯》SQL編譯
- 自己動手編寫一個Mybatis外掛:Mybatis脫敏外掛MyBatis
- 自己動手,在macOS High Sierra中編譯一個可debug的JDKMac編譯JDK
- 淺談彙編器、編譯器和直譯器編譯
- Rxjava深入理解之自己動手編寫RxjavaRxJava
- RxJava:自己動手擼一個RxBinding(一)。RxJava
- 24_直譯器模式模式
- VScode和python直譯器VSCodePython
- Python3 直譯器Python
- Python直譯器和IPythonPython