あらすじ
Google Summer of Code に Proposal が採択されました!
Google Summer of Code で Julia に出していた Proposal が採択されました! 🎉🥳
— abap34 (@abap34) May 8, 2025
Julia の最新のコンパイラインフラを利用して、強力な静的解析を備えた新しい Language Server の機能開発をガシガシやっていきます!✊ pic.twitter.com/aEBHcSAnXa
Julia の新しい Language Server の開発をやっていく予定です。
プロジェクトページ:
この記事には具体的にやりたいことや準備の記録などを書いておきます。
先行研究
Google Summer of Code に参加した話 ─ Saza's blog GSoC (Google Summer of Code)で chromiumに採択された。 ─ momokaのブログ GSoC 2021 参加記 ─ shanpu-portal Google Summer of Code2020に申し込んでみた ─ さんぽしの散歩記
などなど (GSoC 参加記 などで検索すればたくさん出てきます)
GSoC とは
他のブログに詳しい説明がたくさんあるので簡潔にまとめると、
- Google が主催するオープンソースプロジェクトへの参加を支援するプログラム
- 学生は開発したいものの Proposal を書いて参加組織に送る
- 参加組織は Proposal を審査して、採択の可否を決める [1]
- 学生がオープンソースプロジェクトに参加して、開発を行う
- Google から報酬がもらえる (国とプロジェクト規模に応じて変わる. 日本で大規模プロジェクトだと今年は $.5400)
- 採択率は 8% くらい?
https://opensource.googleblog.com/2025/05/gsoc-2025-we-have-our-contributors.html - ただ、おそらく大量のインド人が応募しているために実態より競争率が高く見えていると思います。
というやつです。
開発したいもの、と書きましたが大抵の組織では Idea List が公開されていて、そこから選んで書くのが一般的です。
参加まで
昨年ごろから Julia の Language Server を作り直したいな〜 と漠然と考えていたのですが、 そのときたまたま Julia の Co-Founder である Jeff Bezanson さんとご飯を食べる機会がありました。
そこで Language Server の話になり、同席していた JET.jl の作者で Julia Hub の
その後応募が始まった頃に Language Server の開発を GSoC の Idea List に載せてもらい、 Proposal の執筆を開始しました。
目次は以下のような感じです。
Abstract
Technical Description
[1] Analyzing required information from the codebase
[2] Presenting information clearly and effectively
[3] Achieving good performance
Current State of Project
Implementation Plan
Background and Relevant Experience
Related Software Projects
Availability
内容は ⬇︎ で公開しています。
具体的にやりたいこと
Proposal に詳しく書いてありますが、せっかくなので日本語でいくらかまとめておこうと思います!
(細かい話は Proposal を見てください)
LanguageServer.jl の課題
今、 Julia では
主要なものを挙げるとしたら以下のような感じでしょうか。
Missing References が頻発する
Language Server の主要な機能として、 Go To Definition や Find References などがあります。
これは実装箇所や仕様箇所に飛べる便利な機能ですが、 LanguageServer.jl ではこれらがうまく働かないことが非常に多いです。
("Missing" で Issues を検索した結果:
コードベースが複雑化してメンテナンスが難しくなっている
Language Sever Protocol 自体が多くのことを要求するという事情もありますが、コードベースが複雑になってしまっていて、 全体を把握しているメンテナーの方がほとんどいなくなってしまいました。
(課題?) 型エラーなどの高度な解析が行われない
これは課題というよりかは設計思想とかの範疇だと思いますが、 LanguageServer.jl はそこまで高度な解析を行いません。
例えば
function foo(x::Int)
return x + 1
end
foo(2.0)
はもちろんエラー (実行時例外ですが!) になります。 が、LanguageServer.jl は基本的に赤線は引いてくれません。
🆕 Language Server
新しい Language Server は以下のような特徴を持っています (もしくは持つ予定です)
- JET.jl を利用して、複雑な型エラーやパフォーマンスの問題を検出・警告する
- Julia の最新のコンパイラインフラを利用して、メンテナンス性と開発効率を向上させる
JET.jl を利用して、複雑な型エラーやパフォーマンスの問題を検出・警告する
JET.jl は aviatesk さんが開発している Julia の静的解析ツールで、型エラーやパフォーマンスの問題を検出することができます。
例えば
sum([])
はエラーになりますが、 (
[]
は Any
型の配列で、 zero(::Type{Any})
は定義されていないため) JET.jl はこれを検出してくれます。julia> @report_call sum([])
═════ 1 possible error found ═════
┌ sum(a::Vector{Any}) @ Base ./reducedim.jl:982
│┌ sum(a::Vector{Any}; dims::Colon, kw::@Kwargs{}) @ Base ./reducedim.jl:982
(中略)
││┌ zero(::Type{Any}) @ Base ./missing.jl:106
│││ MethodError: no method matching zero(::Type{Any}): Base.throw(Base.MethodError(zero, tuple(Base.Any)::Tuple{DataType})::MethodError)
このようなエラーを検出して Diagnostics として提供します。

他にも型不安定性の表示や、そもそもの型推論結果の表示 (Types on Hover) などに取り組みたいと思っています。
Julia の最新のコンパイラインフラを利用して、メンテナンス性と開発効率を向上させる
Julia の パース・lowering [2] は FemtoLisp で書かれたものが長く稼働していたのですが、現在パーサは Julia自体で書かれたものが使われていて、 lowering も Julia で書かれたものの開発が進んでいます。
Julia 製のものに変わることで、以前と比べると Julia コンパイラ以外のソフトウェアからも比較的利用しやすくなります。 これらを利用することで、 Lanuage Server 側で Julia コンパイラの最新の機能に追従するコストが下がることが期待されています。
また、これらの新しいツールチェインは位置情報をよく保存するようにできていて、 他の現代的なプログラミング言語のような「バイトレベル」のエラーを出せるようになると思います。

他にもあるよ
他にもいろいろな機能について議論していますが、長くなるので Proposal を見てください 🤲
がんばります
自分の周りでも最近は Rust を書いている人がずいぶんたくさんいるのですが、その理由の一つには rust-analyzer などの強力なエディタ支援があると思います。 Julia でも同じようなことができるように頑張っていきたいと思います。
自分より遥かにできる方たちにメンターしてもらいながらチャレンジングなソフトウェアが書けるのは本当に楽しみです! 楽しい夏にしていきたいと思います!
(生活費をくださる Google 様に圧倒的感謝🙏🙏🙏)
今日の一曲
[1] 実際には参加組織は Proposal への順位づけのみをして、 Google がその組織に割り当てた枠の数より小さければ採択ということらしい (?) ですがあまりよくわかっていません。[2] surface-AST を最適化などのために適した IR に変換する処理のことです