로우레벨 프로그래밍이란?
우리가 매일 사용하는 스마트폰, 노트북, 서버와 같은 모든 전자기기는 복잡한 소프트웨어와 하드웨어의 조합으로 이루어져 있습니다. 많은 사람들은 웹이나 앱 같은 눈에 보이는 부분만 접하지만, 그 아래에는 보이지 않는 세계가 있습니다. 바로 저수준 프로그래밍입니다.
저는 약 10여년의 프로그래밍 경력동안 다양한 언어와 환경을 접하였지만, 항상 그 내부의 동작이 궁금했고 명확하게 동작을 예상할 수 없는 코드가 점점 불편했습니다. 현업에서 가장 많이 사용한 C++도 비교적 추상화 수준이 덜함에도 불구하고 사용하면 사용할 수록, 도대체 내부에서 무슨일이 벌어지는지 직관적으로 이해하기 어렵다는 점이 맘에 들지 않았습니다.
물론, 파이썬과 같은 스크립트 언어들은 아주 유용하다는 것에 100% 동의합니다. 저도 굉장히 자주 사용하고 있습니다!
그래서 비록 지금까지의 경력사항에서는 저수준 프로그래밍을 직접적으로 다루지 않았지만, 개인적인 호기심과 연구활동으로 이어가려합니다.
이 글에서는 저수준 프로그래밍이 무엇인지, 왜 중요한지, 그리고 우리가 왜 관심을 가져야 하는지를 살펴보겠습니다.
저수준 프로그래밍의 정의
저수준 프로그래밍이란, 하드웨어와 직접 맞닿아 있는 형태의 프로그래밍을 의미합니다.
- CPU의 레지스터(register)를 다루고
- 메모리 주소를 직접 지정하며
- 하드웨어 동작 원리에 따라 프로그램을 설계하는 방식입니다.
고수준 언어인 Python, Java, JavaScript등은 추상화가 강해서 개발자가 하드웨어 세부사항을 신경쓰지 않아도 됩니다. 반면에 C, Assembly 같은 언어는 하드웨어 동작과 거의 일대일로 대응하기 때문에 저수준 언어라고 부릅니다.
개인적인 생각으로는, C언어 역시 저수준 보다는 고수준 언어에 가깝다고 생각합니다. 하드웨어 세부사항을 신경쓰지 않아도 되고 하드웨어 동작과 거의 일대일로 대응한다는 것은 즉, 하드웨어가 변경될 때 코드를 수정할 필요가 없는(혹은 최소한의 수정만 필요한) 것을 뜻합니다. C언어는 현대의 고수준 언어에 비해서 하드웨어 세부사항을 이해하고 코드를 작성해야하는 것이 맞지만, C언어의 뛰어난 이식성 덕분에 많은 코드 수정이 필요하지 않은 것도 사실이기 때문입니다.
반면에 어셈블리 수준의 언어에서는 하드웨어(특히 CPU와 메모리)에 따라서 코드 자체가 수정되어야 합니다. 이 과정을 원활히 만들어 주는 것이 컴파일러의 역할이기도 하죠.
저수준 프로그래밍의 특징
저수준 프로그래밍은 다음과 같은 특징을 가집니다.
1. 하드웨어 제어 능력
- 입출력 장치(I/O), 메모리, CPU 명령어 수준까지 제어할 수 있습니다.
- 예: 특정 메모리 주소에 직접 값을 저장하거나, 레지스터 값을 조작하는 명령 실행
2. 세밀한 최적화 가능
- 코드가 하드웨어와 직접 연결되기 때문에 속도와 메모리 사용량을 극한까지 최적화할 수 있습니다.
- 임베디드 시스템, 운영체제, 실시간 제어 시스템에서 반드시 필요합니다.
3. 복잡성과 난이도
- 추상화가 적어 다루기가 어렵습니다.
- 하지만 그만큼 컴퓨터의 본질적인 동작을 깊이 이해할 수 있습니다.
왜 중요한가?
저수준 프로그래밍은 단순히 “옛날 방식”이 아니라, 지금도 여러 분야에서 핵심적인 역할을 하고 있습니다.
- 운영체제와 커널: Linux, Windows, macOS의 가장 핵심 부분은 C와 어셈블리로 작성되어 있습니다.
- 드라이버와 펌웨어: 키보드, 마우스, 그래픽 카드, 네트워크 카드 등 모든 ㅈ아치는 저수준 코드 없이는 동작하지 않습니다.
- 보안과 해킹: 시스템 취약점을 분석하려면 메모리 구조와 어셈블리 레벨을 이해해야 합니다.
- 임베디드 시스템: 자동차, IoT 기기, 가전제품 등은 저수준 프로그래밍으로 제어됩니다.
즉, 우리가 매일 사용하는 모든 기술의 밑바닥에는 저수준 프로그래밍이 존재합니다.

간단한 예시
- ARM 어셈블리에서
add r0, r1, r2라는 명령은 단순히 “덧셈”이 아니라, CPU 내부의 산술논리연산장치(ALU)가 레지스터 값을 받아 연산한 뒤 결과를 다시 저장하는 과정을 뜻합니다. - Verilog에서
assign y = a & b;라는 한 줄은, 실제로는 반도체 회로에서 전류가 흐르며 1과 0을 판별하는 동작과 연결됩니다. - C언어에서
printf("Hello");라는 한 줄은, 내부적으로는 운영체제의 시스템 콜을 거쳐 커널이 입출력 장치를 제어하는 과정으로 이어집니다.
이처럼 우리가 흔히 쓰는 코드 한 줄 뒤에는 수많은 저수준 동작들이 숨어 있습니다. 저수준 프로그래밍은 단순히 어려운 기술을 배우는 것이 아닙니다. “컴퓨터를 더 깊이 이해하고, 본질을 탐구하려는 태도” 그 자체입니다.
마치며
저수준 프로그래밍은 눈에 잘 보이지 않는 영역이지만, 우리가 사용하는 모든 기술의 근간을 이루고 있습니다. 현대 컴퓨터 시스템의 저수준 동작을 직접 구현하고 눈으로 확인할 수 있는 George Hotz의 “From the Transistor” 프로젝트를 큰 줄기로 삼고, 이진수 표현, ARM 어셈블리, Verilog, 컴파일러 및 OS 제작 과 같은 주제를 다룰 에정입니다.