ثلاثة نماذج تنفيذ، حقيقة واحدة: كيف حللنا مشكلة 'اكتب مرة، شغّل في أي مكان'

نفس ملف .orb يعمل في المتصفح، وعلى الخادم، ويُصرَّف إلى كود أصلي. إليك كيف.
وعدت جافا بـ"اكتب مرة، شغّل في أي مكان." نحن نقدم "اكتب مرة، شغّل في كل مكان بالشكل المناسب."
وعد وفشل "اكتب مرة، شغّل في أي مكان"
في عام 1995، وعدت جافا: "اكتب مرة، شغّل في أي مكان."
الواقع: "اكتب مرة، صحّح الأخطاء في كل مكان."
ما المشكلة؟ البيئات المختلفة تتطلب مقايضات مختلفة:
- بيئة التطوير/IDE — تحتاج تكرارًا سريعًا، تفسيرية
- الإنتاج على الويب — تحتاج أداءً، compiled (مُصرَّفة)
- سطح المكتب/الموبايل — تحتاج أداءً أصليًا، مُجمَّعة
حل واحد لا يناسب الجميع.
حل Almadar: ثلاثة نماذج تنفيذ
من schema (مخطط يصف بنية التطبيق) واحد بصيغة .orb، يدعم Almadar ثلاثة نماذج تنفيذ:
.orb Schema
│
├─────────────────┬─────────────────┐
│ │ │
▼ ▼ ▼
TypeScript Rust Runtime Generated Code
Runtime (Native) (Compiled)
(Interpreted) (Production)
تم تحسين كل نموذج لبيئته.
النموذج 1: بيئة تشغيل TypeScript
الأفضل لـ: التطوير، بيئة التطوير المتكاملة، التكرار السريع
# Start development server with live reload
almadar dev task-app.orb
# Opens browser at localhost:3000
# Schema changes auto-reload
الخصائص:
- بدء تشغيل سريع
- إعادة تحميل فورية
- قابلة للتصحيح
- متوافقة مع المتصفح/Node
حالات الاستخدام:
- معاينة بيئة التطوير المتكاملة
- بيئة التطوير
- الاختبار وتصحيح الأخطاء
- العروض التعليمية
النموذج 2: بيئة تشغيل Rust
الأفضل لـ: التطبيقات الأصلية، أدوات سطر الأوامر، الأداء العالي
# Compile to native Rust binary
almadar compile task-app.orb --shell rust -o native/
# Build and run the native app
cd native && cargo build --release && ./target/release/task-app
ينتج الـ compiler (المحول البرمجي الذي يحوّل الـ schema لكود) في Almadar مشروع Rust كاملًا مع Axum للواجهة الخلفية و egui لواجهة المستخدم. الملف الثنائي الناتج هو تطبيق أصلي مستقل — بدون اعتماديات وقت التشغيل، بدون Node.js.
الخصائص:
- أداء أصلي
- ملفات ثنائية صغيرة
- آمن على الذاكرة
- متعدد المنصات
حالات الاستخدام:
- تطبيقات سطح المكتب
- أدوات سطر الأوامر
- الأنظمة المدمجة
- عملاء الألعاب
النموذج 3: الكود المُولَّد
الأفضل لـ: نشر الإنتاج، التكامل المخصص
# Generate TypeScript
orbital compile app.orb --shell typescript -o output/
# Generate Python
orbital compile app.orb --shell python -o output/
# Generate Rust
orbital compile app.orb --shell rust -o output/
الخصائص:
- مُحسَّن للهدف
- قابل للتخصيص بالكامل
- مخرجات قابلة للقراءة
- جاهز للإنتاج
حالات الاستخدام:
- تطبيقات الويب الإنتاجية
- الـ microservices (خدمات مصغرة مستقلة)
- تطبيقات الموبايل (عبر React Native)
- التكاملات المخصصة
الـ OIR — Orbital Intermediate Representation
كيف يتحول schema واحد إلى ثلاثة ملفات تنفيذية؟
السر هو OIR — الـ intermediate representation (التمثيل الوسيط بين الـ schema والكود النهائي):
.orb Schema
│
▼
Parse → Validate → Enrich → Inline → Resolve
│
▼
┌─────────────────────────────────────┐
│ OIR (Orbital IR) │
│ - Resolved entities │
│ - Normalized traits │
│ - Flattened pages │
│ - Validated state machines │
└─────────────────────────────────────┘
│
├──────────────┬──────────────┐
▼ ▼ ▼
TS Runtime Rust Runtime Code Generator
يعتبر الـ OIR حجر رشيد — تنسيق مشترك تفهمه جميع الأهداف.
مثال: تطبيق المهام عبر جميع النماذج
الـ schema
{
"name": "TaskApp",
"orbitals": [{
"name": "TaskManagement",
"entity": {
"name": "Task",
"fields": [
{ "name": "title", "type": "string" },
{ "name": "status", "type": "enum", "values": ["todo", "done"] }
]
},
"traits": [{
"name": "TaskBrowser",
"linkedEntity": "Task",
"stateMachine": {
"states": [{ "name": "browsing", "isInitial": true }],
"transitions": [{
"from": "browsing",
"to": "browsing",
"event": "INIT",
"effects": [
["render-ui", "main", { "type": "entity-table", "entity": "Task" }]
]
}]
}
}],
"pages": [{ "name": "TasksPage", "path": "/tasks" }]
}]
}
النموذج 1: بيئة تشغيل TypeScript
# Start development server — schema interpreted directly
almadar dev task-app.orb
# State machine runs in memory
# UI renders via React components
# Events handled by EventBus
