지난 주말동안 C++을 좋아하는 친구가 빌려 준 C++ 책(Effective Modern C++. Scott Meyers.)을 읽었다.
주의: 이 글은 컴퓨터 세계의 세 종교(운영체제, 프로그래밍 언어, 에디터) 중 하나에 대해 이야기한다. 이들의 선택은 어디까지나 선호의 문제이며 이곳에 적힌 내 생각은 많은 오류를 포함한다.
이 책은 C++11/C++14에 추가된 내용을 주로 다룬다.
auto
move
실행의미이것들을 정리하기엔 나는 C++을 잘 모르는 똥멍청이라서 느낀점만 적어 본다.
이전까지 C++에는 타입 추론 기능이 없었다. 나는 그 이유가 C++에서 워낙 강력한 서브타입시스템을 지원하고 있기 때문이라 생각한다. 많은 C++ 개발자가 "C++에서는 안되는 것이 없다"고 이야기하는 것도 강력한 서브타입시스템 덕분이리라 믿는다.
C++11부터 auto
를 이용한 타입 추론이 추가되었다. 당연하게도 완벽하게 모든 상황을 다 커버하는 타입 추론은 아니지만 개발자를 충분히 편하게 하는 기능이다. 코딩을 위한 타이핑 수가 줄고 그에 따라 버그를 만들 가능성도 함께 준다.
하지만 C++의 auto
타입 추론은 알고리즘만 있고 그에 해당하는 수학적인 모델이 없다. 보통 어떤 수학적 계산을 하는 프로그램을 작성할 때 다음 단계를 거친다.
타입 추론은 수학적인 계산을 하는 프로그램이다. 구체적인 타입 정의나 추론 방식에 차이는 있을지라도 타입 추론을 지원하는 대부분의 정적 타입 언어가 이를 따른다. 간결한 타입 시스템을 수학적으로 정의하고 사용함으로써,
추론된 타입에 대해 수학적인 모델이 없는 C++로부터는 이 두 이점 중 어떤 것도 기대할 수 없다. 태생적으로 2는 어렵다 쳐도 1은 만족되기를 바랐는데 아쉽다. 덕분에 저자는 타입 추론 알고리즘이 이상하게 동작하는 코너 케이스를 잔뜩 나열하고 이를 조심할 것을 당부한다.
C++은 미세한 메모리 조종에 능하다. 메모리를 언제 얼만큼 할당하여 어떻게 사용하고 버리는지 조종이 가능하다. 자동 메모리 관리를 위한 스마트포인터를 도입하면서도 개발자가 직접 세부적인 조종을 할 수 있는 여지를 충분히 만들어 놓았다.
임시 객체의 불필요한 복사를 줄이는 값 이동(move
) 개념을 도입할 때도 이러한 철학을 그대로 가지고 간다. 비록 이로 인해 더 많은 오류의 가능성을 개발자가 고민해야겠지만 더 빠른 프로그램을 작성할 수 있게 됐음에는 이견의 여지가 없다.
이 책을 빌려 준 친구가 말하기를
C++은 더 많이 알 수록 더 좋은 코드를 작성할 수 있는 언어.
라 하였다. C++이 미세한 조종의 철학을 꾸준히 가지고 가는 걸 보니 맞는 말 같다.
한편 유명한 해커 Paul Graham이 그의 에세이에서 해커들의 즐거움에 대해 이야기했다.
Great hackers think of it as something they do for fun, and which they're delighted to find people will pay them for.
아마 C++도 그렇고 Lisp도 그렇고 더 열심히 노력하면 더 좋은 코드를 생성할 수 있도록 언어가 자유를 주는 것 같다. 그리고 해커들은 이것으로부터 기쁨을 느끼나 보다.
책의 내용 중 C++의 성능에 대해 재미난 문구가 있어서 인용한다.
+파이선이 뭘 잘못했길래.
+아니거든요, OCaml 코드거든요!
내가 읽은 책은 번역본이었다. 모국어로 된 전공 서적을 읽은 적이 별로 없었는데 색다른 경험이었다. 번역으로 생기는 몇몇 어색한 표현들이 있기는 했지만 대부분의 내용을 외국어로 읽는 것보다 훨씬 빠르게 이해할 수 있었다. 그동안 번역의 힘을 간과해 왔는데 내가 좋아하는 OCaml도 번역된 문서가 더 많이 생긴다면 더 많은 개발자가 적은 비용으로 접근할 수 있지 않을까 싶다.
아쉽게도 더 복잡하지만 더 빠른 코드가 내가 선호하는 방향은 아니다. 이것저것 고민하기 귀찮은 나는 올바른 코드를 적은 비용으로 작성할 수 있게 하는 언어에 더 큰 매력은 느낀다. 난 해커가 되긴 글렀나 보다. 그냥 그렇다고.
2016-08-01 씀.