애플리케이션 가상화 소프트웨어 비교
Comparison of application virtualization software애플리케이션 가상화 소프트웨어는 애플리케이션 가상 머신과 이러한 가상 머신의 구현을 담당하는 소프트웨어를 말합니다.애플리케이션 가상 머신은 일반적으로 애플리케이션 바이트 코드를 다양한 컴퓨터 아키텍처 및 운영 체제에서 이식 가능하게 실행하기 위해 사용됩니다.응용 프로그램은 보통 인터프리터 또는 JIT(Just-In-Time Compilation)를 사용하여 컴퓨터에서 실행됩니다.특정 가상 머신에는 여러 가지 구현이 있으며 각각 다른 기능 세트를 포함합니다.
가상 시스템 비교
- JavaScript 머신은 포함되어 있지 않습니다.ECMAScript 엔진 목록을 참조하십시오.
이 표에는 구현에 포함된 기능 목록이 아니라 가상 시스템 설계가 효율적이기 위한 요소가 요약되어 있습니다.
가상 머신 | 기계 모형 | 메모리 관리 | 코드 보안 | 통역사 | JIT | AOT | 공유 라이브러리 | 공통 언어 객체 모델 | 동적 타이핑 |
---|---|---|---|---|---|---|---|---|---|
Android 런타임(ART) | 등록하세요 | 자동의 | 네. | 네. | 네. | 네. | ? | 네. | 네. |
공통 언어 런타임(CLR) | 스택 | 자동 또는 수동 | 네. | 네. | 네. | 네. | 네. | 네. | 네. |
디스(지옥) | 등록하세요 | 자동의 | 네. | 네. | 네. | 네. | 네. | 네. | 네. |
Dot GNU 포터블.그물 | 스택 | 자동 또는 수동 | 네. | 네. | 네. | 네. | 네. | 네. | 아니요. |
Java 가상 머신(JVM) | 스택 | 자동의 | 네. | 네. | 네. | 네. | 네. | 네. | 네, 그렇습니다[1]. |
JikesRVM | 스택 | 자동의 | 네. | 네. | 네. | 네. | ? | 네. | 네. |
LLVM | 등록하세요 | 설명서 | 아니요. | 네. | 네. | 네. | 네. | 네. | 아니요. |
모노 | 스택 | 자동 또는 수동 | 네. | 네. | 네. | 네. | 네. | 네. | 네. |
앵무새. | 등록하세요 | 자동의 | 아니요. | 네. | 아니요[2]. | 네. | 네. | 네. | 네. |
달빅 | 등록하세요 | 자동의 | 네. | 네. | 네. | 아니요. | ? | 아니요. | 아니요. |
삐걱거리다 | 스택 | 자동의 | 아니요. | 네. | 네. | 아니요. | 네. | 아니요. | 네. |
BEAM(에를랑) | 등록하세요 | 자동의 | ? | 네. | 네. | 네. | 네. | 네. | 네. |
MoarVM | 등록하세요 | 자동의 | ? | 네. | 네. | 네. | 네. | 네. | 네. |
가상 시스템 명령은 일반적으로 스택 시스템, 레지스터 시스템 또는 메모리 시스템이라고 하는 랜덤 액세스 시스템의 기본 계산 모델을 사용하여 로컬 변수의 데이터를 처리합니다.이러한 세 가지 방법은 해석, 컴파일 및 보안 검증 용이성 등 가상 머신과 물리 머신의 트레이드오프가 다르기 때문에 사용됩니다.
이러한 이동식 가상 시스템의 메모리 관리는 물리적 시스템보다 더 높은 추상화 수준에서 해결됩니다.일반적인 Java 가상 시스템(JVM)과 같은 일부 가상 시스템은 가상 시스템에서 포인터 참조를 추적할 수 있도록 하여 안전한 자동 메모리 관리가 필요하고 시스템 명령이 메모리에 대한 포인터를 수동으로 구성하지 못하도록 하는 방식으로 주소에 관여합니다.LLVM과 같은 다른 가상 머신은 포인터를 직접 사용하고 조작할 수 있는 기존의 물리 머신에 가깝습니다.CIL(Common Intermediate Language)은 메모리(안전한 자동 메모리 관리를 가능하게 하는 JVM 등)의 제어된 사용을 가능하게 하는 한편, 타입 경계와 권한을 위반하는 방법으로 직접 포인터를 조작할 수 있는 '안전하지 않은' 모드도 가능하게 합니다.
코드 보안은 일반적으로 휴대용 가상 시스템에 미리 정해진 기능 집합만 제공하면서 코드를 실행할 수 있는 기능을 말합니다.예를 들어 가상 시스템이 특정 기능 또는 데이터 집합에 대한 코드 액세스만 허용할 수 있습니다.자동 메모리 관리를 가능하게 하고 가상 시스템이 데이터 액세스를 쉽게 하도록 하는 포인터에 대한 동일한 제어는 코드 조각이 메모리의 특정 요소에만 허용되고 가상 시스템 자체를 무시할 수 없도록 하는 데 사용됩니다.그 후 다른 보안 메커니즘은 코드 검증자, 스택 검증자 및 기타 방법으로 맨 위에 계층화됩니다.
인터프리터를 사용하면 비용이 많이 드는 네이티브 머신 명령어 컴파일 없이 가상 명령어로 만든 프로그램을 바로 로드하여 실행할 수 있습니다.실행할 수 있는 모든 가상 시스템을 해석할 수 있으므로 이 열 지정은 설계에 효율적인 해석(일반 사용)을 위한 프로비저닝이 포함되어 있는지 여부를 나타냅니다.
JIT(Just-in-Time Compilation)는 프로그램 실행 직전 또는 실행 중에 가능한 최신 시간에 네이티브 명령을 컴파일하는 방법을 말합니다.JIT의 과제는 가상 머신 설계보다 구현에 더 가깝지만 효율성을 높이기 위해 최신 설계를 고려하기 시작했습니다.가장 간단한 JIT 메서드는 단순히 오프라인 컴파일러와 유사한 코드 조각으로 컴파일합니다.그러나 컴파일된 코드 조각을 런타임에만 알려진 매개 변수로 전문화하는 보다 복잡한 방법이 종종 사용됩니다(적응 최적화 참조).
사전 컴파일(AOT)은 프로그램 실행 시 변경되지 않는 일련의 네이티브 명령어를 생성하기 위해 프리 컴파일러를 사용하는 보다 고전적인 방법을 말합니다.적극적인 컴파일 및 최적화는 시간이 걸릴 수 있으므로 사전 컴파일된 프로그램을 실행하는 데 JIT에만 의존하는 프로그램보다 더 빨리 시작할 수 있습니다.JVM을 구현하면 JIT에서 네이티브 코드 조각이 생성될 때까지 초기 해석으로 시작 비용을 줄일 수 있습니다.
공유 라이브러리는 실행 중인 여러 프로그램에 걸쳐 네이티브 코드 세그먼트를 재사용하는 기능입니다.현대의 운영체제에서는 일반적으로 가상메모리를 사용하여 메모리 보호를 통해 서로 보호되는 여러 프로세스 간에 공유 라이브러리를 포함하는 메모리 페이지를 공유하는 것을 의미합니다.적응형 최적화와 같은 공격적인 JIT 방식은 종종 프로세스 간 또는 프로그램의 연속 실행 간에 공유하기에 부적합한 코드 조각을 생성하므로 사전 컴파일된 공유 코드의 효율성과 적응적으로 특수화된 코드의 이점 사이에서 균형을 맞출 필요가 있습니다.예를 들어 효율적인 공유 라이브러리를 실현하기 위한 CIL의 설계 조항이 몇 가지 있습니다.이는 보다 전문화된 JIT 코드를 희생하는 것일 수 있습니다.OS X에서의 JVM 실장은 Java 공유[3] 아카이브를 사용하여 공유 라이브러리의 이점을 제공합니다.
응용 프로그램 가상 시스템 구현 비교
가상 머신은 위에서 설명한 휴대용 가상 머신과 더불어 일반적으로 인터프리터에 의해 개별 스크립트 언어의 실행 모델로 사용됩니다.다음 표에는 위의 이동식 가상 시스템 및 스크립팅 언어 가상 시스템의 특정 가상 시스템 구현이 나열되어 있습니다.
가상 머신 | 언어들 | 평. | 통역사 | JIT | 구현 언어 | SLoC |
---|---|---|---|---|---|---|
공통 언어 런타임(CLR) | C#, C++/CLI, F#, VB.네트워크 | 바이트 코드는 CIL; 입니다.GitHub에서의 NET 코어 런타임 | 아니요. | 네. | C#, C++ | |
Adobe Flash Player(일명 Tamarin) | ActionScript, SWF(파일 형식) | 인터랙티브 웹 저작 도구. 바이트 코드의 이름은 "ActionScript 바이트 코드(.abc)"입니다. | 네. | 네. | C++ | 135k(해제 완료) |
디스(지옥) | 림보 | 가상 시스템 규격 해제 | 네. | 네. | C | 15,000 + JIT 아치당 2850 + 호스트 OS당 500 |
Dot GNU-Portable.네트워크 | CLI 언어:C# | 공통 언어 런타임 복제 | 아니요. | 네. | C, C# | |
넷째 | 넷째 | 기능은 단순화되어 있습니다.일반적으로 어셈블러, 컴파일러, 텍스트 레벨 및 바이너리 레벨의 인터프리터, 에디터, 디버거, OS 등이 있습니다.컴파일 속도는 20 SKLOC/S를 넘어 JIT와 같은 동작을 합니다. | 네. | 아니요. | 넷째, 넷째 어셈블리러 | 2,800 ~ 5,600, 고도의 프로페셔널한 구현은 소규모입니다. |
글럭스 | 통지 6, 통지 7, 기타 | 네. | 아니요. | 다양한 구현이 존재합니다. | ||
HHVM | PHP, Hack | Hack 및 PHP로 작성된 프로그램을 실행하기 위해 설계된 오픈 소스 가상 머신입니다. | 네. | 네. | C++, OCaml | |
아이콘 | 아이콘 | 기본 소스 코드는 인터프리터와 지원되지 않는 C 컴파일 버전을 모두 제공합니다.컴파일러와 인터프리터 간에 공유되는 런타임 코드는 RTT라고 불리는 C의 변형으로 작성됩니다. | 네. | 아니요. | C, RTT(C로의 커스텀프런트 엔드, 아이콘의 베이스 소스와 함께 제공). | 총 18만까지(소스부터 바이트 코드: ~11k, 바이트 코드 인터프리터: ~46k, 아이콘c: ~23k, 공통/표준: ~13k, rtt: ~15k) |
JVM | Java, Kotlin, Jython, Groovy, JRuby, C, C++, Clojure, Scala 및 기타 여러 가지 | Sun ; OpenJDK : GPL 아래의 코드, IceTea : GPL 아래의 코드 및 도구에 의한 참조 구현 | 네. | 네. | JDK, OpenJDK 및 IceTea(표준 JIT 포함): Java, C, C++, ASM, IceTea('제로' JIT 포함): Java, C, C++ | JVM은 약 600,000 회선, TCK는 80,000 테스트 및 약 1,000,000 회선 |
LLVM | C, C++, Kotlin, Objective-C, Swift, Ada, Fortran 및 Rust | MSIL, C 및 C++ 출력이 지원됩니다.ActionScript 바이트 코드 출력은 Adobe Alchemy에서 지원됩니다.바이트 코드의 이름은 "LLVM 바이트 코드(.bc)"이고 어셈블리의 이름은 "LLVM 어셈블리 언어(*.ll)"입니다. | 네. | 네. | C++ | 811k [4] |
루아 | 루아 | 네. | LuaJIT | C | 13k + 7k LuaJIT부문 | |
MMIX | MMIXAL | |||||
모노 | C#, VB를 포함한 CLI 언어NET, IronPython, IronRuby 등 | 공통 언어 런타임 복제 | 네. | 네. | C#, C | 2332k |
NekoVM | 현재 Neko와 Haxe | 네. | x86만 | C | 46k | |
오즈 | 오즈, 앨리스 | |||||
O코드기 | BCPL | |||||
p코드 머신 | 파스칼 | UCSD Pascal은 Apple II를 포함하여 70년대 후반에 널리 보급되었습니다. | ||||
앵무새. | Perl 5, Raku, NQP-rx, PIR, PASM, PBC, BASIC, bc, C99, ECMAScript, Lisp, Lua, m4, TCL, WMLScript, XML 등 | 네. | 네. | C, Perl | 111k C, 240k Perl | |
Perl 가상 머신 | 펄 | op-code 트리 워커 | 네. | 아니요. | C, Perl | 175k C, 9k Perl |
큐피톤 | 파이썬 | 네. | C | 387k C, 368k Python, 10k ASM, 31k Psyco | ||
PyPy | 파이썬 | 차세대 Psyco인 Python의 셀프 호스팅 구현 | 네. | 네. | 파이썬 | |
루비니우스 | 루비 | 다른 Ruby 구현을 위한 가상 시스템 | 네. | 네. | C++, 루비 | |
실버라이트 | C#, VB.NET | Microsoft 마이크로 버전응용 프로그램이 브라우저 내에서 샌드박스를 실행할 수 있도록 하는 NET 프레임워크 | 네. | 네. | C++ | 7 MB (초기 출시) |
스컴 VM | 찌꺼기 | 컴퓨터 게임 엔진 | ||||
섹터 | ISWIM, 리스킷 리스프 | |||||
다람쥐 | 다람쥐 | 네. | 다람쥐_JIT부문 | C++ | 저항기들은 12K | |
스몰토크 | 스몰토크 | |||||
SQLite | SQLite 연산 코드 | 가상 데이터베이스 엔진 | ||||
삐걱거리다 | 스퀵 스몰톡 | Squak 가상 머신의 셀프 호스팅 구현.풍부한 멀티미디어 지원 | 네. | 톱니바퀴&엑쥐페리 | 스몰톡/슬랭 | 11,000 스몰톡, 최대 30,000℃ |
SWI 프롤로그 | 프롤로그: SWI-Prolog, YAP | 네. | 아니요. | C, SWI-프롤로그 | ||
트레이스 몽키 | 자바스크립트 | 타마린에 근거 | 아니요. | 네. | C++ | 173k |
TrueType(TrueType) | TrueType(TrueType) | 글꼴 렌더링 엔진 | 네. | 아니요. | C(일반적으로) | |
발그린드 | x86/x86-64 바이너리 | Linux에서 메모리 액세스 및 누전 확인 | C | 467k [5] | ||
비주얼 워크스 | 스몰토크 | 아니요. | 네. | C | ||
Vx32 가상 시스템 | x86 바이너리 | 네이티브 코드를 위한 애플리케이션 레벨 가상화 | 아니요. | 네. | ||
와바 | Java와 유사한 소형 디바이스용 가상 머신 | |||||
또 다른 루비 VM(YARV) | 루비 | Ruby 1.9 이상 버전에 대한 참조 구현의 가상 시스템 | 네. | 네. | C | |
Z머신 | Z코드 | |||||
Zend 엔진 | PHP | 네. | 아니요. | C | 75,000 |
「 」를 참조해 주세요.
- 응용 프로그램 가상화
- 언어 바인딩
- 외부 기능 인터페이스
- 호출 규칙
- 이름 망글링
- 응용 프로그램프로그래밍 인터페이스(API)
- 응용 프로그램 바이너리 인터페이스(ABI)
- 플랫폼 가상화 소프트웨어 비교
- ECMAScript 엔진 목록
- 웹 어셈블리
레퍼런스
- ^ "The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 292". Jcp.org. Retrieved 2013-07-04.
- ^ "JITRewrite – Parrot". Trac.parrot.org. Retrieved 2013-07-04.
- ^ Java 공유 아카이브의 OS X 사용에 관한 Apple 문서
- ^ LLVM 컴파일러 인프라스트럭처, ohloh.net, 2011년 11월 30일
- ^ Valgrind, ohloh.net, 2011년 11월 30일