컴퓨터 프로그래밍에서 기계어 명령어로 구성된 컴퓨터 코드를 말하며, 컴퓨터의 중앙처리장치(CPU)를 제어하는 데 사용된다. 과거에는 10진법 컴퓨터가 일반적이었지만, 현대 시장에서는 2진법 컴퓨터가 주류다. 이러한 컴퓨터에서 기계 코드는 '컴퓨터가 실제로 읽고 해석하는 컴퓨터 프로그램의 2진수 표현'을 의미한다. 기계 코드의 프로그램은 일련의 기계 명령어(경우에 따라 데이터 포함)로 구성된다.
각 명령어는 CPU가 로드, 저장, 점프 또는 CPU의 레지스터나 메모리에 있는 하나 이상의 데이터 단위에 대한 산술논리연산장치(ALU) 연산과 같은 매우 특정한 작업을 수행하도록 한다.
초기 CPU는 특정 머신 코드가 있어 새로운 CPU가 출시될 때마다 이전 버전과의 호환성을 잃을 수 있었다. 명령어 집합 아키텍처(ISA)라는 개념은 시스템의 명령어 집합의 동작과 메모리 상의 인코딩을 정의하고 규정하는 것으로, 정확한 구현은 규정되어 있지 않다. 이는 추상화 계층으로 작용하여 동일한 CPU 제품군 내에서의 호환성을 허용하기 때문에, 제품군의 ISA에 따라 작성되거나 생성된 기계 코드는 향후 출시될 CPU를 포함하여 제품군 내 모든 CPU에서 작동한다.
일반적으로 각 아키텍처 제품군(x86, ARM 등)은 고유한 ISA를 가지고 있으며, 따라서 고유한 기계어 코드 언어를 가지고 있다. 예외도 있는데, VAX 아키텍처는 PDP-11 명령어 세트를 선택적으로 지원했고, IA-64는 IA-32 명령어 세트를 선택적으로 지원했다. 또 다른 예로는 PowerPC와 x86 명령어를 모두 기본적으로 처리하도록 설계된 프로세서인 PowerPC 615가 있다.
기계어는 엄밀히 말하면 수치 언어이며, 프로그래머를 위한 CPU에 대한 가장 낮은 수준의 인터페이스이다. 어셈블리 언어는 수치 기계어 코드와 수치 연산 코드와 피연산자를 읽을 수 있는 문자열(예: x86의 x86 NOP 명령어인 0x90)로 대체한 사람이 읽을 수 있는 버전 사이의 직접적인 매핑을 제공한다. 기계어 코드로 직접 프로그램을 작성하는 것은 가능하지만, 개별 비트를 관리하고 수치 주소와 상수를 수동으로 계산하는 것은 번거롭고 오류가 발생하기 쉽다. 따라서 현대적 맥락에서 프로그램이 기계어로 직접 작성되는 경우는 매우 드물지만, 저수준 디버깅, 프로그램 패치(특히 어셈블러 소스를 사용할 수 없는 경우), 어셈블리 언어의 디스어셈블을 위해 수행될 수 있다.
오늘날 대부분의 실용적인 프로그램은 고급 언어로 작성된다. 이러한 프로그램은 컴파일러에 의해 기계어로 번역되거나 인터프리터에 의해 해석된다. 보통은 바이트코드와 같은 중간 코드로 번역된 후 인터프리터에 의해 해석된다.
그러나 내부적으로 많은 프로세서는 마이크로 코드를 사용하거나 최적화하여 기계어 명령어를 마이크로 연산 시퀀스로 변환한다. 일부 기계를 제외하고는 사용자가 마이크로코드와 마이크로연산을 작성할 수 없으며, 마이크로코드의 동작과 기계어 명령어를 마이크로연산으로 변환하는 것은 성능 관련 부작용을 제외하고는 프로그래머에게 투명하게 이루어진다.
모든 프로세서 또는 프로세서 제품군은 고유한 명령어 세트를 가지고 있다. 명령어는 기계 명령에 대응하는 비트, 숫자, 문자 패턴이다. 따라서 명령어 세트는 (거의) 동일한 아키텍처를 사용하는 프로세서 클래스에 고유하다. 후속 또는 파생 프로세서 설계는 종종 이전 프로세서의 명령어를 포함하고 새로운 명령어를 추가하기도 한다. 호환되는 프로세서도 일부 명령어에서 약간 다른 동작을 보일 수 있지만 거의 문제가 되지 않는다. 시스템은 메모리 배치, 운영 체제, 주변 장치와 같은 다른 세부 사항도 다를 수 있다. 프로그램은 일반적으로 이러한 요소에 의존하기 때문에 같은 종류의 프로세서를 사용하더라도 서로 다른 시스템에서 동일한 기계 코드가 실행되지 않는 것이 일반적이다.
프로세서의 명령어 세트에는 고정 길이의 명령어와 가변 길이의 명령어가 있다. 패턴이 어떻게 구성되는지는 특정 아키텍처와 명령어 유형에 따라 다르다. 대부분의 명령어에는 기본 명령어 유형 (산술, 논리, 점프 등), 연산 (예 : 덧셈 및 비교 등), 피연산자 유형, 주소 지정 모드, 주소 지정 오프셋 또는 인덱스, 피연산자 값 자체 (명령어에 포함 된 상수 피연산자를 즉석 값이라고 함)를 지정하는 하나 또는 여러 개의 연산 코드 필드가 있다.
모든 기계나 개별 명령어에 명시적인 피연산자가 있는 것은 아니다. 단일 어큐뮬레이터가 있는 기계에서 어큐뮬레이터는 암묵적으로 대부분의 산술 명령어의 왼쪽 피연산자이자 결과이며, x86 아키텍처와 같은 다른 아키텍처에서는 일반적인 명령어의 어큐뮬레이터 버전이 있으며, 어큐뮬레이터는 긴 명령어에서 일반 레지스터 중 하나로 간주된다. 레지스터 중 하나로 간주됩니다. 스택 머신은 대부분의 또는 모든 피연산자를 암묵적 스택에 배치한다. 예를 들어, x86 아키텍처의 CPUID는 4개의 암묵적 목적지 레지스터에 값을 쓴다. 이러한 명시적 피연산자와 암묵적 피연산자의 구분은 코드 생성기, 특히 레지스터 할당 및 라이브 범위 추적 부분에서 중요하다. 좋은 코드 옵티마이저는 명시적 피연산자뿐만 아니라 암묵적 피연산자도 추적할 수 있어 상수 전파, 레지스터 상수 폴딩(상수 식의 결과를 대입한 레지스터를 상수로 대체하여 해제하는 것) 및 기타 코드 확장을 더 자주 수행할 수 있다.
컴퓨터 프로그램은 중앙처리장치(CPU)가 실행할 수 있는 명령어 목록이다. 프로그램을 실행하는 CPU가 문제를 해결하고 결과를 달성하기 위해 프로그램을 실행한다. 단순 프로세서는 명령어를 차례로 실행할 수 있지만, 슈퍼스칼라 프로세서는 특정 상황(파이프라인이 꽉 찬 경우)에서 두 개 이상의 명령어를 동시에 실행할 수 있다. 일례로 1993년 출시된 최초의 인텔 펜티엄은 파이프라인이 가득 차면 클럭 사이클당 최대 2개의 명령어를 실행할 수 있다.
프로그램 흐름은 다음 숫자 순차 주소 이외의 주소(즉, 명령어)로 실행을 옮기는 특수한 '점프' 명령어에 의해 영향을 받을 수 있다. 이러한 조건부 점프 발생 여부는 어떤 값이 다른 값보다 크거나 작거나 같을 때와 같은 조건에 따라 결정된다.
어셈블리 언어라고 불리는 보다 인간 친화적인 기계어 표현은 명령어의 숫자를 직접 사용하는 대신 기계어 명령어를 참조하기 위해 니모닉 코드를 사용하고, 저장 위치 및 때로는 레지스터를 참조하기 위해 기호 이름을 사용합니다. 예를 들어, Zilog Z80 프로세서에서 CPU가 B 범용 레지스터를 감소시키는 기계어 코드 00000101은 어셈블리 언어에서 DEC B로 표현된다.