前言
記得小時候,很喜歡在YouTube上收看Minecraft的影片,實況主們(那時候還沒有YouTuber這種說法)的影片大致分為兩類,一類是較為簡短的解謎、跑酷類型,通常一部影片就可以涵蓋所有內容;另一類則是大型RPG、 生存系列,動輒5-60集的系列影片在資訊爆炸的現今實在很難想像,這種類型的內容是我的最愛,看著實況主不斷的冒險探索,彷彿自己也身在其中。
但是這種長篇系列影片,到最後的結局往往都是停更(雖然跟遊戲類型也有關係),有的是另外開啟了一個新系列,有的則是換了一款新遊戲,甚至有的實況主是退出了這個圈子,那時候的我很難理解,一個好好的系列為什麼會突然喊停,但現在我明白了,有太多的原因造成無法繼續下去,生活的因素暫且不提,人類本身就嚮往新奇的事物,會對已經持續一兩年的舊系列產生倦怠也是很正常的。
告別了Medium好一陣子,當初是因為工作較為繁忙的關係,原先是計畫要把23個設計模式寫完的,但是後來也將這件事拋諸腦後了,現在再回過頭來看,有種可以體會到當初的實況主那樣的心情。面對未完成的系列,很想要將他完結,好給觀眾一個交代,但當初創作的熱情卻已不在,況且新系列又十分吸引人,那只好再將舊系列擱置,全心投入到新內容的創作上,等日後有機會再回頭完結舊系列吧。
回到本篇的主題,在離開Medium的這段時間裡,我開始接觸一些Computer Architecture, Operating System的基礎知識,也對Compiler產生了興趣,想要深入了解Compiler的話,最好的方法當然是直接寫一個出來,但是一個Compiler背後有許多複雜的概念,不是那麼好上手,因此我決定先從Interpreter開始寫起,我會嘗試用TypeScript來寫出一個能夠執行JavaScript的Interpreter,這樣做當然是沒什麼實際應用價值,但畢竟拿自己熟悉的語言來實作還是較好上手的。
這系列文章預計以會以實作為主軸,因此可能會有較多的程式碼,觀念的部分也會一起提到,但已經有許多優秀的文章和開放式課程可以參考,因此這裡可能不會講的太細節。由於我對於這方面也正在學習中,因此若有錯誤還請指正。
以下就馬上進入主題,這次的目標是進行專案環境設定,接著製作出可以從Terminal取得輸入,並進行回應的程式。
環境設置
在我之前的文章中有簡單介紹如何安裝與設定Node.js & TypeScript,這裡會假設已經安裝了Node.js & Yarn,使用的編輯器為Visual Studio Code,開發環境是跑在VirtualBox上的Ubuntu 64bit。
使用的Node.js版本為16.13.1,不過只要不是過舊的版本應該差異不大。
$ node -v
v16.13.1
建立專案資料夾,我們直接叫做js-interpreter。
$ mkdir js-interpreter
$ cd js-interpreter/
$ code . #用visual studio code開啟工作區
在專案目錄下初始化專案,產生預設的package.json檔案。
$ yarn init -y
安裝相依套件,我們會需要typescript、Node.js的擴充@types/node,以及可以直接執行TypeScript的ts-node,透過傳入-D指定為僅用做開發的套件。
$ yarn add -D typescript @types/node ts-node
初始化一個tsconfig.json檔案。
$ yarn tsc --init
開啟tsconfig.json,將預設註解起來的outDir改為dist資料夾。
"outDir": "./dist"
專案執行
到這裡設置大致完成,接下來建立src資料夾,並在裡面建立index.ts檔案。
這裡做的事情是,引入內建的readline套件,先建立一個input與output都是標準輸入輸出的讀取器,接著呼叫讀取器的question()等待使用者輸入。
question的第一個參數是會被輸出到Terminal上的問題內容,我們這裡輸出的是js> ",第二個參數是Callback Function,會在收到輸入時執行,這裡我們將輸入的內容上色後輸出回Terminal,最後再次呼叫question等待下一次的輸入。
至此,我們的程式碼已經可以執行了,我們先在package.json裡面加入一個script,使用ts-node直接執行TypeScript程式碼。
"scripts": { "start": "ts-node src/index.ts"},
最後利用剛剛的start腳本執行我們的程式。
$ yarn start
可以跟我們的程式進行互動了 !
js> test
test
js> hello world!
hello world!
這個系列的完整內容可以到我的Github Repo上參考。
下一篇
動手寫一個JavaScript直譯器 | Part 1 四則運算>
References :
如果對於我的文章或程式碼有任何問題,歡迎在下方留言指教。
若有幫助到你,也歡迎給文章拍手一下,讓我在寫文章的路上更加進步!