IP Pascal

IP Pascal هو تطبيق للغة البرمجة باسكال باستخدام منصة قابلية نقل IP، وهي نظام متعدد الأجهزة وأنظمة التشغيل وتطبيقات اللغات. وهو يُطبّق لغة "Pascaline" (المسماة نسبةً إلى آلة حاسبة بليز باسكال)، وقد اجتاز مجموعة أدوات التحقق من صحة باسكال.

تستند هذه المقالة إلى إصدار قديم نسبيًا من لغة باسكالين. يوجد إصدار أحدث منها باسم باسكال-بي 6، وهو جزء من سلسلة باسكال-بي. انظر المراجع أدناه.

ملخص

تُطبّق لغة IP Pascal لغة "Pascaline" (نسبةً إلى آلة حاسبة بليز باسكال )، وهي مجموعة موسعة للغاية من لغة ISO 7185 Pascal. تُضيف هذه اللغة نمطيةً مع تحكم في مساحة الأسماء ، بما في ذلك مفهوم مراقبة المهام المتوازية ، والمصفوفات الديناميكية ، والتحميل الزائد والتجاوز، والكائنات ، ومجموعة من الإضافات الأخرى للغة. كما تُطبّق IP منصة نقل، تتضمن مجموعة أدوات واجهة المستخدم الرسومية ، ومكتبة TCP/IP ، ومكتبة MIDI والصوت، ووظائف أخرى، مما يسمح بنقل البرامج المكتوبة بلغة IP Pascal، ولغة IP Pascal نفسها، إلى أنظمة تشغيل وأجهزة متعددة.

تُعد IP Pascal واحدة من تطبيقات Pascal القليلة التي لا تزال موجودة والتي اجتازت مجموعة التحقق من صحة Pascal، وهي مجموعة كبيرة من الاختبارات التي تم إنشاؤها للتحقق من الامتثال لمعيار ISO 7185 Pascal.

على الرغم من أن لغة باسكالين تُوسّع معيار ISO 7185 باسكال، إلا أنها لا تُقلّل من أمان أنواع البيانات في باسكال (كما فعلت العديد من لهجات باسكال الأخرى بإضافة ما يُسمى "هروب الأنواع"). تتشابه وظائف اللغة مع وظائف لغة سي شارب (التي تُنفّذ لغة شبيهة بلغة سي++ ولكن مع إزالة ثغرات أمان الأنواع)، ويمكن استخدام باسكالين في أي مكان يُمكن فيه استخدام البرامج المُدارة (على الرغم من أنها مبنية على لغة أقدم من سي شارب بثلاثين عامًا).

لغة

يبدأ بروتوكول الإنترنت باسكال (IP Pascal) بمعيار ISO 7185 باسكال (الذي قام بتوحيد لغة نيكلاوس ويرث الأصلية)، ويضيف ما يلي:

تقوم الوحدات، بما في ذلك هياكل المهام المتوازية، بمعالجة البيانات ومراقبتها ومشاركتها.

وحدة mymod(input, output)؛ تستخدم extlib؛ ثابت واحد = 1؛ نوع سلسلة = مصفوفة مضغوطة من الأحرف؛ إجراء wrtstr( عرض s: سلسلة)؛ متغير خاص s: سلسلة؛ إجراء wrtstr( عرض s: سلسلة)؛ متغير i: عدد صحيح؛ ابدأ من أجل i := 1 إلى max(s) do اكتب(s[i]) نهاية ؛ ابدأ { تهيئة الشاشة } نهاية ؛ ابدأ { إيقاف تشغيل الشاشة } نهاية .

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

يجب أن تشغل الوحدات ملفًا واحدًا، وتُشير الوحدات إلى وحدات أخرى عبر عبارة `uses` أو `joins` . وللسماح بذلك، يجب أن تحمل الوحدة نفس اسم ملفها. تُشير عبارة `uses` إلى دمج التصريحات العامة للوحدة المُشار إليها مع الوحدة المُشيرة، وأي تعارض في الأسماء سينتج عن ذلك سيؤدي إلى حدوث خطأ. أما عبارة `joins` فتُتيح الوصول إلى الوحدة المُشار إليها عبر الوحدة المُشيرة، ولكنها لا تدمج مساحات أسماء الوحدتين. بدلًا من ذلك، يجب على الوحدة المُشيرة استخدام ما يُسمى "المُعرّف المؤهل".

معرف الوحدة

يُشابه البرنامج المكتوب بلغة باسكال ISO 7185 وحدةً برمجيةً تمامًا، وهو في الواقع وحدة برمجية بدون قسم خروج. ولأن جميع الوحدات البرمجية في النظام مُتصلةٌ على التوالي بحيث تُنفَّذ كلٌّ منها بالتسلسل، فإن البرنامج يتولى زمام الأمور في البرنامج لمجرد أنه لا يُنهي عملية التهيئة إلا بعد اكتمال وظيفته بالكامل، على عكس الوحدة البرمجية التي تُنهيها. في الواقع، من الممكن أن يحتوي البرنامج على أقسام برمجية متعددة تُنفَّذ بالتتابع.

وحدة المعالجة ، مثل وحدة البرنامج ، تحتوي فقط على قسم تهيئة، وتُنفَّذ وظائفها الأساسية (البدء، والتنفيذ الكامل، والإكمال) في هذا القسم. ومع ذلك، تحصل على خيط تنفيذ خاص بها منفصل عن الخيط الرئيسي الذي يُشغِّل وحدات البرنامج . ولذلك، لا يمكنها استدعاء سوى وحدات المراقبة والمشاركة .

جهاز المراقبة هو وحدة تتضمن قفل المهام في كل استدعاء لإجراء أو وظيفة يمكن الوصول إليها خارجيًا ، وينفذ الاتصال بين المهام عن طريق الإشارات.

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

نظرًا لأن نظام الوحدات يُطبّق تعدد المهام/الخيوط مباشرةً باستخدام مفهوم المُراقب ، فإنه يحلّ معظم مشاكل الوصول في تعدد الخيوط. ترتبط بيانات الوحدة بالشيفرة باستخدام الأقفال المتبادلة أو الأقسام الحصرية المتبادلة . تبدأ المهام الفرعية/الخيوط الفرعية بشفافية مع وحدة العملية. يمكن لعدة مهام فرعية/خيوط فرعية الوصول إلى المُراقب أو مشاركة الوحدات. وحدة المشاركة هي وحدة بدون بيانات، ولا تحتاج إلى آليات القفل الخاصة بالمُراقب.

المصفوفات الديناميكية

في لغة IP Pascal، تُعتبر المصفوفات الديناميكية بمثابة "حاويات" للمصفوفات الثابتة. ونتيجةً لذلك، ربما تكون IP Pascal هي لغة Pascal الوحيدة التي تتوافق فيها المصفوفات الديناميكية تمامًا مع المصفوفات الثابتة وفقًا لمعيار ISO 7185 من اللغة الأصلية. يمكن تمرير مصفوفة ثابتة كمعامل مصفوفة ديناميكية إلى إجراء أو دالة، أو إنشاؤها باستخدام متغيرات جديدة.

برنامج اختبار(مخرجات)؛ نوع سلسلة = مصفوفة مضغوطة من الأحرف؛ متغير s: سلسلة؛ إجراء كتابة سلسلة( عرض s: سلسلة)؛ متغير i: عدد صحيح؛ ابدأ من أجل i := 1 إلى الحد الأقصى(s) افعل اكتب(s[i]) نهاية ؛ ابدأ جديد(s ، 12)؛ s := 'Hello, world'; wrtstr(s^); wrtstr('That's all folks') end .

يمكن أن تحتوي مصفوفات "الحاويات" هذه على أي عدد من الأبعاد.

التعبيرات الثابتة

يمكن أن يحتوي تعريف الثابت على تعبيرات عن ثوابت أخرى.

const b = a+10;

أساس الأعداد

$ff, &76, %011000

تسميات الانتقال الأبجدية الرقمية

تسمية المخرج؛ الانتقال إلى المخرج؛

ضع خطًا سفليًا في جميع التسميات

var my_number: integer;

ضع خطاً تحت الأرقام

أ := 1234_5678؛

يمكن استخدام رمز الفاصلة (_) في أي مكان في الرقم باستثناء الرقم الأول. يتم تجاهله، ووظيفته الوحيدة هي فصل الأرقام في الرقم.

تسلسلات الأحرف الخاصة التي يمكن تضمينها في السلاسل الثابتة

const str = 'the rain in Spain\cr\lf';

باستخدام أساليب التذكر القياسية ISO 8859-1 .

تكرار الرؤوس المُعاد توجيهها

الإجراء x(i : عدد صحيح)؛ للأمام ؛ ... الإجراء x(i : عدد صحيح)؛ ابدأ ... نهاية ؛

وهذا يجعل من السهل الإعلان عن إعادة التوجيه عن طريق القص واللصق، ويحافظ على معلمات الإجراء أو الوظيفة في الرأس الفعلي حيث يمكن رؤيتها.

إيقاف الإجراء

إجراء خطأ ( عرض s: سلسلة نصية)؛ ابدأ كتابة سطر ('*** خطأ: ', s:0)؛ توقف { إنهاء البرنامج } نهاية ؛

ملفات رأسية خاصة محددة مسبقًا

برنامج myprog(input , output, list); ابدأ كتابة (list, 'بداية القائمة:'); ...
برنامج echo(output, command); متغير c: حرف؛ ابدأ بينما لم ينتهِ سطر الأمر (command) نفّذ ابدأ اقرأ (command, c)؛ اكتب(ج) نهاية ؛ اكتب سطرًا نهاية .
برنامج جديد (مدخلات، مخرجات، خطأ)؛ ابدأ ... writeln (error, 'Bad parameter'); وقف ...

"command" هو ملف يتصل بسطر الأوامر، بحيث يمكن قراءته باستخدام عمليات قراءة الملفات العادية.

الربط التلقائي لملفات رأس البرنامج بأسماء سطر الأوامر

برنامج نسخ (المصدر، الوجهة)؛ متغير المصدر، الوجهة: نص؛ ج: حرف؛ ابدأ إعادة ضبط (المصدر)؛ أعد كتابة (الوجهة) ؛ طالما لم يصل الملف المصدر إلى نهايته، ابدأ؛ طالما لم يصل سطر جديد في الملف المصدر، ابدأ اقرأ(المصدر، ج)؛ اكتب(الوجهة ، ج) نهاية ؛ اقرأ(المصدر) ؛ اكتب (الوجهة) نهاية نهاية .

يتم ربط ملفات "المصدر" و"الوجهة" تلقائيًا بالمعلمات الموجودة في سطر الأوامر الخاص بالبرنامج.

عمليات تسمية الملفات ومعالجتها

برنامج extfile ( الإخراج ) ؛ متغير f : ملف من نوع عدد صحيح ؛ ابدأ تعيين ( f ، 'myfile' ) ؛ { تعيين اسم الملف الخارجي } تحديث ( f ) ؛ { الاحتفاظ بالملف الحالي، وتعيينه لوضع الكتابة } موضع ( f ، طول ( f )) ؛ { موضع نهاية الملف للإضافة إليه } كتابة سطر جديد ( 'نهاية الملف هي: ' ، موقع ( f )) ؛ { إخبار المستخدم بموقع العنصر الجديد } كتابة ( f ، 54321 ) ؛ { كتابة العنصر الأخير الجديد } إغلاق ( f ) { إغلاق الملف } نهاية .

التصريحات الثابتة التي تُعلن عن أنواع الثوابت المهيكلة

جدول ثابت : مصفوفة [1..5] من السجل أ: عدد صحيح؛ مصفوفة مضغوطة [1..10] من الأحرف نهاية = مصفوفة السجل 1، 'data1' نهاية ، السجل 2، 'data2' نهاية ، السجل 3، 'data3' نهاية ، السجل 4، 'data4' نهاية ، السجل 5، 'data5' نهاية نهاية ؛

عوامل التشغيل المنطقية للبت

برنامج اختبار؛ متغيرات a و b: عدد صحيح؛ ابدأ a := a و b؛ b := b or $a5; أ := ليس ب؛ b := a xor b end .

متغيرات النطاق الموسع

اختبار البرنامج فار أ: عدد صحيح؛ ب: عدد أساسي؛ ج: عدد رئيسي؛ د: 1..maxint*2; ...

تُحدد مواصفات النطاق الموسع قواعد للأعداد العددية التي تقع خارج نطاق -maxint..maxint. يختلف الحد الأقصى لحجم العدد الممكن باختلاف التنفيذ، لكن لغة باسكالين تُعرّف سلسلة من الأنواع القياسية التي تستغل النطاقات الموسعة، بما في ذلك linteger للأعداد الصحيحة ذات النطاق المزدوج، وcardinal للأعداد الصحيحة غير الموقعة، وlcardinal للأعداد الصحيحة غير الموقعة ذات النطاق المزدوج. كما تُعرّف باسكالين حدودًا جديدة لهذه الأنواع، مثل maxlint و maxcrd و maxlcrd .

إشارات المرور

اختبار المراقبة ؛ متغير notempty، notfull: إشارة؛ إجراء enterqueue؛ ابدأ بينما nodata do wait(notempty)؛ ... signalone(notfull) نهاية ؛ ... بداية نهاية .

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

تجاوزات

وحدة اختبار 1؛ إجراء افتراضيابدأ ... نهاية ؛
برنامج الاختبار؛ ينضم إلى الاختبار 1؛ تجاوز الإجراءابدأ الموروث x نهاية ؛ ابدأ نهاية .

يؤدي تجاوز إجراء أو دالة في وحدة نمطية أخرى إلى "ربط" هذا الإجراء، واستبدال تعريفه لجميع مستدعيه، مع إتاحة التعريف الأصلي للوحدة النمطية التي قامت بالربط. وهذا يسمح للوحدة النمطية المتجاوزة بإضافة وظائف جديدة إلى الإجراء أو الدالة القديمة. ويمكن تطبيق ذلك على أي مستوى.

الأحمال الزائدة

الإجراءابدأ نهاية ؛ تحميل زائد للإجراء x(i : عدد صحيح)؛ ابدأ نهاية ؛ تحميل زائد للدالة x: عدد صحيح؛ ابدأ xx:= 1 نهاية ؛

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

أشياء

اختبار البرنامج ؛ يستخدم الفئة الأساسية؛ الفئة ألفا؛ تمتد من بيتا؛ النوع ألفا_ريف = مرجع إلى ألفا؛ المتغير أ، ب: عدد صحيح؛ التالي: alpha_ref; إجراء افتراضي x(d : عدد صحيح)؛ ابدأ aa:= d; selfl:= next نهاية ؛ خاص فار س: عدد صحيح؛ تبدأ النهاية . فار ص: alpha_ref؛ يبدأ جديد(r)؛ ... إذا كانت r هي ألفا فإن ra := 1؛ rx(5); ... نهاية .

في لغة باسكالين، تُعدّ الأصناف نسخة ديناميكية من الوحدة (والوحدات نسخة ثابتة من الأصناف). الأصناف هي بنية برمجية (وليست نوعًا) تقع بين الوحدات والإجراءات والدوال. ولأن الصنف وحدة، فإنه يستطيع تعريف أي بنية برمجية، مثل الثوابت والأنواع والمتغيرات والإجراءات والدوال (التي تُصبح "أساليب")، وجعلها عامة لجميع مستخدمي الصنف، أو إخفائها باستخدام الكلمة المفتاحية "private". وبما أن الصنف وحدة، فإنه يُمكن الوصول إليه عبر مُعرّف مُؤهّل.

تتمتع الفئات كوحدات نمطية بوصول تلقائي إلى مساحة اسمها، كما هو الحال في لغتي C# وC++، حيث لا تتطلب أي تحديد. خارج الفئة، يمكن الوصول إلى جميع عناصرها إما باستخدام مُعرّف مؤهل أو عن طريق مرجع. المرجع هو مؤشر إلى الكائن الذي يتم إنشاؤه وفقًا للفئة. يمكن إنشاء أي عدد من مثيلات الفئة، والمعروفة باسم "الكائنات"، باستخدام عبارة new()، وإزالتها باستخدام عبارة dispose(). يجب الوصول إلى عناصر الفئة التي تحتوي على بيانات مثيل مرتبطة بها، مثل المتغيرات (أو الحقول) والأساليب، عبر مرجع. المرجع هو نوع، ويشبه المؤشر، بما في ذلك إمكانية أن تكون قيمته nil، والتحقق من التساوي مع أنواع المراجع الأخرى. ليس من الضروري تحديد الوصول إلى المؤشر باستخدام "^".

تُطبّق مكتبة باسكالين مفهوم "الوصول المرجعي" للسماح للمرجع بالوصول إلى أي جزء من الكائن بغض النظر عما إذا كان خاصًا بكل نسخة أم لا. تُمكّن هذه الخاصية من "ترقية" أعضاء الفئة، أي نقلهم من الثوابت إلى المتغيرات، ثم إلى "الخصائص" (وهي حقول الفئة التي تُوفّر دوال "get" و"set" إمكانية قراءتها وكتابتها).

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

يمكن لأساليب الكائنات تغيير المرجع المستخدم للوصول إليها باستخدام الكلمة selfالمفتاحية.

يتم تطبيق نظام الوراثة الفردية فقط.

معالجة الاستثناءات المنظمة

يحاول ... باستثناء ... وإلا ...؛ يرمي

يمكن لعبارة "try" حماية سلسلة من التعليمات، ويتم توجيه أي استثناءات يتم رصدها داخل الكود إلى العبارة التي تلي "except". كما تتضمن عبارة "try" شرط "else" الذي يسمح بتنفيذ عبارة عند انتهاء كتلة "try" بشكل طبيعي.

تُثار الاستثناءات في الكود عبر الإجراء throw(). تسمح عبارات try للبرنامج بالخروج من أي كتلة متداخلة، وتُعدّ بديلاً أفضل لعبارات goto داخل الإجراء (التي لا تزال مدعومة في Pascaline). بما أن الاستثناءات غير المعالجة تُولّد أخطاءً افتراضيًا، يُمكن استخدام الإجراء throw() كنظام عام للإبلاغ عن الأخطاء.

التأكيدات

تحقق من التعبير.

يؤدي إجراء النظام assert إلى إنهاء البرنامج إذا كانت القيمة المختبرة خاطئة. وعادةً ما يرتبط هذا الإجراء بملف تفريغ أو تشخيص وقت التشغيل، ويمكن إزالته باستخدام خيار المُصرّف.

يونيكود

يمكن للغة IP Pascal إنشاء برامج بنمط ISO 8859-1 (أحرف 8 بت) أو بنمط Unicode بمجرد تبديل بسيط أثناء الترجمة (على عكس العديد من اللغات الأخرى، لا يوجد فرق في الكود المصدري بين برامج Unicode والبرامج الأخرى). يُستخدم تنسيق UTF-8 المتوافق مع ASCII في ملفات النصوص، وتُقرأ هذه الملفات من وإلى أحرف 8 أو 16 بت داخل البرنامج (يتم تحويل الأحرف الـ 128 العليا من ISO 8859-1 من وإلى تنسيق UTF-8 في ملفات النصوص حتى في البرامج المشفرة بأحرف 8 بت).

ثابت للحد الأعلى للأحرف

على غرار maxint، تحتوي Pascaline على maxchr، وهو أقصى حرف موجود في مجموعة الأحرف (وقد لا يكون له تمثيل رسومي). يُعرَّف نطاق نوع char على أنه 0..maxchr. تُعد هذه إضافة مهمة للتعامل مع أنواع مثل "مجموعة من الأحرف"، وتُسهِّل التعامل مع خيارات مجموعات الأحرف المختلفة (مثل ISO 8859-1 أو Unicode).

بنية معيارية

تستخدم لغة IP Pascal مفهومًا فريدًا لتكديس الوحدات البرمجية. تُكدس كل وحدة فوق الأخرى في الذاكرة، وتُنفذ في الأسفل. تستدعي الوحدة السفلية الوحدة التي تليها، وتستدعي تلك الوحدة الوحدة التي تليها، وهكذا.

إزار مكتبة serlib برنامج كاب

تُنهي وحدة المعالجة المركزية (التي تُسمى أحيانًا "خلية" في مصطلحات IP Pascal، نسبةً إلى مفهوم في تصميم الدوائر المتكاملة ) سلسلة التعليمات، وتبدأ عملية إرجاع تتكرر نزولًا حتى ينتهي البرنامج. يتم تنفيذ قسم بدء التشغيل أو الدخول لكل وحدة أثناء صعودها في سلسلة التعليمات، بينما يتم تنفيذ قسم الإنهاء أو الخروج أثناء نزولها.

يتوافق هذا مع التبعيات الطبيعية في البرنامج. تقوم الوحدات الأساسية، مثل دعم الإدخال/الإخراج الأساسي في "serlib"، بتهيئتها أولاً، وإنهاءها أخيراً، قبل وبعد الوحدات ذات المستوى الأعلى في المكدس.

منصة النقل

يحتوي IP Pascal على سلسلة من الوحدات (أو "المكتبات") التي تُشكّل "منصة نقل" تُسمى Petit-Ami (كلمة فرنسية تعني "الصديق الصغير"). تُقدّم هذه المكتبات واجهة برمجة تطبيقات مثالية لكل وظيفة قابلة للتطبيق، مثل الملفات ووظائف نظام التشغيل المُوسّعة، والرسومات، وMIDI والصوت، وما إلى ذلك. تُشكّل المجموعة بأكملها أساسًا للتنفيذ على كل نظام تشغيل وجهاز يظهر عليه IP Pascal.

الفرقان المهمان بين لغة IP Pascal والعديد من اللغات الأخرى التي تم دمجها ببساطة مع مكتبات الرسومات المحمولة هما:

  1. يستخدم نظام IP Pascal منصة نقل خاصة به لبرمجته منخفضة المستوى، بحيث بمجرد إنشاء المنصة لنظام تشغيل وجهاز معينين، يمكن تشغيل كل من نظام IP والبرامج التي يُجمّعها عليه. يشبه هذا آلية عمل أنظمة Java و UCSD Pascal ، ولكن مع استخدام كود مُجمّع عالي الكفاءة، وليس كودًا مُفسّرًا أو مُجمّعًا "في الوقت المناسب".
  2. بما أن الوحدات البرمجية قادرة على تجاوز وظائف المستوى الأدنى، مثل عبارة "write" في لغة باسكال، فإن برامج باسكال العادية غير المعدلة المتوافقة مع معيار ISO 7185 تستطيع أيضًا الاستفادة من الجوانب المتقدمة لمنصة النقل. وهذا يختلف عن العديد من مكتبات الرسومات المحمولة، أو معظمها، التي تجبر المستخدم على استخدام منهجية إدخال/إخراج مختلفة تمامًا للوصول إلى نظام رسومات ذي نوافذ، كما هو الحال في لغة C، ولغات باسكال الأخرى، وفيجوال بيسك .

يمكن أيضاً إنشاء وحدات IP مستقلة عن النظام، وتعتمد فقط على وحدات منصة النقل. والنتيجة هي أن IP Pascal يتمتع بدرجة عالية من قابلية النقل.

مثال: يتم ربط برنامج "مرحباً بالعالم" القياسي بالإخراج في نافذة رسومية.

برنامج HelloWorld(output)؛ ابدأ اكتب ('Hello, World!') نهاية .

مثال: "مرحباً بالعالم" مع إضافة أوامر رسومية. لاحظ أنه لا تزال تُستخدم عبارات الإخراج القياسية في لغة باسكال.

برنامج hello ( مدخل ، مخرج ) ؛ يستخدم gralib ؛ متغير er : evtrec ؛ ابدأ bcolor ( مخرج ، أخضر ) ؛ curvis ( مخرج ، خطأ ) ؛ auto ( مخرج ، خطأ ) ؛ page ( مخرج ) ؛ fcolor ( مخرج ، أحمر ) ؛ frect ( مخرج ، 50 ، 50 ، maxxg ( مخرج ) - 50 ، maxyg ( مخرج ) - 50 ) ؛ fcolorg ( مخرج ، maxint ، maxint - ( maxint div 3 ) ، maxint - maxint div 3 ) ؛ frect ( مخرج ، 50 ، 50 ، 53 ، maxyg ( مخرج ) - 50 ) ؛ frect ( مخرج ، 50 ، 50 ، maxxg ( مخرج ) - 50 ، 53 ) ؛ fcolorg ( output , maxint div 2 , 0 , 0 ) ; frect ( output , 52 , maxyg ( output ) - 53 , maxxg ( output ) - 50 , maxyg ( output ) - 50 ) ; frect ( output , maxxg ( output ) - 53 , 52 , maxxg ( output ) - 50 , maxyg)( الناتج ) - 50 ) ؛ الخط ( الناتج ، خط_الإشارة ) ؛ حجم_الخط ( الناتج ، 100 ) ؛ رؤية_الخطوط ( الناتج ) ؛ لون_الخط ( الناتج ، سماوي ) ؛ تنظيم_المؤشر ( الناتج ، أقصى حجم ( الناتج ) القسم 2 - حجم_السلسلة ( الناتج ، 'مرحباً، العالم' ) القسم 2 + 3 ، أقصى حجم ( الناتج ) القسم 2 - 100 القسم 2 + 3 ) ؛ كتابة_السطر ( 'مرحباً، العالم' ) ؛ لون_الخط ( الناتج ، أزرق ) ؛ تنظيم_المؤشر ( الناتج ، أقصى حجم ( الناتج ) القسم 2 - حجم_السلسلة ( الناتج ، 'مرحباً، العالم' ) القسم 2 ، أقصى حجم ( الناتج ) القسم 2 - 100 القسم 2 ) ؛ كتابة_السطر ( 'مرحباً، العالم' ) ؛ كرر الحدث ( الإدخال ، er ) حتى er . etype = etterm end .
مثال: لعبة الهروب من السيارة.
مثال: ساعة رسومية في نافذة كبيرة الحجم.

