Java virtuelle Maschine

Java virtuelle Maschine
Designer Sun Microsystems
Bits 32-Bit
Eingeführt 1994
Ausführung 15.0.3[1]
Typ Stapel und Register -Register
Codierung Variable
Verzweigung Vergleichen und besiegen
Endiangess Groß
Offen Ja
Register
Allgemeiner Zweck Pro-Methoden-Operand-Stack (bis zu 65535 Operanden) plus lokale Variablen pro Methoden (bis zu 65535)
Überblick über eine Java Virtual Machine (JVM) -Scharchitektur basierend auf der Java Virtual Machine Specification Java SE 7 Edition

A Java virtuelle Maschine (JVM) ist ein virtuelle Maschine Dadurch kann ein Computer ausgeführt werden Java Programme sowie Programme geschrieben in andere Sprachen das werden auch zusammengestellt Java -Bytecode. Die JVM wird von a detailliert beschrieben Spezifikation Das beschreibt formell, was in einer JVM -Implementierung erforderlich ist. Eine Spezifikation sorgt für die Interoperabilität von Java -Programmen über verschiedene Implementierungen hinweg, sodass Programmautoren die nutzen Java Entwickler-Kit (JDK) müssen sich keine Sorge um Eigenheiten der zugrunde liegenden Hardwareplattform machen.

Der JVM Referenzimplementierung wird von der entwickelt OpenJDK Projekt als Open Source Code und enthält a JIT -Compiler genannt Hotspot. Die kommerziell unterstützten Java -Veröffentlichungen von erhältlich Orakel basieren auf der OpenJDK -Laufzeit. Finsternis OpenJ9 ist ein weiterer Open -Source -JVM für OpenJDK.

JVM -Spezifikation

Die virtuelle Java -Maschine ist ein abstrakter (virtueller) Computer, der durch eine Spezifikation definiert ist. Es ist Teil der Java -Laufzeitumgebung. Das Müllkollektion Der verwendete Algorithmus und jede interne Optimierung der Anweisungen der virtuellen Maschine von Java (ihre Übersetzung in Maschinensprache) werden nicht angegeben. Der Hauptgrund für diese Auslassung besteht darin, Implementierer nicht unnötig einzuschränken. Jede Java -Anwendung kann nur in einer konkreten Implementierung der abstrakten Spezifikation der virtuellen Java -Maschine ausgeführt werden.[2]

Beginnen mit Java -Plattform, Standard Edition (J2SE) 5.0, Änderungen an der JVM -Spezifikation wurden unter dem entwickelt Java Community -Prozess als JSR 924.[3] Ab 2006, Änderungen der Spezifikation zur Unterstützung von Änderungen, die dem vorgeschlagen wurden Klassendateiformat (JSR 202)[4] werden als Wartungsveröffentlichung von JSR 924 durchgeführt. Die Spezifikation für das JVM wurde als die veröffentlicht blaues Buch,[5] Das Vorwort erklärt:

Wir beabsichtigen, dass diese Spezifikation die virtuelle Java-Maschine ausreichend dokumentieren sollte, um kompatible saubere Implementierungen zu ermöglichen. Oracle bietet Tests, die den ordnungsgemäßen Betrieb der Implementierungen der virtuellen Java -Maschine überprüfen.

Eines von Oracle's JVMS heißt Hotspot. der andere, geerbt von BEA -Systeme, ist Jrockit. Oracle besitzt die Java -Marke und kann es ermöglichen, dass Implementierungssuiten als vollständig kompatibel mit der Spezifikation von Oracle kompatibel sind.

Klassenlader

Eine der Organisationseinheiten des JVM -Byte -Code ist a Klasse. Eine Klassenlader -Implementierung muss in der Lage sein, alles zu erkennen und zu laden, was der Java -Klasse entspricht Datei Format. Jede Implementierung ist frei, andere binäre Formen außerdem zu erkennen Klasse Dateien, aber es muss erkennen Klasse Dateien.

Der Klassenlader führt in dieser strengen Reihenfolge drei grundlegende Aktivitäten aus:

  1. Laden: Findet und importiert die binären Daten für einen Typ
  2. Verknüpfung: Durchführt Überprüfung, Vorbereitung und (optional) Auflösung
    • Überprüfung: Gewährleistet die Richtigkeit des importierten Typs
    • Vorbereitung: Zuteilt Speicher für Klassenvariablen und initialisiert den Speicher auf Standardwerte
    • Lösung: Umwandle symbolische Referenzen vom Typ in direkte Referenzen.
  3. Initialisierung: Ruft den Java -Code auf, der die Klassenvariablen auf ihre ordnungsgemäßen Startwerte initialisiert.

