컴파일 과정
소스코드를 작성하고 빌드를 하게되면 일반적으로 다음과 같은 과정을 통해 실행파일이 만들어진다.
소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output)
전처리기는 소스코드 자체에 대한 수정을 담당한다.
컴파일러는 소스코드를 어셈블리 코드로 번역한다.
어셈블러는 어셈블리 코드를 목적코드로 번역한다.
링커는 생성된 목적코드들을 링킹하여 실행파일을 만든다.
컴파일타임 & 런타임
전체 컴파일 과정과 그 이후 과정 중,
실행파일이 만들어지는 순간까지를 컴파일타임이라 부르고,
실행파일이 실행된 후의 시간대를 런타임이라 부른다.
소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output) -> 실행
컴파일타임 런타임
정적타입 언어 (Static Typed Language)
정적타입 언어는 컴파일 시에 변수의 타입이 결정되는 언어를 의미한다.
대표적인 언어로는 C, C++, Java, C# 등이 있다.
자료형이 컴파일 타임에 결정되기 위해서, 소스코드 작성 시 명시적으로 자료형을 지정해주어야 한다.
string name = "myname";
int score = 100;
장점
타입 에러로 인한 문제를 컴파일 타임에 해결할 수 있기 때문에 안정성이 높다. (규모가 큰 프로젝트 제작에서 선호됨)
컴파일 시에 미리 타입을 결정하기 때문에 실행속도가 빠르다.
단점
컴파일 타임에 타입에 대한 제한으로 코드 작성 시 유연함이 떨어진다.
동적타입 언어 (Dynamic Typed Language)
동적타입 언어는 런타임 시 자료형이 결정되는 언어를 의미한다.
대표적인 언어로는 Python, JavaScript, Ruby 등이 있다.
자료형이 런타임에 결정되기 때문에, 소스코드 작성 시 자료형을 명시적으로 지정해줄 필요가 없다.
a = 1
b = []
c = 'myname'
장점
소스코드 작성 시 타입에 대한 제한이 없기 때문에 유연성이 높다.
같은 이유로 코드 작성이 효율적이다.
단점
타입에 대한 리스크를 런타임에 감당해야한다.
스펠링에러로 인한 실수도 런타임에 감당해야한다.
ex)
my_value = 10
while my_value > 0:
#오타
my_vaule = (my_value + i) / 10
추가
동적타입언어, 정적타입언어와 강타입언어, 약타입언어는 완전히 다른 개념이다.
혼동하지 않도록 하자.
C, C++의 캐스팅이 런타임에 수행된다고 생각하는 경우가 많은데, 이는 타입을 실제로 변환하는 작업이 아니다. 단지 그 변수의 메모리를 어떻게 해석할건지에 대한 정의를 미리 내리는 것일 뿐이다.
'프로그래밍 > CS 개념' 카테고리의 다른 글
[CS] 메모리 구조 (0) | 2021.04.17 |
---|---|
[CS 기초] Managed vs Unmanaged 언어 (0) | 2021.04.16 |