هل يمكن ل Go أو Rust أن تتفوق على ++C في المستقبل ؟


التعليقات

لا أعتقد,

ماذا تقدم Rust او Go من ميزة نوعية للانتقال اليها؟

بضعة مكتبات لأشياء بسيطة أصلا يمكن كتابتها بنفسك فى ساعة عمل؟! و ببحث بسيط على google قد تجد الالاف من مكتبات سى++,

سى++ تتمتع بدعم أكبر, و هى ليست مرتبطة بشركة أو مؤسسة معينة (و هذا شىء مهم للغاية) عكس Go مثلا.

سى++ سوف تجدها على كل منصة و كل شركة و مؤسسة لديها مترجم سى++ و معظمها standardized بشكل جيد, فغالبا يمكن اعادة ترجمة الكود هنا و هناك.

بضعة مكتبات بسيطة لا تغرينى (و لا الملايين غيرى) للانتقال الى Go, او Rust, الا اننى معجب كون هذين اللغتين native و هذا مؤشر جيد بدلا من لغات السلحفائية مثل جافا و بايثون و كل هذه الاشياء.

نفس المنطق بالامكان تطبيقة على C++ يمل ان هذه الاضافات لا فائدة منها هل بإمكانك ترك C++ والعودة للغة C لان بإمكانك انجاز العمل بها دون الحاجة الى اضافات الموجودة في لغة C++؟

سى++ هى سى مع البرمجة الكائنية,

تقريبا انا لا استخدم عبارات سى++ الا قليلا, و البرمجة الكائنية استخدمها غالبا فقط للواجهة الرسومية (و هى أساسا الغرض الرئيسى منها). لذا بشكل أساسى فان معظم أكواد سى++ هى أكواد سى.

الغرض من البرمجة الكائنية ليس الواجهة الرسومية يا فادي

الغرض منها تحقيق هذه المبادئ في هندسة البرمجيات:

  1. Abstraction

  2. Reusability

  3. Infromation hiding عن طريق الـ Encapsulation

  4. Open close principle عن طريق الوراثة والـ Molyporphism

  5. Depenancy Inversion عن طريق الوراثة والـ abstraction

كل شىء فى البرمجة الكائنية يمكن استبداله ببساطة بواسطة Structure و Handle,

كمثال,

CATObject cat(......)

Cat::Walk()

Cat::Stop()

هى نفسها

CatStruct *cat;

cat-> = .......

cat=Walk(void *cat)

cat=Stop(void *cat)

لا فارق على الاطلاق, سوى ان الكود الثانى سوف ينفذ بشكل أسرع.

وحدها فى حالة الواجهة الرسومية, تتعقد الكائنات بشكل كبير, و يصبح الأمر مزعجا و مربكا بطريقة الhandle, لذا تسهل البرمجة الكائنية الأمر. و سوف تجد ان هذا هو الهدف من مكتبات مثل VCL, و MFC , هى عبارة عن غلاف رقيق من الكائنات يغلف الWindows API

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

بالنسبة للقواعد اﻷولى يمكن من 1 إلى 3

أما 4 و 5: Open Close Principle و Depenancy Inversion فلا يمكن

وإذا كان لديك رأي غير ذلك فأثبت لي بمثال بتنفيذ هذه القواعد بطريقة غير كائنية

Open/Close Principle :

void *cat=CreateCat();

SetCatAge(10)

SetCatName(....)

cat=Walk(cat);

cat=Stop(cat);

Clear(cat);

هنا لا يمكن لمستخدم المكتبة Cat أن يقوم بالتعديل فى منشأة البيانات, طالما هو لا يرى الstructure CatStruct, انما هو بالنسبة له عبارة عن Handle فقط. (هكذا تعمل Windows API مثلا)

ليس هذا التطبيق الصحيح للمبدأ،

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

