logo

머신 코드

Computer Science · 12월 26일 · 22 min read
poster

컴퓨터 프로그래밍에서 기계어 명령어로 구성된 컴퓨터 코드를 말하며, 컴퓨터의 중앙처리장치(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로 표현된다.

관련 포스트
post image
책 디자인 패턴 후기
디자인 패턴: Elements of Reusable Object-Oriented Software(디자인 패턴: 재사용 가능한 객체지향 소프트웨어의 요소)(1994)는 소프트웨어 디자인 패턴을 설명한 소프트웨어 공학 서적이다. 에리히 감마, 리처드 헬름, 랄프 존슨,
Computer Science·12월 16일·16 min read
post image
브라우저 엔진, blink
블링크는 크롬 프로젝트의 일환으로 개발된 브라우저 엔진으로 애플, 구글, 메타, 마이크로소프트, 오페라 소프트웨어, 비발디 테크놀로지스, 어도비, 인텔, IBM, 삼성 등이 참여하고 있으며, 2013년 4월에 처음 발표되었다. 되었다. # 네이밍 블링크의 네이밍은
Computer Science·9월 14일·13 min read
post image
웹프레임워크란?
웹 프레임워크(WF) 또는 웹 애플리케이션 프레임워크(WAF)는 웹 서비스, 웹 리소스, 웹 API를 포함한 웹 애플리케이션 개발을 지원하도록 설계된 소프트웨어 프레임워크이다. 웹 프레임워크는 월드와이드웹에서 웹 애플리케이션을 구축하고 배포하기 위한 표준적인 방법을
Computer Science·7월 24일·11 min read
post image
nextjs의 탄생배경
Next.js는 민간기업 베르셀(Vercel)이 개발한 오픈소스 웹 개발 프레임워크로, 서버 측 렌더링과 정적 웹사이트 생성 기능을 갖춘 리액트 기반 웹 애플리케이션을 제공한다. 리액트 문서에서는 'Node.js로 서버 렌더링된 웹사이트를 구축할 때' 개발자에게 조
Computer Science·7월 14일·16 min read
post image
알고리즘의 정의
수학 및 컴퓨터 과학에서 알고리즘은 일반적으로 특정 문제 클래스를 해결하거나 계산을 수행하는 데 사용되는 엄격한 명령의 유한한 시퀀스이다. 알고리즘은 계산이나 데이터 처리를 수행하기 위한 사양으로 사용된다. 고급 알고리즘은 조건식을 사용하여 코드 실행을 다양한 경로(
Computer Science·7월 4일·29 min read
post image
운영체제 톺아보기
운영체제(OS)는 컴퓨터의 하드웨어 및 소프트웨어 자원을 관리하고 컴퓨터 프로그램에 공통된 서비스를 제공하는 시스템 소프트웨어이다. 시간 공유 운영 체제는 시스템을 효율적으로 사용하기 위해 작업을 예약하고 프로세서 시간, 대용량 저장 장치, 주변 장치 및 기타 자원
Computer Science·5월 21일·17 min read
post image
백그라운드-프로세스에-대해-알아보기
백그라운드 프로세스는 사용자의 개입 없이 무대 뒤에서(즉, 백그라운드에서) 실행되는 컴퓨터 프로세스를 말한다. 이러한 프로세스의 일반적인 작업에는 로깅, 시스템 모니터링, 스케줄링, , 사용자 알림 등이 있다. Windows 시스템에서 백그라운드 프로세스는 사용자
Computer Science·3월 1일·15 min read
post image
프로세스란?
컴퓨팅에서 프로세스는 하나 이상의 스레드에 의해 실행되는 컴퓨터 프로그램의 인스턴스이다. 다양한 프로세스 모델이 존재하며, 일부는 경량화되어 있지만, 거의 모든 프로세스(전체 가상 머신 포함)는 프로그램 코드, 할당된 시스템 자원, 물리적 및 논리적 액세스 권한, 실
Computer Science·2월 16일·26 min read