سؤال

ما هي مزايا وحدود نوع الديناميكي اللغات مقارنة ثابت نوع اللغات ؟

انظر أيضا: ماذا يكون مع الحب من اللغات الديناميكية (أكثر جدلية الموضوع...)

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

المحلول

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

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

دعاة كتابة ثابتة القول بأن مزايا كتابة ثابتة تشمل الكشف المبكر عن أخطاء البرمجة (مثلمنع إضافة عدد صحيح منطقية), أفضل وثائق في شكل نوع التواقيع (على سبيل المثالدمج عدد وأنواع الحجج عندما حل أسماء), مزيد من الفرص بالنسبة مترجم التحسينات (مثلا ، استبدال الظاهري المكالمات مباشرة المكالمات عندما يكون نوع دقيق من المتلقي هو معروف ثابت), زيادة كفاءة التشغيل (على سبيل المثاللا كل القيم تحتاج إلى تحمل ديناميكية نوع), و أفضل وقت التصميم تجربة المطور (مثلا ، مع العلم نوع من المتلقي ، IDE يمكن تقديم القائمة المنسدلة جميع ينطبق أعضاء).كتابة ثابتة المتعصبين تحاول أن تجعلنا نعتقد أن "حسنا-كتابة البرامج لا يمكن أن تذهب الخطأ".في حين أن هذا يبدو بالتأكيد مثيرة للإعجاب ، بل هو بالأحرى باطل البيان.ثابت نوع التحقق هو ترجمة-الوقت التجريد من وقت التشغيل سلوك البرنامج ، ومن ثم بالضرورة جزئيا فقط سليمة وغير مكتملة.وهذا يعني أن برامج لا يزال يمكن أن تذهب الخطأ بسبب والخصائص التي لا تتبعها نوع-مدقق ، وأن هناك برامج أنه في حين أنها لا يمكن أن تذهب يمكن أن يكون الخطأ من النوع التحقق.على الدافع لصنع كتابة ثابتة أقل جزئية وأكثر اكتمالا يسبب نوع نظم تصبح معقدة أكثر من اللازم والغريبة كما يشهد المفاهيم مثل "فانتوم أنواع" [11] ، "متذبذبة أنواع" [10].هذا هو مثل محاولة تشغيل الماراثون مع الكرة و سلسلة مرتبطة الساق الخاص بك ، منتصرا وهم يهتفون أنك ما يقرب من جعلت حتى ولو كنت إنقاذها بعد أول ميل.

دعاة كتابة حيوي اللغات القول أن ساكنة الكتابة جامدة جدا, و نعومة حيوي اللغات يجعلها مناسبة بشكل مثالي نظم النمذجة مع تغيير غير معروف أو المتطلبات ، أو التي تتفاعل مع الأنظمة الأخرى أن تغيير بشكل غير متوقع (البيانات ، تطبيق التكامل).وبطبيعة الحال ، كتابة حيوي اللغات لا غنى عنها في التعامل مع حقا ديناميكية السلوك البرنامج مثل طريقة اعتراض, تحميل الديناميكي ، كود الجوال, وقت للتفكير ، إلخ.في أم كل الأوراق على البرمجة [16] ، جون Ousterhout يقول أن كتابتها بشكل ثابت نظم لغات البرمجة جعل رمز أقل قابلة لإعادة الاستخدام أكثر مطول ، وليس أكثر من ذلك آمنة ، وأقل تعبيرا من حيوي كتبته من لغات البرمجة.هذا الحجة parroted حرفيا من قبل العديد من أنصار حيوي كتبته لغات البرمجة.يمكننا القول أن هذه مغالطة يقع في نفس فئة بحجة أن جوهر التعريفي البرمجة القضاء على التعيين.أو جون هيوز يقول [8] ، فمن المنطقي استحالة لجعل اللغة أكثر قوية من خلال حذف الميزات.الدفاع عن حقيقة أن كل تأخير نوع التحقق إلى وقت جيد الشيء هو اللعب النعام التكتيكات مع حقيقة أن الأخطاء يجب أن تكون اشتعلت في وقت مبكر في عملية التنمية كما ممكن.

نصائح أخرى

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

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

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

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

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

ملاحظة أخيرة:لا تقلق بشأن الأداء عند مقارنة ثابتة مع ديناميكية الكتابة.الحديث JITs مثل V8 و TraceMonkey تأتي بشكل خطير-قريبة من لغة ثابتة الأداء.كما أن جافا في الواقع يجمع وصولا إلى بطبيعتها ديناميكية اللغة الوسيطة يجب أن تكون إشارة إلى أن في معظم الحالات ، ديناميكية الكتابة ليست ضخمة الأداء القاتل التي تجعل بعض الناس إلى أن تكون.

