03장 - 1 : 소스 코드와 명령어
목표 : 소스 코드가 컴퓨터 내부에서 명령어가 되고 실행되는 과정 학습
모든 소스코드는 컴퓨터 내부에서 명령어로 변환되고 실행된다.
고급 언어와 저급 언어
게임 개발에 가장 많이 쓰이는 Unity는 C#으로 원하는 로직을 구현한다.
하지만 컴퓨터는 C#을 직접적으로 이해할 수 없다.
우리가 프로그램을 만들 때 사용하는 프로그래밍 언어는 사람이 이해하기 쉽게 만들어진 언어이므로 컴퓨터는 이해하지 못한다. 이런 '사람을 위한 언어'를 고급 언어라고 한다.
반대로, '컴퓨터가 직접 이해하고 실행할 수 있는 언어'를 저급 언어라고 하는데 이 저급 언어에는 두 가지가 있다.
- 기계어 : 0과 1의 명령어 비트로 이루어진 언어
0001 0000 0000 0010 // (0x1002) : 레지스터 0에 값 2를 저장
0010 0001 0000 0003 // (0x2103) : 레지스터 1에 값 3을 저장
0011 0000 0001 0000 // (0x3010) : 레지스터 0과 레지스터 1의 값을 더해서 레지스터 0에 저장
0100 0000 0000 0000 // (0x4000) : 레지스터 0의 값을 메모리 주소 0에 저장
- 어셈블리어 : 0과 1로 표현된 명령어 (기계어)를 읽기 편한 형태로 번역한 언어
MOV R0, #2 ; 레지스터 R0에 상수 2를 저장
MOV R1, #3 ; 레지스터 R1에 상수 3을 저장
ADD R0, R0, R1 ; 레지스터 R0과 R1의 값을 더해서 R0에 저장
STR R0, [0] ; 레지스터 R0의 값을 메모리 주소 0에 저장
* 왜 저급 언어를 알아야 하는가 ? : 프로그램이 어떤 절차로 작동하는지를 가장 근본적인 단계에서부터 하나하나 추적하고 관찰 할 수 있고, 특히 하드웨어와 밀접한 관련이 있는 임베디드, 게임 개발자 등은 접할 일이 있다. 그렇지 않더라도 고급 언어와 저급 언어의 기본적인 차이 정도는 알고 있는 것이 매우 좋은 교양이 된다.
고급 언어는 우리가 익히 사용하는 C, C++, Java, Python과 같은 언어들이 있다.
모든 고급 언어들은 결국 특정 과정을 거쳐 저급언어로 변환되어 실행된다.
컴파일 언어와 인터프리트 언어
고급 언어가 저급 언어로 변환되는 방식에는 크게 두 가지, 컴파일 방식과 인터프리트 방식이 있고
각각의 컴파일 방식으로 동작하는 프로그래밍 언어를 컴파일 언어, 인터프리트 언어라고 한다.
컴파일러 :
컴파일을 수행해주는 도구,컴파일러는 소스 코드 전체를 훑어보며 문법적 오류, 실행 가능성, 불필요한 코드 탐색 등 처음부터 끝까지 저급 언어로 컴파일한다. 이때 소스 코드 내에 오류가 하나라도 있다면 컴파일에 실패한다.
예를 들어 C 컴파일러는 불필요한 변수 제거, 연산 최적화, 레지스터 할당 최적화 등을 수행할 수 있다.
* 컴파일 : 소스코드 전체가 저급 언어로 변환되는 과정
* 목적 코드 : 컴파일러를 통해 저급 언어로 변환된 코드/ 기계어 코드 자체
인터프리터 :
소스 코드를 한 줄씩 저급 언어로 변환하여 실행해주는 도구, 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 N 번째 줄에 오류가 있어도 N - 1 째 줄까지는 올바르게 실행된다.
- 컴파일 언어 : 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 언어 ( C, C++ 등 )
- 인터프리터 언어 : 인터프리터에 의해 소스 코드가 한 줄 씩 실행되는 언어 ( Python 등 )
일반적으로 인터프리터 언어가 컴파일 언어보다 느리다.
컴파일을 통해 나온 결과물인 목적 코드는 컴퓨터가 이해하고 실행할 수 있는 저급 언어인 반면, 인터프리터 언어는 소스코드 마지막에 이를 때까지 한 줄 한 줄씩 저급 언어로 해석하며실행하기 때문이다.
* 하나의 프로그래밍 언어가 반드시 둘 중 하나의 방식으로만 작동하지는 않는다.
C 혹은 C++과 같이 명확하게 구분할 수 있는 언어도 존재하나, 많은 언어들은 그 경계가 모호하다.
대표적인 인터프리터 언어인 Python도 컴파일을 하지 않는 것은 아니며 Java는 둘 다 수행한다.
목적 파일 VS 실행 파일
목적 코드로 이루어진 파일을 목적 파일이라고 부르고 실행 코드로 이루어진 파일을 실행 파일이라고 부른다.
대표적으로는 윈도우의 .exe 확장자를가진 파일이 실행파일이다.
목적 코드는 컴퓨터가 이해하는 저급 언어이므로 그 자체로 실행 파일일까 ? 아니다, 목적 코드가 실행 파일이 되기
위해서는 링킹이라는 작업을 거쳐야 한다.
링킹(Linking) :
컴파일러가 생성한 하나 이상의 목적 파일과 라이브러리 파일들을 묶어 실행 가능한 하나의 파일로 만드는 과정.
정적 링킹(Static Linking)과 동적 링킹(Dynamic Linking) 두 가지 방식이 있다.
- 정적 링킹 : 실행 파일에 모든 라이브러리를 포함 , 실행 속도가 빠르나 파일 크기가 크다.
- 동적 링킹 :실행 파일에는 라이브러리가 없고, 실행할 때 시스템에서 불러옴 : 파일 크기가 작고 업데이트에 용이하다.