C (프로그래밍 언어)

개요

C는 실질적으로 모든 컴퓨터 시스템에서 사용할 수 있도록 설계된 프로그래밍 언어이다. 예를 들어 BASIC 등과는 달리 다양한 플랫폼에서 ANSI C의 정의에 따르는 비교적 동일한 구현이 가능하다. 모든 C 시스템에는 정규화된 표준 C 라이브러리가 존재한다. 이런 이유와 생성된 프로그램의 높은 성능이 아직까지도 C 언어가 사랑받는 이유 중 하나이다.
이는 반면 오늘날의 널리 쓰이는 거의 모든 운영 체제 커널이 C를 이용해 구현된 이유이기도 하다. 이처럼 C는 시스템 프로그램 개발에 매우 적합하지만, 응용 프로그램 개발에도 많이 쓰이기도 한다.

초기 개발

C 언어의 초기 개발은 1969년부터 1973년까지 4년에 걸쳐 AT&T 벨 연구소에서 이루어 졌으며, 데니스 리치의 말에 따르면, 가장 창의적인 작업이 이루어진 기간은 1972년이었다. 언어의 이름이 "C"인 이유는 그 특징이 "B" 언어에서 유래되었기 때문이며, 켄 톰슨에 의하면, B 언어는 BCPL 언어의 기본만 남긴 버전이다.
리치와 톰슨에 의해 초기에 PDP-7의 어셈블리 언어로 구현되었던 유닉스 운영체제의 개발과 C 언어의 기원은 밀접하게 연관되어 있다. 결국 그들은 유닉스 운영체제를 PDP-11로 포팅하기로 결정하였다. PDP-11의 기능의 일부, 특히 바이트 접근기능을 활용하지 못하는 B 언어의 부족함이 C 언어의 초기 버전의 개발을 이끌었다.
유닉스의 초기 PDP-11 버전은 어셈블리로 개발되었다. 1973년에 struct 자료형의 추가로, C 언어는 유닉스의 대부분을 C로 쓸 수 있을 정도로 강력해 졌다. 유닉스는 어셈블리가 아닌 언어로 구현된 최초의 운영체제 커널 중의 하나였다.(더 빠른 사례는 PL/I로 쓰인 Multics 시스템, ALGOL로 쓰인 Burroughs B5000을 위한 MCP(Master Control Program)가 있다.) 1977년 경, 리치와 스티븐 C. 존슨이 유닉스 운영체제의 이식성을 향상시키기 위해, C 언어를 추가적으로 변경하였다. 존슨의 Portable C Compiler는 새로운 플랫폼에서의 C의 구현의 기초가 되었다.

C99

C 언어 표준이 상대적으로 정적으로 남아 있었던 동안, C++는 표준화를 위하여 계속 진화하고 있었다. 1995년에 1990년의 C 표준에 대한 규약 수정안 1이 출판되었는데, 이는 약간의 세부 사항을 교정하고 국제적 문자 세트에 대한 보다 확장된 지원을 위한 것이었다. C 표준은 1990년대 후반에 더 개정되어, 1999년 ISO/IEC 9899:1999가 출간되었고, 여기서 명시한 규범을 흔히 C99라 부른다. 이는 기술적 교정에 의하여 현재까지 3번의 수정이 있었다. 국제 C 표준은 실무 그룹 ISO/IEC JTC1/SC22/WG14에 의해 관리되고 있다.

C11

2011년 ISO/IEC 9899:2011이 출간되었고, 간단하게 C11라고 부른다. C11 나오기 전까지 개발 버전을C1X라고 부른다. 최종 개발 버전은 2011년도 4월 N1570이었다.

문법

C는 C 표준에 의해 규정되는 형식 문법을 갖고 있다. 포트란 77과 같은 언어와 달리, C 소스코드는 free-form 언어로써 형식 코드에 공백을 마음대로 넣을 수 있다.

라이브러리

C 언어 함수는 표준함수가 있고, 개발 툴에서 제공하는 함수가 있다. 여러가지 부류가 있고 특성 별로 나누어 lib 파일로 코드를 제공하고 헤더파일로 선언을 알 수 있다.

C 표준 라이브러리

C 표준 라이브러리는 함수 형태와 기능이 정해져 있기 때문에 개발툴별 같다는 특징이 있다.

GCC

유닉스 계열(리눅스)의 시스템에서 주로 사용하는 C/C++ 언어 개발 도구이다. 리눅스의 OS을 제 컴파일하거나, 각종 응용 프로그램 개발에 사용한다. 또한 X-Windows의 개발 도구로도 사용할 수 있다.
전자 장치의 개발 시 임베디드 OS 포팅에서, 리눅스 커널이나 리눅스 커널 기반으로 하는 OS 커널 자체를 개발하는 도구로 사용한다. 리눅스 커널 기반 임베디드에서 실행되는 응용 프로그램 역시 gcc을 많이 사용한다.

