Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Julia 新 LTS v1.10 解説 for JuliaTokai #20
Search
GOTOH Shunsuke
October 14, 2024
Technology
1
310
Julia 新 LTS v1.10 解説 for JuliaTokai #20
Julia 新 LTS v1.10 解説
JuliaTokai #20 発表資料
GOTOH Shunsuke
October 14, 2024
Tweet
Share
More Decks by GOTOH Shunsuke
See All by GOTOH Shunsuke
関数型まつりレポート for JuliaTokai #22
antimon2
0
190
Julia という言語について (FP in Julia « SIDE: F ») for 関数型まつり2025
antimon2
3
1.1k
FP in Julia « SIDE: J » for JuliaTokai #21
antimon2
1
160
JuliaTokaiとJuliaLangJaの紹介 for NGK2025S
antimon2
1
280
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
antimon2
0
130
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
260
Julia クイズ ~API編~ for JuliaTokai #19
antimon2
1
210
Julia でどうしても super().hoge みたいなことしたい人へ for JuliaTokai #18
antimon2
1
400
『実践Julia入門』 で 割愛したネタ for JuliaTokyo #11
antimon2
2
740
Other Decks in Technology
See All in Technology
JOAI発表資料 @ 関東kaggler会
joai_committee
1
180
OpenAPIから画面生成に挑戦した話
koinunopochi
0
130
自治体職員がガバクラの AWS 閉域ネットワークを理解するのにやって良かった個人検証環境
takeda_h
2
370
[OCI Technical Deep Dive] OracleのAI戦略(2025年8月5日開催)
oracle4engineer
PRO
1
260
なごミュ@SPAJAM2025 第二回予選
1901drama
0
120
広島発!スタートアップ開発の裏側
tsankyo
0
180
夏休みWebアプリパフォーマンス相談室/web-app-performance-on-radio
hachi_eiji
1
290
第4回 関東Kaggler会 [Training LLMs with Limited VRAM]
tascj
10
1.5k
[OCI Skill Mapping] AWSユーザーのためのOCI(2025年8月20日開催)
oracle4engineer
PRO
2
110
Gaze-LLE: Gaze Target Estimation via Large-Scale Learned Encoders
kzykmyzw
0
300
AI時代の大規模データ活用とセキュリティ戦略
ken5scal
1
280
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual Localization
takmin
0
370
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Raft: Consensus for Rubyists
vanstee
140
7.1k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
What's in a price? How to price your products and services
michaelherold
246
12k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
Building Applications with DynamoDB
mza
96
6.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Art, The Web, and Tiny UX
lynnandtonic
302
21k
Designing Experiences People Love
moore
142
24k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Why Our Code Smells
bkeepers
PRO
338
57k
Transcript
Julia 新 LTS v1.10 解説 2024/10/14 JuliaTokai #20 antimon2(後藤 俊介)
お品書き • お前誰よ? • 簡単な Julia の紹介 • Julia LTS
• v1.6 → v1.10 トピック
お前誰よ?
自己紹介 • 名前:後藤 俊介 • 所属:有限会社 来栖川電算 • コミュニティ:🌟JuliaTokai, 🌟機械学習名古屋,
⭐JuliaLangJa, Ruby東海, Python東海, … • 言語:Julia, Python, Ruby, … • SNS等: (@antimon2) • SNS等(2): (@antimon2.jl) • 著書:実践Julia入門
https://julialangja.github.io
JuliaLangJa とは? • Julia プログラマ同士の交流を目的とした 日本語コ ミュニティ (2024年始動) • 各セクションごとに
勉強会 ◦ JuliaTokyo、JuliaTokai、その他 • 日本語での情報提供・相談・Q&A など ◦ Discord 内のテキストチャンネル・ボイスチャンネ ル・フォーラムチャンネルを利用
少しでも興味があればお気軽に参加を! • 学生・社会人・研究者等 どなたでもOK! • 名古屋・関東・他 地域関係なく参加OK! • 行動規範 だけはお守りください!
JuliaLangJa 行動規範リンク→ 参加はこちらから!↓→ https://julialangja.github.io
次回予告 • JuliaLangJa 2024 年末LT大会(仮) ◦ 2024/12 予定 ◦ 会場:オンライン(Discord)
簡単な Juliaの紹介
None
Julia とは?(1) • The Julia Language • 最新 v1.11.0(2024/10/07) 🆕
◦ LTS:v1.10.5(2024/08/27) 🆕 ◦ 次期:--- • 科学技術計算に強い! • 動作が速い!(LLVM JIT コンパイル)
Julia とは?(2) • Rのように中身がぐちゃぐちゃでなく、 • Rubyのように遅くなく、 • Lispのように原始的またはエレファントでなく、 • Prologのように変態的なところはなく、
• Javaのように硬すぎることはなく、 • Haskellのように抽象的すぎない ほどよい言語である 引用元:http://www.slideshare.net/Nikoriks/julia-28059489/8
Julia とは?(3) • C のように高速だけど、 Ruby のようなダイナミズムを併せ持っている • Lisp のような真のマクロを持ちながら、
MATLAB のような直感的な数式表現もできる • Python のように総合的なプログラミングができて、 R のように統計処理も得意で、 Perl のように文字列処理もできて、 MATLAB のように線形代数もできて、 shell のように複数のプログラムを組み合わせることもできる • 超初心者にも習得は容易でありながら、 ハッカーの満足にも応えられる • インタラクティブな動作環境もあって、コンパイルもできる (Why We Created Julia から抜粋・私訳)
要するに • 動的言語なのに速い! • 文法も覚えやすい! • 数値計算に強い!
Julia の主な特徴 • 多重ディスパッチ • 動的型システム • 並行・並列処理、コルーチン • 組込パッケージマネージャ
Julia LTS
https://julialang.org/downloads (抜粋)
Julia の 最新安定版 / LTS版 • 最新安定版 (Current Stable Release)
◦ 十分にテストされた上でリリースされる Julia の最新版 ◦ 普段の開発・実験用(=普通のユーザはこちらを使えばOK!) ◦ 単に 安定版 とも言う • LTS版 (Long-Term Support Release) ◦ API 仕様を保証する Julia の最低バージョン ◦ (今のところ)3年おきくらいに交替 ◦ (=アプリケーション・パッケージ開発者は気にする必要あり)
Julia LTS版 が更新されて嬉しいのは… • 主にパッケージの開発者! ◦ 作ったプログラムをパッケージ化するのに、 LTS でテストが通らない(実は LTS
以降の 新API等を利用してた)経験のあるパッケー ジ開発者は実は多いはず…
参考: Julia の 開発版 / 次期版 • 開発版 ◦ 開発中のブランチ(master)をビルドした
Julia ◦ 最新機能をいち早くお試ししたい人向け • 次期版 ◦ 次期版(α版・β版・RC版):仕様を確定し次にリリースするためにテスト中の Julia • juliaup はどちらにも対応 ◦ 開発版: juliaup add nightly (ほぼ日替わり nightly build が取得できる) ◦ α版: juliaup add alpha (用意されていなければ beta チャンネルと同内容) ◦ β版: juliaup add beta (用意されていなければ rc チャンネルと同内容) ◦ RC版: juliaup add rc (用意されていなければ release チャンネルと同内容)
Julia LTS の変遷 • v1.0 ◦ (2018/08~)2021/11 ◦ 明示されておらず(記憶に間違いがなければ)、実質LTS ◦
【訂正】 v1.1.0 のリリースに時に明示的に v1.0系(当時 v1.0.3)が LTS に • v1.6 ◦ 2021/11~2024/10 ◦ v1.7.0 のリリース(2021/11/30)とともにv1.6系(当時 v1.6.5)が LTS に ◦ パッケージ開発者に「LTS での動作確認よろ!」喧伝 • v1.10 ◦ 2024/10~ ←イマココ! ◦ v1.11.0 のリリース(2024/10/07)とともにv1.10系(v1.10.5)が新LTSに!
v1.6 → v1.10 トピック
文法:グローバル変数の型アノテーション • グローバル変数に型アノテーション を付けられるようになった • 追加:v1.8 julia> module SampleCounter count::Int
= 0 # v1.7 まではエラーになる countup() = global count += 1 end Main.SampleCounter julia> SampleCounter.countup() 1 julia> SampleCounter.countup() 2
文法:フィールドへの const 指定 • mutable struct のフィールドに const を指定(変更不可)ができる ようになった
• 追加:v1.8 julia> mutable struct GameCharacter const race::Symbol name::String end julia> player1 = GameCharacter(:human, "Bob") GameCharacter(:human, "Bob") julia> player1.name = "Alice"; player1 # 名前は変更できる GameCharacter(:human, "Alice") julia> player1.race = :elf # 種族は変更できない ERROR: setfield!: const field .race of type GameCharacter cannot be changed Stacktrace: # :《以下略》
文法:プロパティ分割代入 (Property Destructuring) • オブジェクトの持つプロパティを抽 出して変数に簡単一括代入 ◦ 左辺は 名前付きタプル の書式
◦ (; x, y) = pt2 は x = pt2.x; y = pt2.y と同等 • v1.7以降の Julia の内部コードで も多用されている! • 追加:v1.7 julia> struct Point2d; x; y; end; pt2 = Point2d(1, 2); julia> (; x, y) = pt2; # `x = pt2.x; y = pt2.y` と同等 julia> println("x: $x, y: $y") x: 1, y: 2 julia> # 応用例1:↓こんなこともできる for (; x, y) in (pt2, (x="eks", y="歪", z=0)) println("x: $x, y: $y") end x: 1, y: 2 x: eks, y: 歪 # `z` は無視される(処理されない) julia> f((;x, y)) = x + y # 応用例2:こんなこともできる f (generic function with 1 method) julia> f(pt2) 3
文法:文字列内の折り返し • 長い文字列をリテラル内で折り返せ るように ◦ 折り返す前に \ (バックスラッシュ)を記 述(=続く改行を無視の意味に) ◦
(それまでは分割して文字列結合する必 要があった) • 追加:v1.7 julia> pi_str = "3.14159265358979\ 32384626433832795028841971693993\ 75105820974944592307..." "3.14159265358979323846264338327950288419716939937510582097 4944592307..." julia> # ↑は↓と同等(v1.6 までの書き方) pi_str = "3.14159265358979" * "32384626433832795028841971693993" * "75105820974944592307..." "3.14159265358979323846264338327950288419716939937510582097 4944592307..."
API:@something マクロ • 複数の式で最初に nothing でない ものを採用 • それ以降は評価しない! (Short-circuitting)
• 追加:v1.7 • ※同様な @coalesce (最初に missing でないものを採用)もアリ julia> f1() = nothing f1 (generic function with 1 method) julia> f2() = :OK f2 (generic function with 1 method) julia> @something f1() f2() error("ここには来ないはず!") :OK julia> # 以下と同等 if (res = f1()) !== nothing res elseif (res = f2()) !== nothing res else error("ここには来ないはず!") end :OK
API:@inline / @noinline (機能拡張) • @inline および @noinline マク ロが機能拡張されて地味に便利に!
◦ 以前は 関数定義時 くらいにしか指定で きなかった ◦ (無名)関数の最初の行や、関数呼び出し 箇所などにも指定できるように! • 変更:v1.8 map(arr) do value @inline # ↑こんな感じに指定できる end @inline let a0 = :foo, b0 = :bar a = f(a0) # ここはインライン化対象 b = @noinline f(b0) # ここはインライン化対象外 a, b end
API:replace() 関数(機能拡張) • replace() 関数による文字列置換 で、複数パターン指定可能に! ◦ v1.6 では replace(replace(str,
pat1=>rep1), pat2=>rep2) のよう にネストしなければならなかった(!) ◦ ↑では対応できないパターンもあった→ • 変更:v1.7 julia> replace("Julia ♡ XXX", "XXX"=>"Julia", "Julia"=>"I") # 複数パターンは同時並行的に置換(≠逐次的)! "I ♡ Julia" julia> replace(replace("Julia ♡ XXX", "XXX"=>"Julia"), "Julia"=>"I") # これ(逐次的置換)だと↑と同等にはならない! "I ♡ I"
API:range() (機能拡張) • range() 関数が機能拡充されて 色々な範囲指定ができるように! • 変更:v1.7、v1.8 julia> range(1,
10) # ≥v1.7。v1.6 では `range(1, 10, step=1)` と書く必要あり(!) 1:10 julia> range(0, 0, length=10) # ≥v1.7。`start==stop` で `length` を指定すると↓! StepRangeLen(0.0, 0.0, 10) julia> range(stop=10, length=5) # ≥v1.7。`start` の省略! 6:10 julia> range(; stop=10) # ≥v1.8。`stop` または `length` だけ指定した場合 `start=1`! Base.OneTo(10)
API:keepat!() • 1次元配列の指定したインデックスの 要素のみ残す keepat!() 関数! ◦ 破壊的関数(=引数の配列を更新する) • 追加:v1.7
julia> a = [:a, :b, :c, :d, :e]; julia> keepat!(a, [1, 3, 4]) # `deleteat!(a, [2, 5])`と同等 3-element Vector{Symbol}: :a :c :d julia> a 3-element Vector{Symbol}: :a :c :d
API:Base.memcpy() 系関数 • C言語(libc)の memcpy() 関数が ほぼ直接使える! ◦ 他に memmove()
(重複箇所も安全にコ ピー)、memset() (値の一括設定)、 memcmp() (値列の比較)もあり ◦ 範囲チェック等省かれるので高速(たぶ ん) ◦ ※unsafeなので取扱注意! • 追加:v1.10 julia> src = [1, 2, 3]; dst = similar(src); julia> # 例1:配列丸ごとコピー、(結果的に) `dst .= src` と同等 Base.memcpy(pointer(dst), pointer(src), sizeof(src)) # `Libc.memcpy(~)`でも同じ Ptr{Nothing} @0x00007f6c5d8b4bc0 julia> dst == src == [1, 2, 3] true julia> # 例2:部分コピー、 `dst[1:2] .= src[2:3]` と同等 Base.memcpy(pointer(dst), pointer(src, 2), 2*sizeof(eltype(src))) Ptr{Nothing} @0x00007f6c5d8b4bc0 julia> dst 3-element Vector{Int64}: 2 3 3
API:@atomic • マルチスレッドのスレッドセーフ機構 の1つ、アトミック操作(不可分操作) を実現するマクロ @atomic ! ◦ 他に @atomicswap、@atomicreplace
もあり • 追加:v1.7 julia> mutable struct AtomicCounter @atomic count::Int AtomicCounter() = new(0) end julia> counter = AtomicCounter(); julia> Threads.@threads for n=1:1000 @atomic counter.count += 1 # 更新時にも指定 end julia> counter.count 1000
その他主な変更点 • Parserの変更(≥v1.10) • JITコンパイル・プリコンパイルの改善(随時) • GCのマルチスレッド化(≥v1.10) • try ~
[catch ~] else ~ end(≥v1.8) • lazy"$x"(≥v1.8) • Threads.@threads のデフォルトが :dynamic に、負荷分散対応!(≥v1.8) • default thread と interactive thread (≥v1.9) • CartesianIndex がブロードキャスティングでスカラー扱いに!(≥v1.10) • @invoke マクロ導入、機能拡充(≥v1.7(導入)、≥v1.9、≥v1.10(拡充)) • eachsplit(str) 関数(≥v1.8) • Iterators.flatmap(itr) 関数(≥v1.9) • Base.@assume_effects マクロ(≥v1.8) • Base.@nospecializeinfer マクロ、Base.@constprop マクロ(≥v1.10) • …etc.
結論
結論 • 新LTS v1.10 でできることいっぱい増えま した! • パッケージ開発も色々楽になる! • Julia
楽しいよ!
参考
参考文献・リンク等 • julialang.org(Julia 本家サイト) ◦ Julia Documentation • 各バージョンの NEWS.md(v1.7、v1.8、v1.9、v1.10)
• 各バージョンの Highlight ブログ記事(v1.7、v1.8、v1.9、 v1.10)
ご清聴ありがとうございます。