컴파일 타임
컴파일이란 개발자가 작성한 소스코드를 바이너리 코드(Machine Code)로 변환하는 과정을 말한다.
프로그램 개발 시 개발자는 먼저 소스코드를 작성한다. 소스코드는 프로그램의 동작 방식에 대해 정의한 것이다.
Java와 같은 고수준 언어(high-level language)로 작성된 소스 코드가 실행 가능한 프로그램이 되려면 반드시 컴퓨터가 인식할 수 있도록 머신 코드로 컴파일되어야 한다. 이런 편집 과정(compilation process)을 컴파일 타임이라고 한다. 컴파일 타임 동안 컴파일러는 코드 및 구문 등을 확인한다.
컴파일 타임 동안 일어나는 일을 조금 더 구체적으로 알아보자. 개발자가 작성한 .java 파일을 빌드하기 시작하면 아래와 같은 작업이 발생한다.
- Java 컴파일러(javac.exe)에 의해 .java 파일(소스코드 파일)이 .class 파일(바이트코드 파일)로 변환된다.
참고로 하나의 .java 파일은 파일 내부에 작성된 클래스 숫자에 따라 하나 혹은 여러개의 .class 파일로 나누어질 수 있다.
이 과정을 통해 .java 파일은 JVM이 이해할 수 있는 중간단계의 언어인 바이트 코드 형식으로 구성된 .class 파일로 변환된다. - .class 파일은 JVM에 의해 Assembly Code로 변환된다.
- Assembly Code는 JVM 내부의 JIT 컴파일러에 의해 Machine Code로 변환된다.
내가 이해한 것이 옳다면, 2번과 3번 과정을 별도로 생각하지 말고 하나의 단계로 바라보는 것이 좋다.
[용어 정리]
- 빌드 : 소스코드 파일을 실행가능한 소프트웨어 산출물로 만드는 일련의 과정.
JAR, WAR 등의 실행 가능한 파일을 만드는 작업을 일컫는다.
- Assembly Code : 텍스트로 이루어져 있다. 대체로 Machine Code와 1대1로 대응되는 형태를 가진다.
컴퓨터에 의해 바로 실행될 수 없고 어셈블러에 의해 Machine Code로 변경되어야 한다.
사람이 이해할 수 있는 고수준 언어와 컴퓨터가 이해할 수 있는 Machine Code의 사이에 있는 언어.
- Machine Code : 1과 0으로 이루어진 이진 코드. 컴퓨터에 의해 바로 실행될 수 있다.
런타임
컴파일된 프로그램이 사용자에 의해 실행되는 것, 그것을 런타임 이라고 한다.
Compile Error
컴파일 에러는 컴파일러(compiler)에 의해 발생되는데, 소스 코드의 에러(문법적 오류)를 통해 프로그램이 원활하게 컴파일링이 되지 못하는 상황을 말한다. 일반적으로 컴파일러가 소스 코드의 어떤 부분에서 에러가 발생했는지 개발자에게 알려준다. IDE 사용 시 IDE에서 문법 오류가 발생하면 빨간줄을 표시하여 오류임을 발생시킨다.
Compile Error 예시
- 잘못된 변수나 인자값의 사용.
- 선언되지 않은 변수의 사용.
- 중괄호({})의 누락.
- 세미콜론(;)의 누락.
RunTime Error
프로그램 실행중에 발생하는 에러.
런타임 에러는 프로그램이 성공적으로 컴파일되어 실행된 이후(런타임 상태)에 발생하는 에러이다.
런타임 에러의 증상으로 프로그램이 개발자가 의도한 대로 작동하지 않거나, 아예 동작하지 않는다.
런타임 에러는 문제가 있는 코드가 실행되어야만 발생한다. 개발자가 꼼꼼하게 체크하지 못하면 개발이 완료된 이후에도 한동안 에러를 발견하지 못할 수도 있다. 따라서 테스트 코드를 통한 사전 검증 과정이 필요하다.
RunTime Error 예시
- 개발자가 의도하지 않은 메시지 출력.
- 프로그램이 시스템 메모리를 과다하게 점유하여 메모리 누수(memory leak) 발생.
- NullPointerException.
- 무한루프.
- 0으로 나누었을 경우.
RunTime Error가 Compile Error에 비해 찾아내기 어려운 이유
프로그램이 컴파일 되려면 개발자는 개발에 사용하는 소스 코드의 언어(C, Java 등)가 요구하는 문법 구조에 맞추어 코드를 작성해야 한다. 컴파일 에러는 대부분 문법적 오류에 의해 발생하기 때문에 컴파일 에러는 쉽게 파악 및 수정이 가능하다.
런타임의 경우 소스 코드가 실행되는 상황이다. 실행 과정에서 데이터 입출력이 빈번하게 발생하는데, 이때 런타임 에러가 발생하면 명확한 에러 발생 지점을 찾아내기 어렵다. 과장을 보태면 수많은 인파 속에서 특정 인물을 찾는 것이기 때문이다.
참고
https://pc.net/helpcenter/answers/compile_time_vs_runtime
https://www.geeksforgeeks.org/difference-between-compile-time-errors-and-runtime-errors/
https://www.baeldung.com/cs/runtime-vs-compile-time
https://www.educba.com/assembly-language-vs-machine-language/
'Programming > 기초지식' 카테고리의 다른 글
[REST] URI 네이밍 가이드 (0) | 2022.02.17 |
---|---|
[REST] 리소스 (0) | 2022.02.17 |
MIME type (0) | 2022.01.11 |
[디자인 패턴] 생성 패턴 | 구현 패턴 | 행위 패턴 (0) | 2021.12.26 |
8080 포트가 이미 사용중이라면 (0) | 2021.12.23 |