بما أن وحدات IP Pascal قادرة على "تجاوز" بعضها البعض، فإن وحدة التوسعة الرسومية (أو أي نوع آخر من الوحدات) يمكنها تجاوز استدعاءات الإدخال/الإخراج القياسية المُنفذة في وحدة أدنى منها. وبالتالي، تُنفذ مكتبة paslib عبارات Pascal القياسية مثل القراءة والكتابة وخدمات الدعم الأخرى. أما مكتبة gralib فتتجاوز هذه الخدمات وتُعيد توجيه جميع عمليات الإدخال/الإخراج القياسية في Pascal إلى النوافذ الرسومية.

يكمن الفرق بين هذه المكتبة والمكتبات المماثلة في التطبيقات الأخرى في أنك عادةً ما تضطر إلى التوقف عن استخدام عبارات الإدخال/الإخراج القياسية والتحول إلى مجموعة مختلفة تمامًا من الاستدعاءات والنماذج. هذا يعني أنه لا يمكنك نقل البرامج المُنفذة باستخدام نموذج الإدخال/الإخراج التسلسلي إلى الأنظمة الرسومية.

يُعدّ استخدام أساليب اللغة الإجرائية للوصول إلى مكتبة الرسومات ذات النوافذ فرقًا هامًا آخر بين لغة IP Pascal ولغة IP Pascal. تفرض معظم مجموعات أدوات الرسومات استخدام أساليب البرمجة كائنية التوجه . أحد أسباب ذلك هو ملاءمة البرمجة كائنية التوجه للرسومات، بالإضافة إلى أن أنظمة التشغيل الشائعة، مثل ويندوز، تُجبر برنامج التطبيق على الظهور كبرنامج خدمة لنظام التشغيل، أي كمجموعة من الدوال التي يستدعيها نظام التشغيل، بدلًا من أن يتحكم البرنامج بتنفيذه بنفسه ويستدعي نظام التشغيل. يُعرف هذا عادةً بتصميم الاستدعاءات . غالبًا ما يكون أداء الكود الموجه للكائنات أفضل مع الاستدعاءات، لأنه يسمح باستدعاء أساليب الكائن كاستدعاءات، بدلًا من أن يُسجّل المبرمج عدة مؤشرات إلى دوال لمعالجة الأحداث، كل منها يُمثّل استدعاءً منفصلًا.

يجعل نظام IP Pascal البرمجة الكائنية التوجه منهجية اختيارية، وليست إلزامية، لكتابة البرامج. وبفضل قدرة IP Pascal على استخدام الأساليب الإجرائية للوصول إلى جميع وظائف الرسومات، لا توجد مشكلة " الانهيار المفاجئ " للبرامج القديمة، فلا حاجة لإعادة كتابتها لمجرد الاستفادة من بيئات البرمجة الحديثة.

تدعم منصة نقل بروتوكول الإنترنت وضع الأحرف، حتى في البيئات الرسومية، من خلال توفير "شبكة أحرف" تُغطي شبكة البكسل. وتعمل البرامج التي تستخدم استدعاءات وضع الأحرف فقط (والتي تعمل على أي طرفية أو اتصال Telnet) تلقائيًا في البيئات الرسومية.

تاريخ

تطبيق Z80

بدأ تطوير هذا المترجم في عام 1980 على نظام التشغيل Micropolis Disk، ثم نُقل سريعًا إلى نظام CP/M الذي يعمل على معالج Z80. تمت برمجة النظام الأصلي بلغة التجميع الخاصة بمعالج Z80، وكان يُخرج رمز الآلة مباشرةً إلى هذا المعالج . كان المترجم أحادي المرور، بدون رابط، حيث كان يُضمّن مكتبة دعم النظام داخله، ثم ينقلها ويُخرجها إلى الكود المُولّد في ملف القرص القابل للتنفيذ.

بعد تشغيل المُصرّف، بالتزامن تقريبًا مع بداية عام ١٩٨٠، كُتب مُجمّع مُصاحب له بلغة باسكال، تلاه رابط بلغة تجميع Z80. يعود هذا المزيج غير المألوف إلى حسابات أظهرت أن جداول الرابط ستُمثّل مشكلة في معالج  Z80 ذي الذاكرة المحدودة بـ ٦٤ كيلوبايت، لذا كان من الضروري أن يكون الرابط بأصغر حجم ممكن. استُخدم هذا بعد ذلك لنقل شفرة المصدر الخاصة بالمُصرّف والرابط من مُجمّع ميكروبوليس (وهو مُجمّع بدون رابط يُنتج ملفًا ثنائيًا واحدًا) إلى نظام رابط المُجمّع الجديد.

بعد ذلك، تم إعادة تصميم المترجم لإخراج البيانات بتنسيق الرابط، وتم نقل مكتبة الدعم إلى ملف منفصل وربطها.

في عام ١٩٨١، أُعيد تصميم المُصرّف بشكلٍ شامل لإضافة تحسينات، مثل تخصيص السجلات، واستخدام القيم المنطقية للقفز، ومعالجة التعليمات البرمجية غير المستخدمة، وطي الثوابت، وغيرها من التحسينات. وقد أدى ذلك إلى إنشاء تطبيق باسكال تفوق في الأداء على جميع مُصرّفات Z80 الموجودة آنذاك، بالإضافة إلى معظم مُصرّفات 8086. مع ذلك، وبحجم ٤  كيلوبايت، كان استخدامه صعبًا، إذ لم يكن قادرًا على تجميع سوى بضع صفحات من التعليمات البرمجية المصدرية قبل امتلاء جداوله (وهي مشكلة شائعة في معظم تطبيقات باسكال على معالجات ذات عناوين صغيرة). وقد أمكن استخدام النظام بشكلٍ أساسي بفضل قرار إنشاء رابط مُدمج سمح ببناء أنظمة كبيرة من هذه الملفات الكائنية الصغيرة.

على الرغم من ذلك، استمر استخدام تطبيق IP Pascal الأصلي حتى عام 1987 كمترجم للأغراض العامة. في هذه المرحلة، كان IP Pascal مشابهًا للغة C في تصميمه المعياري. كان كل ملف مصدر وحدةً مستقلة، ويتألف من مزيج من وحدة "برنامج"، وأنواع، وثوابت، ومتغيرات، وإجراءات، أو دوال. كانت هذه العناصر بتنسيق "حر". يمكن أن تكون الإجراءات والدوال والأنواع والثوابت والمتغيرات خارج أي كتلة، وبأي ترتيب. تتم الإشارة إلى الإجراءات والدوال والمتغيرات في الملفات الأخرى من خلال تعريفات "خارجية"، بينما تُعرَّف الإجراءات والدوال والمتغيرات في الملف الحالي على أنها "عامة". يتم تجميع كل ملف إلى ملف كائن، ثم يتم ربط الملفات ببعضها. لم يكن هناك فحص للأنواع بين ملفات الكائنات.

