C++을 배워야하는 이유

아랫 글은 Youtube 채널 The Cherno의 “Welcome to C++”를 번역하고, 부분부분 저의 의견을 넣었습니다.

 

C++의 특성

C++는 80년대부터 사용된 오래된 프로그래밍 언어이다. 많은 사람들이 C++가 오래된 만큼 최신 언어에 뒤쳐지고 그만큼 느릴 것이라고 생각하기도 하는데, 이는 대단히 잘못된 생각이다.

C++는 사실 빠른 연산이 필요한 게임 엔진, 그래픽스 엔진, 실시간 시스템, 서버 백엔드 등에 사용되며, 특정 분야에서는 C++ 외 다른 언어를 권장하지 않을 만큼 특성이 뚜렷한 프로그래밍 언어이다. 예를 들어, 게임 엔진의 3대장인 Unity, Unreal, Frostbite 엔진 모두 C++로 작성되어있다.

컴퓨터가 C++ 코드를 이해하기 위해서는 우선 컴파일러를 통해 machine code로 변환해야한다. 이 Machine code라는 것은 사람이 읽을 수 있는 형태의 코드가 아닌, 프로그램을 실행하려고 하는 하드웨어 플랫폼의 프로세서가 읽을 수 있는 형태의 코드이다. Machine code는 프로세서에 직접적으로 접근하여 논리연산을 실행한다.

이 때, C++ 코드는 사람이 생각하는 것과 비슷한 high-level 명령어부터 machine code 수준의 low-level 명령어를 모두 가지고 있기 때문에, 프로그래머의 실력에 따라 low-level 명령어들로 논리연산을 하나하나 설계함으로써 굉장히 효율적인 연산을 할 수 있다. High-level 명령어만 사용할 수 있는 언어들은 이를 수행할 수 없다.

C++를 잘 사용하여 CPU에게 비효율 적인 명령을 하지 않음으로써 우리는 진정으로 필요한 연산만을 할 수 있고, 이를 통해 빠른 연산을 할 수 있는 것이다.

 


C++을 어디에 사용할 수 있을까?

그러면 어떤 환경에서 C++ 프로그래밍을 할 수 있는걸까?

사실 컴파일러만 있다면 거의 모든 환경에서 C++ 프로그래밍을 할 수 있다.

  • Windows, Mac, Linux와 같은 데스크탑 운영체제에서부터,
  • iOS, Android와 같은 모바일 운영체제도,
  • ChromeOS, Xbox, PS3 와 같은 게임 콘솔 플랫폼에서도 C++ 코드를 실행할 수 있다.
  • 프로세서의 종류도 x86, x64, ARM 등 컴파일러만 있다면 가리지 않는다.

이처럼 많은 플랫폼들에서 사용가능하기 때문에 C++는 다양한 플랫폼 지원이 필요할 때 특히나 더 빛을 발한다. 컴파일러가 존재하는 한, 나의 C++ 코드는 모든 플랫폼에서 Native하게, 효율적이게 실행할 수 있는 것이다.

 


다른 언어가 아닌 C++를 사용하는 이유

물론 다양한 플랫폼을 지원하는 다른 언어들도 있다. 하지만 C++는 80년대에서부터 개발되어왔고, 많은 양의 소스코드와 튜토리얼들이 이미 만들어져있다.

다른 유명한 언어 중 Java나 C#이 가끔 C++와 비교되곤 하는데, 이 방식들은 Virtual Machine (VM)을 이용하는 방식으로 C++와 다른 방식이다. VM 방식은 컴파일러를 통해 intermediate 언어로 우선 변환이 되고, 실제로 프로그램을 실행시킬 때는 VM이 interpretation 형태로 한줄한줄 읽어주는 형태로 진행된다.

VM 방식과 C++ 방식의 차이를 예를 들자면…

내가 영어로 책을 적어서 출판했는데, 독일에 이 책을 팔고싶다고 해보자. 독일의 독자들은 독일어로만 이해할 수 있기 때문에, 내 책을 팔 때 실시간 번역가를 동행시킨다고 해보자. 그러면 독일인 독자는 책을 읽고 싶으면 이 번역가에게 부탁을 해서, 번역가가 영어로 된 책을 읽고 (컴파일러 변환) 독일어로 번역을 해주면 그제서야 한줄한줄 내용을 이해하게 되는 것 (interpretation) 이다. 이에 반해, C++의 방식은 아예 처음부터 책을 독일어로 출판함으로써, 독일인 독자 (Platform)이 Native하게 읽을 수 있게 만들어 주는 방식이다. 당연히 후자의 방식이 책의 내용을 이해하는데에 (코드를 실행하는데에) 훨씬 효율적일 수 밖에 없다.

 


