바이트 코드

Bytecode

바이트 코드([citation needed]p-code라고도 함)는 소프트웨어 인터프리터에 의해 효율적으로 실행되도록 설계된 명령 집합의 한 형태입니다.사람이 읽을[1] 수 있는 소스 코드와 달리 바이트 코드는 컴파일러의 해석 결과를 인코딩하고 프로그램 객체의 유형, 범위 및 중첩 깊이와 같은 것의 의미 분석을 수행하는 콤팩트한 숫자 코드, 상수 및 참조(일반적으로 숫자 주소)입니다.

바이트 코드라는 이름은 1바이트의 opcode 뒤에 옵션 파라미터가 이어지는 명령 집합에서 유래합니다.바이트 코드와 같은 중간 표현해석을 용이하게 하기 위해 프로그래밍 언어 구현을 통해 출력될 수도 있고, 동일한 코드가 다른 디바이스에서 크로스 플랫폼을 실행하도록 함으로써 하드웨어 운영체제의 의존도를 낮추기 위해 사용될 수도 있습니다.바이트 코드는 종종 가상 머신(즉, p 코드 머신, 인터프리터)에서 직접 실행되거나 나은 성능을 위해 머신 코드로 컴파일될 수 있습니다.

바이트 코드 명령은 소프트웨어에 의해 처리되기 때문에 임의로 복잡할 수 있지만 기존 하드웨어 명령과 유사한 경우가 많습니다. 가상 스택 시스템이 가장 일반적이지만 가상 레지스터 시스템도 [2][3]구축되었습니다.오브젝트 모듈과 마찬가지로 다른 부품이 다른 파일에 저장되는 경우가 많지만 실행 중에 동적으로 로드됩니다.

실행

바이트 코드 프로그램은 명령을 한 번에 하나씩 해석하고 직접 실행함으로써 실행해도 된다.이런 종류의 바이트 코드 인터프리터는 매우 휴대성이 좋다.동적 변환기 또는 JIT(Just-in-Time) 컴파일러라고 불리는 일부 시스템은 실행 시 필요에 따라 바이트 코드를 기계 코드로 변환합니다.이렇게 하면 가상 시스템이 하드웨어별로 지정되지만 바이트 코드의 이식성이 손실되지는 않습니다.를 들어 Java 및 Smalltalk 코드는 일반적으로 바이트 코드 형식으로 저장되며, 실행 전에 바이트 코드를 기계 코드로 변환하기 위해 일반적으로 JIT가 컴파일됩니다.이로 인해 바이트 코드가 네이티브 머신 코드로 컴파일될 때 프로그램이 실행되기 전에 지연이 발생하지만 소스 코드를 직접 해석하는 것에 비해 실행 속도가 상당히 향상됩니다(일반적으로 약 10배).[4]

성능상의 이점 때문에 오늘날 많은 언어 구현에서는 소스 코드를 바이트 코드로 컴파일한 다음 바이트 코드를 가상 머신에 전달하는 두 단계로 프로그램을 실행합니다.Java, Raku, Python, PHP,[a] Tcl, mawk Forth에는 이러한 종류의 바이트 코드 기반 가상 머신이 있습니다(다만, Forth는 이러한 방식으로 바이트 코드를 통해 컴파일되는 경우가 드물고, 대신 가상 머신이 더 일반적입니다).대신 Perl과 Ruby 1.8의 구현은 소스 코드에서 파생된 추상 구문 트리 표현을 통해 작동합니다.

