맨위로가기 타임라인 바로가기

C (프로그래밍 언어)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
타임라인 바로가기

1. 개요

C는 1972년 데니스 리치에 의해 개발된 절차적 프로그래밍 언어이다. B 언어를 계승하여 만들어졌으며, 1989년 ANSI C 표준이 제정되었다. C는 시스템 프로그래밍, 운영 체제, 임베디드 시스템 등 다양한 분야에서 활용되며, 하드웨어를 직접 제어할 수 있는 저수준 기능을 제공한다. C는 이식성, 자유도, 실행 속도, 컴파일 속도 등을 추구하여 컴파일된 코드의 안전성을 희생했다는 단점도 가지고 있으며, 메모리 관리의 어려움과 포인터 사용의 위험성이 존재한다. C++을 비롯한 많은 프로그래밍 언어에 영향을 미쳤으며, 현재까지도 널리 사용되고 있다.

더 읽어볼만한 페이지

  • 1972년 개발된 프로그래밍 언어 - 프롤로그 (프로그래밍 언어)
    프롤로그는 알랭 콜메로에르가 개발한 논리 프로그래밍 언어로, 사실과 규칙 기반 데이터베이스에 대한 질의를 통해 프로그램을 실행하며, 단일화, 백트래킹, 논리 변수 바인딩을 핵심 특징으로 인공지능, 자연어 처리 등에 활용된다.
  • 1972년 개발된 프로그래밍 언어 - 스몰토크
    스몰토크는 1970년대 제록스 PARC에서 개발된 객체 지향 프로그래밍 언어이며, GUI, 마우스 기술 개발에 기여하고 루비, 자바 등 다양한 언어에 영향을 미쳤으며, 메시지 전달 방식, 동적 타이핑, 이미지 기반 등의 특징을 가진다.
  • 시스템 프로그래밍 언어 - 스위프트 (프로그래밍 언어)
    2014년 애플 세계 개발자 컨퍼런스에서 처음 공개된 스위프트는 크리스 래트너가 개발한 애플의 범용 프로그래밍 언어로서, Objective-C를 대체하며 다양한 플랫폼 지원, 모던 문법, 안정성, 인터랙티브한 개발 환경, SwiftUI 등의 특징을 가진다.
  • 시스템 프로그래밍 언어 - 러스트 (프로그래밍 언어)
    러스트는 모질라 재단 후원으로 개발된 시스템 프로그래밍 언어로서, 높은 안정성과 병렬성을 제공하며 메모리 안전성을 보장하고 효율적인 리소스 관리를 가능하게 하여 웹 브라우저 엔진, 운영체제, 웹 서비스 등 다양한 분야에서 활용되며 개발자들에게 인기가 높다.
  • ISO 표준 프로그래밍 언어 - SQL
    SQL은 관계형 데이터베이스 관리 시스템에서 데이터를 관리하고 조작하기 위해 설계된 표준 프로그래밍 언어로서, 데이터 정의어, 데이터 조작어, 데이터 제어어를 포함하는 다양한 명령어 문법을 제공하며 ANSI와 ISO에 의해 표준으로 채택되었다.
  • ISO 표준 프로그래밍 언어 - 자바스크립트
    자바스크립트는 웹 페이지에 동적인 기능을 추가하기 위해 개발된 프로그래밍 언어로, 초기에는 라이브스크립트라 불렸으나 자바의 인기에 힘입어 변경되었고, ECMAScript로 표준화되어 웹 브라우저와 Node.js 등 다양한 환경에서 활용되지만, 오라클의 상표권 소유로 논란이 있다.
C (프로그래밍 언어) - [IT 관련 정보]에 관한 문서
기본 정보
이름C
"C 프로그래밍 언어"의 첫 번째 판 표지에 사용된 로고타입
발음IPA: /siː/
이름의 유래영어 알파벳 C에서 따와서 발음함.
개발
패러다임다중 패러다임: 명령형 프로그래밍(절차적 프로그래밍), 구조적 프로그래밍
설계자데니스 리치
개발자ANSI X3J11 (ANSI C); ISO / IEC JTC 1 (합동 기술 위원회 1) / SC 22 (분과 위원회 22) / WG 14 (작업 그룹 14) (ISO C)
첫 발표1972년
최신 버전C23
최신 버전 출시일2024년 10월 31일
최신 미리보기 버전C2y (N3220)
최신 미리보기 날짜2024년 2월 21일
특징
형식정적 타이핑, 약한 타이핑, 명시적 타이핑, 명목적 타입 시스템
구현체pcc
GCC
Clang
인텔 C
C++빌더
마이크로소프트 비주얼 C++
왓콤 C
방언사이클론
Unified Parallel C
Split-C
Cilk
C*
영향 받은 언어B (BCPL, CPL)
알골 68
PL/I
포트란
영향을 준 언어AMPL
AWK
C 셸
C++
C--
C#
오브젝티브-C
D
Go
자바
자바스크립트
JS++
줄리아
림보
LPC

PHP
파이크
프로세싱
파이썬
러스트
Seed7
V (Vlang)
발라
베릴로그

지그
운영 체제크로스 플랫폼
파일 확장자.c, .h
기타
웹사이트ISO 표준
ISO/IEC JTC1/SC22/WG14

2. 역사

C 언어는 1963년에 ALGOL 60에서 파생된 CPL을 시작으로, 1969년 BCPL, 1970년 B 언어를 거쳐 발전해왔다. 1972년 벨 연구소데니스 리치가 B 언어를 기반으로 C 언어를 개발했다.[95]

C 언어의 발전 과정은 다음과 같다.

C 언어 발전 연표
연도표준설명
1972(없음)벨 연구소에서 데니스 리치가 C 언어 개발
1978K&R CThe C Programming Language 초판 출간, 비공식 표준 역할
1983(없음)미국 국가 표준 협회(ANSI)에서 짐 브로디 주축으로 X3J11 위원회 소집, C 언어 표준화 시작
1989, 1990ANSI C, C89, C90ANSI X3.159-1989, ISO/IEC 9899:1990 표준 제정
1999C99ISO/IEC 9899:1999 표준 제정
2011C11ISO/IEC 9899:2011 표준 제정
2018C17ISO/IEC 9899:2018 표준 제정[94]
2024C23ISO/IEC 9899:2024 표준 제정[26]



C 언어는 유닉스 운영체제 개발과 밀접하게 관련되어 있다. 초기 유닉스는 PDP-7에서 어셈블리어로 개발되었으나, PDP-11로 이식하면서 B 언어의 한계를 극복하기 위해 C 언어가 개발되었다. 1973년 C 언어에 `struct` 형이 추가되면서 유닉스 커널의 상당 부분을 C로 작성할 수 있게 되었다.

C 언어 개발 초기에는 이 입력 단말기로 사용되었다.[73] 당시에는 "{" 및 "}" 입력을 지원하는 단말기가 일반적이지 않았기 때문에, C 언어는 벨 연구소 내부에서 사용되는 것을 우선적으로 고려한 언어였다.

1978년 브라이언 커니핸데니스 리치의 저서 ''The C Programming Language'' (K&R)가 출간되면서 C 언어는 널리 알려지게 되었고, 이 책은 오랫동안 C 언어의 비공식 표준 역할을 했다.

1983년 ANSI에서 C 언어 표준화를 위한 위원회가 소집되었고, 1989년 ANSI C(C89) 표준이 제정되었다. 1990년에는 ISO에서 C90 표준으로 채택되었다. 이후 1999년 C99, 2011년 C11, 2018년 C17, 2024년 C23 표준이 발표되었다.

2. 1. 초기 개발

1969년부터 1973년까지 AT&T 벨 연구소에서 데니스 리치와 켄 톰슨을 중심으로 C 언어가 개발되었다.[95] 데니스 리치에 따르면, 가장 활발하게 개발이 진행된 시기는 1972년이었다. C 언어라는 이름은 B 언어에서 유래되었으며, 켄 톰슨에 의하면 B 언어는 BCPL의 축소판이었다.

C 언어의 개발자인 켄 톰슨과 데니스 리치.


초기에 PDP-7어셈블리어로 구현되었던 유닉스 운영체제의 개발과 C 언어의 기원은 밀접하게 연관되어 있다. 이들은 유닉스를 PDP-11로 포팅하기로 결정했는데, PDP-11의 기능을 활용하지 못하는 B 언어의 한계로 인해 C 언어의 초기 버전이 개발되었다.

1973년에 `struct` 자료형이 추가되면서, C 언어는 유닉스 운영체제의 대부분을 C 언어로 작성할 수 있을 만큼 강력해졌다. 이는 어셈블리어가 아닌 언어로 구현된 최초의 운영체제 커널 중 하나였다. (더 빠른 사례로는 PL/I로 작성된 Multics 시스템과 ALGOL로 작성된 Burroughs B5000을 위한 MCP(Master Control Program)가 있다.) 1977년경, 리치와 스티븐 C. 존슨은 유닉스의 이식성을 높이기 위해 C 언어를 추가적으로 변경했고, 존슨의 Portable C Compiler는 새로운 플랫폼에서 C 언어를 구현하는 기반이 되었다.[96]

톰슨은 새로운 플랫폼을 위한 유틸리티를 개발하기 위해 프로그래밍 언어를 원했다. 그는 처음에 포트란 컴파일러를 작성하려 했으나, 곧 포기하고 BCPL의 축소판을 만들었다. 당시 BCPL의 공식 설명서는 없었고,[13] 톰슨은 구문을 덜 '장황하게' 하고 SMALGOL이라는 단순화된 ALGOL과 유사하게 수정했다.[14] 그는 결과물을 '''B''''라고 불렀으며,[16] "대부분의 SMALGOL 구문을 가진 BCPL 의미론"이라고 설명했다.[14] BCPL처럼 B는 새로운 기계로 이식하기 쉽도록 부트스트래핑 컴파일러를 가지고 있었다.[14] 그러나 B는 너무 느리고 바이트 주소 지정 가능성과 같은 PDP-11 기능을 활용할 수 없었기 때문에 B로 작성된 유틸리티는 거의 없었다.

1971년 리치는 더욱 강력한 PDP-11의 기능을 활용하기 위해 B 언어를 개선하기 시작했다. 중요한 추가 기능으로는 문자 자료형이 있었다. 그는 이것을 "New B"(NB)라고 불렀다.[14] 톰프슨은 NB를 사용하여 유닉스 커널을 작성하기 시작했고, 그의 요구 사항은 언어 개발의 방향을 형성했다.[14][17] 1972년까지 NB 언어에 더욱 풍부한 자료형이 추가되었다. NB는 `int`와 `char`의 배열을 갖게 되었다. 포인터, 다른 자료형에 대한 포인터를 생성하는 기능, 모든 자료형의 배열, 그리고 함수에서 반환될 자료형이 모두 추가되었다. 식 내의 배열은 포인터가 되었다. 새로운 컴파일러가 작성되었고, 언어의 이름은 C로 바뀌었다.[16]

C 컴파일러와 그것으로 만들어진 일부 유틸리티는 버전 2 유닉스, 즉 리서치 유닉스에 포함되었다.[15]

2. 2. K&R C

