시스템 프로그래밍 언어
시스템 프로그래밍 언어는 운영체제, 장치 드라이버, 펌웨어, 컴파일러, 런타임, 데이터베이스 엔진과 같이 컴퓨터의 하드웨어 및 다른 소프트웨어가 동작할 기반을 만드는 데 사용되는 프로그래밍 언어이다. 시스템 프로그래밍은 최종 사용자를 위한 기능을 직접 제공하기보다 다른 프로그램이 실행될...
| 분류 | 프로그래밍 언어의 용도별 분류 |
|---|---|
| 주요 목적 | 시스템 소프트웨어와 기반 소프트웨어 개발 |
| 주요 실행 환경 | 운영체제, 임베디드 시스템, 베어메탈, 서버 기반 시설 |
| 핵심 특성 | 자원 제어, 예측 가능한 실행, 하드웨어 접근, 외부 인터페이스 |
| 대표 언어 | 어셈블리어, 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]
따라서 시스템 프로그래밍 언어와 일반 애플리케이션 언어의 경계는 실행 방식 하나만으로 결정되지 않는다. 수동 메모리 관리 여부, 네이티브 코드 생성 여부 또는 가비지 컬렉터의 존재만으로 분류하기보다, 언어가 하드웨어와 운영체제 자원을 표현하는 방법, 실행 시간과 메모리 사용의 예측 가능성, 안전성을 확보하는 방식, 대상 플랫폼과 기존 시스템에 연결되는 구조를 함께 살펴보아야 한다.