2. 프로그래밍: 천공카드에서 바이브 코딩까지

1. 목표 및 개요
AI가 코드를 짜주는 '바이브 코딩' 시대입니다.
하지만 역설적으로, "컴퓨터가 근본적으로 어떻게 작동하는가?"를 아는 개발자의 가치는 더욱 높아지고 있습니다.
이번 섹션에서는 프로그래밍 언어의 진화 과정을 통해 다음 세 가지 핵심 내용을 파악하는 것이 목표입니다.
- 역사의 흐름: 천공카드(물리적 입력)에서 현대의 AI 코딩까지의 발전 과정
- 기계의 본질: 컴퓨터는 결국 0과 1(전기 신호)밖에 모르는 기계라는 사실
- 언어의 탄생: 인간의 고통(기계어)을 줄이기 위해 어셈블리어와 C언어가 등장하게 된 필연적인 이유
2. 초기 프로그래밍 : 천공카드에서 바이브 코딩까지
2.1 프로그래밍의 역사 : 고통에서 해방으로
프로그래밍이란 결국 "사람의 생각을 기계에게 전달하는 과정"입니다. 이 소통 방식은 인간이 더 편해지는 방향으로 끊임없이 진화해 왔습니다.
▲ 천공카드부터 AI 코딩까지, 프로그래밍의 변천사
영상에서 보셨듯이, 초기에는 구멍 뚫린 종이(천공카드)로 대화했다면, 이제는 말 한마디(AI, 바이브 코딩)로 프로그램을 짜는 시대가 되었습니다. 하지만 이 화려한 발전 뒤에는 변하지 않는 '기계의 본질'이 숨어 있습니다.
3. 기계어와 어셈블리어 프로그래밍
3.1 컴퓨터의 유일한 언어 : 기계어 (Machine Language)
우리가 아무리 영어로, 한국어로 코드를 짜도 컴퓨터(CPU)는 그 말을 죽어도 이해하지 못합니다. CPU는 오직 전기 신호의 ON(1)과 OFF(0)만을 이해할 수 있기 때문입니다.
▲ CPU는 어떻게 동작할까? (기계어의 물리적 실체)
- 기계어: CPU가 해석 없이 바로 실행할 수 있는 유일한 언어 (0과 1의 조합)
- 현실: 초기 프로그래머들은
10110000 01100001같은 숫자를 직접 입력하며 코딩했습니다. 이는 인간에게 엄청난 고통이었습니다.
3.2 첫 번째 통역사 : 어셈블리어 (Assembly Language)
"0과 1을 외우다가는 머리가 터지겠다!"라고 느낀 개발자들이 만들어낸 것이 바로 어셈블리어입니다. 기계어와 1:1로 대응되지만, 사람이 읽을 수 있는 단어로 바꾼 것입니다.
| 기계어 (Machine Code) | 어셈블리어 (Assembly) |
| 10110000 01100001 | MOV AL, 97 |
| ➡ "97이라는 값을 AL 레지스터로 옮겨라(Move)"라는 뜻 | |
하지만 어셈블리어 역시 CPU의 구조(아키텍처)를 완벽하게 알아야만 짤 수 있는 '저급 언어(Low-Level Language)'였습니다.
3.3 어셈블리어의 치명적 한계 : "기계마다 말이 다르다"
어셈블리어 덕분에 0과 1의 지옥에서는 벗어났지만, 개발자들에게는 더 큰 문제가 남아있었습니다. 바로 하드웨어 종속성(Hardware Dependency)입니다.
CPU를 만드는 회사가 다르면(예: 인텔 vs ARM), 그 CPU가 이해하는 기계어와 어셈블리어 문법도 완전히 다릅니다.
[상황 예시: "화면에 1을 더해라"]
- A 회사 컴퓨터:
ADD AX, 1 - B 회사 컴퓨터:
INC R1
Problem: 컴퓨터를 바꿀 때마다 프로그램을 처음부터 다시 짜야 한다!
즉, "소프트웨어가 하드웨어에 꽉 묶여있는 상태"였습니다. 이를 해결하기 위해서는 어떤 컴퓨터에서든 똑같이 작동하는(이식성, Portability) 언어가 필요했습니다.
4. 고급 프로그래밍 언어의 등장
4.1 해결사 등장 : 유닉스(UNIX)와 C언어
1970년대 초, 벨 연구소(Bell Labs)의 데니스 리치(Dennis Ritchie)와 켄 톰슨(Ken Thompson)은 이 문제를 해결하며 컴퓨터 역사를 바꿉니다.
📜 C언어의 탄생 비화
당시 그들은 유닉스(UNIX)라는 운영체제를 만들고 있었습니다. 처음에는 어셈블리어로 만들었는데, 컴퓨터를 바꿀 때마다 유닉스를 다시 개발해야 하는 고통을 겪었습니다.
"컴퓨터가 바뀌어도 코드는 그대로 쓸 수 없을까?"
이 생각 끝에 그들은 C언어라는 고급 프로그래밍 언어(High-Level Language)를 직접 만들었고, 유닉스 운영체제 전체를 C언어로 다시 작성해버립니다.
- 결과: C언어로 작성된 유닉스는 소스 코드를 조금만 수정하면 슈퍼컴퓨터든, 개인용 PC든 어디서나 실행할 수 있게 되었습니다.
- 의미: 이것이 바로 '소프트웨어의 이식성(Portability)' 혁명의 시작이며, 오늘날 우리가 쓰는 Windows, macOS, Linux, Android의 뿌리가 되었습니다.
4.2 컴파일러(Compiler) : 위대한 통역사
그렇다면 C언어(고급 언어)는 어떻게 기계어를 모르는 채로 작동할까요? 중간에 컴파일러라는 통역사가 있기 때문입니다.
(하나의 코드)
(번역기)
개발자는 하드웨어를 몰라도 C언어 문법만 알면 되고, 나머지는 컴파일러가 알아서 각 기계에 맞는 0과 1로 번역해 줍니다. 이것이 우리가 지금 '하드웨어에 종속되지 않는 프로그래밍'을 할 수 있는 이유입니다.
4.3 결론 : 현대의 프로그램 만들기란?
오늘날 우리가 프로그램을 만든다는 것(프로그래밍)은 다음과 같은 과정입니다.
(고급 언어 / AI 코딩)
"화면에 '안녕' 출력해!"
(번역기)
"이걸 0과 1로 바꾸면..."
(기계어 실행)
"1001010..."
💡 핵심 포인트
아무리 코딩이 쉬워지고 AI가 코드를 짜주는 세상(바이브 코딩)이 와도,
결국 컴퓨터 내부에서는 "전기 신호(0과 1)가 끊임없이 움직이고 있다"는 사실은 변하지 않습니다.
이 원리를 이해하는 것이 '개발자'와 '코더'를 가르는 기준이 됩니다.