다음글은 http://www.woong.org 에서 발췌한 내용입니다.
----------------------------------------------------
▧ C 언어의 역사 (2000.6)


▷ C 언어의 탄생
C 언어는 1972년 벨 연구소 (Bell Laboratories) 에 있는 Dennis Ritchie 에 의해 고안되었습니다. C 언어는 ALGOL 60 (1960), CPL (1963), BCPL (1969), B 언어 (1970) 에 그 기원을 두고 있으며, 지금은 다목적용 프로그래밍 언어지만, 처음에는 시스템 프로그래밍 언어였습니다. 대표적으로 유닉스 (UNIX) 운영체계는 C 언어로 쓰여진 것입니다. (C 언어의 탄생 목적 자체가 기계어로 작성된 UNIX 를 고급언어로 바꾸기 위해서 였다고 합니다) 1989년 표준이 정해지기 전, C 언어의 레퍼런스 메뉴얼은 Brian Kernighan 와 Dennis Ritchie 가 쓴 "The C Programming Language (1st Edition) - 1987" (이하 K&R1) 이었습니다. K&R1 이 나온 이후 각 C 언어 컴파일러들은 자기만의 방법으로 C 언어를 발전시켜 갔습니다.
▷ C 언어의 첫번째 표준
1983 년 ANSI (American National Standards Institute) 는 C 언어 표준화에 대한 필요성을 느끼고 Jim Brodie 를 장(長)으로 하는 X3J11 위원회를 소집했습니다. 수년동안 이미 존재하는 컴파일러들의 실례와 C++ 로 부터 몇가지 기능 (대표적으로, 함수원형을 이용한 선언방법) 을 수용하고 다국어 문자 (삼중자 trigraph 포함) 를 지원하고 런타임 라이브러리를 표준화해서, 1989년 12월 14일 마침내 ANSI X3.159-1989 라는 공식명칭으로 C 언어의 첫번째 표준이 완성되었습니다. 이 표준안은 1990년 봄에 공식적으로 발표 (published) 되었습니다. 표준안의 대표적인 특징은 아래와 같습니다.

· 새 전처리기 (preprocessor) 지시자 및 기술 추가
· 함수선언에서 인자 (argument) 의 데이터형을 명시해 주는 함수원형 (function prototype) 추가
· const, volatile, signed 같은 새 키워드 추가
· 확장 문자 (wide character) 와 확장 문자열 (wide string), 멀티바이트 문자 추가


또한 ANSI 의 표준안에는, 미묘한 사항에 대한 ANSI 측의 논의와 결정에 대한 설명을 담고 있는 "Rationale" 가 포함되어 있습니다. 하지만 이는 X3.159-1989 의 공식적인 일부분이 아니며, 국제 표준인 ISO C 에서는 제외되었습니다.
ANSI 표준안이 제정된 이후, 프로그래밍이 국제적인 활동임을 감안해, P.J.Plauger 를 장(長)으로 하는 ISO/IEC JTC1/SC22/WG14 는 ANSI 표준안을 ISO/IEC 9899:1990 이라는 국제표준으로 변환했습니다. 국제 표준안은 편집상의 일부 사항만 변했을 뿐, 내용은 ANSI 와 동일합니다. 이 국제 표준이 제정되면서 미국내에서도 ANSI 표준은 ISO 표준으로 대체됩니다.

▷ Technical Corrigendum, Amendment 1
이 후 1994년 C 언어의 버그픽스 (bug fix) 격인 Technical Corrigendum 1 이 발표됩니다. 이는 기존 표준안에서 35군데의 사소한 내용을 수정하고 더 명확히 한 것입니다. 또한 1996년에도 추가적인 수정작업 (Technical Corrigendum 2) 이 있었습니다.
1995년에 WG14 는 C 언어에 포함된 다국어 지원이 충분치 않다는 의견을 반영해, 새로운 기술을 첨가한 50쪽 분량의 Amendment 1 을 추가하였습니다. 여기에는 C 언어의 국제적 사용을 지원하기 위해, 외국어 문자세트와 멀티바이트 문자등을 위한 라이브러리 함수가 새로이 추가되었습니다. 자세한 추가사항은 아래와 같습니다.

