為什麼 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的可能先展開所有IFuckable.Fuck的所有實現,然後當成獨立的函數加進去。
不過如果我寫一個這樣的類,我也一直想知道到底要怎樣AOT才可以在運行時絕對不需要JIT:
class Fuckable&
{
public ValueTuple&
string IFuckable.Fuck& 注意這段代碼,如果等到運行時才棧溢出掛掉,那麼這是可以接受的。 不知道Haskell是怎麼做的。反正C++這樣寫會直接在編譯的時候爆炸(逃
{
var fuckable = new Fuckable&
fuckable.data.Item1 = data;
fuckable.data.Item2 = v;
return fuckable.Fuck&
}
}
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有何優勢?