الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أطرف الأخطاء في التاريخ!

بدأه Khaled.Alshaya في 17 مايو 2009 · 6 رد · 2,135 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ....

هناك نوعان من المبرمجين في هذا العالم ... النوع الأول هم المبرمجون, و النوع الثاني هم الهاكرز :lol:

ربما ما سأعرضه لك هو الخطأ الوحيد في تاريخ المبرمجين الذي يتعمد صاحبه فعله ؟!!!

حسناً هو ليس خطأً بمعنى الكلمة هو hack بالمعنى الصحيح .....

الآن انظر إلى أسطر الخطأ التالية و أخبرني ما هو الشيء الغريب فيها ؟!

|	Type `enum{}´ can´t be converted to txpe `D<2>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<3>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<5>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<7>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<11>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<13>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<17>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<19>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<23>´ ("primes.cpp",L2/C25).
-- Detected during instantiation of Prime_print<30> at "primes.cpp",L21/C5:
E "primes.cpp",L11/C25(#416):   prim
|	Type `enum{}´ can´t be converted to txpe `D<29>´ ("primes.cpp",L2/C25).

ملاحظة فقط.... أسطر الخطأ السابقة غيرت وجه البرمجة بلغة ++C على سطح الكرة الأرضية ..... :)

لا تسألني لماذا, ربما سأجيبك بعد أن تخبرني مالغريب في اسطر الخطأ تلك ....

تحياتي ...

3
#2

مرحبا اخي خالد

لدي ملاحظة هي ان الرقم الموجود داخل d<#> يساوي مجموع الرقمين السابقيين منقوص منهم رقم (الخطا )

والله اصبحت البرمجة هي التفنن في اخراج الاخطاء :lol:

( _ /)

(='.'=)

(")-(")

#3

الأرقام بين القوسين < > تمثل الأعداد الأولية < 30 ..

:)

سبحان الله وبحمده ... سبحان الله العظيم

#4

هل موضوعك هذا له علاقة بهذا الموضوع

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#5

السلام عليكم ....

الأخ أحمد أتى بها :)

بالفعل فإن قائمة ببعض الأعداد الأولية هي ما يظهر ضمن الخطأ...

و قد أشرت إلى ذلك في موضوع سابق, و الأخ طارق وضع الرابط إلى الموضوع الذي كنت أنوي الإشارة إليه بعد أن نرى بعض الإجابات :)

سنعود بإذن الله لنضع قصة هذا الخطأ كاملة .... و لكن ليس الآن :)

تحياتي ....

#6

وعليكــم السـلام ورحمة الله وبركاتـه..

جميل :) ،، TMP أو البرمجه وقت الترجمة Programming at Compile Time من الأمور التي تتميز بها سي++ عن غيرها (D تدعمها أيضا) ، حيث تهدف لتوليد الكود سواء كان دالة أو Structure أو كلاس وقت الترجمة ،، فقط يقوم المبرمج بكتابة دالة عامة Generic Function بعدها يقوم بتحديد نوع البيانات المحدد وسيقوم المترجم بتوليد كود الدالة بنوع البيانات المحدد ،،

أضاف الكثير هذا المفهوم ، بدءا من البرمجه العمومية Generic Programming ، وانتهاء بعمليات الCode Optimization حيث تفيد عملية توليد الكود كثيرا في التحسين ،، مثلا لدينا حلقة من 1000 دورة وداخل الحلقة عملية جمع عددين ،، في حال ترجمنا الكود وقمنا بتشغيله سنجد أن هناك 2000 عملية جمع ، مره داخل الحلقة ومره في زيادة الCounter بواحد ..

for (int i=0; i<1000; i++)
x = i + 2;

في الCode Optimization سنجد أن مثل هذه الحلقات يجب أن تفك Unrolling بمعنى نقوم بكتابه الف عملية جمع

x = i + 2;
x = i + 2;
// to 1000 time

حتى عملية copy&paste لمثل هذه العمليات لن تنفع :) ، لذلك يجب أن نجد مساعد لنا ، ولا يوجد أجمل من المترجم :) وهنا هذه أحد الإستخدامات للـ compile-time loop-unrolling .

مثل هذه أمور لن تفيد المبرمج العادي (مثلي) كثيرا :P .. لكنها تفيد بالطبع من يقوم ببناء مكتبة Libraray ،، أو من يريد بعمل حسابات كثيره ويريد أن يستفيد من التحسين ،، ولكن بالمقابل الCompile-Time لن يكون سريعا كما في كل مره :) . وسيأخذ زمن خصوصا لو كانت عملية توليد أول 1000000 عدد أولى ، يمكنك أن تذهب للنوم وتصحى في الغد وستجد أن المترجم المسكين ما يزال يحك رأسه :P

موضوع جيد أخي خالد ،،

بالتوفيق ،،

2

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#7

السلام عليكم ....

أهلاً بالأخ العزيز وجدي :)

