مرة أخرى ، بعد أن استغرقت يومين للكتابة والتصحيح فقط أربعمائة سطر من كود مكتبة النظام ، نشأت الفكرة - "كما لو كانت جيدة إذا كانت البرامج مكتوبة بطريقة أقل إيلاما".
أولاً وقبل كل شيء ، نظرًا لأن التصحيح يستغرق وقتًا أطول بكثير من كتابة التعليمات البرمجية - فأنت بحاجة إلى الحماية من الخداع (بما في ذلك أنت نفسك) في مرحلة الكتابة. وأود الحصول عليها من لغة البرمجة المستخدمة (YP).
بالطبع ، نحن بحاجة إلى اختراع جديد ، أفضل YaP!لا ، أولاً سنحاول التعبير عن رغباتنا وإلقاء نظرة على ما اخترعناه بالفعل.
لذلك ، ما أود الحصول عليه:
- مقاومة الأخطاء البشرية ، والقضاء على الغموض أثناء التجميع
- مقاومة المدخلات
- مقاومة الأضرار التي لحقت البرنامج أو البيانات - فشل وسائل الإعلام ، القرصنة
- في نفس الوقت ، لدى كل شخص بناء جملة ووظائف أكثر أو أقل تحملاً
مجالات التطبيق هي الآلات ، والنقل ، وأنظمة التحكم الصناعية ، إنترنت الأشياء ، embedd بما في ذلك الهواتف.
لا يعد هذا ضروريًا للويب ، فهو مبني (الآن) على مبدأ "الإقلاع وإعادة التشغيل" (إطلاق النار ونسيان).
بسرعة كافية ، يمكنك التوصل إلى استنتاج مفاده أن اللغة يجب أن تكون مترجمة (على الأقل Pi-compiled) بحيث يتم تنفيذ جميع عمليات الفحص في مرحلة التجميع دون VS (مقابل ، معارضة سلبية فيما يلي) "أوه ، هذا الكائن لا يمتلك مثل هذه الخاصية" في وقت التشغيل. حتى النص البرمجي لوصف الواجهة يجعل من الضروري بالفعل تغطية مثل هذه البرامج النصية باختبارات.
أنا شخصياً لا أريد أن أدفع باستخدام مواردي (بما في ذلك المال مقابل أجهزة أسرع وأكثر تكلفة) للترجمة الفورية ، لذلك ، من المستحسن أن يكون هناك حد أدنى لتجميع JIT.
لذلك ، المتطلبات.
خطأ الإنسان التسامح
بعد أن انقلبت بجد على Talmuds من PVS-Studio ، اكتشفت أن الأخطاء الأكثر شيوعًا هي الأخطاء المطبعية ولصق النسخ غير المكتمل.
سأضيف أيضًا بعض الحوادث من تجربتي والتقيت في العديد من الأدبيات ، كأمثلة سلبية. بالإضافة إلى تحديث قواعد MISRA C في الذاكرة.
بعد التفكير في الأمر قليلاً ، توصلت إلى استنتاج مفاده أن البطانات التي يتم تطبيقها بحكم الواقع الفعلي تعاني من "خطأ ناجٍ" ، حيث تم بالفعل إصلاح أخطاء خطيرة في المشروعات القديمة.
أ) تخلص من أسماء مشابهة
- يجب إجراء فحص صارم على وضوح المتغيرات والوظائف. بمجرد الإغلاق ، يمكنك استخدام معرف من نطاق أكثر عمومية ، بدلاً من النطاق المطلوب
- استخدم أسماء غير متحسسة لحالة الأحرف. (VS) "دعنا نسمي الوظيفة كمتغير ، فقط في Camelcase" ثم قارن مع شيء - في C يمكن القيام بذلك (نحصل على عنوان الوظيفة ، وهو رقم لا بأس به)
- يجب أن تتسبب الأسماء التي تحتوي على اختلاف حرف واحد في تحذير (يمكن القول ، يمكنك تمييزه في IDE) ولكن هناك خطأ شائع جدًا في نسخ اللصق .x و .y و .w و. h.
- لا نسمح بتسمية كيانات مختلفة بالطريقة نفسها - إذا كان هناك ثابت بهذا الاسم ، فلا ينبغي أن يكون هناك متغير بنفس الاسم أو اسم نوع
- من المرغوب فيه للغاية التحقق من التسمية لجميع وحدات المشروع - من السهل الخلط ، خاصةً إذا قام أشخاص مختلفون بكتابة وحدات مختلفة
ب) ذكر مرة واحدة - يجب أن يكون هناك نمطية ويفضل أن يكون هرمي - مشروع VS من 12000 ملف في دليل واحد هو جحيم البحث.
لا تزال هناك حاجة إلى وحدات نمطية لوصف هياكل تبادل البيانات بين الأجزاء المختلفة (الوحدات والبرامج) لمشروع واحد. لقد صادفت VS خطأ بسبب اختلاف محاذاة الأرقام في هيكل التبادل في المستقبل والارسال.
- لاستبعاد إمكانية الربط مكررة (تخطيط).
ج) الغموض
- يجب أن يكون هناك ترتيب محدد لاستدعاءات الوظائف. عند كتابة X = funcA () + fB () أو Fn (funcA () ، fB () ، callC ()) - يجب أن تفهم أن الشخص يتوقع استلام الحسابات بالترتيب المكتوب ، (VS) وليس كما يظن المحسن.
- استبعاد العوامل المماثلة. وليس كما هو الحال في C: + ++ ، <<< ، | || ، & && ، = ==
- من المستحسن أن يكون هناك عدد قليل من المشغلين المفهومين مع أولوية واضحة. مرحبا من المشغل الثلاثي.
- تجاوز المشغلين ضار إلى حد ما. تكتب i: = 2 ، لكن (VS) يؤدي فعليًا إنشاء ضمني لكائن لا توجد به ذاكرة كافية ، ويتعطل القرص عند التبديل وتعطل القمر الصناعي إلى المريخ :-(
في الواقع ، من التجربة الشخصية ، لاحظت تعطلًا على الخط ConnectionString = "DSN" ، فقد أصبح واضعًا قام بفتح قاعدة البيانات (ولم يكن الخادم مرئيًا على الشبكة).
- نحن بحاجة إلى تهيئة جميع المتغيرات مع القيم الافتراضية.
- أيضًا ، يحفظ نهج OOP من النسيان إعادة تعيين جميع الحقول في الكائن في وظيفة مائة جديدة.
- يجب أن يكون نظام الكتابة آمنًا - تحتاج إلى التحكم في أبعاد الكائنات المعينة - الحماية من الكتابة فوق الذاكرة ، تجاوز السعة الحسابية من النوع 65535 + 1 ، فقدان الدقة والأهمية عند الصب ، باستثناء مقارنة تلك التي لا تضاهى - لأن العدد الصحيح 2 لا يساوي 2.0 في الحالة العامة.
وحتى التقسيم النموذجي بـ 0 يمكن أن يعطي + INF محددًا للغاية ، بدلاً من الخطأ ، هناك حاجة إلى تعريف دقيق للنتيجة.
مقاومة المدخلات
- يجب أن يعمل البرنامج على أي بيانات إدخال ويفضل أن يكون ذلك في نفس الوقت تقريبًا. (VS) مرحبًا بـ Android مع رد فعل على زر الهاتف من 0.2 إلى 5 ثوانٍ ؛ من الجيد ألا يقوم نظام Android بقيادة سيارة ABS.
على سبيل المثال ، يجب أن يعالج البرنامج كلاً من 1 كيلوبايت من البيانات و 1 تيرابايت دون استنفاد موارد النظام.
- من المرغوب فيه للغاية أن يكون لديك خطأ موثوق فيه ولا لبس فيه في معالجة RAII لا يؤدي إلى آثار جانبية (تسرب الموارد ، على سبيل المثال). (VS) شيء مضحك للغاية هو تسرب المقابض ، والذي يمكن أن يعبر عن نفسه بعد عدة أشهر.
- سيكون من الجميل أن تحمي نفسك من تجاوز سعة المكدس - تعطيل العودية.
- مشكلة تجاوز الحجم المتاح مع الذاكرة المطلوبة ، النمو غير المنضبط في الاستهلاك بسبب التفتيت أثناء التخصيص / إلغاء التخصيص الديناميكي. إذا كانت اللغة لها وقت تشغيل يعتمد على الكومة ، فمن المرجح أن يكون الأمر سيئًا - hello STL و Phobos. (VS) كان هناك قصة مع وقت C قديم من Microsoft ، والتي أعادت الذاكرة إلى النظام بشكل غير ملائم ، بسبب تعطل msbackup على وحدات تخزين كبيرة (في ذلك الوقت).
- نحن بحاجة إلى عمل جيد وآمن مع سلاسل - لا تقتصر على الموارد. يعتمد بشكل كبير على التنفيذ (صفيفات ثابتة ، أبقار ، R / W)
- تجاوز وقت رد الفعل النظام ، مستقلة عن مبرمج. هذه مشكلة جامع البيانات المهملة نموذجي. على الرغم من أنها تنقذ من بعض الأخطاء في البرمجة - البعض الآخر يجلب - سيئة التشخيص.
- في فئة معينة من المهام ، اتضح أنه يمكنك الاستغناء عن الذاكرة الديناميكية على الإطلاق ، أو عن طريق تحديدها مرة واحدة عند بدء التشغيل.
- للتحكم في الخروج خارج حدود المصفوفة ، ومن المقبول تمامًا كتابة تحذير من وقت التشغيل وتجاهله. في كثير من الأحيان هذه الأخطاء غير الحرجة.
- تمتع بالحماية من الوصول إلى قسم الذاكرة الذي لم يتم تهيئته بواسطة البرنامج ، بما في ذلك المنطقة الخالية ، وإلى مساحة عنوان شخص آخر.
- مترجمون فوريون ، JIT - طبقات إضافية تقلل من الموثوقية ، وهناك مشاكل في جمع القمامة (نظام فرعي معقد للغاية - سوف يرتكب أخطائه) ، مع وقت استجابة مضمون. نستبعده ، ولكن يوجد من حيث المبدأ Java Micro Edition (حيث يتم قطع الكثير عن Java بحيث بقيت فقط ، كان هناك
مقال مثير للاهتمام
بواسطة dernasherbrezon (آسف ، لقطة) و .NET Micro Framework مع C #.
ومع ذلك ، من خلال النظر ، اختفت هذه الخيارات:
- تحولت. NET Micro إلى مترجم عادي (تم شطبه بالسرعة) ؛
- يعد Java Micro مناسبًا للتطبيقات المضمنة فقط ، نظرًا لأنه مخصَّص جدًا بواسطة API ، وسيكون عليك التبديل إلى SE Embedded على الأقل للتطوير ، والذي تم إغلاقه بالفعل أو Java العادي ، وهو أمر وحشي للغاية ولا يمكن التنبؤ به في الاستجابة.
ومع ذلك ، لا تزال هناك خيارات ، وعلى الرغم من أن هذا لا يبدو فارغًا بالنسبة لأساس عملي ، إلا أنه يمكن مقارنته بلغات أخرى ، حتى قديمة أو مع عيوب معينة.
- مقاومة العمل متعدد الخيوط - حماية البيانات الخاصة للتيار ، وآليات للتبادل المضمون بين التدفقات. قد لا يعمل برنامج يحتوي على 200 مؤشر ترابط على الإطلاق كما هو الحال في قسمين.
- برمجة العقود بالإضافة إلى اختبارات الوحدة المدمجة تساعد أيضًا على النوم بسلام.
مقاومة الأضرار التي لحقت البرنامج أو البيانات - فشل وسائل الإعلام ، القرصنة
- يجب تحميل البرنامج بالكامل في الذاكرة - دون تحميل وحدات ، وخاصة عن بعد.
- مسح الذاكرة عند الإصدار (وليس فقط التخصيص)
- رصد الفائض المكدس ، والمناطق المتغيرة ، وخاصة الأوتار.
- أعد التشغيل بعد الفشل.
بالمناسبة ، النهج الذي يكون فيه وقت تشغيل التسجيل خاص به ، ولا يظهر فقط أن الثعلب الشمالي والمكدس ، أنا معجب للغاية.
اللغات - وجدول المطابقة
للوهلة الأولى ، للتحليل ، نأخذ PLs آمنة مصممة خصيصا:
- oberon نشط
- آدا
- BetterC (مجموعة فرعية dlang)
- IEC 61131-3 ST
- آمنة ج
وتصفحهم من خلال المعايير المذكورة أعلاه.
ولكن هذا هو بالفعل المجلد لمقال الاستمرارية ، إذا سمح الكرمة.
مع اختيار العوامل المذكورة أعلاه في الجدول ، حسنًا ، من الممكن - سيتم تجميع شيء أكثر عقلانية من التعليقات.
أما بالنسبة للغات الأخرى المثيرة للاهتمام - C ++ ، Crystal ، Go ، Delphi ، Nim ، Red ، Rust ، Zig (إضافة إلى الذوق) ، فسوف أتركها لأولئك الذين يرغبون في ملء جدول المراسلات.
إخلاء المسؤولية:
- من حيث المبدأ ، إذا كان برنامج ما ، على سبيل المثال ، في Python ، يستهلك 30 ميغابايت ، ومتطلبات رد الفعل هي ثواني ، ويحتوي الكمبيوتر الصغير على ذاكرة خالية 600 ميجابايت و 600 ميجاهرتز في المائة ، فلماذا لا؟ فقط مثل هذا البرنامج سيكون موثوق به مع بعض الاحتمالات (وإن كان 96 ٪) ، لا أكثر.
- بالإضافة إلى ذلك ، يجب أن تحاول اللغة أن تكون مريحة للمبرمج - وإلا فلن يستخدمها أحد. مثل هذه المقالات "توصلت إلى لغة البرمجة المثالية بحيث كانت ملائمة لي فقط للكتابة" ليست شائعة في حبري أيضًا ، لكن هذا يتعلق بشيء آخر.