编译原理实战课
宫文学
北京原点代码 CEO
26066 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 55 讲
真实编译器解析篇 (19讲)
编译原理实战课
15
15
1.0x
00:00/00:00
登录|注册

22 | Julia编译器(一):如何让动态语言性能很高?

多重分派功能
多版本的目标代码
多种IR
递归下降算法
编译器的实现语言
Julia的多重分派功能
生成多个版本的目标代码
Julia的编译过程
Julia的源代码目录
Julia的设计目的
Julia的性能
一课一思
课程小结
Julia的最大突破
Julia的编译过程
初步认识Julia
Julia编译器

该思维导图由 AI 生成,仅供参考

你好,我是宫文学。
Julia 这门语言,其实是最近几年才逐渐获得人们越来越多的关注的。有些人会拿它跟 Python 进行比较,认为 Julia 已经成为了 Python 的劲敌,甚至还有人觉得它在未来可能会取代 Python 的地位。虽然这样的说法可能是有点夸张了,不过 Julia 确实是有它的可取之处的。
为什么这么说呢?前面我们已经研究了 Java、Python 和 JavaScript 这几门主流语言的编译器,这几门语言都是很有代表性的:Java 语言是静态类型的、编译型的语言;Python 语言是动态类型的、解释型的语言;JavaScript 是动态类型的语言,但可以即时编译成本地代码来执行。
而 Julia 语言却声称同时兼具了静态编译型和动态解释型语言的优点:一方面它的性能很高,可以跟 Java 和 C 语言媲美;而另一方面,它又是动态类型的,编写程序时不需要指定类型。一般来说,我们很难能期望一门语言同时具有动态类型和静态类型语言的优点的,那么 Julia 又是如何实现这一切的呢?
原来它是充分利用了 LLVM 来实现即时编译的功能。因为 LLVM 是 Clang、Rust、Swift 等很多语言所采用的后端工具,所以我们可以借助 Julia 语言的编译器,来研究如何恰当地利用 LLVM。不过,Julia 使用 LLVM 的方法很有创造性,使得它可以同时具备这两类语言的优点。我将在这一讲中给你揭秘。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Julia编译器的独特之处在于兼具静态编译型和动态解释型语言的优点,利用LLVM实现即时编译功能,性能可与C、Rust媲美,甚至超越Java。Julia的设计目的是用于科学计算,打破了静态编译和动态编译语言的边界,体现了未来语言的趋势。Julia的编译器源代码使用了C、C++、Lisp和Julia自身,其中Lisp的使用体现了Julia继承了Lisp语言的精髓。Julia具有科学家的味道,体现在类型系统的形式化、语法和语义设计上,以及前沿探索的特征。Julia继承了Lisp的传统和风格,结合了数据家风格的自由不羁的极客风。Julia的编译过程采用Lisp实现前端,将程序编译成AST,再转换成更低级的IR,最终生成可执行的本地代码。Julia的最大突破在于能够根据运行时获得的数据进行类型推断,并编译生成最优化的本地代码,使得程序运行的总体性能很高。Julia的函数分派算法和多重分派功能也是其重要特色,让编译器在编译时或运行时确定采用函数的哪个实现版本。Julia的编译器不同于JavaScript编译器,它会针对每种参数类型组合都生成一个版本的目标代码。Julia的多重分派功能使得函数根据参数类型组合生成多个版本的目标代码,这种实现方式方便扩展支持不同的数据类型,体现了Julia的灵活性和高性能。Julia编译器的设计和实现为读者提供了深入探究编译原理和创新思路的机会。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(5)

  • 最新
  • 精选
  • myrfy
    从速度角度考虑,julia的编译应该是AOT的,可以在编译期多花时间,来换取执行期的速度,而v8是jit,要保证运行流畅,不能花太多时间。 从jit的角度分析,如果依赖统计数据确定了某一变量的类型,则该变量类型变动的概率很低,为小概率的事件再生成一套机器码不划算 从内存占用角度,生成更多的版本意味着占用更多内存,而v8的主要使用场景,浏览器,对资源的限制是比较严格的。

    作者回复: 不错喔,思考得很全面! 不过Julia的运行方式仍然属于JIT的,只不过对编译时间没有那么敏感罢了。 Julia也支持AOT的方式编译,不过跟静态类型语言的AOT仍然是不同的,因为类型是推断出来的。

    2020-07-22
    5
  • minghu6
    julia设计得不错, 一个它一个Rust基本上是我比较欣赏的21世纪10年代以后的新生语言, 文中提到的函数分发作为面向对象里重载的实现,好像最初的面向对象smalltalk就是这种风格,只不过后来一系列像C++这种所谓静态类型的指令型的面向对象把路给带偏了. 另外一个scheme风格的宏我以前很喜欢,极客风很酷, 但现在我认为还是基于Pattern match的用ALGOL风格的宏更好一点,原因就是编写得效率高,易读易维护.(就比如在那个我的demo项目里面用几十分钟(包括查资料)写的解析生成式的宏我之前用Hy(sheme风格)来试着写过,那简直是time-consumer,一晃几天过去了还在写底层的机制呢)

    作者回复: time-consumer,哈哈,幽默! 要把时间浪费在美好的事情上:)

    2021-06-16
    1
  • ヾ(◍°∇°◍)ノ゙
    老师,很多语言都声称使用llvm提升性能,但是在lua领域好像一直是luajit无法超越

    作者回复: llvm是个通用的后端工具,但它脱胎于C/C++。比如别名分析(Alias Analysis)这样的功能,就是因为C/C++中的指针会引用同一块内存。 所以,一门语言的运行机制越是像C/C++,用llvm来做后端就越合适,就比如Rust用llvm就很成功。 而像JavaScript、Lua这些语言,有可能还是根据自己语言的特点来实现后端更好。当然,这样的话工作量比较大。不过Lua语言由于比较简单,相应的后端优化工作量也就少了些。 在时间很紧张的时候,也可以拿llvm顶一顶,Safari浏览器中的JavaScript引擎之前就这么干过。

    2020-07-22
    1
  • 常新CXIN
    老师,Julia的动态分派性能和Rust以及C++的运行时多态对比怎么样呢?
    2022-06-12
    1
  • Geek_5c11cd
    "flisp 解析器并不是一个经典的递归下降解析器,因为它经常回顾并修改它已经生成的输出树"
    2022-12-04归属地:加拿大
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部