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
250
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
1
110
JuliaTokaiとJuliaLangJaの紹介 for NGK2025S
antimon2
1
240
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
antimon2
0
100
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
210
Julia クイズ ~API編~ for JuliaTokai #19
antimon2
1
200
Julia でどうしても super().hoge みたいなことしたい人へ for JuliaTokai #18
antimon2
1
390
『実践Julia入門』 で 割愛したネタ for JuliaTokyo #11
antimon2
2
690
勉強会を主催したら 本を出して技術顧問になった話 for NGK2024S
antimon2
0
350
Julia本を書いたら技術顧問になった話 for JuliaTokai #17
antimon2
0
610
Other Decks in Technology
See All in Technology
コードや知識を組み込む / Incorporating Codes and Knowledge
ks91
PRO
0
170
LLM アプリケーションのためのクラウドセキュリティ - CSPM の実装ポイント-
osakatechlab
0
290
Previewでもここまで追える! Azure AI Foundryで始めるLLMトレース
tomodo_ysys
2
390
ここはMCPの夜明けまえ
nwiizo
32
13k
AIによるコードレビューで開発体験を向上させよう!
moongift
PRO
0
400
正式リリースされた Semantic Kernel の Agent Framework 全部紹介!
okazuki
1
730
コスト最適重視でAurora PostgreSQLのログ分析基盤を作ってみた #jawsug_tokyo
non97
2
880
Gateway H2 モジュールで スマートホーム入門
minoruinachi
0
130
2025-04-24 "Manga AI Understanding & Localization" Furukawa Arata (CyberAgent, Inc)
ornew
2
340
Dataverseの検索列について
miyakemito
1
180
開発者とQAで協業するテックタッチの取り組み
shutty
0
100
AWSを利用する上で知っておきたい名前解決の話
nagisa53
6
690
Featured
See All Featured
Producing Creativity
orderedlist
PRO
344
40k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.3k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
For a Future-Friendly Web
brad_frost
177
9.7k
The Straight Up "How To Draw Better" Workshop
denniskardys
233
140k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
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)
ご清聴ありがとうございます。