Jdi na navigaci předmětu

02: Úvod do prostředí Julia

Instalace

Aktuální stabilní verze Julia je 1.9.3 z 26. září 2023. Na odkazované stránce naleznete instalační balíčky pro různé operační systémy (Windows, macOS, Linux).

Vedle toho je dost možné, že váš systém už nabízí předpřipravené balíčky k nainstalování. V tom případě si ale zkontrolujte verzi. Výukové materiály vycházejí z verze 1.9.x provozované na Linuxu.

Po instalaci byste v příkazové řádce měli být schopni zobrazit verzi vaší Julia instalace:

$ julia --version
julia version 1.9.3

Po spuštění Julia v příkazové řádce vás přivítá Julia REPL (Read-Evaluate-Print Loop):

$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.8.0 (2022-08-17)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |

julia>

Nyní stručně shrneme základy práce s touto příkazovou řádkou.

REPL

Julia REPL spustíme z příkazové řádky příkazem julia a opustíme ho příkazem exit() nebo klávesovou zkratkou CTRL+D. REPL se hodí zejména při experimentování, správě balíčků a projektů, prohledávání lokální dokumentace, atd.

REPL nabízí doplňování příkazů pomocí klávesy TAB a prohledávatelnou historii dřívějších příkazů. V tomto textu probereme jen ty nejužitečnější aspekty, zevrubný popis všech REPL možností lze nalézt v dokumentaci.

REPL podporuje pět módů: Julia mód, Nápovědní mód, Shell mód, Pkg mód a Vyhledávací mód.

Julia mód (výchozí)

V tomto módu REPL jednoduše vyhodnocuje Julia výrazy. Příkazová řádka je uvozena textem julia>. Do tohoto módu se případně z jiných módů vrátíte stisknutím back space na začátku řádku.

V tomto módu můžeme jednoduše zadat Julia výraz a po stisknutí ENTER se tento vyhodnotí. Například:

julia> 1 + 1
2

Hodnota naposledy vyhodnoceného výrazu je uložena v proměnné ans, výpis výsledku lze potlačit pomocí středníku.

julia> 1 + 1;

julia> ans
2

Pozor, pokud jste s proměnnou ans v příkazové řádce již pracovali, tak je tímto přepsána!

Nápovědní mód (?)

Do tohoto módu se dostanete stiskem klávesy ? s kurzorem na začátku řádku. V tomto módu se julia> změní na help?>.

Po zadání výrazu a stisknutí klávesy ENTER se Julia pokusí nalézt dokumentaci odpovídající metody, typu, či makra.

Například:

help?> hcat
search: hcat hvcat MathConstants @threadcall

  hcat(A...)

  Concatenate along dimension 2.

  Examples
  ≡≡≡≡≡≡≡≡≡≡

  julia> a = [1; 2; 3; 4; 5]
  5-element Vector{Int64}:
   1
   2
   3
   4
   5

...

nebo

help?> UInt
search: UInt UInt8 UInt64 UInt32 UInt16 UInt128 Cuint

  UInt64 <: Unsigned

  64-bit unsigned integer type.

Pokud dotaz ohraničíme dvojitými uvozovkami (lze použít i regex literál), pak Julia prohledává i samotné dokumentační texty a vypíše kde se uvedený výraz vyskytuje:

help?> "unsigned"
Base.codepoint
Base.sum
Base.:>>>
Base.signed
Base.Culong
Base.unsigned
Base.cumsum
Base.Cuint
Base.Cushort
Base.Cuchar
Base.prod
Base.gcdx
Base.uabs
Base.Culonglong
Base.Filesystem.mkpath
Base.Filesystem.mkdir
Base.Ryu.pow5invsplit
Base.Ryu.pow5split
Base.Ryu.mulshift
Core.UInt16
Core.Unsigned
Core.UInt64
Core.UInt128
Core.UInt32
Core.UInt8
InteractiveUtils.subtypes

Shell mód (;)

Do tohoto módu se přepnete stiskem klávesy ; (středník) na začátku řádku. Příkazová řádka je v tomto módu uvozena textem shell>. Umožňuje vám přímo z REPL používat shell.

shell> uname
Linux

Pkg mód (])

Do tohoto módu se přepnete stiskem klávesy ] na začátku řádku. Příkazová řádka pak začíná textem tvaru (@v1.9) pkg>, kde v závorce je uvedeno, jaký projekt nebo Julia instalaci používáme.

