الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مذكرات حول تصميم قواعد البيانات وتطبيقاتها

رائج
بدأه أحمد مبارك الحيقي في 24 يونيو 2010 · 55 رد · 16,932 مشاهدة · في قواعد بيانات Microsoft Access
مشاركة: واتساب X فيسبوك تيليجرام
#26

السلام عليكم ورحمة الله وبركاتة

اخى الكريم "احمد مبارك الحيقى" كان الله فى العون واعانك علينا فانت قدرنا والامل المتبقى لنا للتعلم بطريقة عليمية وصحيحة

بعد درسك الـ ثالث حبيت اتعلم اكثر واجمع معلومات اكثر ودخلت منتدى مبرمجى الاسمبلى وفعلا قرات اكثر من موضوع اكتملت الفكرة لدى وهضمت الدرس

واثناء تجولى فى افرع المنتديات هنا وجدت مشاركة لتعليم اكواد الفيجوال بيسك واستخدام الـ dao وعن كيفية ربط الفيجوال بقواعد البيانات وصاحب الموضوع كان مصمم لتوصيل اشياء معينة لدى القراء

لدرجة انة عامل فهرس بمحتوى الدورة لكن للاسف لم يكمل الدروس واصبت بخيبة امل تمام مثل ما حدث فى دروس السيد " انترنت ماستر"

هذا ما جلعنى اقول انك الامل المتبقى لنـــــــــــــــــا

تم تعديل هذه المشاركة بواسطة مستر استرا في 6 يوليو 2010 في 22:41

#27

أخينا و أستاذنا

أحمد مبارك

طرح موفق ان شاء الله

فمن المهم وضع الاسس و القواعد السليمة حتى يكون البناء بعد ذلك سليما

و أعتقد ان من اهم النقاط هى دراسة التطبيق و مناقشة مستخدم التطبيق قبل البدء فى بناء التطبيق للوصول الى الاداء الامثل

و جزاك الله خيرا

مدونتى:-

احترف الأكسس مع أبو يوسف

متغيب حاليا لانشغالى الشديد

#28

الاستاذ الكريم/ أحمد مبارك الحيقي

بارك الله فيك وبارك الله فى عمرك

وجزاك عن الوقت الذى تخصصه لهذه الدروس خير جزاء

لقد بدأت متابعة دروسك هذه بعد نهاية الجزء الاول ولم يسعنى شكرك حينها...

وعندما رأيت بداية الجزء الثانى فرحت كثيرا حتى استطيع متابعة دروسك الشيقه والمفيده...

جعلك الله خير من تعلم العلم وعلمه....

اللهم علمنا ما ينفعنا و انفعنا بما علمتنا وَ زِدْنا علماً.

#29

الحلقة الرابعة: مفاهيم عامة في الحواسيب (3)

***********************************

لنتوقف قليلاً عن الكلام في اللغات عالية المستوى، وفي المترجمات، ولنعد إلى سؤال طرحته من قبل، ولم أجب عنه بعد:

من أين تأتي تعليمات البرنامج إلى المعالج حتى ينفذها؟

نحن متفقون على هذه الحقيقة: سواء كتبت البرنامج بلغة عالية المستوى (مثل VBA)، أو بلغة التجميع، فإن المعالج لن يستقبل في النهاية إلا إشارات ثنائية (0 أو 1)، عبر تلك الأسلاك الممدودة إليه، والتي تمثل تعليمات لغة الآلة. من أين تأتي هذه الإشارات؟ وإلى أين تصل تلك الأسلاك في الطرف الآخر؟ هذا هو السؤال.

الذاكرة memory

************

في البداية، كانت هذه البرامج (تلقم) للمعالج يدوياً، عبر فتح وإغلاق ما يشبه المفاتيح الكهربية لتمثل الصفر والواحد. ثم جاءت فكرة البرامج المخزونة stored-programs، وهي الفكرة التي تستخدم حتى الآن: خزن تعليمات البرنامج والبيانات التي يحتاجها البرنامج في مكان يسمى الذاكرة memory. من هذه الذاكرة، يستلم المعالج التعليمات واحدة بعد الأخرى (بلغة الآلة طبعاً)، مع ما تحتاج إليه هذه التعليمات من بيانات. مثلاً، تعليمة مثل جمع عددين تحتاج إلى العددين ليتم جمعهما. كما يمكن خزن بعض النتائج المؤقتة التي تنتج أثناء عمل البرنامج من المعالج إلى الذاكرة.

إذن، فإن البرنامج يصل إلى المعالج من الذاكرة. ولكن، ما هي الذاكرة؟ من أجل التبسيط، يمكننا التفكير بالشكل التالي:

 الذاكرة تخزن البرامج من أجل توصيلها إلى المعالج.

 البرامج التي ستصل إلى المعالج يجب أن تكون بشكل إشارات صفر أو واحد.

 إذن فنحن بحاجة إلى وسيلة ما نحتفظ فيها بكميات من (الصفر) والـ(واحد).

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

 مجموعة كبيرة جداً من هذه الأجهزة الصغيرة، يمكن أن تخزن كمية لا بأس بها من التعليمات والبيانات، وتأخذ وتعطي مع المعالج أثناء تنفيذ البرامج، ومجموعها نسميه (الذاكرة).

 هذه المجموعة الكبيرة من الأجهزة الدقيقة غير مرئية بالنسبة لك، ويتم تصنيعها في شرائح إلكترونية، تجمع على لوحات إلكترونية مطبوعة، هي التي نطلق عليها عادة اسم (الذاكرة)، كما في الشكل أدناه.

post-70171-093060100 1278735341_thumb.jp

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

حان الوقت لتقديم القليل من المصطلحات...

الأرقام في اللغة الثنائية هي اثنان فقط (0 و 1)، والرقم يسمى digit في الإنجليزية، ومن هنا، كان الاسم الذي يطلق على أحد الرمزين (0 أو 1) هو (بت bit)، من الكلمتين رقم ثنائي binary digit. كل واحد من الأجهزة الإلكترونية الدقيقة جداً المكونة للذاكرة يمثل بتاً واحداً.

على الرغم من كون البت هو أصغر وحدة بيانات في الحاسوب، نحن في العادة لا نتعامل على مستوى البت (لا يستطيع البت أن يمثل بنفسه تعليمات أو بيانات مفيدة). في العادة، نتعامل مع الأرقام الثنائية التي تمثل تعليمات أو بيانات (وبالتالي مع البتات في الذاكرة) على مستوى مجموعات من مضاعفات الرقم 2 (إنه نظام ثنائي في النهاية): 4 أو 8 أو 16 أو 32، وهكذا. في الحقيقة، نادراً ما ترى التعامل مع مجموعة من أربعة بتات، وغالباً نعدّ المجموعة التي تكون ثمانية بتات هي الوحدة الأساسية للذاكرة، ولذلك نقسم الذاكرة منطقياً إلى أجزاء من ثمانية بتات، ونعطي لكل مجموعة عنواناً.

المعذرة، لقد نسيت تقديم بعضكم إلى بعض:

مجموعة أربعة بتات تسمى (نيبل nibble)، ومجموعة ثمانية بتات تسمى (بايت byte). أما مجموعة الجالسين خلف الشاشة وهم يتثاءبون، فيسمون القراء...

لا بد أن اسم الـ(بايت) لم يكن جديداً عليك، فهو وحدة القياس الأساسية للذاكرة ولكل أجهزة الخزن في عالم الحاسوب. البايت بحد ذاته صغير جداً لنعتمده كوحدة قياس لبيانات هذه الأيام، لكن مضاعفاته شائعة جداً:

1 كيلو بايت = 1024 بايت

1 ميجا بايت = 1024 كيلو بايت = 1024 * 1024 بايت

1 جيجا بايت = 1024 ميجا بايت = 1024 * 1024 * 1024 بايت

1 تيرا بايت = 1024 جيجا بايت = 1024 * 1024 * 1024 * 1024 بايت

1 بيتا بايت = 1024 تيرا بايت = 1024 * 1024 * 1024 * 1024 * 1024 بايت

1 إكسا بايت = 1024 بيتا بايت = 1024 * 1024 * 1024 * 1024 * 1024 * 1024 بايت

1 زيتا بايت = 1024 إكسا بايت = 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 بايت

هذا يكفي...!

لتأخذ فكرة ولو بعيدة عما تعنيه تلك الأرقام، فلتعلم أن بايتاً واحداً قادر على تمثيل حرف إنجليزي واحد. وبافتراض أن الأحرف العربية تمثل باستخدام بايتين، فهذا يعني أن هذه الحلقة (إلى الآن) بدون الصورة، تحتاج إلى حوالي 88 كيلو بايت (مع الفراغات).

أول حاسوب شخصي جاء مع 16 كيلو بايت فقط في الذاكرة. عندما اشتريت أول جهاز لي عام 1998 أو 1999 ربما، كانت الذاكرة المتوفرة فيه تبلغ 64 ميجا بايت، الجهاز الذي اشتريته قبل عامين تقريباً يحوي ذاكرة بسعة 1 جيجا بايت. الجهاز الذي قضيت معه أغلب أوقات البرمجة منذ عام 2002 تقريباً حتى عام 2008، كانت ذاكرته بسعة 256 ميجا بايت (فقط). مع مرور الوقت تزداد سعة الذواكر، وتزداد أحجام البرامج أيضاً، وكميات البيانات التي نتداولها، ولذلك نشعر دوماً بالحاجة إلى المزيد من الذاكرة.

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

ربما لأن الحرف الإنجليزي الواحد يمكن تمثيله ببايت واحد، فإن أصغر وحدة في الذاكرة نستطيع أن نعنونها هي البايت. هذا يعني أن لكل بايت في الذاكرة عنوان. وهذا يعني بدوره أنه من بين كل ركام البتات في الذاكرة تستطيع تمييز كل بايت، والوصول إلى بايت محدد إذا حددت عنوانه. عنونة البايتات مباشِرة: أول بايت يأخذ العنوان صفر، والثاني يأخذ العنوان واحد، والثالث يأخذ العنوان اثنين، وهكذا حتى آخر بايت في الذاكرة. في ذاكرة سعتها 1 ميجا بايت، فإن آخر بايت عنوانه 1048575 (1 ميجا بايت ناقصاً واحد، لأن الترقيم يبدأ من الصفر، و1 ميجا بايت = 1024 * 1024 = 1048576). على ذلك، فإنه يمكن تمثيل هذه الذاكرة بالشكل التالي:

post-70171-027979700 1278735348_thumb.jp

بناءً على هذا التمثيل، سنحاول بإذن الله في الحلقة القادمة استكشاف مفهاهيم مهمة جداً، وتتعلق مباشرة بالبرمجة بأي لغة برمجة، مثل VBA.

حتى ذلك الحين، هاهنا تمرين للبحث والتفكير (التفكير مثل الطحن، يحتاج إلى شيء تطحنه، وهذا الشيء يأتي بالبحث): لماذا كان الكيلو بايت يساوي 1024 بايتاً وليس 1000 بايت كما اعتدنا في بقية القياسات؟

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

(يتبع إن شاء الله...)

المرفقات
mem_modules.JPGmem_diag.JPG
#30

اسمحلى لى استاذى ان اجيب على سؤالك من كلامك.

نتعامل مع الأرقام الثنائية التي تمثل تعليمات أو بيانات (وبالتالي مع البتات في الذاكرة) على مستوى مجموعات من مضاعفات الرقم 2 (إنه نظام ثنائي في النهاية)

فاذا استمرينا فى مضاعفة الرقم 2 نصل الى 1024 وليس 1000

2

4

8

16

32

64

128

256

512

1024

حاجه زى كده

#31

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

