---
title: "명령어 집합 구조: 소프트웨어와 CPU가 공유하는 계약"
author: "Lee"
published_at: "2026-10-21T01:57:00.821Z"
updated_at: "2026-09-30T09:48:28.684Z"
tags: ["컴퓨터공학","컴퓨터구조"]
canonical_url: "https://ariser.io/@writer_a1cd615ab19e/%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A7%91%ED%95%A9-%EA%B5%AC%EC%A1%B0-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%99%80-cpu%EA%B0%80-%EA%B3%B5%EC%9C%A0%ED%95%98%EB%8A%94-%EA%B3%84%EC%95%BD"
ai_assisted: false
---

# 명령어 집합 구조: 소프트웨어와 CPU가 공유하는 계약

[원문](https://ariser.io/@writer_a1cd615ab19e/%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A7%91%ED%95%A9-%EA%B5%AC%EC%A1%B0-%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%EC%99%80-cpu%EA%B0%80-%EA%B3%B5%EC%9C%A0%ED%95%98%EB%8A%94-%EA%B3%84%EC%95%BD)

같은 프로그램의 기계어를 서로 다른 CPU 모델에서 실행할 수 있는 이유는 공통의 명령어 집합 구조를 구현하기 때문이다. ISA는 소프트웨어가 볼 수 있는 명령의 의미, 레지스터, 주소 지정, 데이터 표현과 관련 실행 규칙을 정하는 인터페이스다. CPU 내부 회로를 그대로 설명하는 설계도가 아니라 프로그램이 기대할 수 있는 동작의 계약이다.

![같은 ADD 명령 계약을 순차 코어와 넓은 파이프라인 코어가 각각 구현해 같은 결과를 만드는 그림](/api/v1/media/e660376d-89c7-4ba8-9cc9-75754022dd31)

*ISA는 관찰 가능한 동작을 정하고 미세구조는 그 동작을 구현하는 방법을 선택한다.*

## 명령의 뜻과 명령의 구현

교육용 명령 `ADD r3, r1, r2`가 r1과 r2를 더해 r3에 넣는다고 하자. ISA는 결과와 규정된 부수 효과를 정의한다. 그 계산을 몇 단계로 나누는지, 어떤 덧셈 회로를 사용하는지, 다른 명령과 동시에 실행하는지는 구현이 선택할 수 있다. 프로그램의 허용된 관찰 결과를 지키는 한 여러 미세구조가 같은 ISA를 구현할 수 있다.

RISC-V의 [ISA 소개](https://docs.riscv.org/reference/isa/v20240411/unpriv/intro.html)는 소프트웨어에 보이는 인터페이스를 특정 하드웨어 구현과 구분하고, 작은 기본 집합과 선택 확장으로 구성하는 목표를 설명한다. 명령 집합의 이름이 같아도 어떤 확장을 지원하는지에 따라 실행 가능한 기계어는 달라질 수 있다. 특정 확장이 필요한 프로그램을 기본 집합만 지원하는 CPU에 그대로 실행할 수 있다고 가정하면 안 된다.

## 같은 계약, 다른 성능

한 CPU는 한 번에 명령 하나를 순서대로 처리하고, 다른 CPU는 여러 명령의 단계를 겹치며 준비된 명령을 먼저 계산할 수 있다. 두 CPU는 같은 덧셈과 분기 의미를 제공하면서도 캐시 크기, 예측기, 실행 장치 수가 다를 수 있다. 그래서 ISA가 같다는 사실은 결과 호환의 중요한 조건이지 성능이 같다는 뜻은 아니다.

반대로 같은 기능의 프로그램을 다른 ISA로 옮기려면 해당 ISA의 기계어로 다시 변환하거나 기존 명령을 해석·번역하는 실행 환경이 필요하다. 소스 코드가 같아도 생성된 바이너리가 다를 수 있다. 컴파일러의 목표 아키텍처 설정은 어떤 명령과 레지스터 규칙에 맞춰 코드를 만들지 선택한다.

## 바이너리 실행에는 더 많은 합의가 있다

ISA만 맞으면 모든 실행 파일이 바로 동작하는 것은 아니다. 함수 인수와 반환값을 전달하는 호출 규약, 실행 파일 형식, 운영체제 서비스, 라이브러리 의존성도 맞아야 한다. 이를 포함하는 ABI와 실행 환경의 역할을 구분할 필요가 있다. ISA는 CPU 명령의 계약이고, 프로그램 전체 실행에는 그 위의 계약들도 참여한다.

RISC와 CISC는 명령 설계의 경향을 설명하는 역사적 분류지만, 이름만으로 현대 CPU의 내부 동작이나 속도를 판단하기 어렵다. 복잡한 명령을 내부의 여러 작업으로 나누기도 하고, 단순한 명령 집합도 복잡한 비순차 실행 장치로 구현할 수 있다. 소프트웨어 인터페이스의 복잡성과 회로 구현의 복잡성은 같은 축이 아니다.

ISA를 읽을 때는 명령 인코딩뿐 아니라 부호 확장, 예외, 메모리 접근 순서, 특권 관련 규칙도 중요하다. 정상 계산 값만 맞고 오류 상황이나 관찰 순서가 다르면 계약을 어길 수 있다. 에뮬레이터, 컴파일러, 운영체제 개발에서 이런 경계 조건이 특히 중요해진다.

이 용어를 이해하면 CPU 제품명과 프로그램 호환성, 최적화 옵션을 분리해서 생각할 수 있다. 무엇을 실행할 수 있는가는 ISA와 환경의 문제이고, 얼마나 빠르게 실행하는가는 구현과 작업 특성의 문제다. 계약과 구현을 나누는 관점이 컴퓨터 구조의 여러 기법을 한 틀 안에서 이해하게 한다.

### 참고 자료

- [RISC-V International — Unprivileged ISA Introduction](https://docs.riscv.org/reference/isa/v20240411/unpriv/intro.html)
