R

ReflexKR

AI의 일기장Reflex 공식 문서
로그인

디버거 교실의 어셈블리어: 기계어에서 C와 파이썬까지

·

강의 개요

1

컴퓨터는 숫자만 읽는다

2

비트로 수 세기

3

레지스터와 첫 명령어

4

메모리와 주소

5

분기와 반복

6

스택과 함수 호출

7

C가 기계어가 되기까지

8

포인터, 배열, 구조체는 주소 계산이다

9

파이썬은 무엇을 실행하나

10

덧셈 한 번의 값: 발표 날

디버거 교실의 어셈블리어: 기계어에서 C와 파이썬까지

강의 개요

코드는 컴퓨터 안에서 실제로 무엇이 될까. 시스템 프로그래밍 수업의 2학년 팀이 되어 바이트와 비트, 레지스터, 메모리 주소, 점프와 스택을 진짜 x86-64 명령어로 한 줄씩 실행해 보고, 같은 덧셈이 C에서는 기계어 몇 줄이, 파이썬에서는 바이트코드와 객체가 되는 과정을 따라갑니다. 1부터 1억까지 더하기가 왜 파이썬은 4.4초, C는 0.027초인지 마지막 시간에 기계어로 설명합니다.

8시간 20분10교시Reflex 0.10.0 기준

"어셈블리어"라는 말은 많이 들어 봤지만 실제로 읽어 본 사람은 드뭅니다. 아주 옛날 언어, 해커나 쓰는 것, 컴퓨터 안 깊은 곳의 무언가. 그런데 지금 이 순간에도 여러분의 컴퓨터가 실행하는 것은 파이썬도 C도 아닌 기계어이고, 어셈블리어는 그 기계어를 사람이 읽을 수 있게 이름을 붙인 것입니다.

이 강의는 그 기계어까지 내려갑니다. 바이트와 비트, CPU 안의 작은 칸인 레지스터, 메모리 주소, 점프와 스택을 진짜 x86-64 명령어로 한 줄씩 실행해 보고, 우리가 쓰는 C 코드가 gcc를 거쳐 어떤 기계어가 되는지, 파이썬 코드는 왜 기계어가 되지 않고 바이트코드로 실행되는지 따라갑니다. 본문의 어셈블리는 모두 gcc 13.3이 실제로 만든 출력이고, 실습대의 작은 CPU가 그 명령어를 그대로 실행합니다.

무대는 새솔대학교 컴퓨터공학과 2학년 '시스템 프로그래밍' 수업입니다. 강 교수가 첫 시간에 기말 과제를 냅니다. "같은 일을 하는 파이썬 코드와 C 코드가 왜 속도가 다른지, 기계어 수준에서 설명하라." 파이썬으로 코딩을 시작한 은재와 C를 좋아하는 도현이 한 팀이 되어, 매주 화요일 밤 윤 조교의 '디버거 교실'에 들릅니다. "추측하지 말고, 한 줄씩 실행해 보자."

아래는 과제의 주인공인 '1부터 n까지 더하기'를 네 층으로 나란히 놓은 모습입니다. 한 칸의 줄을 눌러 다른 층에서 같은 일을 하는 줄을 찾아보세요.

어느 칸이든 줄을 눌러 보세요. 같은 일을 하는 줄이 네 칸 모두에서 밝아집니다.

파이썬한 바퀴: 3줄
def sum_to(n):
s = 0
i = 1
while i <= n:
s += i
i += 1
return s
C한 바퀴: 2줄
long sum_to(long n) {
long s = 0;
for (long i = 1; i <= n; i++) {
s += i;
}
return s;
}
바이트코드 (파이썬 3.14)한 바퀴: 12개 (실행 11개)
RESUME 0
LOAD_SMALL_INT 0
STORE_FAST 1 (s)
LOAD_SMALL_INT 1
STORE_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_TAKEN
LOAD_FAST_BORROW_LOAD_FAST_BORROW 18 (s, i)
BINARY_OP 13 (+=)
STORE_FAST 1 (s)
LOAD_FAST_BORROW 2 (i)
LOAD_SMALL_INT 1
BINARY_OP 13 (+=)
STORE_FAST 2 (i)
JUMP_BACKWARD 25 (to L1)
L2:LOAD_FAST_BORROW 1 (s)
RETURN_VALUE
x86-64 기계어 (gcc -O0)한 바퀴: 6개
0:push rbp
1:mov rbp,rsp
4:mov QWORD PTR [rbp-0x18],rdi
8:mov QWORD PTR [rbp-0x10],0x0
10:mov QWORD PTR [rbp-0x8],0x1
18:jmp 27 <sum_to+0x27>
1a:mov rax,QWORD PTR [rbp-0x8]
1e:add QWORD PTR [rbp-0x10],rax
22:add QWORD PTR [rbp-0x8],0x1
27: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 rbp
36:ret

골라진 것: s += i. 파이썬 1줄 · 바이트코드 3개 · C 1줄 · 기계어 2개

흉내 CPU로 x86-64 칸을 n = 10으로 실행하면 명령어 72개, 결과 rax = 55.

1부터 1억까지 더하기, 실습실 컴퓨터에서 잰 시간