1978년 브라이언 커니핸데니스 리치가 ''The C Programming Language''라는 책의 초판을 출간했다. C 프로그래머들에게는 커니핸과 리치의 앞 글자를 딴 "K&R"로 불리는 이 책은 오랫동안 C의 비공식적 규격 역할을 했다. 이 책에서 정의된 C 언어는 "K&R C"라고 불린다. 이 책의 2판에서는 이후 ANSI C 표준을 다루었다.

''The C Programming Language''의 표지


K&R C에는 다음과 같은 기능이 도입되었다.

  • 표준 입출력 라이브러리
  • `long int` 자료형
  • `unsigned int` 자료형
  • `=-`와 같은 형태의 복합 대입 연산자를 `-=` 형태로 변경.
  • * `i=-10`이라는 코드는 원래 의도한 `i =- 10` (i의 값을 10 차감)이 아닌, `i = -10` (i의 값을 -10으로 설정)으로 해석될 수 있기 때문에 중의성을 없애기 위해 변경되었다.

2. 3. ANSI C와 ISO C

1983년 미국 국가 표준 협회(ANSI)는 C 언어 표준화를 위해 짐 브로디 주축으로 X3J11 위원회를 소집했다.[18] 1989년, C 표준은 ANSI X3.159-1989 "프로그래밍 언어 C"로 승인되었다. 이 버전의 언어는 종종 ANSI C, 표준 C 또는 C89로 불린다.

1990년 ANSI C 표준(서식 변경 포함)은 국제 표준화 기구(ISO)에 의해 ISO/IEC 9899:1990으로 채택되었는데, 이는 때때로 C90으로 불린다. 따라서 "C89"와 "C90"는 동일한 프로그래밍 언어를 의미한다.

C 표준화 과정의 목표 중 하나는 K&R C의 상위 집합을 만들고 이후 도입된 비공식적인 기능들을 많이 통합하는 것이었다. 표준 위원회는 함수 원형(C++에서 차용), `void` 포인터, 국제 문자 집합 및 지역 지원, 그리고 전처리기 개선 등 여러 추가 기능도 포함했다. 매개변수 선언에 대한 구문은 C++에서 사용되는 스타일을 포함하도록 확장되었지만, 기존 소스 코드와의 호환성을 위해 K&R 인터페이스도 계속 허용되었다.

2. 4. C99

1999년에 ISO/IEC 9899:1999 표준이 발표되었는데, 일반적으로 "C99"로 불린다.[24]

C99는 인라인 함수, 여러 가지 새로운 자료형(`long long int` 및 복소수를 나타내는 `complex`형 포함), 가변 길이 배열, 유연 배열 멤버, IEEE 754 부동 소수점 향상된 지원, 가변 매크로(가변 매개변수 개수 매크로) 지원, BCPL 또는 C++처럼 `//`로 시작하는 한 줄 주석 지원 등 여러 가지 새로운 기능을 도입했다.[24] 이러한 기능 중 상당수는 이미 여러 C 컴파일러에서 확장 기능으로 구현되어 있었다.

C99는 대부분 C90과 하위 호환되지만, 일부 측면에서는 더 엄격하다. 특히 형식 지정자가 없는 선언에서 `int`가 암시적으로 가정되지 않는다. C99 지원 가능성을 나타내기 위해 `199901L` 값을 갖는 표준 매크로 `__STDC_VERSION__`이 정의된다. GCC, Solaris Studio 및 기타 C 컴파일러는 현재 C99의 새로운 기능을 대부분 또는 전부 지원한다. 그러나 Microsoft Visual C++의 C 컴파일러는 C89 표준과 C++11과의 호환성에 필요한 C99의 일부만 구현한다.[25]

또한 C99 표준에서는 이스케이프 문자(예: `\u0040` 또는 `\U0001f431`) 형태의 유니코드를 사용하는 식별자 지원이 필요하며, 원시 유니코드 이름 지원을 제안한다.

2. 5. C11

2007년에 C 표준의 또 다른 개정 작업이 시작되었는데, 비공식적으로 "C1X"라고 불렸다. 2011년 12월 8일 ISO/IEC 9899:2011로 공식 발표되었다.[94] C 표준 위원회는 기존 구현에서 테스트되지 않은 새로운 기능의 채택을 제한하기 위한 지침을 채택했다.

C11 표준은 형식 일반 매크로, 익명 구조체, 향상된 유니코드 지원, 원자 연산, 다중 스레딩 및 경계 확인 함수를 포함하여 C 및 라이브러리에 여러 가지 새로운 기능을 추가한다. 또한 기존 C99 라이브러리의 일부를 선택 사항으로 만들고 C++와의 호환성을 개선한다. 표준 매크로 `__STDC_VERSION__`은 C11 지원을 나타내기 위해 `201112L`로 정의된다.

2. 6. C17

2018년에 ISO/IEC 9899:2018 표준(C17)이 발표되었다.[94] C17은 C11의 결함에 대한 기술적 수정 및 명확화를 진행하였다.

2. 7. C23

2024년 ISO/IEC 9899:2024 표준(C23)이 발표되었다.[26] 새로운 기능이 추가되고 기존 기능이 개선되었다. C23 지원 가능성을 나타내는 표준 매크로 `__STDC_VERSION__`은 `202311L`로 정의된다.[26]

3. 문법

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

데니스 리치(오른쪽), C 프로그래밍 언어의 발명가, 켄 톰프슨과 함께


C는 ALGOL 계열의 명령형, 절차적 언어이다. C는 정적 타입 시스템을 가지고 있으며, 모든 실행 코드는 서브루틴(함수라고도 하지만, 함수형 프로그래밍의 의미와는 다르다) 내에 포함되어 있다. 함수 매개변수는 값에 의한 전달 방식으로 전달되지만, 배열은 포인터(배열의 첫 번째 항목의 주소)로 전달된다. C에서는 참조에 의한 전달을 참조되는 대상에 대한 포인터를 명시적으로 전달하여 시뮬레이션한다.

C 프로그램 소스 텍스트는 자유 형식 코드이다. 세미콜론은 문장을 끝내고, 중괄호는 문장을 블록으로 그룹화하는 데 사용된다.

C 언어는 다음과 같은 특징을 나타낸다.

  • 제어 흐름 기본 요소를 포함하여 소수의 고정된 키워드를 가지고 있다: `if/else`, `for`, `do/while`, `while`, 그리고 `switch`. 사용자 정의 이름은 어떤 종류의 시길에 의해서도 키워드와 구별되지 않는다.
  • 많은 산술, 비트 연산, 그리고 논리 연산자를 가지고 있다.
  • 하나의 문장에서 여러 개의 대입을 수행할 수 있다.
  • 함수:
  • 필요하지 않을 때 함수 반환 값을 무시할 수 있다.
  • 함수 및 데이터 포인터는 임시 런타임 다형성을 허용한다.
  • 함수는 다른 함수의 어휘 범위 내에서 정의될 수 없다.
  • 변수는 함수 내에서 범위를 가지고 정의될 수 있다.
  • 함수는 자신을 호출할 수 있으므로 재귀가 지원된다.
  • 데이터 타입은 정적이지만, 약하게 적용된다. 모든 데이터에는 타입이 있지만, 암시적 변환이 가능하다.
  • 사용자 정의(typedef) 및 복합 타입이 가능하다.
  • 이종 집계 데이터 타입(struct)을 통해 관련 데이터 요소를 단위로 액세스하고 할당할 수 있다.
  • 공용체는 겹치는 멤버를 가진 구조체이며, 여러 데이터 타입이 같은 메모리 위치를 공유할 수 있도록 한다.
  • 배열 인덱싱은 포인터 산술 연산으로 정의된 보조 표기법이다.
  • `enum` 키워드를 사용하여 열거형이 가능하다. 정수와 자유롭게 상호 변환 가능하다.
  • 문자열은 별개의 데이터 타입이 아니지만, 관례적으로 구현되는 널 종료 문자 배열이다.
  • 컴퓨터 메모리에 대한 저수준 액세스는 기계 주소를 포인터로 변환하여 가능하다.
  • 절차(값을 반환하지 않는 서브루틴)는 빈 반환 타입 `void`를 가진 함수의 특수한 경우이다.
  • 메모리는 라이브러리 루틴 호출을 사용하여 프로그램에 할당될 수 있다.
  • 전처리기는 매크로 정의, 소스 코드 파일 포함 및 조건부 컴파일을 수행한다.
  • 기본적인 형태의 모듈성이 있다. 파일은 별도로 컴파일되어 링크될 수 있으며, `static` 및 `extern` 속성을 통해 다른 파일에 표시되는 함수 및 데이터 객체를 제어할 수 있다.
  • I/O, 문자열 조작 및 수학 함수와 같은 복잡한 기능은 일관되게 라이브러리 루틴에 위임된다.
  • 컴파일 후 생성된 코드는 기본 플랫폼에 대한 요구 사항이 비교적 간단하여 운영 체제를 만드는 데 적합하고 임베디드 시스템에서 사용하기에 적합하다.


C는 C 표준에 의해 명시된 형식 문법을 가지고 있다.[29] 일반적으로 C에서는 줄 바꿈이 중요하지 않지만, 전처리 단계에서는 줄 경계가 중요하다. 주석은 `/*`와 `*/` 구분 기호 사이에 나타나거나, (C99부터) `//` 다음에 줄 끝까지 나타날 수 있다.

C 소스 파일은 선언과 함수 정의를 포함한다. 함수 정의는 차례로 선언과 문장을 포함한다. 선언은 struct, union, enum과 같은 키워드를 사용하여 새로운 형식을 정의하거나, 일반적으로 형식에 이어 변수 이름을 작성하여 새로운 변수에 형식을 할당하고 저장 공간을 예약한다. charint와 같은 키워드는 내장 형식을 지정한다. 코드 섹션은 중괄호({})로 묶여 선언의 범위를 제한하고 제어 구조에 대한 단일 문장으로 작용한다.

명령형 언어로서 C는 ''문장''을 사용하여 작업을 지정한다. 가장 일반적인 문장은 ''식 문장''으로, 평가할 식과 세미콜론으로 구성된다. 평가의 부작용으로 함수를 호출하고 변수에 새 값을 할당할 수 있다. 문장의 일반적인 순차적 실행을 수정하기 위해 C는 예약 키워드로 식별되는 여러 제어 흐름 문장을 제공한다. 구조적 프로그래밍if ... [else] 조건부 실행과 do ... while, while, for 반복 실행(반복)에 의해 지원된다. for 문에는 별도의 초기화, 테스트 및 재초기화 식이 있으며, 이 중 일부 또는 모두를 생략할 수 있다. breakcontinue는 루프 내에서 사용할 수 있다. Break는 가장 안쪽의 둘러싸는 루프 문을 종료하는 데 사용되며, continue는 재초기화로 건너뛰는 데 사용된다. 함수 내의 지정된 레이블로 직접 분기하는 비구조적 goto 문도 있다. switch는 정수 식의 값을 기반으로 실행할 case를 선택한다.

식은 다양한 내장 연산자를 사용할 수 있으며 함수 호출을 포함할 수 있다. 함수에 대한 인수와 대부분의 연산자에 대한 피연산자를 평가하는 순서는 지정되지 않았다. 평가는 심지어 섞일 수도 있다. 그러나 모든 부작용(변수에 대한 저장 포함)은 다음 "시퀀스 포인트" 전에 발생한다. 시퀀스 포인트에는 각 식 문장의 끝과 각 함수 호출의 시작과 반환이 포함된다.

