시스템 프로그래밍 언어

시스템 프로그래밍 언어는 운영체제, 장치 드라이버, 펌웨어, 컴파일러, 런타임, 데이터베이스 엔진과 같이 컴퓨터의 하드웨어 및 다른 소프트웨어가 동작할 기반을 만드는 데 사용되는 프로그래밍 언어이다. 시스템 프로그래밍은 최종 사용자를 위한 기능을 직접 제공하기보다 다른 프로그램이 실행될...

분류프로그래밍 언어의 용도별 분류
주요 목적시스템 소프트웨어와 기반 소프트웨어 개발
주요 실행 환경운영체제, 임베디드 시스템, 베어메탈, 서버 기반 시설
핵심 특성자원 제어, 예측 가능한 실행, 하드웨어 접근, 외부 인터페이스
대표 언어어셈블리어, C (프로그래밍 언어), C++, Ada, Rust, Zig
관련 분야시스템 프로그래밍, 운영체제, 컴파일러, 펌웨어

시스템 프로그래밍 언어는 운영체제, 장치 드라이버, 펌웨어, 컴파일러, 런타임, 데이터베이스 엔진과 같이 컴퓨터의 하드웨어 및 다른 소프트웨어가 동작할 기반을 만드는 데 사용되는 프로그래밍 언어이다. 시스템 프로그래밍은 최종 사용자를 위한 기능을 직접 제공하기보다 다른 프로그램이 실행될 환경과 공통 서비스를 구현하며, 제한된 자원을 효율적으로 사용하고 실행 비용을 세밀하게 제어하는 것을 중요하게 다룬다.[1]

시스템 프로그래밍 언어는 하나의 엄격한 언어 계통이나 공식 표준 분류를 뜻하지 않는다. 특정 언어가 시스템 프로그래밍에 적합한지는 메모리 배치와 수명, 자료 표현, 호출 규약, 동시성, 입출력, 하드웨어 명령, 운영체제 인터페이스를 어느 수준까지 제어할 수 있는지에 따라 달라진다. 같은 언어라도 커널과 펌웨어부터 서버 프로그램과 일반 애플리케이션까지 여러 영역에서 함께 사용될 수 있다.

전통적인 시스템 프로그래밍에서는 어셈블리어C (프로그래밍 언어)가 핵심적인 역할을 담당했다. C는 UNIX와 함께 발전했으며, 다양한 컴퓨터와 운영체제뿐 아니라 운영체제 없이 실행되는 임베디드 환경에서도 널리 구현되었다.[2] C++는 C의 저수준 제어 능력을 유지하면서 클래스, 템플릿, 자원 관리 추상화와 범용 라이브러리를 결합하여 운영체제 구성 요소, 브라우저, 게임 엔진, 데이터베이스와 대규모 기반 소프트웨어에 활용된다.

Ada는 신뢰성과 유지보수성, 효율성을 중시하며 실시간 처리, 병렬 작업의 동기화와 시간 제어, 자료 표현의 정밀한 지정처럼 시스템 및 임베디드 프로그래밍에 필요한 기능을 언어와 표준 라이브러리에 포함한다.[3]

현대의 시스템 프로그래밍 언어는 성능과 직접 제어뿐 아니라 메모리 안전성과 개발 도구, 이식성, 기존 언어와의 상호 운용성도 중요한 설계 목표로 삼는다. Rust는 소유권과 대여 규칙을 이용하여 가비지 컬렉터 없이 메모리 안전성을 검사하면서도 메모리 사용과 자료 표현 같은 저수준 요소를 제어할 수 있도록 설계되었다.[4] 안전한 코드에서 표현할 수 없는 하드웨어 접근이나 외부 인터페이스는 unsafe 경계 안에서 명시적으로 다룰 수 있다.[5]

Zig는 언어와 함께 빌드 시스템 및 교차 컴파일 도구를 제공하며, 제어 흐름과 메모리 할당을 명시적으로 드러내고 C 계열 소프트웨어와 쉽게 결합하는 방향을 취한다.[6] Go (프로그래밍 언어)처럼 가비지 컬렉션과 런타임을 사용하는 언어도 시스템 프로그래밍을 고려하여 설계될 수 있으며, 운영체제 커널보다는 네트워크 서비스, 분산 시스템, 명령줄 도구와 클라우드 기반 시설에서 주로 사용된다. Go 언어 사양은 Go를 시스템 프로그래밍을 염두에 둔 범용 언어로 설명하며, 고루틴과 채널을 통한 동시성 기능을 제공한다.[7]

