프로그래밍과 물리학
1. 프로그래밍의 필요성
20C는 물리학의 황금기였습니다. 이론이 예측한대로 실험이 증명해냈고 모든 이론은 딱딱 맞아떨어졌습니다. 이론물리학자는 종이와 연필만 있으면 모든 것을 만들어냈고 그 이론들은 아름다웠으며 의미있는 결과를 내보였습니다. 하지만 표준모형이 나온 이후로 물리학은 점점 발전속도가 더뎌지기 시작헀습니다. 이제 보일만한 입자는 모두 발견하였고 계산에 필요한 이론도 대강 다 갖춰졌기에 더 이상 할 것이라고는 그동안 안보였던 암흑물질이나 암흑에너지 쪽 밖에 없었습니다. 하지만 보이지도 않는 그것들은 어떻게 실험으로 입증할 방법이 없었습니다. 설령 있다한들 개인 단위의 연구자들은 비싼 가속기없이 실험을 수행할 수 없었습니다. 이의 대안으로 나온 것이 시뮬레이션, 결국 프로그래밍입니다.현재 이론물리학자들(특히 현상론자들)은 가속기를 직접 돌리지 않습니다. 물론, 이론을 입증하기 위해서는 여전히 실험에서 나온 결과를 이용해야합니다만, 이론의 Validity만을 보기 위해서는 굳이 실험이 필요없습니다. 이제 웬만한 가속기 시뮬레이션 프로그램들이 상용화 되었기 때문입니다. 대표적인 Event Generator로는 MadGraph, CalcHep 등이 존재하는데 마치 가속기처럼 모델을 주고 입자 빔의 세기를 주면 결과를 내뱉습니다. 이런 시뮬레이션 뿐만 아니라 입자물리의 계산이 상당히 복잡하기 때문에 계산 자체를 해주는 툴들도 많습니다. 특히 Mathematica 패키지의 하나인 Feynrules 등은 계산을 아주 쉽게 도와줍니다. 물론 자체적인 스킬은 조금 익혀야 하지만요. 이 뿐만 아니라 기본적으로 과학에는 계산과정이 따라 붙기때문에 Python이나 C/C++ 등은 점차 필수가 되어가고 있습니다. 더불어 프로그래밍 기술이 점차 발전함에 따라 더 편리하고 효율적인 계산을 위해 공부할 것도 많아지고 있죠. 결론적으로 지금은 이론물리일지라도 프로그래밍 기술을 익히지 않으면 분명 힘들어질 날이 올 것입니다.
2. 프로그래밍 언어 소개
그렇다면 어떤 프로그래밍 언어가 연구에 사용될까요? 물론 분야마다 다르지만 일단 여기서는 제가 몸 담고 있는 입자 이론물리 기준으로 설명하겠습니다. 입자 이론분야에서는 위에서 말했다시피 기본적으로 Symbolic Calculation이 상당히 중요하고 따라서 Mathematica를 거의 모든 사람이 기본적으로 사용하게 됩니다. 좀 많이 이론으로 치우친다면 심지어 다른 프로그래밍 언어는 몰라도 Mathematica만 알고 있으면 충분히 연구를 할 수 있습니다. 이제 좀 더 나아가 현상론 쪽을 보면, 현상론은 입자의 충돌 위주로 다루기 때문에 여러 계산 툴이 필요합니다. 가장 대표적인 것은 CERN에서 직접 만든 ROOT라는 C++ 패키지가 있습니다. 요즘은 Python이 강세라 Python 모듈도 만들어져 있습니다. 하지만 Advanced한 연산은 C++을 직접 다룰 줄 알아야 하기에 C++ 공부는 필수입니다. 다음으로 순전히 계산을 해야할 경우인데 이때는 과학 계산용 프로그램 전반을 쓸 수 있습니다. 가장 대표적인 것으로는 Python과 MATLAB이 있는데 MATLAB은 라이센스도 필요하고 행렬 연산을 제외하고는 느린 속도를 보여주기에 보통은 Python을 위주로 사용합니다. 하지만 Python 역시 느린 계산속도에서 해방될 수 없기에 보통은 C++ 반 Python 반 섞어서 하죠. 하지만 C++은 Master하기에 너무나 어려운 언어이고 매우 번거롭습니다. 따라서 요즘은 여러 대안들이 떠오르는 추세입니다. 간단히 몇 가지만 소개하겠습니다.1) Go
: 2009년 만들어진 언어로 구글의 의뢰를 받아 켄 톰슨, 롭 파이크, 로버트 그리즈머 등에 의해 만들어졌습니다. 2010년대 이후로 하드웨어는 비약적으로 발전하는데 프로그래밍 언어는 70년대의 C, 90년대의 Python 등 아주 오래된 것이 대부분이라 현대의 하드웨어에 맞게 병렬성과 높은 성능을 가지되, Python 처럼 문법이 간단하여 생산성을 높이는 언어가 필요해지기 시작했습니다. Go는 이러한 문제들을 해결하기 위하여 제작되었고 따라서 병렬 부문에서는 그 어떤 언어보다 쉽고 효율적입니다. 속도도 단순한 계산에서는 C에 근접할 정도이니 프로그래밍에 조금 관심이 있다면 해두시는 것도 나쁘지 않습니다. 다만, 계산과학용 라이브러리가 적거나 사용하기 힘들어 만일 계산을 위해서 이 언어를 사용하게 된다면 처음부터 끝까지 다 만들어야 되는 번거로움이 있습니다.
2) Julia
: 2012년에 MIT Julia 팀에서 개발된 언어입니다. 위에서 말했듯이 효율적으로 프로그래밍 하려면 C/C++로 계산부분을 짜고 Python으로 전체적인 틀을 잡는 등의 2가지 언어 이상을 사용해야 합니다. 이러한 문제를 Two Languages Problem이라 하는데 Julia는 이를 해결하기 위해 만들어진 언어입니다. C의 속도, Python과 MATLAB의 문법, R의 데이터 형식 등을 모두 하나에 녹여 넣은 이 언어는 목적 자체가 계산과학용입니다. 따라서 매우 빠른 계산속도를 자랑하며 내장 계산 모듈이 매우 풍부합니다. 문법도 상당히 쉬워 MATLAB이나 Python을 해본 사람이라면 아주 쉽게 접근할 수 있습니다. 단점이라면 아직 한글문서가 거의 없어 조금의 진입장벽이 있다는 것입니다. 만일 Python을 해보지 않았다면 접근하지 않는 것이 좋습니다.
3) Rust
: Go가 구글이 밀어주는 언어라면 Rust는 Mozilla가 밀어주는 언어입니다. 애플이 미는 Swift와 함께 최신언어 3대장 중 하나죠. Rust는 그 3개 언어 중에서도 성능이 압도적입니다. C/C++을 대체하고자 만들어진 이 언어는 Go가 그 목적과는 다르게 Python 유저들을 흡수하는 반면, 목적에 아주 잘 부합하게도 C++을 성공적으로 대체해나가고 있습니다. 최적화된 Rust 코드는 C++의 속도도 넘어서는 기염을 토해내는데, 상대적으로 C++보다 쉽고 간단한 코드로 이를 해낸다는 것이 중요한 점입니다. 또한, 소유권이라는 개념을 도입하여 Go나 Swift와 달리 Garbage Collector가 필요없으며 C, C++ 처럼 메모리 관리 문제로 골머리를 앓지 않아도 됩니다. 다만, 진입장벽이 꽤 높은 편이며 문서자체도 적어 내공이 적은 과학자들은 접근하기 힘듭니다.지
4) Scala
: Scala는 그 유명한 Apache Spark의 빌드 언어입니다. Java의 단점을 보완하고 JVM위에서 객체지향과 함수형 프로그래밍을 동시에 구현할 수 있는 고급언어이기도 합니다. 오히려 프로그래밍과 거리가 조금 먼 과학자들에게는 객체지향보다 함수형 프로그래밍이 좀 더 와닿을 수도 있을 것이며 좀 더 재미있는 프로그래밍을 할 수 있는 계기가 될 수도 있습니다. 성능은 Python보다 우위에 있지만 아무래도 가상머신 위에서 작동하다보니 C 같은 Native언어보다는 느립니다. 다만, 동적언어처럼 사용할 수 있는 여지가 많고 특히 병렬분산처리에 특화 되어 있어서 클러스터를 다루는 연구실에서는 익혀두면 상당히 유용하게 쓸 수 있습니다.
댓글
댓글 쓰기