기본 C 소스 문자 집합에는 다음 문자들이 포함된다.

  • 소문자 및 대문자: `a`–`z`, `A`–`Z` (ISO 기본 라틴 알파벳)
  • 숫자: `0`–`9`
  • 특수 문자: `! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~`
  • 공백 문자: `공백`, `수평 탭`, `수직 탭`, `폼 피드`, `줄 바꿈`


`줄 바꿈` 문자는 텍스트 줄의 끝을 나타낸다.

문자열 리터럴에는 추가적인 다중 바이트로 인코딩된 문자를 사용할 수 있지만, 완전히 이식 가능하지는 않다. 최신 C 표준(C11)에서는 `\uXXXX` 또는 `\UXXXXXXXX` 인코딩을 사용하여 다국어 유니코드 문자를 C 소스 텍스트에 이식 가능하게 포함할 수 있다.

기본 C 실행 문자 집합에는 위와 같은 문자들과 경고, 백스페이스, 캐리지 리턴에 대한 표현이 포함된다.

다음 예약어는 대소문자를 구분한다.

C89에는 32개의 예약어(키워드라고도 함)가 있으며, 미리 정의된 용도 이외의 다른 목적으로 사용할 수 없다.

  • `auto`
  • `break`
  • `case`
  • `char`
  • `const`
  • `continue`
  • `default`
  • `do`
  • `double`
  • `else`
  • `enum`
  • `extern`
  • `float`
  • `for`
  • `goto`
  • `if`
  • `int`
  • `long`
  • `register`
  • `return`
  • `short`
  • `signed`
  • `sizeof`
  • `static`
  • `struct`
  • `switch`
  • `typedef`
  • `union`
  • `unsigned`
  • `void`
  • `volatile`
  • `while`


C99에서는 5개의 예약어가 추가되었다.

  • `inline`
  • `restrict`
  • `_Bool`
  • `_Complex`
  • `_Imaginary`


C11에서는 7개의 예약어가 추가되었다.[30]

  • `_Alignas`
  • `_Alignof`
  • `_Atomic`
  • `_Generic`
  • `_Noreturn`
  • `_Static_assert`
  • `_Thread_local`


C23에서는 15개의 예약어가 더 추가되었다.

  • `alignas`
  • `alignof`
  • `bool`
  • `constexpr`
  • `false`
  • `nullptr`
  • `static_assert`
  • `thread_local`
  • `true`
  • `typeof`
  • `typeof_unqual`
  • `_BitInt`
  • `_Decimal32`
  • `_Decimal64`
  • `_Decimal128`


최근에 추가된 대부분의 예약어는 밑줄과 대문자로 시작하는데, 이는 이러한 형식의 식별자는 이전에 C 표준에서 구현에서만 사용하도록 예약되어 있었기 때문이다.

C는 구조적 프로그래밍 패러다임을 따르는 고급 절차적 언어이다. 하드웨어를 직접 제어할 수 있는 기능을 갖추면서도 기계어어셈블리어(어셈블러)와 같은 저수준 언어에 비해 소스 코드의 재사용성과 유지보수성이 뛰어나다.

  • 범용성 및 프로그램의 자유도가 높고, 자원 및 성능 요구사항이 까다로운 용도에도 견딜 수 있으므로, 응용 소프트웨어 개발뿐만 아니라 OS와 장치 드라이버, 펌웨어 작성 등 모든 분야에서 사용된다.
  • 지원하는 기기의 범위가 넓다.
  • 상용·비상용을 막론하고 채택 소프트웨어 분야가 넓다. 프로그램 작성 및 디버깅을 위한 보조적인 소프트웨어(프로그래밍 도구)가 풍부하다.
  • 소스 코드를 기계어로 변환하는 소프트웨어(컴파일러) 등의 개발 환경이 CPU나 OS에 포함되어 있거나 무상으로 제공되는 경우도 있으므로, 라이선스 비용을 지불하지 않고도 사용을 시작할 수 있다.
  • 초기 개발 시점이 오래되어 기계어의 영향을 강하게 받는 언어 구문을 가지고 있으며, 사양 자체는 단순하지만 명확하지 않고 난해하다.
  • C는 이식성, 자유도, 실행 속도, 컴파일 속도 등을 추구했다. 그 대신 컴파일된 코드의 안전성을 희생했다. 또한, 세부 사항을 표준으로 명확히 규정하지 않고 처리계에 맡기는 부분이 많다.


원래 UNIX와 C 컴파일러의 이식성을 높이기 위해 개발된 배경에서 OS커널 및 컴파일러를 위한 저수준의 기술이 가능하도록 하드웨어를 어느 정도 추상화하면서도 필요에 따라 저수준 언어와 같은 기능을 구현할 수 있는 컴퓨터 중심의 언어 사양이 되어 있다.

C는 아마추어부터 전문 기술자까지 프로그래머 인구가 많고 프로그래머 커뮤니티가 충실하다. 또한 다목적성과 대응 기기의 다양성 때문에 "컴퓨터로 할 수 있는 일"은 대부분 C로 가능하다. 하지만 C로 효율적이고 안전하게 기술할 수 있는지는 별개의 문제이다.

MISRA C나 CERT C와 같은 코딩 표준을 정의하여 위험한 기능의 사용이나 기술을 금지하는 제약을 설정함으로써 C를 안전하게 사용하기 위한 가이드라인이 운영되고 있는 분야도 있다.

  • 문장의 구분은 종결 기호 세미콜론「`;`」로 표시하고, 줄 바꿈 문자나 공백에도 토큰 구분으로서의 의미만을 가지게 하는 "프리 포맷" 형식을 채용하고 있다. 중괄호 `{ }`에 의한 블록 구조 및 범위를 지원한다.
  • ALGOL의 사상을 계승하여 '''구조적 프로그래밍'''에 대응하고 있다. 절차를 중첩 구조로 나타내어 이해하기 쉬운 기술을 할 수 있다. 원칙적으로 '''무조건 분기( `goto`)'''를 사용할 필요가 없다.
  • '''모듈화'''가 파일을 단위로 가능하다. 모듈 내에서만 유효한 이름을 사용할 수 있는 범위를 가지고 있다.
  • 프로그램을 반환값이 있는 서브루틴으로 분리할 수 있다. C언어에서는 이것을 '''함수'''라고 부르며, 함수 내의 프로그램 코드에서는 독립된 범위를 가진 변수(지역 변수)를 사용할 수 있다. 이에 따라 데이터의 흐름이 블록 단위로 완결되므로 디버깅이 용이해지고, 함수의 재귀 호출도 가능해진다.
  • 시스템 기술 언어로 개발되었기 때문에 고급 언어이지만 어셈블러적인 저수준의 조작을 할 수 있다. '''포인터 연산''', 비트 단위의 논리 연산, 시프트 연산 등의 기능을 가지고 하드웨어에 밀착한 처리를 효율적으로 기술할 수 있다. 이것은 운영 체제나 장치 드라이버 등을 기술하는 데 있어서는 편리하지만, 주의 깊게 이용하지 않으면 발견하기 어려운 버그의 원인이 된다.
  • 소스 코드의 기술에 사용하는 문자 집합은 ANSI C (C89) 및 ISO/IEC 9899:1990 (C90)에서는 ASCII를 표준으로 하고 있다.
  • 내장의 정수형 및 부동소수점수형 외에, 구조체, 공용체, 열거형(열거형)에 의한 사용자 정의의 데이터형이나 열거 상수를 지원한다. 구조체 및 공용체는 비트 필드를 지원한다.
  • 많은 처리계가 인라인 어셈블러를 탑재하고 있으며, 어셈블러로 출력한 객체와의 링크가 용이하다.
  • 컴파일러 처리가 1패스로 완료되는 사양이다. 역사적 배경으로 인해, 변수 선언에서 자료형 지정이 없으면 `int`형으로 간주한다. ANSI C(C89)에서는 컴파일 시 자료형 검사 강화를 위해 함수 원형 기능이 도입되었지만, 함수 선언이 없는 경우 반환값은 `int`형으로 간주하고, 인수는 알 수 없음(임의)으로 간주한다. 그러나 이러한 암시적 자료형 지정은 형식 안전성을 저해하고 정의되지 않은 동작을 일으킬 위험이 있으므로, ISO/IEC C:1999(C99) 이후로는 암시적 자료형 지정에 관한 사양이 표준 규격 문면에서 삭제되었다.
  • 매크로 기술이나 컴파일 조건 지정 등을 할 수 있는 전처리 지시문이 표준화되어 있다. 전처리 지시문을 해석하는 '''전처리기'''(preprocessor)를 가지고 있다. 전처리기는 이름 그대로 컴파일 처리 전에 자동으로 실행된다.

처리계의 간소화와 효율을 위해 다음과 같이 안전성을 희생한 사양이 많다.

  • 배열 참조 시 인덱스 값이 범위 내에 있는지 검사하지 않음: 이것을 원인으로 하는 대표적인 버그가 고정 길이 버퍼 영역을 벗어나 데이터 쓰기가 이루어지는 "버퍼 오버플로우"(버퍼 오버런)이다. 범위 밖 액세스는 쓰기뿐 아니라 읽기의 경우에도 정의되지 않은 동작을 일으킨다.
  • 문자열을 저장하기 위한 특별한 형식이 없음: 문자열에는 `char`형 배열을 이용한다. 언어 사양상 특별한 취급은 없지만, 널 문자(`'\0'`)를 종단으로 하는 문자열 표현을 사용하고, 그 조작을 하는 표준 C 라이브러리 함수가 있다.
  • 자동 변수(auto variable)의 자동적인 초기화를 하지 않음: 자동 변수(정적이 아닌 지역 변수)는 변수 중에서 가장 자주 사용된다. 초기화되지 않은 변수를 참조하는 경우 그 값은 불확정이지만, 불확정 값에 대한 액세스는 정의되지 않은 동작이므로, 컴파일러 최적화 과정에서 예상치 못한 형태로 변경될 수도 있다.
  • 소스 코드에서 대소문자를 구분한다.
  • 입출력이나 동적 메모리 할당을 포함한 대부분의 기능은 C 언어 자체로 작성된 라이브러리에 의해 제공된다. 이는 C 언어의 기종 및 환경 의존성이 낮고, 그것들에 의존하는 부분을 라이브러리로 분리함으로써 이식성(포터빌리티)이 높다는 것을 의미한다.
  • 프로그램 실행에 필요한 하드웨어 자원이 어셈블러보다는 많지만 다른 고급 언어보다는 적게 들기 때문에, 현재 다양한 전자 제품 등의 임베디드 시스템에서도 사용되고 있다.
  • 임베디드 시스템의 경우, 프로그래밍 언어로 어셈블러 외에는 C와 C++만 제공되는 경우가 있다.
  • ANSI/ISO에 의해 표준화된 이후로 언어 사양의 변화가 적고 안정적이라는 점, C 언어 프로그래머의 수와 코드 자산이 많다는 점 등으로 인해, API의 외부 사양으로 C 언어 함수 인터페이스가 선택되는 경우가 많다.

3. 1. 연산자

C는 풍부한 연산자 집합을 지원한다. 연산자는 수식 내에서 사용되는 기호로, 해당 수식을 평가하는 동안 수행할 조작을 지정한다. C에는 다음과 같은 연산자가 있다.

