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언어 소스
(하나의 코드)
컴파일러
(번역기)
Intel 기계어
ARM 기계어

개발자는 하드웨어를 몰라도 C언어 문법만 알면 되고, 나머지는 컴파일러가 알아서 각 기계에 맞는 0과 1로 번역해 줍니다. 이것이 우리가 지금 '하드웨어에 종속되지 않는 프로그래밍'을 할 수 있는 이유입니다.

 

4.3 결론 : 현대의 프로그램 만들기란?

오늘날 우리가 프로그램을 만든다는 것(프로그래밍)은 다음과 같은 과정입니다.

👨‍💻 개발자
(고급 언어 / AI 코딩)
"화면에 '안녕' 출력해!"
🔄 컴파일러
(번역기)
"이걸 0과 1로 바꾸면..."
🤖 컴퓨터(CPU)
(기계어 실행)
"1001010..."

💡 핵심 포인트

아무리 코딩이 쉬워지고 AI가 코드를 짜주는 세상(바이브 코딩)이 와도,
결국 컴퓨터 내부에서는 "전기 신호(0과 1)가 끊임없이 움직이고 있다"는 사실은 변하지 않습니다.
이 원리를 이해하는 것이 '개발자'와 '코더'를 가르는 기준이 됩니다.