Julia + VS Code

computer-tool
coding
Julia를 빠르게 찍먹해보자
Author

JS HUHH

Published

August 15, 2023

TL; DR

Julia를 빠르게 세팅하는 방법 (Windows/Macos)

넋두리

생성 AI 덕분에 프로그래밍 언어가 필요없어진 시대라지만 이럴 수록 취미 삼아(?) 프로그래밍 언어를 배우기 좋은 시절이 아닐까? 평소 가장 뛰어난 high-level 컴퓨터 언어라고 생각해온 Julia를 윈도와 Macos에서 빠르게 설치하고, VS Code에서 Jupyter를 통해 활용하고, 줄리아의 편리한 패키지 관리 방법을 간단히 소개한다.

역시 이 포스팅은 이 내용을 곧 망각할 멀지 않은 미래의 ’나 놈’을 위한 것이다!

설치

설치는 아래 공식 사이트에서 OS별로 다운로드 받아서 설치하면 된다.

https://julialang.org/

조금 특이하게 하고 싶다면, 윈도의 경우는 winget을 맥의 경우에는 brew를 쓰면 되겠다.

> winget install --id=Julialang.Julia  -e # For Windows PowerShell
> brew install julia # For Macos 

특이하긴 하지만 이 방법을 권한다. winget이든 brew든 OS 별로 앱을 일관된 방식으로 활용하고 관리할 수 있다.

REPL 설정

REPL이란 Read-Evaluate-Print Loop를 의미한다. 인간이 입력한 내용을 기계가 읽고 처리하고 이를 인쇄하는 한번의 순환을 의미하는데, 그냥 프로그래밍 언어와 인간이 소통하기 위한 터미널 형태의 인터페이스라고 퉁치고 넘어가자.

Macos에서는 별다른 작업 없이 설치 후 터미널 리부팅 후 바로 사용할 수 있다.

For Windows

윈도에서는 앱 설치 후 파워셸 등의 터미널에서 자동으로 인식이 되지 않는다. 범용 앱의 경우 대체로 별도의 전용 REPL을 제공하고 있지만 터미널 안에서 함께 쓰는 게 여러모로 편하다. 이를 구현하기 위해서 Julia 실행 파일의 경로를 지정해주면 된다.

Julia를 포함해 git 등의 범용 앱이 호환성을 위해서 별도의 터미널 앱을 제공한다. 사용자가 어떤 환경에서 쓸지 모르기 때문에 제공하는 편이물인 셈이다. 윈도우11+윈도터미널의 환경이라면 그냥 함께 쓰는 것이 제일 편하다. 이 경우 해당 앱의 실행 파일의 위치를 경로로 잡아주면 터미널 내에서 쉽게 쓸 수 있다. 경로로 잡는다는 것은 해당 실행 파일의 실행이 터미널에서 이루어질 수 있도록 만드는 조치로 이해하면 되겠다.

그런데 줄리아 설치시 실행 파일의 경로에 버전이 따라 붙는다. 버전이 바뀔 때마다 경로(path)를 다시 지정해주어야 하는 불편함이 있다.

경로 설정이 익숙하지 않다면, 여기를 참고하여 julia 관련 실행 파일이 담긴 폴더의 주소를 경로로 지정하면 된다. 이후 셸을 리부팅하면 기본 셸에서 사용할 수 있다.

VS Code

VS Code는 줄리아용 익스텐션을 제공하고 있다. 다만 이 익스텐션 대신 익숙한 Jupyter를 쓸 수도 있다. 사실 Jupyter가 더 편하다. Jupyter를 쓸 때는 실행 커널로 Julia를 선택하면 끝이다.

OS 문제

VS Code에서 줄리아를 쓸 때 한 가지 큰 단점이 있다. OS별로 경로 설정을 구분해서 지정할 수 없다. VS Code에서 줄리아 커널을 인식시키기 위해서는 줄리아 실행 파일의 경로 지정이 필요한데, 이 경로가 당연히 OS 별로 다르다.

VS Code의 환경을 동기화해 놓고 윈도우와 맥OS를 번갈아 가며 쓴다면, OS를 바꿀 때마다 줄리아의 실행 경로를 찾지 못했다는 메시지를 보게 될 것이다. OS를 변경할 때마다 매번 경로를 지정해야 하는 불편을 감수해야 할까?

역시 익스텐션으로 해결하자

다행히 플랫폼 별 설정 관리를 제어하는 VS Code 확장이 있다. 이 녀석을 부리도록 하자. VS Code의 정식 기능으로 넣어도 좋을 듯 싶다.

VS Code Extensions: Platform Settings

해당 패키지를 설치하고, settings.json을 수정하면 된다. 아래의 내용을 넣어주자.

settings.json을 어떻게 띄워야 할지 모르겠다면 다음과 같이 해보자. 왼쪽 하단의 톱니 클릭 → 설정 → 찾기 창에 “julia” 아래 적당한 항목에서 settings.json애서 편집 선택

"platformSettings.platforms": {
  "win32": {
    "julia.executablePath": "C:/Users/사용자-계정-이름/AppData/Local/Programs/Julia-1.9.2/bin/julia.exe"
  },
  "darwin": {
    "julia.executablePath": "/opt/homebrew/bin/julia"
  }
  • 위 코드에서 구체적인 경로를 각자의 환경에 맞게 바꿔야 한다.

Julia의 패키지 관리

줄리아의 패키지 관리는 정말 간단하다. Python의 다양하고 혼란스러운 방법과 비교하면, 간단해서 당황스러울 정도이다.

전체적인 패키지 운용 방식은 최근 각광받은 Python의 Poetry 그리고 이 블로그에서 소개한 Rye와 유사하다. 다만 실행을 위한 버전 별 바이너리와 버전 별 패키지를 각 프로젝트 별로 따로 설치하지 않는다는 점에서 파이썬 가상 환경에 비해 낭비가 덜한 형태이다.

프로젝트 개시

https://pkgdocs.julialang.org/v1/environments/

REPL 창에서 ]을 입력하면 패키지(Pkg) REPL로 진입한다. 줄리아는 자체적인 인터페이스를 통해 별도로 패키지 관리할 수 있다. 만일 다시 줄리아 REPL로 가고 싶으면 백스페이스를 누르자.

