博客 / 詳情

返回

日本中學生創造了一門“類似中文”的編程語言

natsuakane 是一名日本的中學生(13 歲),他創造了一門類似中文的編程語言 Wei-lang(https://github.com/natsuakane/Wei-lang)。用他自己的日式漢語來介紹就是“我製作偽中國語之機械言語”。

Wei 是“偽”的拼音,lang 是 language 的縮寫。下面我們就通過一段計算斐波那契數列第 n 項的代碼,來看看 Wei-lang 的特點。

関數「普伊墓那値」引數「數」行
「結果」是「數」
「數」大一場合「結果」是「普伊墓那値」(「數」引二)足「普伊墓那値」(「數」引一)
「結果」
終

「表示」(「普伊墓那値」(「入力」(『整數』)))
「表示」(「新行」)

將這段代碼存儲到文件 fibonacci.wei 中,然後用 weilang 命令解析這個文件,並輸入 10,

$ ./weilang fibonacci.wei
10
55

這段代碼輸出了 55,這正是斐波那契數列的第 10 項。

Wei-lang 與主流編程語言最大的不同點就是代碼中充滿了漢字,所有標點符號也都是全角符號(使用半角空格作縮進反而會出錯)。

若將這段代碼翻譯成 Python 代碼,大概是這樣,

def fibonacci(num):
    result = num
    if num > 1:
        result = fibonacci(num - 2) + fibonacci(num - 1)
    return result

print(fibonacci(int(input())), end='')
print("\n", end='')

我們注意到,在 Wei-lang 的代碼中,有些漢字括在了「」之中。這些漢字構成了函數、參數和變量的名字。

例如 「數」 相當於 Python 代碼中名為 num 的參數;「結果」 相當於名為 result 的局部變量。「表示」「入力」 後面都帶有 (),應該不難猜出它們是函數名。“表示”和“入力”這兩個日文單詞的含義分別是“顯示”和“輸入”,所以對應 print()input() 函數。

在主流編程語言中,函數名和變量名等標識符要麼是英文和數字的組合(如 C、Java、Go 等),要麼是以特殊的符號開頭,比如 PHP 中的 $var,MySQL 中的 @var。像 「數」 這種前後都需要特殊符號的寫法從未出現過。不過,用一對括號將參數括起來也有好處,這樣在函數的參數列表中,就可以省略 , 分隔符了,例如 (「甲」「乙」),中間就不需要再加逗號了。

「普伊墓那値」 這個函數名中的每個漢字我們都認識,但合在一起就完全不知道什麼意思了。這其實是日語中的借用字(當て字),即不考慮漢字原本的含義,僅使用漢字來表示外來語讀音的現象。類似咱們小時候剛學英語時,用漢字標註單詞讀音的做法。

Wei-lang 在函數返回值方面還有點 Rust 的風格,最後一個表達式,即 「結果」 的值就是函數的返回值。

代碼中還有些漢字沒有括在「」之中,除了表示數字的零一二三四五六七八九,剩下的那些漢字相當於運算符和關鍵字。如 関數 相當於 Python 中的 def,表示開始定義函數。 相當於賦值的 = 相當於比較運算符 > 來自日語的引く和足す,分別表示減法和加法; 場合 一詞多出現在日語中表示”如果……就……“的句子中,正好對應 if 語句。

從出現位置上可以判斷出分別對應 C、Java 等語言中的 {}。從含義上看,用 作為表示結束的 } 還挺合適的,不過 和表示開始的 { 有什麼關聯暫時沒有想到。

另外,“行”字可以拆開成“彳”“亍”(chì chù)兩個字,其實這兩個字本身就有左右的含義。彳表示左步;亍表示右步, 彳亍合在一起指緩步慢行。這兩個字曾用於翻譯量子力學中也有左右之分的狄拉克符號。


雖然作者 natsuakane 自稱 Wei-lang 是類似中文的編程語言,但很多漢字的用法並不符合漢語習慣,所以更準確的説法可能是"Wei-lang 是一門漢字編程語言”。

Wei-lang 是用 C++實現的,源代碼只有不到 1800 行。儘管代碼量不大,Wei-lang 依然具備了基本的編程語言功能,而且採用了編譯原理中的 LL(1) 自頂向下分析法,並利用了多態、組合設計模式等編程技巧,很難相信這些代碼竟出自一位中學生之手。

natsuakane 曾表示,思考如何才能寫出像中文一樣的代碼很有意思。

user avatar yudinghou 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.