이번 단원에서는 명령어에 대해서 배웠어요!
사람이 컴퓨터에게 일을 시키기 위해서는
컴퓨터에게 알맞은 명령을 내려야 합니다.
하지만 컴퓨터는 사람이 하는 모든 말을 알아듣지는 못해요...
컴퓨터는 바보니까요.
그래서 사람 쪽에서 더 힘을 써야 합니다.
컴퓨터가 이해할 수 있는 언어로 바꾸어서 명령을 내려야 합니다!
1. 소스 코드와 명령어
고급 언어와 저급 언어
한국어, 일본어, 영어처럼, 컴퓨터와 사람 사이에도 언어가 있습니다.
사람에게 더 가깝게 (이해하기 쉽고 작성하기 쉽도록) 만든 언어는 고급 언어
컴퓨터에 더 가깝게 (컴퓨터가 이해하기 쉽지만 사람에게는 어려운) 만든 언어는 저급 언어
저급 언어에는 특히,
사람이 이해할 수 없는 0과 1의 명령어 비트로 이루어진 기계어와
기계어를 읽기 편한 형태로 번역한 어셈블리어가 있습니다.
고급 언어도 결국엔 저급 언어로 변환을 해야
컴퓨터가 이해할 수 있어요
고급 언어: 사람이 이해하고 작성하기 쉽게 만들어진 언어 (C, C++ 등)
저급 언어: 컴퓨터가 이해하고 실행할 수 있는 언어
기계어: 0과 1의 명령어 비트로 구성된 언어, 2진수 혹은 16진수로 표현 -> 사람이 이해할 수 없음
어셈블리어: 기계어를 읽기 편한 형태로 번역한 언어 (ex. mov a, b)
컴파일 언어와 인터프리터 언어
변환하는 방식에 대해서도 이야기해 볼게요
고급 언어에서 저급 언어로 변환하는 방식에 따라
크게 컴파일 방식과 인터프리터 방식으로 구분합니다
컴파일 언어는 대표적으로 C언어가 있는데요,컴파일은 소스 코드 전체가 저급 언어로 변환되는 방식이에요.말 그대로 코드를 한 번에 다 변환한다는 거죠
인터프리터 언어는 Python 등이 있는데소스 코드가 한 줄 한 줄씩 실행되며 변환되는 방식입니다.
그렇다면 어떤 언어가 더 빠를까요??한 번 생각을 해봅시다
책을 한 권 번역한다고 볼 때,한 권 전체를 번역기를 돌리는 것 vs. 한 문장씩 번역기를 돌리는 것
상상해 보니 전자가 훨씬 빠르겠죠? ㅋㅋ마찬가지로 컴파일 언어가 인터프리터 언어보다 빠릅니다.
고급 언어를 저급 언어로 변환하는 방식에 따라 크게 컴파일 방식과 인터프리트 방식으로 구분
컴파일 언어: 소스 코드 전체가 저급 언어로 변환되는 고급 언어 (ex. C)
인터프리터 언어: 소스 코드가 한 줄씩 실행되는 고급 언어 (ex. Python)
인터프리터 언어가 컴파일 언어보다 느림
컴파일러의 구조: 토큰화하는 부분과 에러를 감지하는 두 부분을 나눌 수 있다
목적 파일 vs 실행 파일
- 목적 파일: 소스코드를 컴파일해서 나온 파일 (main.c > main.o)
- 실행 파일: 목적 파일에 없는 외부 기능들을 연결 짓는 '링킹' 작업이 진행된 파일
3-2. 명령어의 구조
연산 코드와 오퍼랜드
수행할 수 있는 명령어에 대해서도 배워보았습니다.
명령어가 수행할 연산 즉 연산자는 연산 코드로,연산에 사용할 데이터 혹은 그 데이터가 저장된 위치, 즉 피연산자는 오퍼랜드라고 부릅니다.
연산 코드: 명령어가 수행할 연산, 연산자
오퍼랜드: 연산에 사용할 데이터 혹은 데이터가 저장된 위치, 피연산자
연산 코드 필드 | 오퍼랜드 필드
add A, B
mov a, 0
주소 지정 방식
오퍼랜드 필드에 연산에 사용될 데이터가 아닌, 그 위치를 담는 이유는 무엇일까요?
그 부분에 그만큼 많은 공간을 할당할 수 없기 때문이에요.그래서 우리가 할 수 있는 것은,주소값만으로 표현할 수 있는 정보의 가짓수를 증가시키는 것입니다.
여기서는 주소를 지정하는 방식들에 대해 알아보았어요.
피연산자 데이터가 저장된 위치를 유효 주소라고 합니다.또, 이 주소를 찾는 방법을 주소 지정 방식이라고 해요.
오퍼랜드 필드에 연산 코드와 연산에 사용될 데이터로 구성하지 않고, 메모리나 레지스터의 주소를 담는 이유는?
오퍼랜드 필드에 많은 공간을 할당할 수 없기 때문 > 주소값으로 표현할 수 있는 정보의 가짓수를 증가시키기 (메모리 or 레지스터 크기만큼)
유효 주소: 연산의 대상이 되는 데이터가 저장된 위치
주소 지정 방식: 유효 주소를 찾는 방법
- 즉시 주소 지정 방식 (연산에 사용될 데이터)
연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식입니다.
표현할 수 있는 데이터의 크기는 작지만, 탐색 시간은 빠르다는 장점이 있어요.
- 직접 주소 지정 방식 (메모리 유효 주소)
오퍼랜드 필드에 유효 주소를 직접 명시하는 방식입니다.
즉시 주소 지정 방식보다는 표현할 수 있는 데이터의 크기가 더 커집니다.
그리고 연산코드를 제외한 나머지 영역에만 유효 주소를 표현할 수 있어요.
- 간접 주소 지정 방식 (유효 주소의 주소)
유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식입니다.
표현할 수 있는 유효 주소의 범위는 증가하지만,
메모리 접근이 두 번 이루어지면서 시간이 더 걸려요.
- 레지스터 주소 지정 방식 (레지스터 유효 주소)
레지스터의 유효 주소를 명시하는 방식입니다.
데이터 접근이 빠르지만, 표현할 수 있는 레지스터 크기에 제한이 있습니다.
- 레지스터 간접 주소 지정 방식 (유효 주소를 저장한 레지스터)
연산에 사용할 데이터를 메모리에 저장하고,
그 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방식입니다.
간접 주소 지정 방식과 원리는 비슷하지만
메모리 접근 횟수가 1번으로 줄어들어 더 적은 시간이 걸립니다.
혼자 공부하는 컴퓨터구조 + 운영체제를 읽고 배운 점을 정리합니다.
이전 글을 보려면 ⬇️
2023.08.29 - [CS/컴퓨터 구조] - [혼자 공부하는 컴퓨터구조 + 운영체제] Chap2. 데이터
[혼자 공부하는 컴퓨터구조 + 운영체제] Chap2. 데이터
혼자 공부하는 컴퓨터 구조+운영체제 이 책은 독학으로 컴퓨터 구조와 운영체제를 배우는 입문자가 ‘꼭 필요한 내용을 제대로 학습’할 수 있도록 구성했다. 뭘 모르는지조차 모르는 입문자의
eraser-adventure.tistory.com
'CS > 컴퓨터 구조' 카테고리의 다른 글
[혼자 공부하는 컴퓨터구조 + 운영체제] Chap2. 데이터 (0) | 2023.08.29 |
---|---|
[혼자 공부하는 컴퓨터구조 + 운영체제] Chap1. 컴퓨터 구조를 알아야 하는 이유 (0) | 2023.07.14 |