V tomto módu můžeme spravovat nainstalované balíčky (aktualizovat, odebírat,…​) a zejména instalovat nové. Podrobněji se této funkcionalitě budeme věnovat v následující sekci.

Vyhledávací mód (CTRL+R a CTRL+S)

Posledním, ale užitečným, módem je vyhledávací mód. Nejde o vyhledávání v nápovědě, ale v použitých příkazech napříč různými módy.

V libovolném z uvedených módů můžete stisknout CTRL+R a vyhledávat v předchozích příkazech (klávesa R je zvolena pro reverse search). Opakovaným stiskem této klávesové zkratky se posunujete v historii do minulosti. Podobně, stiskem CTRL+S se posunujete v historii do přítomnosti.

Příkazy v historii lze také chronologicky procházet pomocí šipky nahoru/dolu.

Balíčkovací ekosystém

Julia je poměrně novým jazykem. I tak už ale existuje spousta balíčků rozšiřujících její možnosti. Samozřejmě, kvalita nemusí být ve všech případech zcela uspokojivá.

K vyhledávání mezi balíčky je asi nejlepší využít JuliaHub, který lze považovat za oficiální balíčkovací databázi, či rozcestník. V okamžiku prvního psaní tohoto textu (září 2021) JuliaHub nabízel 6323 balíčků. Při aktualizaci textu v září 2022 jich je v nabídce 8295. Při aktualizaci textu v září 2023 jich je v nabídce 10003. Některé balíčky jsou součástí základní instalace Julia, tvoří tzv. "standardní knihovnu". Aby uživatelé mohli balíčky sdílet a distribuovat, nemusí být nutně registrovány (k tomu slouží repozitář JuliaRegistries/General), ale lze poměrně snadno instalovat i balíčky umístěné v privátních repozitářích.

"Balíček" v Julia skutečně není nic jiného, než Git repozitář s předepsanou strukturou. Více se této problematice budeme věnovat později během semestru v k tomu určené lekci (Lekce 8).

Instalace balíčku

V první části tohoto kurzu si vystačíme s balíčky ze "standardní knihovny". Jeden z prvních balíčků, s kterým si ale budeme relativně brzy hrát je JuliaCI/BenchmarkTools.jl (repozitáře balíčků konvenčně mají koncovku .jl). Ukažme si jak tento balíček nainstalovat v rámci vaší lokální instalace Julia. V balíčkovacím módu provedeme následující inkantaci:

(@v1.9) pkg> add BenchmarkTools

Následuje kratší (či delší) popis instalace balíčku a jeho závislostí, případně jejich aktualizace.

   Resolving package versions...
   Installed BenchmarkTools ─ v1.3.2
    Updating `~/.julia/environments/v1.9/Project.toml`
  [6e4b80f9] + BenchmarkTools v1.3.2
    Updating `~/.julia/environments/v1.9/Manifest.toml`
  [6e4b80f9] + BenchmarkTools v1.3.2
  [9abbd945] + Profile
Precompiling project...
  1 dependency successfully precompiled in 1 seconds. 99 already precompiled.

Pokud vše proběhlo dobře, měli byste být schopni v REPL úspěšně reprodukovat následující dialog (reprodukce grafu zde v AsciiDocu není úplně dokonalá):

julia> using BenchmarkTools

julia> @benchmark sort(data) setup=(data=rand(10))
BenchmarkTools.Trial: 10000 samples with 976 evaluations.
 Range (min … max):  66.121 ns … 427.378 ns  ┊ GC (min … max): 0.00% … 72.98%
 Time  (median):     76.685 ns               ┊ GC (median):    0.00%
 Time  (mean ± σ):   79.102 ns ±  17.146 ns  ┊ GC (mean ± σ):  1.05% ±  4.39%

           █▄
  ▂▂▂▃▄▅▆▆▇██▇▇▆▅▄▃▂▂▂▂▂▂▂▂▂▂▁▁▂▁▂▁▁▁▁▁▁▂▂▁▁▂▁▁▁▂▁▁▂▂▂▂▂▂▂▂▂▂▂ ▃
  66.1 ns         Histogram: frequency by time          130 ns <

 Memory estimate: 160 bytes, allocs estimate: 1.

Aktualizace balíčků

Balíčky se samozřejmě vyvíjí. Je tedy záhodno svou lokální instalaci udržet aktuální. Toho lze v balíčkovacím módu dosáhnout příkazem

(@v1.9) pkg> update

