qjs مترجمqjscqjscalcstd STDos OSqjscQuickJS هو محرك JavaScript صغير ومتضمن يدعم مواصفات ES2020 بما في ذلك الوحدات النمطية والمولدات غير المتزامنة والوكالة.
إنه يدعم اختياريًا الامتدادات الرياضية مثل الأعداد الصحيحة الكبيرة (BigInt) ، وأرقام نقاط عائمة كبيرة (BigFloat) ، والتحميل الزائد للمشغل.
الموقع الرسمي: https://bellard.org/quickjs/
الموقع الصيني: https://github.com/quickjs-zh/
QuickJS QQ Group 1: 598609506 .
Wiki الصينية: https://github.com/quickjs-zh/quickjs/wiki
انقر لعرض المحتوى المحدد للاختبار القياسي QuickJS
يوفر Makefiles التي يمكن تجميعها على Linux أو MacOS/X. يمكن الحصول على دعم Windows الأولي عن طريق التوضيح على مضيفات Linux باستخدام أداة MINGW.
إذا كنت ترغب في تحديد خيار محدد ، فقم بتحرير الجزء العلوي من Makefile وجعل make .
قم بتنفيذ make install باستخدام الجذر لتثبيت الملفات الثنائية المترجمة إلى /usr/local (هذا غير مطلوب لاستخدام QuickJs).
ملاحظة : يمكنك الرجوع إلى الوثائق الصينية QuickJS حول التجميع والتثبيت ضمن Windows والتجميع والتثبيت تحت Linux.
qjs هو محلل سطر الأوامر (حلقة المطبوعة القراءة).
./qjs examples/hello.js
qjsc هو برنامج التحويل البرمجي لسطر الأوامر:
./qjsc -o hello examples/hello.js
./hello
إنشاء ملف hello القابل للتنفيذ بدون تبعيات خارجية.
qjsbn و qjscbn هما المترجمين الفوريين والمترجمين المقابلين مع امتدادات رياضية:
./qjsbn examples/pi.js 1000
عرض 1000 رقم من PI
./qjsbnc -o pi examples/pi.js
./pi 1000
تجميع وتنفيذ برنامج PI.
qjs مترجمالاستخدام: QJS [خيارات] [ملفات]
خيارات:
-h
--help
قائمة الخيارات.
-e `EXPR`
--eval `EXPR`
أداء expr.
-i
--interactive
انتقل إلى الوضع التفاعلي (ليس الوضع الافتراضي عند تقديم الملف على سطر الأوامر).
-m
--module
تحميل كوحدة ES6 (الافتراضي هو امتداد ملف .mjs).
تشمل الخيارات المتقدمة:
-d
--dump
نقل إحصائيات استخدام الذاكرة.
-q
--quit
مجرد إنشاء المترجم المترجم والخروج.
qjscالاستخدام: QJSC [خيارات] [ملفات]
خيارات:
-c
فقط الرمز BYTECODE في ملف C هو الإخراج ، والافتراضي هو إخراج الملف القابل للتنفيذ.
-e
main() الإخراج و bytecode في ملف C ، الافتراضي هو الملف القابل للتنفيذ الإخراج.
-o output
اضبط اسم ملف الإخراج (Default = Out.c أو A.Out).
-N cname
يعين اسم C للبيانات التي تم إنشاؤها.
-m
ترجمة كوحدة JavaScript (الافتراضي هو امتداد .mjs).
-M module_name[,cname]
أضف رمز التهيئة للوحدات C الخارجية. تحقق من مثال c_module .
-x
إخراج مبادلة البايت (من أجل التعداد المتبادل فقط).
-flto
استخدم تحسين وقت الارتباط. التجميع أبطأ ، لكن التنفيذيين أصغر وأسرع. يتم تعيين هذا الخيار تلقائيًا عند استخدام الخيار -fno-x .
-fno-[eval|string-normalize|regexp|json|proxy|map|typedarray|promise]
قم بتعطيل ميزة اللغة المحددة لإنشاء ملفات قابلة للتنفيذ أصغر.
qjscalc تطبيق qjscalc هو مجموعة مفرطة من مترجم سطر الأوامر qjsbn الذي ينفذ حاسبة JavaScript مع أعداد صحيحة كبيرة تعسفية وأرقام نقاط عائمة ، والكسور ، والأرقام المعقدة ، والحيوانات متعددة الحدود ، والمصفوفات. رمز المصدر في QJSCALC.JS. تتوفر المزيد من الإصدارات والوثيقة على الموقع http://numcalc.com.
قم make test لإجراء بعض الاختبارات المدمجة المدرجة في أرشيف QuickJS.
يحتوي أرشيف QuickJS على برنامج Test262 Runner.
للرجوع إليها ، يتم توفير اختبار Test262 الكامل في الأرشيف qjs-tests-yyyy-mm-dd.tar.xz. تحتاج فقط إلى فك ضغطه في دليل مصدر QuickJS.
بدلاً من ذلك ، يمكن تثبيت اختبار Test262:
git clone https://github.com/tc39/test262.git test262
cd test262
git checkout 94b1e80ab3440413df916cd56d29c5a2fa2ac451
patch -p1 < ../tests/test262.patch
cd ..
يضيف التصحيح وظائف harness خاصة بالتنفيذ ويؤدي إلى تحسين فئات أحرف REGEXP غير الفعالة واختبارات هروب سمة Unicode (لن يتم تعديل الاختبار نفسه ، فقط يتم تحسين وظيفة تهيئة السلسلة البطيئة).
يمكن إجراء الاختبار
make test2
لمزيد من المعلومات ، قم ./run-test262 . يحتوي اختبار ملف التكوين test262.conf و test262bn.conf على خيارات لتشغيل اختبارات مختلفة.
ES2019 المواصفات 2 ، والتي تتضمن الملحق B (توافق الويب القديم) والميزات المتعلقة بالحيوية ، يتم دعمها بالفعل بشكل أساسي. لا يتم دعم الميزات التالية بعد:
يتم دعم محلات JSON حاليًا بنطاق أوسع من المواصفات.
ECMA402 (API الدولي) غير مدعوم بعد.
"use strip" بمعلومات التصحيح (بما في ذلك رمز مصدر الوظيفة) لحفظ الذاكرة. يمكن للتوجيه "use strict" تطبيق البرامج النصية العالمية ، أو وظائف محددة.#! في بداية البرنامج النصي. تتوفر امتدادات الرياضيات في إصدار qjsbn وهي متوافقة تمامًا مع jsbignum.pdf القياسية.
BigInt (عدد صحيح كبير) TC39 مدعوم بالفعل.BigFloat : أي رقم نقطة عائم كبير في Cardinality 2."use bigint" يتيح وضع BigInt ، و BigInt هو عدد صحيح افتراضيًا."use math" الوضع الرياضي حيث ينتج عوامل التقسيم والطاقة على الأعداد الصحيحة كسور. بشكل افتراضي ، تعتبر الحرفية العائمة النقطة هي القيمة الافتراضية والأعداد الصحيحة هي القيمة الافتراضية لـ BigInt.وحدة ES6 تدعم تماما. قواعد دقة الاسم الافتراضية هي كما يلي:
. أو .. هو المسار بالنسبة للوحدة الحالية.std ليس .. os ..so لذا وهي وحدة أصلية باستخدام QuickJS C API. بشكل افتراضي ، يتم تضمين المكتبة القياسية في مترجم سطر الأوامر. أنه يحتوي على وحدتين std و os وبعض الكائنات العالمية.
scriptArgs
توفير معلمات سطر الأوامر. المعلمة الأولى هي اسم البرنامج النصي.
print(...args)
يطبع المعلمات مفصولة بالمسافات والخطوط الجديدة.
console.log(...args)
مثل print ().
std STD توفر وحدة std مغلفة لـ LIBC stdlib.h و stdio.h وبعض المرافق الأخرى.
التصدير المتاح:
exit(n)
الخروج من العملية.
evalScript(str)
قم بتشغيل سلسلة str (Global Eval).
loadScript(filename)
قم بتشغيل برنامج filename Script (Global Eval).
Error(errno)
مُنشئ std.Error . يحتوي مثيل الخطأ على الحقول errno (رمز الخطأ) message (نتيجة std.Error.strerror(errno) ).
يحتوي المنشئ على الحقول التالية:
EINVAL
EIO
EACCES
EEXIST
ENOSPC
ENOSYS
EBUSY
ENOENT
EPERM
EPIPE
قيم عدد صحيح شائع (يمكن تعريف رموز الخطأ الإضافية).
strerror(errno)
إرجاع سلسلة errno التي تصف الخطأ.
open(filename, flags)
افتح ملفًا (ملف LIBC's Wrapper fopen() ). رمي std.Error في خطأ I/O
tmpfile()
افتح ملفًا مؤقتًا. رمي std.Error في خطأ I/O.
puts(str)
وهو ما يعادل std.out.puts(str) .
printf(fmt, ...args)
أي ما يعادل std.out.printf(fmt, ...args)
sprintf(fmt, ...args)
أي ما يعادل libc's Sprintf ().
in
out
err
التفاف stdin ، stdout ، stderr من ملف libc.
SEEK_SET
SEEK_CUR
SEEK_END
ثوابت السعي ()
global
إشارات إلى الأشياء العالمية.
gc()
استدعاء يدويا خوارزمية حذف الحلقة. تبدأ خوارزمية إزالة الحلقة تلقائيًا عند الحاجة ، لذلك تكون هذه الميزة مفيدة للغاية عند حدود الذاكرة المحددة أو الاختبار.
getenv(name)
إرجاع name قيمة متغير البيئة ، أو undefined إذا لم يتم تعريفه.
File Oritype:
close()
أغلق الملف.
puts(str)
استخدم ترميز UTF-8 لسلاسل الإخراج.
printf(fmt, ...args)
تنسيق printf ، نفس تنسيق libc printf.
flush()
تحديث الملف المخزن المؤقت.
seek(offset, whence)
تبحث عن موقع ملف معين (من حيث std.SEEK_* ). رمي std.Error في خطأ I/O.
tell()
العودة إلى موقع الملف الحالي.
eof()
إرجاع صحيح إذا انتهى الملف.
fileno()
إرجاع مقبض OS المرتبط.
read(buffer, position, length)
من position الملف في موضع البايت ، اقرأ بايت length إلى ArrayBuffer buffer (Wibc's Wrapper fread ).
write(buffer, position, length)
اكتب بايت length في buffer ArrayBuffer بدءًا من position البايت في الملف (WiBC's Wrapper fread ).
getline()
إرجاع السطر التالي في الملف ، على افتراض أنه ترميز UTF-8 ، باستثناء الخطوط الجديدة المتأخرة.
getByte()
إرجاع البايت التالي في الملف.
putByte(c)
اكتب بايت إلى الملف.
os OS توفر وحدة os وظائف محددة لنظام التشغيل:
إذا كانت موافق ، عادةً ما تُرجع وظيفة نظام التشغيل 0 ، أو تقوم نظام التشغيل بإرجاع رمز خطأ محدد.
وظائف التصدير المتاحة:
open(filename, flags, mode = 0o666)
افتح ملف. إذا خطأ ، ارجع مقبضًا أو <0.
O_RDONLY
O_WRONLY
O_RDWR
O_APPEND
O_CREAT
O_EXCL
O_TRUNC
Posix Open Sign.
O_TEXT
(Windows محددة). افتح الملف في وضع النص. الافتراضي هو الوضع الثنائي.
close(fd)
أغلق مقبض الملف fd .
seek(fd, offset, whence)
تبحث عن الملفات. استخدم std.SEEK_* أو whence .
read(fd, buffer, offset, length)
بدءًا من مقبض الملف fd مع offset موضع البايت ، اقرأ بايت length إلى buffer ArrayBuffer. إرجاع عدد القراءة بايت ، وإذا حدث خطأ ، فإنه يعيد قيمة أقل من 0.
write(fd, buffer, offset, length)
اكتب بايت length في buffer ArrayBuffer بدءًا من offset مقبض الملف fd . إرجاع عدد البايتات المكتوبة ، وإذا حدث خطأ ، يتم إرجاع قيمة أقل من 0.
isatty(fd)
fd هو مقبض tty (محطة) يعيد true .
ttyGetWinSize(fd)
إرجاع الحجم tty [width, height] أو null إذا لم يكن متاحًا.
ttySetRaw(fd)
تعيين tty في الوضع الأصلي.
remove(filename)
حذف الملف. إرجاع 0 إذا كان عاديًا ، فأرجع <0 إذا خطأ
rename(oldname, newname)
إعادة تسمية الملف. إرجاع 0 إذا كان عاديًا ، فأرجع <0 إذا خطأ
setReadHandler(fd, func)
أضف معالج القراءة إلى مقبض الملف fd . fd يدعو func في كل مرة يكون هناك بيانات يمكن إضافتها إلى المعالجة. يدعم معالج قراءة واحد لكل مقبض ملف. استخدم func = null لحذف المقبض.
setWriteHandler(fd, func)
أضف معالج الكتابة إلى مقبض الملف fd . fd يدعو func في كل مرة يتم فيها كتابة بيانات للمعالجة. استخدم `func = null لحذف المقبض.
signal(signal, func)
استدعاء func عند حدوث signal . يتم دعم معالج واحد فقط لكل رقم إشارة. استخدم إشارات التجاهل الافتراضية التي تمت معالجتها أو undefined التي تم تحديدها بواسطة null .
SIGINT
SIGABRT
SIGFPE
SIGILL
SIGSEGV
SIGTERM
رقم إشارة POSIX.
setTimeout(func, delay)
استدعاء وظيفة func بعد delay مللي ثانية. إرجاع المقبض إلى المؤقت.
clearTimer(handle)
إلغاء المؤقت.
platform
إرجاع السلسلة التي تمثل النظام الأساسي: "linux" أو "darwin" أو "win32" أو "js" .
A API C بسيطة وفعالة. يتم تعريف C API في رأس quickjs.h .
يمثل JSRuntime وقت تشغيل JavaScript المقابل لكومة الكائن. يمكن أن توجد أوقات تشغيل متعددة في نفس الوقت ، لكنها لا تستطيع تبديل الكائنات. ضمن وقت تشغيل معين ، لا يتم دعم MultiThreading.
يمثل JSContext سياق JavaScript (أو المجال). كل JSContext له كائنات عالمية ونظام. يمكن أن يكون هناك عدة JSContexts في JSRuntime ، ويمكنهم مشاركة الكائنات ، على غرار الأطر مع نفس المصدر لمشاركة كائنات JavaScript في متصفح الويب.
يمثل JSValue قيمة JavaScript ، والتي يمكن أن تكون نوعًا بدائيًا أو كائنًا. استخدم تعداد المرجع ، لذلك من المهم نسخها صراحة ( JS_DupValue() ، زيادة عدد المرجع) أو الإصدار ( JS_FreeValue() ، انخفاض عدد المرجع) JSValues.
استخدم JS_NewCFunction() لإنشاء وظائف c. JS_SetPropertyFunctionList() هي وسيلة سهلة لإضافة خصائص الوظيفة ، و setter ، وخصائص getter إلى كائن معين.
على عكس محركات JavaScript المدمجة الأخرى ، لا تحتوي QuickJs على مكدس ضمني ، وبالتالي فإن وظيفة C تمرر معلماتها كمعلمات C العادية. القاعدة العامة هي أن وظائف C تأخذ JSValue كوسيطات (لذلك لا تحتاج إلى تحريرها) وإعادة JSValue المخصصة حديثًا (نشطة).
الاستثناء: يمكن لمعظم وظائف C إرجاع استثناء JavaScript. يجب أن يتم اختباره بشكل صريح ومعالجته من خلال رمز C. يشير JSValue المحدد ، أي JS_EXCEPTION ، إلى حدوث استثناء. يتم تخزين كائن الاستثناء الفعلي في JSContext ويمكن استرداده باستخدام JS_GetException() .
استخدم JS_Eval() لتقييم رمز مصدر البرنامج النصي أو الوحدة النمطية.
إذا تم تجميع البرنامج النصي أو الوحدة النمطية في Bytecode باستخدام qjsc ، فإن استخدام JS_EvalBinary() يمكن أن يحقق نفس النتيجة. الميزة هي أنه لا يتطلب تجميع ، لذلك يكون أسرع وأصغر حجمه ، لأنه إذا لم يكن eval مطلوبًا ، فيمكن إزالة المترجم من القابل للتنفيذ.
ملاحظة: يرتبط تنسيق Bytecode بإصدار QuickJS محدد. بالإضافة إلى ذلك ، لم يتم إجراء فحوصات أمنية قبل التنفيذ. لذلك ، لا ينبغي تحميل رمز bytecode من مصادر غير موثوق بها. هذا هو السبب في عدم وجود خيار في qjsc لإخراج Bytecode إلى الملفات الثنائية.
يمكن إرفاق بيانات C غير المعتمة بكائنات JavaScript. يتم تحديد نوع البيانات المعتمة C بواسطة معرف فئة الكائن ( JSClassID ). لذلك ، فإن الخطوة الأولى هي تسجيل معرف فئة جديد وفئة JS ( JS_NewClassID() ، JS_NewClass() ). يمكنك بعد ذلك إنشاء كائن من تلك الفئة باستخدام JS_NewObjectClass() واستخدام JS_GetOpaque() / JS_SetOpaque() للحصول على مؤشر أو تعيينه على C.
عند تحديد فئة JS جديدة ، يمكنك إعلان المدمرة التي يتم استدعاؤها عند تدمير الكائن. يمكن توفير طريقة gc_mark بحيث يمكن لخوارزمية إزالة الحلقة العثور على كائنات أخرى مشار إليها من قبل الكائن. هناك طرق أخرى يمكن استخدامها لتحديد سلوك الكائن غير المتجانس.
يتم تخصيص معرف الفئة على مستوى العالم (أي ينطبق على جميع أوقات التشغيل). يتم تخصيص JSClass في كل JSRuntime . يتم استخدام JS_SetClassProto() لتحديد النماذج الأولية لفئة معينة في JSContext معين. JS_NewObjectClass() يعين هذا النموذج الأولي في الكائن الذي تم إنشاؤه.
يتم توفير أمثلة في JS_LIBC.C.
وحدات ES6 الأصلية التي تدعم الروابط الديناميكية أو الثابتة. تحقق من أمثلة test_bjson و bjson.so. المكتبة القياسية JS_LIBC.C هي أيضًا مثال جيد على الوحدات النمطية الأصلية.
اضبط حدود تخصيص الذاكرة العالمية لـ JSRuntime معين باستخدام JS_SetMemoryLimit() .
يمكن أن توفر JS_NewRuntime2() وظائف تخصيص الذاكرة المخصصة.
يمكن تعيين JS_SetMaxStackSize() باستخدام حجم مكدس النظام الأقصى
استخدم JS_SetInterruptHandler() لإعداد وظيفة رد الاتصال تسمى بانتظام عندما ينفذ المحرك الرمز. يمكن استخدام وظيفة رد الاتصال هذه لتنفيذ مهلة التنفيذ.
يستخدمه مترجم سطر الأوامر لتنفيذ معالج Ctrl-C .
يقوم المترجم بإنشاء رمز Bytecode مباشرة ، دون تمثيلات وسيطة (مثل أشجار التحليل) ، لذلك فهو سريع للغاية. يتم تنفيذ العديد من خطوات التحسين على رمز bytecode الذي تم إنشاؤه.
يتم تحديد رمز bytecode المستند إلى المكدس لأنه بسيط والرمز الذي تم إنشاؤه مضغوط.
لكل وظيفة ، يتم حساب الحد الأقصى لحجم المكدس في وقت الترجمة ، لذلك ليست هناك حاجة لاختبارات فيضان وقت التشغيل.
يتم الحفاظ على جدول رقم صف مضغوط منفصل لمعلومات تصحيح الأخطاء.
يتم تحسين الوصول إلى متغيرات الإغلاق وهو أسرع من المتغيرات المحلية.
تم تحسين eval المباشر في الوضع الصارم.
qjsc يقوم برنامج التحويل qjsc بإنشاء رمز المصدر C من ملفات JavaScript. بشكل افتراضي ، يتم تجميع التعليمات البرمجية المصدر C باستخدام برنامج التحويل البرمجي ( gcc أو clang ).
يحتوي رمز المصدر C الذي تم إنشاؤه على رمز bytecode للدالة أو الوحدة النمطية المترجمة. إذا كانت هناك حاجة إلى عملية تنفيذ كاملة ، فإنها تحتوي أيضًا على وظيفة main() تحتوي على رمز C اللازم لتهيئة محرك JavaScript وتحميل وتنفيذ وظائف ووحدات التجميع.
يمكن خلط رمز JavaScript مع وحدات C.
لإنشاء شركة تنفيذية أصغر ، يمكن تعطيل ميزات JavaScript المحددة ، وخاصة eval أو التعبيرات العادية. ترتبط إزالة الكود بتحسين وقت الارتباط المعتمد على برنامج التحويل البرمجي.
يعمل qjsc عن طريق تجميع البرامج النصية أو الوحدات النمطية ثم تخصيصها في تنسيق ثنائي. يمكن استخدام مجموعة فرعية من هذا التنسيق (باستثناء الوظائف أو الوحدات النمطية) كـ JSON الثنائية. عينة test_bjson.js توضح كيفية استخدامه.
تحذير: قد يتغير تنسيق JSON الثنائي دون إشعار ويجب عدم استخدامه لتخزين البيانات المستمرة. يتم استخدام مثال test_bjson.js فقط لاختبار الوظائف بتنسيق الكائن الثنائي.
يتم تخزين الأوتار كصفائف أحرف 8 بت أو 16 بت. لذلك ، فإن الوصول العشوائي إلى الأحرف سريع دائمًا.
يوفر CAPI C وظائف لتحويل سلاسل JavaScript إلى سلاسل مشفرة C Utf-8. الحالة الأكثر شيوعًا هي أن سلاسل JavaScript تحتوي على سلاسل ASCII فقط ولا تتضمن النسخ.
تتم مشاركة أشكال الكائن (النموذج الأولي للكائن واسم السمة والعلم) بين الكائنات لحفظ الذاكرة.
المصفوفات المحسنة بدون ثقوب (باستثناء نهاية الصفيف).
تم تحسين الوصول إلى الطباعة.
يتم تخزين اسم خاصية الكائن وبعض الأوتار كذرات (سلاسل فريدة) لحفظ الذاكرة والسماح بإجراء مقارنات سريعة. يتم تمثيل الذرات على أنها أعداد صحيحة 32 بت. يتم حجز نصف النطاق الذري لقيمة الاسمية الفورية الفورية من 0 إلى 2^{31} -1.
يمكن تمثيل الأرقام على أنها أعداد صحيحة موقعة 32 بت أو 64 بت من قيم النقطة العائمة IEEE-754. معظم العمليات لديها مسارات سريعة لحالات عدد صحيح 32 بت.
يتم استخدام عدد المرجع لإطلاق كائنات تلقائي ودقة. عندما تصبح الذاكرة المخصصة كبيرة جدًا ، يتم تنفيذ عملية إزالة حلقة منفصلة. تستخدم خوارزمية إزالة الحلقة التهم المرجعية ومحتوى الكائن فقط ، لذلك ليست هناك حاجة لمعالجة جذر مجموعة القمامة بشكل صريح في رمز C.
JSValue هي قيمة javaScript التي يمكن أن تكون نوعًا بدائيًا (مثل الرقم أو السلسلة ، وما إلى ذلك) أو كائن. في الإصدار 32 بت ، يتم استخدام الملاكمة NAN لتخزين أرقام نقاط عائمة 64 بت. تم تحسين التمثيل لاختبار عدد صحيح 32 بت بكفاءة وقيم عدد المرجع.
في رمز 64 بت ، يبلغ حجم JSValue 128 بت ولا يتم محاصره باستخدام NAN. والسبب هو أنه في رمز 64 بت ، فإن استخدام الذاكرة ليس بهذا الحرج.
في كلتا الحالتين (32 بت أو 64 بت) ، يناسب JSValue سجلين لوحدة المعالجة المركزية بالضبط ، بحيث يمكن إرجاعه بكفاءة بواسطة وظائف C.
تم تحسين المحرك ، وبالتالي فإن مكالمات الوظائف سريعة. يحتوي مكدس النظام على معلمات JavaScript والمتغيرات المحلية.
تم تطوير محرك تعبير منتظم محدد. إنه صغير وفعال ويدعم جميع ميزات ES2019 ، بما في ذلك خصائص Unicode. كمترجم JavaScript ، فإنه يولد مباشرة رمز bytecon بدون شجرة تحليل.
استخدم التراجع الصريح المكدس بحيث لا يوجد أي عودة على مكدس النظام. يتم تحسين الكميات البسيطة خصيصا لتجنب العودية.
يتم تجنب عودة لا حصر لها من كمية مع مصطلحات فارغة.
يبلغ وزن مكتبة التعبير العادية الكاملة حوالي 15 KIB (رمز x86) ، باستثناء مكتبة Unicode.
تم تطوير مكتبة Unicode محددة ، لذلك لا تعتمد على مكتبات Unicode كبيرة خارجية مثل ICUS. ضغط جميع جداول Unicode مع الحفاظ على سرعات وصول معقولة.
تدعم المكتبة تحويل الحالة ، وتطبيع Unicode ، واستعلامات البرنامج النصي Unicode ، واستعلامات الفئة العامة Unicode ، وجميع الخصائص الثنائية Unicode.
تزن مكتبة Unicode الكاملة حوالي 45 KIB (رمز x86).
يتم تنفيذ Bigint و Bigfloat باستخدام مكتبة libbf libbf . يحتوي على حوالي 60 KIB (رمز X86) ويوفر عمليات النقطة العائمة IEEE 754 بدقة تعسفية ووظائف متعالية مع تقريب دقيق.
يتم إصدار QuickJS تحت بروتوكول MIT.
ما لم ينص على خلاف ذلك ، فإن حقوق الطبع والنشر لمصدر QuickJS تنتمي إلى Fabrice Bellard و Charlie Gordon.
https://github.com/tc39/test262
https://tc39.github.io/ecma262/
نعتقد أن مواصفات استدعاء الذيل الحالية معقدة للغاية ولديها فوائد فعلية محدودة.
https://bellard.org/libbf
مكتبة QuickJS-Quickjs تحت iOS
QuickJS - مكتبة Android QuickJS تحت Android
QuickJS-RS Rust's QuickJS Library
QuickJSPP C ++ مكتبة QuickJS
مكتبة QuickJS Go-Quickjs Go's
txiki.js time time javaScript Runtime تم تصميمه مع QuickJs و libuv و ❤
QuickJS-pascal QuickJS Freepascal / Delphi Bindings