天天看點

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)

2018-07-24

繼續閱讀