종류연산자
산술`+`, `-`, `*`, `/`, `%`
대입`=`
복합 대입=`, `^=`, `<<=`, `>>=`
비트 논리`, `^`
비트 시프트`<<`, `>>`
부울 논리`!`, `&&`, ``
조건부 평가`? :`
동등성 검사`==`, `!=`
함수 호출`( )`
증가 및 감소`++`, `--`
멤버 선택`.`, `->`
객체 크기`sizeof`
자료형`typeof`, `typeof_unqual` (C23부터)
순서 관계`<`, `<=`, `>`, `>=`
참조 및 역참조`&`, `*`, `[ ]`
순차 처리`,`
부수식 그룹화`( )`
자료형 변환`(자료형)`



C는 수학에서 등호를 나타내는 데 사용되는 연산자 `=`를 포트란PL/I의 선례를 따라 대입을 나타내는 데 사용하지만, ALGOL과 그 파생 언어와는 다르다. C는 동등성을 검사하기 위해 연산자 `==`를 사용한다. 대입과 동등성을 위한 연산자 간의 유사성으로 인해 실수로 하나를 다른 것으로 사용할 수 있으며, 많은 경우 실수가 오류 메시지를 생성하지 않는다(일부 컴파일러는 경고를 생성하지만). 예를 들어, 조건부 수식 `if (a == b + 1)`을 실수로 `if (a = b + 1)`로 작성할 수 있는데, 이는 대입 후 `a`의 값이 `0`이 아닌 경우 `true`로 평가된다.[31]

C의 연산자 우선 순위는 항상 직관적이지는 않다. 예를 들어, 연산자 `==`는 `x & 1 == 0`과 같은 수식에서 연산자 `&`(비트 단위 AND) 및 `|`(비트 단위 OR)보다 더 강하게 결합(먼저 실행됨)한다. 이는 코더의 의도라면 `(x & 1) == 0`으로 작성해야 한다.[32]

3. 2. 변수형

C의 자료형 시스템은 정적이며 약하게 형식이 지정된 시스템으로, ALGOL 계열 언어인 파스칼과 유사하다.[34] 다양한 크기의 부호 있는 정수형과 부호 없는 정수형, 부동소수점수, 그리고 열거형(enum)에 대한 기본 자료형이 있다. 정수형 char는 종종 1바이트 문자에 사용된다. C99는 부울 자료형을 추가했다. 배열, 포인터, 레코드(struct), 그리고 공용체(union)를 포함한 파생 자료형도 있다.

C는 종종 저수준 시스템 프로그래밍에 사용되는데, 이 경우 자료형 시스템에서 벗어나는 것이 필요할 수 있다. 컴파일러는 대부분의 표현식에 대해 자료형의 정확성을 보장하려고 하지만, 프로그래머는 다양한 방법으로 이러한 검사를 무시할 수 있다. ''자료형 변환''을 사용하여 값을 명시적으로 한 자료형에서 다른 자료형으로 변환하거나, 포인터 또는 공용체를 사용하여 데이터 객체의 기본 비트를 다른 방식으로 재해석할 수 있다.

일부에서는 C의 선언 구문이 직관적이지 않다고 생각하며, 특히 함수 포인터의 경우 더욱 그렇다고 한다. (리치의 아이디어는 식별자를 사용하는 맥락과 유사하게 선언하는 것이었다: "선언은 사용을 반영한다".)

C의 ''일반적인 산술 변환''을 통해 효율적인 코드를 생성할 수 있지만, 때때로 예상치 못한 결과를 초래할 수 있다. 예를 들어, 같은 크기의 부호 있는 정수와 부호 없는 정수를 비교하면 부호 있는 값을 부호 없는 값으로 변환해야 하는데, 부호 있는 값이 음수이면 예상치 못한 결과가 발생할 수 있다.

3. 3. 포인터

포인터는 메모리 주소값을 저장하는 변수로, C 언어에서 핵심적인 역할을 한다. 김대중 전 대통령이 강조했던 정보화 시대의 핵심 기술인 메모리 관리를 효율적으로 수행하기 위해 포인터를 이해하는 것은 매우 중요하다.

포인터는 다음과 같이 선언한다.

```c

int *ptr; // 정수형 변수를 가리키는 포인터 ptr 선언

```

`*` 기호는 `ptr`이 포인터 변수임을 나타낸다. `int`는 포인터가 가리키는 변수의 자료형을 나타낸다.

포인터 변수는 일반 변수와 달리 선언문과 실행문에서 `*` 사용에 차이가 있다. 선언문에서는 `*`를 사용하여 포인터 변수임을 명시하지만, 실행문에서는 `*` 없이 변수명만 사용한다.

포인터를 사용하기 위해서는 가리키고자 하는 변수의 자료형과 포인터 변수의 자료형이 일치해야 한다. 예를 들어, 정수형 변수를 가리키는 포인터는 정수형 포인터로 선언해야 한다. 자료형이 일치하지 않으면 메모리 공간의 크기 차이로 인해 잘못된 값을 읽어올 수 있다.

일반 변수의 주소는 변수명 앞에 `&`를 붙여서 얻을 수 있다. 예를 들어, `int a;`로 선언된 변수 `a`의 주소는 `&a`로 표현한다.

포인터 변수는 다른 변수의 주소를 저장할 수 있다. 예를 들어, `int *pa;`로 선언된 포인터 `pa`에 변수 `a`의 주소를 저장하려면 `pa = &a;`와 같이 작성한다.

실행문에서 `*`은 곱셈 연산자 외에 참조 연산자로도 사용된다. 참조 연산자는 해당 주소에 저장된 값을 가져오는 역할을 한다. 예를 들어, `*pa`는 포인터 `pa`가 가리키는 주소에 저장된 값을 의미한다. 따라서 `*pa`는 `*&a`와 같고, 결국 `a`의 값과 같다.

포인터를 사용하면 변수의 값을 간접적으로 변경할 수 있다. 예를 들어, `*pa = 10;`은 포인터 `pa`가 가리키는 주소에 값 10을 저장하는 것을 의미한다. 이는 변수 `a`의 값을 10으로 변경하는 것과 같다.
포인터의 핵심 개념:

  • 주소값: 변수의 메모리 주소를 나타낸다.
  • 간접 참조: 변수의 주소를 통해 변수의 값에 접근하는 방식이다.
  • 자료형 일치: 포인터 변수와 가리키는 변수의 자료형은 반드시 일치해야 한다.
  • 참조 연산자 (\*): 포인터가 가리키는 주소의 값을 가져오거나 변경하는 데 사용된다.

포인터의 역할 구분:```c

int *pa = &a; // 선언문: 변수 a의 주소를 포인터 변수 pa에 저장

```

  • `pa`는 포인터 변수이며, `a`의 주소 `&a`를 저장한다.
  • `*pa`는 `a`의 주소 `&a`를 통해 간접 참조한 `a`의 자료값을 의미한다.
  • `&pa`는 포인터 변수 `pa` 자체의 주소를 나타내며, 다중 포인터에서 사용된다.


C 언어에서 포인터는 메모리 관리, 함수 간 데이터 전달, 동적 자료 구조 구현 등 다양한 분야에서 활용된다.

3. 4. 분기문

C 언어는 구조적 프로그래밍을 지원하며, 이는 프로그램을 이해하기 쉽고 관리하기 쉬운 형태로 작성하는 데 도움을 준다. C 언어에서 분기문은 프로그램의 흐름을 제어하는 중요한 역할을 한다. 조건문과 반복문을 사용하여 특정 조건에 따라 코드 실행 여부를 결정하거나, 특정 코드 블록을 반복 실행할 수 있다.

C 언어에서 지원하는 분기문은 다음과 같다:

  • 조건문:
  • `if` 문: 주어진 조건이 참(true)인 경우에만 코드 블록을 실행한다.
  • `else` 문: `if` 문의 조건이 거짓(false)인 경우에 실행할 코드 블록을 지정한다.
  • `switch` 문: 여러 개의 조건을 평가하여 해당하는 코드 블록을 실행한다.
  • 반복문:
  • `for` 문: 주어진 횟수만큼 또는 조건이 참인 동안 코드 블록을 반복 실행한다.
  • `while` 문: 조건이 참인 동안 코드 블록을 반복 실행한다.
  • `do-while` 문: 코드 블록을 최소 한 번 실행한 후, 조건이 참인 동안 반복 실행한다.


C 언어는 `goto` 문을 이용한 무조건 분기를 지원하지만, 구조적 프로그래밍에서는 `goto` 문 사용을 지양한다. `goto` 문은 프로그램의 흐름을 복잡하게 만들고, 코드의 가독성과 유지보수성을 저해할 수 있기 때문이다. MISRA C에서는 `goto` 문 사용을 금지하기도 한다.[64]

4. 메모리 관리

C는 객체(변수 등)를 위한 메모리를 할당하는 세 가지 주요 방법을 제공한다.[33]


  • '''정적 메모리 할당''': 컴파일 시점에 객체를 위한 공간이 바이너리에 제공된다. 이러한 객체는 바이너리가 메모리에 로드되는 동안 수명을 갖는다.
  • '''자동 메모리 할당''': 임시 객체는 스택에 저장될 수 있으며, 이 공간은 선언된 블록이 종료된 후 자동으로 해제되어 재사용될 수 있다.
  • '''동적 메모리 할당''': 이라는 메모리 영역에서 `malloc` 등의 라이브러리 함수를 사용하여 런타임에 임의 크기의 메모리 블록을 요청할 수 있다. 이러한 블록은 `realloc` 또는 `free` 함수를 호출하여 재사용을 위해 해제될 때까지 유지된다.


이 세 가지 방식은 서로 다른 상황에 적합하며 다양한 장단점이 있다. 정적 메모리 할당은 할당 오버헤드가 거의 없지만, 자동 할당은 약간 더 많은 오버헤드가 포함될 수 있으며, 동적 메모리 할당은 할당과 해제 모두에 대해 상당한 오버헤드가 발생할 수 있다. 정적 객체의 지속적인 특성은 함수 호출 간 상태 정보를 유지하는 데 유용하며, 자동 할당은 사용하기 쉽지만 스택 공간은 일반적으로 정적 메모리나 힙 공간보다 훨씬 제한적이고 일시적이다. 동적 메모리 할당을 통해 크기가 런타임에만 알려진 객체를 편리하게 할당할 수 있다. 대부분의 C 프로그램은 이 세 가지 방법을 모두 광범위하게 사용한다.[33]

가능한 경우, 자동 또는 정적 할당이 일반적으로 가장 간단하다. 메모리 저장소가 컴파일러에 의해 관리되므로 프로그래머는 수동으로 저장소를 할당하고 해제하는 오류가 발생하기 쉬운 작업에서 해방되기 때문이다. 그러나 많은 데이터 구조는 런타임에 크기가 변경될 수 있으며, 정적 할당(및 C99 이전의 자동 할당)은 컴파일 시점에 고정된 크기를 가져야 하므로 동적 할당이 필요한 경우가 많다. C99 표준 이전에는 가변 크기 배열이 이러한 일반적인 예였다. (동적으로 할당된 배열의 예는 C 동적 메모리 할당 문서 참조) 자동 할당은 런타임에 제어되지 않는 결과로 실패할 수 있지만, 동적 할당 함수는 필요한 저장소를 할당할 수 없는 경우 널 포인터 값 형태로 표시를 반환한다. (너무 큰 정적 할당은 프로그램이 실행을 시작하기 전에 링커 또는 로더에 의해 일반적으로 감지된다.)