최근 V8[1][7] Dart의 저자들은 신속하고 효율적인 VM 구현을 위해 중간 바이트 코드가 필요하다는 개념에 이의를 제기했습니다.이 두 언어 구현 모두 현재 바이트 코드 매개체 [8]없이 소스 코드에서 기계 코드로 JIT 컴파일을 직접 수행합니다.

  • ActionScript는 Flash Player AIR의 일부인 AVM(ActionScript Virtual Machine)에서 실행됩니다.ActionScript 코드는 일반적으로 컴파일러에 의해 바이트 코드 형식으로 변환됩니다.컴파일러의 예로는 Adobe Flash Professional에 내장되어 있는 것과 Adobe Flash Builder에 내장되어 Adobe Flex SDK에서 사용할 수 있는 것이 있습니다.
  • Adobe Flash 개체
  • BANCStar. 원래는 인터페이스 구축 도구용 바이트 코드이지만 언어로도 사용됩니다.
  • 버클리 패킷필터
  • 버클리 파스칼 [1]
  • 바이트 코드 엔지니어링 라이브러리
  • C에서 Java 가상 머신 컴파일러
  • Common Lisp의 CLISP 구현은 수년간 바이트 코드로만 컴파일되어 왔지만 현재는 GNU 번개를 사용하여 네이티브 코드로 컴파일도 지원합니다.
  • Common Lisp의 CMUCL 및 Scieneer Common Lisp 구현은 네이티브 코드 또는 바이트 코드로 컴파일할 수 있으며, 이는 훨씬 더 콤팩트합니다.
  • 에서 사용되는 공통 언어 런타임에 의해 실행되는 공통 중간 언어.C# 등의 NET 언어
  • Android 플랫폼용으로 설계된 Dalvik 바이트 코드는 Dalvik 가상 머신에 의해 실행됩니다.
  • Disbytecode는 Dis 가상 머신에 의해 실행됩니다(운영체제).
  • 에펠 프로그래밍 언어를 위한 에펠 스튜디오
  • 중간 컴파일 언어 및 최신 바이트 코드 언어로 사용되는 Amsterdam 컴파일러 키트 가상 머신
  • Emacs는 대부분의 기능을 내장 언어인 Lisp의해 구현된 텍스트 에디터입니다.이러한 기능은 바이트 코드로 컴파일됩니다.이 아키텍처를 통해 사용자는 고급 언어로 편집기를 맞춤화할 수 있으며 바이트 코드로 컴파일한 후 적절한 성능을 얻을 수 있습니다.
  • 공통 리스프임베디드 가능한 공통 리스프 구현은 바이트 코드 또는 C 코드로 컴파일할 수 있습니다.
  • 공통 리스프는disassemble 지정된[9] 함수의 기본 코드를 표준 출력으로 출력하는 함수입니다.결과는 구현에 따라 다르며 바이트 코드로 해결되거나 해결되지 않을 수 있습니다.이 검사는 디버깅 [10]및 최적화 목적으로 사용할 수 있습니다.를 들어 Steel Bank Common Lisp는 다음을 생산합니다.