مثلاً فئة كائن لإدارة معلومات المستخدم والدخول TUsers، يمكننا أن نجعلها abstract ومن يرثها يقوم بكتابة دالة لقراءة كلمة المرور checkPass من قاعدة البيانات لأن كل نظام لديه طريقة مختلفة في تخزين كلمات المرور وإسم جدول مختلف وحقول مختلفة، ثم يقوم بوراثة هذا الكائن في كائن جديد TAccountingUser ثم يقوم بحقن إجراء التأكد من كلمة المرور ليقوم الكائن اﻷصلي بتشغيلها:

ما رأيك يا فادي أن نقوم بعمل مقارنة لقياس السرعة بين ++C السريعة جداً ولغة جافا البطيئة جداً

مثلاً لإنجاز مهمة معينة، مثلاً لحساب هل الرقم x هو عدد أولي أم لا ويكون رقم كبير جداً يحتاج لدقائق حتى يعطي النتيجة.

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

أقترح أن يكون موضوع جديد فيه هذه المقارنة

هل أنت جاهز!

نعم أنا جاهز,

رغم ان ذلك لا يحتاج الى اثبات. لا تنسى يجب ان يتم حساب x دون استخدام اى مكتبة من جافا.

الJava هى virtual machine و بالتالى كل شىء فيها أبطأ,

و نظرة بسيطة لأى برنامج مكتوب بالجافا كفيلة بذلك.

هُناك نظرية أحاول إثباتها أو نفيها عن جافا في آلية الـ JIT Engine والتي تقوم بترجمة الكود وقت التشغيل وتحويله إلى كود ثنائي Binary بحيث يكون سريع مثل برامج السي.

النظرية تقول أن مترجم لغة سي وغيرها من اللغات المترجمة تقوم بتحديد الـ Optimization أثناء الترجمة و ينتج عنها برنامج تنفيذي يعمل بأداء متوافق مع عدد من المعالجات، مثلاً إذا كان الناتج AMD64 فيعمل البرنامج مع كل المعالجات المتوافقة أي أنه يقوم باستخدام العامل المشترك اﻷدنى في الـ Optimization

أما الـ JIT Engine فتقوم بتحديد نوع المعالج أثناء تشغيل الكود، فتجد مثلاً معالج Core I7 به ميزات معينة لا توجد في معالج آخر، فتقوم بإنتاج كود تنفيذي Optimized مع هذا النوع من المعالج بالذات، فيكون الناتج تنفيذ أسرع من لغة سي.

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

لا أعتقد ان الJIT Engine بهذا التقدم,

أعتقد ان هناك overestimation كبير جدا لمثل هذه البرامج.

حتى مايكروسوفت الأكثر قربا من انتل لا تستخدم كل الoptimization الموجودة.

هذا جهد كبير و خاصة ان العلاقة بين Oracle و انتل ليست بمثل هذا القرب من مايكروسوفت.

أنا أيضاً اعتقد أن هذا الكلام مبالغ فيه،

لكن دعنا نجرب.

سوف أقوم ببداية موضوع جديد.

اﻵن كتبت برنامج جافا لحساب الرقم الأولي

اريدك أن تستخدم مثال فيه Garbage collection و threads و الكثير من الmemory handling,

العمليات الحسابية هى شىء بسيط حاليا بالنسبة لأى حاسوب حاليا.

لا لا هذا مثال معقد.

يمكن أن نبدأ بمعادلات حسابية بسيطة، على اﻷقل نتأكد من أن الكود المكتوب بجافا والكود المكتوب بلغة سي++ مطابق. بعد ذلك يمكننا أن ننتقل إلى مرحلة فيها thread و Garbage collection

كذلك يمكن عمل خدمة ويب ثم تشغيل برنامج HTTP Tester لعمل عدد من الـ Threads وسوف يكون فيها garbage collection لمعرفة السرعة والتحمل، لكن نتائجها سوف لن تكون دقيقة.

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

ما رأيك؟

لا مشكلة لدى على الاطلاق.

انا منفتح على التجربة بالطبع.

هذا هو رابط التجربة:

ما مشكلة بايثون؟

انها Scripting Language! بطيئة.