달리 명시되지 않는 한, 정적 객체는 프로그램 시작 시 0 또는 널 포인터 값을 포함한다. 자동 및 동적으로 할당된 객체는 초기 값이 명시적으로 지정된 경우에만 초기화된다. 그렇지 않으면 초기 값이 결정되지 않은 값을 갖는다. 프로그램이 초기화되지 않은 값에 액세스하려고 시도하면 결과가 정의되지 않는다. 많은 최신 컴파일러는 이 문제를 감지하고 경고하려고 하지만 위양성과 위음성이 발생할 수 있다.

힙 메모리 할당은 가능한 한 많이 재사용하기 위해 프로그램에서 실제 사용과 동기화되어야 한다. 예를 들어, 힙 메모리 할당에 대한 유일한 포인터가 범위를 벗어나거나 명시적으로 할당 해제되기 전에 값이 덮어쓰여지면 해당 메모리는 나중에 재사용할 수 없게 되고 프로그램에 손실되는 현상인 ''메모리 누수''가 발생한다. 반대로 메모리가 해제될 수 있지만 나중에 참조되어 예측할 수 없는 결과를 초래할 수 있다. 일반적으로 실패 증상은 오류를 일으키는 코드와 관련이 없는 프로그램의 일부에 나타나 오류를 진단하기 어렵게 만든다. 이러한 문제는 자동 가비지 컬렉션이 있는 언어에서 완화된다.

표준 동적 메모리 처리 방식인 `malloc`과 `free`는 오류 발생 가능성이 높다. 메모리 누수나 이미 해제된 메모리에 접근하는 버그 등이 발생할 수 있다. 이러한 이유로 MISRA C나 CERT C와 같은 코딩 표준을 정의하여 위험한 기능의 사용을 금지하는 제약을 설정함으로써 C를 안전하게 사용하기 위한 가이드라인이 운영되고 있다.

4. 1. 변수와 메모리 맵

C 언어 프로그램에서 변수는 메모리의 특정 위치에 저장된다. 메모리는 크게 정적, 동적, 자동 변수 영역으로 나뉜다.

  • 정적 변수: `static` 키워드를 사용하여 선언하며, 프로그램 시작 시 단 한 번 초기화되고 프로그램 종료 시까지 유지된다.
  • 동적 변수: (heap) 영역을 사용하며, `malloc` 등의 함수를 호출하여 할당받고, `free` 함수를 통해 반납한다.
  • 자동 변수: 함수나 블록(`{}`) 내에서 선언되는 지역 변수로, 스택(stack) 영역에 자동으로 할당된다.


```c

#include

#include

int global_var = 10; // 초기화된 변수

int main() {

static int static_var; // 초기화되지 않은 정적 변수

int auto_var; // 자동 변수

char *dynamic_var = (char *)malloc(10); // 동적 변수

// ...

free(dynamic_var);

return 0;

}

```

위 예제 코드에서 변수들은 다음과 같이 메모리에 배치된다.

변수 종류설명예시
초기화된 변수프로그램 시작 시 값이 지정됨`int global_var = 10;`
초기화되지 않은 변수값이 지정되지 않음`static int static_var;`
자동 변수함수 또는 블록 내에서 선언, 스택에 할당`int auto_var;`
동적 변수`malloc` 등으로 힙 영역에 할당`char *dynamic_var;`



이러한 메모리 배치는 링커에 의해 결정되며, 그룹별로 묶여 세그먼트(segment) 또는 섹션(section)으로 불린다. CPU 및 컴파일러에 따라 세그먼트 이름과 구조는 다를 수 있다.

Visual Studio에서의 세그먼트 예시는 다음과 같다.

변수 형태SEGMENT
초기치 변수DATA
초기치 없는 변수BSS
프로그램 코드TEXT
상수CONST
HEAP
스택STACK



TEXT와 CONST는 ROM/FLASH에 배치될 수 있는 변하지 않는 세그먼트이다. C 언어는 메모리 사용량을 직접 제어해야 하는 임베디드 시스템 개발에 중요하며, 맵 파일을 통해 메모리 구조를 확인할 수 있다.

5. 라이브러리

C 언어는 라이브러리를 확장의 주요 방법으로 사용한다. C에서 라이브러리는 단일 "보관" 파일 안에 포함된 함수 집합이다. 각 라이브러리는 일반적으로 프로그램에서 사용할 수 있는 라이브러리에 포함된 함수의 원형과 이러한 함수와 함께 사용되는 특수 데이터 형식 및 매크로 기호의 선언을 포함하는 헤더 파일을 가지고 있다. 프로그램이 라이브러리를 사용하려면 라이브러리의 헤더 파일을 포함해야 하며, 많은 경우 컴파일러 플래그(예: `-lm`, "수학 라이브러리 연결"의 약자)를 사용하여 라이브러리를 프로그램과 연결해야 한다.[33]

가장 일반적인 C 라이브러리는 C 표준 라이브러리이며, ISO 및 ANSI C 표준에 의해 지정되며 모든 C 구현에 포함된다. 이 라이브러리는 스트림 입출력, 메모리 할당, 수학, 문자열 및 시간 값을 지원한다. 여러 표준 헤더(예: `stdio.h`)는 이러한 표준 라이브러리 기능 및 기타 기능에 대한 인터페이스를 지정한다.

유닉스유닉스 계열 시스템을 대상으로 하는 애플리케이션에서 사용되는 함수들은 커널에 대한 인터페이스를 제공하며, POSIX 및 Single UNIX Specification과 같은 다양한 표준에 자세히 설명되어 있다.

C 컴파일러가 효율적인 오브젝트 코드를 생성하기 때문에 많은 라이브러리가 C로 작성된다. 프로그래머는 라이브러리에 대한 인터페이스를 만들어 자바, , 파이썬과 같은 상위 수준 언어에서 루틴을 사용할 수 있도록 한다.[33]

5. 1. C 표준 라이브러리

C 표준 라이브러리는 함수 형태와 기능이 정해져 있어 개발 도구별로 같다는 특징이 있다. C 표준 라이브러리는 표준 입출력, 문자열 처리, 수학 함수, 시간 함수 등 여러 기능을 제공한다.[64]

파일 입출력(I/O)은 C 언어 자체의 일부가 아니며, C 표준 라이브러리와 `stdio.h` 같은 헤더 파일을 통해 처리된다. 파일 처리는 스트림을 통해 작동하는 고급 I/O를 통해 구현된다. 스트림은 장치와 독립적인 데이터 흐름이고, 파일은 구체적인 장치이다. 고급 I/O는 스트림을 파일과 연결하여 수행된다. C 표준 라이브러리에서는 버퍼가 데이터를 임시로 저장하는 데 사용되어, 느린 장치를 기다리는 시간을 줄인다. 저급 I/O 함수는 표준 C 표준 라이브러리의 일부가 아니지만, 운영 체제에 의존하지 않는 "베어 메탈" 프로그래밍의 일부이다.

C 표준 라이브러리의 함수들은 널 문자(`'\0'`)를 종단으로 하는 문자열 표현을 사용하며, 문자열 조작 함수들은 `char`형 배열을 이용한다.

표준 입출력 함수를 사용하는 예시는 다음과 같다.

```c

/* int puts(const char* s) 를 사용하는 경우. */

#include

int main(void)

{

puts("Hello, world!");

return 0;

}

```

```c

/* int printf(const char* format, ...) 를 사용하는 경우. */

#include

int main(int argc, char* argv[])

{

printf("Hello, world!\n");

return 0;

}

```

`printf` 함수는 서식 문자열과 가변 인수를 받아 서식이 지정된 문자열을 표시할 수 있다.

5. 2. ISO C 라이브러리 헤더

다음은 C 언어의 표준 라이브러리 헤더 파일 목록이다. 각 헤더 파일은 특정한 기능을 제공하며, 프로그램에서 필요한 기능을 사용하기 위해 해당 헤더 파일을 포함해야 한다.

파일명설명
assert 매크로를 지원하며, 논리 오류 및 디버깅 시 오류 유형 등을 검사하는 데 사용된다.
복소수 처리를 위한 기능을 제공한다. (C99 표준)
문자의 종류를 판별하고 대소문자를 변환하는 함수들을 제공한다.
함수에서 발생하는 오류 코드를 검사하고 처리하는 기능을 제공한다.
부동소수점 환경을 제어하는 기능을 제공한다. (C99 표준)
부동소수점 수의 특성(최소 차이, 최대 자릿수, 범위 등)을 정의하는 상수들을 포함한다.
정수형 간의 정확한 변환을 위한 기능을 제공한다. (C99 표준)
ISO 646 문자 집합을 사용하는 환경에서 프로그래밍하기 위한 매크로들을 제공한다. (NA1 표준)
정수형의 특성(최솟값, 최댓값 등)을 정의하는 상수들을 포함한다.
로케일 관련 상수들을 포함하며, 국제화 처리를 지원한다.
일반적인 수학 함수들을 제공한다.
setjmplongjmp 매크로를 선언하여 비지역 점프(non-local jump)를 지원한다.
다양한 예외 상황을 처리하는 기능을 제공한다.
함수에 전달되는 가변 인수를 처리하는 기능을 제공한다. (예: va_start, va_arg, va_end)
논리 자료형(boolean)을 지원한다. (C99 표준)
다양한 정수형을 정의한다. (C99 표준)
유용한 자료형 및 매크로를 정의한다.
C 언어의 핵심 입출력 기능을 제공하며, printf 함수 등을 포함한다.
자료형 변환, 의사 난수 생성, 메모리 할당, 프로세스 제어, 환경 변수, 신호 처리, 탐색, 정렬 등 다양한 기능을 제공한다.
문자열 조작 함수들을 제공한다.
자료형에 따라 적절한 수학 함수를 선택하는 기능을 제공한다. (C99 표준)
시간 및 날짜 변환 함수들을 제공한다.
확장 문자(와이드 문자)를 사용하는 문자열 처리 함수들을 제공하며, 다양한 언어 지원을 위한 핵심 기능이다. (NA1 표준)
확장 문자의 분류 함수들을 제공한다. (NA1 표준)


6. 개발 도구

C 언어 개발에는 다음과 같은 다양한 도구들이 사용된다.


  • GNU 컴파일러 컬렉션(GCC): 유닉스 계열(리눅스) 시스템에서 주로 사용되는 오픈 소스 컴파일러이다. Cygwin이나 MinGW를 통해 윈도우에서도 사용할 수 있다.
  • make: 여러 파일들 간의 의존성과 명령을 정의하여 프로그램 빌드 과정을 자동화하는 도구이다. 주로 Makefile이라는 파일에 기술된 내용을 해석하여 빌드를 수행한다.
  • 이클립스: 다양한 운영체제에서 실행되는 통합 개발 환경(IDE)으로, Eclipse IDE for C/C++ Developers를 통해 C/C++ 개발을 지원한다.
  • 마이크로소프트 비주얼 스튜디오: 마이크로소프트에서 개발한 윈도우 환경 개발 도구이다. C, C++, C# 등 다양한 언어를 지원한다.
  • Microsoft Visual C++ (MSVC): Windows 플랫폼용 C/C++ 컴파일러로, ANSI C를 준수한다.[87]
  • C 표준 라이브러리: 표준 C에서 정의하는 라이브러리 함수를 거의 대부분 사용할 수 있다.[41]
  • Windows SDK: 윈도우 운영체제의 API를 사용할 수 있게 해주는 툴킷이다.[1]

