C++이 outdate 되었다고 느낄 때 SW

3년 전에 C++ 기반 project에서 Java 기반 project (정확히 말하면 Android)으로 옮겨오긴 했지만 가장 좋아하는 프로그래밍 언어는 C++입니다.
C++ 자체는 많은 장점이 있고, C++11/14 등 community에서 꾸준히 발전하고 있긴 하지만 가끔 최신 흐름에 비해서 outdate 되었다고 느낄 때가 있습니다. 다중 상속 정도는 언어 차이로 사용하는 측에서 잘 알고 피하면 되는데, 나머지 것들은 언어 자체의 한계가 아닌가 하는 생각이 듭니다.
  1. static class 초기화
    C++의 static class의 초기화는 해당 program이 메모리에 loading 될 때에 일어납니다. C에서는 별다른 scope이 없기 때문에 이게 자연스러운데 C++에서는 https://isocpp.org/wiki/faq/ctors#static-init-order 에서 설명하는 것처럼 미묘한 초기화 문제가 발생합니다. 그 외에도 생성자가 main() 이전에 호출되어서 적절히 초기화 되지 못한 상황에서 외부 호출이 발생하기도 합니다
    Java의 경우는 명확하게 class가 처음 사용 될 때에 해당 class의 static 변수들이 초기화 되는 것을 spec에서 명시하고 있는데, 이게 훨씬 더 자연스럽습니다.  물론 구현도 쉽지 않을 듯 하고, 동기화 문제도 있습니다. Java의 경우 static block 초기화를 위한 별도의 lock이 존재합니다.
  2. 프로그래밍 언어, 바이너리 format, threading의 역할
    C++의 경우는 ABI 측면에서 C보다 훨씬 불안정해서, gcc/msvc 같은 compiler vendor 마다 ABI를 별도로 정의하고 gcc의 경우 자기 버전에서 ABI 호환이 되지 않은 경우가 있었습니다. 애초에 언어 자체에서 naming mangling이나 ABI를 compiler vendor의 구현 의존적으로 맞겨서인데, stand-alone program을 구현 할 때에는 큰 이슈가 안될 수 있지만 public API를 제공하는 입장에서는 상당히 난감합니다.
    애초에 C++ 2000년대 초반 까지만 해도 프로그래밍 언어의 역할이 지금보다 훨씬 더 적은 영역만을 차지했는데, 지금은 언어 차원에서 runtime이나 자료구조, 동기화까지 Cover합니다. (예전에는 별도의 라이브라리의 역할이었습니다.) C++11/14에서는 future/promise나 lock 객체를 통해서 이러한 부분을 언어 차원에서 다룰 수 있게 되었습니다.
  3. exception spec
    예외에 대한 spec이 compiler의 구현에 의존적이기 때문에 compiler에서 setjmp/longjmp로 구현하든 exception table로 구현하든 정의되어 있지 않았고, platform에 따라서 어느 정도의 overhead가 드는지도 너무 차이가 나서 exception에 대한 일관된 개발 경험이 불가능합니다. C++에서 exception을 사용하는 게 지금은 권장이지만 어디까지의 환경에서 권장이라고 이야기 해야 할까요?
그 외에 annotation, interface 등의 기능이 없는 것 등이 있지만 이 부분은 더 minor 한 이슈네요. 그나마 C++11/14에서 enum class로 scope이 지정 가능 해 진 것 등은 아직 C++이 계속 진화 중이라는 것을 느끼게 합니다.

그래도 완전히 deterministic한 메모리 관리나 primitive type까지 문제 없는 template 등은 Java 개발 시 아쉬운 기능입니다.