قصة الاستمرارية: مترجم Pascal الخاص بـ Windows من البداية

الترحيب الحار بشكل غير متوقع الذي قدمه جمهور Habr لمشاركتي حول برنامج التحويل البرمجي XD Pascal محلي الصنع لـ MS-DOS جعلني أعتقد. أليس مزعجًا أن مشروع الهواة ، الذي أعطيت له الكثير من الطاقة ، كان مثقلًا بالنسبة لي منذ الوقت الذي اختفى فيه جهاز DOS الظاهري تمامًا من Windows؟ كانت نتيجة انعكاسات المترجم XD Pascal لنظام التشغيل Windows . ربما فقد بعضًا من سحر الحنين وفقد إمكانية العمل الساذج مع الرسومات من خلال مقاطعة BIOS. ومع ذلك ، فإن الانتقال إلى Windows بث روحًا جديدة في المشروع وفتح الطريق أمام حلم طويل الأمد - تجميع الذات.

كما كان من قبل ، لم أستخدم أي أدوات مساعدة لإنشاء المحول البرمجي التلقائي. قد تبدو هذه العناد غريبة ، لكن المشروع كان له هدف واحد - سعادتي الخاصة ، وستكون الأدوات الإضافية بمثابة عقبة. في هذا المعنى ، تم تطوير المجمع من الصفر.



خمس خطوات للتجميع الذاتي على Windows


تجدر الإشارة إلى بضع كلمات حول المهام الرئيسية التي يجب حلها في الطريق من DOS إلى Windows:

تشكيل رؤوس وأقسام الملف القابل للتنفيذ. بالإضافة إلى الوصف الرسمي للتنسيق Portable Executable ، أصبحت المقالة " إنشاء أصغر ملف تنفيذي قابل للتنفيذ لـ PE" مساعدة ممتازة في هذه المرحلة. نظرًا لأن الرؤوس والأقسام تتطلب عناوين دقيقة للمتغيرات والإجراءات ، ولا يمكن العثور عليها إلا بعد حساب حجم الشفرة والبيانات العالمية ، كان يجب إجراء التجميع في ثلاث تمريرات. في التمريرة الأولى ، يتم إنشاء رسم بياني لمكالمات الإجراء وتمييز الإجراءات "الميتة" ؛ في الثانية ، يتم حساب العناوين والرمز وحجم البيانات ، يتم ملء الرؤوس ؛ في الثالث ، يتم إنشاء رمز. مثل kunshtuk لا ينضب ، خاصة بالنظر إلى أنه في كل مرة يتم تكرار جميع مراحل التجميع من جديد ، بدءًا من التحليل المعجمي. ومع ذلك ، فإنه يؤدي إلى رمز مصدر موجز للغاية للمترجم ولا يتطلب أي تمثيل وسيط للبرنامج. إضافة: يتم تنفيذ توليد الشفرة القابلة للنقل حاليًا ، ويتم التجميع مرة واحدة.

مولد رمز جديد. يتطلب التجميع لنظام التشغيل Windows استبدال أزواج سجلات إزاحة المقاطع بسجلات إزاحة 32 بت ، وكذلك إزالة (وإضافة في الأماكن) بادئات لتغيير طول المعامل (66 h) وطول العنوان (67 h).

التوجيه إلى الإعلان عن الوظائف الخارجية لواجهة برمجة تطبيقات Windows. يتم إدخال جميع أسماء الوظائف المعلنة بالتوجيه external في جداول قسم الاستيراد بالملف القابل للتنفيذ. نظرًا لأن هذه الوظائف تتطلب وسيطات عابرة من اليمين إلى اليسار ، فقد اضطررنا إلى عكس ترتيب الوسائط في الإعلان ومكالمات كل هذه الوظائف يدويًا. وبالتالي ، لم تعد هناك حاجة إلى الانقلاب عن طريق المترجم. من أجل البساطة ، يتم تمرير جميع الوسائط إلى الإجراءات والوظائف في XD Pascal كقيم 32 بت ؛ لحسن الحظ ، هذه القاعدة صالحة أيضًا لوظائف Windows API ، وبالتالي فإن التفاعل مع مكتبات النظام لم يعقد آلية تمرير الوسائط. إضافة: يتم الآن إجراء عكس ترتيب وسيطات الدوال المستوردة تلقائيًا.

إزالة مجموعات وعمليات سلسلة infix من التعليمات البرمجية المصدر. يرتبط هذا الشرط بمهمة التجميع الذاتي. تم تصميم حساب أي تعبيرات في XD Pascal بحيث تكون النتائج المتوسطة بطول 32 بت ويتم تخزينها على المكدس. بالنسبة لسلاسل ومجموعات Pascal ، فإن هذا النهج غير مقبول. بتعبير أدق ، كان سيتيح للمجموعات أن يصل حجمها إلى 32 عنصرًا ، لكن مثل هذه المجموعات كانت بلا فائدة عمليًا. إضافة: تم الآن دعم عمليات السلسلة وإعداد ما يصل إلى 256 عنصرًا في الحجم.