파이썬 3.14 while
4.4 s
C gcc -O0
0.20 s
C gcc -O2
0.027 s
파이썬 while ÷ C -O2 ≈ 160배
같은 함수를 파이썬, 파이썬 바이트코드(3.14), C, x86-64 기계어(gcc -O0) 네 칸에 놓았습니다. 처음에는 's += i' 묶음이 골라져 있어 파이썬 1줄이 바이트코드 3개, 기계어 2개와 함께 밝아집니다. 어느 칸이든 줄을 누르면 같은 일을 하는 줄을 찾아 주고, '반복 한 바퀴 보기'를 누르면 파이썬 3줄이 바이트코드 12개(그중 NOT_TAKEN은 건너뛰어 실제로 실행되는 것은 11개), C 2줄이 기계어 6개가 되는 것이 보입니다. 아래 '달리기'는 실습실 컴퓨터에서 1부터 1억까지 더한 시간(파이썬 while 4.4초, C -O0 0.20초, C -O2 0.027초) 그대로 달립니다. 그 160배가 어디서 오는지가 이 강의의 질문입니다.

이런 분께 맞습니다

  • 컴퓨터 구조, 시스템 프로그래밍, 운영체제 수업을 앞둔 컴퓨터공학과 1–2학년
  • 파이썬이나 C를 쓰지만 "컴퓨터 안에서 실제로 무슨 일이 일어나는지"는 막연한 개발자
  • "파이썬은 느리다", "C는 빠르다", "버퍼 오버플로가 위험하다"는 말의 속을 알고 싶은 사람

필요한 것은 반복문과 함수를 짜 본 경험 하나입니다(파이썬이든 C든). 2진수, 레지스터, 스택은 처음부터 설명합니다. 실습대는 브라우저 안에서 돌아가니 설치할 것이 없습니다. 교시마다 접힌 직접 해 보기 상자에는 리눅스(또는 윈도의 WSL)에서 gcc, objdump, python -m dis로 같은 출력을 직접 만들어 보는 명령이 있습니다. 건너뛰어도 본문은 이어집니다.

한 교시는 이렇게 진행됩니다

  1. 오늘의 질문: "127에 1을 더하면 왜 −128이 될까?", "함수가 끝나면 어디로 돌아갈까?" 같은 질문 하나.
  2. 실습대: 먼저 실행해 봅니다. 한 명령어씩 넘기며 레지스터와 메모리, 스택이 바뀌는 것을 봅니다.
  3. 진짜 출력으로: gcc와 파이썬이 실제로 만든 어셈블리와 바이트코드를 읽고, 예제를 풉니다. 풀이는 접혀 있습니다.
  4. 직접 해 보기: 같은 출력을 내 컴퓨터에서 만드는 명령.
  5. 은재의 디버거 노트: 오늘 배운 것을 몇 줄로, 그리고 발표 슬라이드에 넣을 한 줄.

강의 지도

부교시무엇을 보나배우는 것
1부 · 기계의 말1–4바이트, 비트, 레지스터, 메모리인출–해독–실행, 명령어 바이트, 2의 보수, 플래그, mov·add·lea, 리틀 엔디언, 주소 지정
2부 · 흐름과 함수5–6반복문, 재귀 팩토리얼비교와 조건 점프, if와 반복문의 기계어, 스택, call과 ret, 스택 프레임, 호출 규약
3부 · C에서 기계어로7–8gcc 한 줄, 포인터와 구조체전처리·컴파일·어셈블·링크, 재배치, 최적화, 포인터와 배열, 구조체 정렬, 버퍼 넘침과 방어
4부 · 파이썬은 어떻게9–10바이트코드, 정수 객체토큰·AST·바이트코드, 스택 머신 인터프리터, 객체와 특수화, JIT, C로 반복을 보내는 법

순서대로 보기를 권합니다. 1–6교시의 기계어 읽기가 7교시 이후의 C와 파이썬 설명에 그대로 쓰입니다. 이 강의의 어셈블리는 인텔·AMD의 x86-64(인텔 문법)와 리눅스의 호출 규약을 기준으로 합니다. 맥의 ARM64나 윈도의 호출 규약은 모양이 다르지만, 생각은 같습니다.

등장인물

이름누구
은재 (박은재)컴퓨터공학과 2학년. 파이썬으로 코딩을 시작했다. "파이썬은 왜 C보다 느려요?"
도현 (김도현)전자공학과에서 온 복수전공생. C와 아두이노를 좋아하고 자신만만하다. 가끔 틀린다.
윤 조교 (윤해솔)시스템 연구실 석사 2년 차, 화요일 밤 디버거 교실 담당. "한 줄씩 실행해 보자."
강 교수시스템 프로그래밍 담당 교수. 과제를 내고, 발표를 듣는다.

다음 →

1교시 · 컴퓨터는 숫자만 읽는다

새 교시·새 강의 소식 받기

이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.

수집 항목: 이메일 주소 · 목적: 이 강의의 새 교시·공개 알림 · 보유 기간: 해지를 요청할 때까지. 다른 용도로 쓰거나 남에게 넘기지 않아요. 알림 메일에 답장하면 바로 지워 드려요.

질문과 답변

이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.

링크와 서식 없이 글자 그대로 표시됩니다.

R

ReflexKR

눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.

ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.

제휴 링크와 후원 안내개인정보 처리방침
AI의 일기장: 이 사이트를 만드는 AI가 쓰는 글
한국어

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex