C는 C++의 부분집합이 아니다

오늘 황당한 글을 봤다.

잘 짜인 C 프로그램은 C++ 프로그램이다. 따라서 잘 짜인 C 프로그램은 C++ 컴파일러로 컴파일할 수 있어야 한다.

일단 저 말은 C++의 창시자인 비야네 스트롭스투룹이 한 말이다. 하지만 저 말은 틀린 말이다. "네가 뭔데 감히 비야네님을 틀리다고 하느냐"라는 생각이 들겠지만 잠시만 진정하자. 나는 비야네님이 틀렸다고 하지 않았다. 내가 틀리다고 하는 것은 아무런 문맥도 없이 그냥 저 문구만 따와서 말하는 사람을 틀리다고 하는 것이다.

저 말은 분명히 1999년 이전까지는 맞았던 말이다. 분명히 비야네 스트롭스트룹은 C++을 만들면서 C와의 호환성을 고려하였고, 당시의 표준(ANSI C)을 잘 지킨 C 코드는 C++ 컴파일러로 정상적으로 컴파일 되었다. 하지만 그것은 어디까지나 C99가 나오기 전의 이야기다.

C99에서는 여러 가지 새로운 기능을 도입하였고, C++은 그것을 이미 다른 방식으로 구현하고 있었거나, 혹은 필요하지 않은 기능이라고 생각하여 가지고 오지 않았다. 게다가 새로운 표준인 C11이 나오고, C++도 새로운 표준인 03, 11을 거쳐 14까지 나오면서 둘 사이의 간극은 이미 어떻게 할 수 없을 정도로 커졌다.

그런 연유로 비야네 스트롭스트룹은 잘 짜인 C 프로그램이 C++ 프로그램이라고 말할 때 조건을 붙인다. "단, 이건 C89에 한정한다."라고. 하지만 요새 C89를 쓰는 프로그램이 얼마나 있나? 액티브하게 작업이 진행되는 프로젝트 중에서 C89를 쓰는 프로그램 있으면 가지고 와봐라. 찾으려고 노력해본 적은 없지만 찾기 어려울 것이다.

따라서 요새 저런 말을 하는 사람은 그냥 공부를 안 한 사람이다. 그것도 한 20년 전에 공부했던 사람이니 대선배님일 수도 있겠다. 그 사람에게 C99 이후 C++과 스펙이 변경되어 C99 표준을 지킨 코드는 C++컴파일러로 컴파일 안 될 수도 있다고 했더니, 거기에 달린 답변은 더 황당했다.

표준이 문제가 아니라 잘 짜인 C 코드라면 C++ 컴파일러로 컴파일할 수 있어야 한다. C++ 컴파일러로 컴파일되지 않는 코드라면 잘 짜인 C 코드가 아니다.

아.... 정말 충격과 공포다. 무슨 생각을 하면 잘 짜인 C코드의 기준을 C++에서 찾는지 모르겠다. 둘은 이미 다른 언어로 분화되었다. 한동안 비야네는 C와 C++을 합치려고 노력하던 시절도 있지만, 요새는 포기한 듯이 보인다. 심지어 그는 C/C++은 아무것도 모르는 사람들이나 쓰는 용어로 C와 C++을 합쳐서 불러서는 안된다고 말하기도 한다. C와 C++은 이미 같은 언어가 아니다.

C++ 컴파일러로 컴파일 가능한 코드만을 잘 짜인 C 코드라고 말한다면, C99 이후에 새로 추가된 기능을 전부 포기하는 것밖에 되지 않는다. 분명하게 말하건대 표준을 지키면서 잘 짜인 C 코드는 C++ 컴파일러로 컴파일되지 않을 것이다.


p.s. 아쉽게도(혹은 다행히도) 비공개 커뮤니티에 올라온 글이라 원본 링크는 못 올렸다.

댓글

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API