Informasi Sains    
   
Daftar Isi
(Sebelumnya) Comparison of Android e-book r ...Comparison of audio player software (Berikutnya)

Perbandingan -- application virtual machines

This article lists some software virtual machines that are typically used for allowing application bytecode to be portably run on many different computer architectures and operating systems. The application is usually run on the computer using an interpreter or just-in-time compilation. There are often many implementations of a given virtual machine, each covering a different functionality footprint.

Contents

Perbandingan -- virtual machines

The table here summarizes elements for which the virtual machine designs intended to be efficient, not the list of capabilities present in any implementation.

Virtual machineMachine modelMemory managementCode securityInterpreterJITPrecompilationShared librariesCommon Language Object ModelDynamic typing
CLRstackautomatic or manualYesNoYesYesYesYesYes
Dis (Inferno)registerautomaticYesYesYesYesYesNoNo
DotGNU Portable.NETstackautomatic or manualNoNoYesYesYesYesNo
JVMstackautomaticYesYesYesYesYesYesYes[1]
JikesRVMstackautomaticNoNoYesNo?NoNo
LLVMregistermanualNoYesYesYesYesYesNo
Monostackautomatic or manualYesYesYesYesYesYesYes
ParrotregisterautomaticNoYesNo[2]YesYesYesYes
DalvikregisterautomaticYesYesYes??NoNo
libJITstackmanualNoNoYesNoNo?No
SqueakstackautomaticNoYesYessource to bytecodeYesNoYes

Virtual machine instructions process data in local variables using a main model of computation, typically that of a stack machine, register machine, or random access machine often called the memory machine. Use of these three techniques is motivated by different tradeoffs in virtual machines vs physical machines, such as ease of interpretation, compilation, and verifiability for security.

Memory management in these portable virtual machines is addressed at a higher level of abstraction than in physical machines. Some virtual machines, such as the popular JVM, are involved with addresses in such a way as to require safe automatic memory management by allowing the virtual machine to trace pointer references, and disallow machine instructions from manually constructing pointers to memory. Other virtual machines, such as LLVM, are more like traditional physical machines, allowing direct use and manipulation of pointers. CIL offers a hybrid in between, offering both controlled use of memory (like the JVM, which allows safe automatic memory management), while also offering an 'unsafe' mode that allows direct manipulation of pointers in ways that can violate type boundaries and permission.

Code security generally refers to the ability of the portable virtual machine to run code while only offering it a prescribed set of capabilities. For example, the virtual machine might only allow the code access to a certain set of functions or data. The same controls over pointers which make automatic memory management possible and allow the virtual machine to ensure typesafe data access are used to assure that a code fragment is only allowed to certain elements of memory and cannot sidestep the virtual machine itself. Other security mechanisms are then layered on top as code verifiers, stack verifiers, and other techniques.

An interpreter allows programs made of virtual instructions to be loaded and immediately run without a potentially costly compilation into native machine instructions. Any virtual machine which can be run can be interpreted, so the column designation here refers to whether the design includes provisions for efficient interpretation (for common usage).

Just-in-time compilation or JIT, refers to a method of compiling to native instructions at the latest possible time, usually immediately before or during the running of the program. The challenge of JIT is more one of implementation than of virtual machine design, however, modern designs have begun to make considerations to help efficiency. The simplest JIT techniques simply perform compilation to a code-fragment similar to an offline compiler. However, more complicated techniques are often employed, which specialize compiled code-fragments to parameters that are known only at runtime (see Adaptive optimization).

Precompiling refers to the more classical technique of using an offline compiler to generate a set of native instructions which do not change during the runtime of the program. Because aggressive compilation and optimization can take time, a precompiled program may launch faster than one which relies on JIT alone for execution. JVM implementations have mitigated this startup cost by using interpretation initially to speed launch times, until native code-fragments can be generated through JIT.

Shared libraries are a facility to reuse segments of native code across multiple running programs. In modern operating systems, this generally means using virtual memory to share the memory pages containing a shared library across different processes which are protected from each other via memory protection. It is interesting that aggressive JIT techniques such as adaptive optimization often produce code-fragments unsuitable for sharing across processes or successive runs of the program, requiring a tradeoff be made between the efficiencies of precompiled and shared code and the advantages of adaptively specialized code. For example, several design provisions of CIL are present to allow for efficient shared libraries, possibly at the cost of more specialized JIT code. The JVM implementation on Mac OS X uses a Java Shared Archive (apple docs) to provide some of the benefits of shared libraries.

Daftar/Tabel -- application virtual machine implementations

In addition to the portable virtual machines described above, virtual machines are often used as an execution model for individual scripting languages, usually by an interpreter. This table lists specific virtual machine implementations, both of the above portable virtual machines, and of scripting language virtual machines.

