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)
的作用是提供自变量的类型。
致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者
热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利