프로그래밍 언어는 컴퓨터가 이해하는 언어가 아닌 사람이 이해하고 작성하기 쉽게 만들어진 언어이다.
컴퓨터가 이해하고 실행할 수 있는 언어는 오직 저급 언어
: 고급 언어로 작성된 소스 코드를 실행시키려면 저급언어 즉, 명령어로 변환시켜야 한다.
고급언어를 저급언어로 변환시키는 방법
1) 컴파일 방식 2) 인터프리트 방식이 있다.
컴파일 방식으로 작동하는 프로그래밍 언어를 컴파일 언어
인터프리트 방식으로 작동하는 프로그래밍 언어를 인터프리터 언어
컴파일 언어
: 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되는 고급언어
: 고급 언어 > 저급 언어로 변화는 과정을 컴파일(Compile)
: 컴파일 수행 도구를 컴파일러(Compiler)
: 컴파일러를 통해 저급 언어로 변환된 코드를 목적코드(Object Code)라고 한다.
인터프리터 언어
: 인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어
: 저급 언어로 변화하여 실행해 주는 도구를 인터프리터(interpreter)
: 소스 코드 내 하나의 오류가 발생 > 오류 발생 전까지 코드 실행 가능
목적 코드가 실행 파일이 되기 위해서는 링킹(linking)이라는 작업이 필요
소스 코드 > 컴파일 > 어셈블리 > 목적 코드 > 링킹 > 실행파일
예시)
main.c
helper.c에 있는 HELPER 더하기
화면 출력 라이브러리
main.c 컴파일 > main.o
--
helper.c
HELPER_더하기
helper.c 컴파일 > helper.o
main.c가 컴파일 되면서 main.o에 없는 외부 기능들
즉, HELPER 더하기, 화면 출력 라이브러리를 연결하는 작업을
링킹(linking)이라고 한다.
링킹이 완료되면 하나의 실행파일이 만들어진다.
명령어는 연산 코드와 어퍼랜드로 구성되어 있다.
하나의 명령어
연산코드 + 오퍼랜드
연산에 사용할 데이터, 연산에 사용할 데이터가 저장된 위치를 의미
그래서 숫자와 문자 등을 나타내는 데이터
메모리, 레지스터 주소가 올 수 있다.
다만, 오퍼랜드 필드에는 숫자나 문자와 같이 연산에 사용할 데이터를 직접 명시하는 것보다, 연산에 사용할 데이터가 저장된 메모리 주소, 레지스터 이름이 담깁니다. 그래서 오퍼랜드 필드 = 주소 필드라고 합니다.
오퍼랜드 안에는 명령어가 0개, 1개 , 2개 이상이 있을 수 있습니다.
명령어가 수행할 연산을 의미
1) 데이터 전송
2) 산술/논리 연산
3) 제어 흐름 변경
CALL과 RETRUN 은 함수를 호출하고 리턴하는 명령어
4) 입출력 제어
<정리>
CPU에서 명령어를 처리 > 내부에서 산술 처리
명령어를 외부에서 가져와서 cpu에서 처리
연산에 사용할 데이터 및 연산된 데이터는 설정한 코드에 따라 메모리에 저장
기계어는 컴퓨터가 이해함
기계어 + 어셈블리어 = 명령어
어셈블리어는 기계어를 우리가 이해할 수 있도록 만든 것(실제 컴퓨터는 기계어로 읽음)
어셈블리어 = 연산 코드 + 오퍼랜드로 되어 있음
코드 작성 > (저금언어로 변환 > 컴파일) 컴파일러가 저급언어로 변환 / 인터프리터로 저급언어로 변환 (컴파일 언어 = 목적 코드 Object code = 기계어 / 어셈블리어) > 기계어로 변환 > cpu에서 처리 > 처리한 데이터 메모리에 저장
컴파일 언어 특징 : 인터프리터보다 빠르다 / 오류가 하나라도 있으면, 컴파일 자체가 안됨
인터프리터 언어는 : 하나씩 해서 오류가 나타나기 전까지는 한줄씩 코드 실행
오퍼랜드 필드에 메모리나 레지스터 주소를 담는 이유는 오퍼랜드 필드가 할당할 수 있는 공간이 더 커지기 때문이다.
오퍼랜드 필드의 길이는 연산 코드만큼 길이를 뺀 길이가 된다. 이 경우, 오퍼랜드 필드의 크기는 더욱 작아진다. 그러면 하나의 오퍼랜드 필드로 표현할 수 있는 정보의 가짓수는 더욱 늘어난다.
오퍼랜드 필드 안에 메모리 주소가 담긴다면 표현할 수 있는 데이터의 크기는 하나의 메모리 주소에 저장할 수 있는 공간만큼 커진다.
오퍼랜드 필드에 메모리 주소가 인니 레지스터 이름을 명시할 때 또한 같다.
정보의 가짓수는 해당 레지스터가 저장할 수 있는 공간만큼 커진다.
연산 코드에 사용할 데이터가 저장된 위치 = 연산의 대상이 되는 데이터가 저장된 위치를 유효 주소라고 한다.
오퍼랜드 필드에 데이터가 저장된 위치를 명시할 때 연산에 사용할 데이터 위치를 찾는 방법을 주소 지정 방식이라고 한다.
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
데이터의 크기가 작아지는 단점
연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없어 다른 주소 지정 방식보다 빠르다.
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
즉시 주소 지정 방식보다 오퍼랜드 필드에서 표현할 수 있는 데이터의 크기는 더 커졌다. 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧앚여 표현할 수 잇는 유효 주소에 제한이 생길 수 있다.
유효 주소의 주소를 오퍼랜드 필드에 명시한다.
직접 주소 지정 방식보다 유효 주소의 범위가 더 넓어졌다.
두 번의 메모리 접근이 필요하기 때문에 즉시 주소 지정방식, 직접 주소 지정 방식보다 느리다.
연산에 사용할 데이터가 레지스터에 저장된 경우, 레지스터 주소 지어 방식 또는 레지스터 간접 주소 지정 방식을 사용
연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법
CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르다.
레지스터 주소 지정 방식은 직접 주소 지정보다 빠르게 데이터에 접근할 수 있다.
레지스터 주소는 지정 방식은 직접 주소 지정 방식과 비슷한 레지스터 크기에 제한이 생길 수 있다.
연산에 사용할 데이터를 메모리에 저장하고, 그 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시한다.
간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 한번으로 줄어든다는 차이점이자 장점이이 있다.
레지스터 간접 주소 지정 방식은 간접 주소 지정 방식보다 빠르다.
정리
주소 지정 방식 = 연산에 사용할 데이터를 찾는 방법
유효 주소 = 연산에 사용할 데이터가 저장된 위치
stack이란 한쪽 끝이 막혀 있는 통과 같은 저장 공간이다.
: 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식(후입선출)
: LIFO (Lsat In First Out) 자료구조라고 부른다.
POP 명령어 수행하면 스택 최상단 (Lsat In)
마지막 저장한 데이터 (First Out)
queue란 양쪽이 뚫려 있는 통과 같은 저장 공간
: 한쪽으로 데이터를 저장, 다른 한쪽으로 먼저 저장한 순서대로 데이터를 뺀다.
: 가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식(선입선출)
: FIFO (First In First Out) 자료구조라고 부른다.
혼자 공부하는 컴퓨터구조 + 운영체제
03. 데이터 (78p - 100p)