التوثيق
مقارنة الأساليب
NSH هو إطار عمل لبناء تطبيقات كاملة على iOS وAndroid وmacOS وWindows وLinux والويب، وهو أيضًا بيئة تشغيل لواجهات المستخدم التي تصل إلى التطبيقات بعد إصدارها. تقارنه هذه الصفحة أولًا بأطر العمل متعددة المنصات التي يكتب الناس تطبيقاتهم بها، ثم بالطرق التي تحصل بها التطبيقات على واجهات لم تُشحن معها. يعني اللون الأخضر أن القدرة متاحة، والأصفر أنها تتطلب مزيدًا من عمل التطبيق نفسه أو مشروعًا منفصلًا، والأحمر أنها غير متوفرة. تصف العلامات مدى التوفر وليس الأداء. الإصدارات هي الحدود الدنيا الموثّقة لكل إطار عمل وقت الكتابة، فتحقق منها للإصدار الذي تستخدمه.
دليل الرموز: نعم · جزئي · لا.
#أطر العمل متعددة المنصات
| القدرة | NSH | React Native | Flutter | Qt 6 | GPUI | GPUI Fast | Slint |
|---|---|---|---|---|---|---|---|
| طريقة الرسم | واجهة المنصة | عروض المنصة | محرك خاص | Scene graph | خاصة، GPU | خاصة، GPU | مُصيِّر خاص |
| نموذج الواجهة | محتفَظ به | محتفَظ به | محتفَظ به | محتفَظ به | فوري | فوري + محتفَظ به | تفاعلي، محتفَظ به |
| اللغة | Rust، TSX | JS، TS | Dart | C++، QML | Rust | Rust | Slint مع Rust وC++ |
| iOS | 15+ | 15.1+ | 15+ | 17+ | Rust | ||
| Android | 9+ | 7+ | 7+ | 9+ | |||
| macOS | 14+ | منفصل | 12+ | 13+ | 12+ | 12+ | 13+ |
| Windows | 10 1809+ | منفصل | 10+ | 10 1809+ | 10+ | 10+ | 10+ |
| Linux | GTK 4.14+ | Debian 10+ | Debian 11+ | Vulkan | Vulkan | ||
| الويب | HTML | مكتبة | Canvas | Canvas | Canvas | ||
| نص النظام | |||||||
| تجربة مخصصة لكل جهاز | |||||||
| بلا بيئة تشغيل JS | تطبيقات Rust | C++ | |||||
| تسليم موقّع | OTA | QML | Shell | Shell | |||
| الترخيص | Apache-2.0 | MIT | BSD-3-Clause | LGPL وGPL وتجاري | Apache-2.0 | Apache-2.0 | GPL وتجاري |
يعيد الوضع الفوري (immediate mode) بناء وصف الواجهة في كل إطار، بينما يحتفظ الوضع المحتفَظ به (retained mode) بالوصف ويحدّث ما تغيّر فقط. يجمع GPUI Fast بين الاثنين فوق GPUI، ويعمل حيثما يعمل GPUI. “Shell” هو GPUI Shell.
NSH هو إطار العمل الوحيد هنا الذي يجمع كل ما يلي: واجهة كل منصة ومدخلات النص الأصلية فيها، والهواتف وأجهزة سطح المكتب والويب من تطبيق واحد (والويب بصيغة HTML)، وتطبيقات Rust بلا بيئة تشغيل JavaScript، وواجهات موقّعة ومعزولة (sandboxed) تُسلَّم بعد الإصدار.
#ماذا تعني الصفوف
- طريقة الرسم ونموذج الواجهة. يركّب NSH عروض (views) كل منصة الأصلية ويحتفظ بها (الوضع المحتفَظ به)، فيحدّث التغيير العروض التي مسّها فقط. يركّب React Native أيضًا عروض المنصة على iOS وAndroid. أما Flutter وQt Quick وGPUI وSlint فترسم بمُصيِّراتها الخاصة. يبني GPUI شجرة العناصر في كل إطار (الوضع الفوري)، ويعيد GPUI Fast استخدام ما لم يتغير.
- المنصات. الحدود الدنيا لـ NSH خاصة به (Platforms). أما البقية فمصدرها React Native 0.76 (iOS 15.1، وAndroid 7 / API 24؛ وmacOS وWindows عبر مشروعي react-native-macos وreact-native-windows المنفصلين، والويب عبر مكتبة react-native-web)، وFlutter 3.47، وQt 6.10، ومتطلبات Zed لـ GPUI، وأدلة منصات Slint (iOS من Rust). تعني “Canvas” أن إطار العمل يرسم داخل canvas في الصفحة، أما تطبيقات الويب في NSH فهي عناصر HTML منسّقة بـ CSS، يتولى المتصفح تمريرها وتحديدها وتحريرها (Web).
- نص النظام. حقول النص في NSH هي محررات المنصة نفسها:
UITextViewوEditTextوNSTextViewوTextViewفي GTK، ومحرر المتصفح، مع طرق إدخال النظام ومقابض التحديد وقوائم التحرير. وعلى Windows يعمل محرر NSH الخاص مع DirectWrite وطرق إدخال النظام (IMM32). يستخدم React Native أيضًا حقول إدخال النص الخاصة بالمنصة. أما الأطر التي ترسم بنفسها فتنفّذ تحرير النص بنفسها وتربطه بطرق إدخال النظام. - تجربة مخصصة لكل جهاز. تتبع المكوّنات الأساسية في NSH الجهاز: فالمكوّن
Menuنفسه نافذة منبثقة عند عنصر التشغيل مع المؤشر، وورقة (sheet) من الأسفل على الهاتف، ويُفتحContextMenuبالنقر الأيمن أو بإبقاء الإصبع مضغوطًا. وفي الأطر الأخرى يبقى تكييف التفاعل لكل جهاز في الغالب من عمل التطبيق نفسه. - بلا بيئة تشغيل JS. لا تربط مشغّلات تطبيق Rust أي محرك JavaScript على أي منصة، وTSX هو المسار الثاني على المحرك نفسه. تعمل QML في Qt Quick على محرك JavaScript الخاص بـ Qt، بينما لا تفعل ذلك Qt Widgets في C++.
- تسليم موقّع. يتحقق NSH من حزم
.nshpkgالموقّعة مقابل المفاتيح التي يثق بها وقائمة إبطال، ويشغّل كل حزمة في VM بالحدود والقدرات التي يمنحها المضيف (Signed packages، Sandbox and capabilities). أما تحديثات React Native عبر الهواء (over-the-air) فتشحن شيفرة تطبيق موثوقة، ويمكن لـ Qt تحميل ملفات QML، وتتلقى تطبيقات GPUI وحدات JavaScript عبر GPUI Shell.
#ما يميّز NSH
- أصلي على كل منصة، بالمعنيين. يُبنى كل backend على عروض منصته ونصها وطرق إدخالها: UIKit وعروض Android وAppKit وWin32 مع Direct2D وGTK 4 وHTML، ويأتي تفاعل كل منصة معها. تحديد النص وطرق الإدخال وإمكانية الوصول هي ما يوفره النظام، وما يضيفه إصدار جديد من نظام التشغيل إليها يصل إلى التطبيق (Introduction).
- الهواتف وأجهزة سطح المكتب والويب من تطبيق واحد. ست منصات هي backends لإطار عمل واحد، بتخطيطات تعيد تشكيل نفسها ومدخلات تتبع الجهاز. وعلى الويب يكون التطبيق HTML منشورًا كموقع ثابت.
- Rust أولًا، بلا بيئة تشغيل JavaScript. يمكن أن يكون التطبيق كله Rust من البداية إلى النهاية، مُصرَّفًا إلى شيفرة أصلية مع أنواع Rust وخيوطه وحزمه (crates). أما TSX فهو المسار الثاني على المحرك نفسه، للشاشات التي تُكتب بسرعة (Building with Rust).
- عروض محتفَظ بها للتطبيقات اليومية. تبقى المحادثات والنماذج والقوائم والمستندات شبه خاملة في حالة السكون، لأن التغيير لا يرسل إلا العروض التي مسّها (Introduction).
- واجهات تُسلَّم بعد الإصدار، موقّعة ومعزولة. تستقبل التطبيقات المبنية بـ NSH، والتطبيقات الأصلية المكتوبة بأدوات كل منصة، وحدات TSX وقت التشغيل، سواء كتبها فريق أو ولّدها الذكاء الاصطناعي (Dynamic UI).
- سلسلة أدوات واحدة، للبشر والوكلاء. ملف تنفيذي واحد هو
nshينشئ التطبيقات ويشغّلها ويختبرها على منصات حقيقية ويحزمها ويوقّعها لكل هدف.
#React Native
React Native هو الأقرب في القصد: كلاهما يقلّل العمل المكرر في العميل ويستخدم عروض المنصة. يتمحور React Native حول JavaScript أو TypeScript مع React ونظام حزمه البيئي، على iOS وAndroid، مع دعم لسطح المكتب في مشاريع منفصلة. أما NSH فيتمحور حول Rust: بيئة تشغيله ومُصيِّره ووحداته كلها Rust، وRust لغة تطبيقات قائمة بذاتها، وTSX مسار واحد من اثنين. ومنصاته الست، بما فيها أجهزة سطح المكتب والويب، هي backends لإطار العمل نفسه.
#Flutter
يرسم Flutter كل بكسل بمحركه الخاص، فيبدو التطبيق متطابقًا على كل المنصات. أما NSH فيسلك الطريق الآخر: عروض كل منصة ونصها ومدخلات النص فيها، وعلى الويب عناصر HTML مع تمرير المتصفح وتحديده وإدخاله. فتحرير النص وطرق الإدخال والتحديد هي ما توفره المنصة، بدل إعادة تنفيذها لكل منصة.
#Qt
Qt هي مجموعة أدوات ناضجة تقدم تقنيتين لواجهات المستخدم، هما Qt Widgets وQt Quick، مع أدوات ودعم للمنصات يمتدان لسنوات طويلة. يختلف NSH عنها في الأساس وفي النموذج: لغة Rust لغةً أساسية مع مسار TSX، وسلسلة أدوات مصممة للتطوير الآلي (والمدفوع بالذكاء الاصطناعي)، وعرض الويب بصيغة HTML، وتكييف التفاعل على الجوال وسطح المكتب والويب داخل نموذج مكوّنات واحد.
#GPUI and GPUI Fast
GPUI هو إطار عمل لواجهات المستخدم بلغة Rust يرسم باستخدام وحدة معالجة الرسوميات (GPU)، وقد بُني لتطبيقات سطح المكتب كثيفة المتطلبات؛ أما GPUI Fast فهو نسخة مشتقة (fork) من Longbridge مع عرض محتفَظ به (retained rendering) يعيد استخدام العروض والتخطيط وقياسات النصوص التي لم تتغير، إضافةً إلى طبقات التمرير والتركيب الأصلي للنوافذ. أما NSH فيبني على العروض الأصلية لكل منصة، ولذلك فإن إدخال النص والتحديد وطرق الإدخال والتفاعل مع النظام كلها من المنصة نفسها، كما يغطي الهواتف والويب أيضًا؛ ويقوم الواجهة الخلفية GPUI في NSH بتضمين تطبيقات NSH داخل تطبيقات GPUI وGPUI Kit (GPUI).
يناسب كل منهما حمولات مختلفة. في اختبار أداء NSH (على Linux، مع جدول أسعار من 500 صف، وNSH على الواجهة الخلفية GTK 4)، تكلّف الحمولات اليومية الشيء نفسه: عند 1,000 تحديث سعر في الثانية يستخدم NSH Rust نسبة 18% من نواة واحدة بينما يستخدم GPUI Fast نسبة 20%. أما تحت التحديثات الكثيفة المتواصلة فيتقدم GPUI Fast: عند 20,000 تحديث سعر في الثانية يستخدم 25% من نواة واحدة مقابل 73–78% لدى NSH، كما أن الرسوم المتحركة إطارًا بإطار لـ1,000 مربع تكلّفه نحو ثلث استهلاك المعالج لدى NSH.
#Slint
Slint هي مجموعة أدوات تصريحية لواجهات المستخدم بلغتها الخاصة ومحركات رسم خفيفة، لأجهزة سطح المكتب والأجهزة المدمجة، وتُستخدم من Rust أو C++ أو JavaScript أو Python. كلاهما يعتني بالأداء الأصلي؛ أما طريق NSH فهو واجهة كل منصة وتفاعلها الخاص، وHTML على الويب، وRust وTSX لغتين للتطبيقات، والتطوير المدفوع بالذكاء الاصطناعي عبر ست منصات.
#Electron and Tauri
يضمّ Electron محرك Chromium، ويستخدم Tauri عارض الويب الخاص بالنظام: كلاهما يبني تطبيقات سطح المكتب (ومعه Tauri تطبيقات الجوال أيضًا) من محتوى الويب، مع نص المتصفح وإدخاله. أما NSH فيبني العروض الأصلية لكل منصة، ولا يعرض HTML إلا على الويب نفسه.
#UI delivered after release
أمام التطبيق الذي يريد واجهة لم تُشحن معه — كإجابات يولّدها نموذج، أو ميزات من شركاء أو فرق أخرى، أو شاشات تتغير دون إصدار جديد — عدد من الخيارات المعروفة، على الهواتف وأجهزة سطح المكتب على حد سواء. وهي تختلف في ما يرسم الواجهة، وفي ما يُسمح للشيفرة المسلَّمة بفعله، وفي مقدار ما يجب تغييره في التطبيق ليستضيفها.
| Capability | NSH | Web view | Server-driven UI | Mini-programs | OTA updates |
|---|---|---|---|---|---|
| Drawn by | Platform UI | Browser engine | The app’s views | Web engine + layer | Framework renderer |
| Native look and behavior | |||||
| Own state, logic and layout | |||||
| Host’s native components | Bridge | ||||
| Sandbox the host configures | Same-origin | Schema | |||
| Signed, revocable packages | |||||
| Fit for AI-generated UI | Web pages | ||||
| Cost to the host app | One view and a library | A browser engine per view | A renderer per component | A container SDK | The whole app in the framework |
- عرض الويب (H5). صفحة داخل محرك متصفح: كل ما يستطيع HTML التعبير عنه، بمظهر المتصفح، وجسر مكتوب يدويًا إلى الشيفرة الأصلية.
- الواجهة المدفوعة من الخادم (Server-driven UI). JSON يعيد تركيب المكوّنات والإجراءات التي يشحنها التطبيق أصلًا: سهل التوليد، بلا حالة محلية أو منطق يتجاوز ما يوفره المخطط (schema).
- حاويات البرامج المصغّرة (Mini-programs). إطار عمل وواجهات برمجية خاصة بكل منصة فوق محرك ويب، داخل حزمة SDK كبيرة للحاوية.
- التحديثات عبر الهواء (OTA) (مثل React Native مع خدمة code-push). إطار العمل كاملًا، لكن التحديثات تُعامَل كشيفرة تطبيق موثوقة، ويجب كتابة التطبيق بذلك الإطار.
- NSH. وحدة TSX بحالتها ومنطقها وحركتها وتخطيطها الخاص، تُعرض بواجهة المنصة الأصلية، ويمكنها استخدام العروض الأصلية التي يسجلها المضيف. تصل في حزمة موقَّعة يتحقق منها التطبيق، وتعمل في آلة افتراضية (VM) خاصة بها مع حدود للذاكرة ووقت الاستدعاء وعدد العُقد، ولا تصل إلا إلى مضيفات الشبكة وصفحات الويب وإعدادات النظام التي يمنحها المضيف (Sandbox and capabilities). ويضيف المضيف عرضًا واحدًا تظهر فيه الوحدة (Platforms)، وتعمل الحزمة نفسها على كل منصة. وهذا هو سبب وجود NSH إلى جانب GPUI Shell.
#When another option fits better
- الشاشة يغلب عليها تحديث كثيف ومتواصل لآلاف العروض — كمحطة بيانات سوق تبثّ عشرات الآلاف من الأسعار في الثانية، أو تصور مخصص يُعاد رسمه في كل إطار: يستخدم العرض المحتفَظ به على GPU في GPUI Fast جزءًا صغيرًا من المعالج (انظر GPUI and GPUI Fast).
- يجب أن يبدو التطبيق متطابقًا بالبكسل على كل منصة: إطار عمل يرسم كل شيء بنفسه، مثل Flutter أو Slint، يوفر ذلك بحكم تصميمه.
- تحتاج إلى منظومة كبيرة من الحزم الخارجية اليوم: لدى React Native وFlutter وQt سنوات منها.
- الواجهة مستند أو صفحة ويب موجودة: عرض الويب يعرضها كما هي.
- مجموعة الشاشات ثابتة وصغيرة، ولا يتغير سوى المحتوى والترتيب: الواجهة المدفوعة من الخادم لا تحتاج إلى أي بيئة تشغيل.
#See also
- Introduction: ما هو NSH، وماذا يعني «الأصلي» فيه.
- Architecture: ما الذي يعمل وأين داخل NSH.
- Performance: القواعد التي يتبعها NSH، وكيفية قياس أداء تطبيق.