본문 바로가기

computer science

[#혼공] 혼자 공부하는 컴퓨터 구조+운영체제 [Chapter.03]

해당 챕터에서는 명령어를 다룹니다.

 

제가 현업에서 주로 사용하는 프로그래밍 언어는 파이썬입니다. 비전공자 출신의 개발자로서, "파이썬은 고급언어이다." 또는 "인터프리터 언어이다." 등의 말을 듣곤 하는데, 대략적으로 무슨말인지는 알겠지만, 그럼 다른 언어는 어떻길래? 그리고, 왜 이게 편하고 쉬운 언어인데? 라는 의문이 들고는 합니다. 이 책의 챕터 3을 읽고나니 넓은 시야에서의 무슨 의미인지 이해할 수 있게 되었습니다. 주관적인 기준에 의해서 요약하고 정리하겠지만 좀 더 구체적으로 이해가 필요하면 책을 구매하여 정독해보는 것을 추천합니다.

 

 

 

 

[03-01] 소스 코드와 명령어

 

 

고급언어와 저급언어

 

컴퓨터는 C, C++, Java, Python과 같은 프로그래밍 언어를 이해할 수 있을까? 라는 물음의 대답이 "그렇지 않다"라는 대답에 놀랐다. 내가 당장 현업에서 쉽게 사용하는 Python은 컴퓨터 그대로 이해할 수 없다. 왜냐하면, 위에서 나열한 언어들은 "고급 언어"이기 때문이다. 반대로, 컴퓨터가 직접 이해하는 언어는 "저급 언어"이다. 우리가 사용하는 "고급 언어"는 "저급 언어"로 변환되어 컴퓨터가 이해할 수 있게 된다. 저급 언어는 2가지의 종류가 있다. 바로 "기계어"와 "어셈블리어"이다. 

 

 

기계어 : 0,1의 명령어 비트로 이루어진 언어 

 

 

 

어셈블리어 : 0,1로 표현된 명령어를 읽기 편한 형태로 변역한 언어 

 

 

 

 

 

컴파일 언어와 인터프리터 언어 

 

위의 그림처럼 고급 언어는 크게 컴파일, 인터프리터 언어로 나눠지고, 각각 컴파일, 인터프리터 방식으로 변환되어 저급 언어로 번역된다. 

컴파일 언어에는 대표적으로 C가 있다. 인터프리터 언어로는 대표적으로 Python이 있습니다.

 

  컴파일 언어 인터프리터 언어
대표적인 언어 C Python
변환 방식 소스 코드 전체가 변환됨 한줄 한줄 변환됨
장점 인터프리터 언어에 비해 빠르다. 부분적으로 오류가 있어도 변환된다.
단점 부분적인 오류가 있으면, 전체 변환이 실패한다. 컴파일 언어에 비해 느리다.

 

하지만, 컴파일, 인터프리터 언어가 칼로 자르듯 구분되는 것은 아닙니다. 예를 들면, Python도 인터프리터 언어이지만 컴파일을 하지 않는 것은 아닙니다. 

 

 

 

 

[03-02] 명령어의 구조

 

연산 코드와 오퍼랜드

 

 

연산 코드 : 명령어가 수행할 연산 (연산자)

연산 코드는 총 4가지로 나눌 수 있습니다.

(1) 데이터 전송

(2) 산술/논리 연산

(3) 제어 흐름 변경

(4) 입출력 제어 

 

-> 하지만, CPU마다 명령의 종류와 생김새는 다릅니다. (Chapter.05에서 자세히 다룸)

 

 

오퍼랜드 : 연산에 사용할 데이터 또는 그 위치 (피연산자)

오퍼랜드는 명령어 안에 하나도 없을 수도 있고, 한 개, 두 개 또는 그 이상 여러 개가 될 수 있습니다. 

 

 

 

 

주소 지정 방식

 

즉시 주소 지정 방식 : 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식 (가장 빠르다)

 

 

직접 주소 지정 방식 : 유효 주소를 통해서, 메모리에서 오퍼랜드로 가져와 사용하는 방식

간접 주소 지정 방식 : 직접 주소 방식에 비해서, 표현할 수 있는 유효 주소의 범위가 넓어짐 (두 번 메모리에 접근하니까, 느리다)

 

레지스터 주소 지정 방식 : 직접 주소 지정 방식과 비슷함. CPU 외부의 메모리에서 읽어오는 것보다 빠르다. 

 

레지스터 간접 주소 지정 방식 : 유효 주소를 찾는 과정이 간접 주소 지정 방식과 비슷하지만, 메모리에 접근하는 횟수가 1회로 줄어든다. 간접 주소 지정 방식보다 빠르다. 

 

 

 

 

스택과 큐

 

스택 : 한쪽 끝이 막혀 있는 통과 같은 저장 공간이다. "나중에 저장한 데이털르 가장 먼저 빼내는 데이터 관리 방식 (후입선출)"라서 LIFO라고도 읽는다. 입력 : 1-2-3-4-5 / 출력 5-4-3-2-1 이다. 입력시 PUSH, 출력시 POP 명령어를 수행한다.

 

 

 

큐 : 양쪽이 모두 뚫려있는 저장 공간이다. 먼저 저장한 순서대로 데이터를 빼낸다. "가장 먼저 저장된 데이터부터 빼내는 데이터 관리 방식 (선입선출)"이라서 FIFO라고 읽는다.