Im Allgemeinen gibt es zwei Arten von Klassenlader: Bootstrap -Klasse -Loader und benutzerdefinierte Klassenlader.

Jede Implementierung von Java Virtual Machine muss über einen Bootstrap -Klassenlader verfügen, der vertrauenswürdige Klassen laden kann, und einen Lader der Erweiterungsklassen oder einen Anwendungsklassenlader. In der Spezifikation "Virtual Machine" Java gibt nicht an, wie ein Klassenlader Klassen lokalisieren soll.

Virtuelle Maschinenarchitektur

Die JVM arbeitet mit bestimmten Datenarten, wie in den Spezifikationen von Java Virtual Machine angegeben. Die Datentypen können geteilt werden[6] in primitive Typen (Ganzzahlen, Floating-Punkt, lang usw.) und Referenztypen. Die früheren JVM waren nur 32-Bit Maschine. lang und doppelt Typen, die sind 64-Bit, werden nativ unterstützt, aber zwei Einheiten des Speichers in den lokalen Variablen oder Operandenstapeln eines Rahmens verbrauchen, da jede Einheit 32 Bit beträgt. Boolesche, Byte, kurz, und verkohlen Typen sind alle Anmelden (außer verkohlen welches ist null erweitert) und betrieben als 32-Bit-Ganzzahlen, genauso wie int Typen. Die kleineren Typen haben nur einige typspezifische Anweisungen zum Laden, Speichern und Typumwandlungen. Boolesche wird als 8-Bit betrieben Byte Werte mit 0 darstellen FALSCH und 1 darstellen Stimmt. (Obwohl Boolesche wurde seitdem als Typ behandelt Die Java Virtual Machine Spezifikation, zweite Ausgabe Klar dieses Problem, in kompilierten und ausgeführten Code gibt es kaum einen Unterschied zwischen a Boolesche und ein Byte ausser für Nennen Sie Mangling in Methodensignaturen und die Art der Booleschen Arrays. Boolesches in Methodensignaturen werden verstümmelt als Z während Bytes sind verstümmelt als B. Boolesche Arrays tragen den Typ boolean [] Verwenden Sie jedoch 8 Bit pro Element, und das JVM hat keine integrierte Fähigkeit, Booleschen in a zu packen Bit -Array, bis auf den Typ, den sie ausführen und sich verhalten wie Byte Arrays. In allen anderen Verwendungen die Boolesche Der Typ ist dem JVM effektiv unbekannt, da alle Anweisungen zum Betrieb auf Booleschen auch zum Betrieb verwendet werden Bytes.) Die neueren JVM-Releases (OpenJDK Hotspot JVM) unterstützen jedoch 64-Bit-Support, Sie können entweder 32-Bit/ 64-Bit-JVM auf einem 64-Bit-Betriebssystem haben. Der Hauptvorteil des Ausführens von Java in einer 64-Bit-Umgebung ist der größere Adressraum. Dies ermöglicht eine viel größere Java-Haufengröße und eine erhöhte maximale Anzahl von Java-Threads, was für bestimmte Arten großer Anwendungen erforderlich ist. Bei Verwendung von 64-Bit-JVM im Vergleich zu 32-Bit-JVM wird jedoch eine Leistung aufgetreten.

Das JVM verfügt über einen garbage gesammelten Haufen zum Speichern von Objekten und Arrays. Code, Konstanten und andere Klassendaten werden im "Methodenbereich" gespeichert. Der Methodenbereich ist logisch Teil des Haufens, aber Implementierungen können den Methodenbereich separat vom Haufen behandeln, und beispielsweise kann Müll ihn möglicherweise nicht sammeln. Jeder JVM -Thread hat auch seinen eigenen Rufen Sie Stack an (für Klarheit als "Java Virtual Machine Stack" bezeichnet), das speichert Rahmen. Jedes Mal, wenn eine Methode aufgerufen wird, wird ein neuer Rahmen erstellt und der Rahmen zerstört, wenn diese Methode beendet ist.