شكراً على المثال الرائع... سأضيف مثالاً من عندي أيضاً ...

الحقيقة أعتذر عن التأخير لسببين, الأول لانشغالي بالدراسة, و الثاني لأني كنت أفكر في مثال جيد لإظهار فائدة الـ Meta Programming :)

أستطيع البدء بالسرد الممل لقصة Erwin Unruh هذا المبرمج الألماني العبقري, و كيف غير مجرى تاريخ ++C بـ hack لم يخطر على بال أحد عندما قام بكتابة أول Meta Program في تاريخ ++C لإنتاج الأعداد الأولية وقت الترجمة قصة مملة... و ماذا بعد ؟! هل وصل إلى القمر أو استطاع اختراع Python :P

في عام 94 عندما ظهر بتلك القطعة من الكود, ربما هو نفسه لم يكن يعرف إلى أين يقود مستقبل ++C :) .... دعني نعرف المشكلة أولاً قبل أن نعرف الحل :)

في خمسينيات القرن الماضي ظهرت أول لغة برمجة عالية المستوى و هي Fortran - نعم Fortran قليل من الصبر حتى نشرح المشكلة :lol: - لا أعتقد أن أي طالب برمجة في العالم يحب البرمجة بتلك اللغة ....

و لكن Fortran لا زالت تستخدم بشكل كبير في المجالات العلمية :huh: ... لماذا ؟؟؟!!!! رغم كل التقدم الرهيب في طرق البرمجة ......... في الحقيقة أن أسوأ قطع من الكود يمكن أن تقرأها في حياتك مكتوبة بـ Fortran :)

لماذا Fortran إذاً بقيت صامدة ؟ و ليست صامدة فحسب, مكتباتها الرياضية و العلمية لا يمكن لأي لغة عالية المستوى أن تقارعها ... حتى C ....

Fortran تحتوي على بعض الأجزاء التي لا توجد في لغات البرمجة الأخرى... فمثلاً ....

Integer, Dimension (10) :: Vector

بسيط بسيط بسيط جداً ... مصفوفة من عشر عناصر :)

حسناً, أراد عالمنا الجليل فعل التالي :

post-89451-1242862794_thumb.png

في Fortran هناك شيء يسمى الـ Slicing, أي أنك يمكنك أخذ جزء من مصفوفة (سواء كانت خطية أو متعددة الأبعاد) و تكوين مصفوفة جديدة من خلالها ... و في الصورة قمنا بالتالي :

Vector(2:10:2)

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

مترجم Fortran سيستقبل العبارة بصدر رحب و يقوم بإنشاء المصفوفة لعالمنا الجليل "وقت الترجمة"!

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

في لغة C يمكنك إنشاء دالة تقوم بإنشاء مصفوفة جديدة, كل هذا ممكن لا مشكلة فيه, و لكنه يتم وقت "تشغيل البرنامج" ... و كما ترى أن في عملية الـ Slicing التي قمنا بها قبل قليل لا يوجد أي متغير و بالتالي لو أن تلك الدالة تعمل وقت الترجمة و تستطيع إنشاء المصفوفة وقت الترجمة لقمنا بفعل ما يفعله مترجم Fortran بالضبط....

هذه هي الـ Meta Programming ببساطة.... تستطيع تحوير و التلاعب بلغة البرمجة التي لديك على مزاجك :lol: كمثال حي و شهير و يقارع مكتبات Fortran خذ ++Blitz على سبيل المثال!

حتى لغة C لا يمكنها فعل ذلك :) إلا إذا تلاعبنا باللغة و مترجمها بالطبع... في ++C كل هذا يتم عن طريق أداة أو لغة مصغرة مضمنة في ++C تسمى الـ Templates....

و كل هذا كما ذكرت في البداية بدأ مع هذا المبرمج الألماني :)

بالطبع الآن Boost تعتمد على مبدأ الـ Meta Programming بشكل أساسي... حتى أن كثير من المترجمات لم تكن تستطيع ترجمة المكتبة لإعتمادها على مفاهيم متقدمة جداً لم تكن مدعومة من قبل المترجمات حتى وقت قريب كـ VC6 ...

ذكرت في الموضوع الذي أشار إليه الأخ طارق أيضاً موضوع الـ DSL أو اللغات المتخصصة... و هي في الحقيقة ليست من ابتكار ++C على الإطلاق فـ Lisp أول من طبق هذا المفهوم منذ زمن بعيد و هي ثاني لغة برمجة عالية المستوى بعد Fortran .... لا أدري لماذا الفكرة لم تنتشر حتى الآن إلا بعد تبني ++C لها... بالمناسبة Lisp هي لغة الـ Hackers :lol: و كثير من اللغات الحديثة تقتبس شبه حرفياً أفكار Lisp التي أتى بها McCarthy قبل ما يقاب الخمسين عاماً ....

تحياتي ...

2

مواضيع مشابهة