想阅读Julia源代码,应该从那儿开始?

想对Julia作深入了解,打算学习Julia的源代码,请问该怎么入手呢?

编译器,代码生成,标准库(的某一个),矩阵协议,迭代器协议,SIMD,图像处理 :doge: 等等,具体是指哪一方面呢?

https://docs.julialang.org/en/v1/devdocs/init/

这让我回想起了我开的一个坑。

devdoc 实际上已经年久失修了,需要批判性的阅读。严谨一点:至少链接指向的 init 页面需要更新(虽然我看22年2月还有commit)。


回到主题:如何读源代码?

这个其实取决于你的目的是什么。

我提到的《julia 运行时的初始化》主要目的是为了更新文档,而且采用的手段基本上是通过调试来获得信息,直接阅读源代码还是太难了,因为 julia 内部涉及的语言很多,直接阅读很容易卡在语言的交接处。(例如:调用链中的各种 trampolines/jl_apply

源码编译与调试

如果你说的“深入了解”,就是字面意义上的想多了解一下,没有特别的偏好。
我的建议是:

  • 尝试搭建 julia 的本地编译环境,编译一次 LTS 分支(联网,使用预编译的依赖)
    • 编译 master 分支
      (环境搭建好了,这个其实是水到渠成的事)
    • 尝试搭建调试环境
      (配上 gdb web UI 能显著提升幸福感)
    • 进阶版是尝试使用现有的或自行构建的,包含所有依赖的离线源码包,然后离线编译一次
      (感觉这里 win 上离线编译目前有 bug 但我没证据)

自行编译大致能给你一些关于 julia 底层的印象,如果试过离线编译,基本就能知道 julia 涉及到的所有依赖了。

进阶

  • 搜索 deps/ 里包含的依赖库都是干什么用的
    这样能理解一些 julia 性能以及功能的上下限来源。像:默认矩阵乘法的速度问题、无限精度算数的支持、正则表达式的支持、Unicode 的支持
  • 检查 stdlib/ 想一想:那些是有单独 repo 的?哪些是有二进制依赖的?把这个标准库删了行不行?

如果不觉得这个过程有什么困难 or 克服了出现的困难,加上有了调试环境,这样去看一些非 julia 编写的源码会比较省事。之后就看你对那部分感兴趣了。
确实有困难,那么换一个学习的方向也不是不可以接受。我自己尝试过编译、运行、调试 julia-parser.scm,基本就停在能编译 flisp 上了。

单元测试与文档

另一种深入学习的角度是:停留在 julia 编写的代码中。
以给现有代码增加单元测试或者完善文档为目的,去阅读和调试代码。
这个会更简单一些,并且比较有成就感。

寻找感兴趣的点

如果想给 julia 的代码部分添砖加瓦,又暂时没找到想做的方向、不知道哪里可以改进。

可以去 github issue 多逛逛:

英文论坛的“内部设计”子论坛也值得一逛,不过讨论的话题都不是新手能够上手的

我有个 repo 也记录了一些我想做的点:

2 个赞

这是一个关于 Julia 下标索引机制的 low-hanging fruit,有兴趣的话可以去做做看,会是一个异常好的锻炼。

1 个赞

涉及的还真多,编译器就算了,代码生成感觉挺有趣,但是Base更实在一点,SIMD我不感兴趣也不需要,图像处理需要的时候能用上来就行,里面的高性能设计思路应该值得学习。emmm,要达到你的水平都需要学啥呢? :grin: