標籤:

為什麼 Haskell 可以把各類多態都 AOT 成機器碼,CLR 卻做不到?

例如參數多態的虛方法


CLR 不是做不到,而是不做。由於某種原因,它只給 UWP 項目提供了 native 方式的編譯。

如果你打算了解其原理,我覺得你應該研究 C++ 是怎麼做的。

https://m.douban.com/book/subject/6849800/

或者 Objective-C。

https://m.douban.com/book/subject/26363333/


參數多態的虛方法,我猜題主可能說的是這個:

interface IFuckable
{
string Fuck&(T t);
}

正常情況下,你可以強行針對所有T的可能先展開所有IFuckable.Fuck的所有實現,然後當成獨立的函數加進去。

不過如果我寫一個這樣的類,我也一直想知道到底要怎樣AOT才可以在運行時絕對不需要JIT:

class Fuckable& : IFuckable
{
public ValueTuple& data;

string IFuckable.Fuck&(V v)
{
var fuckable = new Fuckable&, V&>();
fuckable.data.Item1 = data;
fuckable.data.Item2 = v;
return fuckable.Fuck&, V&>(fuckable.data);
}
}

注意這段代碼,如果等到運行時才棧溢出掛掉,那麼這是可以接受的。

不知道Haskell是怎麼做的。反正C++這樣寫會直接在編譯的時候爆炸(逃


ngen,crossgen,.net native,il2cpp 這麼多aot 你說不能?


標註答案是:「先問是不是,再問為什麼」。

你是不是記錯了?虛函數是不能內聯,不是說不能編譯成機器碼。


你怎麼得出這個結論的。。。


微軟自己有一個 ngen 和 .net native

unity3d 5版本以後自己搞了個 il2cpp

這些都是編譯成本地代碼


題主指的是怎樣的多態,又是怎樣的機器碼?

-如果是類型相關的多態,我想在CLR這大概對應著泛型和重載,IL2CPP(外加c++編譯器)應該是可以很好地轉換到機器碼的;

-如果是pattern matching之類的多態(data type相關),我想這個在CLR對應著虛方法:

--如果Haskell的AOT直接把pattern matching優化掉了(也許是厲害的靜態檢查?),那CLR的AOT確實做不到;

--如果pattern matching需要在運行時做比較和jump,那CLR的AOT也能做到類似的調用。


IL2CPP 算不算CLR的AOT?


corert現在不是正在做嗎


.net 有不少項目,只是 個人能用的並不多。native 的項目不是死就是常年不活躍了。

像類似 kotlin-native 這樣 開放的項目,可以自己搞的 基本死光了。

除了最近的.net core的 self-contianed,有點亮點。

但是也只不過是個帶了個 附帶jit 的 載入器罷了。

當然其實我的回答跑題了,因為我說的是native 和aot 不完全是一回事。native 強調全部編譯為本機代碼。

aot-則強調的是 ahead of time 提前編譯。


推薦閱讀:

將 Haskell 翻譯為 Rust, C# (上)標準庫
Haskell的>>是如何實現的?如果是\_->i d,那第一個參數豈不是會因為惰性求值而不被求值?
使用 Haskell 編寫靈活的 Parser (上)
Haskell有多少跟State/Reference有關的東西?
Rust相較於Haskell有何優勢?

TAG:C# | Haskell | NETCore |