6. 1. GCC

GNU 컴파일러 컬렉션(GCC)은 C/C++ 등 여러 언어를 지원하는 오픈 소스 컴파일러이다. 주로 유닉스 계열(리눅스) 시스템에서 사용되며, 리눅스 운영체제 자체 및 다양한 응용 프로그램 개발에 활용된다. X-Windows 개발 도구로도 사용 가능하다.

GCC는 임베디드 시스템 개발에도 널리 사용된다. 특히 리눅스 커널 기반 임베디드 시스템에서 커널 자체 개발 및 응용 프로그램 개발에 많이 활용된다.

GCC는 다양한 CPU와 운영 체제를 지원하며, 임베디드 시스템을 포함한 광범위한 개발 환경에서 사용되는 유연하고 강력한 컴파일러이다. 독자적인 확장 기능도 많이 제공한다. GCC 4.5 버전에서 C99 표준을, 4.9 버전에서 C11 표준을 사실상 완벽하게 지원하게 되었다.[85][86]

6. 1. 1. make

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

6. 1. 2. Cygwin

GCC윈도우에서 실행할 수 있도록 다시 포팅한 것이다.

6. 1. 3. MinGW

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

6. 2. 이클립스

이클립스는 다양한 운영체제(OS)에서 실행되는 통합 개발 환경(IDE)이다. 따라서 여러 가지 상황에서 다양하게 적용할 수 있다.

6. 2. 1. Eclipse IDE for C/C++ Developers

gcc와 연결하여 C/C++ 언어를 사용하여 프로그램을 개발 할 수 있는 IDE이다. 리눅스의 경우 기존의 gcc을 사용할 수 있도록 연결 설정만 하면 된다. 윈도우에서는 MinGW를 통해 gcc와 연결할 수 있다. MinGW는 다양한 언어를 지원하므로 다른 언어로도 이클립스와 연결하여 개발 도구로 사용할 수 있다.

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

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

비주얼 스튜디오에서 사용 가능한 소프트웨어 개발 키트와 라이브러리는 다음과 같다.

  • Microsoft Visual C++ (MSVC): Windows 플랫폼용 C/C++ 컴파일러이다. ANSI C를 준수하며, 2013 버전에서는 C99 라이브러리를 거의 구현했지만, 언어 기능 등 표준 자체는 지원되지 않았다. x86 및 x64가 주류이지만, Xbox 360, Windows CE 등을 위해 파워PC, ARM, MIPS, 아이테니엄 등을 지원하는 버전도 있다. 전신으로 MS-DOS/Windows용 Microsoft C Compiler가 있으며, 저가형 버전으로 Quick C가 있었다.[87]

6. 3. 1. C 표준 라이브러리

C로 작성된 소프트웨어


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

6. 3. 2. Windows SDK

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

7. 디버깅

C 언어 프로그램 개발 시, 오류를 찾아 해결하는 디버깅은 필수적인 과정이다. 디버깅 방법은 크게 두 가지로 나눌 수 있다.


  • 통합 개발 환경(IDE)을 이용한 디버깅: 비주얼 스튜디오, 이클립스와 같은 IDE는 소스 코드 수준에서 디버깅을 지원한다. '중단점(Break Point)'을 설정하여 특정 지점에서 프로그램 실행을 멈추고 변수 값을 확인하는 등 프로그램 상태를 자세히 살펴볼 수 있다. IDE에 따라 줄 단위 실행, 함수 내부 진입/탈출 등 다양한 기능을 제공한다.

  • printf 함수 등을 이용한 디버깅: IDE 사용이 어려운 환경에서는 `printf`와 유사한 함수를 사용하여 변수 값이나 프로그램 실행 상태를 출력하는 방식으로 디버깅을 수행할 수 있다. UART, 네트워크, USB 등을 통해 출력을 확인할 수 있다. 리눅스 커널에서는 `printk` 함수를 통해 출력 메시지를 파일 형태로 저장하여 확인할 수 있다.


MCU와 같은 임베디드 시스템 개발 환경에서는 고성능 IDE를 사용하기 어려울 수 있어, 저성능 IDE를 사용하거나 UART 등으로 상황을 출력하여 디버깅하기도 한다. 개발자가 직접 디버깅 코드를 추가해야 하는 번거로움이 있지만, 구성이 간단하다.

2003년 인터넷 대란과 같은 소프트웨어 오류로 인한 사고는 디버깅의 중요성을 보여준다. 이러한 사고를 방지하기 위해 개발 과정에서 철저한 디버깅을 수행하고, 안정적인 소프트웨어를 개발하려는 노력이 필요하다.

7. 1. GDB

GNU 디버거GCC를 기반으로 하는 디버깅 도구이다. 따라서 유닉스 계열에서 가장 일반적으로 실행된다. GDB는 응용 프로그램 디버깅, 원격 디버깅, 커널 디버깅 등에 사용될 수 있다.[1]

7. 1. 1. 응용 프로그램 디버깅

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

7. 1. 2. 원격 디버깅

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

7. 1. 3. 커널 디버깅

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

7. 2. IDE 디버깅

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

8. 장점

C는 다른 프로그래밍 언어와 비교하여 다음과 같은 주목할 만한 특징, 즉 장점을 가진다.


  • 구조적 프로그래밍 패러다임을 따르는 고급 절차적 언어이다. 하드웨어를 직접 제어할 수 있으면서도 기계어어셈블리어(어셈블러)와 같은 저수준 언어에 비해 소스 코드의 재사용성과 유지보수성이 뛰어나 프로그램의 변경 및 확장이 용이하다.
  • 범용성이 높고 프로그램의 자유도가 높다. 자원 및 성능 요구사항이 까다로운 용도에도 견딜 수 있으므로, 응용 소프트웨어 개발뿐만 아니라 OS, 장치 드라이버, 펌웨어 작성, 마이컴 제어·기계 제어 등 상위 계층과 하위 계층을 막론하고 모든 분야에서 사용된다.
  • 지원하는 기기의 범위가 넓다. 개인용 컴퓨터워크스테이션은 물론, 자동차나 가전제품의 임베디드마이컴에서 슈퍼컴퓨터까지 C언어를 사용할 수 있는 하드웨어는 다양하다.
  • 상용·비상용을 막론하고 채택 소프트웨어 분야가 넓으며, 프로그램 작성 및 디버깅을 위한 보조적인 소프트웨어(프로그래밍 도구)가 풍부하다.
  • 소스 코드를 기계어로 변환하는 소프트웨어(컴파일러) 등의 개발 환경이 CPU나 OS에 포함되어 있거나 무상으로 제공되는 경우가 많으므로, 라이선스 비용을 지불하지 않고도 사용을 시작할 수 있다.

9. 단점

C는 다른 프로그래밍 언어와 비교하여 몇 가지 주목할 만한 특징이 있다. 초기 개발 시점이 오래되어 기계어의 영향을 강하게 받는 언어 구문(문법)을 가지고 있으며, 사양 자체는 단순하지만 명확하지 않고 난해하다. 이러한 단점을 개선하기 위해 후에 개발된 언어들과 비교했을 때 프로그래머가 작성해야 하는 부분이 많아 저수준 언어처럼 번거롭고 습득하기 어려운 측면이 있다.

C는 이식성, 자유도, 실행 속도, 컴파일 속도 등을 추구했지만, 컴파일된 코드의 안전성을 희생했다. 또한, 세부 사항을 표준으로 명확히 규정하지 않고 처리계에 맡기는 부분이 많아 C로 작성된 소프트웨어에서는 처리계 의존적인 코드가 범람하는 원인이 되었다. 보안상의 취약성이나 잠재적인 버그로 인한 예상치 못한 동작, 컴파일러의 최적화 어려움[61] 등의 문제를 안고 있으며, 최적화하면 컴파일 속도가 느려지는 등의 문제가 발생할 수 있다.

이와 같이 장점이자 동시에 단점이 되는 특징을 가지고 있다.

안전성을 희생한 사양이 많다는 단점도 있다. 호스트 환경이나 프로그램의 내용에 따라서는, 아래에 대한 취약성 대책을 강구하더라도 실행 속도 저하가 무시할 만한 수준인 경우가 많아, 언어 사양 측면의 결점으로 간주되는 경우도 적지 않다.


  • 배열 참조 시 인덱스 값이 범위 내에 있는지 검사하지 않는다. 이것을 원인으로 하는 대표적인 버그가 고정 길이 버퍼 영역을 벗어나 데이터 쓰기가 이루어지는 "버퍼 오버플로우"(버퍼 오버런)이다. 범위 밖 액세스는 쓰기뿐 아니라 읽기의 경우에도 정의되지 않은 동작을 일으킨다. 표준 라이브러리에는 버퍼 오버플로우나 범위 밖 액세스를 고려하지 않은 함수가 있으며, 자주 사용되기 때문에 종종 취약성의 원인이 된다. 또한, C에서는 프로그램에 의해 명시적으로 제어(동적 메모리 할당)함으로써 가변 길이 배열의 구현을 가능하게 하지만, 확보한 영역 밖에 액세스해도 자동적인 확장은 이루어지지 않는다. 후속 언어에서는 표준 라이브러리 또는 내장형에 의해 가변 길이 배열을 지원하거나, 범위 밖 액세스 시 예외(런타임 에러)를 발생시키는 등 안전성을 우선하는 경우가 많다.

  • 문자열을 저장하기 위한 특별한 형식이 없다. 문자열에는 `char`형 배열을 이용한다. 언어 사양상 특별한 취급은 없지만, 널 문자(`\0`)를 종단으로 하는 문자열 표현을 사용하고, 그 조작을 하는 표준 C 라이브러리 함수가 있다. 이것은 실질적으로 메모리 영역에 대한 포인터 액세스 그 자체이며, 확보된 영역의 길이보다 긴 문자열을 쓸 수 있기 때문에 버퍼 오버런의 원흉 중 하나가 되고 있다. 후속 언어에서는 문자열 처리를 특히 강화하고 있는 경우가 많으며, 표준 라이브러리 또는 언어 사양에 의한 내장 문자열 형식을 제공한다.

  • 자동 변수(auto variable)의 자동적인 초기화를 하지 않는다. 자동 변수(정적이 아닌 지역 변수)는 변수 중에서 가장 자주 사용된다. 초기화되지 않은 변수를 참조하는 경우 그 값은 불확정이지만, 불확정 값에 대한 액세스는 정의되지 않은 동작이므로, 컴파일러 최적화 과정에서 예상치 못한 형태로 변경될 수도 있다.[67] 변수 선언·초기화 사양에 의한 제한으로부터, 변수 선언 시점에서는 초기화하지 않고 나중에 대입 등으로 값을 넣어 사용하는 것이 일반적이므로, 잘못하여 불확정 값의 변수를 읽는 버그를 만들기 쉽다. 참고로 자동 변수의 자동이란 변수 영역의 확보와 해제가 자동이라는 의미이며, 자동으로 초기화된다는 의미는 아니다. 후속 언어에서는 명시적인 초기화가 기술되어 있지 않은 변수는 불확정 값이 아니라 그 변수의 형식의 기본값(0 또는 0에 해당하는 값)으로 초기화되는 사양이 되는 경우가 많다.

