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
240
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
FP in Julia « SIDE: J » for JuliaTokai #21
antimon2
0
96
JuliaTokaiとJuliaLangJaの紹介 for NGK2025S
antimon2
1
230
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
antimon2
0
96
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
210
Julia クイズ ~API編~ for JuliaTokai #19
antimon2
1
190
Julia でどうしても super().hoge みたいなことしたい人へ for JuliaTokai #18
antimon2
1
390
『実践Julia入門』 で 割愛したネタ for JuliaTokyo #11
antimon2
2
680
勉強会を主催したら 本を出して技術顧問になった話 for NGK2024S
antimon2
0
340
Julia本を書いたら技術顧問になった話 for JuliaTokai #17
antimon2
0
610
Other Decks in Technology
See All in Technology
新卒エンジニアがCICDをモダナイズしてみた話
akashi_sn
2
250
QA/SDETの現在と、これからの挑戦
imtnd
0
140
Cursor AgentによるパーソナルAIアシスタント育成入門―業務のプロンプト化・MCPの活用
os1ma
14
4.9k
サーバレス、コンテナ、データベース特化型機能をご紹介。CloudWatch をもっと使いこなそう!
o11yfes2023
0
180
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
120
Road to Go Gem #rubykaigi
sue445
0
790
ドキュメント管理の理想と現実
kazuhe
1
210
Devinで模索する AIファースト開発〜ゼロベースから始めるDevOpsの進化〜
potix2
PRO
8
3.5k
クォータ監視、AWS Organizations環境でも楽勝です✌️
iwamot
PRO
1
320
LLM as プロダクト開発のパワードスーツ
layerx
PRO
1
240
Making a MIDI controller device with PicoRuby/R2P2 (RubyKaigi 2025 LT)
risgk
1
270
Notion x ポストモーテムで広げる組織の学び / Notion x Postmortem
isaoshimizu
1
120
Featured
See All Featured
Faster Mobile Websites
deanohume
306
31k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Mobile First: as difficult as doing things right
swwweet
223
9.6k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.4k
Being A Developer After 40
akosma
91
590k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
530
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.3k
Designing for humans not robots
tammielis
252
25k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
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)
ご清聴ありがとうございます。