文言

第九堂社課 - 建資外交長兼學術 張雲淞

wenyan-lang

講師介紹

姓名:張雲淞

綽號:章魚

社團:建中資訊社 INFOR

職位:外交長兼學術

學術力:JavaScript、網頁前後端、Python、C++

教學課程:上學期放課 Discord.js、下學期社課 JavaScript、下學期放課 React

Instagram

社帳 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

轉譯過程

  1. 去除標點符號、空白、換行、註解等
  2. 將中文數字轉為數字,分析語法產生 AST(抽象語法樹)
  3. 轉換為目標語言並執行

相似的語言

用莎士比亞劇本的樣子寫程式,程式像角色之間在對話

                    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

下禮拜是最後一堂社課囉!

Made with Slides.com