10. 활용 분야

C는 다른 프로그래밍 언어와 비교하여 몇 가지 주목할 만한 특징을 가진다. 구조적 프로그래밍 패러다임을 따르는 고급 절차적 언어이면서도 하드웨어를 직접 제어할 수 있는 기능을 갖추고 있다. 기계어어셈블리어 같은 저수준 언어에 비해 소스 코드의 재사용성과 유지보수성이 뛰어나 목적에 맞는 프로그램의 변경 및 확장이 용이하다.

C는 범용성이 높고 프로그램의 자유도가 높아, 자원 및 성능 요구사항이 까다로운 용도에도 견딜 수 있다. 응용 소프트웨어 개발뿐만 아니라 운영 체제, 장치 드라이버, 펌웨어 작성, 마이컴 제어·기계 제어 등 상위 계층과 하위 계층을 막론하고 모든 분야에서 사용된다.

개인용 컴퓨터워크스테이션은 물론, 자동차나 가전제품의 임베디드마이컴에서 슈퍼컴퓨터까지 C언어를 사용할 수 있는 하드웨어는 다양하여 지원하는 기기의 범위가 넓다.

상용·비상용을 막론하고 채택 소프트웨어 분야가 넓으며, 프로그램 작성 및 디버깅을 위한 보조적인 소프트웨어(프로그래밍 도구)가 풍부하다. 소스 코드를 기계어로 변환하는 소프트웨어(컴파일러) 등의 개발 환경이 CPU나 OS에 포함되어 있거나 무상으로 제공되는 경우도 있으므로, 라이선스 비용을 지불하지 않고도 사용을 시작할 수 있다.

1990년대 중반에는 처음 배우는 프로그래밍 언어로서 주류가 되었으며, 같은 시기에는 게임 전용 기기(게임 콘솔)의 성능 향상과 프로그램의 대규모화, 멀티 플랫폼 전개를 받아들여, 메인 개발 언어가 어셈블러에서 C언어로 이행했다.

하지만 1990년대 후반부터 2000년대 이후는 PC의 성능 향상과 보급, GUI 환경과 객체 지향의 보급, 인터넷 및 웹 브라우저의 보급, 스마트폰의 보급에 따라, 더욱 고수준으로 개발 효율이 높은 언어나 프레임워크를 요구하는 개발자가 증가함에 따라, C++, Visual Basic, 자바, C#, Objective-C, PHP, 자바스크립트 등이 등장했다.

널리 이용되는 프로그래밍 언어의 수는 증가 추세에 있으며, 상대적으로 C언어가 사용되는 경우는 줄어들고 있다. 특히 애플리케이션 소프트웨어 등 상위 계층의 개발에는 C언어보다 기술성이 뛰어난 C++, Java, C# 등 C언어 파생의 후발 언어가 이용되는 경우가 많아지고 있다.

하지만 C언어는 비교적 이식성이 뛰어난 언어이며, 개인 개발/업무용 개발/학술 연구 개발이나 프로프라이어터리/오픈소스를 묻지 않고, 운영 체제나 디바이스 드라이버 등의 하위 계층, 크로스 플랫폼 API의 외부 사양, C++이나 Java 등 고수준 언어의 처리계 및 실행 환경의 구현이 어려운 소규모의 임베디드 시스템 등을 중심으로, 2021년 현재에도 폭넓게 이용되고 있다.

11. 다른 프로그래밍 언어와의 관계



데니스 리치켄 톰프슨과 함께 C 프로그래밍 언어를 발명했다. C는 ALGOL 계열의 명령형, 절차적 언어이며, 정적 타입 시스템을 가지고 있다. C 프로그램 소스 텍스트는 자유 형식 코드이다. 세미콜론은 문장을 끝내고, 중괄호는 문장을 블록으로 그룹화하는 데 사용된다.

C는 C++, 자바 등 많은 후속 언어에 직간접적으로 영향을 미쳤다.[58] Ch와 CINT를 포함한 여러 C 또는 C와 유사한 인터프리터가 있으며, 이는 스크립팅에도 사용할 수 있다.

객체 지향 프로그래밍 언어가 인기를 얻으면서 C++ 및 Objective-C는 객체 지향 기능을 제공하는 두 가지 C 확장이었다. 두 언어는 원래 소스-투-소스 컴파일러로 구현되었다. 즉, 소스 코드는 C로 변환된 다음 C 컴파일러로 컴파일되었다.[59]

C++는 비야르네 스트롭스트룹이 C와 유사한 구문으로 객체 지향 프로그래밍 기능을 제공하기 위해 고안한 언어이다.[60] Objective-C는 C 위에 매우 "얇은" 계층을 덧씌운 형태로, 하이브리드 동적/정적 형식 패러다임을 사용하여 객체 지향 프로그래밍을 허용하는 C의 엄격한 상위 집합이다. Objective-C는 구문을 C와 스몰토크 모두에서 파생한다. C++, Objective-C 외에도 Ch, Cilk 및 Unified Parallel C는 거의 C의 상위 집합이다.

1990년대 중반에는 C 언어가 처음 배우는 프로그래밍 언어로서 주류가 되었다. 또한 같은 시기 게임 콘솔의 성능 향상과 프로그램의 대규모화, 멀티 플랫폼 전개로 인해 메인 개발 언어가 어셈블러에서 C 언어로 이행되었다.

1990년대 후반부터 2000년대 이후에는 PC의 성능 향상과 보급, GUI 환경과 객체 지향의 보급, 인터넷 및 웹 브라우저, 스마트폰의 보급에 따라, C++, Visual Basic, 자바, C#, Objective-C, PHP, 자바스크립트 등 더 높은 수준의 개발 효율을 가진 언어나 프레임워크를 요구하는 개발자가 증가했다.

하지만 C 언어는 비교적 이식성이 뛰어난 언어이며, 2021년 현재에도 폭넓게 이용되고 있다. 프로그래밍 입문자에게는 파이썬, JavaScript, Swift, 코틀린 등과 같이, 인터랙티브한 대화 환경(REPL, 인터프리터)을 이용할 수 있고, 추상화가 진행되어 번잡한 메모리 관리가 불필요하며, 위험한 기능을 제한한 고수준 언어가 학습하기 쉽지만, 컴퓨터의 동작 원리나 하드웨어 사양을 이해하기 위해서는 C와 같은 원시적인 언어를 사용하는 것이 오히려 쉬울 수도 있다.

C 언어 및 C 언어의 영향을 받은 주요 프로그래밍 언어는 다음과 같다.

언어설명
ALGOL유럽에서 탄생한 알고리즘 기술 언어. 파스칼과 C 언어 등에 영향을 주었다.
BCPL멀틱스에서 만들어진 고급 언어.
B 언어초기 UNIX에서 만들어진 인터프리터 방식의 고급 언어. BCPL을 기반으로 만들어졌으며, C 언어의 원형이 되었다.
C++C 언어를 확장하여 객체 지향적으로 만든 언어. 시뮬라의 영향을 강하게 받았다. 초기에는 C 언어의 슈퍼셋이었지만, 현재는 세부적인 부분에서 비호환 사양이 증가하고 있다.
Objective-CC 언어를 확장하여 객체 지향적으로 만든 언어. C 언어에 스몰토크의 객체 시스템을 추가한 듯한 설계로, 호환성이 유지된다. C 언어에서 확장된 부분이 C++와 간섭하지 않으므로 C++와 혼합하여 작성이 가능하다.
자바C++보다 언어 문법 수준에서 객체 지향을 더 중시한 언어. 버퍼 오버런 등의 위험성이 높은 포인터와 같은 저수준 요소를 언어 문법에서 제거했다. 가상 머신(Java VM, JVM)에서 동작한다.
C#마이크로소프트.NET Framework용으로 개발한 언어. 문법은 C 언어 및 C++와 유사하며, 자바와 비슷한 부분도 있지만, 기능적으로는 델파이가 기반이 되고 있다.
러스트C 언어 및 C++을 대체할 시스템 프로그래밍 언어를 목표로 하는 언어. 언어 수준에서 RAII를 강제하여 자동 메모리 관리 기능을 가지며, 가비지 컬렉션 없이도 수동 메모리 관리가 불필요하고, 실행 성능은 C/C++와 동등하다.
C 언어의 상위 호환 보안 구현. 포인터 처리를 엄격하게 하여 안전성에 중점을 두고 확장한 것이다. 영역 기반 메모리 관리 시스템, 정규 표현식, 태그가 붙은 공용체 등을 추가했다.
시스템C하드웨어 기술 언어용으로 확장한 것. 형식은 C++이다. IEEE 1666-2005. ISO 8866:1991.
하드웨어 기술 언어용으로 확장한 것. 형식은 C이다.
유니파이드 패러렐 C병렬 계산을 위해 C99을 확장하여 만든 언어.
CgC 언어를 GPU 상에서의 3차원 컴퓨터 그래픽스 처리에 특화시킨 것(셰이더 언어, 셰이딩 언어). 엔비디아에서 개발했다.



그 외에도 OpenGL 셰이더 언어인 GLSL, 다이렉트X(다이렉트3D) 셰이더 언어인 HLSL, 오픈CL 커널 기술 언어인 OpenCL-C 등, C 언어의 문법적 특징을 도입한 파생 언어나 DSL이 많이 존재한다.

12. 결론

C는 ALGOL 계열의 명령형, 절차적 언어이며, 정적 타입 시스템을 가지고 있다. C 프로그램 소스 텍스트는 자유 형식 코드이다. 세미콜론은 문장을 끝내고, 중괄호는 문장을 블록으로 그룹화하는 데 사용된다.

C 언어는 다음과 같은 특징을 가지고 있다.


  • if/else, for, do/while, while, switch와 같은 제어 흐름 기본 요소를 포함하여 소수의 고정된 키워드를 가지고 있다.
  • 많은 산술, 비트 연산, 그리고 논리 연산자를 가지고 있다.
  • 하나의 문장에서 여러 개의 대입을 수행할 수 있다.
  • 함수는 필요하지 않을 때 반환 값을 무시할 수 있으며, 함수 및 데이터 포인터는 임시 런타임 다형성을 허용한다. 함수는 다른 함수의 어휘 범위 내에서 정의될 수 없지만, 변수는 함수 내에서 범위를 가지고 정의될 수 있으며, 재귀가 지원된다.
  • 데이터 타입은 정적이지만, 약하게 적용된다. 모든 데이터에는 타입이 있지만, 암시적 변환이 가능하다.
  • 사용자 정의(typedef) 및 복합 타입이 가능하다.
  • 이종 집계 데이터 타입(struct)을 통해 관련 데이터 요소를 단위로 액세스하고 할당할 수 있다.
  • 공용체는 겹치는 멤버를 가진 구조체이며, 여러 데이터 타입이 같은 메모리 위치를 공유할 수 있도록 한다.
  • 배열 인덱싱은 포인터 산술 연산으로 정의된 보조 표기법이다.
  • enum 키워드를 사용하여 열거형이 가능하다.
  • 문자열은 별개의 데이터 타입이 아니지만, 관례적으로 구현되는 널 종료 문자 배열이다.
  • 컴퓨터 메모리에 대한 저수준 액세스는 기계 주소를 포인터로 변환하여 가능하다.
  • 절차(값을 반환하지 않는 서브루틴)는 빈 반환 타입 void를 가진 함수의 특수한 경우이다.
  • 메모리는 라이브러리 루틴 호출을 사용하여 프로그램에 할당될 수 있다.
  • 전처리기는 매크로 정의, 소스 코드 파일 포함 및 조건부 컴파일을 수행한다.
  • 기본적인 형태의 모듈성이 있다.
  • I/O, 문자열 조작 및 수학 함수와 같은 복잡한 기능은 일관되게 라이브러리 루틴에 위임된다.
  • 컴파일 후 생성된 코드는 기본 플랫폼에 대한 요구 사항이 비교적 간단하여 운영 체제를 만드는 데 적합하고 임베디드 시스템에서 사용하기에 적합하다.


