Z語言實現基本原理
原文作者: @TKT2016 (知乎, github)
計算機程式設計發展已經有幾十年了,程式設計的難度也越來越小,會程式設計的人也越來越多。但是現在的程式設計還是非常難,需要專門學習很長時間才能掌握。我的目標是創造出更簡單更容易掌握的語言,所以我開發出了Z語言。
C#語言中實現用控制檯列印”你好”的程式是
Console.Write(“你好”);
對一個沒有接觸程式設計的人來說,他至少需要懂Console是什麼、Write是什麼、‘.’號起什麼作用、“你好”為什麼需要括號括起來。
在Z語言中列印“你好”的程式是這樣寫的
控制檯列印“你好”
相比來說,Z語言程式是主要用漢字寫的,和中文自然語法比較接近,需要學習的知識點更少,一般人即使沒有學過,也能一眼看出這句話是什麼意思。
Z語言編譯為了實現正確編譯上條控制檯列印“你好”程式,會進行以下步驟。
一、準備實際功能類
(控制檯的原始檔在’Z語言系統/控制檯’)
1.新建類
新建一個叫‘控制檯’的C#類,給這個類名新增特性[ZStatic]。(Zstatic在‘Z語言介面編寫文件’解釋)
2.實現’ public static void Write(object obj)’方法
3.給‘列印(object obj)’新增‘[ZCode(“列印(object:obj)”)]’特性
二、讀取Token流
編譯器讀取原始檔,把控制檯列印“你好” 分析成標識“控制檯列印”和字串“你好”兩個Token
控制檯列印“你好” → 控制檯列印 + “你好”
三、語法分析
編譯器分析匯入的開發包,構建詞庫,根據‘[ZStatic]’標註的控制檯型別和‘[ZCode(“列印(object:obj)”)]’構建兩個詞‘控制檯’和‘列印’
四、表示式分析
編譯器根據詞庫把‘控制檯列印’分詞為‘控制檯’和‘列印’兩個Token
控制檯列印 + “你好” → 控制檯 + 列印+ “你好”
五、語義分析
從控制檯Token查詢到控制檯型別,根據列印Token查詢特性為‘[ZCode(“列印(object:obj)”)]’的方法Write,把把“你好” Token作為方法呼叫的引數
六、生成二進位制指令
編譯器生成CLR呼叫方法指令
ldstr bytearray
(60 4F 7D 59 )
call void [‘Z語言系統’]‘Z語言系統’.‘控制檯’::Write(object)
Z語言也可以實現對引數不在末尾的方法的呼叫。比如下面例子。
在C#中,控制檯換行實現如下
Console.WriteLine();
如果要求根據一個整數引數k連續換行k行,程式碼可以編寫為一個方法(在’Z語言系統/控制檯’)
public static void 換行(int k)
{
for (int i = 0; i < k; i++)
{
Console.WriteLine();
}
}
用C#語言呼叫這一方法的程式是
控制檯.換行(5);
而給這個方法加特性[ZCode(“換(int:k)行”)] 後就可以在Z語言中這樣呼叫
控制檯換5行
5是引數,‘換’和‘行’是呼叫過程名稱的組成部分。這是Z語言先進於主流程式語言的一個地方,主流程式語言中引數必須放在語句的末尾,Z語言的引數可以放在一條語句的任意位置,實現了程式設計的類自然語言化。
編譯器對控制檯換5行 這條程式的處理大概步驟如下。
一、讀取Token流
控制檯換5行 → 控制檯換5行
二、語法分析
編譯器分析匯入的開發包,構建詞庫,根據‘[ZStatic]’標註的控制檯型別和‘[ZCode(“列印(object:obj)”)]’構建兩個詞‘控制檯’、‘換’、‘行’
三、表示式分析
對程式進行分詞
控制檯換5行 → 控制檯 + 換 + 5 +行
四、語義分析
從控制檯Token查詢到控制檯型別,根據換 + 5 + 行查詢特性為‘ZCode(“換(int:k)行”)’的方法,把把5作為方法呼叫的引數
五、生成二進位制指令
編譯器生成CLR指令
ldc.i4.5
call void [‘Z語言系統’]‘Z語言系統’.‘控制檯’::‘換行’(int32)