Juliaでの調べ方 いろいろ
(この記事は2020年01月17日当時にQiitaに記載したものをそのまま載せてみたものです。)
はじめに
Julia言語には豊富なDocumentがあり、沢山のコードが公開されていて、それらの確認方法もいろいろ用意されているので、一旦まとめてみます。
公式
- The Julia Programming Language:公式HP
- Julia Documentation:公式ドキュメント
- JuliaLang /julia :GitHubソースコード
- The Julia Language(YouTube):Youtubeチャンネル
基本的に公式ドキュメント読めば大概のことは、解決するはず。
というか読みましょう。(自戒)
<追記>他言語から殴り込みに来てJulia大したことないなとお思いの方は、公式DocのPerformance Tipsを読むと良いかもしれません。型や配列のちょっとした考え方で大きな差が出たりします。</追記>
入力補完([tab]を打て)
入力補完も充実してます。
REPLでも1候補なら**[tab]で自動入力、複数候補も[tab][tab]**で表示されます。
julia> cos #[tab][tab]で入力候補表示
cos cosc cosd cosh cospi
julia> cos( #[tab][で引数候補表示
cos(x::BigFloat) in Base.MPFR at mpfr.jl:743
cos(::Missing) in Base.Math at math.jl:1138
cos(a::Complex{Float16}) in Base.Math at math.jl:1086
cos(a::Float16) in Base.Math at math.jl:1085
上記、cos
名前空間から候補、cos(
はcos関数
の引数の型の候補表示してます。
他にもJuliaではUnicodeが使用可能で、いくつか入力補完が可能です。(フォントは注意)
例えば「∛」も、\cbrt
+[tab]
で変換され、そのまま「∛2」等で数値を入力できます。
?
と「関数」)
helpモード(行頭に?
を入力するとjulia>
からhelp?>
替わりhelpモードに入る。
調べたい「関数」「演算子」等を入力すると、そのDocumentがあれば表示される。
help?> if
・・・略・・・
if/elseif/else performs conditional evaluation, which allows portions of code to be evaluated or not evaluated
depending on the value of a boolean expression. Here is the anatomy of the if/elseif/else conditional syntax:
if x < y
println("x is less than y")
また、上記のUnicode入力補完も教えてくれたりする。
help?> π
"π" can be typed by \pi<tab>
ところで?
から何も入力せずに、[Enter]
で
help?>
search: ⊻ ⊋ ⊊ ⊉ ⊈ ⊇ ⊆ ≥ ≤ ≢ ≡ ≠ ≉ ≈ ∪ ∩ ∛ √ ∘ ∌ ∋ ∉ ∈ ℯ π ÷ ~ | ^ \ > < : / - + * & % ! if do IO |> rm pi mv in im fd cp
とよく使われるUnicode・演算子が出力されるので、コピペ&help?>
で調べると便利です。
このhelpモードは、|>
「パイプライン」や...
「スプラット演算子」といったものまで調べられるので、不思議に思ったものは何でも一度使ってみるといいと思います。(スプラットは教えてもらって驚いた)
@functionloc
@less
@edit
ソースファイルを調べる直接ソースコードが見たい場合があります。@マクロ
関数(引数)
でそれぞれ実行。
julia> @functionloc cos(1.0)
("・・・略・・・/share/julia/base/special/trig.jl", 100)
@functionloc
:パス確認、@less
:閲覧、@edit
:編集 で各@マクロ
を使い分けます。
ちなみに私の環境によるのかもしれませんが、WindowsのREPLでの閲覧・編集は難ありです。
-
@edit
は環境変数JULIA_EDITOR
に登録されたテキストエディターで別途開かれ、大概のエディタは行番号を引き継がないので、事前に行番号をメモる必要があります。 -
@less
も行番号がズレて欲しい行が表示されない上に、前頁に戻ることができない問題があります。(Winではmore
コマンドで代替が要因っぽい)
また、調べる関数
によっては
julia> @less rand()
/buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Random/src/Random.jl: そのようなファイルやディレクトリはありません
ERROR: failed process: Process(`less +256g /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.3/Random/src/Random.jl`, ProcessExited(1)) [1]
コンパイル済み関数
となるのか、実行バイナリの元のビルド環境のパスが出てる様で、リンクに飛べません。
ソースファイル自体はローカルの似たような場所にもあるので、そっちを探すといいかもしれません。
@macroexpand
@マクロの展開知りたい@マクロ
の頭に@macroexpand
をつけます。
julia> @macroexpand @less cos(1.0)
:(InteractiveUtils.less(cos, (Base.typesof)(1.0)))
@less
はlessに「関数」と「引数の型」を渡す様に変換されたコードとなる事がわかります。
#より低レベルでの確認 @code_lowered
@code_llvm
@code_native
等・・・
@マクロ
はどれも同じように知りたい「関数(引数)」等の前につけます。
julia> f(x)=x^2+1
f (generic function with 1 method)
julia> @code_lowered f(1)
CodeInfo(
1 ─ %1 = Core.apply_type(Base.Val, 2)
│ %2 = (%1)()
│ %3 = Base.literal_pow(Main.:^, x, %2)
│ %4 = %3 + 1
└── return %4
)
f(x)=x^2+1|ₓ₌₁
の、より低レベルでの挙動を見てます。
更に@code_llvm
:LLVM中間コード、@code_native
:ネイティブコード
を確認できればより深く理解が進むでしょう(私は雰囲気しか分かりませんが)
InteractiveUtils(便利集)
ここまでのほとんどの@マクロ
関数
はInteractiveUtils
パッケージにあります。初めのほうでやった入力補完で
julia> InteractiveUtils. #[tab]で入力候補表示
@code_llvm directsubtype
@code_lowered dumpsubtypes
@code_native dumptype
@code_typed edit
@code_warntype editor
@edit eval
@functionloc gen_call_with_extracted_types
@less gen_call_with_extracted_types_and_kwargs
@which include
_dump_function less
_dump_function_linfo methodswith
_methodswith peakflops
_subtypes separate_kwargs
_subtypes_in subtypes
apropos type_close_enough
clipboard varinfo
code_llvm versioninfo
code_native warntype_type_printer
code_warntype
と出ます。
どれも便利で有用なので、「helpモード」や「ソースの確認」してを試してみるとよいと思います。
それでも分らん(はい、ググりましょう)
もはや定番ネタですが、そのまま**"Julia"でGoogle検索するとアレな女優**さんが出現するので、検索ワードを"julia言語"(日本語用)か"julialang"(英語圏含む)としたり、検索言語⇒English か セーフモード を活用すると良いでしょう
<追記>「設定→地域の設定」を「アメリカ合衆国」のほうが日本語表示のままで良いので推奨されますね。</追記>
あと私もお世話になっていますが、Twitter界隈につよつよな方がいっぱいいるので、検索ワード同様に**#julia言語や#julialang**のハッシュタグで呟くと猛烈に解決してもらえるのではないでしょうか。
最後に
基本「REPL」での説明でしたが「Jupyter notebook」でも当然できます。
が、「Juno」ではこの調べる環境が超充実しています。(入力補完強化、ソースもクリックで内部表示しWin問題も解消等、導入は下記記事が良いでしょう)
他にもIDEではVScodeだったり、それぞれ拡張機能もあったりするので、いろいろ試すと幸せになれるかもしれません。
以上、ありがとうございました。
追記
2020/01/17:Twitter上で黒木さんの記事コメントありました。有用でしたので記事にも追記します。
他にも非常に勉強になるJuliaの数値計算コードを大量に公開されてるアカウントなので、フォロー推奨です。
Discussion