نعم، بالإضافة إلى غيرها من اللغات في المستقبل يمكن أن تحل محل لغة ++C العتيقة.

لبناء أي مشروع جديد لابد أن يكون هناك شباب من المبرمجين، وهؤلاء الشباب يدرسون لغات حديثة مثل Go, Rust, NodeJS. فليس من الحكمة البدء بمشروع بلغة برمجة أكل الدهر عليها وشرب ولا يتوفر لها شباب من المبرمجين يعملون بها.

اعتقد أن لغة ++C سوف تبدأ بالإنحسار مع انحسار المبرمجين القدامى وسوف تنحصر فقط في بناء أنظمة التشغيل وقواعد البيانات حتى يتم إحلالها لاحقاً بلغات أحدث، حتى لغات البرمجة الحديثة أصبح يتم بنائها بنفس لغتها، مثلاً لغة Go مبنية بـ Go نفسها.

يمكن قراءة هذه المقالة التي تنصح بعدم دراسة لغة ++C وأنه ليس لها مستقبل من أحد مبرمجي سي++ القدامى:

للأسف يعملونهم جافا و بايثون, يا ليتهم حتى يعملونهم Go

احدى المبرمجين حديثى التخرج عندما أطلعته لأول مرة و علمته السى++ على C++ Builder كان مندهشا من السرعة و الأداء و قدرات الdebugging و ما يمكن أن يفعله مما كان مستحيلا مع جافا.

نعم التحول اﻷكبر لجافا وبايثون، لغة GO هي بديل حديث للغة ++C

لكن في كثير من اﻷحيان اﻹنتاجية العالية تكون أهم من اﻷداء خصوصاً برامج الويب الموجهة للمؤسسات تجد أن عدد المستخدمين محدود.

بالنسبة لي قمت فقط بإعادة إنتاج البرامج أو أجزاء البرامج التي تحتاج لسرعة بلغة Go أما برامج الويب التي تُستخدم لعدد قليل من المستخدمين أبقيتها بلغة جافا كما هي، بل كان لدي برنامج ويب مكتوب بلغة Free Pascal بواسطة Framework قمت بتطويره، مشابه لإطار WebBroker في دلفي، بعد خمس سنوات قمت بإعادة كتابة البرنامج بلغة جافا حيث أن جافا في الويب أفضل من Go ومن Pascal وعدد الاستخدام اليومي لهذا البرنامج قليل، لذلك كان الهدف من إعادة الكتابة هو سرعة التطوير وإمكانية مشاركتي ذلك البرنامج مع المبرمجين الجدد والذين يدرسون لغة جافا في الجامعة.

دى مقالة جميلة,

ده حوار مهم جدا لبريان ستروتوب, مؤلف السى++,

InfoWorld: Google's Go language is getting attention lately. What's your perspective on Google Go?

Stroustrup: It seems to be one of these languages that can do a few things elegantly. [But languages] focused on doing those things elegantly lose the edge in performance and lose a little bit in generality. But of course, we have to see what happens.

لماذا تعتبر ان لغة سى++ أكل عليها الدهر و شرب؟ لقد احترت كثيرا فمثلا لم اجد فى سى# و جافا التى درستها لبعض الوقت أى شىء حديث, سوى اعتمادهم المبالغ فيه (و السخيف) على البرمجة الكائنية

هذا سؤال حقيقى و ليس بهدف النقاش.

لأنها ليس فيها تجديد، ماهي الشركة التي ترعى تطوير لغة سي++؟

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

أعطيك مثال لتشغيل إجراء في الخلفية اسمه background بلغة Go وأريد منك مثال مطابق له بلغة سي إن استطعت:

  func main() {
    println("Before background routine")
    go background()
     println("After background routine")
    }

func backgroun() {
    println("Background")
}

لا يوجد شركة ترعى تطوير سى++, و هذه هى الميزة,

ماذا اذا أوقفت جوجل Go لأنها لم تعد مجدية؟ أو عانت جوجل من مصاعب مالية فقامت بتصريف العاملين فى مشروع Go لتقليل النفقات؟

