[OS]/Embedded&Linux

C99 이해를 위한 배경 지식과 새 기술 소개 - 1

하늘을닮은호수M 2007. 8. 6. 10:40
반응형

출처 : http://hawkshim.tistory.com/entry/펌-C99-이해를-위한-배경-지식과-새-기술-소개-1

연+재+가+이+드
개발도구 | C99를 지원하는 컴파일러 및 라이브러리
기본지식 | C 언어(C90, C95)에 대한 일반적 경험
응용분야 | 새 개발 과정에 폭넓은 적용 가능


연+재+순+서
1회 | 2004.7 | C99 이해를 위한 배경 지식과 새 기술 소개 1
2회 | C99 기술 소개 2와 컴파일러 이야기
3회 | C99 기술 소개 3과 C99 이후의 C 언어

===============================================================================================
저+자+소+개
전웅 |
현재 한국정보통신대학교(ICU) 석사 과정에 재학 중이며, 컴파일러와 병렬처리 및 각종 표준에 깊은 관심을 가지고 있다.
================================================================================================

운영체제 유닉스를 개발하기 위해 만들어진 C 언어는 단순한 개발 도구의 범주를 훨씬 뛰어 넘어서 여러 프로그래밍 언어를 제패하는 언어로 자리 잡아 왔다. C 언어가 과거의 유물로 남지 않고 이처럼 오래 존재할 수 있었던 것은 끝없는 진화의 노력이다. 그 가운데 가장 최근 변화로 탄생한 C99는 그 진화의 결정판이다. 이에 C99의 새로운 기술에 대해 3회로 나누어 살펴볼 예정이다.


필자가 가지고 있는 가장 오래된 C 언어 책은 1970년대에 출판된 것이다. 지금은 자바나 파이썬 같은 강력한 기능의 좋은 언어들이 쏟아져 나와 지나치게 광범위한 분야에서 사용되어온 C 언어가 자리를 내어주고 있지만, 강산이 3번 변했을 시간 전에 탄생한 언어가 지금까지 각종 개발에서 가장 빈번하게 쓰이는 언어로 자리를 지키고 있다는 사실이 조금은 부조리해 보일 수도 있다.
하지만 이 글의 제목에서도 알 수 있듯이 이는 기우일 뿐이다. 우리에게 그 사실이 잘 알려지지 않을 뿐 지금 이 순간에도 C 언어는 최신 기술들과 빠르게 변화하는 주변 환경에 적응하기 위해 진화를 거듭하고 있다. 이 글에서는 가장 최근에 C 언어에 일어난 커다란 진화에 대해 살펴보려 한다. 구체적인 이야기를 시작하기 전에 더욱 쉽게 이해하기 위한 몇 가지 기본적인 사실들을 알아보자. 지금부터 잠시 동안 다루는 이야기에 너무나도 익숙한 독자라면 원하는 이야기가 나올 때까지 가뿐하게 건너뛰어도 좋다.

C 언어 표준화의 역사
유닉스라는 지금은 너무나도 유명한 운영체제를 구현하기 위해 C 언어가 처음 만들어진 것은 1970년대 초. 지금으로부터 30년 전의 일이다. 그 이후 C 언어는 창시자인 Dennis Ritchie가 처음 생각했던 것보다 더 다양한 분야에서 다양한 사람들에 의해 사용되고 또 발전했다. 물론 서로 다른 집단에 의해 변형된 C 언어가 우연 혹은 필연에 의해 어느 정도 같은 형태를 공유한다고 해도 1980년대에 들어서면서 각 C 언어의 방언들이 자랑하는 다양한 확장 기술은 서로 호환되지 않기에 충분했다.
결정적으로 C 언어가 미국 정부 프로젝트를 위해 사용되기 시작하면서 미국의 표준화 기구인 ANSI에 의해 C 언어의 표준화가 시작된다. 이것이 1980년대 초반의 일이다. 이후 5년 이상의 표준화 과정을 거쳐 탄생한 C 언어 표준이 지금도 여러 C 언어 서적에서 너도나도 인용하는 ANSI C(정확히는 ANSI X3.159-1989)이다. 이 최초의 C 언어 표준이 1989년에 발표됐기에 이를 비공식적으로 C89라고 부르기도 한다. 당시 C 언어가 비단 미국에서만 제한적으로 사용되는 프로그래밍 언어는 아니었기에 국제 표준화 기구인 ISO는 ANSI의 표준화 과정을 감독했고, 몇 가지 형식적인 부분만을 바꿔 1990년 명실상부한 국제 표준인 ISO 표준(ISO 9899:1990)을 발표한다. 유사하게 이를 C90이라고 부른다. C89와 C90은 본질적으로 같은 내용을 전달하기에 특별히 ANSI와 ISO를 구분하지 않는 이상 서로 혼용되는 표현이다. C90이 발표되면서 C 언어의 표준화 과정은 공식적으로 ISO(ISO JTC1/SC22/WG14)로 이양된다(물론 ANSI는 ISO의 미국 대표이기에 영국을 포함한 유럽, 일본 등과 함께 계속 표준화 과정에 참여하게 된다). 따라서 표준화된 C 언어를 부르는 좀 더 올바른 호칭은 ANSI C가 아닌 ISO C나 표준 C라고 할 수 있다.
ISO에 의해 관리되는 모든 국제 표준은 주기적으로 재검토되고 개정된다. 이후 유럽을 중심으로 터져 나온 ‘C90이 지나치게 미국적’이라는 불만을 잠재우기 위해 1995년 일종의 부록 형태로 C90의 확장이 발표된다. 이를 Amendment 1(줄여서 AMD1)이라고 부르며, C90과 AMD1을 합해 C95라고 부르기도 한다. C90 혹은 C95가 자리를 잡아가는 동안 일어난 다양한 변화(예를 들면 C++와 유니 코드의 발전)를 수용하기 위해 90년대 중반 표준화 위원회는 C 표준의 대대적인 첫 번째 개정 작업에 착수하고 1999년 12월에 지금 이 순간 공식적인 국제 표준으로 영향력을 갖는 C99(ISO 9899:1999)를 발표하게 된다. 이 20년 동안의 복잡다단한 사건을 줄이고 줄여 단순하게 표현하면 <그림 1>과 같다.
표준이 발표된 이후 최소한 수년은 흘러야 표준이 실제 프로그래밍 환경에서 영향력을 발휘하는 것이 보통이기에 C99가 비록 5년 전에 발표된 표준이지만, 아직도 대부분의 개발 환경은 C99를 부분적으로만 지원하고 있으며 다수의 C 언어 서적은 C90이나 C95에 그 뿌리를 두고 있다. 일부 상용 컴파일러만 C99를 완벽히 지원하는 것이 현실이지만 C99에서 도입된 새로운 기술들이 그 편리성과 효율성으로 인해 이미 많은 컴파일러에서 확장으로 제공되던 것들이기에 새로운 프로그램을 개발할 때 이 신기술을 적극적으로 활용하는 것은 굳이 상위 호환성(forward compatibility)을 고려하지 않아도 충분히 가치 있는 일이라고 볼 수 있다.


