Menu
flag Ar iconالعربيةdown icon

Zero Hello World: اكتب أوّل برنامج بامتداد ‎.0‎ وشغّله

أوّل برنامج لك بلغة Zero — ماذا يعني كل جزء من برنامج hello-world التقليدي، وكيف تشغّله بـ zero run، ولماذا يستخدم برنامج من خمسة أسطر بالفعل World وraises وcheck.

تحتوي هذه الصفحة على محررات قابلة للتشغيل — حرّر، شغّل، وشاهد النتيجة فوراً.

اكتب الملف

افتح محرّرك واحفظ الأسطر الخمسة التالية باسم hello.0 في أي مكان مناسب — أو فقط اضغط Run على الكتلة أدناه:

هذا كل شيء — برنامج Zero كامل. لتشغيله محليًا:

zero run hello.0

ستظهر لك:

hello from zero

إذا حصلت على command not found، فارجع إلى تثبيت Zero وتأكّد أوّلًا من عمل zero --version.

تفكيك كل رمز

حتى هذا البرنامج الصغير يُظهر معظم ما يجعل Zero مختلفة. لنقرأه من البداية إلى النهاية.

pub

pub تجعل التعريف عامًا — مرئيًا خارج وحدته الحالية. يحتاج زمن التشغيل إلى العثور على main من خارج نطاق الملف نفسه، لذا يجب أن تكون main معرّفة بـ pub. دالة مساعدة خاصة داخل الملف نفسه لن تحتاج إليها.

fun

fun تُقدّم تعريف دالة. تستخدم Zero fun، لا fn (Rust) ولا func (Go) ولا function (JavaScript). كلمة مفتاحية واحدة، تُستخدم بالطريقة نفسها في كل مرة.

main

اسم نقطة الدخول المعتاد. عندما يعمل هدف تنفيذي في Zero، يبحث زمن التشغيل عن pub fun main(world: World) ويستدعيها. يمكنك تسمية الدوال الأخرى كما تشاء، لكن main محجوزة عُرفًا لنقطة دخول البرنامج.

(world: World)

المعامل الوحيد اسمه world ونوعه World. يُنشئ زمن التشغيل قيمة World قبل استدعاء main ويمرّرها إليها. تحمل تلك القيمة قدرات البرنامج: الوصول إلى stdout وstdin ونظام الملفات والشبكة وغيرها، حسب ما يقرّر زمن التشغيل منحه.

اسم المعامل لك أن تختاره — (w: World) أو (io: World) ستُترجم بلا مشاكل. الاتفاق في الأمثلة هو world، وسنلتزم به.

-> Void

نوع الإرجاع. Void يعني أن الدالة لا تُعيد قيمة مفيدة — هي موجودة لتأثيراتها الجانبية، لا لقيمتها. كثير من الدوال التي ستكتبها ستُعيد أنواعًا حقيقية مثل i32 أو shape عرّفتها.

raises

raises المجرّدة (دون نوع خطأ محدّد) على main تقول "هذه الدالة يمكن أن تفشل". بالنسبة لـ main، هذا يعني أن البرنامج يمكن أن يخرج بحالة غير صفرية إذا انتشر أي check داخل الجسم برسالة خطأ. سنرى أشكالًا أضيق — raises { InvalidInput } مثلًا — في Raises و Check.

check world.out.write("hello from zero\n")

هذا السطر هو الذي يُنفّذ شيئًا فعليًا. ثلاث قطع فرعية:

  • world.out — تيار الإخراج القياسي، مكشوفًا كحقل على قدرة World.
  • .write("hello from zero\n") — دالة (method) تكتب نصًا إلى ذلك التيار. تُعيد نتيجة قد تُشير إلى فشل (الكتابة قد تفشل؛ التيار قد يكون مغلقًا).
  • check — تنشر ذلك الفشل إلى الأعلى إن حدث. بدون check، سيشتكي المترجم من أن نتيجة write تُهمَل بصمت.

\n في النهاية سطر جديد حرفي. بدونه، لن يُنقل الإخراج إلى سطر جديد ومُحَث الصدفة سيقع في السطر نفسه مع رسالتك.

ماذا حدث للتو

