Ein Jahr ist vergangen, seit der vorherige Trick erfolgreich war: ein Video auf YouTube anstelle eines Posts zu veröffentlichen.
"Shameful talk about singleton" hat 7.000 Aufrufe auf YouTube und doppelt so viele auf Habré in der Textversion erhalten. Für einen Artikel, der in einem völlig hartnäckigen Zustand geschrieben wurde und über das alte Knopfakkordeon erzählt, ist dies ein kleiner Erfolg.
Heute habe ich die ganze Nacht eine neue Version installiert. Dieses Mal ist das Thema viel jünger: die Geschichte des Engagements für experimentelle Technologie - SubstrateVM. Aber der Grad der Hartnäckigkeit ist auf ein neues Niveau gestiegen.
Ich freue mich sehr auf Ihre Kommentare! Ich erinnere Sie daran, dass es am besten ist, wenn Sie etwas in diesem Beitrag verbessern möchten,
das auf Github einzureichen . Ich möchte sagen: "Gefällt mir und abonniere
den neuen Kanal , aber werden alle seine Releases trotzdem in deinem Java-Hub sein?"
Technisch: Das Video hat einen, der näher am Ende klebt. Ich habe gerade ein unkomprimiertes Video geschrieben und meine m2-SSD mit einer Größe von nur fünfhundert Gigabyte ist schnell übergelaufen. Und keine andere Festplatte konnte einem solchen Datendruck standhalten. Deshalb musste ich mich für eine halbe Stunde trennen und ging raus und fand weitere fünfzig Gigs, um die letzten paar Minuten aufzunehmen. Dies wurde durch Löschen der
von GoogleChrome kompilierten Dateien erreicht. Ich habe
zum Zeitpunkt der Aufnahme über die Aufnahmesoftware in der FB geschrieben, es gibt viele Schmerzen.
Ein weiteres technisch interessantes: YouTube hat mich aus irgendeinem Grund beim Live-Streaming blockiert. Gleichzeitig gibt es keinen einzigen Streik und kein einziges Stigma auf dem Konto. Hoffen wir, dass dies nur ein Pfosten ist und nach 90 Tagen alles zurück ist.
Dieser Artikel zitiert aus einem Code von Oracle. Sie können diesen Code nicht für sich selbst verwenden (es sei denn, Sie lesen die Originallizenz und es erlaubt ihn beispielsweise unter den Bedingungen der GPL). Das ist kein Scherz. Olso, warnte ich.
Prikazka (und ein Märchen wird vor uns liegen)
Viele haben bereits Geschichten gehört, dass „das neue Java in Java geschrieben wird“ und fragen sich, wie das sein könnte. Es gibt ein Policy Dokument von
Project Metropolis und einen entsprechenden Brief von
John Rose , aber dort ist alles ziemlich vage.
Es klingt wie eine Art gruselige, blutige Magie. In der gleichen Sache, die Sie jetzt versuchen können, gibt es nicht nur keine Magie, sondern alles ist dumm wie die Rückseite einer Schaufel, wenn Sie Ihre Zähne damit ausschlagen. Natürlich gibt es einige Nuancen, aber dies wird eines Tages sehr später sein.
Ich werde es am Beispiel einer lehrreichen Geschichte zeigen, die im Sommer passiert ist. Wie sie den Aufsatz „Wie ich den Sommer verbracht habe“ in Schulen schreiben.
Um eine kleine Bemerkung zu beginnen. Das Projekt, das derzeit in Oracle Labs vorab kompiliert wird, ist GraalVM. Die Komponente, die tatsächlich Nishtyaki ausführt und Java-Code in eine ausführbare Datei (in eine ausführbare Datei) verwandelt, ist SubstrateVM oder kurz SVM. Verwechseln Sie dies nicht mit der gleichen Abkürzung, die von Datensatanisten (Support Vector Machine) verwendet wird. Hier geht es um SVM. Als Schlüsselelement werden wir weiter darüber sprechen.
Erklärung des Problems
Also, "wie ich den Sommer verbracht habe." Ich saß im Urlaub, verbrachte zwei F5 auf dem
Grail Github und stieß auf
diesen :