Jeder Frame bietet einen "Operand Stack" und eine Reihe von "lokalen Variablen". Der Operand -Stack wird für Operanden zur Berechnung und für den Erhalt des Rückgabewerts einer genannten Methode verwendet, während lokale Variablen den gleichen Zweck erfüllen wie Register und werden auch verwendet, um Methodenargumente zu übergeben. Somit ist der JVM beides a Stapelmaschine und ein Registrieren Sie Maschine. (In der Praxis eliminiert Hotspot jeden Stapel neben dem nativen Thread/Call -Stapel, selbst wenn er im interpretierten Modus ausgeführt wird, da sein Templating -Interpreter technisch gesehen ein Compiler in Verkleidung ist)

Bytecode -Anweisungen

Die JVM hat Anweisungen Für die folgenden Gruppen von Aufgaben:

Das Ziel ist eine binäre Kompatibilität. Jeder bestimmte Host Betriebssystem Benötigt eine eigene Implementierung der JVM und der Laufzeit. Diese JVMs interpretieren die Bytecode semantisch genauso, aber die tatsächliche Implementierung kann unterschiedlich sein. Komplexer als nur die Emulation von Bytecode ist kompatibel und effizient die implementieren Java Core API Das muss jedem Host -Betriebssystem zugeordnet werden.

Diese Anweisungen arbeiten auf einer Reihe von gemeinsamen abstrahiert Datentypen Eher das Native Datentypen von einem beliebigen spezifischen Anweisungsset Architektur.

JVM -Sprachen

