우리가 프로그램을 만들 때 사용하는 프로그래밍 언어
c++, python, java, javascript…
컴퓨터가 직접 이해하고 실행할 수 있는 언어
기계어, 어셈블리어
컴파일은 고급언어로 작성된 코드를 저급 언어로 변환해주는 과정이다.
컴파일러는 개발자가 작성한 소스코드를 목적 코드로 바꾼다.
소스 코드 내에 오류가 하나라도 있으면 컴파일이 불가능 하다
인터프리터에 의해 소스 코드가 한 줄씩 실행 되는 고급 언어
n번째 줄에 오류가 있어도, n-1번째 줄까지는 정상적으로 수행됨
컴파일이 가능하다고 해서 인터프리트가 불가능 하거나, 인터프리트가 가능한 언어라 해서 컴파일이 불가능 한건 아니다. python도 컴파일을 하고, java도 인터프리트를 한다.
따라서 고급 언어가 저급언어로 변환되는 방법에는 컴파일 방식과 인터프리트 방식이 있다로 해석하자.
목적 코드는 컴퓨터가 이해하는 저급언어로 이루어진 코드이고,
목적 코드로 이루어진 파일을 목적 파일이라고 한다.
링킹을 통해 목적 파일에 필요한 내용들을 가져와 실행할 수 있는 실행파일로 만든다.
명령어는 연산 코드와 오퍼랜드로 구성되어 있다
명령어가 수행할 연산자
데이터 전송/ 산술,논리 연산 / 제어 흐름 변경 / 입출력 변경등이 있다.
연산에 사용할 데이터가 저장된 위치
오퍼랜드 필드에는 데이터 또는 메모리나 레지스터 주소가 들어있다.
오퍼랜드에 왜 바로 데이터를 넣지않고 데이터가 저장되어 있는 위치의 주소를 넣는가?
데이터를 바로 넣으면 명령어의 길이가 너무 길어지기 때문이다
명령어가 n비트이고 연산코드가 m비트 이면 n - m비트의 데이터밖에 표현하지 못한다.
오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 데이터의 위치를 찾는 방법을 주소 지정 방식이라 한다.
오퍼랜드에 데이터의 주소를 넣지않고, 바로 데이터의 값을 넣는 방법
위 처럼 명령어의 길이가 너무 길어져 표현할 수 있는 데이터의 크기가 작아진다.
주소에서 찾아오는 과정이 없기 때문에 속도가 빠르다
오퍼랜드에 데이터가 저장된 메모리의 주소를 넣는 방법
표현할 수 있는 범위가 늘어남
오퍼랜드에 데이터가 저장된 곳을 가르키는 메모리의 주소를 넣음
직접 주소 지정 방식보다 표현할 수 있는 데이터의 범위가 조금 더 늘어남
두번 메모리 접근을 해야해서 속도가 느리다
오퍼랜드에 데이터가 저장된 레지스터의 주소를 넣는 방법
cpu 외부에 있는 메모리에 접근하는 것보다 cpu 내부에 있는 레지스터에 접근하는 것이 빠르기 때문에 속도가 빠르다.
연산에 사용할 데이터는 메모리에 저장하고, 레지스터는 그 메모리의 주소를 저장하는 방식
두번 접근하지만, 간접 주소 지정 방식보다 훨씬 빠르다.