C는 객체 지향 및 가비지 컬렉션과 같이 다른 언어에서 찾을 수 있는 특정 기능을 포함하지 않지만, 이러한 기능은 종종 외부 라이브러리를 사용하여 구현하거나 에뮬레이션할 수 있다.

참조

[1] 서적 C in a Nutshell https://books.google[...] O'Reilly Media, Inc. 2005-12-16
[2] 웹사이트 N3221 – Editor's Report, Post January 2024 Strasbourg France Meeting https://www.open-std[...] Open Standards 2024-05-24
[3] 웹사이트 Verilog HDL (and C) https://web.archive.[...] The Research School of Computer Science at the Australian National University 2013-08-19
[4] 서적 Thompson had made a brief attempt to produce a system coded in an early version of C—before structures—in 1972, but gave up the effort. 1993
[5] 서적 The scheme of type composition adopted by C owes considerable debt to Algol 68, although it did not, perhaps, emerge in a form that Algol's adherents would approve of. 1993
[6] 웹사이트 The name is based on, and pronounced like the letter C in the English alphabet https://web.archive.[...] English Chinese Dictionary 2022-11-17
[7] 웹사이트 After All These Years, the World is Still Powered by C Programming {{!}} Toptal https://www.toptal.c[...] 2024-06-15
[8] 웹사이트 C Language Drops to Lowest Popularity Rating https://web.archive.[...] 2022-08-01
[9] 웹사이트 Programming Language Popularity https://web.archive.[...] 2009-01-16
[10] 웹사이트 TIOBE Programming Community Index https://web.archive.[...] 2009-05-06
[11] 뉴스 Annotated C / A Bibliography of the C Language https://archive.org/[...] 2015-01-31
[12] 웹사이트 TIOBE Index for September 2024 https://www.tiobe.co[...] 2024-09-20
[13] 웹사이트 BCPL to B to C https://www.lysator.[...] 2019-09-10
[14] 웹사이트 "A damn stupid thing to do"—the origins of C https://arstechnica.[...] 2022-03-28
[15] 기술보고서 A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 http://www.cs.dartmo[...] 2015-02-01
[16] 서적 1993
[17] 학술지 Portability of C Programs and the UNIX System
[18] 서적 The C Programming Language Prentice Hall 1978-02
[19] 서적 FreeBSD Miscellaneous Information Manual https://nxmnpg.lemod[...] 2021-01-15
[20] 서적 The C Programming Language Prentice Hall 1988-03
[21] 보고서 Sibling rivalry: C and C++ http://stroustrup.co[...] AT&T Labs 2014-04-14
[22] 웹사이트 Rationale for American National Standard for Information Systems – Programming Language – C https://web.archive.[...] 2024-07-17
[23] 서적 C Integrity https://www.iso.org/[...] International Organization for Standardization 2018-07-24
[24] 웹사이트 JTC1/SC22/WG14 – C http://www.open-std.[...] ISO/IEC 2011-06-02
[25] 웹사이트 Interview with Herb Sutter http://www.drdobbs.c[...] 2013-09-07
[26] 웹사이트 WG14-N3132 : Revised C23 Schedule https://www.open-std[...] 2023-06-04
[27] 웹사이트 WG14-N3220 : Working Draft, C2y https://www.open-std[...] 2024-02-21
[28] 웹사이트 TR 18037: Embedded C https://www.open-std[...] 2011-07-26
[29] 서적 C: A Reference Manual Prentice Hall
[30] 웹사이트 ISO/IEC 9899:201x (ISO C11) Committee Draft https://web.archive.[...] 2011-09-16
[31] 웹사이트 10 Common Programming Mistakes in C++ https://web.archive.[...] 2009-06-26
[32] 서적 C and the 8051 https://books.google[...] PageFree Publishing Inc. 2012-02-10
[33] 서적 21st Century C O'Reilly Media
[34] 학술지 Comparison of the Programming Languages C and Pascal 1982-03
[35] 웹사이트 Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE) https://web.archive.[...] fedoraproject.org 2012-08-05
[36] 서적 Programming with C SE-EDUCATION PUBLIC COMPANY LIMITED
[37] 서적 The New Hacker's Dictionary https://books.google[...] MIT Press 2012-08-05
[38] 웹사이트 Man Page for lint (freebsd Section 1) http://www.unix.com/[...] 2001-05-24
[39] 웹사이트 CS107 Valgrind Memcheck https://web.stanford[...] 2023-06-23
[40] 학술지 Purify: Fast Detection of Memory Leaks and Access Errors https://web.stanford[...]
[41] 서적 Programming and problem solving with C++ Jones & Bartlett Learning
[42] 웹사이트 C – the mother of all languages https://web.archive.[...] 2018-11-13
[43] 웹사이트 1. Extending Python with C or C++ https://docs.python.[...]
[44] 웹사이트 An overview of the Perl 5 engine https://opensource.c[...] 2018-01-22
[45] 웹사이트 To Ruby From C and C++ https://www.ruby-lan[...]
[46] 웹사이트 What is PHP? How to Write Your First PHP Program https://www.freecode[...] 2022-08-03
[47] 서적 Dr. Dobb's Sourcebook Miller Freeman, Inc. 1995-11-12
[48] 웹사이트 Using C for CGI Programming http://www.linuxjour[...] linuxjournal.com 2005-03-01
[49] 웹사이트 Web development in C: crazy? Or crazy like a fox? https://medium.com/@[...] 2013-09-17
[50] 웹사이트 After All These Years, the World is Still Powered by C Programming https://www.toptal.c[...] 2023-11-17
[51] 잡지 Dennis Ritchie: The Shoulders Steve Jobs Stood On https://www.wired.co[...]
[52] 웹사이트 Pragma directives and the __pragma and _Pragma keywords https://learn.micros[...] 2022-03-31
[53] 웹사이트 Pragmas (The C Preprocessor) https://gcc.gnu.org/[...]
[54] 웹사이트 Pragmas https://www.intel.co[...] Intel
[55] 웹사이트 In praise of the C preprocessor https://apenwarr.ca/[...] 2007-08-13
[56] 웹사이트 Implementing Exceptions in C http://bitsavers.inf[...] DEC Systems Research Center 1989-03-21
[57] 잡지 Is Java Losing Its Mojo? https://www.wired.co[...] 2013-08-01
[58] 서적 Pillars of computing : a compendium of select, pivotal technology firms Springer 2015-09-24
[59] 서적 Languages and compilers for parallel computing : 16th international workshop, LCPC 2003, College Station, TX, USA, October 2–4, 2003 : revised papers Springer
[60] 웹사이트 A History of C++: 1979–1991 http://www.stroustru[...]
[61] 웹사이트 ポインター・エイリアシングとベクトル化 | iSUS https://www.isus.jp/[...]
[62] 웹사이트 もう一度基礎からC言語 第19回 いろいろな演算子~ビット演算子 Cは高級アセンブラ? https://www.grapecit[...]
[63] 웹사이트 第1回 Chapter 1 C言語の概要(1):Cプログラミング入門|gihyo.jp … 技術評論社 https://gihyo.jp/dev[...]
[64] 문서 他の言語、例えば、BASICやPascalではプログラム開始直後に実行するプログラム要素はサブルーチンや手続きや関数ではない。
[65] 문서 ISO/IEC 14882:2003 §3.6.1 「The function main shall not be used within a program.」
[66] 표준 プログラム言語C++
[67] 웹사이트 EXP33-C. 未初期化のメモリを参照しない https://www.jpcert.o[...] 2014-03-25
[68] 웹사이트 Memory Allocation Guide https://www.kernel.o[...] 2023-11-08
[69] 웹사이트 main 関数 - cppreference.com https://ja.cpprefere[...]
[70] 웹사이트 [Python入門]Pythonってどんな言語なの?:Python入門(1/2 ページ) - @IT https://atmarkit.itm[...]
[71] 웹사이트 Hello, Worldプログラム https://programming-[...]
[72] 웹사이트 Portability of C Programs and the UNIX Systems https://www.bell-lab[...]
[73] 웹사이트 The Evolution of the Unix Time-sharing System https://www.bell-lab[...]
[74] 웹사이트 ソースレベル互換 http://japan.zdnet.c[...]
[75] 웹사이트 http://www.tohoho-we[...]
[76] 뉴스 Rust言語でAndroidはより強固・安全に ~GoogleがOS開発への導入を進める https://forest.watch[...]
[77] 뉴스 Microsoft、Windows 10の一部をRustへ書き換えてセキュリティ強化狙う https://news.mynavi.[...]
[78] 문서 C89においては関数プロトタイプは必須ではない。
[79] 웹사이트 C FAQ 11 http://www.kouno.jp/[...]
[80] 문서 C89規格に準拠しないソースコードをGNU Cコンパイラでコンパイル失敗させる方法
[81] 웹사이트 Arrays of Variable Length http://gcc.gnu.org/o[...]
[82] 문서 setjmp.h 참조
[83] 웹사이트 C の歴史 https://ja.cpprefere[...]
[84] 웹사이트 Clang 拡張 C++ コンパイラ http://docwiki.embar[...]
[85] 웹사이트 Status of C99 features in GCC https://gcc.gnu.org/[...]
[86] 웹사이트 C11Status https://gcc.gnu.org/[...]
[87] 뉴스 Microsoft Releases C Program Wares, Provides Rebates https://books.google[...] InfoWorld 1987-11-09
[88] 간행물 インテル® C++ Composer XE 2011 Windows* 版インストール・ガイドおよびリリースノート http://registrationc[...]
[89] 웹사이트 C99 Support in Intel® C++ Compiler https://software.int[...]
[90] 웹사이트 C11 Support in Intel C++ Compiler https://software.int[...]
[91] 서적 パソコンの常識事典 日本実業出版社 1987
[92] 서적 パソコンベストソフトカタログ JICC出版局 1988
[93] 웹인용 History of C https://en.cpprefere[...] 2020-12-13
[94] 웹인용 History of C - cppreference.com https://en.cpprefere[...] 2021-07-12
[95] 웹인용 The Development of the C Language http://cm.bell-labs.[...] 1993-01
[96] 저널 Portability of C Programs and the UNIX System http://cm.bell-labs.[...] 1978

관련 사건 타임라인

( 최근 20개의 뉴스만 표기 됩니다. )



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com