1. 程式人生 > >Z語言實現基本原理

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)