簡體   English   中英

在選擇與LLVM一起使用的函數式編程語言時,有哪些權衡取舍?

[英]When choosing a functional programming language for use with LLVM, what are the trade-offs?

讓我們假設C ++不是一種函數式編程語言。 如果您想使用LLVM為后端編寫編譯器,並且您希望使用函數式編程語言及其與LLVM的綁定來完成您的工作,那么就我所知,您有兩個選擇:Obj​​ective Caml和Haskell。 如果還有其他人,那么我也想知道這些。

我不是要求主觀意見,所以請不要給出subjective標簽。 我想對此做出自己的想法,但我不確定我知道所有的權衡取舍。 所以,StackOverflow來救援。 有什么權衡取舍?

OCaml或Haskell都是不錯的選擇。 為什么不查看每種語言的LLVM教程? OCaml的LLVM教程在這里: http//llvm.org/docs/tutorial/OCamlLangImpl1.html

Haskell現在有更多的動力,但是OCaml還有很多很好的解析庫,包括PEG解析器生成器AurochsMenhir和GLR解析器生成器Dypgen 還可以在pcl上查看這個關於OCaml的monadic解析器組合庫的介紹(比如Paskc for Haskell),在那里比較Haskell和OCaml的方法有一些很好的信息: http//osp.janestreet.com/files/pcl.pdf

有些人會說懶惰會讓Haskell成為解析的邊緣,但你也可以在OCaml中得到懶惰。

Haskell比LLaml具有更高級別的LLVM綁定(Haskell提供了一些有趣的類型安全保證),而Haskell使用了更多的庫( http://hackage.haskell.org上的1700個包),這使得組件更容易粘合在一起。

本機綁定的可用性不需要限制您選擇的語言。 除了使用綁定或直接生成IR文本之外,還有第三種選擇:

您可以使用與語言無關的序列化格式(例如Google的協議緩沖區)作為從前端到后端的橋接。 畢竟,協議緩沖區只是偽裝的AST。

你的前端以函數式語言實現,然后做它最擅長的 - 解析,類型檢查,desugaring,核心到核心的轉換等 - 而C ++后端從你的前端獲取IR並使用LLVM的功能 - 完全定義的本機C ++ API,可以從您的語言IR降級到LLVM IR。 這使得處理LLVM的“高級”功能(如調試元數據)變得更加容易。

我正在使用這個策略與hprotoc和協議緩沖區的相關Haskell綁定,並對結果非常滿意。 使用正確的工具來完成工作還有很多東西要說!

OCaml是LLVM發行版中唯一具有綁定功能的語言, 也是 llvm.org上的文檔,例如Kaleidoscope教程 如果在構建和安裝LLVM時安裝了OCaml,那么它將自動為OCaml構建和安裝LLVM綁定。 此外,這些OCaml結合已經使用多年,因此它們成熟且可靠。

我一直在使用標准的LLVM綁定在OCaml中開發HLVM ,並發現OCaml + LLVM是一個非常強大的組合。 HLVM提供元組,數組,聯合,所有尾調用的TCO,通用打印,FFI到C,JIT編譯和並行垃圾收集,其中VM的重量低於2kLOC的OCaml代碼,從頭開始只需幾個人工作周。 HLVM的數值性能已遠遠超過當今最快的開源FPL,包括OCaml本身 在OCaml期刊上發表了文章,描述了如何從OCaml中使用LLVM,從基本表達式評估到高級主題(如並行和垃圾收集)。 你可能也喜歡這個迷你的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM