![]() |
|
ماركو كانتو: |
الفصل 2
|
قبل ان ننتقل الى موضوع كتابة تعليمات لغة باسكال، من المهم أن نلقي الضوء على بعض عناصر نمط كتابة التعليمات بباسكل. المسألة التي أودّ الإشارة اليها هنا كالتالي: بجانب قواعد اللغة، ما هي الكيفية التي يجب عليك اتباعها لكتابة التعليمات. لاتوجد اجابة واحدة على هذا السؤال، حيث ان الأسلوب الشخصي يمكنه ان يقرر عدة انماط. عموما، هناك بعض المبادئ التي تحتاج لمعرفتها فيما يخصّ وضع التعليقات، حالة الأحرف، المسافات و ما يسمّى بالطباعة الأنيقة pretty-printing . كمبدأ عام، الهدف من أي نمط للكتابة هي الوضوح. ان النمط و القالب الذي تختاره هو شكل من اشكال الاختزال، يشير الى الغرض من جزء ما من التعليمات البرمجية. و الأداة الرئيسية للوصول الى الوضوح هي وحدة النسق بغضّ النظر عن النمط الذي تختاره، كن متأكدّا بأنكّ ستتّبع نفس النسق عبر كامل المشروع البرمجي.
في باسكال، يتم ضمّ التعليقات في أقواس braces أو أقواس parentheses متبوعة بنجمة. دلفي تقبل ايضا نمط التعليقات المتبعة في س++ ، والتي يمكنها ان تمتد الى نهاية السطر:
{هذا تعليق} (* هذا تعليق آخر *) // هذا تعليق آخر يمتد حتى نهاية السطر
الشكل الأول أقصر و أكثر اتّباعا. الشكل الثاني كان مفضلا أكثر في اوربا بسبب عدم وجود رمز القوس السهمي في لوحات المفاتيح. الشكل الثالث من التعليقات تم استعارته من س++ و متوفر فقط في نسخ 32 بت من دلفي. التعليقات المحدودة بنهاية السطر مفيدة جدا للملاحظات القصيرة و لتلك الخاصة بسطر محدد في التوليف.
خلال سرد الأمثلة في هذا الكتاب سأحاول تعليم التعليقات بأحرف مائلة، (و الكلمات الرئيسية بالتغميق)، لتكون متسقة مع النمط الافتراضي للصياغة في دلفي.
وجود ثلاثة اشكال مختلفة من التعليقات يمكن ان يساعد في بناء تعليقات متداخلة. إذا اردت التعليق على مجموعة أسطر من برنامج من اجل وقفها، وهذه الأسطر تحوي بعض التعليقات السابقة، فإنك لاتستطيع استخدام نفس علامة التعليقات:
{ ... code {comment, creating problems} ... code }
مع علامة تعليق ثانية، يمكنك كتابة التعليمات الآتية، و التي هي صحيحة:
{ ... code //this comment is OK ... code }
لاحظ أن القوس المفتوح او القوس_نجمة اذا كان تليه علامة الدولار ($)، فسوف يتحول الى توجيه للمُجمّع compiler directive ، كما في {$X+}.
في الواقع، توجيهات المجمّع تعد تعليقات أيضا. مثال ذلك، {$X+ This is a comment} هي صحيحة. هي كلاهما توجيه و تعليق صحيحين، الا أن المبرمج المتعقل سوف يختار ان يفصل بين التوجيهات والتعليقات.
مجمّع باسكال (بعكس اللغات الأخرى) يغضّ الطرف عن حالة الأحرف (عالية أو منخفضة). لذلك؛ فإن التعريفات التالية Myname ، MyName، myname، myName، و MYNAME كلها متساوية. بشكل عام، هذا يعدّ أمرا ايجابيا، ففي اللغات الحسّاسة لحالة الأحرف، العديد من الأخطاء اللغوية قد تحدث بسبب الإهمال في مراعاة حالة الأحرف.
ملاحظة: ربما الحالة الإستثناء الوحيدة لقاعدة حساسية الأحرف في باسكال هي: إجراء Register في حزمة المكونات، لابد لها أن تبدأ بحرف R العالي، وذلك للمحافظة على التوافقية مع C++ Builder.
إلا أنه توجد بعض السلبيات. أولا، يجب أن تنتبه لأن تكون هذه التعريفات متساوية بالفعل، لذا يجب أن تتجنب استعمالها كعناصر مختلفة. ثانيا، يجب أن تكون متّسقا قدر الامكان عند استخدامك للأحرف العالية، لتحسين مقروئية برنامجك.
توحيد استخدام حالة الأحرف ليس ملزما من قبل المجمّع، و لكنها عادة حسنة يحبّذ اتّباعها. الاسلوب المتبع هو تكبير الحرف الأول فقط من كل معرّّف identifier. و عندما يكون المعرّف مركّبا من عدة كلمات (لايمكنك حشر فراغ في المعرّف) ، فإن كل أول حرف من كل كلمة يجب أن يكون عاليا:
MyLongIdentifier MyVeryLongAndAlmostStupidIdentifier
هناك حالات أخرى لايأبه لها المجمّع كالفراغات، و الأسطر الفارغة، و المسافات (tabs) التي تقوم بوضعها في البرنامج. كل هذه الحالات مجتمعة تسمّى بالفراغ الأبيض white space . الفراغات البيضاء تستخدم فقط لتحسين مقروئية البرنامج؛ و لا تؤثر في عملية التتجميع.
بعكس لغة بيسك BASIC ، فإن باسكال تسمح لك بكتابة تعليمة واحدة موزعة على عدة أسطر، فالتعليمة الطويلة يمكن تجزئتها لتكون في سطرين أو أكثر. السلبية الوحيدة (على الأقل بالنسبة لمبرمجى البيسك) لإمكانية أن تكون التعليمات في أكثر من سطر هي أنه عليك أن تتذكّر بأن تضع فاصلة منقوطة آخر كل تعليمة، أو بدقة أكثر، أن تفصل بين التعليمة والتي تليها. لاحظ أن القيد الوحيد هنا ان الجملة النصية الواحدة لايمكن مدّها لعدّة أسطر.
مرّة أخرى، لاتوجد قواعد ثابتة لاتستخدام الفراغات و التعليمات متعددة الأسطر، فقط بعض الأعراف:
الاقتراح الأخير فيما يخصّ استخدام الفراغات البيضاء له علاقة بالعرف المتبع لنسق تشكيل لغة باسكال، و الذي يعرف بالطباعة الأنيقة pretty-printing. القاعدة بسيطة: كل مرة تحتاج فيها لكتابة تعليمة مركّبة، قم بوضعها بعد هامش فراغين الى اليمين من باقي التعليمة الحالية. التعليمة المركبة داخل تعليمة أخرى مركبة يتم تهميشها بأربع مسافات، وهكذا:
if ... then statement; if ... then begin statement1; statement2; end; if ... then begin if ... then statement1; statement2; end;
الصياغة السابقة تعتمد نسق الطباعة الأنيقة، لكن المبرمجين لديهم تفسيرات مختلفة لهذه القاعدة العامة. بعض المبرمجين مثلا يقومون بتهميش تعليمات begin و end للمستوى التالي مع نفس التعليمات الداخلية، بعضهم يهمش begin و end ثم يقومون بتهميش التعليمات الداخلية لمستوى اضافي، مبرمجون آخرون يضعون begin في نفس سطر شرط if . هذا في معظمه أمر له علاقة بالذوق الشخصي.
نفس نمط التهميش يتّّبع عادة عند سرد المتغيرات أو أنواع الببيانات، و لمواصلة تعليمة من سطر سابق:
type Letters = set of Char; var Name: string; begin { long comment and long statement, going on in the following line and indented two spaces } MessageDlg ('This is a message', mtInformation, [mbOk], 0);
بالطّبع، أي من هذه القواعد هي مجرّد إقتراح لجعل البرنامج مقروءا بشكل أفضل من قبل المبرمجين الآخرين، و هي تهمل بالكامل من جانب المجمّع. لقد حاولت استخدام هذه القاعدة بصورة متّسقة في كل اجزاء الأمثلة والبرامج في هذا الكتاب. كما يلاحظ أن البرامج، الأدلة، و أمثلة المساعدة التي تأتي مع دلفي كلها تتّبع نفس النسق في الصياغة.
لتسهيل قراءة و كتابة توليف code باسكال، يملك محرر دلفي خاصية تسمّى تعليم الألفاظ syntax highlighting . فالكلمات التي تقوم بطباعتها في المحرر، يتم اظهارها باستخدام ألوان مختلفة بحسب معناها في باسكال. عرضا، الكلمات المفتاحية keywords تكون داكنة، النصوص و التعليقات تظهر ملونة (و غالبا مائلة)، وهكذا.
الكلمات المحجوزة، و التعليقات، و النصوص تقريبا هي العناصر الثلاثة الأكثر استفادة من هذه الخاصية. فمن أول نظرة يمكنك ملاحظة كلمة مفتاحية غير صحيحة، أو نصّ غير مقفل بصورة سليمة، أو طول الملاحظة المتعددة الأسطر.
بإمكانك بسهولة تعديل مواصفات تعليم الألفاظ باستخدام صفحة ألوان المحرر Editor page في لوحة خيارات البيئة Environment Options (انظر الشكل 2.1). إذا كنت تعمل بمفردك، يمكنك اختيار الألوان التي تفضل. أما إذا كنت تعمل بالتعاون مع مبرمجين آخرين، فالأفضل أن توافقوا جميعا على نسق ألوان نمطي. لقد وجدت ان العمل على حاسوب به تلوين الفاظ مختلف عمّا تعوّدت عليه أمر صعب بالفعل.
الشكل 2.1: لوحة الحوار المستخدمة لتحديد لون تعليم الألفاظ.
ملاحظة:في هذا الكتاب حاولت تطبيق ما يشبه تعليم الألفاظ على أمثلة البرامج. أتمنّى أن يجعلها بالفعل مقروءة بصورة أفضل.
قدّمت دلفي 3 خاصيّة جديدة ذات علاقة بكتابة شفرة البرامج. عند كتابة تعليمات لغة باسكال تجد نفسك عادة ما تعيد كتابة نفس التتابع من الكلمات الرئيسية، لذلك قدمت بورلاند خاصية جديدة تسمّى قوالب اللغة Code Templates . قوالب اللغة هي ببساطة قطعة من توليف مرتبطة بمفاتيح مختصرة. حيث تقوم بكتابة النص المختصر ثم تتبعها بالضغط على Ctrl+j، فيظهر التوليف ذو العلاقة مكتوبا بالكامل. مثلا، اذا قمت بكتابة arrayd ، ثم ضغطت على Ctrl+j ، فان محرر دلفي سوف يوسع من النص المختصر الى التالي:
array [0..] of ;
و حيث ان قوالب التوليف المحددة سلفا عادة ما تأتي بنسخ مختلفة لنفس الاختصار، فان النص المختصر ينتهي عموما بحرف يشير الى النسخة التي قد تهمك. عموما يمكنك كتابة فقط جزء من النص المختصر. مثال ذلك، اذا كتبت ar ثم ضغطت على Ctrl+j ، يظهر المحرر قائمة تظهر الخيارت المتوفرة مع وصف موجز لكل اختصار، مثلما هو واضح في الشكل 2.2 .
الشكل 2.2 اختيار قالب التوليف
تستطيع صياغة قوالب التوليف إما بتعديل الموجود منها، أو ببناء قوالب جديدة خاصة بك. واذا قمت بهذا، تذّكر ان نص قالب التوليف عادة ما يحوي حرف '|' ليشير الى الموقع الذي سيقفز له المؤشر بعد انتهاء العملية، حيث تتابع الكتابة لإكمال نص القالب.
حالما تقوم بتحديد بعض المعرفات، يمكنك استخدامها في تعليمات او في معادلات هي جزء من بعض التعليمات, تقدم باسكال مجموعة من التعليمات والتعبيرات. دعنا أولا نلقي نظرة على الكلمات المفتاحية، و التعبيرات ، و العاملات.
الكلمات المفتاحية هي كل المعرّفات المحجوزة من قبل اوبجكت باسكال، و التي لها دور في اللغة. دليل دلفي (Help) يميّز بين الكلمات المحجوزة والتوجيهات كالتالي: الكلمات المحجوزة لا يمكن استخدامها كمعرّفات، بينما التوجيهات لا يجب استخدامها لنفس الغرض، حتى لو قبلها المجمّع. عند الممارسة، عليك تجنّب استخدام أية كلمة محجوزة كمعرّف.
في الجدول 2.1 يمكنك رؤية قائمة كاملة بالمعرّفات التي لها دورا خاصا في لغة اوبجكت باسكال (في دلفي 4)، بما في ذلك الكلمات و الكلمات المحجوزة الأخرى.
الجدول 2.1: الكلمات المفتاحية و الكلمات المحجوزة الأخرى في لغة اوبجكت باسكال
الكلمة الرئيسة | الدور |
---|---|
absolute | directive (variables) موجّه (متغير) |
abstract | directive (method) موجّه (مسار) |
and | operator (boolean) معامل (بولي) |
array | type نوع |
as | operator (RTTI) معامل |
asm | statement تعليمة |
assembler | backward compatibility (asm) توافقية مع السابق |
at | statement (exceptions) تعليمة (استثناءات) |
automated | access specifier (class) محدد دخول (طبقة) |
begin | block marker علامة حيّز |
case | statement تعليمة |
cdecl | function calling convention قاعدة استدعاء وظيفة |
class | type نوع |
const | declaration or directive (parameters) تعريف أو توجيه (محددات) |
constructor | special method مسار خاص |
contains | operator (set) عامل (فئةّ) |
default | directive (property) توجيه (سمة) |
destructor | special method مسار خاص |
dispid | dispinterface specifier محدد واجهة اطلاق |
dispinterface | type نوع |
div | operator عامل |
do | statement تعليمة |
downto | statement (for) تعليمة (for) |
dynamic | directive (method) توجيه (مسار) |
else | statement (if or case) تعليمة (if او case) |
end | block marker تعليم حيّز |
except | statement (exceptions) تعليمة (استثناءات) |
export | backward compatibility (class) توافقية مع السابق |
exports | declaration تعريف |
external | directive (functions) توجيه |
far | backward compatibility (class) توافقية مع السابق |
file | type نوع |
finalization | unit structure بنية وحدة |
finally | statement (exceptions) تعليمة |
for | statement تعليمة |
forward | function directive توجيه وظيفة |
function | declaration تعريف |
goto | statement تعليمة |
if | statement تعليمة |
implementation | unit structure بنية وحدة |
implements | directive (property) توجيه (مسار) |
in | operator (set) - project strucure عامل (فئة) - بنية مشروع |
index | directive (dipinterface) توجيه |
inherited | statement تعليمة |
initialization | unit structure بنية وحدة |
inline | backward compatibility (see asm) توافقية مع السابقة |
interface | type نوع |
is | operator (RTTI) عامل |
label | declaration تعريف |
library | program structure بنية برنامج |
message | directive (method) توجيه (مسار) |
mod | operator (math) عامل (رياضي) |
name | directive (function) توجيه (وظيفة) |
near | backward compatibility (class) توافقية مع السابق |
nil | value قيمة |
nodefault | directive (property) توجيه (مسار) |
not | operator (boolean) عامل (بولي) |
object | backward compatibility (class) توافقية مع السابق |
of | statement (case) تعليمة |
on | statement (exceptions) تعليمة |
or | operator (boolean) معامل (بولي) |
out | directive (parameters) توجيه (محدّدات) |
overload | function directive توجيه وظيفة |
override | function directive توجيه وظيفة |
package | program structure (package) بنية برنامج (حزمة) |
packed | directive (record) توجيه (تسجيلة) |
pascal | function calling convention طرقة استدعاء وظيفة |
private | access specifier (class) معيّن لوصول (طبقة) |
procedure | declaration تعريف |
program | program structure بنية برنامج |
property | declaration تعريف |
protected | access specifier (class) معيّن لوصول (طبقة) |
public | access specifier (class) معيّن لوصول (طبقة) |
published | access specifier (class) معيّن لوصول (طبقة) |
raise | statement (exceptions) تعليمة (اعتراضات) |
read | property specifier معيّن سمة |
readonly | dispatch interface specifier معيّن واجهة ارسال |
record | type نوع |
register | function calling convention طريقة لاستدعاء وظيفة |
reintroduce | function directive توجيه وظيفة |
repeat | statement تعليمة |
requires | program structure (package) بنية برنامج (حزمة) |
resident | directive (functions) توجيه (وظيفة) |
resourcestring | type نوع |
safecall | function calling convention طريقة لاستدعاء وظيفة |
set | type نوع |
shl | operator (math) عامل (رياضة) |
shr | operator (math) عامل (رياضة) |
stdcall | function calling convention طريقة لاستدعاء وظيفة |
stored | directive (property) توجيه (سمة) |
string | type نوع |
then | statement (if) |
threadvar | declaration تعريف |
to | statement (for) تعليمة |
try | statement (exceptions) تعليمة (استثناءات) |
type | declaration تعريف |
unit | unit structure بنية وحدة |
until | statement تعليمة |
uses | unit structure بنية وحدة |
var | declaration تعريف |
virtual | directive (method) توجيه (مسار) |
while | statement تعليمة |
with | statement تعليمة |
write | property specifier معيّن سمة |
writeonly | dispatch interface specifier معيّن واجهة ارسال |
xor | operator (boolean) عامل (بولي) |
لا توجد قاعدة عامة لبناء التعبيرات expressions ، حيث تعتمد اساسا على العامِلات التي تستخدم، و التي لباسكال العديد منها. هناك المنطقي logical والحسابي arithmetic والبولي Boolean والعلائقي relational ، و عاملات الفئة set، بالاضافة الى عدد آخر. يمكن استعمال التعبيرات لتحديد القيمة التي ستخصص للمتغير، او لحساب المحدد parameter التابع لوظيفة او اجراء، او لاختبار شرط. و قد تتضمن التعبيرات استدعاء وظائف ايضا. في كل مرة تقوم فيها باجراء عملية على قيمة في معرّف، و ليس استعمال المعرف في حد ذاته، فان هذا يعدّ تعبيرا.
تعد التعبيرات امرا شائعا في لغات البرمجة. التعبير هو أي توليفة من الثوابت constants ، المتغيرات، القيم الحرفية literal ، عاملات، و نتائج الوظائف. التعبيرات يمكن ايضا تمريرها الى المحددات القيمية value parameters في الاجراءات و الوظائف، و لكن ليس دائما الى المحددات المرجعية reference parameters (التي تحتاج الى قيمة يمكن تخصيصها).
اذا سبق لك و أن كتبت برنامجا في حياتك، فانك تعلم بالفعل ماذا تعني كلمة تعبير expression. هنا سوف ألقي الضوء على عناصر محددة في عاملات باسكال. يمكنك رؤية قائمة بعاملات اللغة، مجمعة حسب الأسبقية، في الجدول 2.1.
على العكس من معظم اللغات الأخرى، فإن عاملات and و or لهما الأسبقية على العاملات العلائقية. لذاك اذا كتبت a < b and c < d، فان المجمّع سيحاول تنفيذ عملية and أولا، منتجا بذلك خطأ تجميع. لهذا السبب عليك وضع كل من تعبير < بين قوسين: (a < b) and (c < d).
بعض العاملات الشائعة لديها معان مختلفة مع انواع بيانات مختلفة. مثال ذلك، العامل + يمكن استخدامه لجمع رقمين، لوصل جملتين، صنع اتحاد بين فئتين، او حتى جمع رصيف offset مع مؤشر Pchar . الا انك لاتستطيع جمع حرفين، كما هو ممكن في لغة c.
عامل آخر غريب وهو div . ففي باسكال، يمكنك تقسيم أي رقمين (حقيقي أو صحيح) بواسطة العامل / ، وسوف تحصل بصورة ثابتة على رقم حقيقي كناتج. اما اذا احتجت الى تقسيم رقمين صحيحين للحصول على ناتج صحيح، استخدم العامل div كبديل.
الجدول 2.2: معاملات لغة باسكال، مجمعة حسب اسبقيتها
عاملات أحدادية (أسبقية عليا) | |
---|---|
@ | عنوان المتغير أو الوظيفة (ترجّع مؤشّر) |
not | بولي أو ما يخص الجزيئات |
العاملات الضربية و ما يخص الجزئيات | |
* | ضرب حسابي أو تقاطع فئة |
/ | تقسيم نقطة عائمة |
div | تقسيم عدد صحيح |
mod | البواقي (باقي تقسيم عدد صحيح) |
as | تلبيس نوع آمن (RTTI) |
and | بولي أو ما يخص الجزيئات |
shl | ازاحة لليسار فيما يخصّ الجزئيات |
shr | ازاحة لليمين فيما يخصّ الجزئيات |
العاملات الجمعية | |
+ | جمع حسابي، اتحاد فئة، ربط جمل، اضافة رصيف مؤشّر |
- | طرح حسابي، طرح وتخالف فئة، طرح صف مؤشّر |
or | بولي أو ما يخص الجزيئات |
xor | بولي أو ما يخص الجزيئات |
عاملات العلاقة والمقارنة (أسبقية دنيا) | |
= | اختبار مساواة |
<> | اختبار عدم مساواة |
< | اختبار أقل من |
> | اختبار اكبر من |
<= | اختبار أقل من أو يساوي، أو فئة فرعية من فئة |
>= | اختبار أكبر من أو يساوي، أو فئة عليا تعلو فئة |
in | اختبار اذا ما عنصر عضو في فئة |
is | اختبار توافقية نوع لكائن(عامل RTTI آخر) |
عاملات الفئة تتضمن اتحاد union (+)، طرح difference (-)، تقاطع intersection (*)، اختبار عضوية membership (in)، بالإضافة الى مجموعة من العاملات العلائقية. لاضافة عنصر لمجموعة، يمكنك جعل اتحاد فئةة مع آخرى تملك فقط العنصر الذي تحتاجه. فيما يلي مثال بدلفي له علاقة بنمط الخطّ font styles:
Style := Style + [fsBold]; Style := Style + [fsBold, fsItalic] - [fsUnderline];
كبديل يمكنك استخدام الاجرائين الاعتيادين Include و Exclude، وهما أكثر فاعلية (لكنهما لايمكن استعمالهما مع سمات مكوّن التي تكون من نوع set، لأنها تحتاج الى محدد لقيمة l-):
Include (Style, fsBold);
الآن وقد عرفنا الخطوط الأساسية لبرنامج باسكال فنحن جاهزون لفهم معانيها بالتفصيل. سوف نبدأ باستكشاف تعريف أنواع البيانات سابقة التحديد و المحددة بالمستعمل، بعدها سننتقل معها الى استخدام الكلمات المفتاحية لبناء تعليمات برمجية.
حقوق النسخ محفوظة لماركو كانتو؛ وينتش ايطاليا © Copyright Marco Cantù, Wintech Italia Srl 1995-2000
حقوق الترجمة: خالد الشقروني ، 2000