개요
자바는 Interpreter를 사용하는 언어라고 합니다. 또한 C는 Compile을 하는 언어라고 합니다. 이 둘의 차이점이 뭔지 알아보겠습니다.
Compile
컴파일은 바로 실행가능한 기계어로 변환합니다. 따라서 인터프리터보다 더 빠르고 효율적입니다. 메모리관리나 CPU 사용 등 하드웨어 측면에서도 개발자가 더 많은 관리가 가능합니다
컴파일 언어는 컴파일이 되고나면 빌드가 필요합니다. 만약에 코드에 변경이 필요하면 재빌드를 해야 합니다.
Interpretation
인터프리터는 프로그램을 통해 한줄씩 동작하며 각 명령어를 실행합니다. 하지만 중간에 목적코드를 만들지 않기 때문에 메모리 관리는 훨씬 효율적입니다.
인터프리터 언어는 컴파일 언어보다 확연히 느렸지만, JIT 컴파일러 덕분에 그 차이가 많이 좁혀졌습니다.
차이점을 표로 비교해보겠습니다.
Compiler(C언어 기준) | Interpreter | |
preprocessing 과정 | 컴파일러가 전체 소스코드를 바로 실행할 수 있는 기계어로 변환한다. | 바로 기계어로 변환되지 않고 Interpreter가 해석 할 수 있는 ByteCode로 변환된다. |
processing 과정 | 컴파일이 모두 끝난 후에 실행된다. | 런타임 시, 인터프리터가 명령어 단위로 바이트코드를 해석하고 실행한다. |
실행시간 | 빠르다(이미 컴파일을 통해 기계어로 모두 변환되어 있기 때문이다.) | 느리다(해석과 실행을 동시에 하기 때문이다. 즉 native code로 변환하고 나서 실행해야 한다.) |
오류 발생 | 전체 소스코드를 변환 한 뒤 오류를 발생시킨다. 실행 전에 오류를 알 수 있다. | 각 명령어 단위로 실행하닥 중간에 오류를 만나면 그 때 발생시키고 프로그램이 종료된다. 실행을 해야만 오류를 알 수 있지만 대신 보안은 좋다. |
의존성 | 어셈블리어가 사용되는데 CPU 회사마다 표준이 다르기 때문에 CPU의존적이며 OS의존적이기 때문에 목적코드에 라이브러리를 붙일 때(링크) 실행파일이 다르게 나온다. | 특별한 플랫폼에 의존성을 가지지 않는다. 적절한 interpreter만 있다면 어떤 기종에서도 실행이 가능하다. 자바의 경우 JVM이 설치된 장비라면 CPU나 운영체제가 다르더라도 실행가능하다. |
중간 코드 | 컴파일 과정에서 목적코드가 생성된다. | 인터프리터 실행 중간에 목적코드와 같이 다른 코드가 만들어지지 않는다. |
기계어
기계어는 컴퓨터가 사용하는 언어로, CPU가 명령을 처리할 때 사용하는 언어이며 2진법으로 구성되어 0과 1을 갖는다.
1000 1011 0100 0101 1111 1000
1000 0011 1100 0100 0000 1100
0과 1의 값만을 가져서 표현하기 때문에 일반 사람들은 이해하기 힘들며, 형식조차 파악하기 힘들다. 그렇기 때문에 좀 더 이해하기 쉽도록 16진법으로 표현하기도 하는대, 그렇다고 해도 그 의미를 파악하는 것은 쉽지 않다.
8b 45 f8
83 c4 0c
따라서, 결국 사람이 어떤 명령어를 만들 때 기계어를 그대로 이용하는 것은 정말 힘든 일이며 따라서 좀 더 이해하기 쉬운 방법을 사용해야만 한다.
어셈블리어
기계어에서 특정 의미를 가지고 있는 숫자조합을 1:1로 대응시켜 사람이 이해하기 쉽도록 만든 언어입니다.
mov eax, DWORD PTR [ebp-8]
add esp, 12
add eax, DWORD PTR [ebp-4]
물론 어셈블리어도 사람과 아주 친숙한 형태는 아니지만, 적어도 기계어보다는 사람이 알아듣기 편한 수준으로 작성된다. mov는 이동(덮어씌우기), add는 더하기로 바로 이해가 됩니다. 이와같이 CPU에 사용되는 명령어 종류가 있으며 작동 방식 또한 정해져 있습니다. 결국 이것은 사람입장에서만 이해가 쉬워졌지만 기계가 바로 알아듣는 언어는 아니기 때문에 기계어로 번역이 필요합니다. 그 때 이용하는 것을 어셈블러(Assembler)라고 합니다.
고급언어
대표적으로 C, C++, JAVA 등의 프로그래밍 언어를 대표하는 언어로, 사람들이 편하게 이해할 수 있도록 만들어진 언어입니다. 사람이 이해하고 해석하기 편할수록 고급언어(High-Level Language)라고 하며, 컴퓨터가 이해하기 편할수록 저급 언어(Low-Level Language)라고 합니다. 성능의 차이 때문에 붙여진 이름은 아닙니다.
저급 언어도 컴퓨터가 알아듣는 언어가 아니기 때문에 변환이 필요한대, 경우에 따라서 어셈블리어로 변환한 다음에 기계어로 변환할 수도 있고, 어셈블리어를 거치지 않고 바이트코드를 만들고 기계어로 변환될 수도 있습니다. 이 때 사용하는 것을 컴파일러(Compiler)라고 합니다. 바이트 코드를 다루는 것은 인터프리터(Interpreter)입니다.
참고
https://www.guru99.com/difference-compiler-vs-interpreter.html
https://www.freecodecamp.org/news/compiled-versus-interpreted-languages/
'학습' 카테고리의 다른 글
Fail-Fast vs Fail-Safe (0) | 2020.07.23 |
---|---|
ArrayList & Vector 차이점 (0) | 2020.07.23 |
다형성 / Up-casting & Down-casting (0) | 2020.07.20 |
Wrapper class / Integer cache pool (0) | 2020.07.17 |
Override vs Overload (0) | 2020.07.17 |