ما هي الاختلافات الرئيسية بين ANSI C وK&R C؟

StackOverflow https://stackoverflow.com/questions/22500

  •  09-06-2019
  •  | 
  •  

سؤال

ال مقالة ويكيبيديا عن ANSI C يقول:

كان أحد أهداف عملية توحيد معايير ANSI C هو إنتاج مجموعة شاملة من K&R C (أول معيار منشور)، تتضمن العديد من الميزات غير الرسمية التي تم تقديمها لاحقًا.ومع ذلك، فقد تضمنت لجنة المعايير أيضًا العديد من الميزات الجديدة، مثل النماذج الأولية للوظائف (المستعارة من لغة برمجة C++)، ومعالج أولي أكثر قدرة.تم أيضًا تغيير بناء جملة إعلانات المعلمات لتعكس نمط C++.

وهذا يجعلني أعتقد أن هناك اختلافات.ومع ذلك، لم أر مقارنة بين K&R C وANSI C.هل هناك مثل هذه الوثيقة؟إذا لم يكن الأمر كذلك، ما هي الاختلافات الرئيسية؟

يحرر:أعتقد أن كتاب K&R مكتوب عليه "ANSI C" على الغلاف.على الأقل أعتقد أن الإصدار الذي لدي في المنزل يفعل ذلك.لذلك ربما لم يعد هناك فرق بعد الآن؟

هل كانت مفيدة؟

المحلول

قد يكون هناك بعض الالتباس هنا حول ماهية "K&R C".يشير المصطلح إلى اللغة كما هو موثق في الطبعة الأولى من "لغة البرمجة C". تحدث تقريبا:لغة الإدخال لمترجم Bell Labs C حوالي عام 1978.

شارك كيرنيغان وريتشي في عملية توحيد معايير ANSI.حلت لهجة "ANSI C" محل "K&R C" والإصدارات اللاحقة من "لغة البرمجة C" تعتمد اتفاقيات ANSI."K&R C" هي "لغة ميتة"، باستثناء أن بعض المترجمين ما زالوا يقبلون التعليمات البرمجية القديمة.

نصائح أخرى

كانت النماذج الأولية للوظائف هي التغيير الأكثر وضوحًا بين K&R C وC89، ولكن كان هناك الكثير من النماذج الأخرى.تم بذل الكثير من العمل المهم لتوحيد مكتبة C أيضًا.على الرغم من أن مكتبة C القياسية كانت بمثابة تدوين للممارسات الحالية، إلا أنها قامت بتدوينها عديد الممارسات الحالية، مما جعل الأمر أكثر صعوبة.بي جيه.كتاب بلوجر، مكتبة ستاندرد سي, ، وهو مرجع رائع، ويحكي أيضًا بعض التفاصيل من وراء الكواليس لماذا وانتهى الأمر بالمكتبة على هذا النحو.

يشبه معيار ANSI/ISO C إلى حد كبير معيار K&R C في معظم النواحي.كان من المفترض أن تعتمد معظم أكواد C الموجودة على مترجمات ANSI دون إجراء العديد من التغييرات.ولكن من الأهمية بمكان، في عصر ما قبل المعيار، أن دلالات اللغة كانت مفتوحة للتفسير من قبل كل بائع مترجم.قدم ANSI C وصفًا مشتركًا لدلالات اللغة والذي وضع جميع المترجمين على قدم المساواة.من السهل أن نأخذ هذا الأمر كأمر مسلم به الآن، بعد حوالي 20 عامًا، لكن هذا كان إنجازًا كبيرًا.

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

هناك بعض الاختلافات الطفيفة، ولكن أعتقد أن الإصدارات الأحدث من K&R مخصصة لـ ANSI C، لذلك لم يعد هناك فرق حقيقي.
"C Classic" بسبب عدم وجود مصطلحات أفضل كان لها طريقة مختلفة قليلاً في تعريف الوظائف، أي.

int f( p, q, r )  
int p, float q, double r;  
{  
    // Code goes here  
}

أعتقد أن الاختلاف الآخر كان النماذج الأولية للوظيفة.لم يكن من الضروري أن تأخذ النماذج الأولية - في الحقيقة لم تكن قادرة على ذلك - قائمة من الوسائط أو الأنواع.في ANSI C يفعلون ذلك.

  1. النموذج الأولي للوظيفة.
  2. تصفيات ثابتة ومتقلبة.
  3. دعم واسع النطاق والتدويل.
  4. السماح باستخدام مؤشر الوظيفة دون إلغاء الإشارة.

هناك اختلاف آخر وهو أن أنواع إرجاع الوظائف وأنواع المعلمات لا تحتاج إلى تعريف.من المفترض أن يكونوا ints.

