Logo

ماركو كانتو:
أساسي باسكال

الفصل 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 نوع
finalizationunit structure بنية وحدة
finally statement (exceptions) تعليمة
for statement تعليمة
forward function directive توجيه وظيفة
function declaration تعريف
goto statement تعليمة
if statement تعليمة
implementationunit structure بنية وحدة
implements directive (property) توجيه (مسار)
in operator (set) - project strucure عامل (فئة) - بنية مشروع
index directive (dipinterface) توجيه
inherited statement تعليمة
initializationunit 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) توجيه (وظيفة)
resourcestringtype نوع
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