Virtual machineLanguagesCommentsInterpreterJITImplementation LanguageSLoC
Adobe Flash Player (aka Tamarin)ActionScript, SWF (file format)interactive web authoring tool. bytecode is named "ActionScript Byte Code (.abc)"YesYesC++135k (initially released)
BEAMErlang, Reia, Lisp Flavoured Erlang, ElixirThere exists a native-code compiler, HiPE.YesNoC247k
Clipper p-codeClipper, Harbourplankton, HVMYesNoC 
Dis (Inferno)LimboDis Virtual Machine SpecificationYesYesC15k + 2850 per JIT arch + 500 per host OS
DotGNU/Portable.NETCLI languages including: C#Clone of Common Language RuntimeNoYesC, C# 
ForthForthFeatures are simplified, usually include assembler, compiler, text-level and binary-level interpreters, sometimes editor, debugger and OS. Compilation speeds are >20 SKLOC/S and behave much like JIT.YesNoForth, Forth Assembler2.8K to 5.6K; advanced, professional implementations are smaller.
GlulxGlulx, Z-code     
IconIcon     
JVMJava, Jython, Groovy, JRuby, C, C++, Clojure, Scala and several othersReference implementation by Sun  OpenJDK: code under GPL  IcedTea: code and tools under GPLYesYesJDK, OpenJDK & IcedTea with regular JIT : Java, C, ASM  IcedTea with the "Zero" JIT : Java, CJVM is around 6500k lines; TCK is 80k tests and around 1000k lines
LLVMC, C++, Objective-C, Ada, and FortranMSIL, C and C++ output are supported. ActionScript Byte Code output is supported by Adobe Alchemy. bytecode is named "LLVM Bytecode (.bc)". assembly is named "LLVM Assembly Language (*.ll)".YesYesC++811k [3]
LuaLua YesLuaJITC13k + 7k LuaJIT
MMIXMMIXAL     
MonoCLI languages including: C#, VB.NET, IronPython, IronRuby, and othersclone of Common Language Runtime.YesYesC#, C2332k
OzOz, Alice     
NekoVMcurrently Neko and haXe Yesx86 onlyC46k
O-code machineBCPL     
p-code machinePascalUCSD Pascal, widespread in late 70s including Apple II    
ParrotPerl (6 & 5), NQP-rx, PIR, PASM, PBC, BASIC, bc, C, ECMAScript, Lisp, Lua, m4, Tcl, WMLScript, XML, and others YesYesC, Perl111k C, 240k Perl
Perl virtual machinePerlop-code tree walkerYesNoC, Perl175k C, 9k Perl
CPythonPython YesPsycoC387k C, 368k Python, 10k ASM, 31k Psyco
PyPyPythonSelf-hosting implementation of Python, next generation of PsycoYesYesPython 
RubiniusRubyVirtual machine for another Ruby implementationYesYesC++, Ruby 
SilverlightC#, VB.NETA Micro-version of Microsoft .NET Framework to let applications run sandboxed inside browserYesYesC++7MB (initially released)
SEAMAlice     
ScummVMScummComputer game engine    
SECDISWIM, Lispkit Lisp     
SquirrelSquirrel YesSquirrel_JITC++12k
SmalltalkSmalltalk     
SQLiteSQLite opcodesVirtual database engine    
SqueakSqueak SmalltalkSelf hosting implementation of Squeak virtual machine. Rich multi-media support.YesCog[1] & ExuperySmalltalk/Slang110k Smalltalk, ~300K C
TaoGroup VP/VP2C, JavaProprietary embedded VM    
TraceMonkeyJavaScriptBased on TamarinNoYesC++173k
Translator Engine[citation needed]Flat File Tables/Global C++ variable declarationsIDE, programming by demonstration    
TrueTypeTrueTypeFont rendering engineYesNoC (typically) 
Valgrindx86/x86-64 binariesChecking of memory accesses and leaks under Linux  C467k [4]
VisualWorksSmalltalk NoYesC 
VMKit JVM and CLI virtual machine based on LLVM.NoYes  
Vx32 virtual machinex86 binariesApplication-level virtualization for native codeNoYes  
Waba Virtual machine for small devices, similar to Java    
Yet Another Ruby VM (YARV)RubyVirtual machine of the reference implementation for Ruby 1.9 and newer versionsYesYesC 
Z-machineZ-Code     
Zend EnginePHP YesNoC75k
libJIT Library for Just-In-Time compilationCommon Intermediate Language Java bytecode Domain-specific programming languageVirtual machine is used in Portable.NET Just-In-Time compiler, ILDJIT, HornetsEyeYesYesC, ia32, arm, amd64, alpha, low-level CPU architecture specific machine code 

References

See also

External links

(Sebelumnya) Comparison of Android e-book r ...Comparison of audio player software (Berikutnya)