وقت الترجمة التدقيق في التصميم من قبل العقد؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

وقرأت أن المترجم يمكن فرض DBC في وقت الترجمة .. كيف يفعل ذلك؟

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

المحلول

وبقدر ما أعرف، أقوى ثابتة اللغة DBC حتى الآن هو المواصفات # من مايكروسوفت للبحوث . ويستخدم أداة قوية لتحليل ثابت يسمى الرقصة الذي يستخدم بدوره نظرية القوية ودعا المبرهن / القيد حلالا < وأ href = "http://Research.Microsoft.Com/projects/z3/" يختلط = "noreferrer"> Z3 لإثبات إما وفاء أو انتهاك العقود في وقت التصميم.

وإذا كانت نظرية المبرهن يمكن إثبات أن العقد سوف <م> دائما أن تنتهك، وهذا خطأ ترجمة. إذا كانت نظرية المبرهن يمكن إثبات أن العقد سوف <م> لا أن تنتهك، وهذا أمثل: تتم إزالة الشيكات العقد من DLL النهائي

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

تجدر الإشارة لم يعد يجري تطويرها أن المواصفات #. تم استخراج المحرك عقد في مكتبة، ودعا العقود الرمز ل. NET ، والتي سوف تكون جزءا من NET 4.0 / البصرية ستوديو 2010. ومع ذلك، لن يكون هناك دعم اللغة للحصول على عقود.

نصائح أخرى

والمترجم يمكن استخدام ثابت تحليل للنظر في البرنامج وتحديد ما إذا كان يفعل الشيء الصحيح. كمثال بسيط، قد تحاول التعليمة البرمجية التالية إلى اتخاذ الجذر التربيعي لعدد سالب (C ++):

double x;
cin >> x;
cout << sqrt(x) << endl;

إذا المترجم يعرف لا ينبغي أبدا أن يسمى ذلك sqrt مع عدد السلبي، فإنه يمكن العلم في ذلك مشكلة لأنه يعلم أن القراءة من إدخال المستخدم <م> قد العودة رقما سالبا. من ناحية أخرى، إذا كنت تفعل هذا:

double x;
cin >> x;
if (x >= 0) {
    cout << sqrt(x) << endl;
} else {
    cout << "Can't take square root of negative number" << endl;
}

وبعد ذلك المجمع يمكن أن أقول أن هذا الرمز لن يطلق أي وقت مضى sqrt مع رقم سالب.

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

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

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

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

وماذا عادة ما هو المقصود من هذا هو أنه إذا كان لديك مكالمة

  foo(a);

ووتحديد مكان آخر

  function foo(a:int) is
     assert 0 < a && a < 128
     ...
  end

وبعد ذلك المترجم يمكن التحقق من أن هو، في الواقع، سيكون في الفترة المفتوحة (0..128).

وبعض اللغات مثل D يكون قويا بشكل معقول وقت الترجمة للطي مستمر ووقت الترجمة حالة فحص (ل D static assert(boolCond, msg);، IIRC C / C ++ يمكن استخدام #if وpragma أو #error)

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