كجزء من المترجم الأصلي، تم إنشاء وحدة إدخال/إخراج طرفية مستقلة عن الجهاز للسماح باستخدام أي طرفية تسلسلية (على غرار وحدة CRT الخاصة بـ Turbo Pascal )، والتي لا تزال موجودة حتى يومنا هذا.

في عام ١٩٨٥، بُذلت جهود لإعادة كتابة المترجم بلغة باسكال. كان المترجم الجديد ثنائي المراحل مع معالجة وسيطة، وقد صُمم لحل مشكلات الذاكرة المرتبطة بالمترجم الأول. تم إنشاء الواجهة الأمامية للمترجم واختبارها دون إمكانية توليد التعليمات البرمجية الوسيطة (التحليل فقط).

في عام 1987، تم استبدال نظام Z80 المستخدم في الملكية الفكرية بنظام IBM-PC 80386، وتوقف العمل عليه. ومنذ ذلك الحين، استُخدمت عدة مُجمِّعات أخرى متوافقة مع معيار ISO 7185، وصولاً إلى مُجمِّع SVS Pascal، وهو تطبيق قائم على مُوسِّع DPMI ذي 32 بت .

تطبيق 80386

بحلول عام ١٩٩٣، بدأت المترجمات المتوافقة مع معيار ISO 7185، والتي كانت تُنتج شفرة برمجية عالية الجودة من نوع ٣٢ بت، بالاختفاء. عند هذه النقطة، كان الخيار إما التوقف عن استخدام لغة باسكال، أو إحياء مشروع IP Pascal السابق وتحديثه ليصبح مترجمًا متوافقًا مع معالج 80386. في ذلك الوقت، لم يكن متاحًا سوى محلل باسكال ومجمع (لمعالج Z80) قابلين للاستخدام على أجهزة IBM-PC. بين عامي ١٩٩٣ و١٩٩٤، تم تصميم المجمع بشكل معياري ليتوافق مع معالجات متعددة، بما في ذلك معالج 80386، وتم إنشاء رابط ليحل محل رابط لغة التجميع Z80، كما تم الانتهاء من واجهة أمامية لمترجم باسكال لإخراج الشفرة الوسيطة. أخيرًا، تم بناء محاكي للشفرة الوسيطة بلغة باسكال لاختبار النظام.

في عام 1994، تم استخدام المحاكي لتوسيع لغة ISO 7185 IP Pascal "الأساسية" لتشمل ميزات مثل المصفوفات الديناميكية.

في عام ١٩٩٥، تم إنشاء "مُشفِّر فحص" لاستهداف لغة الآلة ٨٠٣٨٦، وبرنامج تحويل لتحويل ملفات الكائنات الناتجة إلى ملف تنفيذي محمول لنظام ويندوز. كما تم إنشاء مكتبة دعم النظام لـ IP Pascal، المكتوبة بلغة IP Pascal نفسها. كانت هذه خطوة غير مألوفة لتجنب إعادة كتابة المكتبة لاحقًا من لغة التجميع أو لغة باسكال أخرى إلى IP Pascal، ولكن مع مشكلة تتمثل في ضرورة تصحيح أخطاء كل من مُولِّد كود ٨٠٣٨٦ والمكتبة معًا.

في مطلع عام ١٩٩٦، تم تغيير نظام التشغيل المستهدف من ويندوز إن تي إلى ويندوز ٩٥، وأصبح برنامج IP Pascal يعمل بكامل طاقته كمترجم 80386 ضمن نظام ويندوز. أتم النظام عملية التمهيد الذاتي، ونُقل ما تبقى من كود باسكال من SVS Pascal إلى IP Pascal لإتمام عملية التمهيد. وقد سهّلت هذه العملية بشكل كبير قدرة SVS Pascal، القائم على DPMI ، على العمل ضمن ويندوز ٩٥، مما ألغى الحاجة إلى التبديل بين نظامي DOS وويندوز ٩٥.

تطبيق لينكس

في عام 2000، تم إنشاء نسخة لينكس (ريد هات) مخصصة لوضع النص فقط. يستخدم هذا التطبيق استدعاءات النظام مباشرةً ويتجنب استخدام مكتبة glibc ، مما ينتج عنه ملفات تنفيذية أصغر حجمًا مقارنةً باستخدام نظام الدعم الكامل المطلوب للغة C، على حساب قابلية نقل الملفات التنفيذية.

تتمثل الخطة في إنشاء نسخة من مكتبة النصوص التي تستخدم معلومات termcap، والمكتبة الرسومية تحت X11.

خطوات "اكتب مرة واحدة، وانشر في أي مكان"

في عام ١٩٩٧، نُقلت نسخة من مكتبة الطرفية من نظام IP Pascal الأصلي لعام ١٩٨٠ إلى نظام ويندوز، وبدأ العمل على مُشفِّر نهائي لمعالج ٨٠٣٨٦. مع ذلك، فإن السبب الرئيسي للحاجة إلى مُشفِّر مُحسَّن، وهو سرعة التنفيذ، أصبح غير ذي أهمية إلى حد كبير مع زيادة سرعة المعالج في أجهزة IBM-PC. ونتيجة لذلك، لم يكتمل المُشفِّر الجديد حتى عام ٢٠٠٣.

في عام 2001، تم إنشاء برنامج مصاحب لـ IP Pascal لترجمة ملفات رأس C إلى ملفات رأس Pascal. وكان الهدف من ذلك استبدال الطريقة اليدوية لإنشاء واجهات نظام التشغيل لـ IP Pascal.

في عام 2003، تم إنشاء وحدة نمطية رسومية بالكامل ومستقلة عن نظام التشغيل لـ IP Pascal.

في عام 2005، تمت إضافة مجموعة أدوات إدارة النوافذ والويدجت.

باسكالين

في عام 2015 تقريبًا، جُمعت مواصفات لغة IP Pascal ووُسعت، فكانت النتيجة لغةً تُسمى "Pascaline". طُبقت معظم مواصفات Pascaline في IP Pascal. مع ذلك، اتُخذ قرارٌ بتطوير معظم اللغة أولًا باستخدام قاعدة بيانات مُترجم Pascal-P6. سلسلة Pascal-P هي المُترجم الأصلي الذي طوره طلاب ويرث في جامعة ETH زيورخ، وهي موجودة اليوم باسم Pascal-P4 (الاسم الذي اختاره نيكلاوس ويرث). حُوّلت إلى معيار ISO 7185 Pascal في Pascal-P5، ويجري تحديثها إلى لغة Pascaline في Pascal-P6. في الوقت نفسه، يجري تجهيز Pascal-P6 كمُترجم كامل، بدءًا بتوليد الشفرة لمعالج AMD64، بهدف توسيعه ليشمل معالجات أخرى مثل ARM وRISC-V. الهدف هو الوصول إلى Pascal-P6 1.0 عند تنفيذ مواصفات Pascaline بالكامل.

بيتيت أمي

في عام ٢٠١٩ تقريبًا، أُعيدت كتابة مكتبة دعم IP Pascal بلغة C. وكان الهدف من ذلك مزدوجًا: أولًا، جعل المكتبة قابلة للاستخدام مع جميع اللغات، وليس باسكال فقط، وثانيًا، تسهيل وتسريع عملية البرمجة وتصحيح الأخطاء على المنصات الجديدة. يتوفر Petit-Ami الآن لأنظمة ويندوز ولينكس، بالإضافة إلى تطبيق جزئي على نظامي ماك أو إس وبي إس دي يونكس.

الدروس

بالنظر إلى الماضي، كان الخطأ الأكبر في إصدار Z80 هو بنيته أحادية المرور. لم يكن هناك سبب وجيه لذلك؛ فالمترجم السابق (Basic) للمؤلف كان متعدد المرور مع تخزين وسيط. الحجة الوحيدة لذلك هي أن الترجمة أحادية المرور يفترض أن تكون أسرع. مع ذلك، تبين أن الترجمة أحادية المرور غير مناسبة للأجهزة الصغيرة، ومن غير المرجح أن تُحسّن الأداء في ظل التحسينات المتقدمة الشائعة في الأجهزة الكبيرة.

علاوة على ذلك، أدى جانب المرور الواحد إلى إبطاء أو منع عملية تهيئة المُصرّف من لغة التجميع Z80 إلى لغة باسكال نفسها. ولأن المُصرّف كان متجانسًا، لم يكن من الممكن إجراء التحويل إلى باسكال قسمًا تلو الآخر، بل كان لا بد من استبداله بالكامل. وعندما بدأ الاستبدال، استمر المشروع لفترة أطول من عمر الجهاز. تمثلت أكبر فائدة قدمها التجميع على مرحلتين لتطبيق I80386 في الحفاظ على كتاب قياسي للتعليمات الوسيطة التي تتواصل بين واجهة المُصرّف الأمامية والخلفية. قللت هذه "المرحلة" المفهومة جيدًا من التجميع من التعقيد الإجمالي. وبشكل بديهي، عندما يتم دمج برنامجين متساويين في الحجم بشكل وثيق، لا يكون التعقيد جمعيًا، بل ضربيًا، لأن الروابط بين نصفي البرنامج تتضاعف بشكل كبير.

من الدروس المستفادة من أيام معالج Z80، والتي تم تصحيحها في مُصرّف 80386، كتابة أكبر قدر ممكن من الشيفرة بلغة باسكال نفسها، حتى مكتبة الدعم. وقد جعل كتابة شيفرة دعم 80386 بلغة باسكال منها نظامًا معياريًا وقابلًا للنقل، ما أدى إلى نقل معظمها من قسم الشيفرة الخاصة بنظام التشغيل إلى قسم "الشيفرة المشتركة"، وهو قسم مخصص للشيفرة التي لا تتغير باختلاف الجهاز ونظام التشغيل. حتى الشيفرة "الخاصة بالنظام" لا تحتاج إلا لتعديلات طفيفة من تطبيق لآخر. والنتيجة هي توفير كبير في جهد التنفيذ أثناء نقل النظام.

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

للمزيد من القراءة

  • كاثلين يانسن ونيكلاوس ويرث : باسكال – دليل المستخدم والتقرير . سبرينغر-فيرلاغ، 1974، 1985، 1991، ISBN 0-387-97649-3، ISBN 0-387-90144-2، و ISBN 3-540-90144-2[ 1 ]
  • نيكلاوس ويرث: "لغة البرمجة باسكال". مجلة أكتا إنفورماتيكا ، 1، (يونيو 1971) 35-63
  • ISO/IEC 7185: لغات البرمجة - باسكال . [ 2 ]

مراجع

  1. سوبسيك، جاك (5 ديسمبر 1997). "باسكال - دليل المستخدم والتقرير" . المعهد الفدرالي السويسري للتكنولوجيا في زيورخ: قسم علوم الحاسوب. مؤرشف من الأصل في 14 مارس 2005. تم الاطلاع عليه في 23 يونيو 2005 .
  2. مور، سكوت أ. "أنسيسو باسكال" . Moorecad.com . تم الاطلاع عليه بتاريخ 21 فبراير 2017 .