[ C 언어 표준화의 원칙 ]
C 표준의 가장 중요한 역할 중 하나는 새 기술을 고안해 추가하는 것보다 기존의 실례(existing practice)를 다듬어 표준화하는 것이다. 그렇다고 시중에 존재하는 모든 컴파일러의 확장이나 여러 프로그래머들에 의해 제안되는 기술을 무턱대고 도입할 수는 없는 노릇이기에, 위원회는 그러한 기술들을 C 언어 표준에 담기 위해 고민할 필요가 있는 원칙 몇 가지를 제시하고 있다. 여기서는 그 중 C99에 새로 도입된 기술을 바라볼 때 염두에 둘 만한 몇 가지만을 추려서 소개한다.

◆ 기존의 코드는 중요하다. 하지만 기존의 컴파일러는 중요하지 않다.
이는 위원회가 새로운 기술의 도입 여부를 결정할 때, 이미 사용되고 있는 컴파일러보다는 널리 쓰이는 가치 있는 코드를 더 고려한다는 사실을 의미한다. 즉 도입하려는 새 기술이 이미 사용되고 있는 컴파일러의 확장과 충돌하는 경우는 컴파일러의 수정을 기대하며 과감히 도입하지만 이미 널리 쓰이고 있는 코드와 충돌하는 경우에는 새 기술 도입을 재고함을 뜻한다. 참고로 여기서는 표준에 익숙하지 않은 독자들을 위해 컴파일러라는 용어를 사용했지만, 그보다는 임플리멘테이션(implementation)이 더 정확한 개념을 표현하는 용어이다.

◆ 조용한 변화를 피한다.
새 기술이 도입되는 탓에 기존의 사소한 코드가 명시적인 오류를 일으킨다면 오히려 문제가 되지 않는다. 대개 컴파일러가 해당 오류의 위치와 원인까지도 적절히 지적해 줄 수 있기에 프로그래머가 조금만 수고를 들이면 이를 가볍게 수정할 수 있기 때문이다. 오히려 가장 위험한 것은 새 기술이 기존 코드의 의미를 조용히 바꾸어버리는 경우이다.

◆ 국제적인 프로그래밍을 지원한다.
프로그래밍 언어뿐 아니라 컴퓨터 분야의 가장 두드러지는 특징은 지극히 미국 혹은 영어 중심적이라는 것이다. 분명 컴퓨터와 이를 다루기 위한 프로그래밍 언어가 미국 및 영어 문화권뿐 아니라 다양한 국가에서 사용되고 있기에 C 언어는 국제적인 프로그래밍 환경과 이를 통해 확보되는 국제적인 시장을 적극적으로 지원하기 위해 노력하고 있다. 대표적인 예로 AMD1를 통해 더욱 잘 지원되는 멀티바이트 문자와 확장 문자, C99에서 도입된 유니 코드(정확히는 ISO 10646) 등을 들 수 있다.

◆ C90과의 호환성을 유지한다.
프로그램이나 파일 형식이 하위 버전과의 호환성을 유지하는 것이 중요하듯이 프로그래밍 언어 역시 마찬가지다. 따라서 C90 표준을 따라 올바르게 작성된 프로그램은 C99에서도 거의 변화 없이 처음 의도된 행동을 보일 수 있도록 호환성을 유지하려고 노력한다.

◆ C++와의 호환성을 유지한다.
C 언어와 C++는 전혀 별개의 위원회에 의해 관리되며 발전하고 있는 독립된 언어이다. 따라서, C++의 창시자인 Bjarne Stroustrup의 표현을 빌어 C와 C++가 역사적 우연성으로 인해 공통점을 갖는다고 해도 앞으로 완전히 다른 방향으로 발전해나가도 전혀 이상한 일이 아니다. 다만 현재 실질적인 시장의 이익을 고려하면 C와 C++ 사이의 차이를 가급적 줄여주는 것이 이득이 되는 경우가 적지 않기에 가급적 C++와의 호환성을 유지하는 방향으로 표준화가 진행된다. 하지만 아이러니하게도 C99는 C90보다 C 언어와 C++ 사이의 거리를 더 벌려 놓았다. 이는 C++의 1998년 표준이 C90을 참조했던 것처럼 차기 C++ 표준이 C99를 참조하면서 조금이나마 해결될 것으로 기대한다..


본문 출처 : 마소

반응형