Go와 Java를 단순 비교하기는 어렵지만 몇가지 비교 포인트가 있다고 생각한다. 그 중 하나가 컴파일시 바이트코드(Bytecode)로 변환되는지 바이너리(Binary)로 변환되는지 여부일 수 있다고 생각한다. Go에서는 바이트코드가 아닌 바이너리로 컴파일되는 반면, JVM 계열 언어는 바이트코드로 컴파일된다. 애플리케이션에 따라 다르겠으나, 일반적으로 이 차이 때문에 Go 언어는 JVM 계열 언어보다 더 가볍고 빠른 런타임을 가지며, 프로그램의 실행속도가 좀 더 빠를 수 있다.
바이트코드(Bytecode)
바이트코드는 가상 머신(Virtual Machine)에서 실행하기 위한 중간 코드 형태다. CPU에서 직접 실행되지 않고 가성 머신에 의해 해석되어 실행된다. JVM은 바이트코드를 기계어로 변환해 CPU가 실행할 수 있게 한다.
한편, Bytecode는 플랫폼-독립적(Platform-independant)이다. 각 플랫폼에 따라 JVM을 설치하기만 하면 동일한 바이트코드로 어느 플랫폼에서든 실행 가능하다. 즉, 특정 플랫폼에 맞춰 빌드할 필요가 없다. 다만, JVM의 경우 운영체제 및 CPU 아키텍처에 따라 다르게 설치해야 한다.
보통 Java의 경우 Jar 파일 형태로 배포하는데, 여기에는 바이트코드와 리소스 파일 등이 포함된다.
바이너리(Binary)
바이너리 파일은 CPU가 직접 실행할 수 있는 기계어로 컴파일된 파일이다. 운영체제와 아키텍처에 맞게 컴파일된다. 따라서 실행시 별도의 가상 머신이 불필요하다.
다만, 컴파일 시 바이너리를 실행할 운영체제나 아키텍처에 맞춰 컴파일해야 하며 플랫폼에 의존적이다.
정리
ㅤ | Bytecode | Binary |
실행방식 | JVM, PVM 같은 가상머신에서 실행 | CPU에서 직접 실행 |
플랫폼 종속성 | 플랫폼-독립적 | 플랫폼의존적 |
특징 | 중간 언어로 가상 머신에 의해 해석되거나 JIT 컴파일되어 실행 | 기계어로 가상머신이나 해석기 없이 바로 실행 |
형태 | .class, jar | .exe, .out |