想对Julia作深入了解,打算学习Julia的源代码,请问该怎么入手呢?
编译器,代码生成,标准库(的某一个),矩阵协议,迭代器协议,SIMD,图像处理 :doge: 等等,具体是指哪一方面呢?
这让我回想起了我开的一个坑。
devdoc 实际上已经年久失修了,需要批判性的阅读。严谨一点:至少链接指向的 init 页面需要更新(虽然我看22年2月还有commit)。
回到主题:如何读源代码?
这个其实取决于你的目的是什么。
我提到的《julia 运行时的初始化》主要目的是为了更新文档,而且采用的手段基本上是通过调试来获得信息,直接阅读源代码还是太难了,因为 julia 内部涉及的语言很多,直接阅读很容易卡在语言的交接处。(例如:调用链中的各种 trampolines
/jl_apply
)
源码编译与调试
如果你说的“深入了解”,就是字面意义上的想多了解一下,没有特别的偏好。
我的建议是:
- 尝试搭建 julia 的本地编译环境,编译一次 LTS 分支(联网,使用预编译的依赖)
- 编译 master 分支
(环境搭建好了,这个其实是水到渠成的事) - 尝试搭建调试环境
(配上 gdb web UI 能显著提升幸福感) - 进阶版是尝试使用现有的或自行构建的,包含所有依赖的离线源码包,然后离线编译一次
(感觉这里 win 上离线编译目前有 bug 但我没证据)
- 编译 master 分支
自行编译大致能给你一些关于 julia 底层的印象,如果试过离线编译,基本就能知道 julia 涉及到的所有依赖了。
进阶
- 搜索
deps/
里包含的依赖库都是干什么用的
这样能理解一些 julia 性能以及功能的上下限来源。像:默认矩阵乘法的速度问题、无限精度算数的支持、正则表达式的支持、Unicode 的支持 - 检查
stdlib/
想一想:那些是有单独 repo 的?哪些是有二进制依赖的?把这个标准库删了行不行?
如果不觉得这个过程有什么困难 or 克服了出现的困难,加上有了调试环境,这样去看一些非 julia 编写的源码会比较省事。之后就看你对那部分感兴趣了。
确实有困难,那么换一个学习的方向也不是不可以接受。我自己尝试过编译、运行、调试 julia-parser.scm,基本就停在能编译 flisp 上了。
单元测试与文档
另一种深入学习的角度是:停留在 julia 编写的代码中。
以给现有代码增加单元测试或者完善文档为目的,去阅读和调试代码。
这个会更简单一些,并且比较有成就感。
寻找感兴趣的点
如果想给 julia 的代码部分添砖加瓦,又暂时没找到想做的方向、不知道哪里可以改进。
可以去 github issue 多逛逛:
英文论坛的“内部设计”子论坛也值得一逛,不过讨论的话题都不是新手能够上手的
我有个 repo 也记录了一些我想做的点:
这是一个关于 Julia 下标索引机制的 low-hanging fruit,有兴趣的话可以去做做看,会是一个异常好的锻炼。
涉及的还真多,编译器就算了,代码生成感觉挺有趣,但是Base
更实在一点,SIMD
我不感兴趣也不需要,图像处理需要的时候能用上来就行,里面的高性能设计思路应该值得学习。emmm,要达到你的水平都需要学啥呢?