IT & Insight/IT News

"고"할 것인가 "파이썬"할 것인가, 비교 선택 가이드

더웨이 2019. 12. 11. 18:00

개발자를 위한 사용 편의성과 개발 속도 향상 측면에서 가장 뛰어난 두 가지 프로그래밍 언어는 파이썬(Python)과 고(Go)다. 현재 파이썬은 스크립팅, 데브옵스, 머신러닝, 테스트의 중심이며 고는 새롭게 부상하는 컨테이너 기반, 클라우드 네이티브 컴퓨팅의 동력이다.

파이썬과 고 사이의 선택이 명확한 경우도 있다. 풍부한 생태계라면 파이썬, 실행 속도를 본다면 고를 선택하면 된다. 그러나 선택 기준이 항상 명확하지는 않다. 이번 기사에서는 당면한 작업에 적합한 언어를 선택하는 데 도움이 되도록 두 가지 언어의 주요 차이점과 장단점을 살펴본다.

ⓒ Getty Images Bank 


개발자 편의성, 둘다 좋다 

파이썬과 고는 사용 편의성 측면에서 모두 평판이 좋다. 두 언어 모두 간소하고 직관적인 구문을 사용하며 기억하기 쉬운 적은 수의 기능을 갖고 있다.

또한 파이썬과 고 모두 편집-컴파일-실행(edit-compile-run) 주기가 짧다. 인터프리터 언어인 파이썬은 컴파일 단계가 없으므로 거의 즉각 스크립트가 실행된다. 고는 사전 컴파일되지만 컴파일 속도가 C++와 같은 언어보다 훨씬 더 빠르다. 고는 작업하다 보면 사전 컴파일 언어보다 스크립팅 언어에 더 가깝게 느껴진다.

파이썬은 동적 형식 지정(dynamic-typing) 기능을 사용하므로 신속한 애플리케이션 프로토타이핑에 용이하다. 선택 사항인 형식을 사용한 라벨링으로 부가적인 프로그램 정확성을 기할 수 있지만(대규모 프로젝트에 유용) 필수는 아니다. 규모가 비교적 큰 코드베이스는 형식이 없으면 다루기 어려워질 수 있다.

고의 경우, 형식 지정이 엄격하지만 대부분의 경우 바로 추론되므로 다루기가 덜 번거롭다. 또한 고 프로그래머는 형식 사용 전통에 따르기 때문에 대규모 코드베이스를 관리하기도 기본적으로 더 쉽다. 반면 고에는 제네릭스(Generics)가 없어 파이썬을 포함한 다른 언어로 더 간결하게 표현 가능한 코드가 장황하게 늘어질 수 있다.


런타임 속도, 고가 훨씬 빠르다 

고가 파이썬을 압도하는 한 가지 영역은 바로 실행 속도다. 개발자가 따로 최적화하지 않더라도 파이썬보다 훨씬 더 빠르다. 고는 네이티브 기계어 코드로 직접 컴파일되는 반면 파이썬의 런타임 역동성(dynamism)은 속도 위주로 최적화하기가 어렵다.

그렇다 해도 파이썬은 대부분의 일반적인 작업에서 “충분히 빠르므로” 원하는 사용 사례에 대해 파이썬 구현을 벤치마킹해보는 것이 좋다. 파이썬이 사용되는 가장 성능 집약적인 작업 중 상당수는 파이썬 자체가 아니라 C 또는 C++로 작성된 라이브러리를 통해 실행된다. 또한 기존 C파이썬 런타임을 대체하는 파이파이(PyPy) 런타임은 웹 서버와 같이 파이썬의 역동성이 광범위하게 사용되는 장기 실행 애플리케이션에서도 상당한 속도 향상을 제공할 수 있다.


배포, 고는 바로 배포 가능하나 파이썬은 런타임 필요 

고는 컴파일된 앱을 여러 플랫폼에 독립형 바이너리로 바로 배포할 수 있도록 하는 것을 목표로 설계됐다. 반면 파이썬은 스크립팅 언어로 설계됐으므로 파이썬 프로그램에는 파이썬 런타임이 필요하다.

파이썬에는 스크립트를 독립 실행 파일로 배포하기 위한 네이티브 솔루션이 없지만 파이인스톨러(PyInstaller)와 같은 서드파티 라이브러리를 사용하면 해결된다. 또한 도커와 같은 컨테이너 솔루션을 사용하면 파이썬 앱을 런타임과 함께 패키징하기가 조금 더 쉬워진다.


프로젝트 관리, 설계부터 반영된 고 

고의 설계에 처음부터 반영된 또 다른 보너스는 현대 소프트웨어 프로젝트 관리 기술이다. 신속한 명령줄 작업으로 새로운 고 프로젝트 리포지토리를 만들고 종속성을 관리할 수 있다. 고가 원래부터 종속성과 재생성 가능한 빌드를 충실히 지원한 것은 아니지만 고 1.11부터 도입된 모듈 시스템으로 이제 다양한 버전의 라이브러리를 다루기 위한 공통 메커니즘이 제공된다. 

파이썬에는 그 반대의 문제가 있다. 프로젝트 관리 및 버전 툴이 풍부한 만큼 당면한 작업을 위한 최선의 툴과 방법을 선택하는 과정이 혼란스러울 수 있다는 점이다. 긍정적인 측면은 특정한 방법으로 작업을 해야 한다는 제약이 없다는 것이다.
 

비동기 프로그래밍, 원래부터 지원한 고와 최근 지원 가능하게 된 파이썬  

비동기 작업(다른 작업이 완료되기를 기다리는 동안 작업 실행)은 네트워크 서비스와 같이 I/O에 구속되는 코드를 더 효율적으로 실행하는 데 도움이 된다.

고는 언어 구문 기능인 고루틴(goroutine)을 통해 처음부터 기본적으로 비동기를 지원했다. 고루틴은 네이티브 통신 프리미티브인 채널을 통해 다수의 작은 작업을 나란히 실행해서 동기화할 수 있도록 한다. 또한 고에는 이런 기능의 우발적인 오용을 줄이기 위한 툴도 포함돼 있다. 코드에서 교착 상태 또는 경합 조건은 여전히 발생할 수 있지만, 이러한 종류의 일반적인 실수는 대부분 손쉽게 포착할 수 있다.

파이썬은 최근 async/await 키워드를 통해 언어 수준의 비동기 작업을 지원하게 됐다. 그 전에도 파이썬에서 비동기 프로그래밍이 가능했는데, 다만 간단치 않았을 뿐이다. 이 말은 현대 파이썬 비동기 관용구(idiom)에 대한 라이브러리 지원이 아직 충분히 발전하지 않았음을 의미한다. 나중에 언어에 추가된 부분이기 때문이다. 그러나 비동기 호환 라이브러리가 늘어나고 비동기가 아닌 파이썬 버전이 지원 대상에서 제외되면서 비동기에 대한 지원이 개선되는 중이다.


오류 처리와 디버깅, 유연한 파이썬과 장황한 고 

파이썬과 고의 오류 처리 방식은 완전히 다르다.

파이썬에서 오류는 퍼스트 클래스 객체이며 앱이 예외를 던질 때마다 애플리케이션의 호출 체인 위로 전파된다. 이는 오류 처리를 옵션화하므로 프로그래머는 어떤 경우를 처리할지 결정하고 수동으로 처리해야 한다. 같은 이유로 파이썬의 방식은 각 호출 사이트를 어지럽히지 않는, 더 유연한 오류 처리 메커니즘을 만들 수 있게 해준다.

고의 경우 모든 함수가 함수 자체를 위한 값, 그리고 가능한 오류 객체를 반환한다. 고 프로그램에는 일반적으로 함수 호출 사이트에서의 가능한 오류 조건에 대해 명확한 주석이 있다. 이로 인해 발생하는 단점은 장황한 코드다. 고에는 프로그램을 완전히 망가뜨리는 극한 상황을 처리하기 위한 panic/recover 키워드도 있다. 물론 이 키워드는 파이썬의 예외만큼 빈번하게 사용되는 키워드는 아니다. 고 2.0에는 장황함을 줄이는 새로운 오류 처리 메커니즘이 도입될 수 있지만 2.0이 나오려면 아직 멀었다.


테스트, 둘다 네이티브 매커니즘 제공 

현대 소프트웨어 개발이 모두 단위 테스트와 통합 테스트를 활용하지는 않지만 활용하는 프로젝트는 그렇지 않은 경우보다 더 견고하다. 고와 파이썬 모두 단위 테스트를 위한 네이티브 메커니즘을 제공한다. 고에는 네이티브 testing 패키지, 파이썬에는 unittest 프레임워크가 있다.

고에는 testing의 일부로 테스트 커버리지 메트릭스가 포함된다. 파이썬에서는 테스트 모음의 철저한 정도를 결정하기 위해 써드 파티 패키지인 coverage가 필요하다. 반면 파이썬에는 역동성을 보완하는 매우 유연한 테스트 옵션이 내장돼 있다. 예를 들어 발생한 예외를 포함한 폭넓은 일반적 조건을 확인하기 위한 어서션(assertion)이 있다. 또한 파이썬은 클래스를 사용해서 테스트 코드와 애플리케이션 코드를 구분하는 반면 고는 함수와 파일 명명 규칙을 사용한다.


생태계, 머신러닝의 파이썬과 마이크로서비스의 고 

파이썬과 고에는 장기간에 걸쳐 각각의 사용 사례와 강점을 반영하는 많은 서드파티 소프트웨어의 라이브러리가 축적돼 있다.

파이썬은 오래 전부터 스크립팅 및 자동화, 웹 서비스 빌드, 복잡한 시스템 간의 사용하기 쉬운 인터페이스 구축 용도로 가장 많이 사용되는 언어다. 특히 마지막 범주는 파이썬이 데이터 과학과 머신러닝의 주도적 언어가 된 이유다. 파이썬은 첨단 데이터 분석과 머신러닝 모델에 사용되는 크고 복잡한 라이브러리와 워크플로우를 쉽게 상호 연결할 수 있게 해준다.

고의 성공 중심에는 비동기 프로그래밍 기능과 시스템 고유의 빠른 속도가 있다. 웹 서버, 네트워킹 애플리케이션, CPU에 구속되는 마이크로서비스, 시스템 유틸리티는 모두 고와 잘 맞는다. 도커와 쿠버네티스를 포함해 현대의 컨테이너 기반 애플리케이션 개발을 구동하는 소프트웨어의 대부분은 고로 작성됐다.

고와 파이썬을 두고 선택하는 방법 가운데 하나는 당면한 프로젝트와 비슷한, 고와 파이썬으로 작성된 기존 프로젝트를 살펴보는 것이다. 만들고자 하는 것을 다른 누군가가 이미 만들었을 가능성이 높으므로 언어뿐만 아니라 잘 맞는 지원 라이브러리도 찾을 수 있다.

마지막으로 파이썬과 고, 두 가지 모두로 작성하지 말라는 법은 없다. 애플리케이션의 성능에 민감한 부분에는 고를 사용하면서 개발자 편의성을 위해 파이썬 래퍼나 프론트엔드를 제공할 수 있다.