2012年5月10日

思索下一代程式語言教學系統,利用 Node.js 實作程式碼遠端編譯執行

長久以來我一直在思考如何實作更好的程式語言的教學系統,目前發展的 PLWeb v2 已經用了五年的時間,而下一個版本會是什麼樣子,怎樣才有更大的躍進,是我每次在夜深人靜時就會不斷在腦海中不停思考的問題,...

PLWeb 程式設計學習網

我對新的程式語言教學系統,有無數個期待:
  1. 支援 Eclipse 及 Visual Studio 等各種整合開發環境的教學。
  2. 線上編輯教材,以 Markdown 編寫電子書,使用 CodeMirror 或 ACE Editor 提供用瀏覽器撰寫程式碼的功能。
  3. 教材自動轉換為電子書。
  4. 更好的互動練習環境、支援廣播及即時問答功能的網頁介面。
  5. 學習者不必安裝任何軟體(包括編譯器也免安裝),直接透過瀏覽器就能學習(即使是用 iPad 平板電腦也能學)。
最近最有興趣解決的其中一項問題,就是讓程式碼在遠端編譯執行。

這聽起來並沒有什麼困難,因為只要先將程式碼上傳,在 Server Side 只要用 Shell 呼叫編譯程式,就能將執行結果回傳給 Client 端。

但是對於教學來說,許多程式會有 User Input,也就是使用者需要將資料以鍵盤輸入,再交由程式處理回應。

雖然可以將 Input Data 以 STDIN Stream 給執行中的程式,但這樣需要在程式未輸出任何訊息時,就已經將 Input Data 輸入完成,對學習者來說這樣寫好的程式,User Input 就失去意義。

對網頁程式來說,還必須將後端執行中的程式與瀏覽器串接起來,重新導向 STDIN/STDOUT,如此才能讓遠端執行的程式,就像在 Local 端一樣有 Console 的互動操作效果。

近期對 Node.js 的研究,讓我發現 Node.js 是目前最適合用來處理這項需求的方案。

因為 Node.js 有太多好處:
  1. 輕量,伺服器負載小,一部機器可承載大量線上使用者。
  2. Socket.io 提供最簡單穩固的 WebSocket 實作,解決瀏覽器和伺服器之間串流執行中程式 STDIN/STDOUT 的需求。
  3. 由 chjj 開發的 pty.jstty.js 已經初步完成基本實作的範例。
  4. 可以透過 Node.js module 搭配 C/C++ 實作底層所需的程式碼,如此一來 Unix 既有的虛擬終端機介面(Pseudo terminal)就能派上用場。
而多人共用伺服器編寫程式碼、執行程式的安全性問題,則可以透過 Unix 的權限控管,以及搭配虛擬機器來執行(包含網路的隔離等)。

我 fork 了一份 tty.js,並加入一些簡單的修改,大致上完成了程式練習系統的介面雛形,用來驗證這個構想(proof-of-concepts)。專案的網址是:


執行畫面如下圖,上方為程式碼編輯區,下方為瀏覽器的 Console 畫面,透過 tty.js 串接在伺服器上執行的終端機畫面;如此一來,即使是包含 User Input 的程式,也可以在遠端編譯、執行,但學習者只要透過瀏覽器就可以完全地控制。
修改自 tty.js 的 proof-of-concepts

雖然 Unix/BSD/Linux 是絕佳的程式開發環境,但是對初學者來說,又要學程式語言又要摸索新的作業系統操作,難免會有太多的阻礙。

但如果透過簡易的 Web UI 介面包裝,讓寫程式變成只要打開瀏覽器,就能立即開始編寫程式碼,按下一個 Run 按鈕後,就自動交由遠端的 Linux 伺服器編譯、執行,同時還能享有跟 Local 端相同的 Console 鍵盤操作、跟程式互動,我想這應該會是更方便的學習環境吧。

Node.js 是有趣的新技術,即使你從未使用過它、未來也不打算用它開發軟體,多瞭解它還是能夠顛覆許多傳統的想法,例如那些過去認為用 Web 做不到或很難做的事情,現在都變得可行而且簡單有趣。

如果你有興趣研究 Node.js,請參考:
  1. Node.js Taiwan Facebook Page http://facebook.com/nodejs.tw
  2. Node.js Taiwan Homepage http://nodejs.tw
  3. Node.js 中文社群電子書 http://book.nodejs.tw
Node.js Rocks!

2 則留言:

  1. 你好 不好意思
    我是最近才開始玩node的新手
    可否請問一下
    我下載了這個專案之後要怎麼使用....

    回覆刪除
  2. node index.js 就會執行,不過 tty.js 只能在 Linux 系統下跑

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!