qjs -Dolmetscherqjsc Compilerqjscalc -Anwendungstd -Modulosqjsc CompilerQuickJS ist eine kleine und eingebettete JavaScript -Engine, die die ES2020 -Spezifikationen wie Module, asynchrone Generatoren und Proxy unterstützt.
Es unterstützt optional mathematische Erweiterungen wie große ganze Zahlen (Bigint), große schwimmende Punktzahlen (Bigfloat) und Operator -Überladung.
Offizielle Seite: https://bellard.org/quickjs/
Chinesische Website: https://github.com/quickjs-zh/
Quickjs QQ Group 1: 598609506 .
Chinesisches Wiki: https://github.com/quickjs-zh/quickjs/wiki
Klicken Sie hier, um den spezifischen Inhalt des QuickJS -Benchmark -Tests anzuzeigen
Bietet Makefiles, die unter Linux oder macOS/x kompiliert werden können. Vorläufige Fensterunterstützung können durch Kreuzkompilieren auf Linux-Hosts mit dem Mingw-Tool erhalten werden.
Wenn Sie eine bestimmte Option auswählen möchten, bearbeiten Sie die Oberseite Makefile und leiten Sie make aus.
make install mit Root, um kompilierte Binärdateien zu installieren und Dateien an /usr/local zu unterstützen (dies ist nicht erforderlich, um QuickJs zu verwenden).
HINWEIS : Sie können sich unter Linux auf die chinesische QuickJS -Dokumentation zur Kompilierung und Installation unter Windows und Kompilierung und Installation beziehen.
qjs ist ein Befehlszeilen-Parser (Read-Eval-Print-Schleife). Sie können JavaScript-Dateien und/oder Ausdrücke als Parameter übergeben, um sie auszuführen:
./qjs examples/hello.js
qjsc ist ein Befehlszeilen Compiler:
./qjsc -o hello examples/hello.js
./hello
Generieren Sie eine hello ausführbare Datei ohne externe Abhängigkeiten.
qjsbn und qjscbn sind die entsprechenden Dolmetscher und Compiler mit mathematischen Erweiterungen:
./qjsbn examples/pi.js 1000
1000 Ziffern PI anzeigen
./qjsbnc -o pi examples/pi.js
./pi 1000
PI -Programm kompilieren und ausführen.
qjs -DolmetscherVerwendung: QJS [Optionen] [Dateien]
Optionen:
-h
--help
Liste der Optionen.
-e `EXPR`
--eval `EXPR`
Expr.
-i
--interactive
Gehen Sie in den interaktiven Modus (es ist nicht der Standardmodus, wenn die Datei in der Befehlszeile bedient wird).
-m
--module
Laden Sie als ES6 -Modul (Standard ist .MJS -Dateierweiterung).
Zu den erweiterten Optionen gehören:
-d
--dump
Übertragungsspeicherverbrauchsstatistik.
-q
--quit
Instanziieren Sie einfach den Dolmetscher und beenden Sie.
qjsc CompilerVerwendung: QJSC [Optionen] [Dateien]
Optionen:
-c
Nur der Bytecode in der C -Datei wird ausgegeben, und die Standardeinstellung besteht darin, die ausführbare Datei auszugeben.
-e
main() Die Ausgabe und Bytecode in der C -Datei ist die Standardeinstellung die ausführbare Ausgabedatei.
-o output
Setzen Sie den Ausgabedateinamen (default = out.c oder a.out).
-N cname
Legt den C -Namen der generierten Daten fest.
-m
Kompilieren Sie als JavaScript -Modul (Standard ist die Erweiterung .MJS).
-M module_name[,cname]
Fügen Sie den Initialisierungscode für externe C -Module hinzu. Schauen Sie sich c_module an.
-x
Byte-Swap-Ausgang (nur für Kreuzkompilation).
-flto
Verwenden Sie die Optimierung der Verbindungszeit. Die Zusammenstellung ist langsamer, aber ausführbare Säle sind kleiner und schneller. Diese Option wird automatisch festgelegt, wenn die Option -fno-x verwendet wird.
-fno-[eval|string-normalize|regexp|json|proxy|map|typedarray|promise]
Deaktivieren Sie die ausgewählte Sprachfunktion, um kleinere ausführbare Dateien zu generieren.
qjscalc -Anwendung Die qjscalc -Anwendung ist ein Supersatz des qjsbn -Befehlszeilen -Interpreters, der einen JavaScript -Rechner mit willkürlichen großen Zahlen und schwimmenden Punktzahlen, Fraktionen, komplexen Zahlen, Polynomen und Matrizen implementiert. Der Quellcode befindet sich in qjscalc.js. Weitere Dokumentation und Webversionen finden Sie unter http://numcalc.com.
Führen Sie make test , um einige integrierte Tests durchzuführen, die im QuickJS-Archiv enthalten sind.
Das QuickJS -Archiv enthält das Test262 -Läuferprogramm.
Als Referenz ist der vollständige Test262-Test im Archiv QJS-Tests-yyyy-mm-dd.tar.xz vorgesehen. Sie müssen es nur in das QuickJS -Quellverzeichnis entpacken.
Alternativ kann der Test262 -Test installiert werden:
git clone https://github.com/tc39/test262.git test262
cd test262
git checkout 94b1e80ab3440413df916cd56d29c5a2fa2ac451
patch -p1 < ../tests/test262.patch
cd ..
Das Patch fügt implementierungsspezifische harness hinzu und optimiert ineffiziente REGEXP-Zeichenklassen und Unicode-Attribut-Escape-Tests (der Test selbst wird nicht geändert, nur die Langsamer-String-Initialisierungsfunktion ist optimiert).
Der Test kann laufen
make test2
Weitere Informationen finden Sie ./run-test262 Rennen. Die Konfigurationsdatei test262.conf und test262bn.conf enthalten Optionen zum Ausführen verschiedener Tests.
ES2019-Spezifikation 2, einschließlich Anhang B (Legacy Web-Kompatibilität) und Unicode-bezogenen Funktionen, wird bereits im Grunde genommen unterstützt. Die folgenden Funktionen werden noch nicht unterstützt:
JSON -Parsers werden derzeit von einem breiteren Bereich als der Spezifikation unterstützt.
ECMA402 (International API) wird noch nicht unterstützt.
"use strip" werden Debug -Informationen (einschließlich Funktionsquellencode) nicht beibehalten, um Speicher zu speichern. Die Anweisung "use strict" kann globale Skripte oder bestimmte Funktionen anwenden.#! Mathematikverlängerungen sind in der qjsbn -Version verfügbar und sind mit Standard jsbignum.pdf vollständig kompatibel.
BigInt (große Ganzzahl) TC39 wird bereits unterstützt.BigFloat unterstützt: Jede große schwimmende Punktzahl in Cardinality 2."use bigint" ermöglicht den Bigint -Modus, und BigInt ist standardmäßig eine Ganzzahl."use math" ermöglicht den mathematischen Modus, in dem die Abteilung und die Leistungsoperatoren auf Ganzzahlen Fraktionen erzeugen. Standardmäßig sind schwimmende Punktliterale der Standardwert und Ganzzahlen der Standardwert von Bigint.ES6 -Modul unterstützt vollständig. Die Standardregeln der Standardnamenauflösung lauten wie folgt:
. .. der Pfad relativ zum aktuellen Modul.. Oder .. ist ein Systemmodul wie std oder os ..so und ist ein nationales Modul mit der QuickJS C API. Standardmäßig ist die Standardbibliothek im Befehlszeilen -Interpreter enthalten. Es enthält zwei Module std und os und einige globale Objekte.
scriptArgs
Geben Sie die Befehlszeilenparameter an. Der erste Parameter ist der Skriptname.
print(...args)
Druckt Parameter, die durch Leerzeichen und nachfolgende Newlines getrennt sind.
console.log(...args)
Gleich wie print ().
std -Modul Das std -Modul bietet Wrapper für libc stdlib.h und stdio.h und einige andere Dienstprogramme.
Exportieren:
exit(n)
Verlassen Sie den Prozess.
evalScript(str)
Führen Sie die String str Skripted (Global Eval) aus.
loadScript(filename)
Führen Sie das filename -Skript (Global Eval) aus.
Error(errno)
std.Error . Die Fehlerinstanz enthält die Felder errno (Fehlercode) und message (Ergebnis von std.Error.strerror(errno) ).
Der Konstruktor enthält die folgenden Felder:
EINVAL
EIO
EACCES
EEXIST
ENOSPC
ENOSYS
EBUSY
ENOENT
EPERM
EPIPE
Häufig falsche ganzzahlige Werte (zusätzliche Fehlercodes können definiert werden).
strerror(errno)
Gibt den String errno zurück, der den Fehler beschreibt.
open(filename, flags)
Öffnen Sie eine Datei (LIBCs Wrapper fopen() ). Werfen Sie std.Error in einen E/A -Fehler
tmpfile()
Öffnen Sie eine temporäre Datei. Werfen Sie std.Error in E/A -Fehler.
puts(str)
Es entspricht std.out.puts(str) .
printf(fmt, ...args)
Äquivalent zu std.out.printf(fmt, ...args)
sprintf(fmt, ...args)
Entspricht dem Sprintf () von LIBC.
in
out
err
Wrap stdin , stdout , stderr der LIBC -Datei.
SEEK_SET
SEEK_CUR
SEEK_END
Konstanten von Seek ()
global
Verweise auf globale Objekte.
gc()
Nennen Sie den Loop -Löschungsalgorithmus manuell. Der Loop -Entfernungsalgorithmus startet bei Bedarf automatisch, sodass diese Funktion sehr nützlich ist, wenn bestimmte Speichergrenzen oder Tests.
getenv(name)
Gibt den name der Umgebungsvariablen zurück oder undefined , wenn sie nicht definiert sind.
Dateiprototyp:
close()
Schließen Sie die Datei.
puts(str)
Verwenden Sie die UTF-8-Codierung, um Zeichenfolgen auszugeben.
printf(fmt, ...args)
Format printf, das gleiche wie das LIBC -Printf -Format.
flush()
Aktualisieren Sie die gepufferte Datei.
seek(offset, whence)
Auf der Suche nach einem bestimmten Dateispeicherort (von wo std.SEEK_* ). Werfen Sie std.Error in E/A -Fehler.
tell()
Kehren Sie zum aktuellen Dateispeicherort zurück.
eof()
Geben Sie True zurück, wenn die Datei endet.
fileno()
Gibt den zugehörigen Betriebssystemgriff zurück.
read(buffer, position, length)
Lesen Sie aus der position in Byteposition das length -Byte zum ArrayBuffer buffer (Libc's Wrapper fread ).
write(buffer, position, length)
Schreiben Sie length Bytes in den ArrayBuffer buffer , der mit position der Byte -Position zur Datei (Libc's Wrapper fread ) beginnt.
getline()
Gibt die nächste Zeile in der Datei zurück, vorausgesetzt, es handelt sich um UTF-8-Codierung, ohne nachfolgende Newlines.
getByte()
Gibt das nächste Byte in der Datei zurück.
putByte(c)
Schreiben Sie ein Byte in die Datei.
os os Betriebssystemmodul bietet Betriebssystemspezifische Funktionen:
Wenn OK, gibt die Betriebssystemfunktion normalerweise 0 zurück, oder das Betriebssystem gibt einen bestimmten Fehlercode zurück.
Exportfunktionen verfügbar:
open(filename, flags, mode = 0o666)
Öffnen Sie eine Datei. Wenn Fehler eingeht, geben Sie einen Griff oder <0 zurück.
O_RDONLY
O_WRONLY
O_RDWR
O_APPEND
O_CREAT
O_EXCL
O_TRUNC
POSIX Open Zeichen.
O_TEXT
(Windows-spezifisch). Öffnen Sie die Datei im Textmodus. Standard ist der Binärmodus.
close(fd)
Dateihandle fd schließen.
seek(fd, offset, whence)
Auf der Suche nach Dateien. Verwenden Sie std.SEEK_* oder whence .
read(fd, buffer, offset, length)
Beginnen Sie aus der Dateihandel fd mit dem Byte -Positions offset das length -Byte zum ArrayBuffer buffer . Gibt die Anzahl der gelesenen Bytes zurück, und wenn ein Fehler auftritt, gibt er einen Wert von weniger als 0 zurück.
write(fd, buffer, offset, length)
Schreiben Sie das length -Byte in den ArrayBuffer buffer , beginnend mit dem Byte -Positions offset die Dateihandle fd . Gibt die Anzahl der geschriebenen Bytes zurück, und wenn ein Fehler auftritt, wird ein Wert von weniger als 0 zurückgegeben.
isatty(fd)
fd ist ein TTY (Terminal) Handle, der true zurückgibt.
ttyGetWinSize(fd)
Gibt die TTY -Größe [width, height] oder null zurück, falls nicht verfügbar.
ttySetRaw(fd)
Stellen Sie TTY im Originalmodus ein.
remove(filename)
Löschen Sie die Datei. Rückgabe 0 Wenn normal, geben Sie <0 zurück, wenn Fehler
rename(oldname, newname)
Benennen Sie die Datei um. Rückgabe 0 Wenn normal, geben Sie <0 zurück, wenn Fehler
setReadHandler(fd, func)
Fügen Sie den Lesehandler zur Dateihandle fd . fd ruft jedes Mal func , wenn Daten zur Verarbeitung hinzugefügt werden. Unterstützt einen einzelnen Lesehandler für jeden Dateigriff. Verwenden Sie func = null um den Griff zu löschen.
setWriteHandler(fd, func)
Fügen Sie den Schreibhandler in die Dateihandle fd . fd ruft jedes Mal func , wenn Daten geschrieben werden, die zu verarbeiten sind. Verwenden Sie `func = null, um den Griff zu löschen.
signal(signal, func)
Rufen Sie func auf, wenn signal auftritt. Es wird nur ein Handler pro Signalnummer unterstützt. Verwenden Sie die von null festgelegten Standardverarbeiteten oder undefined Ignore Signale.
SIGINT
SIGABRT
SIGFPE
SIGILL
SIGSEGV
SIGTERM
POSIX -Signalnummer.
setTimeout(func, delay)
Rufen Sie den func nach delay -Millisekunden auf. Gibt den Griff zum Timer zurück.
clearTimer(handle)
Den Timer abbrechen.
platform
Gibt die Zeichenfolge zurück, die die Plattform darstellt: "linux" , "darwin" , "win32" oder "js" .
Die C API ist einfach und effektiv. Die C API ist im quickjs.h -Header definiert.
JSRuntime repräsentiert die JavaScript -Laufzeit, die dem Objekthaufen entspricht. Mehrere Laufzeiten können gleichzeitig existieren, aber sie können keine Objekte austauschen. Innerhalb einer bestimmten Laufzeit wird Multithreading nicht unterstützt.
JSContext repräsentiert einen JavaScript -Kontext (oder eine Domäne). Jeder JSContext verfügt über seine eigenen globalen und Systemobjekte. In jsRuntime kann es mehrere JSContexte geben, und sie können Objekte freigeben, ähnlich wie Frameworks mit denselben Quellenfreigabe -JavaScript -Objekten in einem Webbrowser.
JSValue stellt einen JavaScript -Wert dar, der ein primitiver Typ oder ein Objekt sein kann. Verwenden Sie Referenzzahlen, daher ist es wichtig, explizit zu kopieren ( JS_DupValue() , die Referenzzahl) oder die Veröffentlichung ( JS_FreeValue() , verringern die Referenzzahl) JSValues.
Verwenden Sie JS_NewCFunction() , um C -Funktionen zu erstellen. JS_SetPropertyFunctionList() ist eine einfache Möglichkeit, einem bestimmten Objekt einfach Funktionen, Setzer und Getter -Eigenschaften hinzuzufügen.
Im Gegensatz zu anderen eingebetteten JavaScript -Motoren hat QuickJS keinen impliziten Stapel, sodass die C -Funktion ihre Parameter als normale C -Parameter übergibt. Die allgemeine Regel ist, dass C -Funktionen JSValue als Argumente (so dass sie nicht befreit werden müssen) und ein neu zugewiesenes (aktives) JSValue zurückgeben.
Ausnahme: Die meisten C -Funktionen können eine JavaScript -Ausnahme zurückgeben. Es muss explizit getestet und über C -Code verarbeitet werden. Ein spezifischer JSValue , dh JS_EXCEPTION , zeigt an, dass eine Ausnahme aufgetreten ist. Das tatsächliche Ausnahmeobjekt wird in JSContext gespeichert und kann mit JS_GetException() abgerufen werden.
Verwenden Sie JS_Eval() , um das Skript- oder Modulquellcode zu bewerten.
Wenn das Skript oder Modul mit qjsc in Bytecode kompiliert wurde, kann mit JS_EvalBinary() dasselbe Ergebnis erzielt werden. Der Vorteil besteht darin, dass es keine Zusammenstellung erfordert, sodass es schneller und kleiner ist, da der Compiler, wenn eval nicht erforderlich ist, aus der ausführbaren Datei entfernt werden kann.
Hinweis: Das Bytecode -Format ist einer bestimmten QuickJS -Version zugeordnet. Zusätzlich wurden vor der Ausführung keine Sicherheitskontrollen durchgeführt. Daher sollte Bytecode nicht aus nicht vertrauenswürdigen Quellen geladen werden. Aus diesem Grund gibt es in qjsc keine Option, Bytecode für Binärdateien auszugeben.
Die undurchsichtigen Daten von C können an JavaScript -Objekte angehängt werden. Die Art der C -undurchsichtigen Daten wird durch die Klassen -ID ( JSClassID ) des Objekts bestimmt. Der erste Schritt besteht daher darin, eine neue Klassen -ID und eine JS -Klasse zu registrieren ( JS_NewClassID() , JS_NewClass() ). Sie können dann ein Objekt dieser Klasse mit JS_NewObjectClass() erstellen und mit JS_GetOpaque() / JS_SetOpaque() einen undurchsichtigen Zeiger auf C. erhalten oder festlegen.
Wenn Sie eine neue JS -Klasse definieren, können Sie einen Destruktor erklären, der aufgerufen wird, wenn das Objekt zerstört wird. Es kann eine gc_mark -Methode bereitgestellt werden, damit der Loop -Entfernungsalgorithmus andere vom Objekt verwiesene Objekte finden kann. Es gibt andere Methoden, mit denen das heterogene Objektverhalten definiert werden kann.
Die Klassen -ID wird global zugewiesen (d. H. Für alle Laufzeiten anwendbar). JSCLASS wird in jedem JSRuntime zugewiesen. JS_SetClassProto() wird verwendet, um Prototypen für eine bestimmte Klasse in einem bestimmten JSContext zu definieren. JS_NewObjectClass() legt diesen Prototyp im erstellten Objekt fest.
Beispiele finden Sie in js_libc.c.
Native ES6 -Module, die dynamische oder statische Verbindungen unterstützen. Schauen Sie sich die Beispiele test_bjson und bjson.so an. Die Standardbibliothek js_libc.c ist auch ein gutes Beispiel für native Module.
Legen Sie die globalen Speicherzuweisungsgrenzen für ein bestimmtes jsRuntime mit JS_SetMemoryLimit() fest.
JS_NewRuntime2() kann benutzerdefinierte Speicherzuweisungsfunktionen bereitstellen.
JS_SetMaxStackSize() kann unter Verwendung der Maximum -Systemstapelgröße eingestellt werden
Verwenden Sie JS_SetInterruptHandler() , um eine Rückruffunktion einzurichten, die regelmäßig aufgerufen wird, wenn die Engine den Code ausführt. Diese Rückruffunktion kann verwendet werden, um Ausführungszeitlimiten zu implementieren.
Der Befehlszeilen-Interpreter verwendet ihn, um den Ctrl-C Handler zu implementieren.
Der Compiler erzeugt Bytecode direkt ohne Zwischendarstellungen (z. B. analysieren Bäume), sodass er sehr schnell ist. Auf dem erzeugten Bytecode werden mehrere Optimierungsschritte durchgeführt.
Stack-basiertes Bytecode wird ausgewählt, da es einfach ist und der generierte Code kompakt ist.
Für jede Funktion wird die maximale Stapelgröße zum Kompilierungszeitpunkt berechnet, sodass keine Laufzeit -Stack -Überlauftests erforderlich sind.
Für die Debugging -Informationen wird eine separate Tabelle für komprimierte Zeilennummer gewartet.
Der Zugang zu Verschlussvariablen ist optimiert und ist fast so schnell wie lokale Variablen.
Die direkte eval im strengen Modus ist optimiert.
qjsc Compiler Der qjsc -Compiler generiert C -Quellcode aus JavaScript -Dateien. Standardmäßig wird C -Quellcode mit dem System Compiler ( gcc oder clang ) kompiliert.
Der generierte C -Quellcode enthält den Bytecode der kompilierten Funktion oder des kompilierten Moduls. Wenn eine vollständige ausführbare Datei erforderlich ist, enthält sie auch eine main() -Funktion, die den erforderlichen C -Code enthält, um die JavaScript -Engine zu initialisieren und kompilierte Funktionen und Module auszuführen und auszuführen.
JavaScript -Code kann mit C -Modulen gemischt werden.
Zum Generieren kleinerer ausführbarer Artikel können bestimmte JavaScript -Funktionen, insbesondere eval oder reguläre Ausdrücke, deaktiviert werden. Die Codeentfernung ist mit der System-Compiler-abhängigen Link-Time-Optimierung verknüpft.
qjsc funktioniert, indem sie Skripte oder Module kompiliert und dann in ein binäres Format serialisieren. Eine Untergruppe dieses Formats (ohne Funktionen oder Module) kann als binäres JSON verwendet werden. Beispiel test_bjson.js zeigt, wie es verwendet wird.
WARNUNG: Binäres JSON -Format kann sich ohne vorherige Ankündigung ändern und sollte nicht zur Speicherung anhaltender Daten verwendet werden. test_bjson.js wird nur verwendet, um Funktionen im Binärobjektformat zu testen.
Saiten werden als 8-Bit- oder 16-Bit-Charakter-Arrays gespeichert. Daher ist der zufällige Zugriff auf Zeichen immer schnell.
Die C-API bietet Funktionen zum Umwandeln von JavaScript-Zeichenfolgen in c UTF-8-codierte Zeichenfolgen. Der häufigste Fall ist, dass JavaScript -Zeichenfolgen nur ASCII -Saiten enthalten und nicht das Kopieren beinhalten.
Objektformen (Objektprototyp, Attributname und Flag) werden unter Objekten freigegeben, um Speicher zu speichern.
Optimierte Arrays ohne Löcher (außer am Ende des Arrays).
Der TypeDarray -Zugang ist optimiert.
Der Name der Objekteigenschaft und einige Zeichenfolgen werden als Atome (eindeutige Zeichenfolgen) gespeichert, um Speicher zu sparen und schnelle Vergleiche zu ermöglichen. Atome werden als 32-Bit-Ganzzahlen dargestellt. Die Hälfte des Atombereichs ist für den sofortigen Ganzzahl von 0 bis 2^{31} -1 reserviert.
Zahlen können als 32-Bit-Zahlen oder 64-Bit-IEEE-754-Gleitpunktwerte dargestellt werden. Die meisten Operationen haben schnelle Wege für 32-Bit-Ganzzahlfälle.
Die Referenzzahl wird verwendet, um Objekte automatisch und genau zu veröffentlichen. Wenn der zugewiesene Speicher zu groß wird, wird ein separater Schleifenentfernungsvorgang durchgeführt. Der Loop -Entfernungsalgorithmus verwendet nur Referenzzählungen und Objektinhalte, sodass die Müllsammlungserfassung in C -Code explizit manipuliert werden muss.
JSValue ist ein JavaScript -Wert, der ein primitiver Typ (z. B. Zahl, Zeichenfolge usw.) oder ein Objekt sein kann. In der 32-Bit-Version wird Nan Boxing verwendet, um 64-Bit-schwimmende Punktnummern zu speichern. Die Darstellung wird optimiert, um die 32-Bit-Ganzzahl- und Referenzzählwerte effizient zu testen.
In 64-Bit-Code beträgt die Größe von JSValue 128 Bit und wird nicht unter Verwendung von NAN unterbacken. Der Grund dafür ist, dass in 64-Bit-Code die Speicherverwendung nicht so kritisch ist.
In beiden Fällen (32-Bit oder 64-Bit) passt JSValue genau zwei CPU-Register, sodass es durch C-Funktionen effizient zurückgegeben werden kann.
Die Motor wurde optimiert, sodass die Funktionsaufrufe schnell sind. Der Systemstapel enthält JavaScript -Parameter und lokale Variablen.
Es wurde eine spezifische reguläre Expressionsmotor entwickelt. Es ist klein und effizient und unterstützt alle ES2019 -Funktionen, einschließlich Unicode -Eigenschaften. Als JavaScript -Compiler generiert es direkt Bytecode ohne Parse -Baum.
Verwenden Sie explizites Stapel -Backtracking, damit der Systemstapel keine Rekursion aufweist. Einfache Quantizer sind speziell optimiert, um eine Rekursion zu vermeiden.
Die unendliche Rekursion eines Quantisierers mit leeren Begriffen wird vermieden.
Das Gewicht der vollständigen regulären Expressionsbibliothek beträgt ungefähr 15 KIB (X86 -Code) ohne die Unicode -Bibliothek.
Eine bestimmte Unicode -Bibliothek wird entwickelt, daher hängt sie nicht von externen großen Unicode -Bibliotheken wie Intensivstationen ab. Komprimieren Sie alle Unicode -Tabellen und halten Sie angemessene Zugriffsgeschwindigkeiten bei.
Die Bibliothek unterstützt Fallkonvertierung, Unicode -Normalisierung, Unicode -Skriptabfragen, Unicode -Abfragen der allgemeinen Kategorie und allen Binäreigenschaften von Unicode.
Die vollständige Unicode -Bibliothek wiegt ungefähr 45 KIB (X86 -Code).
Bigint und Bigfloat werden mit der Bibliothek libbf libbf implementiert. Es verfügt über etwa 60 KIB (X86 -Code) und bietet IEEE 754 -Schwimmpunktoperationen mit willkürlichen Präzision und transzendenten Funktionen mit präziser Rundung.
QuickJS wird unter dem MIT -Protokoll freigegeben.
Sofern nicht anders angegeben, gehört das Urheberrecht von QuickJs Quelle von Fabrice Bellard und Charlie Gordon.
https://github.com/tc39/test262
https://tc39.github.io/ecma262/
Wir glauben, dass die aktuelle Schwanzaufrufspezifikation zu komplex ist und die tatsächlichen Vorteile begrenzt hat.
https://bellard.org/libbf
Quickjs-Quickjs Library unter iOS
Quickjs - Android Quickjs Library unter Android
Quickjs-Rs Rust's QuickJS Library
QuickJSPP C ++ Quickjs Library
Go-Quickjs Go's QuickJs Library
txiki.js Die winzige JavaScript -Laufzeit, die mit QuickJs, Libuv und ❤️ gebaut wurde
Quickjs-Pascal QuickJS Freepascal / Delphi Bindungen