نتعامل مع الأرقام الثنائية التي تمثل تعليمات أو بيانات (وبالتالي مع البتات في الذاكرة) على مستوى مجموعات من مضاعفات الرقم 2 (إنه نظام ثنائي في النهاية(

فاذا استمرينا فى مضاعفة الرقم 2 نصل الى 1024 وليس 1000

2 ويساوي العدد العشري 2 مرفوع إلى القوة 1

4 ويساوي العدد العشري 2 مرفوع إلى القوة 2

8 ويساوي العدد العشري 2 مرفوع إلى القوة 3

16 ويساوي العدد العشري 2 مرفوع إلى القوة 4

32 ويساوي العدد العشري 2 مرفوع إلى القوة 5

64 ويساوي العدد العشري 2 مرفوع إلى القوة 6

128 ويساوي العدد العشري 2 مرفوع إلى القوة 7

256 ويساوي العدد العشري 2 مرفوع إلى القوة 8

512 ويساوي العدد العشري 2 مرفوع إلى القوة 9

1024 ويساوي العدد العشري 2 مرفوع إلى القوة 10

<BR style="mso-special-character: line-break"><BR style="mso-special-character: line-break">

#32

السلام عليكم ورحمة الله وبركاته

استاذي احمد شكل ما فهمت

هناك لغة الالة مكونة من o.1 لا تفهم الالة غيرها وتتكون من ثمانية خانات من الصفر والواحد تسمى بايت وتمثل تعليمه واحده تفهمها الالة سؤالي (اشلون تفهما وتنفذها)

الالة لا تفهم المنطق

تم انشاء لغة التجميع لكتابة البرامج قديما سؤالي (لماذا ما تزال مستخدمه)

تم انشاء مترجم من لغة التجميع الى لغة الالة هل ممكن فكرة او شرح طريقة عمل هذا المترجم

بعدها لتبسيط البرمجه تم انشاء برامج متقدمة لكتابة البرامج

وهية بدروها تحتاج الى مترجم ليترجم من هذه اللغة الى لغة التجميع ومن لغة التجميع الى لغة الالة سؤالي (لماذا لم يتم انشاء هذه البرامج لتخاطب الالة مباشرة او عمل مترجم لها دون الحاجة لرجوع للغة التجميع مثل ما حصل مع لغة التجميع) كانك تريد ان تكلم شخص باللغة ثانية لكنك محتاج الى شخص يفهم لغته وهو يوصل ما تريد قوله له اليس من الافضل تعلم هذه اللغة والتكلم معه مباشرة

بالنسبة للبايت يستطيع ان يخزن تعليمه واحدة فقط مثل حرف انجليزي او رقم

بس لماذا عند اللغة العربية او كما عرفت لغات اخرى نحتاج الى اثنين بايت كما عرفت لاحتوائهم على حروف كثيرة

الله يبارك فيك استاذي ويساعدك على توصيل المعلومة وجزيك عنا كل خير

تم تعديل هذه المشاركة بواسطة مشارف في 10 يوليو 2010 في 23:52

#33

أخويّ الكريمين: aladdin2020 وصايل،

ما تفضلتما به صحيح جداً، أحسنتما...

لقد اختصرت كثيراً في الكلام عن بنية الحاسب والنظام الثنائي ولغة الأسمبلي، لعدة أسباب:

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

لكنني أجد الآن، وبالذات من سؤال الأخ مشارف (سأجيب عنه فيما بعد بإذن الله)، أن الشرح لم يكن واضحاً، وأن الاختصار كان مخلاً. على كل حال، أنا مسرور لقدرتكما على المتابعة، وأحب أن أوضح التالي فيما يتعلق بالسؤال:

هناك اختلاف بالفعل في معنى (كيلو بايت) في عالم الحاسوب. من المعروف أن معنى (كيلو) بحد ذاتها هو (ألف)، أو 10 مرفوعة إلى القوة 3. هذا الاستخدام ذاته تشجع عليه بعض المنظمات الرسمية في عالم الحاوسوب (يريدون أن يكون معنى كيلو بايت 1000 بايت وليس 1024 بايتاً)، كما أن مصنعي الأقراص الصلبة مثلاً يستخدمونه أيضاً (معنى 80 جيجا مثلاً عند مصنعي الأقراص الصلبة هو 8000000000 بايت = 8 * 1000 * 1000 * 1000، وليس 8 * 1024 * 1024 * 1024). لكن يبقى معنى الكيلو بايت كـ 1024 بايت هو الأشهر عند علماء الحاسوب، ومصنعي الذواكر على الأقل... لماذا؟ هناك ما لم أوضحه من قبل عما يتعلق بعنونة الذاكرة (الحقيقة أن هناك الكثير مما لم يتم توضيحه من أجل تخفيف التفاصيل التي لا تهم أحداً هنا).

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

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

في حالة ثمانية خطوط مثلاً:

من 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0

. . .

إلى 1 1 1 1 1 1 1 1

وهذا يعني 256 عنواناً مختلفاً، أي 256 بايتاً مختلفاً، من 0 إلى 255.

في حالة تسعة خطوط (نعم، يمكن استخدام أي عدد من الخطوط للعنونة):

من 0 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0

. . .

إلى 1 1 1 1 1 1 1 1 1

وهذا يعني 512 عنواناً مختلفاً، أي 512 بايتاً، من 0 إلى 511.

في حالة عشرة خطوط:

من 0 0 0 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0 0 0

. . .

إلى 1 1 1 1 1 1 1 1 1 1

وهذا يعني 1024 عنواناً مختلفاً، أي 1024 بايتاً، من 0 إلى 1023. هذا العدد الأخير هو الأقرب إلى كلمة (كيلو) إذا أردنا التعبير عن سعة الذاكرة بوحدات كبيرة (كيلو، ميجا،...)، ولذلك كان معنى الكيلو في سعات الذاكرة هو 1024 منذ البداية، على الرغم من محاولات تغيير هذا المعنى الآن.

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

#34

أخي العزيز محمد المسيفري: أسر دوماً بالسماع منك، وأشكرك كثيراً على هذه الاستفسارات، فهي تساعدني على اكتشاف مكامن الخلل في الدروس، وكذلك تثري موضوع الحلقة، وتساعد الآخرين على فهم أفضل. لقد أحببت أن أخصص هذه المشاركة للرد على استفساراتك، ومناقشة طرحك...

اقتباس
هناك لغة الالة مكونة من o.1 لا تفهم الالة غيرها وتتكون من ثمانية خانات من الصفر والواحد تسمى بايت وتمثل تعليمه واحده تفهمها الالة سؤالي (اشلون تفهما وتنفذها)

الالة لا تفهم المنطق

أولاً، التوضيح الضروري التالي:

اللغة لا تتكون من خانات، سواء كانت لغة آلة أو غيرها، وإنما تتكون من تعليمات. هذه التعليمات تتشكل من عدد من الخانات (البتات). هذه التعليمات (قد) تتكون من بايت واحد أو أكثر، وإنما ضربت المثال بلغة المعالج 8085 التي تتكون كلها من بايت واحد، لكن هذا غير لازم في المعالجات الأحدث.

ثانياً، بالنسبة للسؤال: المعالج (الآلة) لا يفهم التعليمة في حقيقة الأمر، وإنما نقول هذا من باب المجاز. الحقيقة أن المعالج مجرد جهاز إلكتروني معقد جداً يحوي ملايين الأجهزة الإلكترونية الأصغر (ترانزستورات transistors). قارنه بالمسجل، هل يفهم المسجل حقاً ما هو مطبوع على كل شريط مختلف، فيصدر أصواتاً مختلفة مع كل شريط؟ كلا بالطبع، ولكنه (مصمم)، ودوائره الكهربية (مثبتة) بطريقة خاصة، بحيث ينتج كل شريط مختلف صوتاً مختلفاً. هذا هو سر الهندسة الكهربية. وبنفس الطريقة، المعالج جهاز خاص، تصميمه، وبناء دوائره الإلكترونية يؤدي إلى هذا الناتج: إشارات معينة في أسلاك معينة تؤدي إلى استجابة معينة (مثلاً إشارة معينة تنتقل من مكان إلى مكان، أو إشارة معينة تختلف قيمتها). هذا هو سر الهندسة الإلكترونية، وسر صناع الحواسيب، وهو السر الذي يجعل عدد مصنعي الحواسيب إلى يومنا هذا محدوداً جداً (على الأرجح أنت لم تسمع بغير معالجات Intel وAMD).

باختصار، هي لا تفهم التعليمات، وإنما هي مجرد آلة تستجيب للإشارات الإلكترونية استجابات خاصة حسب تصميمها، وهذه الاستجابات تعني بالنسبة لنا معاني خاصة (مثلاً أصبح في موقع ما في الذاكرة تشكيلة معينة من الإشارات الكهربية).

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

اقتباس
تم انشاء لغة التجميع لكتابة البرامج قديما سؤالي (لماذا ما تزال مستخدمه)

سؤال وجيه جداً، وهو مصدر لنقاشات طويلة بين المبرمجين. لغة التجميع صعبة التعلم،صعبة القراءة والفهم، صعبة التنقيح، ومقيدة بنوع محدد من المعالجات، وهناك اللغات عالية المستوى ذات الكفاءة العالية، فلم استخدام لغة التجميع؟ هل هو نوع من حب تعذيب الذات؟

الإجابة هنا باختصار:

الميزة التقليدية للغة التجميع منذ القدم هو أن برامج لغة التجميع أصغر حجماً، وأسرع أداءً من برامج اللغات عالية المستوى. الحق أن هذه الميزة مهمة جداً، لكن أثرها قد قل كثيراً عن الماضي. أصبحت مترجمات اللغات عالية المستوى هذه الأيام تنتج كوداً سريعاً، ينافس الكود الذي يمكن أن ينتجه المبرمج البشري باستخدام لغة التجميع. كما أن اعتبارات حجم البرنامج (ومدى حساسية سرعته) لم تعد مهمة جداً مثل الماضي، بعد الارتفاع الكبير في أحجام الذاكرة، وفي سرعات المعالجات. لكن، ما يزال هناك حيز لهذه الميزة، ولو أصغر: ما تزال هناك تطبيقات تحتاج إلى صغر شديد في الحجم، وسرعة آنية (مثل embedded programs وreal-time applications).

الميزة المهمة التي تبقى لصالح لغة التجميع حتى الآن، هي مستوى التحكم الذي تستطيع تحقيقه باستخدام لغة التجميع. لأن لغة التجميع قريبة من الآلة، فهي توفر للمبرمج تحكماً أكبر بالآلة، على عكس اللغات عالية المستوى.

ميزة مهمة جداً، يغفل عنها الكثيرون، لأن هدفها تعليمي، وهي أن لغة التجميع تجبر المبرمج على التعرف على الحاسوب بشكل أعمق كثيراً من المبرمج بلعة عالية المستوى، وهذا له فوائده الكبيرة في مدى احترافية المبرمج بلغة التجميع.

بالطبع، من فوائد لغة التجميع استخدام بعض التقنيات المتقدمة في البرمجة تتيحها لغة التجميع، وتجدها في تطبيقات مثل كتابة الفيروسات مثلاً. أيضاً، الخبرة في لغة التجميع ضرورية من أجل الهندسية العكسية (وكسر أو الدفاع عن حماية البرامج). كما أن لغة التجميع تستخدم في shellcoding.

أظن أن هذا يكفي إن كنت لا تكره لغة التجميع شخصياً :)

اقتباس
تم انشاء مترجم من لغة التجميع الى لغة الالة هل ممكن فكرة او شرح طريقة عمل هذا المترجم

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

في النهاية، الـassembler هو عبارة عن مترجم من رموز لغة التجميع إلى رموز لغة الآلة بعلاقة واحد إلى واحد. هذا يعني أنه ليس هناك في العمل الأساسي للمترجم أي تعقيد: علاقة واحد إلى واحد تعني أن هذا الرمز يشير إلى هذه التعليمة، وهذا الرمز يشير إلى تلك التعليمة، وحسب. وعند الإشارة إلى عناوين في الذاكرة باستخدام أسماء أو بعمليات حسابية، فإن المترجم يستبدل بها العناوين الفعلية عند الترجمة. لكن هناك بعض المهام الأخرى الزائدة التي يوفرها المترجم لتسهيل عمل المبرمج (هناك ما يسمى directives في لغات التجميع، ولكن شرحه خارج نطاق هذا النقاش). على كل حال، هذه التسهيلات هي مهام إضافية وليست أساسية في عمل المترجم.

ب

اقتباس
عدها لتبسيط البرمجه تم انشاء برامج متقدمة لكتابة البرامج

وهية بدروها تحتاج الى مترجم ليترجم من هذه اللغة الى لغة التجميع ومن لغة التجميع الى لغة الالة سؤالي (لماذا لم يتم انشاء هذه البرامج لتخاطب الالة مباشرة او عمل مترجم لها دون الحاجة لرجوع للغة التجميع مثل ما حصل مع لغة التجميع) كانك تريد ان تكلم شخص باللغة ثانية لكنك محتاج الى شخص يفهم لغته وهو يوصل ما تريد قوله له اليس من الافضل تعلم هذه اللغة والتكلم معه مباشرة

الإجابة عن هذا السؤال سهلة جداً: هناك مترجمات تترجم إلى لغة الآلة مباشرة بالفعل، ومترجمات أخرى (توفر) ميزة الترجمة إلى لغة التجميع أولاً. لاحظ أن الحصول على إصدارة لغة التجميع جيد جداً بالنسبة للمبرمجـ لأنه يستطع فهمها أفضل من لغة الآلة، ويستطيع التعديل عليها أو فهم عمل البرنامج الفعلي عبرها.

اقتباس
بالنسبة للبايت يستطيع ان يخزن تعليمه واحدة فقط مثل حرف انجليزي او رقم

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

اقتباس
بس لماذا عند اللغة العربية او كما عرفت لغات اخرى نحتاج الى اثنين بايت كما عرفت لاحتوائهم على حروف كثيرة

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

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

والله أعلم.

#35

جزاك الله خير استاذي احمد على التوضيح

واسمح لي على السؤال هل تنصحني بدراسة لغة التجميع او اخذ فكره عنها بصورة سريعة وهل سوف تساعدني في تعلم البرمجة او انه لا داعي لذلك

بالنسبة للمعالجات فعلا سمعت عنها وكل ما ابي اشتري كمبيوتر نسال عن المعالج مع انه مو فاهمين شنهو فايدة غير انه الفرق في السرعة بس ليش ما ندري

الحين قليلا اتضحت فكرة عمل المعالج واهميته هل هناك مثلا في منتدانا او احد المنتديات شرح لطريقة عمل المعالج

وهل يوجد شرح تخطيطي مثلا او فيديو لفهم ماذا يحدث داخل الكمبيوتر مثلا لاستجابته لضغطت زر او حرف على الكيبورد مالاستجابة التي تحدث بطريقة رسم تخطيطي

او فيديو

بمعنا مثلا لما الانسان ياكل الاكل يدخل عن طريق الفم ويحدث في الفم عمليات الهضم وتكسير لبعض اجزاء الطعام وبعدها يذهب الطعام الى كذا وكذا وكذا الى ان يتجول الى طاقة

هل يوجد شرح بالطريقة هذي مثلا لما يحدث داخل الكمبيوتر لطريقة استجابته للاحداث

واتمنى الى ادخل بالموضوع الى مواضيع اخرى قد لا تفيد القراء

واسمح لي على الاطالة بس فعلا الكمبيوتر شي عجيب تستطيع عمل به اشياء كثيرة وبطرق مخلتفة الشي الي يخليك تتسال انه اجهزة دقيقة مثل هذي تعمل كل هذي الاعمال

#36

أخي العزيز محمد...

أولاً: وإياك جزى الله خيراً وبارك فيك.

ثانياً:

اقتباس
هل تنصحني بدراسة لغة التجميع او اخذ فكره عنها بصورة سريعة وهل سوف تساعدني في تعلم البرمجة او انه لا داعي لذلك

باختصار شديد، ودون تطويل: تستطيع تعلم البرمجة بدون تعلم لغة التجميع.

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

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

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

لكن كما أسلفت، الحياة أولويات، ولهذا ألخص نصيحتي في التالي:

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

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

اقتباس
بالنسبة للمعالجات فعلا سمعت عنها وكل ما ابي اشتري كمبيوتر نسال عن المعالج مع انه مو فاهمين شنهو فايدة غير انه الفرق في السرعة بس ليش ما ندري

المعالج هو الحاسوب في النهاية، وهو أسرع المكونات، لكن سرعة الجهاز بشكل عام محدودة بسرعو المكونات الأخرى، مثل الذاكرة.

اقتباس
الحين قليلا اتضحت فكرة عمل المعالج واهميته هل هناك مثلا في منتدانا او احد المنتديات شرح لطريقة عمل المعالج

وهل يوجد شرح تخطيطي مثلا او فيديو لفهم ماذا يحدث داخل الكمبيوتر مثلا لاستجابته لضغطت زر او حرف على الكيبورد مالاستجابة التي تحدث بطريقة رسم تخطيطي

او فيديو

بمعنا مثلا لما الانسان ياكل الاكل يدخل عن طريق الفم ويحدث في الفم عمليات الهضم وتكسير لبعض اجزاء الطعام وبعدها يذهب الطعام الى كذا وكذا وكذا الى ان يتجول الى طاقة

هل يوجد شرح بالطريقة هذي مثلا لما يحدث داخل الكمبيوتر لطريقة استجابته للاحداث

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

لكي أخفف عليك الصدمة، أروي لك القصة القصيرة التالية:

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

هذا والله أعلم.

أخوك أحمد

1
#37

هههههههههههههههههه

عجبتني القصة الاخيرة

احب السرد والشرح بطريقة القصص توصل الفكرة اوضح

وفيت وكفيت استاذي احمد وما ابي اكثر من هذي وان شاء الله معاك راح نتعلم الي احنا ان شاء الله محتاجينه

جزاك الله خير وانا بنتظار الدروس القادمة ان شاء الله

#38

السلام عليكم جزاكم الله عنا كل خير وياريت تكمل باقي الدروس علي بركه الله

ملكنا هذه الدنيا قرونا وأخضعها جدود خالدونا

وسطرنا صحائف من ضياء فما نسى الزمان ولا نسينا

وما فتئ الزمان يدور حتـ ى مضى بالمجد قوم آخرونا

وأصبح لا يرى في الركب قومي وقد عاشوا أئمته سنينا

وآلمني وآلم كل حر سؤال الدهر : أين المسلمون ؟

ترى هل يرجع الماضي ؟ فإني أذوب لذلك الماضي حنينا

بنينا حقبة في الأرض ملكا يدعمه شباب طامحونا

شباب ذللوا سبل المعالي وما عرفوا سوى الإسلام دينا

#39

الحلقة الخامسة: مفهوم المتغيرات Variables

*********************************

وصلنا في الحلقة السابقة إلى هذه النتيجة: التعليمات، والبيانات التي تعمل عليها هذه التعليمات تصل إلى المعالج من الذاكرة. عرفنا كذلك أن الذاكرة هي سلسلة طويلة من البتات، لكننا قررنا أن نتعامل معها على أساس أنها سلسلة طويلة من البايتات (البايت = 8 بت)، وأن يكون لكل بايت عنوان نستطيع بواسطته الوصول إلى هذا البايت مباشرة. هذا الوصول المباشر إلى أي بايت في الذاكرة باستخدام عنوانه، دون الحاجة إلى المرور بشكل متسلسل على كل البايتات، ابتداء ًمن أول بايت حتى الوصول إلى البايت المطلوب، يسمى وصولاً عشوائياً random access، ومن أجل ذلك تسمى الذاكرة التي يأخذ منها المعالج التعليمات والبيانات بـ (ذاكرة الوصول العشوائي Random Access Memory) أو اختصاراً بالرام RAM. خاصية أخرى من خصائص هذه الذاكرة أنها لا تستطيع الاحتفاظ بمحتوياتها لمدة طويلة، ومع انقطاع الكهرباء عنها فإن كل محتوياتها تختفي، ولذلك فإنها تسمى أيضاً ذاكرة متطايرة volatile. وإذا أخذنا التسمية القديمة للذاكرة (storage) فإنها تسمى أيضاً ذاكرة مؤقتة temporary storage.

هذه النتيجة السابقة تقودنا إلى الاستنتاج التالي: كل البرامج التي نرغب بتنفيذها يجب أن تكون متوفرة (مع البيانات التي ستعمل عليها) في الذاكرة. فإذا تذكرنا أن الذاكرة التي نتكلم عنها لا تصلح للاحتفاظ بالبرامج بشكل دائم، فإن سؤالين يقفزان إلى الذهن:

الأول: من الذي (أو ما الذي) يضع البرامج في الذاكرة ابتداءً من أجل التنفيذ؟ والجواب أن نظام التشغيل (مثل الويندوز أو اللينكس) هو الذي يضع البرامج في الذاكرة، ونصف هذا الفعل بقولنا إن نظام التشغيل قد قام بـتحميل loading للبرنامج إلى الذاكرة. يحدث ذلك عادة استجابة لطلب المستخدم، إما عبر أمر في سطر الأوامر، أو (غالباً الآن) عبر نقرة بالفأرة هنا أو هناك على أيقونة برنامج أو خيار في قائمة.

الثاني: ومن أين يحمّل نظام التشغيل هذه البرامج إلى الذاكرة؟ الجواب هو أن هناك أنواعاً من الذواكر الفرعية (بخلاف الذاكرة الأساسية التي يتعامل معها المعالج مباشرة)، تستطيع الاحتفاظ بمحتوياتها بصفة دائمة permanent storage، منها الأقراص الصلبة Hard Disks، والأقراص المضغوطة Compact Disks CD، وأقراص الفلاش Flash Disks.

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

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

مثال:

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

1. إدخال من المستخدم لسنة التعيين.

2. إدخال من المستخدم لنوع المؤهل (مثلاً، شهادة ثانوية).

3. الدرجة الوظيفية الناتجة في حالة الرغبة في استخدامها لاحقاً في البرنامج.

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

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

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

ملحوظة جانبية: لاحظ أنني استخدمت الآن كلمة (الحاسوب)، وذلك حتى نتكلم بحرية بشكل عام، ولا نضطر إلى التعرض إلى التفاصيل الدقيقة حول (من) الذي يقوم بذلك بالضبط (مثلاً، نظام التشغيل أو غيره من برامج النظام compiler, linker, loader...). هذه طريقة شائعة يستخدمها الكتّاب عندما لا يريدون للتفاصيل أن تشتت التركيز الأساسي للموضوع (وعندما لا يعلمون عما يتكلمون بالضبط... سؤال للتمرين: في أي فئة تصنف كاتب هذه السطور؟).

كيف يعرف الحاسوب عدد المتغيرات التي يحتاجها البرنامج، وحجم الذاكرة المطلوب؟

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

لنفترض أن لدينا اثنان من البتات، كل منهما يحتمل إما القيمة 0 وإما القيمة 1. كم عدد القيم المختلفة (التشكيلات المختلفة) التي نستطيع الحصول عليها باستخدام هذين البتين؟

لنرَ...

0 0

1 0

0 1

1 1

أربع احتمالات مختلفة، مما يعني أربع قيم مختلفة. رمزان (0 و1) وعدد الاستخدامات الممكنة هو مرتين (خانتين)، إذن مجموع الاحتمالات هو 2 * 2 = 2 ^ 2 = 4 (الرمز ^ يعني مرفوعاً إلى القوة). ماذا عن ثلاث بتات؟

0 0 0

1 0 0

0 1 0

1 1 0

0 0 1

1 0 1

0 1 1

1 1 1

ثمانية احتمالات. رمزان، وثلاثة خانات، مجموع الاحتمالات هو 2 * 2 * 2 = 2 ^ 3 = 8. مع ثمانية بتات، يصبح مجموع الاحتمالات هو 2 ^ 8 = 256. مع 16 بت (2 بايت) مجموع الاحتمالات هو 2 ^ 16 = 65536...

ما الذي يعنيه كل هذا؟ هذا يعني أنك تستطيع باستخدام بايت واحد تمثيل متغير بشرط ألا تتعدى مجموع قيمه 256 قيمة. مثلاً، إذا كان متغيرك سيحوي أعداداً صحيحة موجبة، فمن الممكن للبايت أن يستوعب متغيرات من 0 – 255 فقط. إذا احتجت إلى أعداد أكبر، فيمكن أن تطلب حجز بايتين اثنين، أو أكثر. كيف يمكن أن تحدد عدد البايتات المحجوزة؟ اقرأ الفقرة التالية أولاً.

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

السلسة 11110000 قد ترمز للحرف ( ≡ ) أو قد تعني الرقم الموجب 240 أو الرقم السالب - 16. كما أن السلسلة 10000001 قد ترمز للحرف A، وقد تعني الرقم 65. هذا يعتمد على السياق الذي تستخدم فيه.

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

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

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

post-70171-085456800 1279608185_thumb.jp

نلاحظ مثلاً أن نوع البيانات Long Integer يأخذ أربعة بايتات (32 بت)، ولذلك فإن سعته هي 2 ^ 32 = 4294967296 عدداً مختلفاً، تم تقسيمها إلى نصفين (نصف موجب ونصف سالب): النصف الأول من 0 إلى 2147483647، والثاني من -1 إلى -2147483648، وهكذا بالنسبة للأنواع الأخرى (فيما بعد بإذن الله المزيد من التفصيل عن أنواع بيانات VBA الأخرى).

أختم الحلقة إن شاء الله بمثال يوضح أكثر مفهوم المتغيرات:

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

بدون استخدام أي وسيلة (خزن) إضافية فإن المهمة تبدو مستحيلة. لا بد من استخدام علبة ثالثة من أجل حفظ محتويات علبة الملح مؤقتاً، صب الملح في العلبة الصحيحة، ثم صب السكر من العلبة المؤقتة إلى علبة السكر الصحيحة. في عالم البرمجة، يمكن أن نترجم العملية السابقة بالشكل التالي:

الخطوة الأولى: نعلن للمترجم عن رغبتنا في ثلاثة متغيرات من نفس النوع (مثلاً، رقم صغير من نوع byte): أ وب وجـ.

الخطوة الثانية: إدخال قيمة في المتغير الأول (أ)، وقيمة أخرى في المتغير الثاني (ب) (القيمتان المطلوب التبديل بينهما).

الخطوة الثالثة: نقل قيمة المتغير (أ) إلى (جـ).

الخطوة الرابعة: نقل قيمة المتغير (ب) إلى (أ).

الخطوة الخامسة: نقل قيمة المتغير (جـ) إلى (ب). لاحظ أن المتغير (جـ) يحمل الآن قيمة المتغير (أ) السابقة.

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

الخلاصة من هذه الحلقة أنك ينبغي أن تدرك الآن التالي:

1. مفهوم المتغير variable.

2. مفهوم نوع البيانات data type.

3. كيف نحسب القيم القصوى للأرقام الثنائية.

4. أنه في المرة القادمة، من الأسهل تبديل الشريط اللاصق على العلبتين عوضاً عن القيام بكل تلك الخوارزمية المعقدة!

(يتبع إن شاء الله...)

المرفقات
var01.JPG
2
#40

السلام عليكم:

ما شاء الله يا أستاذ أحمد. . . جزاك الله خيراً

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

إن تبديل الشريط اللاصق على العلبتين أسهل بكثير من القيام بتلك الخوارزمية كما قلت وربما هذا يشير إلى الفارق بين الحاسوب والدماغ البشري . مع أننا عندما نقوم بهذه العملية ( تبديل الشريط اللاصق ) نستخدم متغيراً ثالثاً نحجز له (بايتاً) في الدماغ من أجل حفظ الشريط اللاصق بعد نزعه عن العلبة الأولى ريثما يتم نزع شريط العلبة الثانية. . . أو ما إلى ذلك!

#41

بسم الله الرحمن الرحيم

اولا حبيت اشكرك على ما تقدمه من اسلوب اكثر من رائع وتوصيل للفكره اكثر من مبهر

بصراحه انا منذ ثلاثة ايام قرأت الجزأ الاول من مذكرات حول تصميم قوعد البيانات واكملته بالكامل وكان

رائع الا درجة انه كان عندي مشكلة في التفريق بين sql و انظمة قواعد البيانات وزال الغبار

انا واعوذ بالله من كلمة انا احاول اطور نفسي في البرمجه فكان هذا المنتدى وبالاصح كانت هذه الدوره

هي اول خطوه لي في سلم النجاح

اسال الله سبحانه ان يوفقك ويلهمك الصواب دائما

كما ان لدي بعض التساؤلات ..........................ز

اولا :

اخذت كورس في لغة الجافا ولكن لم اجد الداعم لي لكي افهمه مجملا

فاتجهت اتجاها كاملا لتعلم الفيجوال بيسك ليسهل علي فيما بعد تعلم الجافا

ثانيا :

لدي خلفية في sql

والترم القادم لدي مشروع وسوف يكون عن pl/sql و form و report

ثالثا :

لدي خلفية كاملة عن html و javascript

فهل تنصحني بتعلم css و php

ام c#.net مع asp

اعتذر عن الاطالة

ولكن حبيت استشيرك

ثانيا اكرر شكري لك ونحن معك الى الامام

ملاحظه ....................

هذه اول مشاركاتي في هذا المنتدى

وهذا يعود بفضل الله ثم بفضلك

شاكر ومقدر

تلميذك:

عاشـــــــMsMـــــــــق المستحيل

#42

أخي صايل عزام،

أشكرك على المجاملة، لكنني مسرور جداً لأنك قد استفدت شيئاً من الدرس... الحمد لله.

أخي أبا يعقوب،

أولاً: مرحباً بك، وأقدّر جداً أن تكون أول مشاركاتك في هذا الموضوع... شكراً لك.

ثانياً: مرة أخرى، أشعر بالارتياح ودافع للاستمرار عندما أسمع أن ما أكتبه قابل للفهم والاستفادة، وأنه قد وصل إلى أحد ما... شكراً على المردود.

ثالثاً: أرى أن اهتماماتك متشعبة، من بينها برمجة قواعد البيانات وبرمجة الوب...

بالنسبة للجافا، فالذي قد يجعلها مستعصية في البداية هو أنها تعتمد تماماً على مفاهيم البرمجة بالكائنات OOP، فإذا لم تكن قد درست هذه المادة من قبل، فربما تجد من الصعب التعامل مع الجافا. على الرغم من أن البرمجة بالـVB مليئة بالتعامل مع الكائنات، لكنها لا تجبر المبرمج على استخدام تقنيات OOP الرسمية بشكل صريح، على خلاف الجافا. لذا، إن أحببت أن تبرمج بالجافا أو لغات .Net، فأنصحك أولاً بدراسة مبادئ البرمجة بالكائنات Object Oriented Programming.

يبدو أنك تنوي تنفيذ المشروع بالأوراكل مع حزمة Oracle Developer. كانت لي خبرة فيما مضى بالعمل مع الإصدار Firms6i مع الإصدارة القديمة من أوراكل Oracle8، وعلى الرغم من أنني قد نسيت كثيراً، لكن إن واجهت أي مشاكل في PL/SQL فيمكن أن نتعاون معاً في أكواد هذه اللغة.

للأسف، لا أستطيع أن أمنحك رأياً في برمجة الوب، لكن الأساس معك HTML +CSS، ولغة جهة العميل JavaScript. بالنسبة لجانب الخادم server، فكلا اللغتين PHP وASP.Net لها ميزاتها وأنصارها، والاختيار يعتمد غالباً على عوامل خارجة عن اللغ نفسها (مثلاً، أين تخطط أن تعمل في المستقبل). أحيلك على قسم برمجة وتصميم الوب في هذا المنتدى، لعلك تجد فيه ما ينفع.

والله أعلم.

أخوكما أحمد.

#43

مشكور استاذي احمد مبارك الحيقي

وانت اكيد من الفئة الاولى والله يوفقك لما يحبه ويرضاه

الشرح واضح واحنا بانتظار الدروس القادمة بشغف الله يعينك ويجزيك عنا كل خير

#44

اولا : السلام عليكم ورحمة الله وبركاته

واسعد الله ايامكم بكل خير

اجبت ووفيت في طرح المقصود جزاك الله كل خير ......................

فعلا نحن نستخدم oracle10

وان شاء الله اذا عملت عالمشروع سوف اقوم بطرحه لتمطر علي بنقدك السخي والذي ساستفيد منه

في حياتي البرمجيه

واعجبتني جملتلك بل جعلتني افكر قليلا مع نفسي

هناك ظروف خارجه لتعلم لغه مثلا الموقع الذي ستعمل فيه

ولدي معرفه في لغة الجافا oop ولكن للاسف البرامج التي عملت عليها قليله

وكان آخرها برناج حساب معدل الطلاب لكن اريد ان اتوسع في عمل البرامج

فلذلك نحن معك وسابذل قصاري جهدي في برنامج vb

نحن معك حتى النفس الاخير

ثانيا: ما هي الدورات التي تنصحنا بها سواء المقدمه من اوراكل او مايكروسوفت

مثلا

دورة ...................ocp

ودورة ..................DBA

--------------------------------------------

وهناك دورات سمعت عنها ولكن لا اعلم ماذا تقدم من معلومات

مثل.................... MCSE و MCAD و MCDBA

اعتذر عن الاطالة ولكن حبا في التوجه الصحيح

تلميذك

عاشــ MsMـــــــق المستحيل

#45

السلام عليكم ورحمة الله وبركاته

خبيرنا احمد المبارك

اقتباس
أشعر بالارتياح ودافع للاستمرار عندما أسمع أن ما أكتبه قابل للفهم والاستفادة، وأنه قد وصل إلى أحد ما

أسأل الله أن يتقبل منك ويثيبك الجنة

استمر يا أخى فنحن متابعون .. والموضوع جميل وشيق بأسلوبك ..

وأنا متابع منذ أول حلقة وفى انتظار مزيدك.

(وأرى أن نزيد الجرعة قليلا قبل رمضان )

أخوك

slave

{العلم قبل العمل} ... مذكرات حول قواعد تصميم البيانات .

خير الناس أنفعهم للناس

#46

السادة الزملاء الأعضاء

السلام عليكم جميعاً ورحمة الله وبركاته.

لو سمحتم لي ، باسمكم جميعاً أدعو الله تعالى ألا شيء يؤخر الأستاذ أحمد عن متابعة هذه الدروس الرائعة ونحن بانتظار درس جديد

أخوكم :

صايل عزام

#47

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

التغيير هو أنني سأطرح بإذن الله الدروس القادمة في مواضيع مستقلة، وليس في نفس الموضوع الواحد الطويل. يأتي هذا تماشياً مع العصر، للأسباب التالية:

1. هناك من يأخذ فكرة أولية عن موضوع، فإذا لم يعجبه من أول مرة، لا يعود إليه حتى لو كان المحتوى متجدداً.

2. هناك من يكتئب من الموضوعات الطويلة، ويفكر في كمية الصفحات التي ينبغي له أن يمر عليها فيلغي الفكرة من رأسه، أما الموضوعات المستقلة القصيرة فهي أحب إلى النفوس (ثقافة الـ take away مرة أخرى).

3. هذا الأسلوب أكثر فعالية في ظل نظام النقاط الجديد في المنتدى، إذ أن نقاط سلسلة طويلة قد تأخذ من كاتبها أشهراً تساوي نقاط درس قصير قد لا يستغرق دقائق في نقله من مكان آخر.

وسأبدأ إن شاء الله في طرح أول درس مستقل ابتداءً من الحلقة السادسة...

أخوكم أحمد

تم تعديل هذه المشاركة بواسطة أحمد مبارك الحيقي في 31 يوليو 2010 في 21:38

2
#48

فينك استاذ احمد مبارك

نريد البقية

جزاك الله خير الجزاء

#49

السلام عليكم ورحمة الله

الإخوة الكرام تحية طيبة وبعد

فإنه لزاما علينا ومن باب رد الجميل وتشجيعا على مواصلة هذه المذكرات الرائعة

التى يقدمها الأستاذ محمد الحيقى أن ندعو له عن ظهر غيب .

اللهم وفقنا وإياه لما يحبه الله ويرضاه وسدد خطاه و اجعل هذا العمل القيم فى ميزان حسانته

اللهم آمين يارب العالمين

#50

والله وحشتنا هذه الأيام ... كيفك أستاذنا أحمد

أرسلت لك أكثر من بريد خاص ولم أتلقى منك رداً ،، أرجو أن تكون أنت وأسرتك الكريمة بخير.

طمئنى عليك.

تحياتى

محمد ندا

... بقمة السعادة .. أعود بإذن الله لصحبتكم الرائعة قريباً ...

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…