ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래밍을 위하여 - 0x01 "C표준과 POSIX C"
    Legacy/C&C++ 2015. 6. 10. 08:45
    728x90

    C 표준 (C Standard)


    이 글을 보고 있는 사람들은 다들 C를 배웠거나 배우고 있는 사람들일 것이다. 그러면 C는 알겠는데 C의 표준은 무엇일까? 먼저 일반적으로 통용되는 '표준'이라는 의미에 대해 알아보자. 위키백과를 검색해보면 표준이라는 말 대신 '표준화'라는 말이 등장한다. 


    표준화(標準化)는 여러 가지 제품들의 종류와 규격을 표준에 따라 제한하고 통일하는 것을 말한다. 이와 비슷한 말로 정규화가 있다.


    표준으로 만든다는 의미지만 여러 가지 제품들의 종류와 규격을 표준에 따라 제한하고 통일하는 것을 말한다고 한다. 종류와 규격을 통일하는 것을 의미하는 것 같다. 표준화를 하는 이유는 불편함을 막기 위해서이다. 예를들어 돈을 생각해보자. 우리나라에서 표준으로 통용되고 있는 화폐가 무엇인가? '원(\)'이다. 서울에서도 원을 사용하고, 전라도에서도, 경상도에서도, 제주도에서도 원을 사용한다. 만약 화폐가 표준화되어 있지 않다고 생각해보자. 서울사람이 부산으로 여행을 갔는데, 서울과 부산의 화폐가 서로 다르다면 이사람은 환전을 하는 수고를 해야할 것이다. 다행히 화폐는 표준화가 되어있기 때문에 이런 불편을 겪지 않아도 된다. 우리가 표준화가 되어있지 않아서 겪는 큰 불편 중에 하나는 핸드폰 충전기이다. 아이폰을 사용하는 사람들은 음식점 같은 곳에서 충전을 하기 위해 카운터에 충전되냐고 물어보았을 때 "갤럭시 밖에 충전 안돼요."라는 말을 많이 들어보았을 것이다. 갤럭시 사용자도 그와 반대의 경우를 경험해 보았을 수도 있다. 갤럭시와 아이폰을 충전하는 충전기가 다르기 때문에 일어나는 일이다. 이처럼 C 소스를 표준화 시키지 않아서 일어나는 일도 개발자에게 불편을 안겨준다. 분명 윈도우즈에서는 정상적으로 문제없이 실행되던 소스가 리눅스에서는 컴파일 에러를 일으키는 경우를 심심치 않게 볼 수 있다. 이처럼 다른 플랫폼에서는 실행되지 않게 작성된 소스를 '이식성'이 낮은 소스라고 한다. 좋은 개발자라면 이식성이 높은 소스를 짤 수 있어야한다. 이 이식성이 높은 소스를 짜기 위해 알아야 하는 것이 오늘 주제인 C 표준이다.

    C 표준은 'ANSI C'와 'C POSIX'로  나뉜다. 우선 ANSI C에 대해 알아보자. 


    Q 11.1``ANSI C 표준''이란 무엇인가요? A1983년, 미국 규격 협회(American National Standards Institute, ANSI)는 C 언어의 표준을 제정하기 위해 X3J11이라는 위원회를 열었습니다. 매우 긴 기간동안 토론한 끝에 이 위원회의 보고서는 1989년 12월 14일 ANSX3.159-1989라는 이름으로 비준받아서, 1990년에 출판되었습니다. 대부분의 내용은 기존의 C 언어에서 가져온 것이며, 몇몇은 C++에서 (대부분 함수 prototype에 대한 것) 가져온 것입니다. 그리고 (논쟁의 여지가 있던 3중 음자(trigraph) 문자 시퀀스를 포함한) 다국적 문자 세트를 지원하는 기능도 포함시켰습니다. ANSI C 표준은 C run-time 라이브러리도 표준화시켰습니다.그 후에 국제 표준 기구인 ISO는 미국 표준인 X3.159를 ISO/IEC 9899:1990으로 대체하여 국제 표준으로 만들었습니다. 이 표준에서는 ANSI의 표준을 정정하고 보충한 것이 대부분이었기 때문에 흔히 `ANSI/ISO 9899-1990' [1992] 라고 부릅니다. 1994년 `Technical Corrigendum 1(TC1)'은 표준에서 약 40 가지를 수정하였습니다. 대부분 수정은 부분적으로 명확한 설명이 필요한 것에 보충 설명을 단 것입니다. 그리고 `Normative Addendum 1(NA1)'은 약 50 페이지 분량의 새로운 개념을 추가했으며, 거의 대부분이 국제화(internationalization)에 관한 함수 설명입니다. 1995년 TC2는 몇가지 정정 사항을 추가했습니다. 이 글을 쓸 때, 표준의 완전한 개정판은 이제 막바지 작업에 들어 갔습니다. 새로운 표준은 현재 ``C9X''라고 이름이 붙었고, 1999년 말에 완성될 거라는 뜻을 나타냅니다. (이 글의 많은 부분도 새로운 C9X를 반영하려고 수정되었습니다.) 오리지널 ANSI 표준은 많은 부분에서 결정한 부분에 대한 설명과, 작은 문제들에 대한 논의를 포함한 ``Rationale (이론적 해석)''을 포함하고 있습니다. 몇 가지는 이 글에 이미 포함되었습니다. (Rationale 자체는 ANSI 표준 X3.159-1989에 포함된 부분이 아니지만 정보 제공 목적으로만 제공되는 것이며, ISO 표준에 포함되는 내용도 아닙니다. C9X 용으로 새 판이 준비되고 있는 상황입니다.)


    -출처 : http://www.dal.kr/chair/cdata/cfaq_kr/node15.html


    ANSI C는 미국 규격 협회라는 단체에서 정한 표준으로 널리 사용되고 있는 표준이다. ISO에서 제정한 C99도 아주 중요한 표준이지만, 실제 널리 사용되는 것은 ANSI C이다. 1983년에 제정된 표준이니 굉장히 오래된 표준이라고 할 수 있다. C는 그만큼 문법이 큰 변화가 없었다. ANSI C가 C99와 어떻게 다른지는 구글을 통해 조금만 검색해보면 간단한 코드들과 함께 비교할 수 있다.


    다음으로 C POSIX에 대해 알아보자. POSIX는 Portable Operating System Interface의 머리글자에 유닉스를 의미하는 X가 붙어 이루어진 단어이다. 이름부터도 Portable이라는 단어가 붙어있으니 뭔가 이식성이 좋을 것 같다. POSIX는 C에만 국한된 표준이 아닌 커널 전반에 걸쳐 적용되는 '규격'이다. 프로그래머가 POSIX 규격을 지킨다는 것은 POSIX에서 규정한 함수들을 사용한다는 것을 의미한다. POSIX에서는 따로 라이브러리를 제공하고 있다. (링크 - POSIX 라이브러리) 단순히 POSIX 라이브러리에 정의되어 있는 함수들을 사용함으로써 우리는 POSIX 표준을 따를 수 있게 되는 것이다.


    사실 아직 표준화가 왜 필요한지 안 와닿는 사람도 있을 것이다. 아마 리눅스와 윈도우즈에서 둘다 프로그래밍을 해본 사람이라면 이해할 수 있는 내용이었겠지만 단일 플랫폼에서만 프로그래밍을 해본 사람이라면 공감하기 어려웠을 것이다. Java 같은 언어가 크게 인기를 끌 수 있었던 이유는 이식성이 아주 높았기 때문이다. Java는 같은 소스로 다른 플랫폼에서 컴파일 시켜도 아무 문제가 없다. JVM이라는 가상 머신과 기계어와 Java코드의 중간 단계인 바이트 코드를 이용했기 때문이다.


    다음 글에서는 소스코드가 바이너리 파일이 되어 실행되는 과정에 대해 쓰겠다. 전처리기, 링커, 컴파일러 등을 거쳐 소스코드가 실행되는 과정을 이해하는 것이 중요하다고 생각했기 때문이다.

Designed by Tistory.