JSON الذي يفكر: لغة برمجة داخل JSON
مقالة

JSON الذي يفكر: لغة برمجة داخل JSON

أسامة الغانمي · 19 فبراير 2026

ماذا لو لم يكن JSON مجرد صيغة للبيانات؟

ماذا لو كان لغة برمجة؟

بنينا لغة كاملة بمعيار تورنغ وهي مجموعة جزئية صارمة من JSON. لا صياغة جديدة. لا محلّل مخصص. كل برنامج هو JSON صالح.

هذه هي المدار.


الفكرة الأساسية

في عام 1958 قدّم John McCarthy تعبيرات S-expression (تعبيرات رمزية) في Lisp:

lisp
1 2 (+ 1 2) (if (> x 10) "big" "small")

الـ S-expression قوائم متداخلة، وعنصرها الأول هو العامل.

ومصفوفات JSON قوائم متداخلة.

json
1 2 ["+", 1, 2] ["if", [">", "x", 10], "big", "small"]

هذا كل شيء.

الـ S-expression تتسع أصلًا داخل مصفوفات JSON بشكل مثالي. وبدل أن نخترع صياغة جديدة، نفسّر ما يعبّر عنه JSON أصلًا.


كيف يبدو برنامج المدار

يتكوّن برنامج المدار من Orbitals، وهي اللبنات الأساسية للنظام.

يضم كل Orbital ثلاثة عناصر أساسية:

  • Entity — نموذج البيانات
  • Trait — السلوك
  • Page — الواجهة

Entity — نموذج البيانات

تحدد الـ Entity بنية البيانات. تعلن الحقول والأنواع والقيود.

وهي:

  • المخطط
  • الذاكرة
  • حاوية الحالة

تحمل البيانات التي يعمل عليها النظام.


Trait — السلوك

تحدد الـ Trait السلوك.

من الناحية التقنية، الـ Trait آلة حالة قابلة لإعادة الاستخدام مرتبطة بـ Entity.

وهي تحتوي على:

  • الحالات
  • الانتقالات
  • الحرّاس Guards (شروط تُكتب بصيغة S-expression)
  • التأثيرات (إجراءات مثل set وemit وغيرها)

تغلّف الـ Traits المنطق ويمكن إعادة استخدامها عبر الـ orbitals. وهي القلب الحسابي للنظام.


Page — الواجهة

تحدد الـ Page واجهة المستخدم.

وتصف:

  • التخطيط
  • المكوّنات
  • الربط بحقول الـ Entity
  • مشغّلات الأحداث

تتفاعل الصفحات مع حالة الـ Entity وترسل أحداثًا تقود الـ Traits.


مثال

json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 { "name": "ApprovalWorkflow", "orbitals": [{ "entity": { "name": "Request", "fields": [ { "name": "amount", "type": "number" }, { "name": "status", "type": "enum", "values": ["pending", "approved", "rejected"] } ] }, "traits": [{ "name": "ApprovalTrait", "linkedEntity": "Request", "stateMachine": { "states": [ { "name": "Pending", "isInitial": true }, { "name": "Approved" }, { "name": "Rejected" } ], "transitions": [{ "from": "Pending", "to": "Approved", "event": "APPROVE", "guard": ["and", [">=", "@user.roleLevel", 3], ["<", "@entity.amount", 10000] ], "effects": [ ["set", "@entity.status", "approved"], ["emit", "REQUEST_APPROVED"] ] }] } }] }] }

البنية هي JSON. والمنطق مصفوفات JSON. والتنفيذ حتمي ومتكرر ذاتيًا.


ما هو الـ Guard؟

الـ Guard تعبير شرطي يحدد ما إذا كان يُسمح بتنفيذ انتقال بين حالتين.

لا يُطلق الانتقال إلا إذا كانت قيمة الـ guard تساوي true. وإذا كانت false فإن الانتقال يُمنع.

الـ Guards تعبيرات خالصة، وليس لها أي آثار جانبية.


مثال على Guard

json
1 2 3 4 5 6 7 8 9 10 11 12 { "from": "Pending", "to": "Approved", "event": "APPROVE", "guard": ["and", [">=", "@user.roleLevel", 3], ["<", "@entity.amount", 10000] ], "effects": [ ["set", "@entity.status", "approved"] ] }

لا يعمل هذا الانتقال إلا إذا:

  • كان مستوى دور المستخدم 3 على الأقل
  • وكان مبلغ الطلب أقل من 10,000

وإذا فشل أحد الشرطين فلا يفعل الانتقال شيئًا.


تقييم الـ Guard

تُقيَّم الـ Guards تقييمًا متكررًا ذاتيًا:

json
1 2 3 4 ["and", [">=", "@user.roleLevel", 3], ["<", "@entity.amount", 10000] ]

خطوات التقييم:

  1. حلّ الارتباطات (@user.roleLevel و@entity.amount)
  2. تقييم التعبيرات الداخلية
  3. تقييم العامل الخارجي

ويجب أن تكون النتيجة قيمة منطقية (boolean).

يمكن أن تستخدم الـ Guards:

  • العوامل المنطقية: and وor وnot
  • المقارنات: = و!= و< و> و<= و>=
  • العمليات الحسابية
  • التعبيرات المتداخلة
  • الإشارات إلى @entity أو @user أو @payload

من الناحية المفهومية، الـ guard يعادل شرط if للانتقال.


لماذا هذه لغة برمجة

المدار كاملة بمعيار تورنغ لأنها توفّر:

  • حالة قابلة للتغيير (حقول الـ Entity)
  • آلات حالة حتمية
  • منطقًا شرطيًا
  • تأثيرات (set وemit)
  • انتقالات ذاتية (حلقات)
  • تواصلًا قائمًا على الأحداث

الانتقال الذاتي مع guard وتحديثات للحالة يعادل حلقة while:

json
1 2 3 4 5 6 7 8 9 10 { "from": "Computing", "to": "Computing", "event": "TICK", "guard": [">", "@entity.counter", 0], "effects": [ ["set", "@entity.counter", ["-", "@entity.counter", 1]], ["emit", "TICK"] ] }

الحالة = الذاكرة. الانتقالات = تدفق التحكم. التعبيرات = الحساب.

وهذا نموذج حسابي كامل.


الاقتراح

تقترح المدار تحولًا بسيطًا:

  • أبقِ على JSON.
  • فسّر المصفوفات على أنها S-expressions.
  • اجمعها مع آلات الحالة لتدفق التحكم.
  • عامل البيانات المنظمة والمنطق القابل للتنفيذ كنظام واحد.

لا قواعد نحوية جديدة. لا قواعد صياغة جديدة. فقط حساب منظّم داخل أكثر صيغ البيانات عالمية في العالم.

JSON فاز أصلًا.

والآن يستطيع أن يفكّر.

أسامة الغانمي

المعرفة حرية. ومن حق الناس أن يفهموا الأنظمة التي تحكمهم.

في أماكن أخرى
© 2026 أسامة الغانمي. ليوبليانا، سلوفينيا.