1. 기계어 (Machine Language)

 

▲ CPU는 어떻게 동작할까? (기계어의 물리적 실체)

 

우리가 아무리 영어로, 한국어로 우아하게 코드를 짜도 컴퓨터(CPU)는 그 말을 이해하지 못합니다.

CPU는 반도체로 이루어진 기계이며, 오직 전기 신호의 ON(1) OFF(0)만을 물리적으로 감지할 수 있기 때문입니다.

그렇다면 초창기 개발자들은 이 소통의 문제를 어떻게 해결했을까요? 인간이 기계의 수준으로 내려가는 수밖에 없었습니다.

 

 

 

👨‍💻 개발자
(Developer)
1단계: 기계어
(Machine Code)
🤖 컴퓨터
(Execution)
"숫자 1을 더해!"
자연어 / 생각
1011 0000...
비트 패턴
⚡ ON/OFF
물리적 전기 신호
제어 및 연산
💡 핵심: 개발자는 프로그램을 기계어(비트 패턴)로 전달하기 위해 , 전선을 재배치하거나 스위치 다이얼을 조합하여 연산 경로를 설정하며 프로그래밍하여, 오른쪽 끝에서 전기 신호(ON/OFF)로 컴퓨터로 실행합니다.

 

  • 기계어의 정의: CPU가 별도의 해석 과정 없이 즉시 실행할 수 있는 유일한 언어 (0과 1의 비트 패턴).
  • 초기의 코딩 : 모니터와 키보드가 없던 시절, 초기 프로그래머들은 10110000 01100001 같은 숫자 패턴을 토글스위치를 딸깍거리며 올리고(1) 내리거나(0), 종이 카드에 구멍을 뚫는(천공카드) 방식으로 비트 패턴을 물리적으로 입력했습니다.

 

이처럼 초기 프로그래밍은 단순한 지적 활동을 넘어, 0과 1이라는 '기계의 언어'를 인간이 직접 손으로 입력해야 하는 육체적 고통이 수반되는 작업이었습니다.

 

 

2. 어셈블리어 (Assembly Language)

"0과 1" 입력 방법을 개선한 것이 어셈블리어입니다. 기계어와 1:1로 대응되지만, 사람이 읽을 수 있는 단어로 바꾼 것입니다.

👨‍💻 개발자
(Developer)
3단계: 어셈블리어
(Assembly)
2단계: 어셈블러
(Assembler)
1단계: 기계어
(Machine Code)
🤖 컴퓨터
(Execution)
"숫자 1을 더해!"
자연어 / 의도
(중간 단계 없음) (중간 단계 없음)
1011 0101...
비트 패턴
⚡ ON/OFF
전기 신호 실행
MOV AL, 97
사람이 읽는 단어
(Mnemonic)
번역
1:1 매핑
1011 0000...
비트 패턴
💡 해석: "97이라는 값을 AL 레지스터로 옮겨라(Move)"
※ 어셈블리어는 기계어와 1:1 대응되지만, 하드웨어를 알아야 하는 저급 언어(Low-Level)입니다.

 

 

3. 어셈블리어의 치명적 문제

어셈블리어 덕분에 우리는 ‘0과 1’로 직접 코딩하는 단계에서는 벗어났습니다.

하지만 초창기(1950~60년대)에는 컴퓨터마다 CPU 아키텍처(명령어 집합, ISA) 가 달랐고, 그 결과 어셈블리어도 서로 호환되지 않는 경우가 많았습니다.

 

즉, 같은 기능의 프로그램이라도 기종이 바뀌면 다시 작성해야 하는 문제가 발생했습니다.

 

🔍 상황 예시: "숫자 1을 더해라" (Add 1)
컴퓨터 종류 어셈블리어 명령 왜 다른가?
A사 컴퓨터
(누산기 구조)
ADD 1 "이미 저장된 값에 1을 더해라"
(단순 구조)
B사 컴퓨터
(레지스터 구조)
L R1, DATA AR R1, 1 "값을 가져오고(Load),
그 다음 더해라(Add Register)"
C사 컴퓨터
(스택 구조)
PUSH 1 ADD "1을 밀어 넣고(Push),
더하기 연산을 해라"

 


컴퓨터 수요가 폭발하고 제조사/기종이 다양해지자, 엔지니어들은 기종마다 다른 어셈블리어를 다시 배우고, 프로그램도 기종별로 다시 만들어야 했습니다.
이것이 바로 프로그램을 다시 만드는 
하드웨어 종속성(Hardware Dependency) 문제가 심각했습니다.