on
Juila - Julia as a Second Language chapter 1
Chapter 1
Chapter 1에서는 줄리아가 어떤 언어인지, 왜 만들어졌는지, 줄리아 프로그래밍 언어를 사용하면 어떤 이점이 있는지 설명합니다.
1 Why Julia?
본 1장은 다음 내용을 중심으로 다룹니다.
-
Julia가 해결하는 문제 유형
-
빠르고 동적으로 입력되는 언어의 장점
-
줄리아가 프로그래머의 생산성을 높이는 방법
정리하면 다음과 같습니다.
-
Julia의 강점: 수백 가지 프로그래밍 언어 중 줄리아는 특히 과학 컴퓨팅, 데이터 과학, 기계 학습 분야에서 강점을 보임.
-
성능과 생산성: 줄리아는 빠른 속도와 동적(dynamic) 타이핑을 제공하여 적은 코드로 높은 성능의 시스템 구축 가능.
-
실용적 이점: 고성능과 낮은 메모리 요구사항으로 차세대 기후 모델과 같은 복잡한 시스템에 이상적.
-
사용의 한계: 기존에 잘 구축된 시스템, 커뮤니티, 패키지, 라이브러리 때문에 모두가 줄리아를 사용하지 않음.
-
Julia의 사용 영역: 줄리아는 모든 종류의 프로그래밍 작업에 사용될 수 있지만, 현재는 특정 분야에 더 집중되어 있음 –> scientific computing, data science, and machine learning.
-
줄리아의 강력한 기능은 장기적으로 더 넓은 영역에서 활용될 것으로 예상됨.
1.1 What is Julia?
저자는 Julia가 general-purpose, multi-platform programming language라고 소개합니다. 하지만, 위에서 Julia가 그렇게 훌륭하다면, 왜 아직도 사람들은 C언어와 Python 프로그래밍 언어를 사용하는 걸까? 라는 질문에 패키지, 커뮤니티, 라이브러리 등이 앞서 말한 언어들에 비해 Juila는 아직 부족하다는 의미로 해석됩니다.
왜 저자는 Julia를 general-purpose, multi-platform programming language라고 소개한 것일까요?
-
수치 해석 및 계산 과학에 적합: 줄리아는 MATLAB처럼 수치 프로그래밍에 특히 잘 맞음.
-
Dynamic Typing: 유연하게 다양한 유형의 데이터를 처리할 수 있음.
-
고성능 및 just-in-time(적시생산방식 컴파일: 실행 시점에 컴파일되어 높은 성능을 제공함 (주문이 들어오면 그때부터 생산을 시작하는 시스템).
-
자동 메모리 관리(garbage collection) 사용: garbage collection을 통해 메모리 관리를 자동화함.(쓰레기 수집은 동적 할당된 메모리 영역 가운데 더 이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다.)
-
composable: 객체 지향 및 함수형 프로그래밍 패턴을 쉽게 표현하여 코드 재사용을 용이하게 함. 참고자료
1.1.1 Pros and cons of statically and dynamically typed languages
일반적으로 프로그래밍 언어는 크게 두가지로 나뉩니다.
-
Dynamically typed (동적)
-
Statically typed (정적)
In static languages, expressions have types; in dynamic languages, values have types.
—Stefan Karpinski Julia Creator
-
정적 타이핑 언어의 특징: C/C++, C#, Java 등과 같은 정적 타이핑 언어는 프로그램이 실행되기 전에 모든 코드에 대한 타입 체크를 수행합니다. 이는 타입 오류를 미리 잡아내고, 보다 안정적인 코드 구조를 제공합니다.
-
동적 타이핑 언어의 특징: Python, Perl, Ruby 등과 같은 동적 타이핑 언어는 프로그램이 실행되는 동안 타입 체크를 수행합니다. 이는 유연성을 제공하지만, 성능 저하의 원인이 될 수 있습니다.
-
타입 관리 방식의 차이: 정적 언어에서는 표현식에 타입이 지정되며, 동적 언어에서는 값에 타입이 부여됩니다.
-
줄리아의 특이한 점: 줄리아는 동적 타이핑 언어이면서도 높은 성능을 제공합니다. 이는 일반적으로 상충되는 개념이지만, JIT(Just-In-Time) 컴파일과 다중 디스패치(multiple-dispatch) 기능 덕분에 가능합니다.
파이썬의 경우 인터프리터 방식을 통한 타입 검사와 동작을 모두 런타임에서 수행합니다. 다음은 파이썬의 add 함수의 예시입니다. 일일히 타입을 조건문을 통과하여 처리하기 때문에 수행 시간이 오래걸리게 됩니다.
def add(x, y):
if isinstance(x, int) and isinstance(y, int):
# 정수에 대한 처리
return x + y
elif isinstance(x, str) and isinstance(y, str):
# 문자열에 대한 처리
return x + y
# 기타 타입에 대한 처리
반면, Julia는 런타임에서 just-in-time 컴파일을 통해 코드내에서 호출되는 부분만을 컴파일하여 최적화된 기계어 코드로 변환되고, multiple-dispatch는 해당 함수가 호출될때 작동하여, 함수의 인자에 알맞은 메소드를 선택하여 작업을 수행하게 됩니다.
julia> f(2.0, 3)
ERROR: MethodError: no method matching f(::Float64, ::Int64)
Closest candidates are:
f(::Float64, !Matched::Float64)
@ Main none:1
Stacktrace:
[...]
julia> f(Float32(2.0), 3.0)
ERROR: MethodError: no method matching f(::Float32, ::Float64)
Closest candidates are:
f(!Matched::Float64, ::Float64)
@ Main none:1
Stacktrace:
[...]
따라서 한줄한줄 코드를 모두 읽어야 하는 파이썬 인터프리터와는 다르게 Julia의 JIT 컴파일과 multiple-dispatch는 보다 빠르게 작업을 수행할 수 있습니다.
- 컴파일 방식의 차이: C/C++와 Fortran은 AOT(Ahead-Of-Time) 컴파일을, Python과 Ruby는 인터프리터 방식을 사용합니다. 줄리아는 주로 JIT 컴파일을 위해 설계되었으나, 인터프리터를 통해서도 실행될 수 있습니다.
1.2 Julia combines elegance, productivity, and performance
-
Julia의 성능과 표현력: 필자는 Julia는 성능이 뛰어날 뿐만 아니라, 강력하고 사용하기 쉬운 언어로, 다양한 언어를 사용해 본 후에도 Julia만큼의 표현력과 간결함을 제공하는 언어를 찾기 어려웠다고 합니다..
-
효율적인 코드 작성: 필자는 Julia를 사용하여 다른 언어들보다 더 우아하고 간결하며 가독성 높은 코드를 작성할 수 있었다고 합니다. 예를 들어, 파일에서 빈 줄 제거, PNG 파일 필터링, 특정 숫자의 인덱스 찾기 등을 한 줄의 코드로 간단하게 수행할 수 있었습니다.
filter(!isempty, readlines(filename)) # strip out empty lines
filter(endswith(".png"), readdir()) # get PNG files
findall(==(4), [4, 8, 4, 2, 5, 1]) # find every index of the number 4
-
프로그래밍에 대한 열정 회복: 필자는 Julia가 프로그래밍에 대한 열정을 다시 찾게 해주었다고합니다. 프로그래밍 언어가 문제 해결의 장애물이 되는 대신, Julia는 팀의 일원처럼 작동하여 코드 작성을 용이하게 해주었습니다.
-
풍부한 표준 라이브러리와 패키지 관리자: Julia는 선형대수, 통계, HTTP, 문자열 처리, 다양한 날짜 포맷 작업 등을 할 수 있는 풍부한 표준 라이브러리를 제공합니다. 또한, 사용자가 필요한 기능이 표준 라이브러리에 없을 경우, 쉽게 제3자 라이브러리를 추가할 수 있는 통합 패키지 관리자가 있습니다.
-
학습의 용이성: Julia는 배우기 쉬운 언어로, 초보자가 복잡한 개념에 압도되지 않고 한 번에 하나의 개념을 집중해서 배울 수 있습니다. 다음은 “Hello world” 프로그램과 같은 간단한 예제입니다.
### julia
print("Hello world")
### java
public class Main {
public static void main(String[] args) {
System.out.print("hello world");
}
}
같은 “Hello World”를 출력하는 코드이지만, java에 비하여 julia는 매우 간단했습니다.
1.3 Why Julia was created
-
줄리아(Julia) 프로그래밍 언어는 ‘두 언어 문제(two-language problem)’를 해결하기 위해 만들어졌습니다.
-
데이터 분석, 머신러닝, 컴퓨터 사이언스 분야는 주로 동적 언어가 선호되어왔습니다.
-
그러나 이러한 언어는 일반적으로 충분한 성능을 제공하지 못한다고 합니다. 왜일까요?
-
왜 솔루션으로 종종 더 높은 성능의 정적 유형 언어로 다시 작성해야 한다고 제안하는 걸까요?
-
기존의 고성능 정적 타이핑 언어로 작성하지 않는 이유는 무엇일까요?
1.3.1 Scientists need the interactive programming that dynamically typed languages offer
-
고성능 언어의 사용: 과학자들은 Fortran, C, C++와 같은 고성능 언어로 대규모 날씨 시뮬레이션, 신경망을 제작했습니다.
-
언어의 단점: 이러한 언어들은 유연성이 부족하고, 장황하며, 표현력이 떨어져 프로그래머의 생산성을 저하시켰습니다..
-
인터랙티브 프로그래밍의 부족: Fortran, C, C++는 인터랙티브 프로그래밍에 적합하지 않습니다. 여기서 인터랙티브 프로그래밍은 즉시 피드백을 받는 능력을 의미합니다.
-
데이터 과학과 기계 학습의 중요성: 데이터 과학과 기계 학습에서 인터랙티브 프로그래밍은 중요하며, 개발자는 데이터를 로드하고 분석하고, 다음 단계로 넘어가야 합니다.
-
동적 타입 언어의 장점: 동적 타입 언어에서는 코드 변경 후 즉시 결과를 관찰할 수 있으며, 대규모 데이터를 다시 로드할 필요가 없습니다.
- 정적 타입 언어의 불편함: 정적 타입 언어에서는 다시 데이터를 로드해야 하기 때문에 분석에 시간이 소요되며, 컴파일과 데이터 로드가 반복됩니다.
- 분석 프로세스의 지연: 정적 타입 언어의 사용은 분석 프로세스를 느리게 하며, 비효율적인 반복 작업을 요구합니다.
1.3.2 Developers in other fields also need the interactivity a dynamically typed language offers
-
다양한 분야에서 동적 타이핑 언어의 중요성: 과학자뿐만 아니라 게임 개발자들도 동적 타이핑 언어의 인터랙티브한 특성이 필요합니다. 게임 엔진은 일반적으로 C나 C++와 같은 언어로 작성되며, 게임 플레이 개발에는 많은 실험과 반복이 필요합니다.
-
코드의 실시간 변경: 거의 모든 게임 엔진은 Lua, JavaScript, Python과 같은 두 번째 언어를 사용하여 코드를 실시간으로 변경할 수 있게 합니다. 이를 통해 게임 캐릭터와 맵의 코드를 재컴파일 없이 변경할 수 있습니다.
-
기계 학습 전문가들의 도전: 기계 학습 전문가들은 대량의 데이터를 이용하여 신경망과 같은 예측 모델을 개발하며, 이 과정에는 많은 실험이 필요합니다. 모델 수정 시마다 훈련 데이터를 다시 로드해야 한다면 개발 프로세스가 느려질 것입니다.
-
성능을 위한 언어 조합: Python, R, MATLAB과 같은 동적 타이핑 언어는 속도가 느린 단점이 있어, 종종 Fortran, C/C++와 같은 언어와 결합되어 사용됩니다. 예를 들어, TensorFlow나 PyTorch의 신경망은 C/C++로 작성된 구성 요소를 Python으로 조합하게됩니다..
-
기후 및 거시경제 모델의 개발 과정: 기후 및 거시경제 모델은 동적 언어로 개발되고 테스트된 후, 최종 모델은 고성능 언어로 다시 작성되는 경우가 많습니다. 이 과정은 개발 프로세스를 복잡하게 하고 비용을 증가시키는 원인이 됩니다.
1.4 Julia’s higher performance solves the two-language problem
- 두 언어 문제 해결: 줄리아는 동적 타이핑 언어의 유연성과 정적 타이핑 언어의 성능을 결합하여 ‘두 언어 문제’를 해결함.
Julia walks like Python, runs like C.
—Popular saying in Julia community
-
생산성 및 성능: 줄리아는 파이썬, 루비, R, MATLAB과 같은 언어로 작업할 때와 동일한 생산성을 제공하면서 C와 같은 고성능을 달성함.
-
실제 사례: 멜버른 대학교에서 R에서 줄리아로 전환하여 800배의 성능 향상을 경험함. 캘텍의 제인 헤리만은 파이썬 코드를 줄리아로 재작성하여 실행 속도가 10배 빨라짐.
You can do things in an hour that would otherwise take weeks or months.
—Michael Stumpf
-
포트란 기후 모델 예시: MIT의 연구팀이 포트란 기후 모델 일부를 줄리아로 재작성하여 예상치 못한 3배의 속도 향상을 달성함.
-
과학 컴퓨팅 혁명: 줄리아는 과학 컴퓨팅과 고성능 컴퓨팅 분야에서 혁명을 일으키고 있으며, 과학자들이 이전보다 훨씬 빠르게 작업할 수 있게 함.
1.5 Julia is for everyone
-
줄리아의 다양성: 필자는 줄리아는 과학자들만을 위한 언어가 아니라 모든 개발자를 위한 언어라고 주장합니다. 과학자들에게 유용한 특성들이 다른 분야의 개발자들에게도 탁월함을 제공기 떄문입니다.
-
코드 모듈화 및 재사용: 줄리아는 코드 모듈화와 재사용을 강화하는 강력한 기능을 제공합니다.
-
엄격한 타입 시스템: 실행 시 코드 내 버그를 잡아내는 데 도움이 되는 엄격한 타입 시스템을 갖추었습니다.
-
중복 코드 감소: 메타프로그래밍을 통해 반복적인 보일러플레이트 코드를 줄였습니다.
-
풍부한 타입 시스템: 다양한 문제를 모델링할 수 있는 풍부하고 유연한 타입 시스템을 제공합니다.
-
풍부한 표준 및 서드파티 라이브러리: 다양한 작업을 처리할 수 있는 잘 갖추어진 표준 라이브러리와 다양한 서드파티 라이브러리를 제공합니다.
-
우수한 문자열 처리 기능: 문자열 처리는 줄리아의 주요 매력 포인트 중 하나입니다.
-
다양한 언어 및 도구와의 쉬운 연동: 여러 프로그래밍 언어 및 도구와 쉽게 연동할 수 있습니다.
-
기존 코드와의 인터페이스 필요성: 기존 Fortran, C, C++ 코드와의 연동이 여전히 필요합니다. 이는 줄리아가 두 언어 문제를 해결하기 위한 것이지, 기존 솔루션을 모두 대체하는 것은 아니라고 주장합니다.
-
레거시 소프트웨어 전환의 장점: 장기적으로 기존 레거시 소프트웨어를 줄리아로 전환하는 것은 유리할 것이라고 주장합니다.
-
작은 라이브러리의 조합 강점: 줄리아는 작은 라이브러리를 쉽게 결합하여 다른 언어의 대규모 라이브러리와 동일한 기능을 제공할 수 있습니다.
-
기계 학습 라이브러리 예시: 줄리아에는 Knet, Flux, Mocha와 같은 작은 기계 학습 라이브러리가 있으며, 이들은 PyTorch 및 TensorFlow와 같은 큰 라이브러리의 기능을 작은 라이브러리들을 결합하여 구현할 수 있습니다.
-
소프트웨어 재사용의 이점: 작은 라이브러리를 사용함으로써, 개발자들은 기존의 소프트웨어를 새로운 방식으로 재사용할 수 있으며, 반복적으로 동일한 기능을 구현할 필요가 줄어드는 장점이 있습니다.
-
기능 중복 회피: TensorFlow와 PyTorch와 같은 라이브러리는 많은 중복 기능을 가지고 있지만, 줄리아는 많은 기능을 공유 라이브러리에 넣어 중복을 피할 수 있습니다.
1.6 What can I build with Julia?
- Julia를 사용하여 무엇이든 만들 수 있습니다. 하지만 모든 언어에는 패키지와 커뮤니티로 구성된 생태계가 있기 때문에 다른 언어보다 특정 유형의 개발을 선호할 수 있습니다. Julia도 마찬가지입니다.
1.6.1 Julia in the sciences
-
과학 분야에서의 줄리아 활용: 줄리아는 계산 생물학, 통계, 기계 학습, 영상 처리, 계산 미적분, 물리학 등 다양한 과학 분야에서 사용됨.
-
에너지 거래 및 경제 모델링: 에너지 거래와 복잡한 거시경제 모델을 구축하는 데 사용됨. 예를 들어, 미국 연방준비제도가 줄리아를 사용함.
-
양적 경제학 플랫폼 QuantEcon: 노벨상 수상자 토마스 J. 서전트가 창립한 QuantEcon이 줄리아와 파이썬을 사용하여 양적 경제학 교육을 진행함.
-
인공 지능 분야의 추천: 구글의 AI 연구원 피터 노빅은 기계 학습 분야가 줄리아로 전환하는 것이 큰 이점을 가져올 것이라고 표현함.
I would be happier if Julia were the main language for AI.
—Peter NorvigAuthor of Artificial Intelligence, A Modern Approach
-
생명 과학에서의 응용: 인간 게놈 데이터 처리 등 대규모 데이터 처리에 필요한 고성능 언어로 줄리아가 사용될 수 있음.
-
COVID-19 연구에의 활용: 줄리아 패키지 Pathogen은 전염병 모델링에 사용되며 COVID-19 연구에 활용됨.
1.6.2 Nonscience uses of Julia
줄리아를 반드시 과학적인 영역에만 사용해야 하는 것은 아닙니다. 다른 관심사를 위한 다양한 패키지도 있습니다.
-
Genie: 풀스택 MVC 웹 프레임워크
-
Blink: 줄리아에서 전자 GUI 앱을 만들기 위한 도구
-
GTK: 인기 있는 Linux GUI 툴킷 GTK를 사용하여 Julia GUI 애플리케이션 제작용
-
QML: Qt GUI 툴킷에 사용되는 QML 마크업 언어를 사용하여 크로스 플랫폼 GUI를 제작하는 방법
-
GameZero: 초보자 게임 개발용
-
Luxor: 벡터 이미지 그리기용
-
Miletus: 금융 계약서 작성용
-
TerminalMenus: 터미널에서 대화형 메뉴 허용용
-
Gumbo: HTML 페이지 구문 분석용
-
Cascadia: 웹 스크래핑을 위한 CSS 선택기 라이브러리로, 웹 페이지에서 유용한 정보를 추출합니다.
-
QRCode: 광고에 많이 사용되는 QR 코드 이미지를 생성하여 기계가 읽을 수 있는 URL을 표시하는 데 사용됩니다.
1.7 Where Julia is less ideal
-
제한된 라이브러리 선택: 역사가 짧은 언어로서, 줄리아는 모든 분야에서 동일하게 포괄적인 라이브러리 선택을 제공하지 못합니다. 특히 웹 개발을 위한 패키지 선택이 제한적입니다.
-
모바일 애플리케이션 개발에 부적합: 줄리아는 모바일 애플리케이션 구축에 적합하지 않습니다.
-
짧은 스크립트 실행에 불리: 줄리아는 Bash, Python, Ruby에서 자주 작성하는 작고 단기 실행 스크립트에는 적합하지 않습니다. 이는 JIT 컴파일 방식 때문입니다. –> 이를 해결할 수 있는 방법은 무수히 많습니다. 해결 방법에는 이전 JIT 컴파일의 캐싱을 개선하는 것부터 JIT 컴파일 시점을 보다 선택적으로 지정하는 것까지 다양합니다.
-
JIT 컴파일의 영향: 줄리아 프로그램은 Python이나 Bash 프로그램보다 시작이 느리지만, JIT 컴파일러가 코드의 핵심 부분을 머신 코드로 변환하면 훨씬 빨라지게 됩니다.
-
실시간 시스템에 부적합: garbage-collection을 사용하는 언어로서, 메모리 재활용 과정에서 무작위 지연과 중단이 발생할 수 있어 실시간 시스템에는 적합하지 않습니다.
-
임베디드 시스템에 부적합: 메모리가 제한된 임베디드 시스템에는 적합하지 않으며, 같은 코드의 고도로 전문화된 버전을 생성하여 메모리 사용량이 높아집니다..
-
시스템 프로그래밍에 부적합: 데이터베이스 시스템이나 운영 체제 커널과 같은 전형적인 시스템 프로그래밍에는 적합하지 않습니다. 자원 사용의 세부적인 제어가 필요한 작업에는 줄리아가 제공하지 않습니다.
-
고수준 언어의 특성: 사용의 용이성에 초점을 맞춘 고수준 언어로, 자원 사용에 대한 많은 세부 사항이 추상화되어 있습니다.
1.8 What you will learn in this book
-
인터랙티브 프로그래밍과 REPL: 줄리아의 read-evaluate-print loop(REPL)을 사용한 인터랙티브 프로그래밍에 중점을 둠.
-
과학 및 수학 지향적 코드 예시: 데이터 과학, 기계 학습, 수학 및 과학 분야에서 많이 사용되는 줄리아의 과학 및 수학 지향적 예시들을 제공함.
-
줄리아의 멀티플 디스패치와 타입 시스템: 줄리아의 독특한 멀티플 디스패치 기능과 타입 시스템에 대한 심층적인 내용을 다룸.
-
함수형 프로그래밍과 객체지향 프로그래밍 비교: 객체지향 프로그래밍 언어에 익숙한 독자들을 위해 함수형 프로그래밍 스타일과의 비교를 제공함.
-
패키지 중심의 개발: 줄리아 커뮤니티는 독립 실행형 애플리케이션보다는 패키지 중심의 개발을 장려함. 이는 책 전반에 걸쳐 반영됨.
-
도구 및 패키지 관리자 사용법: 줄리아의 패키지 관리자와 디버거는 셸에서가 아닌 줄리아 인터랙티브 환경 내에서 특정 패키지를 로드하여 사용함.
-
통계학자, 과학자, 데이터 분석가의 사용법: 이들은 줄리아 환경에서 선호하는 패키지를 로드하고 줄리아 명령어를 실행하여 작업을 진행함.
-
줄리아 REPL의 중요성: 줄리아 REPL은 대부분의 줄리아 작업 흐름에서 중요한 부분을 차지함.
Summary
-
정적 타이핑을 사용하면 고성능 프로그래밍 언어를 더 쉽게 구성하고 프로그램이 실행되기 전에 입력 실수를 잡아낼 수 있습니다.
-
동적 타이핑을 사용하면 고도의 대화형 프로그래밍 언어를 만들 수 있습니다. 빠른 반복이 필요한 프로그래밍의 경우 이점이 있습니다.
-
과학 코드를 개발하려면 대규모 데이터 세트를 쉽게 실험할 수 있는 기능이 필요한 경우가 많습니다. 이를 위해서는 동적 타입 언어가 제공하는 대화형 프로그래밍이 필요합니다.
-
과학 코드에는 동적 유형 언어가 일반적으로 제공할 수 없는 고성능이 필요한 경우가 많습니다.
-
줄리아는 고성능 동적 타이핑 언어를 제공함으로써 두 가지 언어 문제를 해결할 수 있습니다. 이러한 기능 덕분에 기후 모델링, 천문학, 거시 경제 시뮬레이션과 같이 성능이 요구되는 분야에서 줄리아를 채택하고 있습니다.
-
Julia는 과학 분야에만 국한되지 않고 범용 프로그래밍 언어로도 훌륭합니다.