المشروع 9: لغة عالية المستوى
المشروع 9: البرمجة بلغة عالية المستوى
خلفية
يقدّم هذا المشروع Jack، وهي لغة برمجة بسيطة شبيهة بـ Java، قائمة على الكائنات. وقبل بناء مصرِّف Jack في المشروعين 10 و11، من المنطقي التعرّف على اللغة نفسها. وهذا هو الغرض الرئيسي من هذا المشروع. وهناك أيضًا متعة كتابة لعبة حاسوب صغيرة بلغة بسيطة رائعة.
الهدف
تبنَّ فكرة تطبيق ما، مثل لعبة حاسوب بسيطة أو بعض البرامج التفاعلية الأخرى. ومن الأمثلة على ذلك Tetris وSnake وHangman وSpace Invaders وSokoban وPong وغيرها. ومهمّتك هي تنفيذ هذا التطبيق بلغة Jack. ولا يلزمك إنشاء تطبيق كامل؛ فيمكنك مثلًا إنشاء نسخة أساسية من لعبة بسيطة ما، أو جزء منها، أو تفاعل بسيط رائع.
نظام Jack التشغيلي
تتطلب كتابة برامج Jack العمل مع نظام Jack التشغيلي، تمامًا مثلما تتطلب كتابة برامج Java العمل مع مكتبة أصناف Java. ويمكن النظر إلى نظام Jack التشغيلي على أنه مجموعة من الخدمات البرمجية التي توسّع قدرات اللغة الأساسية وتسدّ الثغرات بينها وبين العتاد الأساسي. وإليك واجهة برمجة تطبيقات Jack OS.
تتضمّن حزمة برامج Nand2Tetris تنفيذين لنظام Jack التشغيلي: كُتب أحدهما بتلك اللغة ثم تُرجم باستخدام مصرِّفها إلى مجموعة من 8 ملفات أصناف بالامتداد .vm هي Math وScreen وOutput وKeyboard وMemory وString وArray وSys، وتُحفَظ في مجلد فرعي داخل مجلد الأدوات على حاسوبك. أما التنفيذ الآخر فكُتب بجافا، وهو جزء لا يتجزّأ من مُحاكٍ الآلة الافتراضية المرفق، والمتوفر أيضًا في مجلد الأدوات. ونشرح في الفقرات التالية كيفية استخدام كل إصدار منهما.
كتابة وتحرير برامج Jack
يتألّف تطبيق Jack من ملف .jack واحد أو أكثر. ويمكنك كتابة هذه الملفات وتحريرها في أي محرّر نصوص يتعامل مع الملفات النصية العادية. فمثلًا، إذا أردت استخدام Notepad++، فيمكنك اتّباع الخطوات التالية:
-
ثبّت أحدث إصدار من Notepad++ على حاسوبك؛
-
انسخ اتفاقيات صياغة Jack هذه إلى الملف \notepad++\userDefineLang.xml على حاسوبك.
سيؤدّي هذا الإجراء إلى تخصيص Notepad++ لكتابة برامج Jack على حاسوبك. وبالطبع، يمكنك استخدام أي محرّر نصوص آخر يناسبك. وإذا أردت تخصيص المحرّر للبرمجة بلغة Jack (وهو ليس تعديلًا ضروريًا في الحقيقة)، فسيتعيّن عليك اكتشاف كيفية فعل ذلك بنفسك.
ربما من الجدير بالذكر أننا لا نريد أن نجعل من برمجة Jack مسألة كبيرة. فنحن نستخدم Jack بشكل أساسي كوسيلة لتعلّم كيفية تطوير مصرّفات وأنظمة تشغيل بسيطة، كما سنفعل في المشاريع 10 و11 و12. لذلك، لا حاجة لقضاء وقت طويل في صقل مهاراتك في برمجة Jack.
الموارد
القراءة ذات الصلة بهذا المشروع هي الفصل 9 من الكتاب. وستحتاج إلى ثلاث أدوات: محرّر نصوص لكتابة برامج Jack، ومصرِّف Jack المرفق (JackCompiler) لترجمتها، ومُحاكٍ الآلة الافتراضية المرفق لتنفيذها واختبارها. وقد تكون قائمة أخطاء Jack OS هذه مفيدة أثناء عملية تطوير برنامجك.
محرّر الصور النقطية: إذا أردت تطوير تطبيق يحتوي على عناصر رسومية، فكّر في استخدام محرّر Bitmap القوي هذا، الذي أنشأه Eric Umble. وإليك عرضًا توضيحيًا للعبة Dino Adventure التي طوّرها Eric بهذا المحرّر.
أفكار الألعاب: تحتوي قناة Youtube هذه على نصائح حول برمجة ألعاب الحاسوب "الكلاسيكية". ويمكنك الرجوع إليها للحصول على بعض الأفكار، وكذلك نصائح تقنية.
ملاحظة حول التسليم
إذا كنت تأخذ هذه الدورة على Coursera، فيجب عليك تسليم ملف مضغوط، وفقًا لتعليمات التسليم المنشورة على موقع Coursera. ولاحظ أنه بالإضافة إلى ملفات VM المترجمة، يجب أن يتضمّن تسليمك مجلدًا باسم "source"، يحتوي على جميع ملفات Jack المصدريّة لتطبيقك. وسيحكم مراجعو المشروع على تجربة المستخدم وكذلك على جودة شيفرة Jack خاصتك. وتأكّد من أن شيفرة Jack خاصتك قابلة للقراءة وموثّقة.
برنامج Jack نموذجي
Square Dance: يتيح هذا البرنامج التفاعلي البسيط للمستخدم تحريك مربّع رسومي على الشاشة:

ويمكن للمستخدم أيضًا التحكّم في حجم المربّع.
يُوضيّح تعامل البرنامج مع لوحة المفاتيح والشاشة ممارسات برمجية يمكن تطبيقها على تطوير تطبيقات Jack تفاعلية بشكل عام. لذلك، يُنصح باستكشاف شيفرة البرنامج، التي تُعطى أدناه.
وعند بدء تشغيل البرنامج، يظهر مربّع بحجم 30 في 30 بكسل في الزاوية العلوية اليسرى من الشاشة. ثم يستمع البرنامج للأحداث التالية لضغط المفاتيح ويستجيب لها:
-
السهم الأيمن يحرّك المربّع إلى اليمين؛
-
السهم الأيسر يحرّك المربّع إلى اليسار؛
-
السهم الأعلى يحرّك المربّع إلى الأعلى؛
-
السهم الأسفل يحرّك المربّع إلى الأسفل؛
-
يزيد x حجم المربّع بمقدار 2 بكسل؛
-
ينقص z حجم المربّع بمقدار 2 بكسل؛
-
q يخرج من البرنامج.
سرعة التحريك: يمكن التحكّم فيها بتغيير الثابت delay في الدالّة moveSquare داخل شيفرة مصدر الصنف SquareGame.jack.
شيفرة المصدر الخاصة ببرنامج Jack هذا متوفرة في مجلد nand2tetris/projects/09/Square على حاسوبك.
ترجمة تطبيق Jack وتشغيله
- أنشئ مجلدًا، مثل MyApp.
-
اكتب تطبيقك، أي مجموعة من ملف .jack واحد أو أكثر، واحفظه في المجلد MyApp.
-
إذا أردت استخدام إصدار نظام التشغيل المترجم (مجموعة من 8 ملفات .vm)، فانسخ ملفات .vm هذه من مجلد nand2tetris/tools/os إلى مجلد MyApp خاصتك. أما إذا أردت استخدام إصدار نظام التشغيل المدمج في مُحاكٍ الآلة الافتراضية، فهذه الخطوة غير ضرورية.
-
استخدم مصرِّف Jack المرفق لترجمة المجلد MyApp. وسيترجم المصرِّف جميع أصناف .jack الموجودة في المجلد المعطى إلى ملفات .vm مكافئة. وإذا اشتكى المصرِّف من أخطاء، فصحّح ملف الصنف المعنيّ وأعد ترجمة MyApp حتى لا تبقى أخطاء.
-
لاختبار برنامجك، حمّل المجلد MyApp في مُحاكٍ الآلة الافتراضية المرفق. ثم شغّل البرنامج واختبره. وهناك مشكلات؟ صحّحها وأعد الترجمة.
أي إصدار من نظام التشغيل تريد استخدامه فهو شأنك. والإصدار المدمج أسرع. ولا يهتمّ مُحاكٍ الآلة الافتراضية بالإصدار المستخدم، للسبب التالي: افترض أنك حمّلت مجلدًا في مُحاكٍ الآلة الافتراضية وبدأت تنفيذه. فكلما كشف المُحاكٍ عن نداء لأحدى الدوالّ على الشكل OSclass.function، يتحقّق مما إذا كانت هذه الدالّة متوفرة في قاعدة الشيفرة المحمّلة؛ فإن كانت متوفرة، ينفّذ شيفرة VM الخاصة بها؛ وإلا، فإنه يعود إلى استخدام التنفيذ المدمج لهذه الدالّة في نظام التشغيل. لذلك، يمكنك استخدام جميع ملفات أصناف نظام التشغيل المترجمة، أو بعضها، أو لا شيء منها، كما تراه مناسبًا. وهذه المرونة ستكون مفيدة جدًا حين نطوّر نظام Jack التشغيلي ونختبره وحدةً وحدةً في المشروع 12.
بعض النصائح الإضافية
- للحصول على فكرة حول تطبيقك، شاهد بعض تطبيقات Nand2Tetris القائمة. يمتاز قسم "Cool Stuff" من هذا الموقع بتطبيقات مبهرة، ويمكنك أن تجد المزيد منها على Youtube.
-
العب ببعض برامج Jack المرفقة في nand2Tetris/projects/09 وفي nand2Tetris/projects/11، وراجع شيفرتها.
-
خطّط لتطبيقك بعناية: صمّم جميع الكائنات الرسومية وتفاعل المستخدم على الورق. ثم فكّر في الأصناف، والدوالّ العضوية، وواجهة برمجة التطبيقات (API)، واستراتيجية الاختبار. ثم ابدأ في التنفيذ والاختبار.
-
التوثيق: استخدم حكمك واتّبع الممارسات القياسية.
-
التحسين: لتسريع سرعة التحريك، استخدم محرّر الصور النقطية المرفق في nand2tetris/projects/09.
-
مهم: استمتع!