Zkušeného uživatele ihned napadne, jestli takovouto aktualizací třeba nerozbijeme kód na kterém pracujeme. To by se mohlo stát. Proto Julia podporuje Projekty, které umožňují oddělit sadu balíčků, které daný projekt používá a třeba i zafixovat, nebo jinak omezit, verze používaných balíčků včetně hlídání závislostí.

Takovouto funkcionalitu asi znáte například z Ruby (bundler), JavaScriptu (yarn) nebo různých virtuálních prostředí Pythonu.

Projektům se budeme podrobněji věnovat později během semestru.

Notebooky, editory, IDE

Existuje hned několik způsobů jak s Julia pracovat. Nelze říci, že by jeden byl "správný". Vždy záleží na cíli, kterého se snažíme dosáhnout a pracovních návycích uživatele (workflow).

V tomto předmětu se nebudeme vyloženě snažit jeden ze způsobů vynucovat, například při řešení úloh. Většina materiálů ovšem bude ve formě notebooků, protože tyto se hodí nejvíce k prezentaci a v Course Pages je integrována jejich podpora.

Níže shrnujeme možnosti, z kterých si laskavý čtenář snad alespoň jednu vybere. V každém případě je dobré znát různé přístupy a chápat motivaci uživatelů, kteří je používají.

Minimalistický přístup

Na jednoduché experimentování, ale i seriózní práci s Julia, si lze vystačit s příkazovou řádkou. Julia REPL je velmi příjemný na práci a s moderním terminálem v něm lze i zobrazovat grafy. K editaci zdrojových kódů můžete použít například vim, který má podporu pro Julia ve formě JuliaEditorSupport/julia-vim V kombinaci s terminálovým multiplexorem, jako je např. tmux, lze vytvořit velmi mocné prostředí.

Nevýhodou této varianty je nemožnost práce s Jupyter notebooky (viz níže).

Jupyter notebook / JupyterLab

Jupyter notebook vznikl původně jako IPython notebook. Název "Jupyter" odkazuje na trojici programovacích jazyků Julia, Python a R, v jejichž komunitách nalezl původní IPython notebook asi největší uplatnění. Koncepčně jde o prostředí typu notebook, které se poprvé objevilo v prvních verzích Mathematica. Jupyter notebook je postavený na webových technologiích a "běží" ve vašem oblíbeném prohlížeči. Uživatel v jeho rámci pracuje s buňkami, které mohou nést různý obsah. Buňky obsahující kód lze vyhodnocovat a rovnou získat příslušný výstup. Jedná se tedy o jakýsi mix kódu, textových nebo obrázkových výstupů programu a komentářů.

Formát Jupyter notebooku je obyčejný JSON. Samotný Jupyter notebook je agnostický co se jazyka týče. Stačí, aby příslušný "jazyk" implementoval jádro, které si s Jupyterem povídá pomocí ZeroMQ zpráv a ihned můžete Jupyter notebooky použít. Seznam existujících kernelů je impozantní.

Důležité: JupyterLab

V tomto předmětu budu používat poslední "iteraci" rozhraní pro práci s notebooky: JupyterLab. I s obyčejným Jupyter notebookem by ovšem neměl být problém.

Pro zajímavost si později ukážeme "reaktivní" notebooky Pluto.jl.

Předností notebooků je samozřejmě jejich uzpůsobení k prezentaci. Tedy možnost popsat, jak se nějakého výsledku dosáhne a u toho i rovnou dané výsledky ukázat. Notebook v podstatě zaznamenává historii výpočtu, jeho filozofie má blízko k myšlenkám literárního programování.

Na druhou stranu se ale nehodí v situacích, kdy pracujete na větším (co se kódu týče) projektu. Jakmile obsah buněk přesáhne jistou hranici, už to není ono. V těchto případech je lepší kód standardně rozdělit do souborů v rámci notebooku pak třeba jen demonstrovat výslednou funkcionalitu a výsledky.

Varování:

Notebooky obsahující jednu jedinou buňku s kódem a nic jiného jsou zlo. To je zcela mimo filozofii notebooků (bohužel jsem takové na FITu už viděl).

Pokyny k instalaci JupyterLabu jsou uvedeny na instalační stránce. Jeden z možných instalačních postupů je uveden níže v dodatku. Na mém systému v tento okamžik běží JupyterLab ve verzi 4.0.6. Pokud se vám instalace podařila, pak JupyterLab spustíte příkazem

$ jupyter-lab

