JavaRush /Java Blog /Random-KO /기계어 코드와 바이트 코드: 귀하의 프로그램은 어떤 언어를 사용합니까?

기계어 코드와 바이트 코드: 귀하의 프로그램은 어떤 언어를 사용합니까?

Random-KO 그룹에 게시되었습니다
Java에 이제 막 익숙해지기 시작한 사람들은 기계어 코드 와 바이트 코드 의 개념에 대해 혼란을 겪는 경우가 많습니다 . 그들은 무엇인가? 차이점은 무엇입니까? 짧은 메모를 통해 이 문제를 완전히 해결하기 위해 해당 기능을 최대한 간단하고 명확하게 설명하려고 노력할 것입니다.
기계어 코드와 바이트 코드: 귀하의 프로그램은 어떤 언어를 사용합니까?  - 1

기계코드

프로세서는 본질적으로 매우 복잡하고 고급 계산기입니다. 여기에는 다양한 수학 및 바이트 작업이 수행되는 많은 메모리 위치(레지스터라고 함)가 있습니다. 기계 코드는 정확하게 작업 순서와 관련된 데이터 세트에 대한 설명입니다. 실제로 이는 컴퓨터 프로세서가 이해하는 유일한 언어입니다.

선천적 부적합

동시에 모든 프로세서가 동일한 언어를 "사용"하는 것은 아닙니다. CISCRISC 아키텍처 사이 뿐만 아니라 이러한 "캠프" 내에서도 차이점이 있습니다 .

CISC(Complex Instruction Set Computing)는 다음과 같은 속성 집합을 특징으로 하는 프로세서 설계 개념입니다.

  • 길이가 다른 많은 명령;
  • 다양한 주소 지정 모드;
  • 복잡한 명령어 코딩.
RISC(Reduced Instruction Set Computing) - 축소된 명령어 세트를 갖춘 프로세서입니다. 명령은 간단한 코딩으로 동일한 형식으로 짧습니다.
새로운 세대의 프로세서에는 이전 세대 모델에는 알려지지 않은 추가 명령 세트가 도입되었습니다. 이로 인해 한 아키텍처(또는 한 세대의 프로세서)용으로 컴파일된 프로그램은 다른 하드웨어에서 실행될 수 없습니다. 이 모든 이유로 인해 프로그램이 다른 컴퓨터에서 작동하는지 확인하기 위해 프로그램을 다시 컴파일해야 합니다. 그러나 프로세서뿐만 아니라 프로그램과 운영 체제의 상호 작용의 차이 때문에 다시 컴파일해야 합니다. 이로 인해 Linux에서는 "Windows" 프로그램을 실행하고 Windows에서는 "Linux" 프로그램을 실행할 수 없습니다.

바이트코드

바이트코드는 여러 면에서 기계어 코드와 유사하지만 실제 프로세서가 아닌 가상 프로세서의 명령어 세트를 사용한다는 점만 다릅니다. 또한 프로그램이 실행되는 실제 프로세서에 대한 명령 실행을 최적화하는 JIT 컴파일러 사용에 중점을 둔 섹션이 포함될 수 있습니다 .
JIT 컴파일 (Just-in-time 컴파일, 온더플라이 컴파일) 또는 동적 컴파일 (동적 변환)은 바이트코드를 기계어 코드나 다른 형식으로 직접 컴파일하여 바이트코드를 사용하는 소프트웨어 시스템의 성능을 높이는 기술입니다. 프로그램이 실행 중입니다. 버전 9까지 Java에는 "공식적으로" JIT 컴파일러만 있었습니다. Java 9에는 또 다른 컴파일러가 등장했으며 AoT(Ahead of Time)를 컴파일합니다. 이 기능을 사용하면 Java 클래스를 가상 머신에서 실행하기 전에 기본 코드로 컴파일할 수 있습니다. 이 기능은 최대 성능에 미치는 영향을 제한하면서 소규모 및 대규모 애플리케이션 모두의 시작 시간을 개선하기 위한 것입니다.
CISC 프로세서 의 경우 일부 명령어는 프로세서가 지원하는 더 복잡한 구조로 결합될 수 있으며, RISC 의 경우 반대로 더 간단한 명령어 시퀀스로 나눌 수 있습니다.

또한 가상 OS

그러나 바이트 코드에는 프로세서 명령어만 포함되는 것이 아닙니다. 또한 가상 운영 체제와 상호 작용하기 위한 논리도 포함되어 있어 응용 프로그램의 동작이 컴퓨터에서 사용되는 운영 체제와 독립적이게 됩니다. 이는 시스템 호출 및 GUI 작업이 프로그램이 실행되는 OS와 독립적인 경우가 많은 JVM 에서 명확하게 나타납니다. 대체로 JVM은 가상 시스템/하드웨어만 생성하는 Virtual Box 와 같은 솔루션과 달리 프로그램 프로세스의 시작을 에뮬레이션합니다 .

JVM이 이런 유일한 것인가요?

기필코 아니다. 동일한 DotNet CLI는 x86 호환 프로세서가 탑재된 Windows를 실행하는 컴퓨터에서 가장 자주 사용되는 가상 머신이기도 합니다 . 그러나 다른 시스템에 대한 구현이 있습니다. 해당 애플리케이션은 ARM(RISC) 호환 프로세서 에서 실행되는 Windows RT 에서 실행되어야 하거나 타사인 Mono 환경 의 Linux/OSX 에서 실행할 수 있습니다. 완전히 호환되지 않음) 이러한 플랫폼에 대한 DotNet 구현 . 따라서 이 플랫폼은 JVM 과 마찬가지로 다양한 프로세서와 다양한 OS에서 실행됩니다. LLVM , Flash SWF 등 더 많은 유사한 솔루션(기존 및 신규)이 있습니다 . 일부 프로그래밍 언어에는 자체 가상 머신이 있습니다. 예를 들어, CPython은 PY 소스를 PYC 파일, 즉 PVM 에서 실행되도록 준비된 컴파일된 바이트 코드 로 컴파일합니다 . 또는 훨씬 오래된 예가 있습니다. Lisp는 FASL (Fast Load) 파일 로 컴파일될 수 있습니다 . 실제로 여기에는 소스 코드에서 생성기가 구축한 AST 트리가 포함되어 있습니다. 이러한 파일은 다양한 플랫폼에서 Lisp 인터프리터로 읽고 실행하거나 현재 사용되는 하드웨어 아키텍처에 대한 기계어 코드를 생성하는 데 사용할 수 있습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION