هذا هو الريبو المستخدم في كتاب "صياغة المترجمين الفوريين" قيد التنفيذ. يحتوي على نص Markdown للكتاب، والتطبيقات الكاملة لكلا المترجمين الفوريين، بالإضافة إلى نظام البناء لنسج الاثنين معًا في الموقع النهائي.
إذا وجدت خطأ أو كان لديك اقتراح، يرجى تقديم مشكلة هنا. شكرًا لك!
أحد أفضل الأشياء على الإطلاق فيما يتعلق بتأليف كتاب عبر الإنترنت ونشره قبل الانتهاء منه هو أن الأشخاص مثلك كانوا طيبين بما يكفي لإعطائي تعليقات، والإشارة إلى الأخطاء المطبعية، والعثور على أخطاء أخرى أو نص غير واضح.
إذا كنت ترغب في القيام بذلك، عظيم! يمكنك فقط تقديم الأخطاء هنا في الريبو، أو إرسال طلب سحب إذا كنت تميل إلى ذلك. إذا كنت تريد إرسال طلب سحب، ولكنك لا ترغب في إعداد نظام البناء لإعادة إنشاء HTML أيضًا، فلا تقلق بشأن ذلك. سأفعل ذلك عندما أسحبه.
هناك طريقة أخرى للمشاركة وهي مشاركة تطبيق Lox الخاص بك. تعد المنافذ إلى اللغات الأخرى مفيدة بشكل خاص نظرًا لأن كل القراء لا يحبون Java وC. لا تتردد في إضافة منفذ Lox الخاص بك أو تنفيذه إلى wiki:
أنا حيوان ثديي كثير النسيان ومعرض للخطأ، لذا قمت بالتشغيل الآلي قدر استطاعتي.
أقوم بالتطوير على جهاز OS X، ولكن أي نظام POSIX يجب أن يعمل أيضًا. مع القليل من الجهد الإضافي، من المفترض أن تكون قادرًا على تشغيل هذا على نظام التشغيل Windows أيضًا، على الرغم من أنني لا أستطيع مساعدتك كثيرًا.
يتم تنسيق معظم العمل حسب الصنع. تمت كتابة نصوص الإنشاء وعداء الاختبار والأدوات المساعدة الأخرى بلغة Dart. تعليمات تثبيت Dart موجودة هنا. بمجرد تثبيت Dart وعلى المسار الخاص بك، قم بتشغيل:
$ make get
يؤدي هذا إلى تنزيل كافة الحزم التي تستخدمها البرامج النصية للإنشاء والاختبار.
من أجل تجميع المترجمين الفوريين، تحتاج أيضًا إلى مترجم C على المسار الخاص بك بالإضافة إلى javac
.
بمجرد حصولك على هذا الإعداد، حاول:
$ make
إذا كان كل شيء يعمل، فسيؤدي ذلك إلى إنشاء موقع للكتاب بالإضافة إلى تجميع المترجمين الفوريين clox وjlox. يمكنك تشغيل أي مترجم مباشرة من جذر الريبو:
$ ./clox
$ ./jlox
تم دمج Markdown ومقتطفات من كود المصدر معًا في HTML النهائي باستخدام منشئ موقع ثابت مكتوب بخط اليد والذي بدأ كنص Python صغير واحد لكتابي الأول ونما بطريقة ما إلى شيء يقارب برنامجًا حقيقيًا.
يتم الالتزام بـ HTML الذي تم إنشاؤه في الريبو ضمن site/
. تم إنشاؤه من مزيج من Markdown for prose، الذي يعيش في book/
، ومقتطفات من التعليمات البرمجية التي تم نسجها من تطبيقات Java وC في java/
و c/
. (كل تلك التعليقات المضحكة في الكود المصدري هي الطريقة التي تعرف بها المقتطف الذي يذهب إلى أين.)
البرنامج النصي الذي يقوم بكل السحر هو tool/bin/build.dart
. يمكنك تشغيل ذلك مباشرة، أو تشغيل:
$ make book
يؤدي ذلك إلى إنشاء الموقع بأكمله دفعة واحدة. إذا كنت تعمل عليه بشكل متزايد، فستحتاج إلى تشغيل خادم التطوير:
$ make serve
يؤدي هذا إلى تشغيل خادم HTTP صغير على مضيف محلي متجذر في دليل site/
. في أي وقت تطلب فيه صفحة، تقوم بإعادة إنشاء أي ملفات تم تغيير مصادرها، بما في ذلك ملفات Markdown وملفات مصدر المترجم الفوري والقوالب والأصول. ما عليك سوى السماح باستمرار تشغيل ذلك، وتحرير الملفات محليًا، وتحديث متصفحك لرؤية التغييرات.
يمكنك بناء كل مترجم مثل هذا:
$ make clox
$ make jlox
وبذلك يتم بناء النسخة النهائية لكل مترجم كما تظهر في نهاية الجزء الخاص به في الكتاب.
يمكنك أيضًا رؤية شكل المترجمين الفوريين في نهاية كل فصل. (أستخدم هذا للتأكد من أنهم يعملون حتى في منتصف الكتاب.) ويتم ذلك بواسطة برنامج نصي، tool/bin/split_chapters.dart
الذي يستخدم نفس علامات التعليق لمقتطفات التعليمات البرمجية لتحديد أجزاء التعليمات البرمجية التي سيتم موجود في كل فصل فهو يأخذ فقط المقتطفات التي تمت رؤيتها في نهاية كل فصل وينتج نسخة جديدة من المصدر في gen/
، وهو دليل واحد لكل رمز فصل. (هذه أيضًا طريقة أسهل لعرض الكود المصدري حيث تم إزالة جميع تعليقات العلامات المشتتة للانتباه.)
وبعد ذلك، يمكن بناء كل منها على حدة. يجري:
$ make c_chapters
وفي الدليل build/
، ستحصل على ملف قابل للتنفيذ لكل فصل، مثل chap14_chunks
، وما إلى ذلك. وبالمثل:
$ make java_chapters
يؤدي ذلك إلى تجميع كود Java إلى ملفات classfiles في build/gen/
في دليل فرعي لكل فصل.
لدي مجموعة اختبار Lox كاملة أستخدمها للتأكد من أن المترجمين الفوريين في الكتاب يقومون بما يفترض بهم القيام به. تعيش حالات الاختبار في test/
. tool/bin/test.dart
عبارة عن مشغل اختبار يقوم بتشغيل كل ملف من ملفات الاختبار هذه على مترجم Lox، ويوزع النتيجة، ويتحقق من أن الاختبار يفعل ما هو متوقع منه.
هناك العديد من المترجمين الفوريين الذين يمكنك إجراء الاختبارات عليهم:
$ make test # The final versions of clox and jlox.
$ make test_clox # The final version of clox.
$ make test_jlox # The final version of jlox.
$ make test_c # Every chapter's version of clox.
$ make test_java # Every chapter's version of jlox.
$ make test_all # All of the above.
نرحب بك لاستخدام مجموعة الاختبار وعداء الاختبار لاختبار تطبيق Lox الخاص بك. يوجد عداء الاختبار في tool/bin/test.dart
ويمكن إعطاؤه مترجمًا مخصصًا قابلاً للتنفيذ لتشغيله باستخدام --interpreter
. على سبيل المثال، إذا كان لديك مترجم فوري قابل للتنفيذ في my_code/boblox
، فيمكنك اختباره على النحو التالي:
$ dart tool/bin/test.dart clox --interpreter my_code/boblox
لا تزال بحاجة إلى إخباره بمجموعة الاختبارات التي سيتم تشغيلها لأن ذلك يحدد توقعات الاختبار. إذا كان من المفترض أن يتصرف المترجم الفوري مثل jlox، فاستخدم "jlox" كاسم للمجموعة. إذا كان يتصرف مثل كلوكس، استخدم "كلوكس". إذا كان المترجم الفوري الخاص بك مكتملًا فقط حتى نهاية أحد فصول الكتاب، فيمكنك استخدام هذا الفصل كمجموعة، مثل "chap10_functions". راجع Makefile لمعرفة أسماء جميع الفصول.
إذا كان مترجمك يحتاج إلى وسائط سطر أوامر أخرى تم تمريرها لاستخدامها، فقم بتمريرها إلى مشغل الاختبار باستخدام --arguments
وسيتم إعادة توجيهها إلى مترجمك.
asset/
– ملفات Sass وقوالب jinja2 المستخدمة لإنشاء الموقع.book/
- ملفات تخفيض السعر لنص كل فصل.build/
- الملفات الوسيطة ومخرجات البناء الأخرى (باستثناء الموقع نفسه) تذهب هنا. غير ملتزم بـ Git.c/
- الكود المصدري لـ clox، المترجم المكتوب بلغة C. يحتوي أيضًا على مشروع XCode، إذا كان هذا هو الشيء الذي تفضله.gen/
- ملفات مصدر Java التي تم إنشاؤها بواسطة GenerateAst.java تذهب هنا. غير ملتزم.java/
- الكود المصدري لـ jlox، المترجم المكتوب بلغة Java.note/
- أبحاث وملاحظات ومهام متنوعة ومتنوعات أخرى.note/answers
- إجابات نموذجية للتحديات. لا الغش!site/
- الموقع النهائي الذي تم إنشاؤه. تعكس محتويات هذا الدليل موقع craftinginterpreters.com مباشرةً. يتم إنشاء معظم المحتوى هنا بواسطة build.py، لكن الخطوط والصور وJS موجودة هنا فقط. كل شيء ملتزم، حتى المحتوى الذي تم إنشاؤه.test/
- حالات اختبار لتطبيقات Lox.tool/
- حزمة Dart التي تحتوي على التصميم والاختبار والبرامج النصية الأخرى.