حسنا, وكلاهما جدا جدا جدا جدا يساء فهمها أيضا شيئين مختلفين تماما. التي لا يستبعد بعضها بعضا.

ثابت أنواع التقييد من قواعد اللغة.ثابت كتابة لغات بدقة يمكن أن يقال أن لا يكون السياق مجانا.الحقيقة البسيطة هي أن يصبح غير مريح للتعبير عن اللغة sanely في سياق مجانا قواعد النحو التي لا علاج جميع البيانات ببساطة بت ناقلات.ثابت نوع الأنظمة هي جزء من قواعد اللغة إذا كان أي أنها ببساطة تقييد أكثر من سياق مجانا قواعد اللغة يمكن النحوية الشيكات وبالتالي يحدث في اثنين من يمر على المصدر حقا.ثابت أنواع تتوافق مع فكرة رياضية من نوع نظرية اكتب نظرية في الرياضيات ببساطة يقيد شرعية من بعض التعبيرات.مثل لا أستطيع أن أقول 3 + [4,7] في الرياضيات, وهذا بسبب نوع نظرية من ذلك.

ثابت أنواع وبالتالي لا وسيلة إلى منع الأخطاء من الناحية النظرية ، فهي الحد من قواعد اللغة.في الواقع ، شريطة أن +, 3 فترات المعتادة مجموعة التعريفات النظرية ، إذا كنا إزالة نوع النظام 3 + [4,7]لديه جميلة واضحة المعالم نتيجة ذلك مجموعة.'نوع وقت التشغيل أخطاء' نظريا لا وجود نوع نظام الاستخدام العملي هو منع عمليات البشر من شأنها أن تجعل أي معنى.العمليات لا تزال مجرد تحويل والتلاعب بت بالطبع.

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

1:يثبت هذا النوع من الأخطاء سوف تحدث في البرنامج
2:لإثبات أنها لن تحدث في البرنامج

هذا قد يبدو مثل أنا يتعارض مع نفسي.ولكن ماذا C أو Java نوع المدقق لا ترفض برنامج باسم 'ungrammatical' ، أو كما يسميه 'نوع الخطأ' إذا كان لا يمكن تنجح في 2.لا يمكن أن تثبت أنها لن يحدث هذا لا يعني أنها لن تحدث ، بل يعني فقط أنه لا يمكن إثبات ذلك.قد يكون جيدا أن البرنامج الذي سوف لا يكون لديك نوع الخطأ هو رفض لأنه ببساطة لا يمكن إثباته من قبل المترجم.مثال بسيط يجري if(1) a = 3; else a = "string";, بالتأكيد لأنه هو دائما صحيح ، آخر-فرع لن يعدم في البرنامج ، و أي نوع الخطأ لن يحدث.ولكن لا يمكن أن تثبت هذه الحالات في الطريق العام, حتى انها رفضت.هذه هي نقطة الضعف الرئيسية من الكثير من اللغات كتابتها بشكل ثابت في حمايتك من نفسك ، أنت بالضرورة أيضا محمية في حالة كنت لا تحتاج إليها.

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

ميزة أخرى من كتابة ثابتة هي أن أنواع معروفة في وقت الترجمة ، وبالتالي فإن المترجم يمكن استخدام هذا.إذا كنا في جافا لا "string" + "string" أو 3 + 3, سواء + الرموز في النص في النهاية تمثل مختلف تماما عملية الإسناد, المترجم يعرف الذي يختار من أنواع وحده.

الآن انا ذاهب الى جعل غاية البيان المثير للجدل هنا ولكن تتحمل معي: 'ديناميكية الكتابة غير موجود.

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

لماذا لا يكون لديهم أنواع ؟ لأن كل العملية المحددة المسموح بها على كل الفاعلة ، ما هو نوع وقت التشغيل خطأ' بالضبط ؟ إنه من الناحية النظرية سبيل المثال بحتة الآثار الجانبية.إذا فعل print("string") الذي يطبع سلسلة العملية ، ثم إذا هو length(3), السابق له تأثير الجانب من الكتابة string إلى الإخراج القياسي الأخير ببساطة error: function 'length' expects array as argument., هذا هو.هناك من الناحية النظرية لا يوجد شيء مثل لغة كتابة حيوي.هم مصنف

حسنا, ميزة واضحة من كتابة حيوي' اللغة هو القوة التعبيرية ، نوع النظام ليست سوى الحد من القوة التعبيرية.في اللغات مع نوع النظام بل سيكون تحديد نتيجة كل تلك العمليات التي لا يسمح إذا كان نوع النظام فقط تجاهل النتائج فقط لا معنى البشر.العديد من اللغات تفقد تورينج بعد اكتمال تطبيق نوع النظام.

