自己動手寫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
相關文章
- 關於Basic程式直譯器及編譯原理的簡單化(2)---C++封裝好的Basic直譯器 (轉)C程式編譯原理C++封裝
- 自己動手寫一個 SimpleVueVue
- 自己動手寫 PHP 框架(一)PHP框架
- 用java寫一個lisp 直譯器JavaLisp
- 動手試試ClassLoader,直譯器,JIT
- 王垠:怎樣寫一個直譯器
- Python3 動手自己寫谷歌翻譯Python谷歌
- 自己動手寫PromisePromise
- 自己動手寫一個持久層框架框架
- 自己動手編譯OpenJDK編譯JDK
- 前端與編譯原理——用 JS 寫一個 JS 直譯器前端編譯原理JS
- 前端與編譯原理——用JS寫一個JS直譯器前端編譯原理JS
- 關於Basic程式直譯器及編譯原理的簡單化(1)---Basic器的語法分析及主要程式碼 (轉)C程式編譯原理語法分析
- 「 giao-js 」用js寫一個js直譯器JS
- 如何使用Python編寫一個Lisp直譯器PythonLisp
- 【譯】使用 Python 編寫虛擬機器直譯器Python虛擬機
- 自己動手編譯OpenSSL庫編譯
- JavaScript 編寫的迷你 Lisp 直譯器JavaScriptLisp
- 自己動手寫一個Bug管理工具
- 自己動手寫一個簡單的MVC框架MVC框架
- 自己動手編譯NodeMCU韌體編譯
- 手寫一個自己的PromisePromise
- 自己動手寫SQL執行引擎SQL
- 自己動手開發一個 Web 伺服器(一)Web伺服器
- 自己動手編譯播放器MPC-HC的原始碼編譯播放器原始碼
- 自己動手開發網路伺服器(一)伺服器
- 用 Haskell 編寫 CEK 風格的直譯器Haskell
- 自己動手寫一個能操作redis的客戶端Redis客戶端
- 自己動手寫作業系統(第一天)作業系統
- 直譯器模式模式
- 自己動手寫事件匯流排(EventBus)事件
- 自己動手寫Vector【Cherno C++教程】C++
- 自己動手寫Web自動化測試框架Web框架
- 自己動手寫json解析器0x01-分詞JSON分詞
- 自己動手擼一個cron表示式解析器
- 自己動手實現一個 Java Class 解析器Java
- 自己動手開發一個 Web 伺服器(三)Web伺服器
- 自己動手開發一個 Web 伺服器(二)Web伺服器