عندما شغّلت zero run hello.0:

  1. حلّل المترجم ملفك وفحص أنواعه.
  2. أنتج ملفًا تنفيذيًا أصليًا صغيرًا لمنصّتك.
  3. أنشأ زمن التشغيل قدرة World للعملية الحالية.
  4. استدعى main(world).
  5. كتبت شيفرتك "hello from zero\n" إلى تيار out الخاص بذلك العالم — المتّصل بـ stdout في طرفيتك.
  6. أعادت main القيمة Void، نظّف زمن التشغيل، وخرج البرنامج بحالة 0.

لا جامع نفايات، ولا تهيئة خفية لزمن التشغيل، ولا تشغيل ضمني للوحدة. البرنامج كلّه هو الدالة التي كتبتها، إضافة إلى شيفرة المكتبة القياسية التي استدعتها.

جرّب تغييرًا صغيرًا

اجعل البرنامج يأخذ ربطًا للرسالة قبل كتابتها:

شغّله مجدّدًا — نفس الإخراج، لكنك الآن رأيت ربط let وأكّدت أن النصوص قيم من الدرجة الأولى يمكن تمريرها.

نسخة فاشلة

ماذا يحدث إذا نسيت check؟

pub fun main(world: World) -> Void raises {
    world.out.write("oops\n")
}

zero check hello.0 سترفض ترجمة هذا. نتيجة write قيمة قابلة للفشل؛ تجاهلها خطأ ترجمة. إما أن تُطبّق check (لتنشر الخطأ) أو تُعالجها صراحة. هذه الفكرة نفسها التي تستخدمها Rust في النتائج المُعَلَّمة بـ must_use، لكنها مفروضة هنا على كل استدعاء قابل للفشل.

التالي: واجهة سطر الأوامر Zero

استخدمت zero run هنا. واجهة سطر الأوامر تحتوي على مجموعة صغيرة من الأوامر تستحق المعرفة — check، وrun، وbuild، وtest، وfix، وexplain — لكلٍّ منها وضع --json مهيكل مُصمّم ليستهلكه الوكلاء.

الأسئلة الشائعة

ما هو برنامج hello world في Zero؟

برنامج hello world التقليدي في Zero خمسة أسطر: pub fun main(world: World) -> Void raises { check world.out.write("hello from zero\n") }. احفظه باسم hello.0 وشغّل zero run hello.0.

ماذا يعني pub fun main في Zero؟

pub يجعل التعريف عامًا — مرئيًا خارج وحدته. fun يُعلن دالة. main هي نقطة الدخول المعتادة التي تبحث عنها Zero في هدف تنفيذي. معًا، pub fun main تُعلن نقطة الدخول العامة التي يستدعيها زمن التشغيل عند بدء البرنامج.

لماذا تأخذ main معاملًا من النوع World؟

‏Zero ليس فيها إدخال/إخراج عمومي. أي شيء يتحدّث مع العالم الخارجي — stdout، وstdin، والملفات، والشبكة — يمرّ عبر قدرات تُمرَّر صراحة. يُسلّم زمن التشغيل قيمة World إلى main، وتلك القيمة (أو أجزاء منها) هي الطريقة الوحيدة التي تستطيع بها الدوال تنفيذ الإدخال/الإخراج. هذا يجعل التأثيرات الجانبية مرئية في توقيعات الدوال.

ماذا يفعل raises وcheck في برنامج hello world؟

raises على main تُعلن أن الدالة يمكن أن تفشل. check world.out.write(...) تستدعي دالة قابلة للفشل، وإذا فشلت، تنشر الخطأ إلى المستدعي — وهنا، المستدعي هو زمن التشغيل، الذي يخرج بحالة غير صفرية. بدون check، سيرفض المترجم ترجمة الاستدعاء لأن الخطأ سيُترك دون معالجة.

ما الامتداد الذي تستخدمه Zero للملفات؟

ملفات مصدر Zero تستخدم الامتداد .0 (الرقم صفر، لا الحرف O). الملف hello.0 هو ملف مصدر Zero. يُستدعى المترجم بأوامر مثل zero check hello.0 وzero run hello.0.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن