c++은 대체될 것인가?
c++는 제가 아는바로는 철저히 절차지향적일 수 있고, 철저히 객체지향적일 수 있는 하드웨어의 세부적인 제어가 가능한 고성능 범용 프로그래밍 언어입니다. c++을 대체하겠다며 만들어진 언어의 대표주자인 Rust는 절차지향적이지만 객체지향을 지원하는 고성능 프로그래밍 언어입니다. Rust는 안정성을 위해 러닝커브가 급격하고 일반적인 프로그래밍에 없는 개념이 과도하게 도입된 형태를 띄고 있어 처음 프로그래밍을 접하는 사람에게 권하기 힘든 언어입니다. 하지만 Rust의 장점은 강철로 만들어진 성벽이 성안을 지켜주듯 안전성을 보장해주는 것에 가치가 있습니다. 하지만 Rust를 사용하는 중에는 강단한 규칙과 컴파일 에러 메시지와 씨름해야 할 각오를 해야합니다. 그렇기에 Rust는 개인차가 있으며 잘 선택받지 못 하는 언어 같습니다. 또한 Rust는 완전한 객체지향 프로그래밍이 불가능합니다. 사실 어느정도 흉내낼 수 있지만 다중 중첩된 클래스 계층 구조를 언어 차원에서 지원하지는 않습니다. 즉, 객체지향성을 가진 절차지향 프로그래밍 언어라는 말입니다.
사실 이런 고급 추상화 기능이 없어도 프로그램을 만드는 데에는 전혀 문제가 없습니다. 똑같이 만들 수 있습니다. 하지만 인간이 사고하는 방식과 유사한 방식의 개념을 도입하여 만들어낸 객체지향 프로그래밍에는 그만한 가치가 있습니다. 개발을 하다보면 새로운 것을 빨리 만들어야 하는 경우와 원래 있던 것을 대량으로 만들어야 하는 경우가 반드시 생깁니다. 이런 경우에 상황에 맞는 프로그래밍 언어를 선택해서 개발해야 최적의 개발 프로세스가 정립될 수 있을 것입니다. 하지만 모든 프로그래밍 언어가 그렇듯 마음에 쏙 드는 언어를 찾는 것은 굉장히 어렵습니다. 또한 여러 언어를 사용한다면 그때마다 새로운 언어의 문법, 생태계, 도구를 익히느라 학습하는 데에 한 세월이 걸립니다. 저는 여러가지 언어를 선택하는 것보다 모든 사용자의 니즈를 충족시킬 수 있는 단 하나의 범용적인 언어로 가능한 많은 일을 하는 것이 가장 적은 비용으로 가장 많은 결과물을 얻을 수 있는 길이라고 생각합니다. 객체지향 프로그래밍은 인간이 이해하기 쉽도록 간결화와 추상화를 통해 복잡한 구조를 단순화하고 코드 재사용성과 생산성을 극대화합니다. 일반적으로 작은 규모의 프로그램 개발에는 객체지향 프로그래밍이 부적합한 경우가 많습니다. 그러나 대규모 시스템이나 AAA급 게임 개발에는 거의 필수적이라고 할 수 있겠습니다.
Rust 이야기가 나왔으니 Zig도 빼놓을 수 없을 것 같습니다. 저는 최근 Zig를 이용하여 간단한 라이브러리와 앱들을 개발해 보았습니다. Zig는 컴파일 타임 제네릭, 즉 정적 다형성을 지원하는 객체지향성을 지닌 절차지향 프로그래밍 언어입니다. Zig는 고성능을 중요시하며 c를 대체하기 위해서 만든 언어라고 합니다. 실제로 Zig는 최적화 옵션으로 컴파일할시 c++과 동일한 작업을 수행했을경우 대부분 더 빠른 성능을 보였습니다. 저는 Zig가 원한다면 c뿐만 아니라 c++도 대체할 수 있지 않을까라는 생각을 했었습니다. 하지만 Zig는 상속과 동적 다형성, 캡슐화 모두 지원되지 않는 언어로서 Rust보다 더 절차지향적 언어의 면모를 보였습니다. 그에 더해 Zig는 명시성을 중요시 여기기 때문에 프로그래머가 원치않는 메모리 할당이나 숨겨진 로직, 생략된 네임스페이스를 제거하는 문법을 지향하고 있었습니다. Zig가 명시적이고 단순하면서 강력한 기능을 제공해주기는 하지만 이런 제약 앞에서는 그들만의 유토피아가 될 뿐이라고 생각했습니다. 저는 Ziggit(Zig 커뮤니티)에서 문법에 대한 깊이 있는 고찰을 토로하면서 Zig 문법의 방향성에 대해서 재고하기를 기대했지만 그들의 사상은 완고했고 저는 더이상 설득을 포기하였습니다. 누군가 가야할 길이 있다면 막지 않는 것이 서로에게 도움된다고 생각했기 때문입니다.
Zig의 방향성에 대해서 받아들이고 저는 원점으로 돌아오게 되었습니다. 그리고 c++를 대체할 수 있는 언어가 무엇이 있는지 곰곰히 생각해보았지만 c++을 대체할 수 있는 언어가 없었습니다. 모두 자신이 생각하는 더 나은 그림을 그리는 도화지로서 언어를 개발하고 있었습니다. 그리고 자신의 그림을 보여주면서 자기 그림이 더 낫다고 말하며 상대방에게 인정을 갈구하는 모습이었습니다. 하지만 제 생각에는 어떤 사용자라도 각자가 원하는 일을 할 수 있도록 깨끗한 도화지를 제공해주는 언어가 가장 이상적인 언어라고 생각합니다. 그러한 언어가 제가 보기엔 c++밖에 없다고 느껴졌고 그렇기에 c++은 대체되지 않을 것이라고 판단하였습니다. c++은 굉장히 오래된 언어입니다. 신생 언어에 비하면 패키지 관리자, 빌드 툴 따위의 것은 모두 개별적으로 선정하여 가져와서 사용해야 되기 때문에 통합이 부족하고 이에따라 번거로움이 발생합니다. 또한 문법적으로 부족하거나 잘못되어 보이는 부분도 개선의 여지가 남아있습니다. 저는 예전에 c++의 생성자를 보면서 함수 오버로딩으로 모든 경우의 수를 다 만들어 놓으면 객체를 생성하는 클래스 사용자가 편리함을 느낄 것이라고 생각하면서 수십개의 생성자를 만들었던적이 있습니다. 그리고나서 든 생각은 함수 매개변수에 디폴트값을 지정해놓고 원하는 매개변수만 초기화하는 기능이 있으면 좋겠다는 생각을 했습니다. 그 기능을 탑재한 언어가 바로 dart입니다. dart는 문법적으로 c/c++과 거의 유사하기에 친화적인 언어입니다. dart에서 GC를 제거하고 몇가지만 수정한다면 제가 생각하기에 이상적인 언어라고 생각했습니다. 하지만 dart는 현재 가장 활발하게 사용되는 flutter 프레임워크의 편의성을 뒷받침하기 위해 GC를 없애는 선택을 결코 하지 않을 것이라 생각합니다. 결국 누군가 현대화 c++(Modernize c++)을 만드는 일이 곧 오리라는 믿음을 가지고 이 글을 끝마칩니다.