který by měl otevřít prohlížeč a zobrazit uvítací stránku JupyterLabu. Případně v terminálu najdete link kam nasměrovat svůj prohlížeč.

Aby JupyterLab mohl komunikovat s Julia, je ještě potřeba v Julia instalovat balíček IJulia, který poskytuje Julia jádro pro Jupyter. Tedy v Pkg módu (do něho se dostanete pomocí klávesy ]) zadejte

(@v1.9) pkg> add IJulia

Editory / IDE

Julia je programovací jazyk jako každý jiný a pro psaní kódu lze proto využít váš oblíbený editor.

Autor tohoto textu nejčastěji používá SublimeText. Doporučuji podívat se na Github organizaci JuliaEditorSupport, která sdružuje podporu pro různé editory na jednom místě.

Důležité: VSCode

Pokud bude během výuky potřeba opustit prostředí notebooku, nebo si nevystačíme s REPL, tak budu používat VSCode, pro který je k dispozici rozšíření.

Dříve se nejvíce tímto způsobem používalo Juno, což bylo rozšíření editoru Atom. V současnosti se ale už toto rozšíření ani editor nevyvíjí a někteří vývojáři tohoto rozšíření přesunuli svoji aktivitu právě pod zmíněné rozšíření VSCode.

Dodatek: Instalační poznámky

Instalace JupyterLabu v venv

Oficiální instalační návod JupyterLabu naleznete v dokumentaci. JupyterLab můžete ale snadno nainstalovat ve virtuálním prostředí a tím instalaci oddělit od systémového Pythonu.

Nyní opusťte Julia a pro jistotu zkontrolujte verzi Pythonu (3.7 a vyšší by měla být OK).

$ python --version
Python 3.11.5

Ve vámi zvoleném adresáři (např. s materiály předmětu) vytvořte virtuální prostředí pomocí modulu venv.

$ python -m venv __venv__

Aktivujte toto prostředí, všimněte si změny začátku příkazové řádky.

$ . __venv__/bin/activate
(__venv__) $

Nainstalujte JupyterLab pomocí pip.

$ pip install jupyterlab

Spusťte JupyterLab.

$ __venv__/bin/jupyter-lab

Před spuštěním JupyterLabu nezapomeňte nainstalovat IJulia balíček.

Poznámky k PC učebnám (Linux)

Varování:

Ve školních PC učebnách je domovský adresář na síťovém souborovém systému sdíleném s Windows, což má za následky problémy s Pythonem a Julia (pomalá odezva, problémy s právy souborů a s instalací balíčků).

Na PC v učebně lze bootovat do Ubuntu LTS (volba "Linux"). Zde je předinstalovaná Julia verze 1.9.3. Bohužel, adresář kam Julia instaluje balíčky se nachází ve složce ~/.julia a pokus o update balíčků, nebo instalaci nových, je extrémně pomalý, nebo i selže. Na vině je pravděpodobně síťový souborový systém, na kterém je domovský adresář.

Jednou relativně schůdnou cestou, jak tento problém obejít je přinutit Julia místo adresáře ~/.julia použít adresář /tmp/.julia. Toho lze docílit nastavením proměnné prostředí JULIA_DEPOT_PATH na hodnotu /tmp/.julia. Například přidáním

export JULIA_DEPOT_PATH="/tmp/.julia"

do .bashrc.

S tímto nastavením by měla aktualizace registrů a balíčků proběhnout hladce. Z příkazové řádky stačí rovnou vypálit

julia -e 'import Pkg; Pkg.update()'

Dále je potřeba nainstalovat balíček IJulia. Zde také dojde k drobné chybě, protože tato instalace v důsledku modifikuje konfiguraci Jupyter jader, která je ale opět uložena v problematickém domovském adresáři. Nejprve zahajte instalaci tohoto balíčku:

julia -e 'import Pkg; Pkg.add("IJulia")'

Ta pravděpodobně selže s chybovou hláškou ohledně problému přístupu k jistým souborům při kopírování do domovského adresáře. Překvapivě stačí upravit práva zdrojových souborů:

chmod ug+rw /tmp/julia/packages/IJulia/e8kqU/deps/* 1
  1. Zde pravděpodobně bude potřeba změnit řetězec e8kqU podle předchozí chybové hlášky.

Poté dokončíme instalaci balíčku příkazem

julia -e 'import Pkg; Pkg.build("IJulia")'

Dále stačí nainstalovat JupyterLab ve virtuálním prostředí umístěném v /tmp adresáři. Viz postup uvedený v předchozí sekci.