منظمة ISO تضع الstandard الخاصة بسى++, و هناك C++11 و C++17 و العمل جارى علىC++ 20,

تحتوى C++17 و حتى 11 على كل ما تتوقع ان تجده فى اللغات الحديثة.

شخصيا لا استطيع افادتك كثيرا لأننى توقفت عند C++98 و لا احتاج اكثر منها!!

التطبيق بسيطة للغاية (تجاهلت بعض التعريفات فقط):

int main() {

printf("Before background routine");

HANDLE th;

th=CreateThread();

WaitForThread(th)

printf("After background routine");

}

// Create thread with windows style

ifdef __WIN32__

HANDLE CreateThread()

{

return

= CreateThread

        NULL,                   // default security attributes

        0,                      // use default stack size  

        MyThreadFunction,       // thread function name

        pDataArray[i],          // argument to thread function 

        0,                      // use default creation flags 

       dwThreadIdArray[i]);  

}

WaitForThread(HANDLE thread)

{

(thread);WaitForObject

}

endif

هذا فى سى, اذا اردت سى++ فيمكنك ان تضع الthread داخل Object و سوف يصبح كل شىء مثل Go

كمثال الThreads فى C++ Builder و Delphi.

لا يوجد شركة ترعى تطوير سى++, و هذه هى الميزة,

نعم هذه ميزة تمنعها من الاحتكار (مع أني أفترض أنك تحب البرامج المحتكرة مقابل البرامج الحرة)

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

بالنسبة لكود الـ background thread في لغة Go كان ثماني اسطر فقط، فماهو عدد اﻷسطر في لغة ++C لتنفيذ نفس المهمة؟

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

ضع CreateThread و ForObjectWait و غيرها فى ملفات مكتبة خاصة بك و هكذا أصبح لديك مكتبة مشابهة لGo! (شخصيا لدى هذه المكتبات كتبتها من قبل و اعيد استخدامها هنا و هناك, و قمت بعمل repository بواسطة سى++ بيلدر يحتوى على كل المكتبات الخاصة بى) انا كتبت هذا الكود فى دقائق معدودة! الأمر ليس بهذه الصعوبة! انشاء Thread هو شىء بسيط للغاية و لا يحتاج الى مكتبات.

و هناك مكتبات VCL التى تحتوى على الكائن TThread و يمكن استخدامه مثل Go تماما.

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

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

اعمل مع فريق, و نحن نتبادل المكتبات و نوثقها بشكل جيد, و نعيد استخدامها (لكن فى اشياء اكبر و اكثر تعقيدا).

لكن مكتبات للThread و غيرها هى أبسط من أن تحتاج الى ذلك!

عندما تستخدم مكتبك الخاصة يمكنك أن تعدلها و تحسنها كما تحتاج, و تكيفها مع الغرض الذى تستخدمه لأجلها.

مشكلة Go أن المبرمج الذى تعلم و عمل على Go طوال حياته لن يفهم أبدا كيف يعمل الThread فى ويندوز مثلا! و عندما يحتاج الى شىء خاص جدا لن يعرف كيف يصل اليه.

ففى النهاية هو أسير لما قرر مبرمجو جوجل له أن يفعله سلفا,

أنا شخصيا لا أقبل ان تقرر لى جوجل كيف افعل الاشياء.

سى/سى++ هى الحرية, و هى حرية تستحق بضعة دقائق من الوقت لعمل Thread او Socket.

لماذا لا يقوم مبرمجوا c بانشاء مكتبات لاداء هذه المهام و نشرها للعموم

هكذا يتم تحقيق الهدفين

السرعة للتطبيقات

السهولة في التنفيذ و قراءة الاكواد


برمجة

مجتمع للمبرمجين من جميع المستويات لتبادل المعرفة والخبرات. ناقش لغات البرمجة المختلفة، الحلول البرمجية، والمشاريع.

24.9 ألف متابع