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
210
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
JuliaTokaiとJuliaLangJaの紹介 for NGK2025S
antimon2
1
200
あなたの知らない(概ね知らなくても良い)Juliaの世界 for JuliaLangJa 年末 LT 大会 2024
antimon2
0
75
夏休みの(最後の)宿題 for JuliaTokyo #12
antimon2
1
200
Julia クイズ ~API編~ for JuliaTokai #19
antimon2
1
170
Julia でどうしても super().hoge みたいなことしたい人へ for JuliaTokai #18
antimon2
1
370
『実践Julia入門』 で 割愛したネタ for JuliaTokyo #11
antimon2
2
640
勉強会を主催したら 本を出して技術顧問になった話 for NGK2024S
antimon2
0
330
Julia本を書いたら技術顧問になった話 for JuliaTokai #17
antimon2
0
590
Juliaってどんなことができるの? for JuliaTokai #16
antimon2
1
640
Other Decks in Technology
See All in Technology
Aurora PostgreSQLがCloudWatch Logsに 出力するログの課金を削減してみる #jawsdays2025
non97
1
130
生成AI×財務経理:PoCで挑むSlack AI Bot開発と現場巻き込みのリアル
pohdccoe
1
530
LINE NEWSにおけるバックエンド開発
lycorptech_jp
PRO
0
180
日経のデータベース事業とElasticsearch
hinatades
PRO
0
210
Share my, our lessons from the road to re:Invent
naospon
0
130
AIエージェント時代のエンジニアになろう #jawsug #jawsdays2025 / 20250301 Agentic AI Engineering
yoshidashingo
8
3k
IAMポリシーのAllow/Denyについて、改めて理解する
smt7174
2
190
プロダクトエンジニア 360°フィードバックを実施した話
hacomono
PRO
0
140
プロダクトエンジニア構想を立ち上げ、プロダクト志向な組織への成長を続けている話 / grow into a product-oriented organization
hiro_torii
1
350
PHPカンファレンス名古屋-テックリードの経験から学んだ設計の教訓
hayatokudou
2
540
手を動かしてレベルアップしよう!
maruto
0
170
Raycast Favorites × Script Command で実現するお手軽情報チェック
smasato
1
140
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Speed Design
sergeychernyshev
27
810
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Building Adaptive Systems
keathley
40
2.4k
GraphQLとの向き合い方2022年版
quramy
44
14k
Making the Leap to Tech Lead
cromwellryan
133
9.1k
Code Review Best Practice
trishagee
67
18k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
The Pragmatic Product Professional
lauravandoore
32
6.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
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)
ご清聴ありがとうございます。