f(x)
{
    return x + 1;
}

و

int f(x)
int x;
{
    return x + 1;
}

متطابقة.

  • النماذج الأولية للوظيفة: يعتمد ANSI C تقنية النموذج الأولي للوظيفة c++ حيث يتضمن تعريف الوظيفة والإعلان أسماء الوظائف والوسائط t وأنواع البيانات وأنواع بيانات القيمة المرجعة. يمكّن النموذج الأولي للوظيفة مترجمي ANSI من التحقق من استدعاء الوظيفة في برنامج المستخدم الذي يمرر عددًا غير صالح من الوسائط أو أنواع بيانات الوسيطات غير المتوافقة. تعمل هذه على إصلاح نقطة ضعف رئيسية في برامج التحويل البرمجي K&R C: غالبًا ما يمرر الاستدعاء غير الصالح في برنامج المستخدم عملية التجميع ولكنه يتسبب في تعطل البرنامج عند تنفيذه

والفرق هو:

  1. النموذج المبدئي
  2. دعم واسع النطاق والتدويل
  3. دعم الكلمات الرئيسية الثابتة والمتقلبة
  4. السماح باستخدام مؤشرات الوظيفة كإلغاء مرجعي

الاختلافات الرئيسية بين ANSI C وK&R C هي كما يلي:

  • النماذج الأولية للوظيفة
  • دعم مؤهلات نوع البيانات const والمتقلبة
  • دعم شخصيات واسعة والتدويل
  • السماح باستخدام مؤشرات الوظيفة دون إلغاء الإشارة

يعتمد ANSI C تقنية النموذج الأولي لوظيفة c++ حيث يتضمن تعريف الوظيفة وإعلانها أسماء الوظائف وأنواع بيانات الوسائط وأنواع بيانات قيمة الإرجاع.يمكّن النموذج الأولي للوظيفة مترجم ANSI C من التحقق من استدعاءات الوظائف في برامج المستخدم التي تمرر أعدادًا غير صالحة من الوسائط أو أنواع بيانات الوسائط غير المتوافقة.تعمل هذه على إصلاح نقاط الضعف الرئيسية في مترجم K&R C.

مثال:للإعلان عن وظيفة foo ويتطلب أن يأخذ foo وسيطتين

 unsigned long foo (char* fmt, double data)
 {
      /*body of foo */
 }

أعتقد أن الاختلاف الأكبر هو النماذج الأولية للوظيفة وبناء الجملة لوصف أنواع الوسائط الوظيفية.

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

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

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

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

  4. في الأنظمة الأساسية المكملة لاثنين حيث تلتف التجاوزات الصحيحة بشكل طبيعي بصمت، يمكن الاعتماد على العملية التي تتضمن قيمًا غير موقعة أصغر من "int" لتتصرف كما لو كانت القيمة غير موقعة في الحالات التي تكون فيها النتيجة بين INT_MAX+1u وUINT_MAX وهي لم تتم ترقيته إلى نوع أكبر، ولم يتم استخدامه كمعامل أيسر لـ >>, ، ولا أي من المعامل /, %, أو أي عامل مقارنة. وبالمناسبة، فإن الأساس المنطقي للمعيار يعطي هذا كأحد أسباب ترقية الأنواع الصغيرة غير الموقعة إلى الأنواع الموقعة.

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

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

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

على الرغم من تفسير "C89" بشكل متزامن على أنه يعني "اللغة المحددة بواسطة C89، بالإضافة إلى أي ميزات وضمانات إضافية توفرها المنصة"، إلا أن مؤلفي مجلس التعاون الخليجي كانوا يدفعون بتفسير يستبعد أي ميزات وضمانات تتجاوز تلك التي تفرضها C89.

على الرغم من كل المطالبات المقدمة إلى كونتاري، كانت شركة K&R قادرة تمامًا على توفير أي نوع من الأشياء من الأسفل إلى الأسفل بالقرب من الأجهزة وما فوق.تكمن المشكلة الآن في العثور على مترجم (ويفضل أن يكون مجانيًا) يمكنه تقديم ترجمة نظيفة على بضعة ملايين من أسطر K&R C دون الاضطرار إلى العبث به. ويعمل على شيء مثل معالج AMD متعدد النواة.

بقدر ما أستطيع أن أرى، بعد النظر إلى مصدر سلسلة دول مجلس التعاون الخليجي 4.x.x، لا يوجد اختراق بسيط لإعادة تنشيط وظيفة التأخر التقليدية و-cpp-traditional إلى حالة العمل السابقة دون بذل جهد أكبر مما أنا مستعد لبذله ضعه في.ومن الأسهل إنشاء مترجم K&R pre-ansi من البداية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top