프로그래밍 언어(Programing language) : 사람이 작성하는 문자로 이루어진 읽기 좋은 코드.... C, C++, Java, Python, Swift, Go...
컴파일(Compile) : 프로그래밍 언어를 기계어 혹은 기계어와 유사한 Low Level까지 해석해주는 과정이다.
컴파일러(Compiler) : 프로그래밍 언어를 기계어로 빠르게 컴파일 할 수 있도록 미리 번역해둔 프로그램이다.
목적 파일(Object code) : 한국에서는 '목적 코드' 보다는 '목적 파일'로 불린다. 컴파일러나 어셈블러에 의해 생성된 파일이다. 이는 기계어까지 Low Level로 해석되거나, 기계어 수준의 Binary code 또는 RTL(Register-transfer level)과 같은 수준으로 해석된 코드다.
바이트 코드(Byte code) : JVM, CLR 등 VM에서 사용되는 코드 개념으로, 가상머신이 이해할 수 있는 중간 레벨로 컴파일 한 것을 말한다. 이는 어셈블리어와 유사한 형태를 띄고 있으며, javac, csc.exe 등의 컴파일러에 의해 바이트 코드로 변환되고(JVM, CLR에서 컴파일러가 하는 역할은 여기까지), 이 바이트 코드는 다시 기계어로 해석되는데 이 과정은 인터프리터 방식으로 작동한다.
i.e. Java(프로그래밍 언어) -> javac(컴파일러) -> Java Byte code(JVM이 이해할 수 있는 어셈블리어 비슷한 형태의 Low Level Language) -> (인터프리터 방식으로)기계어로 번역되어 최종 실행
바이너리 코드(Binary code) : 컴파일러에 의해 생성된 목적 파일이 Binary code라 이해하면 쉽다. 단, 바이너리 코드는 컴퓨터가 이해할 수 있는 언어지만 '링커'에 의해 메모리 주소값을 반영하고 CPU가 직접 해독하고 실행할 수 있도록 수정되어야 기계어가 되는 것이기 때문에 가장 기계어와 유사한 레벨의 코드지만 완전한 기계어는 아니다.
어셈블리어(Assembly language) : 니모닉 기호(mnemonic symbol)를 정해 사람이 쉽게 제어할 수 있도록 한 것으로 기계어에 1:1로 대응된다. 어셈블리어 -> 기계어를 'assembler', 기계어 -> 어셈블리어를 'disassembler'라 한다.
i.e. x86 계열의 기계어 '10110000 01100001'를 어셈블리어로 쓰면 'mov al, 061h'가 된다.
기계어(Machine code) : CPU가 직접 해독하고 실행할 수 있는 비트 단위(0과 1)로 쓰인 컴퓨터 언어로 가장 Low Level Language다. CPU의 종류에 따라 서로 다른 코드를 갖게 된다.
JVM, CLR도 중간에 인터프리터가 있는데 왜 인터프리터 언어(Python, JavaScript)보다 빠를까? 그리고 컴파일 언어와 비교하면 얼마나 차이가 나는 것일까?
아마 Byte code는 어셈블리어는 아니라 기게어로 1:1 대응은 되지 않지만 프로그래밍 언어를 기계어로 해석되기 좋은 낮은 수준의 언어까지 1차로 변환을 미리 했기 때문이 아닐까 한다. 즉, 컴파일러를 통해 빠른 속도로 Byte code로 변환하고, 이를 다시 기계어로 인터프리터로 해석하는 반면,
인터프리터 언어는 처음부터 프로그래밍 언어를 바로 기계어로 직접 해석해야 하기 때문에 해석에 매우 많은 시간이 소요되는 것이고,
마찬가지로 컴파일 언어는 컴파일러를 통해 바로 목적파일(Binary code로 작성)로 해석되고, 이를 컴퓨터가 이해할 수는 있지만 CPU가 바로 읽을 수 있도록 실제 메모리 주소를 코드에 맞게 변경만 하면 바로 기계어가 되기 때문에 가장 빠른 것이 아닐까 싶다. 물론, 이 과정 때문에 Binay code가 완전한 Machine code는 아니므로 같은 컴파일 언어라 하더라도 메모리 주소를 직접 접근하고 제어할 수 있는 C에 비해 C++, Swift가 메모리도 더 사용하고, 근소하게 속도도 느리고 그런 것이 아닐까 생각된다.
'개발자 > 용어... 그 외의 것들...' 카테고리의 다른 글
뒤로 가는 계산 하기 (마이너스 계산) (0) | 2020.04.04 |
---|---|
수학 용어 - 등차수열, 등비수열 (0) | 2020.04.04 |
프로젝트 계획서 (0) | 2020.03.27 |
포트포워딩 (0) | 2020.03.25 |
기본 포트 (0) | 2020.03.25 |