文言
第九堂社課 - 建資外交長兼學術 張雲淞
wenyan-lang
講師介紹
姓名:張雲淞
綽號:章魚
社團:建中資訊社 INFOR
職位:外交長兼學術
學術力:JavaScript、網頁前後端、Python、C++
教學課程:上學期放課 Discord.js、下學期社課 JavaScript、下學期放課 React
社帳 Instagram

何謂文言
什麼是「文言」?
文言
顧名思義,是以文言文撰寫程式碼的一種程式語言
吾有一術。名之曰「斐波那契」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
若「甲」等於零者乃得零也
若「甲」等於一者乃得一也
減「甲」以一。減「甲」以二。名之曰「乙」。曰「丙」。
施「斐波那契」於「乙」。名之曰「丁」。
施「斐波那契」於「丙」。名之曰「戊」。
加「丁」以「戊」。名之曰「己」。
乃得「己」。
是謂「斐波那契」之術也。
施「斐波那契」於十二。書之。一個簡單的費氏數列函式
文言
- 梅隆大學的大四學生黃令東開發
- 希望「能夠讓古老的中國典籍在命令列的字元間重獲新生」
- 只花不到一週就開發完成

夫唐、虞之世,結繩而足治,屈指而足算。是時豈料百代之後,計算機械之巧,精於公輸之木鳶,善於武侯之流馬;程式語言之多,繁若《天官》之星宿,奇勝《山經》之走獸。鼠、蟹、鑽、魚,或以速稱。蛇、象、駱、犀,各爭文采。方知鬼之所以夜哭,天之所以雨粟。然以文言編程者 ,似所未有。此誠非文脈之所以傳,文心之所以保。嗟予小子,遂有斯志。然則數寸之烏絲猶覆於頭,萬卷之素書未破於手;一身長羈於遠邦,兩耳久曠于雅言。然夫文章者吾之所宿好,程式者偶承時人之謬譽。故希孟不慚年少,莊生不望無涯。乃作斯言。誠未能嘔瀝長吉之心血,亦庶幾免於義山之流沫。既成之後,復學干將鑄劍而自飼,越王嚐糞而當先。自謂偶追《十書》之筆意,但恨少八家之淋漓。此子山所謂士衡撫掌而甘心,平子見陋而固宜。然則雖實覆甕之質,尚存斧正之望;雖乏呂相之金,易字之渴蓋同。此亦開源之大義,吾輩之所以勉勵也。一笑。
文言
- 編譯器主要以 JavaScript 實作
- 可將原始碼編譯為 JavaScript、Python 或 Ruby 程式碼
- 具「圖靈完備」
只要有足夠的時間與記憶體,可以運算出世界上任何一種電腦算的出來的問題

文言

- 具獨特的寫法,讀起來更像古文
- 只需使用中文字和標點符號
(標點符號也非必要) - 無需分行

文言的編譯器內建可以輸出這樣格式圖片的功能!
文言語法
如何寫「文言」?
編譯器
開啟文言的 線上編譯器 即可直接開始寫文言的程式碼!

輸出(Output)
吾有一言。曰「「問天地好在。」」。書之。吾有一數。曰三點一四。書之。吾有一爻。曰陽。書之。字串
數字
布林值
資料型態
值
輸出
字串要用雙層引號!
變數(Variable)
吾有一言。曰「「陳柏安喜衣女裝。」」。名之曰「甲」。吾有一數。曰三。名之曰「乙」。吾有一爻。曰陰。名之曰「丙」。字串
數字
布林值
變數名稱
值
資料型態
變數(Variable)
吾有一數。曰三。名之曰「甲」。
變「甲」以六。重新賦值
加「甲」以二。變「甲」以之。加法賦值 (甲 += 2)
把甲+2存入之
四則運算以此類推,若為除法會是二除以甲
「之」
吾有一言。曰「「問天地好在。」」。書之。觀察輸出的程式,可以發現前兩段和定義變數相同,只差在沒有取名
「之」扮演暫存的變數,在:
1. 宣告值不給予名字 2. 進行數學運算沒有給予名字
3. 呼叫函式卻沒有為回傳結果定義名字
時,會自動儲存,並可以透過「之」調用
條件(Condition)
if (甲 > 3) {
console.log("大");
}若「甲」大於三者。
吾有一言。曰「「大」」。書之。
云云。者:等同左括號
云云:等同右括號
條件(Condition)
if (甲 > 3) {
console.log("大");
} else {
console.log("小");
}若「甲」大於三者。
吾有一言。曰「「大」」。書之。
若非。
吾有一言。曰「「小」」。書之。
也。者:等同左括號
若非:否則
也:有多重判斷時使用也
循環(Loop)
for (let i = 0; i < 3; i++) {
console.log("嗨");
}為是三遍。
吾有一言。曰「「嗨」」。書之。
云云。亦可用變數,例如為是「甲」遍
循環次數
For 迴圈
函式(Function)
function 算面積(邊長) {
let 面積 = 邊長 * 邊長;
return 面積;
}
let 最終結果 = 算面積(6);
console.log(最終結果);算正方形面積的簡單函式
函式(Function)
循環次數
吾有一術。名之曰「算面積」。欲行是術。必先得一數。曰「邊長」。
乘「邊長」以「邊長」。
名之曰「邊長平方」。
乃得「邊長平方」。
是謂「算面積」之術也。
施「算面積」於六。名之曰「最終結果」。
書之「最終結果」。術:函式
函式名稱
如參數超過兩個則皆在後面,如:曰「長」。曰「寬」
參數設定
參數數量
回傳值
函式(Function)
吾有一術。名之曰「斐波那契」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
若「甲」等於零者乃得零也
若「甲」等於一者乃得一也
減「甲」以一。減「甲」以二。名之曰「乙」。曰「丙」。
施「斐波那契」於「乙」。名之曰「丁」。
施「斐波那契」於「丙」。名之曰「戊」。
加「丁」以「戊」。名之曰「己」。
乃得「己」。
是謂「斐波那契」之術也。
施「斐波那契」於十二。書之。回到一開始的程式碼舉例
實作文言
「文言」的實作題目
題目
請宣告一個名為「階乘」的術(函式)。
- 使用函式時輸出傳入值的階乘值
參考解
吾有一術。名之曰「階乘」。欲行是術。必先得一數。曰「甲」。乃行是術曰。
若「甲」等於一者。
乃得「甲」。
若非。
減「甲」以一。名之曰「乙」。
施「階乘」於「乙」。名之曰「丙」。
乘「丙」以「甲」。名之曰「丁」。
乃得「丁」
也。
是謂「階乘」之術也。
施「階乘」於五。書之。文言解析
「文言」的原理解析
Transpiler
並非將程式轉換機器碼,而是將高階語言轉換為另一個高階語言
原始碼到原始碼編譯器
文言文原始碼
(.wy)
文言轉譯器
(Transpiler)
JavaScript 程式(.js)
Transpiler
轉譯過程
- 去除標點符號、空白、換行、註解等
- 將中文數字轉為數字,分析語法產生 AST(抽象語法樹)
- 轉換為目標語言並執行
相似的語言
用莎士比亞劇本的樣子寫程式,程式像角色之間在對話
Scene II: The praising of Juliet.
[Enter Juliet]
Hamlet:
Thou art as sweet as the sum of the sum of Romeo and his horse and his
black cat! Speak thy mind!
[Exit Juliet]The End
下禮拜是最後一堂社課囉!
第九堂社課 文言程式語言
By 章魚
第九堂社課 文言程式語言
- 47

