기계어 (Machine Code)
Entity (인물·조직)lectureverified2026-05-09

기계어 (Machine Code)

#vch#lecture-intro#A-language#g1

기계어 (Machine Code)

1. 한 줄 요약

기계어는 CPU 가 직접 해석하는 가장 낮은 단계의 명령어 체계로, 이진수(0·1) 또는 16진수로 표현된 비트열이 곧 프로그램 그 자체이다.

2. 등장 시기·배경

기계어는 별도의 발명자나 시점이 따로 없다. 1940년대 후반 ENIAC·EDVAC·Manchester Baby 같은 초기 전자 컴퓨터가 등장하면서, CPU 가 해석할 수 있는 명령어의 비트 패턴 자체가 곧 기계어로 정의되었다. 즉 기계어는 발명된 것이 아니라 하드웨어와 함께 태어난 것 이다.

당시 프로그래밍은 펀치카드·천공테이프·토글 스위치를 통해 0과 1을 직접 입력하는 방식이었다. ENIAC 의 초기 프로그래밍은 케이블을 손으로 다시 꽂는 재배선(rewiring) 작업에 가까웠고, EDSAC(1949) 이후 비로소 메모리에 저장된 명령어를 실행하는 저장 프로그램 방식(stored program) 이 정착했다.

기계어의 결정적 한계는 두 가지로 정리된다. 위키피디아 Assembly language 항목은 이를 "error-prone, tedious, and time-consuming" — 오류가 잘 나고, 단조로우며, 시간이 많이 드는 작업이라고 기록한다. 숫자로 된 연산코드(opcode)를 외우고 메모리 주소를 직접 계산해야 했기 때문에, 단 한 줄의 프로그램을 쓰는 데도 종이 위 사전 설계가 필수였다.

3. 핵심 특징

  1. CPU 직접 실행 (native) — 위키피디아는 "Machine code is classified as native with respect to its host CPU since it is the language that the CPU interprets directly" 라고 정의한다. 별도의 변환 단계가 없다.
  2. 이진 명령어 인코딩 — 모든 명령이 0·1 의 비트 패턴으로 표현된다. 명령어 형식·길이·필드 구성은 CPU 아키텍처 명세에서 정해진다.
  3. 명령 단위 동작 — 데이터 적재(load), 산술 연산(add/sub/mul), 분기(jump/branch), 메모리 접근(store) 같은 원자 단위 명령으로 모든 프로그램이 구성된다.
  4. 아키텍처 종속 — 위키피디아가 "Machine code compatible with one family is not with others" 라고 명시하듯, x86 기계어는 ARM CPU 에서 동작하지 않는다. 이식성 0.
  5. 하드웨어 직접 제어 — 레지스터·메모리·ALU·I/O 포트를 비트 단위로 직접 다룬다. 추상화 계층 없음.

4. 주 용도

1940~50년대 초반에는 모든 프로그램 이 기계어 또는 직후 등장한 어셈블리로 작성되었다. 군사 탄도 계산(ENIAC), 인구조사(UNIVAC), 학술 수치 계산(EDSAC), 암호 해독 등 초기 컴퓨터 응용 전부가 해당된다. 현대에는 직접 작성하는 일은 거의 없고, 컴파일러·어셈블러가 생성하는 최종 출력 형태 로만 존재한다. 다만 임베디드 펌웨어 디버깅, 익스플로잇 분석, 부트로더 검사 같은 영역에서는 여전히 기계어 수준 독해가 요구된다.

5. 그 시대의 설계 도구 매핑 ★

비트 한 자리만 틀려도 시스템 전체가 무너지는 환경이었기 때문에, 코드보다 설계가 먼저 일 수밖에 없었다. 1940~50년대 주류 설계 도구는 다음과 같이 정리된다.

설계 도구역할
플로차트(flowchart)1947년 Herman Goldstine 과 John von Neumann 이 "Planning and Coding of Problems for an Electronic Computing Instrument" 에서 정식으로 도입. 알고리즘의 흐름을 사각형·다이아몬드·화살표로 표현.
메모리 맵(memory map)변수·코드·스택이 메모리 어느 주소에 위치할지 손으로 그린 표. 충돌 방지가 절대 명제.
명령어 표(instruction table)CPU 가 해석하는 opcode 와 비트 패턴 대응표. 프로그래머가 종이에 인쇄해 옆에 두고 작업.
점프 주소 수기 계산분기 명령의 목적지를 메모리 주소로 직접 계산. 코드를 추가·삭제할 때마다 주소가 밀려 전체 재계산 필요.

이 시대의 설계 는 곧 코딩 그 자체보다 훨씬 무거운 작업 이었다. 강의 핵심 명제 — 프로그래밍 언어는 시대마다 발전했지만 설계의 중요성은 처음부터 일관되었다 — 의 가장 극명한 출발점이 바로 기계어 시대다.

6. 언어 그룹 분류

저수준 언어(low-level language)의 기준점. 명령형(imperative)·비구조적(unstructured) 패러다임. 절차적 구조도, 함수 추상화도, 타입 시스템도 없다. 모든 상위 언어는 결국 컴파일러·어셈블러를 거쳐 기계어로 변환되므로, 기계어는 모든 프로그래밍 언어의 종착점 역할을 동시에 수행한다.

7. 강의 도입 활용 포인트

기계어 시대의 종이 위 플로차트·메모리 맵을 보여주면, "설계 없이는 코딩이 안 된다" 는 본 강의 핵심 명제가 80년 전부터 이미 산업계 표준이었음이 한눈에 기록된다. AI Native 시대의 LLMWiki·CLAUDE.md 가 그 종이 위 플로차트의 디지털 후예 라는 서사로 연결할 수 있다.

출처

그룹 시리즈

synthesis/group-g1 (시대 그룹 종합 카드)