글을 시작하기에 앞서 해당 시리즈는 Allen Downey, Ben Lauwens의 저서인 Think Julia: How to Think Like a Computer Scientist를 바탕으로 작성된 글임을 알려드립니다.
이 포스트는 Why Julia?를 한글로 요약 정리한 글입니다.
introduction
Julia(이하 줄리아)는 2012년에 개발되었으며, 무료로 사용할 수 있는 오픈소스 프로그래밍 언어 중 하나이다. 사실 프로그래밍 언어를 선택하는 것은 부차적인 문제지만, 이 언어는 선택할만한 가치가 있다. 다음으로 해당 언어의 장점에 대해서 알아보자.
- 줄리아는 높은 성능을 위해 개발된 프로그래밍 언어이다.
- 줄리아는 다른 데이터 타입에 대한 함수나 메서드도 동적으로 사용 가능한 다중 디스패치(multiple dispatch)를 사용한다.
(다중 디스패치는 이후 17장에서 자세히 다룰 예정입니다.) - 줄리아는 상호작용하기 쉬운 동적 타입의 언어이다.
- 줄리아는 배우기 쉬운 수준의 문법을 가진다.
- 줄리아는 데이터 타입이 정의된 언어(typed programming language)이기 때문에, 사용자의 코드를 더욱 깔끔하고 견고하게 만들어준다.
- 줄리아는 확장된 표준 라이브러리들이 있으며, 수많은 다른 패키지들도 사용할 수 있다.
특히 줄리아는 “두 개의 언어 문제(two language problem)”를 해결하기 때문에 매우 독특한 프로그래밍 언어이다.
두 개의 언어 문제란? R과 Python과 같은 고수준 언어들은 성능(속도 등)이 떨어지기 때문에, 결국 실용화하기 위에서는 C나 C++로 다시 코드를 작성해야 하는 문제를 말한다.
줄리아는 고성능 코드를 작성하기 위해서 다른 프로그래밍 언어가 필요하지 않다. 즉, 줄리아는 병목현상을 자동으로 최적화해줌으로써 프로그래머들의 어려움을 덜어준다.
프로그램의 방식
이 책은 독자들이 ‘컴퓨터 사이언티스트’처럼 생각할 수 있도록 안내한다. 그들처럼 생각하는 방식은 수학, 공학, 자연과학 등의 특징들을 결합하는 것이다. 구체적인 방식을 확인해보자. 먼저 컴퓨터 사이언티스트들은 수학자처럼 공식을 사용하여 아이디어(구체적인 계산들)를 표현한다. 그 이후 엔지니어와 마찬가지로 필요한 부품을 시스템에 조립하고 여러 대안들의 장단점을 평가하여 해당 아이디어를 설계한다. 마지막으로 과학자처럼 그들은 복잡한 시스템들의 작동을 관찰하고, 가설을 형성하며 검증한다.
컴퓨터 사이언티스트에게 가장 중요한 능력은 바로 “문제해결(problem solving)” 이다. 문제해결이란 문제를 형식화하고 창의적으로 생각하여 문제에 대한 정확하고 명확한 해결방안을 표현할 수 있는 능력을 말한다. 결론적으로 프로그램을 배우는 과정은 문제해결기술을 연습하는 데 매우 훌륭한 기회라는 것이다. 이것이 이번 챕터의 제목을 “프로그램의 방식”이라고 정한 이유이다.
프로그램이란
프로그램은 계산을 수행하는 방법을 구체화하는 연속적인 명령이다. 계산은 방정식을 풀거나 다항식의 근을 찾는 것과 같이 수학적인 의미도 있지만, 동시에 문서에서 텍스트를 검색하거나 이미지 처리와 같은 상징적인 의미도 가지고 있다. 명령문 코드의 세부적인 요소들은 언어마다 다르지만, 몇 개의 기본 명령은 모든 언어에서 똑같이 나타난다.
- Input : 파일이나 인터넷, 다른 디바이스 등에서 데이터를 가져오는 것
- Output: 데이터를 스크린에 띄우거나 파일을 저장하는 것, 네트워크를 통해 보내는 것 등을 의미
- Math: 덧셈이나 곱셈처럼 기본적인 수학 작동들을 수행하는 것.
- Conditional execution: 특정 환경들을 확인하고 알맞은 코드를 적용하는 것.
- Repetition: 약간의 변화를 주고 작업을 반복하는 것
믿거나 말거나 이것이 프로그램의 거의 전부이다. 당신이 사용해왔던 모든 프로그램은 얼마나 복잡한지와는 상관없이 위와 같은 명령들로 만들어졌다.
따라서 프로그래밍은 크고 복잡한 기본 명령들을 충분히 수행될 할 수 있을만한 하위 작업들로 나누어 가는 과정으로 생각할 수 있다.
줄리아 시작하기
줄리아를 배우기 전에, 먼저 해당 소프트웨어를 설치해야 한다. 만약 당신이 컴퓨터의 OS체제를 알고 있다면, 홈페이지에 들어가 알맞은 소프트웨어를 다운로드 받으면 된다.
Julia의 REPL(Read-Eval-Print-Loop)는 Julia 코드를 읽고 실행하는 프로그램이다. 해당 창에 Enter키를 입력하면 아래와 같은 그림이 나타난다.
해당 그림의 마지막 줄에 있는 Julia>
는 명령을 입력하는 프롬프트(prompt)이며, 이곳에 코드를 입력하면 결괏값(Output)을 받을 수 있다.
첫 번째 프로그램
첫 번째 프로그램으로 우리가 작성할 코드는 “Hello, World!” 이다. 코드는 아래 그림과 같다.
1 | julia> println("Hello, World!") |
위 그림은 print
코드의 예시이다. 여기서 print
코드는 종이에 글씨를 복사하는 것이 아니라, 단지 입력한 코드에 대한 결괏값을 스크린에 보여주는 것을 의미한다. 인용구 기호(“”)는 글자의 시작과 끝에 사용하며, 결괏값에는 나타나지 않는다. 또한 괄호는 println
이 함수라는 것을 알려준다. 함수에 대해서는 3장에서 배울 것이다.
산술 연산자
“Hello, world!” 다음으로는 사칙연산이다. 줄리아는 덧셈이나 곱셈과 같은 기본적인 연산자들을 제공한다. 연산자 기호들은 +
는 덧셈, -
는 뺄셈, *
는 곱셈, /
는 나눗셈이다. 해당 기호들을 사용한 예시는 아래의 그림과 같다.
1 | julia> 40+2 |
위의 계산식에서 유일하게 나눗셈만 답이 소수점으로 나오는데, 그 이유는 바로 다음 글인 데이터 타입에서 설명할 것이다.
마지막으로 연산자 ^
는 거듭제곱에 대한 기호이다. 즉, 앞의 수를 뒤의 수만큼 제곱하는 것이다.
1 | julia> 6^2+6 |
값 그리고 데이터 타입들
값(value)은 프로그램이 일할 때 사용하는 가장 기본적인 문자나 숫자를 말한다. 예로 우리가 이미 본 “Hello, World!”나 42.0, 2 등이 있다.
위에서 제시한 3개의 값은 모두 다른 데이터 타입을 가지고 있다. 각각의 데이터 타입을 살펴보면2는 정수(integer)이며, 42.0은 소수(floating-point number), “Hello, World!”는 문자(string)이다. 위의 데이터 타입을 영어로 기재한 이유는 코드에서 영어의 축약으로 사용되기에 영어로 알아두는 것이 더 편리하기 때문이다.
만약에 해당 값이 어떤 데이터 타입인지 모르겠다면, REPL에 아래의 코드를 입력해보자.
1 | julia> typeof(2) |
정수는 int64
로 표시되며, 소수는 float64
로 표현된다. 또한 문자의 경우는string
로 표시된다.
그렇다면 값 “2”나 “42.0” 의 데이터 타입은 어떨까? 두 값은 숫자처럼 보이지만 인용구를 사용했기 때문에 문자로 인식된다.
1 | julia> typeof("2") |
큰 정수를 값으로 사용할 때 자연스럽게 1,000,000와 같이 콤마를 넣어 수를 사용한다면, 줄리아에서는 이를 정수로 인식하지 못한다. 줄리아는 콤마를 연속된 정수들을 분리하는 기호로서 인식한다. 그렇기 때문에 만약 위와 같은 효과를 주고 싶다면 1_000_000 와 같이 언더바를 사용해야 한다.
1 | julia> 1,000,000 |
형식 언어와 자연어
자연어는 영어, 스페인어, 한국어와 같이 사람들이 사용하는 언어를 말한다. 이런 언어들은 특정 사람들로부터 인위적으로 발명된 것이 아니라 자연스럽게 진화된 형태이다.
형식 언어는 특정 필요에 의해서 사람들이 고안한 언어들을 의미한다. 예를 들어, 수학자들이 사용하는 표기법은 숫자와 기호 사이의 관계를 나타내는 데 적합한 형식 언어이며, 화학자들은 형식 언어를 사용하여 분자의 화학구조를 나타낸다. 이와 같이 프로그래밍 언어 또한 계산을 표현하도록 설계된 형식 언어이다.
형식 언어는 엄격한 문법을 가진다. 예를 들어서 3+3=6은 올바른 구문이지만, 3+=3$6은 올바르지 않다. 또한
문법은 크게 토큰과 구조로 구성되어 있는데, 토큰은 단어나 숫자, 화학 원소와 같은 언어의 기본 요소이며 구조는 토큰 간의 올바른 연결이 전제된 문장을 의미한다.
즉, 올바른 문법을 사용했는지 확인하려면,
적절한 토큰을 사용하였는가?
올바른 연결로 적절한 구조를 설정였는가?
위의 두 질문을 잊지 말자.
디버깅
프로그래머들은 실수를 하며, 각가지의 이유로 인해 버그(bug)라고 불리는 프로그래밍 에러가 발생한다. 이런 버그들을 추적하는 과정을 디버깅이라고 한다.
디버깅을 할 때 어려운 버그를 만난다면, 컴퓨터에 대한 분노로 인해 개발자를 그만두고 싶을 수 있다. 하지만 디버깅을 배우는 것은 어렵지만 프로그래밍 이외의 많은 활동에도 유용한 기술이기에 포기하지 않기를 바란다.