Julia 开发笔记
 
 
 
 
 
 
 
 
 
 
 
贡献者: addis
本文是关于 Julia 解释器的原理:它使用了哪些技术,可以使得它作为一门动态语言能达到编译语言的性能。
- Julia 开发者文档
- C 语言这样的叫做 Ahead of Time(AOT) 编译。
- Julia 完全使用 Just-Ahead-of-Time(JIT)。并不是把部分代码使用该优化,而是全部。Julia 默认不直接理解并执行高级语言(一个理解器见这里)。每个重载的函数第一次被调用的时候,julia 都会先给它生成专门的 llvm 机器码。这个过程还有一个不那么正规的名字叫做 Just Ahead-of-Time(JAOT)。
- Multiple Dispatch(MD):可以基于参数的类型生成不同的专门代码。
- Type Inference:自动推导变量类型。
- 内建并行,包括分布计算
- 高效内存管理:减少内存分配,增加内存重复利用。
- 基于 LLVM:Julia 编译器先把 Julia 语言变为 Julia IR(和 LLVM IR 相似),再变为 LLVM IR, 最后交给 LLVM 进行优化。
- Julia IR 使用 Single Static Assignment (SSA) 形式,把 julia 代码的控制流表示为 directed acyclic graph (DAG)。Julia IR 中的变量类型都是明确的。
-
LLVM.jl
包可以把 julia 代码直接生成 LLVM IR,或者把 Julia IR 转为 LLVM IR。
- 一些预备知识:编译原理,编译器设计,LLVM,Julia 背后原理。
1. 把 Julia 代码编译成 LLVM IR 代码
首先安装 using Pkg; Pkg.add("LLVM")
using LLVM
function add(x::Int, y::Int)::Int
return x + y
end
llvm_ir = @code_llvm add(1, 2) # 生成 LLVM IR
生成的代码如下
; @ REPL[3]:1 within `add'
define i64 @julia_add_652(i64 signext %0, i64 signext %1) {
top:
; @ REPL[3]:2 within `add'
; ┌ @ int.jl:87 within `+'
%2 = add i64 %1, %0
; └
ret i64 %2
}
所以上面参数
(1,2)
的作用是提供自变量的类型。
 
 
 
 
 
 
 
 
 
 
 
© 小时科技 保留一切权利