Eine Person möchte, dass
os.version
den richtigen Wert
os.version
.
Nun, ich wollte den Fehler beheben? Der Junge sagte - der Junge tat es.
Wir werden überprüfen, ob unser Kunde lügt.
public class Main { public static void main(String[] args) { System.out.println(System.getProperty("os.version")); } }
Erstens, wie der Auspuff in echtem Java aussieht:
4.15.0-32-generic
. Ja, das ist frisches Ubuntu LTS Bionic.
Versuchen Sie nun, dasselbe auf SVM zu tun:
$ ls Main.java $ javac -cp . Main.java $ ls Main.class Main.java $ native-image Main Build on Server(pid: 18438, port: 35415) classlist: 151.77 ms (cap): 1,662.32 ms setup: 1,880.78 ms error: Basic header file missing (<zlib.h>). Make sure libc and zlib headers are available on your system. Error: Processing image build request failed
Na ja. Dies liegt daran, dass ich speziell für den „sauberen“ Test eine völlig neue virtuelle Maschine erstellt habe.
$ sudo apt-get install zlib1g-dev libc6 libc6-dev $ native-image Main Build on Server(pid: 18438, port: 35415) classlist: 135.17 ms (cap): 877.34 ms setup: 1,253.49 ms (typeflow): 4,103.97 ms (objects): 1,441.97 ms (features): 41.74 ms analysis: 5,690.63 ms universe: 252.43 ms (parse): 1,024.49 ms (inline): 819.27 ms (compile): 4,243.15 ms compile: 6,356.02 ms image: 632.29 ms write: 236.99 ms [total]: 14,591.30 ms
Absolute Laufzeitzahlen können schrecklich sein. Aber erstens war es das, was es tun sollte: Hier werden sehr höllische Optimierungen angewendet. Und zweitens ist dies eine gebrechliche virtuelle Maschine, die Sie wollen.
Und schließlich der Moment der Wahrheit:
$ ./main null
Es scheint, dass unser Gast nicht gelogen hat, wirklich nicht funktioniert.
Erster Ansatz: Eigenschaften vom Host stehlen
Dann habe ich die globale
os.version
nach
os.version
und festgestellt, dass sich alle diese Eigenschaften in der
SystemPropertiesSupport
Klasse befinden.
Ich werde nicht den vollständigen Pfad in die Datei schreiben, da die Möglichkeit, die richtigen Projekte für IntelliJ IDEA und Eclipse zu generieren, direkt in SVM integriert ist. Das ist sehr cool und erinnert überhaupt nicht an die Qualen, die OpenJDK meistens erleben muss. Lassen Sie die IDE Klassen für uns öffnen. Also:
public abstract class SystemPropertiesSupport { private static final String[] HOSTED_PROPERTIES = { "java.version", ImageInfo.PROPERTY_IMAGE_KIND_KEY, "line.separator", "path.separator", "file.separator", "os.arch", "os.name", "file.encoding", "sun.jnu.encoding", };
Dann habe ich, ohne meinen Kopf einzuschließen, einfach
eine weitere Variable zu diesem Satz
hinzugefügt :
"os.arch", "os.name", "os.version"
Ich baue um, laufe, bekomme die begehrte Zeile
4.15.0-32-generic
. Hurra!
Aber hier ist das Problem: Jetzt wird auf
jedem Computer, auf dem dieser Code ausgeführt wird, immer
4.15.0-32-generic
. Selbst wenn
uname -a
die vorherige Version des Buckets auf altem Ubunt zurückgibt.
Es wird deutlich, dass diese Variablen zum Zeitpunkt der Kompilierung in die Quelldatei geschrieben werden.
Und wirklich, Sie müssen die Kommentare sorgfältig lesen:
private static final String[] HOSTED_PROPERTIES
Andere Methoden müssen angewendet werden.
Schlussfolgerungen
- Wenn eine Systemeigenschaft aus "Haupt-Java" in SVM angezeigt werden soll, ist dies sehr einfach. Wir schreiben die gewünschte Immobilie an der richtigen Stelle, das ist alles.
- Sie können in der IDE arbeiten, die gleichzeitig Java und Python unterstützt. Zum Beispiel in IntelliJ IDEA Ultimate mit einem Python-Plugin oder dem gleichen in Eclipse.
Zweiter Ansatz
Wenn Sie die SystemPropertiesSupport-
SystemPropertiesSupport
durchsuchen, finden wir eine viel vernünftigere Sache:
private final Map<String, Supplier<String>> lazyRuntimeValues;
Unter anderem blockiert die Verwendung dieser Eigenschaften den Prozess der Erstellung einer ausführbaren Datei immer noch nicht. Es ist klar, dass sich alles verlangsamen wird, wenn wir in
HOSTED_PROPERTIES
viel
HOSTED_PROPERTIES
.
Die Registrierung von faulen Eigenschaften erfolgt auf offensichtliche Weise unter Bezugnahme auf eine Methode, die Folgendes zurückgibt:
lazyRuntimeValues.put("user.name", this::userNameValue); lazyRuntimeValues.put("user.home", this::userHomeValue); lazyRuntimeValues.put("user.dir", this::userDirValue);
Darüber hinaus sind alle diese Methodenreferenzen Schnittstellen, und für jede der unterstützten Plattformen ist dasselbe
this::userDirValue
implementiert. In diesem Fall sind dies
PosixSystemPropertiesSupport
und
WindowsSystemPropertiesSupport
.
Wenn wir neugierig auf eine Implementierung für Windows sind, werden wir das Traurige sehen:
@Override protected String userDirValue() { return "C:\\Users\\somebody"; }
Wie Sie sehen, wird Windows noch nicht unterstützt :-) Das eigentliche Problem besteht jedoch darin, dass die Generierung von ausführbaren Dateien für Windows noch nicht abgeschlossen ist. Die Unterstützung dieser Methoden wäre also völlig unnötig.
Das heißt, Sie müssen die folgende Methode implementieren:
lazyRuntimeValues.put("os.version", this::osVersionValue);
Und dann unterstützen Sie es in zwei oder drei verfügbaren Schnittstellen.
Aber was soll man dort schreiben?
Schlussfolgerungen
- Wenn Sie eine neue Eigenschaft hinzufügen möchten, die zur Laufzeit berechnet wird, müssen Sie nur eine Methode schreiben. Das Ergebnis kann vom aktuellen Betriebssystem abhängen, der Schaltmechanismus funktioniert bereits und fragt nicht.
Ein bisschen Archäologie
Das erste, was mir in den Sinn kommt, ist einen Blick auf eine Implementierung in OpenJDK zu werfen und dreist zu kopieren und einzufügen. Ein wenig Archäologie und Plünderungen werden einen mutigen Entdecker niemals davon abhalten!
Sie können jedes Java-Projekt in der Idee öffnen, dort
System.getProperty("os.version")
schreiben und mit Strg + Klick zur Implementierung der Methode
getProperty()
. Es stellt sich heraus, dass all dies dumm in
Properties
liegt.
Es scheint, kopiere und füge einfach die Stelle ein, an der diese
Properties
gefüllt sind, und renne inbrünstig in die Leere. Leider stoßen wir auf ein Problem:
private static native Properties initProperties(Properties props);
Noooooooooooooo.