줄리아 REPL 안에서도 명령을 통해서도 패키지를 관리할 수 있다. 다만, 별도의 Pkg REPL에서 관리하는 게 편한 경우가 있으니 적극적으로 활용하도록 하자.

Pkg REPL에서 여러가지를 할 수 있지만 여기서는 프로젝트를 시작하는 방법 정도만 알아보자. 아래 보는 것은 tutorial이라는 이름의 프로젝트 개시를 예시한 것이다. 해당 폴더가 하위 폴더에 있다면 그 안에 프로젝트가 생성된다.

(@v1.8) pkg> activate tutorial
  [ Info: activating new environment at `~/tutorial/Project.toml`.

최초로 패키지 모드에 진입하면 위와 유사한 터미널 창을 보게 된다. (@v1.8) 현재 Pkg REPL이 바라보고 있는 환경을 의미한다. 이는 디폴트 환경으로 해당 환경은 \Users\{PC-아이디}\.julia\ 혹은 이와 유사한 줄리아 디폴트 공유 환경을 바라보게 된다.

Julia REPL에서 해당 폴더로 이동하고 싶다면,

julia> cd("C:\\가고싶은-폴더") # 윈도우에서 
julia> cd("C:\가고싶은-폴더") # Macos, Ubuntu 

해당 폴더 안에서 환경을 액티베이트하고 싶다면,

(@v1.8) pkg> activate .
Activating project at `D:\GitHub\{프로젝트-폴더}`
(프로젝트-폴더) pkg> st
Status `C:\프로젝트-폴더\Project.toml`
...

위에 보는 것처럼 줄리아가 프로젝트-폴더를 환경으로 바라보고 있다는 점을 잘 알 수 있다. 프로젝트의 개시와 함께 해당 폴더에 Manifest.toml, Project.toml이 생성된다. 두 파일에 용도에 대해서는 상세하게 다루지는 않겠다. Manifest.toml는 해당 폴더의 프로젝트를 진행하기 위한 패키지의 세목(버전, 의존성 등)이 담겨 있다. Project.toml은 프로젝트의 메타 데이터를 담고 있다. 자세한 내용은 아래 링크를 참고하자.

https://pkgdocs.julialang.org/v1/toml-files/

가져온 환경 활성화

내가 생성한 환경 뿐 아니라 다른 사람이 만들어둔 환경을 가져와서 해당 환경과 동일한 환경을 구축할 수 있다. 상세한 내용은 아래 링크를 참고하자. 특히 다른 실행 환경을 가져와 그대로 재현할 수 있는 대목은 Julia 가상 환경의 큰 장점 중 하나이다.

https://pkgdocs.julialang.org/v1/environments/

가져온 환경을 어떻게 활성화하는지 간락하게 알아보자. 먼저 필요한 환경을 가져온다.

shell> git clone https://github.com/JuliaLang/Example.jl.git
Cloning into 'Example.jl'...

줄리아 패키지 모드에서 해당 환경을 활성화하자. 해당 폴더에 들어가서 활성화하면 편하다.

(@v1.8) pkg> activate .
Activating project at `~/Example.jl`

다음으로 패키지 모드에서 환경을 활성화한다.

(Example) pkg> instantiate
  No Changes to `~/Example.jl/Project.toml`
  No Changes to `~/Example.jl/Manifest.toml`

github를 통해 .gitignore를 설정하면 manifest.toml이 제외되도록 설정되어 있다. 따라서 일반적으로 github의 리포를 클론해왔다면 별도의 패키지 설치 과정을 거쳐야 할 수 있다. 패키지 REPL에서 add 명령어를 활용하면 된다.

환경 관련 패키지 제거

먼저 project.toml을 열어보자. 아래 예시는 Example이라는 환경에 ThinkJulia라는 패키지 셋을 설치한 상황을 가정한 것이다. 패키지 설치 방법은 아래와 같다.

이 패키지는 “Think Julia” 책을 위해 제작된 패키지다. 자세한 것은 여기를 참고하라.

(Example) pkg> add https://github.com/BenLauwens/ThinkJulia.jl

이제 패키지 설치가 끝난 이후 Project.toml을 열어보면 아래와 같다.

name = "Example"
uuid = "7876af07-****-****-ab0e-********"
version = "0.5.4"

[deps]
ThinkJulia = "a7f2b756-****-4c7f-****-*********"

[compat]
julia = "1"

[extras]
Test = "*******-e22c-****-****-65c5234f0b40"

[targets]
test = ["Test"]

[deps] 항목에 환경이 의존하는 패키지 ThinkJulia가 기록되어 있다.

(Example) pkg> rm ThinkJulia

위 명령을 통해 환경과 관련된 항목들이 제거된다. 가끔 gc 명령의 실행이 필요할 수 있다. REPL에 출력된 내용을 참고하자. 제거한 후 Project.toml을 확인해보면 [deps] 항목이 제거되었음을 알 수 있다. 이렇듯 Project.tomlManifest.toml은 환경에 발생하는 패키지 및 바이너리의 변화를 알아서 기록하고 추적한다. 이 얼마나 편리한가!