따라서 시스템 프로그래밍 언어와 일반 애플리케이션 언어의 경계는 실행 방식 하나만으로 결정되지 않는다. 수동 메모리 관리 여부, 네이티브 코드 생성 여부 또는 가비지 컬렉터의 존재만으로 분류하기보다, 언어가 하드웨어와 운영체제 자원을 표현하는 방법, 실행 시간과 메모리 사용의 예측 가능성, 안전성을 확보하는 방식, 대상 플랫폼과 기존 시스템에 연결되는 구조를 함께 살펴보아야 한다.

역사

기계어와 어셈블리어

초기 고급 시스템 언어

BCPL과 B

C와 UNIX

구조적 추상화와 C++

안전성과 실시간 시스템을 위한 언어

현대 시스템 프로그래밍 언어

개념과 범위

시스템 프로그래밍

시스템 소프트웨어와 기반 소프트웨어

저수준 언어와의 차이

범용 프로그래밍 언어와의 경계

호스티드 환경과 프리스탠딩 환경

핵심 설계 특성

하드웨어와 운영체제 접근

자료 표현과 메모리 배치

실행 비용의 예측 가능성

추상화와 제로 비용 추상화

이식성과 플랫폼 종속 기능

외부 함수 인터페이스와 호출 규약

메모리와 자원 관리

정적 저장 영역과 스택

동적 메모리 할당

수동 메모리 관리

소유권과 수명 분석

가비지 컬렉션과 런타임

자원 획득과 해제

타입 체계와 안전성

정적 타입 검사

포인터와 참조

배열 경계와 산술 검사

정의되지 않은 동작

안전한 영역과 비안전 영역

형식 검증과 제한된 언어 부분집합

실행 모델

네이티브 코드 생성

런타임과 표준 라이브러리

예외와 오류 처리

초기화와 종료

인터럽트와 비동기 실행

실시간성과 결정적 실행

동시성과 메모리 모델

스레드와 작업

공유 메모리와 메시지 전달

원자적 연산

메모리 순서

데이터 경쟁과 동기화

비동기 입출력

컴파일과 도구 체계

컴파일러와 링커

목적 파일과 실행 파일

교차 컴파일

빌드 시스템과 패키지 관리

디버거와 프로파일러

정적 분석과 동적 분석

운영체제 및 하드웨어 인터페이스

시스템 호출

장치와 메모리 매핑 입출력

드라이버 인터페이스

인라인 어셈블리

ABI와 바이너리 호환성

C 인터페이스

주요 언어

어셈블리어

C

C++

Ada와 SPARK

D

Rust

Zig

Go

그 밖의 언어

활용 분야

운영체제와 커널

장치 드라이버

펌웨어와 임베디드 시스템

컴파일러와 언어 런타임

데이터베이스와 저장 장치

네트워크 기반 시설

브라우저와 가상 머신

게임 엔진과 실시간 소프트웨어

고성능 컴퓨팅

명령줄 도구와 시스템 서비스

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

어셈블리어와 고급 언어

관리형 언어와 네이티브 언어

C 호환성과 공통 ABI

언어 간 상호 운용

시스템 구성 요소의 다중 언어 개발

Wave

언어 선택

성능과 지연 시간

메모리 안전성

런타임 의존성

대상 플랫폼

기존 코드와 생태계

개발 도구와 유지보수성

안전 필수 시스템의 요구

장점과 한계

영향

관련 문서

  1. Devopedia: Systems Programming
  2. ISO/IEC JTC 1/SC 22/WG 14: C2x Charter
  3. Ada Information Clearinghouse: Overview of the Ada Language
  4. The Rust Programming Language: Understanding Ownership
  5. The Rust Reference: Unsafety
  6. Zig Programming Language: Learn
  7. The Go Programming Language Specification