أغلفة لبعض الإجراءات. أدت فكرة التجميع الذاتي إلى التفاف المكالمات إلى بعض الإجراءات في المكتبة القياسية. توقيع المجمع هو نفسه بالنسبة لحالات التجميع بواسطة مترجم خارجي (Delphi / Free Pascal) والتجميع الذاتي ؛ الإجراءات ملفوفة تختلف. وبالتالي ، يتم ترجمة كافة تفاصيل طريقة التحويل البرمجي داخل العديد من الأغلفة. تزخر Pascal بالإجراءات التي ، عند الفحص الدقيق ، يتضح أنه من المستحيل تنفيذها وفقًا لقواعد Pascal نفسها: Read Write Move ، إلخ. بالنسبة إلى الإجراءات الأكثر شيوعًا ، بما في ذلك Read Write ، قمت بإجراء استثناء وقمت بتنفيذها بشكل غير نموذجي لقواعد اللغة ، لكنني مألوفة لدى أي خبير في Pascal. بالنسبة لمعظم الإجراءات الأخرى غير النموذجية ، كانت الأغلفة مطلوبة. وبالتالي ، فإن XD Pascal غير متوافق تمامًا مع Delphi أو Free Pascal ، لكن هذه ليست مشكلة كبيرة ، حيث أن Free Pascal نفسها في وضع التوافق مع Delphi تظل في الواقع غير متوافقة. إضافة: يتم الآن دعم وسيطات متغير رسمي غير مطبوع. هذا يسمح بإجراء الإجراءات BlockRead ، BlockWrite ، Move ، FillChar متوافقة مع Delphi و Free Pascal ، وبالتالي تقليل عدد الأغلفة المطلوبة بشكل جذري.

تجميع البرامج مع واجهة المستخدم الرسومية


تظل مهمة التجميع الذاتي ، على الرغم من معناه الرمزي ، محدودة: المترجم عبارة عن برنامج وحدة تحكم وبالتالي لا يبدو أنه ساكن كامل في عالم Windows. استغرق الأمر بضعة ابتكارات أخرى على الطريق إلى تجميع البرامج باستخدام واجهة نافذة:

التوجيه إلى المترجم لضبط نوع الواجهة. يجب تحديد نوع الواجهة (وحدة التحكم أو الرسومية) في حقل رأس منفصل للملف القابل للتنفيذ. كما تعلمون ، في دلفي وباسكال الحرة لهذا هناك توجيه $APPTYPE . ظهر توجيه $A مماثل في XD Pascal.

تشغيل أخذ عنوان الإجراءات والوظائف. في باسكال الكلاسيكية لا توجد مؤشرات كاملة للإجراءات والوظائف - يتم استبدالها إلى حد ما بنوع إجرائي. لم يتم تطبيق هذا النوع في XD Pascal. مهما كان الأمر كذلك ، فإن تطبيق @ العملية على الإجراءات في مشروعي المتواضع بدا لي عديم الفائدة. ومع ذلك ، تعتمد معالجة أحداث Windows API على عمليات الاسترجاعات ، وهنا أصبح نقل عنوان إجراء معالج يسمى فجأة حاجة ملحة. إضافة: يضيف XD Pascal الآن الدعم الكامل للنوع الإجرائي.

تحديد صراحة أسماء المكتبات المرتبطة. بالنسبة لبرامج وحدة التحكم ، كان استيراد وظائف Windows API من مكتبة KERNEL32.DLL كافيًا. تم سحب البرامج ذات واجهة المستخدم الرسومية USER32.DLL و GDI32.DLL ، إلخ. كان من الضروري توسيع بناء جملة التوجيه external عن طريق إضافة اسم المكتبة هناك.


واجهة المستخدم الرسومية التجريبي

ما هي النتيجة


والنتيجة هي برنامج تجميع ذاتي بسيط للغاية لنظام Windows. من غير المرجح مقارنتها بشكل صحيح بمشاريع جماعية قوية مثل Free Pascal. بدلا من ذلك ، فهو يقع في فئة الوزن للهواة الشهيرة BeRo Tiny Pascal . مقارنةً به ، يتمتع XD Pascal بمزايا ملحوظة: يتم ملاحظة قواعد قواعد Pascal بشكل صارم والتحكم في الأخطاء ، هناك إدخال / إخراج كامل للملفات ، ويدعم حساب أرقام الفاصلة العائمة ، ولا يوجد اعتماد على المجمع الخارجي ، ولا يُسمح بتجميع البرامج مع واجهة النافذة.

بعد ذلك ، لا بد لي من التعامل مع الإيجابيات الخاطئة لبعض برامج مكافحة الفيروسات - وهي مشكلة جديدة لم أفكر فيها في عالم MS-DOS المريح الصغير. إذا كنت محظوظًا ، سيتم تقديم XD Pascal ، إلى جانب BeRo Tiny Pascal ، في ورشة عمل مخبرية حول تصميم برنامج التحويل البرمجي في MSTU. NE بومان.

Source: https://habr.com/ru/post/ar462889/


All Articles