make

여러 파일들끼리의 의존성과 각 파일에 필요한 명령을 정의함으로써 프로그램을 컴파일할 수 있으며 최종 프로그램을 만들 수 있는 과정을 서술할 수 있는 표준적인 문법을 가지고 있고, 구조로 기술된 파일(주로 Makefile이라는 파일명)을 [make]가 해석하여 프로그램 빌드를 수행하게 된다.

Cygwin

gcc을 윈도에서 실행 할 수 있도록 재 포팅한 것이다.

MinGW

Cygwin에서 분화 된 gcc 기반 개발 라이브러리 이다.

이클립스

이클립스는 다양한 언어와 다양한 OS에서 실행되는 IDE이다. 따라서 여러가지 상황에서 다양하게 적용할 수 있다.

마이크로소프트 비주얼 스튜디오

마이크로소프트에서 개발, 판매하는 마이크로소프트 윈도우 환경에서 작동하는 개발도구이다. 현재는 C 뿐만 아니라 C++, 자바, C# 등 다양한 언어를 지원하고 있지만 초기의 마이크로소프트 개발 도구는 C 언어로 부터 출발 하였다. 비주얼 스튜디오로는 윈도우 API를 이용한 GUI 프로그램, 명령 줄 인터페이스 환경으로 실행되는 Windows Console Application, 윈도우 서비스, 동적 링크 라이브러리 등의 형태로 소프트웨어를 개발할 수 있고, 최근 버전에서는 모바일 응용 소프트웨어 개발도 지원한다.
비주얼 스튜디오에서 사용 가능한 소프트웨어 개발 키트와 라이브러리는 다음과 같다.

C 표준 라이브러리

표준 C에서 정의하는 라이브러리 함수를 거의 대부분 그대로 사용할 수 있다.

Windows SDK

윈도우 운영체제의 API를 사용할 수 있게 해주는 툴킷이다. 응용프로그램에서 사용 가능한 윈도우 운영체제의 기능은 Windows SDK를 통해 제공된다. 초기에는 C가 기본 언어였으나, 최근에는 C#, C++ 등의 언어 툴킷도 제공한다. 예전에는 Win32 SDK라고 불리었다.

MFC

윈도우 개발에 필요한 Windows API를 클래스로 래핑한 C++ 라이브러리이다.

DirectX

윈도우에서 주로 게임 등을 개발할 때 사용하는 툴킷 이다. 고속의 화면 제어, 음성지원, 3D 등을 지원한다.

GDB

GCC을 기반으로 하는 디버깅 도구이다. 따라서 유닉스 계열에서 가장 일반적으로 실행된다.

응용 프로그램 디버깅

GCC 옵션을 디버깅이 되도록 설정하면 디버깅 테이블을 만든다. gdb 실행 중에 이것을 사용한다. GDB을 실행하여 응용 프로그램을 실행하면서 break, 변수, 함수 등의 디버깅을 할 수 있다.

원격 디버깅

GCC에서 gdb는 서버 구조를 사용할 수 있다. gdb-server을 설치하면 네트워크를 통해 디버깅 환경을 구성할 수 있다. 예를 들어 임베디드 개발 시 리눅스 커널을 포팅하고, 해당 리눅스 시스템에 gdb-server를 설치하면 다른 환경에서 이를 통해 응용 프로그램을 디버깅 할 수 있다. 임베디드의 많은 경우 자신의 시스템에서는 디버깅이 만만치 않다. 따라서 원격으로 gdb의 실행 결과를 전송 할 수 있고 이 정보를 바탕으로 이클립스와 같은 IDE와 연동할 수 있다. 보통 리눅스 기반의 임베디드 개발 환경은 이클립스 C++를 사용할 수 있는데, 이것과 결합할 수 있다.

커널 디버깅

원격 디버깅 모드는 리눅스 커널에 사용되는 소스 수준의 디버거인 KGDB에서도 사용된다. KGDB를 사용하면 커널 개발자는 일반 응용 프로그램과 마찬가지로 커널을 디버깅할 수 있다.

IDE 디버깅

비주얼 스튜디오나 이클립스 등의 도구 들은 기본적으로 디버깅 방법을 제시 한다. 이클립스 디버깅은 GDB와 연동해서 구성할 수 있다.

Hello World 프로그램

#include <stdio.h> // C 표준 라이브러리 stdio.h 를 include 한다. 이것으로 printf 함수등을 사용할 수 있다.int main(void) // 프로그램 호출시 가장 먼저 실행되는 함수{
    printf("hello, world"); // 표준출력에 hello, world라는 문자열을 출력한다.
    return 0;                 // 0을 반환하고 main(void) 종료.}
이 프로그램은 표준출력(stdout)으로 hello, world를 출력한다.