코드는 컴퓨터 안에서 실제로 무엇이 될까. 시스템 프로그래밍 수업의 2학년 팀이 되어 바이트와 비트, 레지스터, 메모리 주소, 점프와 스택을 진짜 x86-64 명령어로 한 줄씩 실행해 보고, 같은 덧셈이 C에서는 기계어 몇 줄이, 파이썬에서는 바이트코드와 객체가 되는 과정을 따라갑니다. 1부터 1억까지 더하기가 왜 파이썬은 4.4초, C는 0.027초인지 마지막 시간에 기계어로 설명합니다.
"어셈블리어"라는 말은 많이 들어 봤지만 실제로 읽어 본 사람은 드뭅니다. 아주 옛날 언어, 해커나 쓰는 것, 컴퓨터 안 깊은 곳의 무언가. 그런데 지금 이 순간에도 여러분의 컴퓨터가 실행하는 것은 파이썬도 C도 아닌 기계어이고, 어셈블리어는 그 기계어를 사람이 읽을 수 있게 이름을 붙인 것입니다.
이 강의는 그 기계어까지 내려갑니다. 바이트와 비트, CPU 안의 작은 칸인 레지스터, 메모리 주소, 점프와 스택을 진짜 x86-64 명령어로 한 줄씩 실행해 보고, 우리가 쓰는 C 코드가 gcc를 거쳐 어떤 기계어가 되는지, 파이썬 코드는 왜 기계어가 되지 않고 바이트코드로 실행되는지 따라갑니다. 본문의 어셈블리는 모두 gcc 13.3이 실제로 만든 출력이고, 실습대의 작은 CPU가 그 명령어를 그대로 실행합니다.
무대는 새솔대학교 컴퓨터공학과 2학년 '시스템 프로그래밍' 수업입니다. 강 교수가 첫 시간에 기말 과제를 냅니다. "같은 일을 하는 파이썬 코드와 C 코드가 왜 속도가 다른지, 기계어 수준에서 설명하라." 파이썬으로 코딩을 시작한 은재와 C를 좋아하는 도현이 한 팀이 되어, 매주 화요일 밤 윤 조교의 '디버거 교실'에 들릅니다. "추측하지 말고, 한 줄씩 실행해 보자."
아래는 과제의 주인공인 '1부터 n까지 더하기'를 네 층으로 나란히 놓은 모습입니다. 한 칸의 줄을 눌러 다른 층에서 같은 일을 하는 줄을 찾아보세요.
어느 칸이든 줄을 눌러 보세요. 같은 일을 하는 줄이 네 칸 모두에서 밝아집니다.
def sum_to(n):s = 0i = 1while i <= n:s += ii += 1return s
long sum_to(long n) {long s = 0;for (long i = 1; i <= n; i++) {s += i;}return s;}
RESUME 0LOAD_SMALL_INT 0STORE_FAST 1 (s)LOAD_SMALL_INT 1STORE_FAST 2 (i)L1:LOAD_FAST_BORROW_LOAD_FAST_BORROW 32 (i, n)COMPARE_OP 58 (bool(<=))POP_JUMP_IF_FALSE 20 (to L2)NOT_TAKENLOAD_FAST_BORROW_LOAD_FAST_BORROW 18 (s, i)BINARY_OP 13 (+=)STORE_FAST 1 (s)LOAD_FAST_BORROW 2 (i)LOAD_SMALL_INT 1BINARY_OP 13 (+=)STORE_FAST 2 (i)JUMP_BACKWARD 25 (to L1)L2:LOAD_FAST_BORROW 1 (s)RETURN_VALUE
0:push rbp1:mov rbp,rsp4:mov QWORD PTR [rbp-0x18],rdi8:mov QWORD PTR [rbp-0x10],0x010:mov QWORD PTR [rbp-0x8],0x118:jmp 27 <sum_to+0x27>1a:mov rax,QWORD PTR [rbp-0x8]1e:add QWORD PTR [rbp-0x10],rax22:add QWORD PTR [rbp-0x8],0x127:mov rax,QWORD PTR [rbp-0x8]2b:cmp rax,QWORD PTR [rbp-0x18]2f:jle 1a <sum_to+0x1a>31:mov rax,QWORD PTR [rbp-0x10]35:pop rbp36:ret
골라진 것: s += i. 파이썬 1줄 · 바이트코드 3개 · C 1줄 · 기계어 2개
흉내 CPU로 x86-64 칸을 n = 10으로 실행하면 명령어 72개, 결과 rax = 55.
필요한 것은 반복문과 함수를 짜 본 경험 하나입니다(파이썬이든 C든). 2진수, 레지스터, 스택은 처음부터 설명합니다. 실습대는 브라우저 안에서 돌아가니 설치할 것이 없습니다. 교시마다 접힌 직접 해 보기 상자에는 리눅스(또는 윈도의 WSL)에서 gcc, objdump, python -m dis로 같은 출력을 직접 만들어 보는 명령이 있습니다. 건너뛰어도 본문은 이어집니다.
| 부 | 교시 | 무엇을 보나 | 배우는 것 |
|---|---|---|---|
| 1부 · 기계의 말 | 1–4 | 바이트, 비트, 레지스터, 메모리 | 인출–해독–실행, 명령어 바이트, 2의 보수, 플래그, mov·add·lea, 리틀 엔디언, 주소 지정 |
| 2부 · 흐름과 함수 | 5–6 | 반복문, 재귀 팩토리얼 | 비교와 조건 점프, if와 반복문의 기계어, 스택, call과 ret, 스택 프레임, 호출 규약 |
| 3부 · C에서 기계어로 | 7–8 | gcc 한 줄, 포인터와 구조체 | 전처리·컴파일·어셈블·링크, 재배치, 최적화, 포인터와 배열, 구조체 정렬, 버퍼 넘침과 방어 |
| 4부 · 파이썬은 어떻게 | 9–10 | 바이트코드, 정수 객체 | 토큰·AST·바이트코드, 스택 머신 인터프리터, 객체와 특수화, JIT, C로 반복을 보내는 법 |
순서대로 보기를 권합니다. 1–6교시의 기계어 읽기가 7교시 이후의 C와 파이썬 설명에 그대로 쓰입니다. 이 강의의 어셈블리는 인텔·AMD의 x86-64(인텔 문법)와 리눅스의 호출 규약을 기준으로 합니다. 맥의 ARM64나 윈도의 호출 규약은 모양이 다르지만, 생각은 같습니다.
| 이름 | 누구 |
|---|---|
| 은재 (박은재) | 컴퓨터공학과 2학년. 파이썬으로 코딩을 시작했다. "파이썬은 왜 C보다 느려요?" |
| 도현 (김도현) | 전자공학과에서 온 복수전공생. C와 아두이노를 좋아하고 자신만만하다. 가끔 틀린다. |
| 윤 조교 (윤해솔) | 시스템 연구실 석사 2년 차, 화요일 밤 디버거 교실 담당. "한 줄씩 실행해 보자." |
| 강 교수 | 시스템 프로그래밍 담당 교수. 과제를 내고, 발표를 듣는다. |
새 교시·새 강의 소식 받기
이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.
R
ReflexKR
눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.
ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.
© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
질문과 답변
이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.