이 문서의 과거 버전 (r1)을 보고 있습니다. 수정일: 2026.02.22 23:23
C는 1972년에 벨 연구소의 데니스 리치가 개발한 명령형 프로그래밍 언어이자 절차적 프로그래밍 언어이다. 이 언어는 시스템 소프트웨어, 특히 운영체제의 개발을 위해 설계되었으며, 그 효율성과 강력함 덕분에 시스템 프로그래밍의 사실상 표준 언어로 자리 잡았다.
C는 B 언어와 BCPL의 영향을 받아 탄생했으며, 저수준의 메모리 조작이 가능한 동시에 고수준의 구조를 제공하는 특징을 가진다. 이는 어셈블리어에 가까운 하드웨어 제어 능력과 높은 이식성을 결합한 결과로, 유닉스 운영체제의 핵심을 비롯한 수많은 시스템의 기반이 되었다.
이 언어의 설계 철학과 문법은 이후 수많은 현대 프로그래밍 언어에 지대한 영향을 미쳤다. C++, C#, Objective-C는 물론, 자바, 자바스크립트, 펄, PHP, 파이썬과 같은 언어들도 C의 문법적 구조나 개념적 토대에서 직접적 또는 간접적으로 영향을 받았다.
오늘날 C는 임베디드 시스템, 운영체제 커널, 장치 드라이버, 고성능 응용 프로그램 개발 등 광범위한 분야에서 여전히 핵심적으로 사용되고 있으며, 컴퓨터 과학 교육에서도 프로그래밍의 근본 원리를 가르치는 데 중요한 역할을 하고 있다.
C 언어는 1972년 벨 연구소에서 데니스 리치가 유닉스 운영체제를 개발하기 위해 만든 프로그래밍 언어이다. 이 언어는 켄 톰슨이 개발한 B 언어와 그 기원이 되는 BCPL 언어의 영향을 직접적으로 받았으며, 당시 시스템 프로그래밍에 주로 사용되던 어셈블리어의 기능을 고수준 언어로 구현하고자 하는 목적을 가지고 탄생했다. 초기 C 언어는 PDP-11 컴퓨터에서 동작하는 유닉스 시스템의 이식성을 높이는 데 핵심적인 역할을 했다.
1978년에 브라이언 커니핸과 데니스 리치가 저술한 《The C Programming Language》라는 책이 출판되면서 C 언어는 사실상의 표준인 'K&R C'로 널리 알려지게 되었다. 이 책은 이후 수십 년 동안 C 언어 학습의 표준 교재로 자리 잡았다. 언어의 폭넓은 사용과 다양한 컴파일러 구현 사이의 호환성 문제를 해결하기 위해, ANSI에서 1989년에 C 언어의 공식 표준인 'ANSI C'를 제정했으며, 이 표준은 1990년에 ISO에서도 채택되었다.
이후 C 언어는 'C99', 'C11', 'C17', 'C23'과 같은 주요 개정을 통해 현대적인 프로그래밍 요구사항을 반복적으로 수용해 왔다. 이러한 표준화 작업은 언어의 핵심적인 간결함과 효율성을 유지하면서도 새로운 하드웨어 아키텍처와 프로그래밍 관행을 지원할 수 있도록 진화하는 계기가 되었다. C 언어의 설계 철학과 문법은 이후 등장한 수많은 프로그래밍 언어, 특히 C++, C#, 자바, 파이썬 등에 지대한 영향을 미쳤다.
C 언어는 시스템 프로그래밍을 위해 설계된 절차적 프로그래밍 언어이다. 어셈블리어에 가까운 저수준 연산을 지원하면서도 이식성이 높은 고급 언어의 장점을 결합한 것이 핵심 특징이다. 이는 운영체제나 컴파일러와 같은 시스템 소프트웨어를 효율적으로 작성하는 데 적합하게 만든다.
이 언어는 간결하고 유연한 문법을 제공하며, 포인터를 통한 직접적인 메모리 주소 접근과 조작을 가능하게 한다. 또한, 구조체와 공용체를 통해 복잡한 데이터 형식을 정의할 수 있고, 라이브러리 함수를 통해 기능을 확장하는 모듈화된 설계를 지향한다. 이러한 특징들은 프로그래머에게 하드웨어를 세밀하게 제어할 수 있는 강력한 능력을 부여한다.
C 언어는 이식성이 매우 높아, 하나의 소스 코드를 다양한 컴퓨터 아키텍처와 운영체제에서 수정 없이 또는 최소한의 수정으로 컴파일하여 실행할 수 있다. 이는 광범위한 표준 라이브러리와 명확한 언어 표준 덕분이다. 이러한 이식성은 C가 임베디드 시스템부터 슈퍼컴퓨터에 이르기까지 폭넓은 플랫폼에서 사용되는 주요 이유가 되었다.
또한, C 언어는 이후 등장한 수많은 프로그래밍 언어에 지대한 영향을 미쳤다. C++와 Objective-C는 직접적인 확장이며, 자바, C#, 자바스크립트, 펄, PHP, 파이썬 등의 문법과 설계 철학에도 깊은 영향을 주었다. 이로 인해 C는 현대 소프트웨어 개발의 기초를 이루는 중요한 언어로 자리 잡았다.
C 언어는 정적 타입 언어로, 프로그램에서 사용하는 모든 변수의 자료형을 컴파일 시점에 명시적으로 선언해야 한다. 기본 제공되는 자료형은 크게 정수형, 실수형, 문자형으로 구분되며, 이들에 대한 한정자와 결합하여 다양한 변형을 만들 수 있다.
정수형은 int 키워드로 선언하며, short, long, long long 같은 한정자를 붙여 크기와 표현 범위를 조절할 수 있다. signed와 unsigned 한정자는 부호의 유무를 결정한다. 실수형은 소수점을 포함하는 수를 표현하며, 단정밀도 float, 배정밀도 double, 확장 배정밀도 long double이 있다. 문자형은 char로 표현되며, 내부적으로는 정수 값으로 저장되어 아스키 코드와 같은 문자 집합에 매핑된다.
또한 C 언어는 사용자가 새로운 자료형을 정의할 수 있는 기능을 제공한다. struct 키워드를 사용하면 서로 다른 자료형의 멤버를 하나의 단위로 묶은 구조체를 만들 수 있다. union은 모든 멤버가 동일한 메모리 공간을 공유하는 자료형을 정의한다. enum은 정수 상수에 기호 이름을 부여하여 열거형을 만든다. 이러한 복합 자료형과 함께 메모리 주소를 직접 다루는 포인터는 C 언어의 가장 강력한 특징 중 하나이다.
자료형 종류 | 키워드 예시 | 설명 |
|---|---|---|
정수형 |
| 소수점 없는 정수를 저장 |
실수형 |
| 소수점을 포함하는 실수를 저장 |
문자형 |
| 단일 문자를 저장 |
파생형 |
| 기본형으로부터 파생 |
사용자 정의형 |
| 프로그래머가 새로운 형식 정의 |
C 언어는 다양한 연산자를 제공하여 데이터를 처리하고 제어 흐름을 결정한다. 연산자는 피연산자의 개수에 따라 단항, 이항, 삼항 연산자로 구분된다. 기본적인 산술 연산자로는 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/), 나머지(%)가 있으며, 이들은 두 개의 피연산자를 필요로 하는 이항 연산자이다.
관계 연산자와 논리 연산자는 프로그램의 흐름을 제어하는 데 핵심적이다. 관계 연산자(==, !=, >, <, >=, <=)는 두 값의 비교 결과로 참(1) 또는 거짓(0)을 반환한다. 논리 연산자(&&, ||, !)는 이러한 참과 거짓 값을 결합하여 복잡한 조건을 만든다. 특히 논리 부정(!)은 단항 연산자에 속한다.
대입 연산자는 변수에 값을 저장하는 역할을 한다. 기본적인 대입(=) 외에도, 산술 연산과 대입을 결합한 복합 대입 연산자(+=, -=, *=, /=, %=)를 제공하여 코드를 간결하게 작성할 수 있다. 증가(++)와 감소(--) 연산자는 변수의 값을 1씩 증가시키거나 감소시키는 단항 연산자로, 전위(++i)와 후위(i++) 형식으로 사용될 수 있다.
조건 연산자(?:)는 C 언어에서 유일한 삼항 연산자이다. 이 연산자는 조건식의 평가 결과에 따라 두 표현식 중 하나를 선택하여 실행한다. 또한, 비트 연산자(&, |, ^, ~, <<, >>)는 정수형 데이터의 개별 비트를 직접 조작하는 데 사용되며, 시스템 프로그래밍이나 하드웨어 제어와 같은 저수준 작업에서 중요하다. 포인터와 관련된 연산자로는 주소 연산자(&)와 간접 참조 연산자(*)가 있다.
C 언어는 명령형 프로그래밍 언어로서, 프로그램의 실행 흐름을 제어하기 위한 다양한 제어 구조를 제공한다. 이러한 구조들은 순차적 실행, 조건에 따른 분기, 반복 실행을 가능하게 하여 복잡한 논리를 구현하는 기초가 된다. 주요 제어 구조로는 조건문과 반복문이 있으며, 이들은 프로그램의 논리적 흐름을 결정하는 핵심 요소이다.
조건문은 특정 조건의 참/거짓 여부에 따라 서로 다른 코드 블록을 실행한다. 가장 기본적인 조건문은 if 문이며, else와 결합하여 사용할 수 있다. 다중 조건 분기가 필요할 경우 else if를 연쇄적으로 사용하거나, 정수형 표현식의 값에 따라 여러 경로로 분기하는 switch 문을 활용할 수 있다. 이러한 조건문은 프로그램이 다양한 상황에 따라 다른 동작을 하도록 만든다.
반복문은 특정 코드 블록을 조건이 만족되는 동안 반복적으로 실행한다. C 언어는 주로 세 가지 형태의 반복문을 제공한다. 조건을 먼저 검사한 후 코드를 실행하는 while 문, 코드를 최소 한 번 실행한 후 조건을 검사하는 do-while 문, 그리고 초기식, 조건식, 증감식을 한 곳에 명시하여 루프 횟수를 명확히 제어할 수 있는 for 문이 있다. for 문은 특히 정해진 횟수만큼의 반복에 효율적이다.
이러한 제어 흐름을 변경하는 데 사용되는 break와 continue 문도 중요하다. break 문은 자신이 속한 가장 안쪽의 switch 문이나 반복문을 즉시 탈출하는 데 사용된다. continue 문은 반복문 내에서 현재 반복의 나머지 부분을 건너뛰고 다음 반복 조건 검사로 바로 이동하도록 한다. 이러한 점프 문들은 반복문 내에서의 세밀한 흐름 제어를 가능하게 한다.
C 언어에서 함수는 프로그램을 구성하는 기본적인 모듈 단위이다. 함수는 특정 작업을 수행하는 코드 블록으로, 프로그램의 구조화와 코드 재사용성을 높이는 핵심 요소이다. C 프로그램의 실행은 항상 main이라는 이름의 특별한 함수에서 시작된다. 모든 함수는 반환 자료형, 함수 이름, 매개변수 목록(괄호 안), 그리고 함수 본문(중괄호 안)으로 정의된다.
함수의 정의는 사용자 정의 함수를 만드는 것이며, 선언(프로토타입)은 컴파일러에게 함수의 존재와 형태를 미리 알려주는 역할을 한다. 함수는 값을 반환할 수 있으며(return 문 사용), 반환값이 없는 경우 반환 자료형을 void로 지정한다. 매개변수를 통해 함수 외부에서 값을 전달받을 수 있고, 함수 내부에서 선언된 변수는 일반적으로 지역 변수로서 그 함수 내에서만 접근 가능하다. 이는 변수의 스코프와 관련된 중요한 개념이다.
함수 호출은 스택 메모리를 사용하여 관리된다. 호출 시 인자 값이 복사되어 함수의 매개변수에 전달되는 '값에 의한 호출' 방식을 기본으로 한다. 이는 원본 데이터를 보호하는 장점이 있지만, 배열이나 구조체와 같은 복합 데이터를 효율적으로 처리하기 위해 포인터를 매개변수로 사용하는 경우도 매우 흔하다. 재귀 호출 또한 지원되어 함수가 자기 자신을 호출할 수 있다.
C의 표준 라이브러리는 printf, scanf, strcpy, malloc 등 다양한 유용한 함수들을 제공한다. 프로그래머는 이러한 라이브러리 함수들을 활용하고, 필요에 따라 자신만의 함수를 정의하여 프로그램의 논리를 명확하고 체계적으로 조직화할 수 있다. 함수를 효과적으로 사용하는 것은 C 프로그래밍에서 모듈화와 절차적 프로그래밍 패러다임을 구현하는 기초가 된다.
포인터는 C (프로그래밍 언어)의 가장 강력하면서도 특징적인 기능 중 하나이다. 포인터는 메모리의 주소를 저장하는 변수로, 다른 변수나 함수의 메모리 위치를 직접 참조하고 조작할 수 있게 해준다. 이는 하드웨어에 대한 저수준 접근을 가능하게 하여 메모리 관리를 효율적으로 수행하고, 복잡한 자료 구조를 구현하는 데 필수적이다. 포인터의 개념은 어셈블리어의 메모리 주소 지정 방식에서 큰 영향을 받았다.
포인터는 주소 연산자(&)와 간접 참조 연산자(*)를 사용하여 다룬다. 예를 들어, 변수의 주소를 얻어 포인터에 저장하거나, 포인터가 가리키는 주소의 실제 값을 읽고 쓸 수 있다. 또한 포인터를 이용한 산술 연산이 가능한데, 이는 포인터가 가리키는 자료형의 크기만큼 주소를 이동시킨다. 이러한 특성은 배열과 밀접한 관계가 있으며, 배열의 이름은 그 배열의 첫 번째 요소를 가리키는 포인터 상수로 해석될 수 있다.
포인터의 주요 활용 분야는 동적 메모리 할당이다. malloc이나 calloc 같은 함수를 사용하여 런타임에 메모리를 할당받으면, 그 메모리 블록의 시작 주소를 포인터가 가리키게 된다. 이를 통해 프로그램 실행 중에 필요한 만큼의 메모리를 유연하게 사용할 수 있다. 또한 포인터는 함수에 매개변수를 전달할 때 참조에 의한 호출 방식을 구현하는 데 사용되며, 구조체와 연결 리스트, 트리 같은 복잡한 자료 구조를 구성하는 핵심 요소로 작동한다.
그러나 포인터의 잘못된 사용은 세그먼테이션 오류나 메모리 누수 같은 심각한 오류를 초래할 수 있다. 초기화되지 않은 포인터를 사용하거나, 이미 해제된 메모리 영역을 참조하는 댕글링 포인터는 예측 불가능한 프로그램 동작을 일으킨다. 이로 인해 포인터는 C 언어 학습의 주요 난관으로 꼽히며, 이후 등장한 자바나 C# 같은 언어에서는 포인터 연산을 제한하거나 완전히 배제하는 방향으로 발전하기도 했다.
C 언어의 핵심적인 부분 중 하나는 풍부한 표준 라이브러리이다. 이 라이브러리는 언어 명세의 일부로, ANSI C와 ISO C 표준에 의해 정의되며, 모든 표준 컴파일러가 제공해야 하는 함수와 매크로의 집합이다. 이 표준 라이브러리는 운영체제나 플랫폼에 의존하지 않는 이식성이 높은 코드를 작성할 수 있게 해주는 기반을 제공한다.
표준 라이브러리는 기능에 따라 여러 개의 헤더 파일로 구성되어 있다. 가장 기본적인 입출력 함수를 제공하는 <stdio.h>는 파일 입출력과 표준 입출력을 담당하며, printf()와 scanf() 함수가 여기에 속한다. 문자열 조작 함수는 <string.h>에, 수학 함수는 <math.h>에, 메모리 동적 할당 함수는 <stdlib.h>에 정의되어 있다. 또한 시간과 날짜 관련 함수는 <time.h>에서, 다양한 유틸리티 함수와 매크로는 <stdlib.h>와 <ctype.h> 등에서 제공된다.
이 라이브러리들은 시스템 프로그래밍부터 응용 프로그램 개발에 이르기까지 광범위한 작업을 지원한다. 예를 들어, <stdlib.h>의 malloc()과 free() 함수는 힙 메모리 관리를, <string.h>의 함수들은 문자열 복사나 비교와 같은 작업을 표준화된 방식으로 수행할 수 있게 한다. 이러한 표준화 덕분에 프로그래머는 특정 하드웨어나 운영체제의 세부 사항을 깊이 알지 못해도 효율적인 프로그램을 개발할 수 있다.
C 표준 라이브러리의 설계 철학은 최소한의 필수 기능을 제공하면서도 효율성과 유연성을 극대화하는 데 있다. 이는 언어 자체의 철학과 일맥상통한다. 결과적으로, 이 라이브러리는 C 언어가 저수준 프로그래밍의 강력함과 고수준 언어의 편의성을 동시에 갖추게 하는 데 결정적인 역할을 했다. 이후 등장한 C++의 표준 라이브러리 역시 C 표준 라이브러리를 포함하며 확장된 형태를 띠고 있다.
C 언어로 작성된 소스 코드는 사람이 읽을 수 있는 텍스트 파일 형태이다. 이 소스 코드를 컴퓨터가 직접 이해하고 실행할 수 있는 기계어로 변환하는 과정을 컴파일이라고 하며, 이 작업을 수행하는 소프트웨어를 컴파일러라고 부른다. C 언어는 특정 운영체제나 하드웨어에 종속되지 않는 높은 이식성을 지향하지만, 최종적으로 생성되는 실행 파일은 특정 플랫폼에 맞는 기계어로 구성되어야 한다. 따라서 C 프로그램을 실행하기 위해서는 해당 플랫폼(예: 윈도우, 리눅스, macOS)에 맞는 C 컴파일러가 필요하다.
일반적인 C 프로그램의 실행 과정은 다음과 같다. 먼저, 프로그래머가 .c 확장자를 가진 소스 코드 파일을 작성한다. 이후 컴파일러는 이 소스 코드를 어셈블리어를 거쳐 목적 파일(.obj 또는 .o 파일)로 변환한다. 이 목적 파일은 아직 실행 가능한 상태가 아니며, 프로그램에서 사용한 표준 라이브러리 함수나 다른 모듈의 코드와 연결하는 링킹 과정을 거쳐야 한다. 링커가 이 작업을 수행하며, 최종적으로 단일의 실행 파일(예: .exe 파일)이 생성된다. 사용자는 이 실행 파일을 운영체제에서 직접 실행할 수 있다.
이 과정을 단순화해 주는 통합 개발 환경이나 빌드 자동화 도구들이 널리 사용된다. 예를 들어, 유닉스 계열 시스템에서는 gcc나 clang 같은 커맨드 라인 인터페이스 기반 컴파일러를 직접 사용하는 것이 일반적이다. 반면, 마이크로소프트 비주얼 스튜디오 같은 통합 개발 환경은 코드 편집, 컴파일, 디버깅까지 통합된 환경을 제공하여 개발 과정을 편리하게 한다.
C 언어는 시스템 프로그래밍의 근간을 이루는 동시에, 광범위한 응용 프로그램 개발 분야에서도 널리 활용된다. 그 탄생 배경과 특성상 운영체제와 하드웨어에 가까운 저수준 프로그래밍에 최적화되어 있으며, 이로 인해 컴퓨팅 세계의 핵심 인프라를 구축하는 데 필수적인 역할을 담당해 왔다.
가장 대표적인 활용 분야는 시스템 프로그래밍이다. 유닉스 운영체제의 핵심이 C로 재작성된 이후, 현재 대부분의 운영체제 커널, 장치 드라이버, 임베디드 시스템 펌웨어는 C 언어로 개발된다. 이는 C가 어셈블리어 수준의 하드웨어 제어와 메모리 직접 접근이 가능하면서도 높은 이식성을 제공하기 때문이다. 또한, 컴파일러, 인터프리터, 데이터베이스 관리 시스템과 같은 시스템 소프트웨어의 구현에도 C가 광범위하게 사용된다.
응용 프로그램 개발 분야에서도 C는 여전히 중요한 위치를 차지한다. 성능이 중요한 그래픽 처리, 과학 기술 계산, 게임 엔진의 핵심 모듈, 네트워크 서버 프로그램 등은 종종 C로 작성된다. 특히 리눅스, 윈도우, macOS와 같은 다양한 플랫폼에서 동일한 소스 코드를 컴파일하여 실행 파일을 생성할 수 있는 높은 이식성은 크로스 플랫폼 응용 프로그램 개발에 큰 장점으로 작용한다. 이는 C 언어가 표준화된 ANSI C와 ISO C 규격을 따르기 때문에 가능한 특징이다.
더 나아가, C는 수많은 현대 프로그래밍 언어의 기반이 되었다. C++, C#, Objective-C, 자바, 파이썬 등의 언어는 구문이나 설계 철학에서 C의 영향을 직접적으로 받았으며, 이들 언어의 가상 머신이나 핵심 라이브러리도 종종 C로 구현된다. 따라서 새로운 언어나 기술을 배우고 이해하는 데 있어 C에 대한 지식은 여전히 깊은 통찰력을 제공한다.
C 언어는 시스템 프로그래밍의 근간이 되며 오랜 기간 사랑받아 온 만큼 뚜렷한 장점과 단점을 가지고 있다.
C 언어의 가장 큰 장점은 높은 실행 속도와 하드웨어에 대한 직접적인 제어 능력이다. 이는 어셈블리어에 가까운 저수준 연산을 지원하면서도 이식성이 뛰어나기 때문에 가능하다. 운영체제나 임베디드 시스템과 같이 자원이 제한적이고 성능이 중요한 분야에서 필수적인 언어로 자리 잡았다. 또한 문법이 간결하고 표현력이 풍부하여, 강력한 기능을 비교적 적은 코드로 구현할 수 있다. 이러한 특징은 메모리 관리를 프로그래머가 직접 세밀하게 조정할 수 있게 함으로써 최적화된 프로그램 작성에 기여한다.
반면, 이러한 강력한 제어 권한은 동시에 주요 단점으로 작용한다. 프로그래머가 직접 메모리를 관리해야 하므로, 메모리 누수나 버퍼 오버플로우와 같은 위험한 오류가 발생하기 쉽다. 이는 프로그램의 안정성을 해치고 보안 취약점으로 이어질 수 있다. 또한 현대적인 객체 지향 프로그래밍이나 예외 처리와 같은 기능을 언어 차원에서 지원하지 않아, 대규모 소프트웨어 개발 시 프로젝트 관리와 유지보수가 상대적으로 복잡해질 수 있다.
종합하면, C 언어는 효율성과 제어에 중점을 둔 언어로서, 성능이 최우선인 시스템 수준의 프로그래밍에는 여전히 최적의 선택지이다. 그러나 생산성과 안전성을 중시하는 현대의 응용 프로그램 개발에는 자바나 파이썬과 같은 더 높은 수준의 언어들이 더 적합한 경우가 많다.
C 언어는 이후 등장한 수많은 프로그래밍 언어에 직접적인 영향을 미쳤으며, 특히 문법 구조와 설계 철학을 계승한 주요 파생 언어들이 다수 존재한다. 가장 대표적인 예는 C++이다. C++은 비야네 스트롭스트룹에 의해 개발되었으며, C의 모든 기능을 포함하면서 객체 지향 프로그래밍과 제네릭 프로그래밍을 지원하기 위해 클래스와 템플릿 등의 기능을 추가했다. 이는 시스템 소프트웨어부터 고성능 응용 프로그램까지 광범위한 분야에서 C의 지배력을 확장하는 계기가 되었다.
애플의 macOS와 iOS 생태계에서 핵심적인 역할을 하는 Objective-C 역시 C를 기반으로 한다. 이 언어는 C에 스몰토크 스타일의 객체 지향 메시징 기능을 추가하여 만들어졌으며, NeXTSTEP 운영 체제와 함께 발전했다. 마이크로소프트가 개발한 C#은 자바와 C++의 영향을 받았지만, 그 문법의 근간은 여전히 C 언어에 두고 있다.
C의 간결하고 효율적인 문법은 현대의 고수준 언어들에게도 큰 영감을 주었다. 자바는 플랫폼 독립성을 강조하며 개발되었지만, 기본적인 문법 구조는 C와 C++에서 직접 차용했다. 자바스크립트의 구문 역시 C 계열 언어의 영향을 강하게 받았으며, 이는 PHP와 펄 같은 스크립팅 언어에서도 확인할 수 있다. 심지어 파이썬과 같은 현재 널리 쓰이는 언어도 들여쓰기로 블록을 구분하는 독특한 방식을 채택했음에도 불구하고, 연산자나 제어문 등 핵심 문법 요소에는 C의 흔적이 남아 있다.
이러한 파생 언어들은 각자의 목적에 맞게 기능을 확장하거나 패러다임을 변화시켰지만, 여전히 변수 선언, 연산자, 제어 흐름 문법 등에서 C의 기본 틀을 공유하고 있다. 이는 C 언어가 현대 프로그래밍 언어 디자인의 사실상의 표준 문법을 제공했다는 점을 증명한다.