درس مفصل وشامل لنظام العد والترميز في الحاسوب
يُشكل فهم أنظمة العد والترميز حجر الزاوية في استيعاب كيفية عمل الحواسيب على مستوياتها الأساسية. فالحواسيب، بطبيعتها الجوهرية، هي آلات رقمية تعتمد على تمثيل المعلومات في هيئة إشارات كهربائية، والتي تُترجم إلى حالتين أساسيتين: إما وجود إشارة كهربائية (تُرمز عادةً بالرقم 1) أو غيابها (تُرمز بالرقم 0). هذا التباين الجوهري بين طريقة التفكير البشري، التي تعتمد على الأعداد العشرية والأبجدية المعقدة، وبين الآلية البسيطة التي تعمل بها المكونات المادية للحاسوب، يجعل دراسة أنظمة العد والترميز ليست مجرد تفصيل تقني، بل ضرورة أساسية لفهم العمق الفني للحوسبة.
تتيح لنا هذه الدراسة الغوص في كيفية تحويل المعلومات المعقدة التي نتعامل معها يوميًا (مثل النصوص والصور والأصوات والأرقام) إلى سلسلة من الأصفار والآحاد التي يستطيع الحاسوب معالجتها بفعالية وسرعة فائقة. هذا الدرس سيتناول هذه الأنظمة بالتفصيل، من المفاهيم الأساسية لأنظمة العد المختلفة إلى تعقيدات تمثيل الأرقام الصحيحة والكسرية، وصولاً إلى آليات ترميز الحروف والرموز، مع ربط كل ذلك بكيفية عمل المترجمات والمكونات المادية للحاسوب.
1. أساسيات أنظمة العد (Number Systems Fundamentals)
نظام العد هو إطار منظم يُستخدم لتمثيل الكميات العددية، ويقوم على مجموعة محددة من الرموز (الأرقام) وقواعد صارمة تحدد قيمة الرقم بناءً على موقعه داخل العدد.
1.1. النظام العشري (Decimal System - Base 10)
النظام العشري هو النظام الذي نستخدمه بشكل طبيعي في حياتنا اليومية وفي جميع تعاملاتنا الحسابية. يتميز هذا النظامزايدة للأساس 10.
مثال توضيحي: الرقم العشري 7.392، على الرغم من بساطة كتابته، هو اختصار لتمثيل أكثر تفصيلاً يعكس القيمة الموضعية لكل رقم: 7 × 10^3 (سبعة آلاف)
3 × 10^2 (ثلاثمائة)
9 × 10^1 (تسعون)
2 × 10^0 (وحدتان) أي أن الرقم يُمكن التعبير عنه بالصيغة العامة التالية لسلسلة من المعاملات a_n: a_n-1 * 10^(n-1) + a_n-2 * 10^(n-2) + ... + a_1 * 10^1 + a_0 * 10^0 + a_-1 * 10^-1 + a_-2 * 10^-2 + ....
1.2. النظام الثنائي (Binary System - Base 2)
في تباين مباشر مع النظام العشري، يُعد النظام الثنائي لغة الحواسيب الأم. هذا النظام هو الأساس الذي تُبنى عليه جميع العمليات الرقمية داخل أي جهاز حاسوبي، وذلك لعدة أسباب جوهرية:
الأساس: هو 2.
الرموز: يقتصر على استخدام رقمين فقط: 0 و 1 [145, 1مثال تحويل من ثنائي إلى عشري: لنأخذ الرقم الثنائي 1011two كمثال:
(1 × 2^3) = 8
(0 × 2^2) = 0
(1 × 2^1) = 2
(1 × 2^0) = 1 بجمع هذه القيم، نحصل على القيمة العشرية: 8 + 0 + 2 + 1 = 11ten. مثال آخر: (1101)2 تساوي (13)10. يُمكن التحويل من ثنائي إلى عشري ببساطة عن طريق جمع قوى العدد 2 المقابلة للبتات ذات القيمة 1.
مصطلحات ومفاهيم أساسية في النظام الثنائي:
البت (Bit): الوحدة الأساسية للمعلومات في الحى يسار العدد الثنائي. يحمل أكبر وزن موضعي.
النيبل (Nibble): مجموعة مكونة من أربعة بتات.
البايت (Byte): مجموعة مكونة من ثمانية بتات، وهو يُعد وحدة قياسية لتخزين ومعالجة البيانات.
الكلمة (Word): هي كمية البيانات التي يستطيع المعالج معالجتها في عملية واحدة. يختلف حجم الكلمة باختلاف معمارية الحاسوب (مثلاً، 32 بت أو 64 بت).
تُستخدم قوى العدد 2 أيضًا كوحدات قياس في سعة التخزين والبيانات في مجال الحاسوب:
كيلوبايت (KB): 10^3 بايت في النظام العشري، أو 2^10 بايت (1024 بايت) في سياق الحاسوب (تُسمى كيبي بايت KiB).
ميغابايت (MB): 10^6 بايت (عشري) أو 2^20 بايت (ميبي بايت MiB).
غيغابايت (GB): 10^9 بايت (عشري) أو 2^30 بايت (جيبي بايت GiB).
تيرابايت (TB): 10^12 بايت (عشري) أو 2^40 بايت (تيبي بايت TiB) [54, 103, 223, 282, الثنائي 110 يُمكن تمثيله بالرقم الثماني 6.
1.4. النظام السداسي عشري (Hexadecimal System - Base 16)
النظام السداسي عشري هو نظام عد يعتمد على الأساس 16. يتميز هذا النظام بـ:
الرموز: يستخدم 16 رمزًا مميزًا: الأرقام من 0 إلى 9، بالإضافة إلى الأحرف A, B, C, D, E, F التي تمثل القيم العشرية من 10 إلى 15 على التوالي.
الأهمية في الحوسبة: يُعد هذا النظام شائعًا جدًا في البرمجة منخفضة المستوى وفي تمثيل عناوين الذاكرة والبيانات الثنائية بسبب العلاقة المباشرة بينه وبين النظام الثنائي: كل أربعة بتات ثنائية (2^4 = 16) تُمكن تمثيلها برقم سداسي عشري واحد. هذا يجعله أكثر إيجازًا وأسهل في القراءة للبشر مقارنةً بسلاسل البتات الطويلة.
مثال على الثوابت السداسية عشرية
في Verilog:
في لغة وصف الأجهزة Verilog،
يُمكن تحديد الثوابت السداسية عشرية
باستخدام تنسيق معين.
على سبيل المثال، 8'h4
تُحدد ثابتًا سداسيًا عشريًا
بحجم 8
بتات بقيمة 4.
أما 4'b0100
فتشير إلى ثابت ثنائي 4
بتات بقيمة 4،
وهو نفس قيمة 4'd4
(قيمة عشرية 4
بت).
2. تمثيل الأعداد الصحيحة (Integer Representation)
تُخزن الأعداد الصحيحة في الحاسوب باستخدام عدد ثابت من البتات (على سبيل المثال، 8 بت، 16 بت، 32 بت، أو 64 بت). يُحدد هذا العدد من البتات نطاق القيم التي يمكن تمثيلها. يختلف تمثيل الأعداد الصحيحة باختلاف ما إذا كانت الأعداد موجبة فقط (غير مُوقّعة) أو تتضمن أعدادًا سالبة (مُوقّعة).
2.1. الأعداد الصحيحة غير المُوقّعة (Unsigned Integers)
تُستخدم الأعداد الصحيحة غير المُوقّعة لتمثيل القيم غير السالبة (أي الصفر والأعداد الموجبة فقط): * أصغر قيمة: 0 (000...000 ثنائي). * أكبر قيمة: 4,294,967,295 (111...111 ثنائي).
2.2. الأعداد الصحيحة المُوقّعة (Signed Integers)
لتمثيل الأعداد السالبة بالإضافة إلى الأعداد الموجبة والصفر، تُستخدم ثلاث طرق رئيسية. كل طريقة لها آلياتها الخاصة لتفسير بت الإشارة وإجراء العمليات الحسابية.
2.2.1. تمثيل الإشارة والقيمة المطلقة (Sign-and-Magnitude)
هذه الطريقة هي الأكثر بديهية وتُحاكي الطريقة التي نكتب بها الأرقام السالبة يدويًا (بإضافة علامة '-' قبل الرقم).
آلية العمل:
يُخصص البت الأكثر أهمية (MSB) (البت الموجود في أقصى اليسار) لتمثيل الإشارة: 0 يعني موجب، و 1 يعني سالب.
تُمثل باقي البتات (من اليمين إلى البت قبل الأخير) القيمة المطلقة للعدد.
مثال: في نظام 4 بت:
العدد +7 يُمثل ثنائيًا كـ 0111 (0 للإشارة الموجبة، 111 للقيمة 7).
العدد -7 يُمثل ثنائيًا كـ 1111 (1 للإشارة السالبة، 111 للقيمة 7).
عيوب:
تمثيلان للصفر: يوجد تمثيلان للصفر: +0 (0000) و -0 (1000). هذا التعقيد يزيد من صعوبة تصميم الدوائر الحسابية.
تعقيد العمليات الحسابية: عمليات الجمع والطرح تكون معقدة لأنها تتطلب فحص الإشارات وقيم البتات بشكل منفصل.
2.2.2. تمثيل المكمل الأحادي (One's Complement)
هذه الطريقة توفر وسيلة لتمثيل الأعداد السالبة عن طريق "عكس" الب العدد +7 يُمثل ثنائيًا كـ 0111. * العدد -7 يُمثل ثنائيًا كـ 1000 (عكس 0111).
مصطلح إضافي: يُستخدم مصطلح "المكمل الأحادي" أيضًا للإشارة إلى عملية عكس كل بت في أي نمط ثنائي.
عيوب:
تمثيلان للصفر: تمامًا كما في تمثيل الإشارة والقيمة المطلقة، يوجد هنا أيضًا تمثيلان للصفر: +0 (0000) و -0 (1111).
صعوبة في العمليات الحسابية: تتطلب عمليات الجمع والطرح معالجة خاصة للحمل الزائد (end-around carry).
2.2.3. تمثيل المكمل الثنائي (Two's Complement)
يُعد تمثيل المكمل الثنائي هو التمثيل الأكثر شيوعًا وفعالية للأعداد الصحيحة المُوقّعة في جميع الحواسيب الحديثة. السبب الرئيسي لانتشاره هو تبسيطه لدوائر الجمع والطرح بشكل كبير.
آلية العمل:
لتحويل عدد موجب إلى مكمله الثنائي السالب، تُتبع الخطوات التالية بدقة:
اعكس جميع بتاته: أي، احصل على المكمل الأحادي للعدد. (كل 0 يصبح 1، وكل 1 يصبح 0 0000 0000 0000 0000 0000 0010`.
عكس جميع بتاته (المكمل الأحادي):
1111 1111 1111 1111 1111 1111 1111 1101.إضافة 1 إلى النتيجة:
1111 1111 1111 1111 1111 1111 1111 1101+ 1----------------------------------------1111 1111 1111 1111 1111 1111 1111 1110(وهو تمثيل -2 عشريًا) [59, 231 - BتُصبحA + (-B)`.
المدى (Range): باستخدام
nبت، يمكن تمثيل الأعداد الصحيحة المُوقّعة في المكمل الثنائي في المدى من (-2^(n-1)) إلى (2^(n-1) - 1).أكبر عدد سالب يمكن تمثيله: هو النمط الثنائي حيث يكون MSB هو 1 وباقي البتات أصفار (مثلاً
100...00)، وقيمته هي -2^(n-1).أكبر عدد موجب يمكن تمثيله: هو النمط الثنائي حيث يكون MSB هو 0 وباقي البتات وحدات (مثلاً
011...11)، وقيمته هي 2^(n-1) - 1.مثال: في نظام 32 بت، المدى هو من -2,147,483,648 إلى 2,147,483,647.
عمليات الطرح باستخدام المكمل الثنائي (Detailed Examples): لفهم كيفية عمل الطرح بشكل مباشر في المكمل الثنائي، يمكننا تتبع الأمثلة التالية:
مثال 1: 72532 - 3250 (باستخدام المكمل العشري لأساس 10، وهو مفهوم مماثل للمكمل الثنائي):
العدد الأول (Minuend) M = 72532.
العدد الثاني (Subtrahend) N = 3250. لضمان نفس عدد الخانات، نكتبه كـ 03250.
المكمل العشري لُشير إلى أن النتيجة موجبة.
النتيجة النهائية = 69282.
مثال 2: (+5) - (+2) = (+3) باستخدام 4 بت في المكمل الثنائي:
(+5) = 0101 ثنائي.
(+2) = 0010 ثنائي.
نحول العملية إلى جمع:
0101 + (-0010)لإيجاد
-0010(مكمل ثنائي):عكس
0010->1101(مكمل أحادي).إضافة 1 ->
1110(مكمل ثنائي).
الآن نجمع:
0101(+5)+ 1110(-2)1 0011(الناتج، حيث 1 في البت الخامس هو حمل زائد).يُتجاهل بت الحمل الزائد (البت الأول على اليسار)، والنتيجة هي 0011، وهو التمثيل الثنائي لـ +3. يُشير وجود حمل زائد هنا إلى أن النتيجة موجبة.
مثال 3: (+2) - (+5) = (-3) باستخدام 4 بت في المكمل الثنائي [159,
(+2)+ 1011(-5) -------1101` (الناتج).لا يوجد حمل زائد في هذه الحالة. النتيجة هي 1101، وهي التمثيل الثنائي للمكمل الثنائي لـ -3. يشير عدم وجود حمل زائد إلى أن النتيجة سالبة، ويجب أخذ مكملها الثنائي (عكس البتات ثم إضافة 1) لمعرفة القيمة المطلقة (مثلاً، مكمل 1101 هو 0011، أي 3).
امتداد الإشارة (Sign Extension Shortcut): عندما يتم تحويل عدد ثنائي مُوقّع من نظام بتات أصغر إلى نظام بتات أكبر (على سبيل المثال، من 16 بت إلى 32 بت)، فإنه من الضروري الحفاظ على قيمة العدد الصحيحة، بما في ذلك إشارته. يتم ذلك عن طريق تكرار (نسخ) قيمة بت الإشارة (البت الأكثر أهمية) لملء جميع البتات الجديدة التي تم إضافتها على اليسار.
مثال: تحويل العدد العشري 2 (الذي يُُمثل بـ 16 بت ثنائي) إلى 32 بت:
تمثيل +2 في 16 بت:
0000 0000 0000 0010(بت الإشارة هو 0).لتحويله إلى العشري -2 (الذي يُُمثل بـ 16 بت ثنائي في المكمل الثنائي) إلى 32 بت:
تمثيل -2 في 16 بت (عن طريق عكس +2 ثم إضافة 1):
1111 1111 1111 1110(بت الإشارة هو 1).لتحويله إلى 32 بت، نكرر بت الإشارة (1) 1 (Arithmetic Overflow):** يُعد الفيضان ظاهرة حاسوبية تحدث عندما تتجاوز نتيجة عملية حسابية (مثل الجمع أو الطرح) المدى الذي يمكن تمثيله بواسطة عدد البتات المخصصة للتخزين.
تحديد الفيضان: في الأعداد الصحيحة المُوقّعة (باستخدام
nبت)، يجب أن تقع النتيجة ضمن المدى المحدد من (-2^(n-1)) إلى (2^(n-1) - 1). إذا خرجت النتيجة عن هذا المدى، يحدث فيضان.آلية الكشف: في تمثيل المكمل الثنائي، يُمكن اكتشاف الفيضان بسهولة. يحدث الفيضان في الجمع إذا كان:
مجموع عددين موجبين ينتج عنه عدد سالب.
مجموع عددين سالبين ينتج عنه عدد موجب.
(لا يحدث فيضان أبدًا عند جمع عدد موجب مع عدد سالب).
السلوك بعد الفيضان:
بشكل افتراضي، في العديد من المعماريات، يتم تجاهل بت الحمل الزائد، وتكون النتيجة هي القيمة المقطوعة التي تقع ضمن المدى المُحدد (وهو ما يُعرف بالحساب Modulo).
تستخدم بعض المعماريات الحديثة (خاصة في معالجة الوسائط المتعددة) ما يُسمى بعمليات "الإشباع" (Saturating Operations). في هذه العمليات، إذا حدث فيضان، يتم ضبط النتيجة تلقائيًا على أكبر قيمة موجبة ممكنة (إذا كانت النتيجة الأصلية أكبر من الحد الأقصى الموجب) أو على أصغر قيمة سالبة ممكنة (إذا كانت النتيجة الأصلية أصغر من الحد الأقصى السالب)، بدلاً من الدوران إلى الجانب الآخر من المدى. هذا السلوك أكثر رغبة في تطبيقات مثل تعديل مستوى الصوت، حيث لا يُرغب في أن يصبح الصوت هادئًا فجأة بعد الوصول إلى أقصى مستوى.
الاستثناءات/المقاطعات: يُمكن للحاسوب إطلاق "استثناء" (exception) أو "مقاطعة" (interrupt) عند حدوث فيضان لإعلام البرنامج بوجود خطأ في الحساب.
3. تمثيل الأرقام العشرية/الكسرية (Floating-Point Numbers)
تُعد الأرقام ذات الفاصلة العائمة ضرورية لتمثيل الأعداد "الحقيقية" في الرياضيات، أي الأرقام التي تحتوي على جزء كسري. تكمن أهميتها في قدرتها على تمثيل نطاق هائل من القيم، بدءًا من الكسور الصغيرة جدًا (مثل 2.0 × 10^-38) وصولاً إلى الأعداد الكبيرة جدًا (مثل 2.0 × 10^38) [71, 164, 196,9 أو 3.15576 × 10^9.
العدد المُطَبّع (Normalized Number): هو عدد مكتوب في التدوين العلمي بحيث يكون هناك رقم واحد غير صفري فقط على يسار الفاصلة العشرية (أو "الفاصلة الثنائية" في النظام الثنائي). في النظام الثنائي، هذا الرقم غير الصفري يكون دائمًا 1.
3.2. معيار IEEE 754
هو المعيار الدولي الأكثر انتشارًا لتمثيل الأرقام ذات الفاصلة العائمة في الأنظمة الحاسوبية [74, 75, 76, 86, 220, 233, 234, 246, 247, 248, 263, 279, 292:
بت الإشارة (Sign Bit - S):
يُخصص بت واحد (أقصى اليسار) لتمثيل إشارة العدد.
إذا كان S = 0، فالعدد موجب.
إذا كان S = 1، فالعدد سالب.
الحقل الأسي (Exponent Field):
يُمثل هذا الحقل أس العدد، ولكن ليس قيمته الفعلية مباشرةً، بل قيمة مُنحازة (Biased Notation).
التحيز (Bias): هو قيمة ثابتة تُضاف إلى الأس الفعلي للعدد قبل تخزينه. عند استرجاع الأس 220, 247, 253, 279, 306, 312, 365, 371].
في الدقة المزدوجة (Double Precision)، قيمة التحيز هي 1023.
يتم تمثيل الأس الأكثر سلبية بالنمط
00...00ثنائي، والأس الأكثر إيجابية بالنمط11...11ثنائي.
الحقل الكسري (Fraction Field) / Mantissa (Significand):
يُمثل هذا الحقل الجزء الكسري من العدد المطبع. هذا يوفر بتًا إضافيًا لزيادة دقة تمثيل العدد دون زيادة المساحة التخزينية. فإذا كانت M هي متجه البتات في الحقل الكسري المخزن، فإن القيمة الفعلية للـ Mantissa هي
1.M.
صيغ تمثيل IEEE 754:
الدقة المفردة (Single Precision - 32 بت):
1 بت للإشارة (S).
8 بتات للحقل الأسي (Exponent).
23 بت للحقل الكسري (Fraction).
الصيغة العامة: `(-1)^S × (1 + Fraction)
الدقة المزدوجة (Double Precision - 64 بت):
1 بت للإشارة (S).
11 بت للحقل الأسي (Exponent).
52 بت للحقل الكسري (Fraction).
الصيغة العامة:
(-1)^S × (1 + Fraction) × 2^(Exponent - 1023).المدى: توفر دقة أكبر ونطاقًا أوسع بكثير، حيث يمكنها تمثيل أعداد صغيرة جدًا تصل إلى حوالي 2.0 × 10^-308 وأعداد كبيرة جدًا تصل إلى حوالي 2.0 × 10^308.
الفيضان (Floating-Point Overflow) والتدفق السفلي (Floating-Point Underflow):
الفيضان (Overflow): يحدث عندما تكون القيمة المطلقة للأس الموجب (بعد التحيز) كبيرة جدًا بحيث لا يمكن تمثيلها في الحقل الأسي المخصص [71, بعة (Denormalized Numbers):** يسمح معيار IEEE 754 بتمثيل الأرقام "غير المطبعة" أو "دون المعيارية" (subnormals). هذه الأرقام لها أس صفري (بعد التحيز) ولكن جزء كسري غير صفري. تتيح هذه الميزة ما يُعرف بـ "التدفق السفلي التدريجي" (Gradual Underflow)، حيث يُمكن للعدد أن يفقد الدقة تدريجيًا كلما اقترب من الصفر بدلاً من أن يصبح صفرًا فجأة. هذا يساعد في الحفاظ على دقة العمليات الحسابية للأعداد الصغيرة جدًا.
3.3. عمليات الفاصلة العائمة (Floating-Point Operations)
تُعد العمليات الحسابية على الأرقام ذات الفاصلة العائمة أكثر تعقيدًا بكثير من عمليات الأعداد الصحيحة، وذلك بسبب الحاجة إلى محاذاة الأسس، وتطبيع النتائج، والتعامل مع التقريب [165, 197, 249, 251, 255, 258, 30قمين عشريين في الأس.
الخطوات الأساسية:
محاذاة الأسس (Align the Exponents):
هذه هي الخطوة الأولى والأكثر أهمية. يجب أن تكون الأسس متساوية قبل البدء في جمع الأجزاء الكسرية.
يتم ذلك عن طريق تحريك (shifting) الأجزاء الكسرية للعدد الذي يحمل الأس الأصغر إلى اليمين، مع زيادة الأس الخاص به، حتى يتطابق مع الأس الأكبر. كل مرة يتم فيها تحريك الجزء الكسري لليمين خانة واحدة، يزداد الأس بمقدار واحد.
مثال: الرقم الأصغر هو 1.610 × 10^-1. الأس الأكبر هو ريك.
بتات الحراسة والتقريب (Guard and Round Bits): لضمان الدقة أثناء عملية المحاذاة والتقريب اللاحق، تُستخدم بتات إضافية تُعرف بـ "بتات الحراسة" (Guard bits) و "بتات التقريب" (Round bits) و"البت اللزج" (Sticky bit). هذه البتات تُخزن الأرقام التي تخرج من حدود الـ significand الأساسي أثناء التحريك، مما يُمكننا من إجراء تقريب أكثر دقة لاحقًا.
جمع الأجزاء الكسرية (Add the Significands):
بعد أن أصبحت الأسس مت 369].
تطبيع النتيجة (Normalize the Sum):
قد لا تكون النتيجة النهائية بعد الجمع في الصورة المطبعة (Normalized Form)؛ أي قد تحتوي على أكثر من رقم واحد على يسار الفاصلة.
في هذه الحالة، يجب تحريك الفاصلة مرة أخرى (لليمين لتقليل عدد الأرقام على اليسار، أو لليسار لتقليل الأصفار البادريك)، يجب التحقق مما إذا كان الأس لا يزال يتناسب مع حجم الحقل المخصص له. إذا أصبح الأس كبيرًا جدًا، يحدث فيضان؛ وإذا أصبح سالبًا جدًا، يحدث تدفق سفلي.
التقريب (Rounding):
بما أننا نعمل بدقة محدودة (في مثالنا، 4 أرقام في الـ significand)، يجب تقريب النتيجة النهائية.
تُطبق قواعد تقريب قياسية (مثل "التقريب إلى الأقرب" أو "التقريب إلى الزوجي") لتحديد ما إذا كان يجب زيادة الرقم الأخير أو تركه كما هو [79, 252, 311, 370 - Units in the Last Place). تُشير ULP إلى عدد البتات الخاطئة في البتات الأقل أهمية من الـ significand بين العدد الحقيقي والعدد المُمثل. يضمن معيار IEEE 754 أن يكون العدد الذي ينتجه الحاسوب ضمن نصف وحدة ULP من القيمة الحقيقية، بشرط عدم وجود فيضان أو تدفق سفلي أو عمليات غير صالحة.
إذا كان التقريب سيؤدي إلى تغيير كبير (مثل إضافة 1 إلى سلسلة من 9s)، فقد يتطلب ذلك جولة إضافية من التطبيع.
3.3.2. ضرب الفاصلة العائمة (Floating-Point Multiplication):
دعنا نأخذ مثالًا لضرب عددين في التدوين العلمي (مثل 1.110 × 10^10 و 9.200 × 10^-5) مع نفس افتراضات الدقة السابقة (9, 374, 378]. * إذا كانت الأسس مخزنة بصيغة التحيز (Biased Form)، فيجب جمع الأسس المتحيزة ثم طرح قيمة التحيز مرة واحدة من المجموع للحصول على الأس الفعلي الصحيح. * مثال: * الأسس غير المتحيزة: 10 + (-5) = 5. * باستخدام الأسس المتحيزة (بافتراض تحيز 127): (10 + 127) + (-5 + 127) = 137 + 122 = 259. * نطرح التحيز مرة واحدة من المجموع: 259 - 127 = 132. هذه القيمة 132 هي6, 319, 375, 378]. * مثال: 1.110 × 9.200 = 10.212000. * يجب وضع الفاصلة العشرية في الناتج بناءً على عدد الخانات بعد الفاصلة في كلا العددين الأصليين (في المثال، 3 + 3 = 6 خانات بعد الفاصلة).
**تطبيع النتيجة (Normalize 258, 317, 376].
يتم التحقق من الفيضان أو التدفق السفلي للأس في هذه المرحلة. (يمكن أن يحدث التدفق السفلي إذا كان كلا العددين الأصليين صغيرين جدًا).
التقريب (Rounding):
يتم تقريب الـ significand للناتج إلى العدد المطلوب من الأرقام.
مثال: 1.0212 × 10^6 تُقرب إلى
1.021 × 10^6.إذا أدى التقريب إلى الحاجة لتطبيع إضافي، فيجب إجراء جولة أخرى من التطبيع والتحقق من الأس.
تحديد إشارة الناتج (Determine the Sign of the Product):
تُحدد إشارة الناتج بناءً على إشارات العددين الأصليين.
4. أنظمة الترميز (Encoding Systems)
بالإضافة إلى تمثيل الأرقام، تحتاج الحواسيب أيضًا إلى تمثيل أنواع أخرى من المعلومات، مثل النصوص والأحرف والرموز. يتم تحقيق ذلك من خلال أنظمة الترميز، التي تُعين قيمة رقمية فريدة لكل حرف أو رمز.
4.1. ASCII (American Standard Code for Information Interchange)
يُعد ASCII واحدًا من أقدم وأشهر معايير ترميز الأحرف، وكان بمثابة العمود الفقري للاتصالات النصية في الحواسيب لسنوات عديدة.
معيار أحادي البايت (8-bit): يُعرف كل حرف أو رمز في ASCII بقيمة عددية فريدة تُمكن تخزينها في بايت واحد (8 بت). على الرغم من أن ASCII الأصلي كان 7 بتات (128 رمزًا)، إلا أن النسخ الموسعة تستخدم 8 بتات (256 رمزًا) لتمثيل المزيد من الأحرف. الأرقام العشرية: (0-9). على سبيل المثال، الرقم '0' (الحرف) له قيمة ASCII 48.
علامات الترقيم والرموز الخاصة: مثل علامة التعجب (!)، علامة الدولار ($)، علامة النجمة (*)، علامة الزائد (+) [65, 235, 294, 353, 460, 461, 462, 4؟'.
رموز التحكم (Control Codes): وهي رموز غير قابلة للطباعة تُستخدم لأغراض الاتصال والتحكم، مثل المسافة (SPACE)، ورموز فاصل المعلومات مثل FS (فاصل الملفات)، GS (فاصل المجموعات)، RS (فاصل السجلات)، و US (فاصل الوحدات).
4.2. Unicode
مع التوسع العالمي للحوسبة والحاجة إلى تمثيل النصوص بلغات متعددة تحتوي على أحرف غير لاتينية (مثل العربية والصينية واليابانية)، أصبح ASCII غير كافٍ. هنا جاء دور Unicode.
معيار عالمي: Unicode هو معيار ترميز أحرف يهدف إلى توفير تمثيل رقمي فريد لكل حرف في جميع لغات العالم تقريبًا.
التوافق مع ASCII: الأحرف الـ 128 الأولى في Unicode مطابقة تمامًا لأحرف ASCII، مما يضمن التوافق الرجعي.
التوسعات: يتجاوز Unicode حدود ASCII ليشمل ملايين الأحرف، بما في ذلك:
الأحرف من جميع اللغات الحية والميتة.
الرموز الرياضية والفنية والعلمية.
رموز الإيموجي.
إصدارات Unicode: يُشير المصدر إلى إصدارات مختلفة مثل Unicode 16.0.
أهميته: يُعد Unicode أساسًا لمعظم أنظمة التشغيل الحديثة وتطبيقات الويب وقواعد البيانات، مما يتيح التعامل مع نصوص متعدد كل رقم عشري بشكل منفصل باستخدام 4 بتات ثنائية.
مثال: الرقم العشري 128 في BCD يُمثل كـ
0001 0010 1000. (الرقم 1 هو 0001، الرقم 2 هو 0010، الرقم 8 هو 1000).
الاستخدامات: يُستخدم BCD بشكل أساسي في التطبيقات التي تتطلب دقة عشرية عالية، مثل الآلات الحاسبة، والساعات الرقمية، والأنظمة المالية، حيث يكون من المهم تجنب أخطاء التقريب التي قد تحدث عند تحويل الأعداد العشرية إلى ثنائي خالص (خاصة الكسور العشرية التي قد لا يكون لها تمثيل ثنائي دقيق).
ملاحظة: الأرقام العشرية من 0 إلى 9 لها نفس التمثيل الثنائي المكون من 4 بتات في كل من BCD والنظام الثنائي العادي.
5. أنظمة أخرى, 234, 245, 279, 292, 293, 304, 338, 341, 351, 352, 363]، فإن مفهوم الترميز المنحاز يمكن اعتباره طريقة عامة لتمثيل الأعداد.
المبدأ: يتميز هذا الترميز بتحويل النطاق الفعلي للقيم (الذي قد يشمل أعدادًا سالبة) إلى نطاق غير سالب عن طريق إضافة قيمة "تحيز" ثابتة إلى كل عدد قبل ترميزه. هذا يسهل مقارنة الأعداد الحاملة لإشارات مختلفة، حيث يمكن ببساطة مقارنة تمثيلاتهم الثنائية غير المُوقّعة.
تمثيل خاص للصفر: في هذا الترميز، يُمكن أن تكون قيمة الصفر في منتصف المدى بدلاً من البداية، ويُشير المصدر إلى أن الصفر عادةً ما يأخذ قيمة `151, 352, 363]، حيث يسمح بمعالجة الأسس السالبة والموجبة بكفاءة.
5.2. تمثيل الثوابت والمتغيرات في المترجمات (Constants and Variables in Compilers)
عند تصميم المترجمات (compilers)، يجب أن تكون هناك طريقة لتمثيل العناصر اللغوية المختلفة في الكود المصدري.
الرموز (Tokens): في مرحلة التحليل اللغوي (lexical analysis) للمترجم، تُحول سلاسل الأحرف إلى "رموز". على سبيل المثال، الرقم
9، علامة+، والمعرفxكلها تُعامل كرموز.فئة Tag: تُستخدم فئات مثل
Tagفي لغة Java لتمثيل الثوابت الصحيحة التي تُشير إلى أنواع الرموز. على سبيل المثال،NUM = 256وID = 257هي ثوابت تُعرف أنواعًا مختلفة من الرموز التي يمكن أن يجدها المحلل اللغوي.Token Objects: لتمثيل هذه الرموز في الذاكرة، تُنشأ كائنات من فئات مثل
Token. عند قراءة علامة+، يتم إنشاءnew Token('+')، مما يُعيّن حقلtagالخاص بالكائن لتمثيل+.التعامل مع المتغيرات: عند تحليل الكود، يتم حفظ الأرقام (أو "الخانة") في متغير مؤقت (مثل
t) قبل استدعاء وظيفةmatch، لأنmatchتُغير الرمز التالي المراد قراءلة للتطبيق. هذه القيم تُمثل "غياب القيمة" وليست صفرًا أو سلسلة فارغة.أنواع البيانات للقيم العددية: تُستخدم أنواع مثل
realوdouble precisionللأرقام ذات الفاصلة العائمة بدقة تعتمد على الجهاز، بينماfloat(n)تُشير إلى رقم بفاصلة عائمة بدقة لا تقل عن n خانة.
6. أنظمة العد والترميز في سياق الحاسوب الأوسع (Number Systems and Encoding in Broader Computer Context أنظمة العد والترميز جزءًا لا يتجزأ من هذه العملية:
التحليل اللغوي (Lexical Analysis): هي المرحلة الأولى في المترجم، حيث تُقرأ السلسلة الأولية من الأحرف في البرنامج المصدري وتُجمع في وحدات ذات معنى تُسمى "الرموز" (tokens).
مثال من فورتران: في العبارة
DO 5 I = 1,25، يقوم المحلل اللغوي بتحديدDOكـ "كلمة مفتاحية" (keyword)، وIكـ "معرف" (identifier)، و=كـ "عامل تشغيل" (operator). كل رمز يُمكن أن يكون له سمات إضافية، مثل مؤشر إلى جدول الرموز الذي يحتوي على معلومات حول المعرفI.تمثيل الرموز: تُستخدم فئات برمجة (مثل
TokenوTagفي Java) لتمثيل هذه الرموز. على سبيل المثال،new Token('+')يُنشئ كائنًا يُمثل عامل الجمع+،و Notation Postfix):** هي صيغة تُوضع فيها عوامل التشغيل بعد المعاملات التي تؤثر عليها (تُعرف أيضًا بـ Polish Reverse Notation)، مثل95-2+.عملية الترجمة (Syntax-Directed Definition): تتم هذه الترجمة بناءً على قواعد نحوية ودلالية.
قواعد بسيطة: الرقم يُترجم إلى نفسه (مثلاً، 9 تُترجم إلى 9).
تطبيق القواعد: على سبيل المثال، ترجمة
9-5تُصبح95-. ثم يُمكن تطبيق هذه القاعدة على تعبيرات أكبر، مثل(9-5)+2التي تُترجم إلى95-2+. مثال آخر هو9-(5+2)التي تُترجم إلى952+-.
تبسيط المترجم: تُساهم بعض التحويلات في تبسيط كود المترجم تقع مهمة تحديد مواقعها الفعلية في الذاكرة الفيزيائية على عاتق المحمل ونظام التشغيل.
تعليمات الآلة (Machine Instructions): تُنفذ عمليات مثل
x = y - zعن طريق تسلسل من تعليمات الآلة الأساسية مثلLD(Load - لتحميل البيانات من الذاكرة إلى المسجلات)،SUB(Subtract - للطرح)، وST(Store - لتخزين البيانات من المسجلات إلى الذاكرة).مثال: `LD (تخزين قيمة R1 في المتغير x في الذاكرة).
تحسينات الكود: أحد أهداف خوارزميات توليد الكود الجيدة هو تقليل عدد هذه التعليمات قدر الإمكان، على سبيل المثال، بتجنب خطوات
LDأوSTإذا كانت القيم موجودة بالفعل في المسجلات أو لم تُعد هناك حاجة لتخزينها.
أنواع البيانات في قواعد البيانات: تُستخدم أنواع بيانات محددة لتخزين الأرقام في قواعد البيانات. على سبيل المثال،
realوdouble precisionتُستخدم للأرقام ذات الفاصلة العائمة بدقة تعتمد على الجهاز، بينماfloat(n)تُشير إلى رقم بفاصلة عائمة بدقة لا تقل عنnخانة. هذه الأنواع تُمكن قواعد البيانات من التعامل مع البيانات الرقمية بدقة وكفاءة.سلاسل الأحرف (Character Strings): تُخزن سلاسل الأحرف في قواعد البيانات باستخدام أنواع بيانات مثل
char(n)وvarchar(n). `char(دقة الطباعة:** تُقاس دقة الطابعات بالنقاط في البوصة (dpi). طابعات 300 dpi تُنتج نقاطًا بحجم 0.1 مم تقريبًا، بينما طابعات 1200 dpi تُقدم جودة أفضل بكثير. هذا يوضح كيف تؤثر دقة البتات في جودة الصورة.تمثيل الألوان: يمكن تمثيل الألوان ودرجات الإضاءة في الصور بقيم رقمية، حيث تُستخدم بتات أكثر لتمثيل درجات أكثر دقة من الألوان أو السطوع.
الطاقة الضوئية والفوتونات: في الرسومات، تُشير المصادر إلى أن طاقة الفوتون الواحد تبلغ حوالي 3 × 10^-19 جول. لمبة 100 واط تُصدر حوالي 6.6 × 10^18 فوتون مرئي في الثانية. مدى طاقات الضوء التي تصل إلى العين يتغير بعشرة أضعاف بين النهار والليل [51, ذة كاملة من البيانات (مثل 1000 كلمة). هذا يُظهر كيف يمكن أن تُؤثر الأخطاء في مستوى البت على كفاءة نقل البيانات على مستوى أعلى.
التعلم الآلي والذكاء الاصطناعي (Machine Learning and AI):
دوال التنشيط (Activation Functions): في الشبكات العصبية، تُستخدم دوال مثل hyperbolic tangent (tanh) كدوال تنشيط. يمكن تمثيل قيم هذه الدوال باستخدام عدد محدود من البتات (مثلاً 8 بتات غير مُوقّعة أو مكمل ثنائي). طريقة التمثيل هذه تؤثر على كيفية تمثيل قيم مثل الصفر والأعداد الحقيقية الأخرى، مما يؤثر على دقة النموذج.
إدارة الذاكرة: في سياق الذكاء الاصطناعي، تُعرف مشكلة "جمع القمامة" (garbage collection) بأنها عملية لإدارة الذاكرة والتخلص من الكائنات غير المستخدمة. يمكن أن تُؤدي هذه العمليات إلى توقفات طويلة في تنفيذ البرامج، ولذلك تُطور طرقداء وظائف محددة داخل أنظمة أكبر. تتراوح هذه الأنظمة من المعالجات الصغيرة (8 بت) في الأجهزة منخفضة التكلفة إلى المعالجات القوية (64 بت) في السيارات وأنظمة الشبكات. تُشكل أجهزة إنترنت الأشياء (IoT) مثالًا بارزًا للحواسيب المدمجة المتصلة بالإنترنت.
الانتشار: النمو في مبيعات الهواتف الذكية والأجهزة اللوحية التي تعتمد على الحواسيب المدمجة يفوق بكاصلة العائمة (32 بت) تستهلك 30 ضعف الطاقة التي تستهلكها عملية جمع الأعداد الصحيحة (8 بت)، والفرق في المساحة أكبر بـ 60 مرة.
ذاكرة DRAM مقابل SRAM: يُعد الوصول إلى ذاكرة DRAM (32 بت) مُستهلكًا للطاقة بشكل كبير، حيث يستهلك 20,000 ضعف الطاقة اللازمة لعملية جمع 8 بتات. في المقابل، تُعد ذاكرة SRAM الصغيرة أكثر كفاءة في استخدام الطاقة بـ 125 مرة من DRAM، مما يُبرز أهمية استخدام ذاكرات الكاش والمخازن المؤقتة لتحسين كفاءة الطاقة.
تبديد الطاقة الديناميكي (Dynamic Power Dissipation): في تقنية CMOS (Complementary Metal-Oxide-Semiconductor) السائدة في الدوائر المتكاملة، يعتمد تبديد الطاقة بشكل أساسي على الطاقة المستهلكة أثناء عملية التبديل (switching) في الترانزستورات. يعتمد هذا على الحمولة السعوية لكل ترانزست14, 15, 30].
مثال: إذا أظهر تحليل تدفق البيانات أن قيمة المتغير
xستكون دائمًا 10 عند دخول كتلة معينة من الكود (على سبيل المثال، الكتلة B4 في Fig. 9.29)، فيمكن للمترجم تحسين الكود عن طريق استبدال استخدامxبالقيمة الثابتة 10 (في الكتلة B5).تحديات التحليل: على الرغم من أن هذا التحليل فعال تتطلب تخصيص مصفوفات مؤقتة كبيرة، مما يؤثر سلبًا على الثوابت المخفية في تحليل
O-notation(Big-O notation).
ذاكرة الكاش (Cache Memory): تُعد ذاكرة الكاش ضرورية لتحسين الأداء عن طريق تقليل زمن الوصول إلى الذاكرة الرئيسية.
معدلات الفشل (Miss Rates): تُظهر الرسوم البيانية العلاقة بين حجم الكاش (بالكيلوبايت) ومعدل الفشل (أي عدد المرات التي لا تُونة تمثيل الأرقام.
تنسيق NVIDIA "النصف" (Half-Precision Format): تُقدم NVIDIA تنسيقًا بفاصلة عائمة بحجم 16 بت، وهو مشابه لمعيار IEEE 754.
يتكون من بت إشارة، 5 بتات للأس (مخزنة بتنسيق excess-56)، و 10 بتات لـ significand (mantissa).
تُستخدم بتات حراسة وتقريب ولصق في عمليات هذا التنسيق.
تمثيلات الأسس والقيمة الكسرية في قواعد أساسية مختلفة:
يمكن تمثيل الـ significand باستخدام أرقام بنظام BCD (الأساس 10) بدلاً من الأساس 2، أو حتى باستخدام أنظمة أساس أخرى مثل الأساس 15 أو الأساس 30 [268, 269, 327, 328, 386, (square 6) (square 10))
يُحل عن طريق استبدالsquare` بتعريفها، ثم استبدال القيم العددية.
العمليات الحسابية المتوازية (Parallel Computations): في الخوارزميات المتوازية، يُقاس "التسريع" (speedup) بأداء البرنامج على معالجات متعددة.
التحجيم القوي (Strong Scaling): يُقاس التسريع مع الحفاظ على حجم المشكلة ثابتًا وزيادة عدد المعالجات [2ترميز هي الألواح الأساسية التي تُبنى عليها جميع جوانب الحوسبة الحديثة. من البت المفرد الذي يُمثل حالة كهربائية بسيطة، إلى الشبكات المعقدة من البتات التي تُشكل أرقامًا صحيحة، أو تُخزن الأعداد الكسرية ذات الدقة العالية باستخدام معايير عالمية مثل IEEE 754، وصولاً إلى ترميز كل حرف ورمز في العالم باستخدام أنظمة مثل ASCII و Unicode، فإن هذه المفاهيم هي التي تُمكّن الحواسيب من معالجة وفهم المعلومات.
إن فهم هذه الأنظمة لا يقتصر على كونه معرفة نظرية بحتة؛ بل هو ضروري لأي شخص يطمح إلى فهم عميق لكيفية عمل البرامج على أدنى مستوياتها، وكيف تُترجم لغات البرمجة عالية المستوى التي نستخدمها يوميًا إلى سلسلة من التعليمات التي تُنفذها المكونات المادية للحاسوب بكفاءة مذهلة. كما أن التطورات المستمرة في هذه الأنظمة تُعد عاملًا حاسمًا في تقدم مجالات حيوية مثل الذكاء الاصطناعي، والرسومات الحاسوبية، والأمن السيبراني، والحوسبة الموزعة، مما يدفع باستمرار حدود ما يمكن للحواسيب تحقيقه.
تُشكل هذه الدراسة الشاملة لغة الحاسوب الخفية، التي تُترجم أفكارنا المعقدة إلى عمليات منطقية بسيطة، وتُشكل بذلك جسرًا بين عالم البشر وعالم الآلة الرقمي.
.webp)
ليست هناك تعليقات:
إرسال تعليق
مرحبًا بكم في مساحة الحوار!
نسعد بتعليقاتكم البنّاءة حول محتوى المقال.
يرجى الالتزام بأدب النقاش، وتجنّب وضع روابط إعلانية أو تعليقات خارجة عن الموضوع.
جميع التعليقات تخضع للمراجعة قبل النشر.
شكرًا لمشاركتكم معنا في بناء مجتمع معرفي متميز!