05
17

 

바이트코드

바이트코드(Bytecode, portable code, p-code)는 특정 하드웨어가 아닌 가상 머신에서 돌아가는 실행 프로그램을 위한 이진 표현법이다. 하드웨어가 아닌 소프트웨어에 의해 처리되기 때문에, 보통 기계어보다 더 추상적이다.

 

프로그래밍 언어는 특정 하드웨어에 대한 의존성을 줄이고, 인터프리팅도 쉬운 결과물을 생성하고자 했다. 그렇기에 바이트코드는 프로그래밍 언어의 출력 코드의 한 형태로써 사용되게 됐다. 프로그래밍 코드(소스 코드)와 비교했을 때 덜 추상적이고 더 간결하고, 더 컴퓨터 중심적인 것이다.

 

바이트 코드는 특정 하드웨어의 기계 코드를 만드는 컴파일러의 입력으로 사용되어 더 컴퓨터 중심적인 코드로 변환될 수도 있고, 가상 컴퓨터에서 바로 실행될 수도 있다.

 

 

 

 

 

binary code (이진 코드)

이진 코드 또는 바이너리 코드(binary code)는 텍스트, 컴퓨터 프로세서 명령 또는 그 밖의 2심볼 시스템을 사용하는 데이터를 대표하며 대개 이진 숫자 체계의 0과 1을 의미한다.

 

바이너리 코드는 기계가 이해할 수 있도록 구성된 이진 코드이다. 즉, 바이너리 코드는 기계(CPU)가 읽을 수 있는 형태이지만 바이트 코드는 가상 머신이 이해할 수 있고, 기계는 읽을 수 없는 코드이다.

 

 

1. 기계어

기계어는 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어를 통틀어 일컫는다. 기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다. 즉, 0과 1로 쓰인 바이너리 코드이다. 하지만 기계어가 바이너리 코드로 쓰였을 뿐이지, 모든 바이너리 코드가 기계어인 것은 아니다.

 

기계어는 특정한 언어가 아니다. CPU 제조사에서 해당 CPU에서 사용하는 명령어 집합을 공개하는데 이것을 기계어라고 부르며, 그 때문에 CPU마다 사용하는 기계어가 달라질 수 있다.

 

 

2. 어셈블리어

어셈블리어 또는 어셈블러 언어는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 기계어를 사람이 이해하기 어려우니, 기계어를 어셈블리어로 바꾸어 사람이 이해하기 쉽도록 한 것이다. 그렇기에 CPU는 어셈블리어를 이해하지 못 한다.

 

 

 

 

 

JIT

JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 필요에 따라 바이트코드를 기계어로 번역하는 컴파일 기법이다.

 

컴퓨터 프로그램을 만드는 방법은 두 가지가 있다.

  1. 인터프리터 방식 (ex. CPython)
    • 실행 중 프로그래밍 언어를 읽어가면서 해당 기능에 대응하는 기계어 코드를 실행
    • 바이트코드나 소스코드를 최적화 과정이 없이 번역하기 때문에 성능이 낮다.
  2. 정적 컴파일 방식 (ex. C)
    • 실행 전에 프로그래밍 코드를 기계어로 번역하여 기계어 코드를 실행
    • 실행 전에 무조건 컴파일을 해야 하기 때문에 다양한 플랫폼에 맞게 컴파일을 하려면 시간이 오래 걸린다

 

JIT 컴파일러는 두 가지를 혼합한 방식으로 생각할 수 있는데, 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

 

JIT 코드는 일반적인 인터프리터 언어에 비해 좋은 성능을 내며, 경우에 따라 정적 컴파일 언어보다 더 좋은 성능을 내기도 한다. Pypy가 CPython 보다 속도가 더 빠른 이유도 JIT를 채택하고 있기 때문이다.

 

 

 

 

 

참고 자료

 

 

 

'CS > 기타' 카테고리의 다른 글

스택 / 레지스터 기반 VM  (0) 2022.07.27
GraphQL 이란 ?  (0) 2022.07.05
CS 관련 Github repo 정리  (0) 2022.03.30
Web Server와 WAS  (0) 2022.03.26
MSA  (0) 2022.02.16
COMMENT