C++이 그러면 항상 무조건 더 빠른가?

C++ 코드의 native 한 특성 때문에, 모든 C++ 코드가 항상 빠르다는 생각은 버려야한다.

잘 짠 C++ 코드는 당연히 빠를것이다. 하지만 잘 짜지 못한 C++ 코드는 빠르지 않을 것이며, 심지어는 Java나 C# 같은 VM 방식의 코드에 비해 더 느릴 수 있다. VM 방식은 컴파일러를 통하면서 어느정도의 코드 최적화를 통해 속도를 얻어낼 수 있는 방면에, C++ 코드는 그러한 방식이 없을 수 있다. 즉빠르고 좋은 성능을 얻으려면, 우리가 그러한 성능을 낼 수 있는 C++ 코드를 짜는 방법에 대해 공부해야한다.

 


컴퓨터 비전에 C++가 사용되는 이유

컴퓨터 비전에서는 크게 C/C++/Python이 사용된다.

개인적으로 컴퓨터 비전을 할 때는 C++를 배우는 것을 강력하게 추천하며, 딥러닝을 공부할 경우 Python도 함께 배우는 것 역시 추천한다.

C vs C++

C는 임베디드 환경에서 사용이 되기도 하는데, 이러한 환경에서 하드웨어는 C와 밖에 통신을 못 하는 경우가 많다. 다만, 임베디드가 아닌 환경에서는 굳이 C를 써야할 이유는 없다.

Python vs C++

Python은 굉장히 high-level 언어이기 때문에 C++보다 훨씬 간결하고 쉽게 프로그래밍을 할 수 있다는 장점이 있다. Python의 모토가 “Life is short, you need python”인데, 그만큼 프로그래머가 쉽게 프로그래밍을 하면서 시간을 절약할 수 있다는 의미를 가지고 있다. 하지만 Python은 interpretation 언어이며 low-level optimisation이 불가능하기 때문에 프로그램의 시간은 절약할 수 없다는 단점을 가지고 있다.

Python의 단점 중 하나는 High-level 언어이기 때문에, 하드웨어 서포트 등이 좋지 않다는 점이다. Python은 이러한 단점을 C/C++로 구현된 코드를 Wrapper로 감싸서 사용함으로써 극복하는데, 사실 C/C++ 을 사용했으면 겪지 않을 문제라고 볼 수 있다.

Python은 여러가지 Data science, Data visualisation 관련 서포트가 많고, 또 무엇보다 투탑 딥러닝 관련 프레임워크인 TensorFlow와 PyTorch를 Python으로 사용할 수 있기 때문에 딥러닝에서는 필수적인 언어로 여겨진다. C++ 유저를 위해 TensorFlow와 PyTorch의 C++ API가 개발되었지만, 트레이닝 단계에서 굳이 C++로 할 필요가 있나, 라는 생각이 들기도 한다 (물론 large-scale training에서는 의미가 있을 수도 있지만, 학생의 입장에서는 크게 의미가 없을 수 있다). 하지만, 학습된 딥러닝 모델로 빠르게 inference 성능을 내야할 때는 optimisation이 필요한데, 이 떄부터 Python의 한계가 나타나기 시작하면서 ONNX, TensorRT 등의 라이브러리를 통해 C++로 변환하여 사용한다.

Python의 마지막 단점은 Multi-threading이 어렵다는 점이다. Multi-threading을 쓴다는 것은, 병렬처리를 통해 반복적인 계산을 더욱 빠르게 진행하겠다는 의미를 가진다. 결국 빠름을 추구하겠다는 이야기인데, optimise가 되지 않는 코드들을 병렬처리를 함으로써 성능을 조금이라도 끌어올리기보단, C++을 통해 제대로 optimise하면서 여러개의 쓰레드를 빠르게 돌리는게 더 큰 성능을 얻을 수 있다. 실제로 SLAM과 같이 다중 쓰레드를 이용하는 실시간 컴퓨터 비전 프로그램 중에서 Python을 이용하는 경우는 Toy example을 제외하고는 없다.

Source