Eine JVM -Sprache ist jede Sprache mit Funktionalität, die in Bezug auf eine gültige Klassendatei ausgedrückt werden kann, die von der java virtuellen Maschine gehostet werden kann. Eine Klassendatei enthält Anweisungen für virtuelle Maschine (Java Virtual Machine () (Java -Byte -Code) und eine Symboltabelle sowie andere Zusatzinformationen. Das Klassendateiformat ist das Hardware- und Betriebssystem-unabhängige Binärformat, das zur Darstellung kompilierter Klassen und Schnittstellen verwendet wird.[7]

Es gibt mehrere JVM -Sprachen, beide alte Sprachen portiert auf JVM und völlig neue Sprachen. Jruby und Jython sind vielleicht die bekanntesten Ports vorhandener Sprachen, d. H. Rubin und Python beziehungsweise. Der neuen Sprachen, die von Grund auf neu erstellt wurden, um zu Java -Bytecode zu kompilieren, Clojure, Apache Groovy, Scala und Kotlin kann die beliebtesten sein. Eine bemerkenswerte Funktion bei den JVM -Sprachen ist, dass sie es sind kompatibel miteinander, damit beispielsweise Scala -Bibliotheken mit Java -Programmen verwendet werden und umgekehrt.[8]

Java 7 JVM implementiert JSR 292: Dynamisch getippte Sprachen unterstützen[9] Auf der Java -Plattform, eine neue Funktion, die dynamisch typisierte Sprachen in der JVM unterstützt. Diese Funktion wird innerhalb der entwickelt Da Vinci Maschine Projekt, dessen Mission es ist, die JVM so zu erweitern, dass sie andere Sprachen als Java unterstützt.[10][11]

Bytecode -Verifizierer

Eine grundlegende Philosophie von Java ist, dass es von Natur aus sicher ist, dass kein Benutzerprogramm die Hostmaschine zum Absturz bringen oder auf andere Weise unangemessen mit anderen Vorgängen auf der Host -Maschine einmischt und bestimmte Methoden und Datenstrukturen, die zu Trusted gehören, schützen können Code aus Zugriff oder Korruption durch nicht vertrauenswürdigen Code, der innerhalb desselben JVM ausgeführt wird. Darüber hinaus dürfen gemeinsame Programmiererfehler, die häufig zu Datenbeschädigungen oder unvorhersehbarem Verhalten führten, z. Mehrere Merkmale von Java kombinieren diese Sicherheit, einschließlich des Klassenmodells, dem garbage gesammelten Haufenund der Verifizierer.

Der JVM überprüft alle Bytecode, bevor es ausgeführt wird. Diese Überprüfung besteht hauptsächlich aus drei Arten von Schecks:

  • Zweige sind immer an gültigen Orten
  • Daten werden immer initialisiert und Referenzen sind immer Typ-Sicherheit
  • Der Zugriff auf private oder paket private Daten und Methoden wird starr kontrolliert

Die ersten beiden dieser Überprüfungen finden hauptsächlich während des Überprüfungsschritts statt, der auftritt, wenn eine Klasse geladen und zur Verwendung berechtigt ist. Der dritte wird hauptsächlich dynamisch durchgeführt, wenn zuerst Datenelemente oder Methoden einer Klasse von einer anderen Klasse zugegriffen werden.

Der Verifizierer ermöglicht nur einige Bytecode -Sequenzen in gültigen Programmen, z. a Anweisung springen (Zweig) kann nur einen Anweisungen innerhalb desselben abzielen Methode. Darüber hinaus stellt der Überprüfer sicher, dass eine bestimmte Anweisung an einem festen Stapelort arbeitet.[12] Ermöglichen Sie dem JIT -Compiler können Stack -Zugriff in feste Registerzugriffe umwandeln. Aus diesem Grund bedeutet das JVM eine Stack -Architektur nicht eine Geschwindigkeitsstrafe für die Emulation ein Registerbasierte Architekturen Bei Verwendung eines JIT -Compilers. Angesichts der codesverifizierten JVM-Architektur macht es keinen Unterschied für einen JIT-Compiler, unabhängig davon, ob sie imaginäre Register oder imaginäre Stapelpositionen genannt wird, die den Registern der Zielarchitektur zugewiesen werden müssen. In der Tat unterscheidet die Codeüberprüfung das JVM von einer klassischen Stapelarchitektur, von der die effiziente Emulation mit einem JIT -Compiler komplizierter ist und typischerweise von einem langsameren Dolmetscher durchgeführt wird. Darüber hinaus ist der vom Standard -JVM verwendete Interpreter ein spezieller Typ, der als Vorlagen -Interpreter bekannt ist und Bytecode direkt in native, registrierende Maschinensprache übersetzt, anstatt einen Stack wie ein typischer Interpreter zu emulieren[13] (In vielen Aspekten kann der Hotspot -Interpreter eher als JIT -Compiler als als echter Interpreter angesehen werden. In einer registrierungsbasierten Architektur (eine weitere Instanz einer Stack -Architektur ist lediglich eine Spezifikation und implementiert in einer registrierungsbasierten virtuellen Maschine die gemeinsame Sprachlaufzeit).[14]

Die ursprüngliche Spezifikation für den Bytecode -Verifizierer verwendete eine natürliche Sprache, die in gewisser Hinsicht unvollständig oder falsch war. Es wurden eine Reihe von Versuchen unternommen, die JVM als formales System anzugeben. Auf diese Weise kann die Sicherheit der aktuellen JVM -Implementierungen gründlicher analysiert und potenzielle Sicherheitsausbeutung verhindert. Es ist auch möglich, den JVM zu optimieren, indem unnötige Sicherheitskontrollen übersprungen werden, wenn sich die Ausführung der Anwendung als sicher erwiesen hat.[15]

Sichere Ausführung des Remotecode

Eine virtuelle Maschinenarchitektur ermöglicht eine sehr feinkörnige Kontrolle über die Aktionen, die der Code innerhalb der Maschine ergreifen darf. Es wird davon ausgegangen, dass der Code "semantisch" korrekt ist, dh erfolgreich über den (formalen) Bytecode-Verifiziererprozess bestanden, der durch ein Tool materialisiert wurde und möglicherweise außerhalb der virtuellen Maschine abgeschlossen ist. Hier Java -Appletsund andere sichere Code -Downloads. Sobald Bytecode überprüft wurde, wird der heruntergeladene Code in einem eingeschränkten "eingeschränkt" ausgeführt. "Sandkasten", die den Benutzer vor schlechtem oder böswilligem Code schützen soll. Als Ergänzung zum Bytecode -Überprüfungsprozess können Publisher ein Zertifikat erwerben, mit dem Digital unterschreiben Applets als sicher und geben ihm die Erlaubnis, den Benutzer zu bitten, aus der Sandbox auszubrechen und auf das lokale Dateisystem zuzugreifen. ZwischenablageFühren Sie externe Software- oder Netzwerkstücke aus.

Der formelle Beweis für Bytecode -Überprüfer wurde von der Javacard -Industrie durchgeführt (formale Entwicklung eines eingebetteten Verifiers für Java -Karten -Byte -Code[16]))

Bytecode Interpreter und Just-in-Time-Compiler

Für jeden Hardwarearchitektur ein anderer Java -Bytecode Dolmetscher wird gebraucht. Wenn ein Computer über einen Java -Bytecode -Interpreter verfügt, kann er jedes Java -Bytecode -Programm ausführen, und das gleiche Programm kann auf jedem Computer ausgeführt werden, der einen solchen Interpreter hat.

Wenn Java -Bytecode von einem Interpreter ausgeführt wird, ist die Ausführung immer langsamer als die Ausführung desselben Programms, das in eine native Maschinensprache zusammengestellt wird. Dieses Problem wird gemildert von Just-in-Time-Compiler (JIT) Zur Ausführung von Java -Bytecode. Ein JIT -Compiler kann Java -Bytecode in native Maschinensprache übersetzen, während das Programm ausgeführt wird. Die übersetzten Teile des Programms können dann viel schneller ausgeführt werden, als sie interpretiert werden konnten. Diese Technik wird auf diese häufig ausgeführten Teile eines Programms angewendet. Auf diese Weise kann ein JIT -Compiler die Gesamtausführungszeit erheblich beschleunigen.

Es besteht keine notwendige Verbindung zwischen der Java -Programmiersprache und dem Java -Bytecode. Ein in Java geschriebenes Programm kann direkt in die Maschinensprache eines echten Computers zusammengestellt werden, und Programme, die in anderen Sprachen geschrieben sind, kann Java in Java -Bytecode zusammengestellt werden.

Java-Bytecode soll plattformunabhängig und sicher sein.[17] Einige JVM-Implementierungen enthalten keinen Dolmetscher, bestehen jedoch nur aus einem Just-in-Time-Compiler.[18]

JVM im Webbrowser

Zu Beginn der Lebensdauer der Java -Plattform wurde die JVM als Web -Technologie zum Erstellen vermarktet Reiche Webanwendungen. Ab 2018Die meisten Webbrowser und Betriebssysteme bündeln Webbrowser nicht mit einem Java Plug-In, auch nicht zulassen, dass das Nebenladung von Nicht-Ladung zulässtBlinken Plug-In. Das Java -Browser -Plugin wurde in veraltet JDK 9.[19]

Das Npapi Das Java-Browser-Plug-In wurde so konzipiert, dass der JVM sogenannte Ausführung Java -Applets in HTML -Seiten eingebettet. Für Browser mit dem installierten Plug-In darf das Applet in einen rechteckigen Bereich auf der ihm zugewiesenen Seite zeichnen. Da das Plug-In eine JVM enthält, sind Java-Applets nicht auf die Java-Programmiersprache beschränkt. Jede Sprache, die auf das JVM abzielt, kann im Plug-In ausgeführt werden. Eine eingeschränkte APIs ermöglicht Applets Zugriff auf das Mikrofon- oder 3D -Beschleunigung des Benutzers, obwohl Applets die Seite außerhalb des rechteckigen Bereichs nicht ändern können. Adobe Flash PlayerDie wichtigste konkurrierende Technologie funktioniert in dieser Hinsicht auf die gleiche Weise.

Ab Juni 2015 Laut W3Techs, Java Applet und Silberlicht Die Verwendung war für alle Websites auf jeweils 0,1% gefallen, während Flash auf 10,8% gefallen war.[20]

JavaScript JVMs und Dolmetscher

Ab Mai 2016 ermöglicht Javapoly den Benutzern, nicht modifizierte Java -Bibliotheken zu importieren und sie direkt aus JavaScript aufzurufen. Mit Javapoly können Websites nicht modifizierte Java -Bibliotheken verwenden, auch wenn der Benutzer Java nicht auf seinem Computer installiert hat.[21]

Zusammenstellung zu JavaScript

Angesichts der anhaltenden Verbesserungen der JavaScript -Ausführungsgeschwindigkeit in Kombination mit der verstärkten Nutzung mobiler Geräte, deren Webbrowser keine Unterstützung für Plugins implementieren, gibt es Anstrengungen, um diese Benutzer durch Zusammenstellung von JavaScript abzuzielen. Es ist möglich, entweder den Quellcode oder den JVM -Bytecode mit JavaScript zu kompilieren.

Das Kompilieren des JVM -Bytecode, der über JVM -Sprachen hinweg universell ist, ermöglicht es, auf dem vorhandenen Compiler der Sprache auf Bytecode zu bauen. Die Haupt -JVM -Bytecode für JavaScript -Compiler sind Teavm,[22] Der Compiler enthielt in Dragome Web SDK,[23] Bck2brwsr,[24] und J2JS-Compiler.[25]

Führende Compiler von JVM-Sprachen bis JavaScript enthalten den Java-to-JavaScript-Compiler in Java-to-JavaScript Google Web Toolkit, ClojureScript (Clojure), Grooscript (Apache Groovy), Scala.js (Scala) und andere.[26]

Siehe auch

Verweise

  1. ^ "JDK-Updates/JDK15U: 1055F2102E6E". Oracle Corporation. Abgerufen 2021-04-20.
  2. ^ Bill Venners, Innerhalb der virtuellen Java -Maschine Kapitel 5
  3. ^ "Das Java Community Process (SM) -Programm - JSRS: Java -Spezifikationsanfragen - Detail JSR# 924". JCP.org. Abgerufen 2015-06-26.
  4. ^ "Das Java Community Process (SM) -Programm - JSRS: Java -Spezifikationsanfragen - Detail JSR# 202". JCP.org. Abgerufen 2015-06-26.
  5. ^ Die Spezifikation der Java Virtual Machine (das Erste und zweite Editionen sind auch online erhältlich).
  6. ^ "Kapitel 2. Die Struktur der virtuellen Java -Maschine".
  7. ^ "Die Spezifikation der Java Virtual Machine: Java SE 7 Edition" (PDF). Docs.oracle.com. Abgerufen 2015-06-26.
  8. ^ "Häufig gestellte Fragen - Java Interoperability". Scala-Lang.org. Abgerufen 2015-11-18.
  9. ^ "Das Java Community Process (SM) -Programm - JSRS: Java -Spezifikationsanfragen - Detail JSR# 292". JCP.org. Abgerufen 2015-06-26.
  10. ^ "Da Vinci Machine Project". Openjdk.java.net. Abgerufen 2015-06-26.
  11. ^ "Neue JDK 7 -Funktion: Unterstützung für dynamisch getippte Sprachen in der virtuellen Java -Maschine". Oracle.com. Abgerufen 2015-06-26.
  12. ^ "Der Überprüfungsprozess". Die Spezifikation der Java Virtual Machine. Sun Microsystems. 1999. Abgerufen 2009-05-31.
  13. ^ "Archivierte Kopie". Archiviert von das Original am 2021-06-08. Abgerufen 2021-05-24.{{}}: CS1 Wartung: Archiviertes Kopie als Titel (Link)
  14. ^ "Warum nicht CLR registrieren? · Ausgabe Nr. 4775 · Dotnet/Laufzeit". GitHub.
  15. ^ Freund, Stephen N.; Mitchell, John C. (1999). "Ein formaler Rahmen für die Java -Bytecode -Sprache und die Verifier". Verfahren der 14. ACM -Sigplan -Konferenz über objektorientierte Programmierung, Systeme, Sprachen und Anwendungen - OOPSLA '99. S. 147–166. Citeseerx 10.1.1.2.4663. doi:10.1145/320384.320397. ISBN 978-1581132380. S2CID 14302964.
  16. ^ http://www-sop.inria.fr/everest/lilian.burdy/cbr02dsn.pdf[Bare URL PDF]
  17. ^ David J. Eck, Einführung in das Programmieren mit Java, Siebte Ausgabe, Version 7.0, August 2014, Abschnitt 1.3 "The Java Virtual Machine" "
  18. ^ Oracle Jrockit Einführung Archiviert 2015-09-06 bei der Wayback -Maschine Freigabe R28 bei 2. "Verständnis der Just-in-Time-Zusammenstellung und -Optimierung"
  19. ^ "Oracle zerlegt das Java -Browser -Plugin, bereitet sich auf seinen Tod vor.". ARS Technica. 28. Januar 2016. Abgerufen 15. April 2016.
  20. ^ "Historische jährliche Trends bei der Verwendung von Kunden-Seite-Programmiersprachen, Juni 2015". W3techs.com. Abgerufen 2015-06-26.
  21. ^ Krill, Paul (13. Mai 2016). "Javapoly.js importiert den vorhandenen Java -Code und ruft ihn direkt aus JavaScript auf". InfoWorld. Abgerufen 18. Juli 2016.
  22. ^ "TEAVM -Projekt Homepage". Teavm.org. Abgerufen 2015-06-26.
  23. ^ "Dragome Web SDK". Dragome.com. Abgerufen 2015-06-26.
  24. ^ "Bck2brwsr - Apidesign". Wiki.apidesign.org. Abgerufen 2015-06-26.
  25. ^ Wolfgang Kuehn (Decatur). J2JS-Compiler GitHub
  26. ^ "Liste der Sprachen, die zu js · Jashkenas/Coffeescript Wiki · Github zusammenstellen". Github.com. 2015-06-19. Abgerufen 2015-06-26.