原文作者: @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)
2018-07-24