向 Julia 添加通用代码生成后端有多困难?
How difficult would it be to add a generic code-gen backend to Julia?
按照 go
和 chez-scheme
的思路将通用 code-gen
后端添加到 Julia
会有多困难,即没有 LLVM。
考虑到 rust
和 crystal
也几乎完全自托管并且它们可以利用 LLVM 发出二进制文件,甚至交叉编译,LLVM 会是更好的方法吗?
作为背景,我在这里问了一个关于 code-gen
的问题,以防各种 LLVM 前端 What are the issues faced while implementing a self-hosted language on LLVM?
Julia 确实有一种代码生成形式,即它的类型化 AST。您可以在任何函数调用前使用 @code_typed
查看类型化的 AST。从理论上讲,您可以使用它来发射到任何 IR,而 Julia 出于其他地方所述的原因选择了 LLVM IR。 Transpiler.jl 是一个包,它执行此操作以从 Julia 函数输出诸如 OpenCL 代码之类的东西。
您可以使用 LLVM IR 发出其他字节码。 CUDANative.jl uses LLVM's .ptx backend to emit CUDA kernels directly from Julia functions. The @polly
project is looking to do similar things whereby the macro would allow Julia to auto-accelerate some codes on the GPU (I admittedly have little knowledge of this, other than reading the post which suggested it and the followup。这被选为 LLVM 的 GSoC 项目)。
rustc 通过 LLVM C API 和 C++ 中的 extended wrapper 链接并使用 LLVM,公开为 C ABI。我不知道 crystal,但有些语言直接以文本或字节码 LLVM IR 为目标,这具有一些潜在的优势,但也存在性能和兼容性问题。
至于 "how difficult":NaN
,我猜?最直接的方法是从 Julia 的 type-inferred lowered form, which is already close to SSA 开始。具有良好编译器背景的人可能会在短时间内(~几个月)编写一个未优化(溢出、无代码移动等)的单一架构模板汇编器。没有编译器背景的人可能需要大量研究才能正确提出问题。
按照 go
和 chez-scheme
的思路将通用 code-gen
后端添加到 Julia
会有多困难,即没有 LLVM。
考虑到 rust
和 crystal
也几乎完全自托管并且它们可以利用 LLVM 发出二进制文件,甚至交叉编译,LLVM 会是更好的方法吗?
作为背景,我在这里问了一个关于 code-gen
的问题,以防各种 LLVM 前端 What are the issues faced while implementing a self-hosted language on LLVM?
Julia 确实有一种代码生成形式,即它的类型化 AST。您可以在任何函数调用前使用 @code_typed
查看类型化的 AST。从理论上讲,您可以使用它来发射到任何 IR,而 Julia 出于其他地方所述的原因选择了 LLVM IR。 Transpiler.jl 是一个包,它执行此操作以从 Julia 函数输出诸如 OpenCL 代码之类的东西。
您可以使用 LLVM IR 发出其他字节码。 CUDANative.jl uses LLVM's .ptx backend to emit CUDA kernels directly from Julia functions. The @polly
project is looking to do similar things whereby the macro would allow Julia to auto-accelerate some codes on the GPU (I admittedly have little knowledge of this, other than reading the post which suggested it and the followup。这被选为 LLVM 的 GSoC 项目)。
rustc 通过 LLVM C API 和 C++ 中的 extended wrapper 链接并使用 LLVM,公开为 C ABI。我不知道 crystal,但有些语言直接以文本或字节码 LLVM IR 为目标,这具有一些潜在的优势,但也存在性能和兼容性问题。
至于 "how difficult":NaN
,我猜?最直接的方法是从 Julia 的 type-inferred lowered form, which is already close to SSA 开始。具有良好编译器背景的人可能会在短时间内(~几个月)编写一个未优化(溢出、无代码移动等)的单一架构模板汇编器。没有编译器背景的人可能需要大量研究才能正确提出问题。