關於編譯器的一些想法

於 2022年2月18日 (五) 06:09 由 Tankianting討論 | 貢獻 所做的修訂
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)

coding:style

Type Felix struct{
	Str name,
	Int age};

Int a = 2 + 2;

(Int Int -> Int) add = lmd(x, y) {
	if (x == 0){
		return y;
	}else{
		return x + y;
	}
};

bool a = (20 == (lmd(int x, int y){return x * y;}(12, 6)) + 2);

Felix (Str name, Int age)

Int a = 2 + 2;

add = l int x ,int y

迴圈

for 到 while

 

可以轉換成

 


迴圈如何變成尾遞迴

 

其中 $bodyExp_n$ 可以為下列之一:

  •  
  •  
  •   當然還有部分調用、全部調用
  •  
  •  

可以分析   有哪些? 有哪些?

  

 

while 迴圈就可以變成新的遞迴函數  ,如下:

 

對字串的思考

字串是什麼? →其實可以表示為很大的數字。

所以,要用鏈表表示也是可行的。

閉包

 (x)=>{foo(x, free_vars)}

轉換

 ThunkAnony8964 thunkanony8964(TypeOfX x ,TypeFreeVars  env){
foo(x, env[free_vars]);
 }
 
 struct ClosureTypei1r1 {
 TypeFreeVars env, # 可以用鏈表
 *ThunkAnony8964 thunk,
 };
 
 ClosureTypei1r1 anony8964;
 TypeFreeVars env = free_vars;
 
 anony8964.env = env;
 anony8964.thunk = *thunkanony8964;
 

執行函數

 lambda(x){body}(n);

改為

 anony9864.thunk(n, anony8964.env);

如何代碼刪除不須存在的變數或函數?

  • 通常來說,下列兩個條件均滿足下,只要變(函)數不出現在作用域的任何獨立表達式(須化簡)和定義式的右手邊(須化簡),則可以刪掉:
    1. 不可變
    2. 不為外部引用