[CS] 컴파일 타임 vs 런타임
프로그래밍 언어의 작동 순서
- 고수준 언어로 소스 코드 작성 (Java, Js…)
- 작성된 코드를 기계어로 변환 (컴파일 타임)
- 기계어를 컴퓨터가 실행 (런타임)
Compile time
우리가 작성한 고수준 언어(소스코드)는 컴퓨터가 이해하지 못한다. 즉, 컴퓨터가 이해할 수 있는 언어로 변환해주는 과정이 필수적이다. 이때 기계어로 변환하는 시점을 컴파일 타임이라고 한다.
컴파일 언어
컴파일 언어는 위에서 말한 기계어로 변환하는 과정이 필수적이다. 실행시에 기계어로 바로 하드웨어에 접근 가능하기 때문에 매우 빠르다.
- Java
- C
- C++
Java의 경우
Java의 경우 컴파일을 할 시, 바이트코드가 생성된다. 자바는 JVM을 사용해서 동작하기 때문에, JVM이 이해할 수 있는 바이트 코드로 변환해준다.
.java 파일들을 .class 로 변환하는 과정이다. 컴파일 하고 바이트코드를 살펴보면 .class 파일들이 생성된 것을 볼 수 있다.
스크립트 언어 (인터프리터 언어)
스크립트 언어의 경우, 기계어로 변환하는 과정이 없다. 컴파일을 하지 않고, 소스 코드를 한 줄씩 번역하여 실행한다.
컴파일을 하는 시간이 들지 않지만, 기계어로 변환된 코드보다 한 줄씩 번역하는 과정이 반복 수행되어야 하기 때문에 실행속도가 느리다. (즉 타임검사, 해석 등이 동적으로 실행되어야 한다.)
- Python
- Javascript
- Ruby
Runtime
소스코드에서 기계어로 컴파일이 완료됐다면, 해당 기계어를 가지고 프로그램을 실제로 실행시키는 시간을 Runtime이라고 한다. 컴퓨터 메모리에 로드되고, CPU로 처리한다.
Compile Error
소스코드를 기계어로 컴파일링 하는 과정에서 발생할 수 있는 여러 에러를 뜻한다. 주로 실행시키기 전에 예측 가능한 오류들이 있다. 이런 에러들은 실행 전에, IDE에서 미리 알려주는 경우도 있다. 즉, 컴파일 에러가 있다면 런타임으로 넘어갈 수 없다.
- 문법 오류(Syntax Error): 세미콜론 생략
- Type 체크: 잘못된 자료형
- 파일 참조 오류
Runtime Error
컴파일 과정에서는 문제가 없었으나, 실행시에 예기치 않은 문제가 발생하는 것을 뜻한다. Java의 경우 JVM에서 해당 오류를 감지한다. 프로그래머가 try-catch문을 사용하거나, 직접 설계를 변경하여 해결할 수 있다.
- null 참조 오류
- 메모리 부족 오류
- 0으로 나누는 오류
- 스택 오버플로우