22 | Julia编译器(一):如何让动态语言性能很高?
该思维导图由 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-225 - minghu6julia设计得不错, 一个它一个Rust基本上是我比较欣赏的21世纪10年代以后的新生语言, 文中提到的函数分发作为面向对象里重载的实现,好像最初的面向对象smalltalk就是这种风格,只不过后来一系列像C++这种所谓静态类型的指令型的面向对象把路给带偏了. 另外一个scheme风格的宏我以前很喜欢,极客风很酷, 但现在我认为还是基于Pattern match的用ALGOL风格的宏更好一点,原因就是编写得效率高,易读易维护.(就比如在那个我的demo项目里面用几十分钟(包括查资料)写的解析生成式的宏我之前用Hy(sheme风格)来试着写过,那简直是time-consumer,一晃几天过去了还在写底层的机制呢)
作者回复: time-consumer,哈哈,幽默! 要把时间浪费在美好的事情上:)
2021-06-161 - ヾ(◍°∇°◍)ノ゙老师,很多语言都声称使用llvm提升性能,但是在lua领域好像一直是luajit无法超越
作者回复: llvm是个通用的后端工具,但它脱胎于C/C++。比如别名分析(Alias Analysis)这样的功能,就是因为C/C++中的指针会引用同一块内存。 所以,一门语言的运行机制越是像C/C++,用llvm来做后端就越合适,就比如Rust用llvm就很成功。 而像JavaScript、Lua这些语言,有可能还是根据自己语言的特点来实现后端更好。当然,这样的话工作量比较大。不过Lua语言由于比较简单,相应的后端优化工作量也就少了些。 在时间很紧张的时候,也可以拿llvm顶一顶,Safari浏览器中的JavaScript引擎之前就这么干过。
2020-07-221 - 常新CXIN老师,Julia的动态分派性能和Rust以及C++的运行时多态对比怎么样呢?2022-06-121
- Geek_5c11cd"flisp 解析器并不是一个经典的递归下降解析器,因为它经常回顾并修改它已经生成的输出树"2022-12-04归属地:加拿大