واضح العيب هو حقيقة أن العمليات التي يمكن أن تحدث والتي من شأنها أن تنتج النتائج التي لا معنى لها إلى البشر.للوقاية من هذا ، كتابة حيوي اللغات عادة تعريف هذه العمليات بدلا من إنتاج هذا لا معنى لها نتيجة يمكن تعريف ذلك إلى وجود تأثير الجانب من الكتابة خطأ, وربما وقف البرنامج تماما.هذه ليست 'خطأ' في كل شيء ، في الواقع ، مواصفات اللغة عادة ما يعني هذا بقدر ما هو سلوك لغة الطباعة سلسلة من المنظور النظري.نوع أنظمة وبالتالي قوة مبرمج سبب عن تدفق التعليمات البرمجية للتأكد من أن هذا لا يحدث.أو في الواقع ، سبب ذلك لا يحدث أيضا يمكن أن يكون مفيد في بعض النقاط من أجل التصحيح ، والتي تبين أنها ليست 'خطأ' في تعريف الملكية لغة.في الواقع, واحدة من بقايا 'ديناميكية الكتابة أن معظم اللغات هو حراسة ضد القسمة على صفر.هذا ما ديناميكية الكتابة ، لا توجد أنواع ، هناك أنواع أكثر من أن الصفر هو نوع مختلف من جميع الأرقام الأخرى.ما يسميه الناس 'نوع' هو مجرد ممتلكات مسند ، مثل طول صفيف أو الحرف الأول من السلسلة.والعديد من كتابة حيوي اللغات تسمح لك أيضا لكتابة أشياء مثل "error: the first character of this string should be a 'z'".

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

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

كما لاحظت, 'كتابتها بشكل ثابت في الوسائل العامة الحالة 2 مذنب حتى تثبت براءته.ولكن بعض اللغات التي لا تستمد نوع نظام من نوع نظرية في استخدام المادة 1:أبرياء حتى تثبت إدانتهم ، التي قد تكون مثالية الهجين.لذا ربما كتبته مضرب هو لك.

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

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

أكثر إيجازا حيوي كتبته اللغات (مثلا ، بيرل ، APL, J, K, الرياضيات) هي المجال محددة و يمكن أن يكون إلى حد كبير أكثر إيجازا من أكثر إيجازا الأغراض العامة بشكل ثابت كتبته اللغات (مثلا ، OCaml) في محاريب تم تصميمها.

أهم عيوب ديناميكية الكتابة هي:

  • وقت تشغيل نوع الأخطاء.

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

  • لا مترجم-التحقق من الوثائق.

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

شخصيا, لقد نشأت في اللغات الديناميكية ولكن لا اتصال لهم مع 40' القطب المهنية إلا إذا كانت هناك أي خيارات أخرى.

من Artima هو الكتابة:قوية مقابلضعيفة ثابت مقابلديناميكية المادة:

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

ضعف الكتابة يعني أنه يمكنك مزج أنواع من دون تحويل صريح

في باسكال كوستانزا الورق ، ديناميكية مقابلكتابة ثابتة — النمط القائم على التحليل (PDF) ، يدعي أن في بعض الحالات ، ثابت الكتابة هي أكثر عرضة للخطأ من ديناميكية الكتابة.بعض اللغات كتابتها بشكل ثابت القوة لك يدويا محاكاة ديناميكية الكتابة من أجل القيام "الشيء الصحيح".إنه ناقش في لامدا في نهاية المطاف.

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

الرئيسية الحصول على ثابت كتبته نظام IDE الدعم و بالتأكيد ثابت محلل من التعليمات البرمجية.أصبحت أكثر ثقة من التعليمات البرمجية بعد كل تغيير الرمز.الصيانة السلام من الكعكة مع هذه الأدوات.

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

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

ذلك هو كل شيء عن الأداة المناسبة لهذا المنصب.ولا أفضل 100 ٪ من الوقت.كلا النظامين تم إنشاؤها من قبل الرجل و العيوب.آسف, ولكن نحن تمتص ثم جعل الكمال الأشياء.

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

كتابة ثابتة: لغات مثل جافا و سكالا هي ثابتة كتبته.

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

بالنسبة السابقين.int x;x = 10;

النظام.للخروج.println(x) ؛

ديناميكية الكتابة: بيرل هي ديناميكية كتابة اللغة.

المتغيرات لا ضرورة تهيئة قبل استخدامها في التعليمات البرمجية.

y=10;استخدام هذا المتغير في جزء لاحق من التعليمات البرمجية

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