· iso646.h, wctype.h, wchar.h 의 3가지 새 표준 헤더파일 추가
· 일부 국가의 문자세트에는 없는 연산자와 구두점 (punctuation) 을 치환해주는 새 토큰과 매크로 추가
· printf/scanf 류의 함수를 위한 형식문자 (formatting code) 추가
· 멀티바이트 문자와 확장문자 (wide character) 지원을 위해, 몇개의 데이터형과 상수, 다수의 함수 제공


▷ ISO/IEC 9899:1999 (C9X) 의 제정
1995년 ANSI 와 ISO 는 표준안 개정작업을 위한 정기 회의를 갖고, C9X 라는 코드명을 갖는 새 표준안 개정에 들어갔습니다. (C9X 라는 이름은 새 표준안이 90년대 안에 완성되길 바란다는 뜻이며, 1999년에 완성되었기 때문에 이제는 C99 라고도 합니다)
1999년 가을, 1995년에 시작된 새 표준안이 제정 (ratified) 되었으며, 같은 해 12월에 공식적으로 발표 (published) 되었습니다. 공식명칭이 ISO/IEC 9899:1999 (미국내에서는 앞에 'ANSI' 가 붙습니다) 로 알려진 새 표준안에는 다수의 새로운 기술과 데이터형, 표준 라이브러리 함수가 추가되었습니다.

▷ 여러가지 C 언어
최초 K&R1 에 의해 정의된 C 언어, 그 이후 표준안이 정해지기 전까지의 C 언어, 표준안이 정해진 이후의 C 언어가 각각 다른 이름으로 불리워지며, 구별되기도 합니다. 물론 국내 C 언어 책에서는 거의 구분이 되지 않지만 원서에서는 자주 나오므로, 이곳을 통해서 정리해 보려고 합니다.
우선, Original definition of C 라는 말은 K&R1 에서 정의된 C 언어 본래의 정의를 의미합니다. 가장 고리고짝 시절 C 언어의 정의이므로, 표준이 정해지고도 한참의 시간이 지난 지금에는 큰 의미를 갖지 못합니다.
Pre-ANSI C 는 K&R1 이 나온 이후부터 1989년 ANSI 에 의해 표준안이 제정되기 전까지, 여러 컴파일러들에 의해 발전된 C 언어를 일컫는 말입니다. 표준 없이 각각 발전했기 때문에 전체를 아루를 수 있는 정확한 기준은 없지만, 대개 비슷한 방향으로 발전되어 비슷한 특성을 갖습니다. Pre-ANSI C 외에도, Pre-ISO C, Pre-standard C 등으로 불립니다.
ANSI C 는 1989년 이후 ANSI 가 제정한 표준안에 의한 C 언어를 의미합니다. 물론 정확히는 미국내에서의 표준을 의미하지만, ANSI C 가 곧 국제표준으로 그대로 변환되었기 때문에 관례적으로 ANSI C 는 국제표준을 의미하는 말이 되었습니다. ISO C, Standard C 등의 이름으로도 불립니다.

▷ 이 글의 시점과 기타사항
이 글은 2000년 3월에 작성되었으며, 6월에 마지막으로 수정된 것입니다. 현재 필자가 C99 표준안의 위원회 초안 (committee draft) 을 보고 있기는 하지만, 개인적으로 바쁜 일이 있어 C99 에 대한 이야기를 이곳에 올리기에는 힘듭니다. 나중에 여유가 생기는대로, (가능하다면) C99 에 대한 이야기를 올릴 수 있도록 하겠습니다. 그 전에 궁금한 사항이 있는 분은 메일을 통해서 개인적으로 질문해 주시기 바랍니다.