(분해 '(람다 (x) (인쇄물 x))) ;분해(LAMBDA(X)에) ;2436F6DF:850500000F22 TESTEAX,[#x220F0000], 진입점 no-arg-parsing. , 후진 등:8BD6 motoroperatorvalveEDX, ESI. ;E7:8B05A8F63624 motoroperatorvalveEAX,[#x2436F6A8];#<>.PRINT&gt에 FDEFINITION 개체 , ED:B904000000 motoroperatorvalveECX4. ;F2:FF7504 PUSHDWORDPTR[EBP+4]. ;F5키:FF6005 합동 인력 계획 DWORDPTR[EAX+5]. ;F:CC0A BREAK 10명 오류 트랩. ;FA:02BYTE#X02 ;FB:18BYTE#X18, INVALID-ARG-COUNT-ERROR. ;FC:4층 BYTE#X4F, ECX. 
  • 얼랑의 에릭슨 구현 및 좌굴 bytecodes을 사용한다.
  • Ethereum( 똑똑한 계약)에서 트랜잭션 실행을 위하여 Ethereum의 가상 머신(EVM)은 런타임 환경, 자체 바이트 코드를 사용하다.
  • 아이콘[11]유니콘[12] 프로그래밍 언어
  • InfocomZ-machine을 사용하여 소프트웨어 애플리케이션을 보다 휴대성 있게 만들었습니다.
  • Java 가상 머신에 의해 실행되는 Java 바이트 코드
  • Oberon-2 프로그래밍 언어가 사용하는 Keiko 바이트 코드Oberon 운영 체제를 보다 휴대하기 쉽게 만듭니다.
  • KEYB, MS-DOS/PC DOS 키보드 드라이버 및 리소스 파일 키보드.상주 드라이버 [13][14]내의 인터프리터에 의해 실행되는 레이아웃 정보와 짧은 p 코드 시퀀스를 포함하는 SYS.
  • LLVM IR
  • LSL은 가상 월드에서 사용되는 스크립트 언어이며 가상 시스템에서 실행되는 바이트 코드로 컴파일됩니다.Second Life는 오리지널 모노 버전을 가지고 있으며 Inworldz는 Phlox 버전을 개발했습니다.
  • Lua 언어는 레지스터 기반 바이트 코드 가상 시스템을 사용합니다.
  • MATLAB 언어의[15] m-code
  • Malbolge는 3진 가상 시스템의 난해한 시스템 언어입니다.
  • Visual C++ Visual Basic에서 사용되는 Microsoft P 코드
  • 멀티플랜[16]
  • BCPL 프로그래밍 언어의 O 코드
  • OCaml 언어는 선택적으로 콤팩트한 바이트 코드 형식으로 컴파일합니다.
  • Pascal 언어UCSD Pascal 구현의 p-code
  • 가상 머신의 앵무시
  • Data BASIC 또는 MultiValue BAS라고도 하는 BASIC을 선택합니다.IC
  • 통계 컴퓨팅용 R 환경은 컴파일러 패키지를 통해 바이트 코드 컴파일러를 제공하며, 현재는 R 버전 2.13.0에서 표준으로 제공됩니다.기본 및 권장 패키지가 이를 이용하도록 이 버전의 R을 [17]컴파일할 수 있습니다.
  • 피라미드 2000 어드벤처 게임
  • Python 스크립트는 실행 시 Python의 바이트 코드 언어로 컴파일되고 컴파일된 파일(.pyc)은 스크립트의 폴더 내에 캐시됩니다.

컴파일된 코드는 낮은 수준의 바이트 코드를 디버깅하기 위해 내장된 도구를 사용하여 분석 및 조사할 수 있습니다.이 도구는 다음과 같이 셸에서 초기화할 수 있습니다.

>>>수입품 분리하다 # "dis" - Python 바이트 코드를 니모닉으로 분해합니다. >>>분리하다.분리하다(print("Hello, World!"")) 10 부하_NAME 0 (인쇄) 2 LOAD_CONST 0('안녕하세요, 세계!') 4 콜_기능 1 6 리턴_VALUE 

「 」를 참조해 주세요.

메모들

  1. ^ PHP는 PHP [5][6]8에 Just-in-time 컴파일이 있으며, 이전에는 기본 버전이 아닌 HHVM과 같은 옵션이 있었습니다.이전 버전의 PHP의 경우: 프로그램이 실행될 때마다 PHP opcode가 생성되지만 JIT 컴파일이 아닌 항상 해석됩니다.

레퍼런스

  1. ^ a b "Dynamic Machine Code Generation". Google Inc.
  2. ^ "The Implementation of Lua 5.0". (NB. 여기에는 레지스터 기반 가상 시스템이 포함됩니다.)
  3. ^ "Dalvik VM". Archived from the original on 2013-05-18. Retrieved 2012-10-29. (NB. 이 VM은 레지스터 기반입니다.)
  4. ^ "Byte Code Vs Machine Code". www.allaboutcomputing.net. Retrieved 2017-10-23.
  5. ^ O’Phinney, Matthew Weier. "Exploring the New PHP JIT Compiler". Zend by Perforce. Retrieved 2021-02-19.
  6. ^ "PHP 8: The JIT - stitcher.io". stitcher.io. Retrieved 2021-02-19.
  7. ^ Loitsch, Florian. "Why Not a Bytecode VM?". Google. Archived from the original on 2013-05-12.
  8. ^ "JavaScript myth: JavaScript needs a standard bytecode". 2ality.com.
  9. ^ "CLHS: Function DISASSEMBLE". www.lispworks.com.
  10. ^ "Performance Tuning and Tips". lispcookbook.github.io.
  11. ^ "The Implementation of the Icon Programming Language" (PDF). Archived from the original (PDF) on 2016-03-05. Retrieved 2011-09-09.
  12. ^ "The Implementation of Icon and Unicon a Compendium" (PDF).
  13. ^ Paul, Matthias R. (2001-12-30). "KEYBOARD.SYS internal structure". Newsgroup: comp.os.msdos.programmer. Archived from the original on 2017-09-09. Retrieved 2016-09-17. […] In fact, the format is basically the same in MS-DOS 3.3 - 8.0, PC DOS 3.3 - 2000, including Russian, Lithuanian, Chinese and Japanese issues, as well as in Windows NT, 2000, and XP […]. There are minor differences and incompatibilities, but the general format has not changed over the years. […] Some of the data entries contain normal tables […] However, most entries contain executable code interpreted by some kind of p-code interpreter at *runtime*, including conditional branches and the like. This is why the KEYB driver has such a huge memory footprint compared to table-driven keyboard drivers which can be done in 3 - 4 Kb getting the same level of function except for the interpreter. […]
  14. ^ Mendelson, 에드워드(2001-07-20)." 어떻게 MS-DOS및 Windows도스를 유로화 표시에".전체 화면 MS-DOS(Windows95또는 Windows98전체 화면 도스 등)에서 유로화 기호를 표시합니다.그 2016-09-17에 원래에서 Archived.2016-09-17 Retrieved.[…]마티아스[R.]폴[…]은 키보드 드라이버의 IBMPCDOS버전, 그렇게 가능하면 둘 다 KEYB의 IBM버전을 사용해야 하는 운전자가 인정되지 않는다 일부 내부 절차를 사용하다고 경고한다.COM과 KEYBOARD.곧 또 보자 대신 마이크로 소프트와 IBM버전을 혼합(NB[…].무엇"절차"이 의미하는 것 여기 있고 IBMKEYBOARD에 추가적인 bytecodes 있다.Microsoft 버전의 KEYB 드라이버에서는 SYS 파일이 지원되지 않습니다.)
  15. ^ "United States Patent 6,973,644".
  16. ^ Microsoft C Pcode Specifications. p. 13. Multiplan wasn't compiled to machine code, but to a kind of byte-code which was run by an interpreter, in order to make Multiplan portable across the widely varying hardware of the time. This byte-code distinguished between the machine-specific floating point format to calculate on, and an external (standard) format, which was binary coded decimal (BCD). The PACK and UNPACK instructions converted between the two.
  17. ^ "R Installation and Administration". cran.r-project.org.
  18. ^ "The SQLite Bytecode Engine". Archived from the original on 2017-04-14. Retrieved 2016-08-29.