Aber alles hat so gut angefangen.
Gab es einen Jungen?
Wie wir wissen, ist die Verwendung von C ++ schlecht. Wird C ++ in SVM verwendet?
Einfach so!
src/com.oracle.svm.native
gibt es sogar ein spezielles Paket:
src/com.oracle.svm.native
.
Und in diesem Paket, Horror-Horror, liegt die Datei
getEnviron.c
mit
getEnviron.c
so:
extern char **environ; char **getEnviron() { return environ; }
Es ist Zeit, sich mit C ++ anzulegen
Tauchen Sie jetzt etwas tiefer und öffnen Sie die vollständigen OpenJDK-Quellen.
Wenn jemand sie noch nicht hat, können Sie
im Internet suchen oder herunterladen. Ich warne Sie, sie schwingen
von hier aus , immer noch mit Hilfe von Mercurial, und es wird immer noch ungefähr eine halbe Stunde dauern.
Die Datei, die wir benötigen, befindet sich unter
src/java.base/share/native/libjava/System.c
.
Haben Sie bemerkt, dass dies der Pfad zur Datei ist und nicht nur der Name? Das ist richtig, Sie können Ihre neue glänzende modische Idee schieben, die für 200 US-Dollar pro Jahr gekauft wurde. Sie können
CLion ausprobieren , aber um irreversible psychische Schäden zu vermeiden, ist es besser, nur
Visual Studio Code zu verwenden . Er hebt bereits etwas hervor, versteht aber immer noch nicht, was er gesehen hat (er streicht nicht alles rot durch).
Kurzes Nacherzählen von
System.c
:
java_props_t *sprops = GetJavaProperties(env)
Sie werden wiederum in
src/java.base/unix/native/libjava/java_props_md.c
.
Jede Plattform hat ihre eigene solche Datei, sie wechseln durch
#define
.
Und hier fängt es an. Es gibt viele Plattformen. Jede Nekrophilie wie AIX kann bewertet werden, da GraalVM sie offiziell nicht unterstützt (soweit ich weiß, sind GNU-Linux, macOS und Windows am Anfang geplant). GNU / Linux und Windows unterstützen die Verwendung von
<sys/utsname.h>
, das vordefinierte Methoden zum
<sys/utsname.h>
des Namens und der Version des Betriebssystems enthält.
Aber macOS hat ein
schreckliches Stück Govnokod .
- Der Name "Mac OS X" ist darin fest beschichtet (obwohl es schon lange MacOS ist);
- Es hängt von der Version von Makoshi ab. Vor 10.9 hatte das SDK keine
operatingSystemVersion
Funktion, und Sie mussten SystemVersion.plist
Hand lesen. - Für diese Subtraktion wird die ObjC-Erweiterung wie folgt verwendet:
Wenn anfangs die Idee bestand, dies manuell in einem guten Stil umzuschreiben, dann stürzte es schnell in die Realität ab. Was ist, wenn ich irgendwo im Dschungel dieser Nudeln von ifs herumspiele, jemand sie kaputt macht und mich auf dem zentralen Platz aufhängt? Na nafig.
Es ist notwendig, zu kopieren und einzufügen.Schlussfolgerungen
- IDE wird nicht benötigt;
- Jede Kommunikation mit C ++ ist schmerzhaft, unangenehm und wird auf den ersten Blick nicht verstanden.
Kopieren-Einfügen ist die Norm?
Dies ist ein wichtiges Thema, von dem die Höhe der weiteren Qualen abhängt. Ich wollte wirklich nicht manuell umschreiben, aber es ist noch schlimmer, wegen Lizenzverletzung vor Gericht zu kommen. Also ging ich zum Github und fragte Codrut Stancu direkt danach. Hier ist, was er
antwortete :
»Die Wiederverwendung von OpenJDK-Code, beispielsweise das Kopieren und Einfügen, ist aus Sicht der Lizenzierung eine normale Sache. Dafür gibt es jedoch einen sehr guten Grund. Wenn eine Funktion implementiert werden kann, indem der JDK-Code ohne Kopieren wiederverwendet wird, z. B. durch Ersetzen gepatcht wird, ist dies viel besser. "Das klingt nach einer offiziellen Erlaubnis zum Kopieren und Einfügen!
Wir haben normal geredet ...
Ich fing an, diesen Code zu portieren, stieß aber auf meine Faulheit. Um macOS für verschiedene Versionen zu testen, müssen Sie mindestens eine mit dem nekrophilen 10.8 Mountain Lion finden. Ich habe zwei meiner Apple-Geräte zur Verfügung und eines von einem Freund. Außerdem kann ich es auf einer Test-VMWare bereitstellen.
Aber Faulheit. Und diese Faulheit hat mich gerettet.
Ich ging in den
Chatraum und fragte Chris Seaton, welche Toolchain für die Montage am besten geeignet sei. Welche Version des Betriebssystems unterstützt wird, C ++ - Compiler usw.
Als Antwort erhielt er eine überraschte Stille aus dem Chat und Chris antwortete, dass er das Wesentliche des Problems nicht verstehe.
Es dauerte eine Weile, bis Chris herausfand, was ich tun wollte, und bat ihn, es
nie wieder zu tun .
Das fehlt wirklich die Idee von SVM. SVM ist reines Java, es soll keinen Code von OpenJDK enthalten. Sie können es lesen, in Java konvertieren, aber niemand möchte C ++ - Code von OpenJDK. Das ist das Letzte, was wir wollen.
Das Beispiel der Mathematikbibliotheken überzeugte ihn nicht. Zumindest sind sie in C geschrieben, und die Aufnahme von C ++ würde bedeuten, eine völlig neue Sprache mit der Codebasis zu verbinden. Und eine, die Fufufu ist.
Was müssen Sie tun? Schreiben Sie in
System Java .
Und wenn Aufrufe des C / C ++ Platform SDK nicht vermieden werden können, sollte dies ein einzelner Systemaufruf sein, der in die C-API eingeschlossen ist. Daten werden in Java abgerufen, und dann wird die Geschäftslogik ausschließlich in Java geschrieben, auch wenn das Platform SDK über bequeme, vorgefertigte Möglichkeiten verfügt, dies auf der C ++ - Seite anders zu tun.
Ich seufzte und begann den Quellcode zu studieren, um zu verstehen, wie dies anders gemacht werden kann.
Schlussfolgerungen
- Sprechen Sie mit Personen im Chat über obskure Details. Sie antworten, wenn die Fragen nicht völlig idiotisch sind. Obwohl dieses Beispiel zeigt, dass Chris bereit ist, idiotische Themen zu diskutieren, auch wenn dies seine Zeit nicht persönlich spart;
- C ++ ist im Projekt überhaupt nicht vorhanden. Es gibt keinen Grund zu der Annahme, dass sich jemand von ihm unter den Boden ziehen lässt.
- Stattdessen müssen Sie in System Java mit C als letztem Ausweg schreiben (z. B. beim Aufrufen des Plattform-SDK).
Geiger wird nicht benötigt
Ein Geiger wird nicht gebraucht, Liebes. Er isst nur überschüssigen Kraftstoff.
Dann war ich von etwas Traurigkeit überwältigt, denn schau her. Wenn wir unter Windows
<sys/utsname.h>
haben und wir dumm auf seine Antwort hoffen - es ist einfach und unkompliziert.
Aber wenn er nicht da ist, was muss dann getan werden?
- Integrierte cmd-Befehle oder Windows-Dienstprogramme aufrufen? Ausgabe eines Textes in russischer Sprache, der analysiert werden muss. Dies ist der tiefste Punkt, und er stimmt möglicherweise nicht mit dem überein, was das echte OpenJDK an dieser Stelle beantworten wird.
- Aus der Registrierung nehmen? Auch hier gibt es Nuancen, zum Beispiel beim Wechsel von Windows 7 zu 10 hat sich die Methode zum Speichern digitaler Nummern in der Registrierung geändert, und in Windows 10 müssen Sie entweder die Hände von den Haupt- und Nebenkomponenten kleben oder einfach antworten, dass es sich um Windows 10 mit einer Ziffer handelt. Welche dieser Methoden korrekter ist (lässt die Ärsche der Benutzer nicht bereuen), ist unklar.
Glücklicherweise wurde meine Angst
durch die Pull-Quest
von Paul Woegerer
unterbrochen , die alles reparierte.
Interessanterweise wurde zuerst alles im Assistenten repariert (
os.version
gab im Test
os.version
null
aus), und erst dann bemerkte ich eine Pull-Anfrage. Das Problem ist, dass dieses Commit auf dem Github nicht als Pullrequest markiert ist - es ist ein einfaches Commit mit der Aufschrift
PullRequest: graal/1885
im Kommentar. Tatsache ist, dass die Jungs von Oracle Labs Github nicht verwenden, sondern nur für die Interaktion mit externen Committern benötigen. Wir alle, die wir nicht das Glück hatten, bei Oracle Labs zu arbeiten, müssen Benachrichtigungen über neue Commits im Repository abonnieren und alle lesen.
Jetzt können Sie sich entspannen und sehen, wie Sie diese Funktion
richtig implementieren.
Mal sehen, was für ein Biest das ist, System Java.
Wie ich bereits sagte, ist alles einfach, wie die Rückseite einer Schaufel, wenn sie versuchen, Ihre Zähne auszuschlagen. Und genauso schmerzhaft. Schauen Sie sich das Zitat aus dem Pool an:
@Override protected String osVersionValue() { if (osVersionValue != null) { return osVersionValue; } CoreFoundation.CFDictionaryRef dict = CoreFoundation._CFCopyServerVersionDictionary(); if (dict.isNull()) { dict = CoreFoundation._CFCopySystemVersionDictionary(); } if (dict.isNull()) { return osVersionValue = "Unknown"; } CoreFoundation.CFStringRef dictKeyRef = DarwinCoreFoundationUtils.toCFStringRef("MacOSXProductVersion"); CoreFoundation.CFStringRef dictValue = CoreFoundation.CFDictionaryGetValue(dict, dictKeyRef); CoreFoundation.CFRelease(dictKeyRef); if (dictValue.isNull()) { dictKeyRef = DarwinCoreFoundationUtils.toCFStringRef("ProductVersion"); dictValue = CoreFoundation.CFDictionaryGetValue(dict, dictKeyRef); CoreFoundation.CFRelease(dictKeyRef); } if (dictValue.isNull()) { return osVersionValue = "Unknown"; } osVersionValue = DarwinCoreFoundationUtils.fromCFStringRef(dictValue); CoreFoundation.CFRelease(dictValue); return osVersionValue; }
Mit anderen Worten, wir schreiben Wort für Wort in Java, was wir in C schreiben würden.
DarwinExecutableName
an, wie
DarwinExecutableName
geschrieben ist:
@Override public Object apply(Object[] args) { final CIntPointer sizePointer = StackValue.get(CIntPointer.class); sizePointer.write(0); if (DarwinDyld._NSGetExecutablePath(WordFactory.nullPointer(), sizePointer) != -1) { VMError.shouldNotReachHere("DarwinExecutableName.getExecutableName: Executable path length is 0?"); } final byte[] byteBuffer = new byte[sizePointer.read()]; try (PinnedObject pinnedBuffer = PinnedObject.create(byteBuffer)) { final CCharPointer bufferPointer = pinnedBuffer.addressOfArrayElement(0); if (DarwinDyld._NSGetExecutablePath(bufferPointer, sizePointer) == -1) { return null; } final String executableString = CTypeConversion.toJavaString(bufferPointer); final String result = realpath(executableString); return result; } }
All diese
CIntPointer
,
CCharPointer
,
PinnedObject
, was.
Für meinen Geschmack ist dies unangenehm und hässlich. Sie müssen manuell mit Zeigern arbeiten, die wie Java-Klassen aussehen. Sie müssen die entsprechende
release
rechtzeitig aufrufen, damit der Speicher nicht verloren geht.
Wenn es Ihnen jedoch so erscheint, als wären dies
ungerechtfertigte Maßnahmen, können Sie sich erneut die
Implementierung von GC in .NET ansehen und entsetzt darüber sein, wozu C ++ führt, wenn Sie nicht rechtzeitig anhalten. Ich erinnere Sie daran, dass dies eine riesige CPP-Datei ist, die größer als ein Megabyte ist. Es gibt
einige Beschreibungen seiner Arbeit, aber sie reichen eindeutig nicht aus, um von einem externen Mitarbeiter verstanden zu werden. Der obige Code sieht zwar böse aus, ist aber durchaus verständlich und wird mithilfe einer statischen Analyse für Java analysiert.
Was das Wesentliche des Commits betrifft, habe ich Fragen an ihn. Und zumindest ist dort keine Windows-Unterstützung implementiert. Wenn ein Codegen für Windows angezeigt wird, werde ich versuchen, diese Aufgabe zu übernehmen.
Schlussfolgerungen
- Müssen in System Java schreiben. Lob, nenn süßes Brot. Es gibt noch keine Optionen;
- Abonnieren Sie Benachrichtigungen aus dem Repository auf GitHub und lesen Sie die Commits. Andernfalls fliegen wichtige PRs vorbei.
- Fragen Sie nach Möglichkeit nach wichtigen Funktionen der Verantwortlichen für diesen Bereich. Es gibt viele Dinge, die implementiert werden, aber sie sind der Öffentlichkeit noch nicht bekannt. Es gibt eine Chance, ein Fahrrad zu erfinden, und viel schlimmer als das, das von den Jungs von Oracle Labs hergestellt wurde.
- Informieren Sie die verantwortliche Person am Github, wenn Sie eine Funktion in Angriff nehmen. Wenn er nicht antwortet - schreiben Sie einen Brief, werden die Adressen aller Teammitglieder leicht gegoogelt.
Nachwort
Diese Schlacht endet, aber überhaupt kein Krieg.
Kämpfer, warte sensibel auf neue Artikel über Habré und
passe in unsere Reihen !
Ich möchte Sie daran erinnern, dass Oleg Shelaev, der einzige
offizielle GraalVM-Evangelist von Oracle, zur
nächsten Joker-Konferenz kommen wird . Nicht nur "der einzige russische Sprecher", sondern "der einzige im Allgemeinen". Der Titel des Berichts (
„Java vorab mit GraalVM kompilieren“ ) weist darauf hin, dass SubstrateVM nicht darauf verzichten kann.
Übrigens wurde Oleg kürzlich eine Dienstwaffe ausgestellt - ein Bericht über Habré,
Shelajev-Oleg . Es gibt dort noch keine Beiträge, aber Sie können diesen Benutzernamen verwenden.
Sie können mit Oleg und Oleg in unserem Chatroom-Chat im Telegramm
sprechen :
@graalvm_ru . Im Gegensatz zu ishshuyev auf Github können Sie dort in jeder Form kommunizieren, und niemand wird gesperrt (
dies ist jedoch nicht korrekt ).
Ich erinnere Sie auch daran, dass wir jede Woche zusammen mit dem Debriefing-Podcast den Java Digest veröffentlichen. Zum Beispiel war dies die
letzte Zusammenfassung . Von Zeit zu Zeit werden dort Nachrichten über GraalVM übersprungen (tatsächlich verwandle ich die gesamte Ausgabe nicht in eine GraalVM-Pressemitteilung, nur aus Respekt vor dem Publikum :-)
Vielen Dank für das Lesen - und bis bald!