C 언어 | 컴퓨터 시스템 개발 | C 프로그래밍 언어
C 언어의 기본적인 특성과 국제 표준의 관계에 대해 설명하고, CPU가 인식 할 수 있는 기계어와 C 언어 등 텍스트로 표현 가능한 고급 언어의 관계에 대해 설명한다.
C 프로그래밍 언어
C 언어는 1972년에 탄생한 프로그래밍 언어로 C++ 언어를 포함하여 현재 사용되고 있는 많은 프로그래밍 언어의 기초가 되고 있다. 어셈블리 언어와 같이 매우 세부적으로 제어할 수 있는 고급 언어로 제한이 적고 유연한 프로그래밍 언어로 80년대 이후 널리 보급이 됐다. 하드웨어 성향의 프로그램에 적합한 언어이기 때문에 OS의 핵심 부분이나 가전 제품 등에 내장되는 기기의 제어용 프로그램, 게임 등 다양한 분야에서 실제 사용되고 있다.
현재는 C 언어를 기반으로 하는 C++ 언어와 함께 사용되는 경우가 많다. C++는 1980년대에 등장한 C 언어를 확장한 프로그래밍 언어이다. 문법은 C 언어에서 계승하고 있기 때문에 C 언어로 작성된 프로그램의 대부분은 그대로 C++로 컴파일 할 수 있다. 따라서 C++ 컴파일러는 C 컴파일러로 사용할 수 있는 것이 일반적이다. C++ 개발 환경이 있으면 C 언어를 학습 할 수 있다.
C 언어는 탄생부터 현대에 이르기까지 오랜 역사를 가지고, 그 사이에 많은 전문 프로그래머에게 애용되어 온 일반적인 언어이기도 하다. 현재에도 C 언어는 전문 프로그래머의 등용문 같은 존재인 것은 잘 알려져 있다.
국제 표준
C 언어로 작성된 프로그램은 컴파일러에 의해 기계어로 번역되지 않으면 실행할 수 없다. 그래서 다양한 시스템을 위한 컴파일러가 만들어지는 것이지만, 컴파일러를 만드는 사람이 마음대로 새로운 기능(문법)을 추가하거나 일부 기능을 변경하면 어떻게 될까. C 언어 방언이 대량으로 생성된 소스 코드가 특정 컴파일러에 의존하게 되어, 다른 시스템의 컴파일러에서는 컴파일할 수 없게 되어 버린다.
이러한 문제가 발생하지 않도록 전 세계적으로 사용되는 실용도 높은 프로그래밍 언어의 대부분은 국제 표준화 기구(International Organization for Standardization, ISO)에서 명확하게 문법이 정해져 있다. 표준화 기관에 의해 정해져 있는 문법을 사양이라고 하고, 이 사양에 따라 개발된 프로그램을 구현(또는 처리계)이라고 한다. ISO 표준을 따른다면 구현에 의존하지 않고 동일한 코드를 확실하게 컴파일할 수 있다.
C 언어 같은 역사가 있는 언어의 경우 ISO 표준도 여러 버전이 존재한다. 첫번째 기준은 1989년 미국에서 제정된 ANSI X3.159-1989이다. 이후 ISO/IEC 9899:1990 국제 표준화된 현재에도 이 표준은 C 언어의 주류를 이루고 있다.
C 언어 표준화의 역사
년도 | 내용 |
---|---|
1972년 | 탄생 표준화 이전 |
1989년 | ANSI X3.159-1989, ANSI로 표준화 통칭 C89 |
1990년 | ISO/IEC 9899:1990, ISO로 표준화 통칭 C90 |
1995년 | 국제화 대응 |
2018년 | ISO/IEC 9899:1990, C90의 개정 통칭 C99 I |
1989년에 ANSI에서 표준화되기도 이전에 C 언어를 개발한 Brian Kernighan 씨와 Dennis Ritchie 씨의 공저 “프로그래밍 언어 C”(The C Programming Language) 표준이었다. 이 두사람 이름의 머리 글자에서 K&R이라고도 한다. 지금도 C 언어 개발자를 위한 성경적인 책으로 교과서처럼 추천하는 기술자도 적지 않지만, 코드가 오래되었고 덧붙여 초보자에게 배우기 쉬운 책이라고 말할 수 없다. 컬렉션으로 권장하지만, 학습을 위한 다른 책을 추천한다.
그후의 국제 표준 규격은 ANSI X3.159-1989를 기반으로 하고 있기 때문에, 지금도 C 언어 표준을 ANSI라고 부르는 경우도 적지 않다. 1990년에 제정된 ISO/IEC 9899:1990은 통칭 C90이라고 하고, 최신 표준은 2018년에 제정된 ISO/IEC 9899:2018을 통칭 C99이라고 한다.
주류 컴파일러의 대부분은 C90을 준수하고 있는데, C99에 대한 대응에는 편차가 있다. 현재는 C 언어의 기능밖에 사용하지 않는 코드여도 C++ 언어 코드로 컴파일하는 경우도 많고, 기능으로도 C++가 뛰어 나기 때문에 C 언어 사양을 확장할 필요성이 적기 때문에 것이다.
기계어와 고급 언어
CPU가 직접 인식할 수 언어는 기계어로 작성된 프로그램이다. 기계어는 순수한 바이너리 데이터이므로, 그 마음만 먹으면 바이너리 편집기에서만으로 프로그래밍을 할 수 있다. 그런데 숫자만으로는 인간은 읽고 쓰기가 어렵기 때문에 기계어의 숫자를 알파벳으로 대체한 어셈블리 언어라는 것도 있다.
그러나 오늘날 기계어나 어셈블리 언어를 사용하는 프로그래머는 거의 없다. 이 언어들을 사용한 개발은 너무 비효율적이다. 기계어나 어셈블리 언어를 작성하는 경우 다른 프로그래밍 언어에서 필요하지 않은 계산과 설계가 필요하며, 관리가 매우 어렵다.
그래서 숫자나 기호만으로 된 이해하기 어려운 프로그래밍보다 더 인간이 이해하기 쉬운 언어로 소프트웨어를 개발하기 위해 태어난 것이 프로그래밍 언어이다. 보통 기계어나 어셈블리 언어와 같은 컴퓨터 측의 언어를 저급 프로그래밍 언어라고 부르며, 인간의 언어에 가까운 언어를 고급 프로그래밍 언어라고 한다. C언어와 이 밖에 유명하고 많이 사용되고 있는 언어인 BASIC 또는 Java도 고급 언어에 속한다.
그러나 어떤 형태로든 최종적으로 기계어로 번역되지 않으면 CPU가 프로그램을 실행할 수 없다. 고급 프로그래밍 언어와 어셈블리 언어로 작성된 텍스트를 원시 프로그램 (또는 소스 프로그램)이라고 하고, 이를 기계어로 번역된 코드를 목적 프로그램 (또는 오브젝트 프로그램)이라고 한다.
기계어로 번역에는 몇 가지 방법이 있다. C언어는 원시 프로그램을 한꺼번에 목적 프로그램으로 변환한 후에 이를 기계어로 실행하는 방법을 사용한다.
한편, BASIC과 스크립트 언어 등은 원시 프로그램을 한 문장마다 읽고, 이것을 해석하고 실행하는 방식을 채택하고 있다. 이 경우 텍스트 데이터를 직접 실행할 수 있기 때문에 대화적인 개발을 할 수 있는 장점이 있지만, 실행에 문장을 순서대로 해석해야 하기 때문에 속도가 크게 저하된다는 것과, 원시 프로그램을 해석하고 실행하는 인터프리터라는 프로그램이 필요하다는 단점도 있다.
C언어는 최종적으로 기계어로 변환되기 때문에, 최적의 형태로 수행할 수 있다. 따라서 실행 속도가 빠르다는 장점이 있지만, 한 번 컴파일해야 한다는 것과, 컴파일된 실행 파일은 특정 시스템에 의존되기 때문에 호환성이 약하다는 약점을 가지고 있다. 그러나 현재 사용되고 있는 대부분의 프로그래밍 언어는 C언어를 기반으로 하고 있는 것이 많고, 컴퓨터의 본질적인 이해를 위해서는 C언어 학습이 필수가 되고 있다. 또한 C언어는 기계어에 가까운 고급 언어이므로 빠른 프로그램을 제공할 수 있으며, 시스템의 높은 성능을 발휘시킬 수 있다.
또한 C 언어를 발전시킨 프로그래밍 언어로 C++ (시 플러스 플러스)라는 언어가 있다. 이는 C 언어에 객체 지향이라는 개념을 도입한 것으로, 거대하고 유연한 시스템을 구축할 때 적합하다. C++는 많은 개발 현장에서 사용되고 있는데, 이것도 C언어가 기반이 되고 있다.
이 책에서는 C 언어를 배움으로써 C 언어에서 파생된 많은 프로그래밍 언어 학습의 길을 열 수 있을 것이다. 현재는 다양한 기술과 프로그래밍 언어들 이 속속 등장하고 있는데, 그 대부분은 C 언어의 영향을 받고 있다. C 언어를 아는 것은 상급 프로그래머의 첫 걸음이 되기도 한다.