37

برمجة الويب بالسى++, الجنون المطلق , المميزات و العيوب!

سوف أحكى لكم القصة منذ بدايتها.

كان لدينا برنامج قديم بعض الشىء,  علينا ان نعطيه مجالا للولوج الى معلوماته على الشبكة العنكبوتية و الوقت ضيق للغاية. البرنامج قمت انا بكتابته بالسى++ منذ فترة.

لم أكن اعرف الكثير عن الويب وقتها, كل خبرتى في الdesktop.

أعرف مبادئ عمل الويب, كما أعرف جيدا بروتوكول HTTP لأننى تعاملت معه من قبل, و لدى مبادئ عن الجافا سكريبت, و لكننى لا أعرف شيئا عن لغات الback end.

اخترت البداية المنطقية هي تعلم لغة "مخصصة" للويب, و اتجهت الى اكثرهم شهرة و هي php,

منذ البدايات الأولى, أصابنى الاكتئاب, هذه لغة كئيبة, شكل الstatement كئيب, رموزها مفتعلة.

السى#؟ يالسخافة بيئة تطوير visual studio و الطرق الثابتة التي يفرضها عليك لفعل أي شيء.

هذه الأفكار التي راودتنى في أول يومين, و بعد تفكير قمت بوضع هذه المعطيات:

  • سوف أضيع أسبوعا كاملا على الأقل لتعلم php او سى#

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

و هنا لمعت الفكرة في رأسى, لماذا لا تستخدم سى++ نفسها؟

جوجل و ياهو بالفعل يستخدمون سى++ في تطبيقات الويب الخاصة بهم, و أنا واثق ان مايكروسوفت و معظم الشركات الكبيرة الأخرى تفعل الشىء نفسه.

أولا أنا معتاد على السى++, و لن أضطر الى تعلم اى شيء جديد أو سخيف.

ثانيا سوف يمكننى إعادة استعمال الأكواد التي كتبتها.

و هكذا بدأت بتصميم الback end كاملا بالسى++, يتفاعل مع الweb server بواجهة تشبه الcgi, حيث يقوم الweb server بتشغيل برنامج exe مع إعادة توجيه الinput و الoutput و وضع الenvironment variables, و تزويده بالمعلومات اللازمة, ليرد البرنامج بواسطة الstandard output.

اذا أردت يمكنك أيضا التفاعل مع واجهات أخرى غير الcgi, مثل NSAPI, و FastCGI, و غيرهم.

اذن, سريعا ما هي المميزات و العيوب :

المميزات :

  • الموقع يعمل بسرعة تفوق أي موقع أخر بالphp او السى# أو الجافا أو أي شيء أخر. و هذا منطقى و متوقع من السى++. كما أنه يفتح في لمح البصر, ليس هناك الاف الmodules اللعينة التي يجب تحميلها!

  • الموقع يعمل على أي جهاز دون تأخير أو تأثر. و يستقبل عدد كبير من الطلبات دونما ابطاء. لا يحتاج الى server خارق للعمل.

  • لا يمكن لأى شخص تخمين التقنية التي يعمل بها الموقع, ما يعنى المزيد من الأمان و التميز.

العيوب :

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

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

  • لا أعرف اى خدمة استضافة سوف تقبل بملفات تنفيذية native جاهزة كback end للعمل, لذا فعليك اما اختيار خدمة توفر لك ماكينة افتراضية مخصصة لك, و هذا أغلى ثمنا, أو ان تقوم باستضافة الموقع على الخادم الخاص بك, صدقنى مع سى++ لن تحتاج الا الى خادم بسيط للغاية.

هل أنصح ببرمجة الويب بالسى++؟

ليس في المطلق, هذا لا يناسب أي شخص, خاصة اذا لم يكن لديك خادم خاص بك او بالمؤسسة التي تعمل بها, لكن التجربة كانت مفيدة و النتائج في المجمل رائعة.

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

لدي تجربة مشابهة، لكن باستخدام لغة أوبجكت باسكال، ومترجم فري باسكال وبيئة لازاراس.

حيث قمت بعمل مكتبة أو إطار عمل سميته FreeSpider يسمح لك بكتابة برامج CGI حيث قمت بدارسة هذا البروتوكول وقمت بتطبيقه. كانت أكبر معضلة هي إرسال الملفات.

انتقدني الناس بأن الـ CGI بطيء (نظرياً)، لكنه كان مناسب لعدد من التطبيقات، وقد قمت بعمل مشروعين تجاريين به ما زالا يعملان إلى اﻷن، أولها منذ عام 2009، والثاني منذ عام 2012.

أيضاً استخدم هذه المكتبة عدد من المبرمجين الذين يستخدمون فري باسكال/لازاراس وقد ساهموا في تطويره.

بعد فترة قمت بدراسة ما يُسمى بالـ apache module وهو أن تقوم بعمل برنامج الويب في شكلة مكتبة ليقوم مخدم الـ apache بتحميلها مرة واحدة في الذاكرة، وعند أي نداء يقوم إطار العمل بإنشاء كائن لخدمة هذا الطلب، فوجدت أنها سريعة جداً مقارنة بالـ CGI وقد قمت بعمل مقارنة لهذه التقنيات ومقارنة سرعتها مع برنامج PHP في هذه الصفحة:

http://code-sd.com/products...

فكرت بعد ذلك بعمل مخدم ويب باستخدام فري باسكال والإستغناء عن الـ apache لأن طريقته اﻷخيرة (apache module) معقدة في تحميل التطبيق إلى المخدم. بدأت بالفعل في تجارب مخدم http، لكن بعد فترة لا يتم الرد على كل الطلبات من المتصفح، كانت هناك مشكلة لم أعرفها، فتوقفت عن تطوير مخدم الويب.

تجربة رائعة. تحياتى لك.

بالفعل CGI بطيئة الى حد ما, لذا فخطتى هي الانتقال الى FastCGI في المستقبل. مشكلة الCGI هي بداية تحميل الملف التنفيذي, لذا قمت بتقسيم الback end الى عدة ملفات تنفيذية صغيرة بدلا من ملف واحد كبير,

تجربة رائعة على اللازاروس يا صديقى أهنئك عليها, الفكرة هنا لماذا حصروا المبرمجين بلغات مثل php و c# لبرمجة الويب؟!

لذا قمت بتقسيم الback end الى عدة ملفات تنفيذية صغيرة بدلا من ملف واحد كبير

هل تقصد ملف تنفيذي لكل Path?

هناك ميزة توجد في الـ CGI والـ FastCGIأنها تعمل على ذاكرة منفصلة لها ولا تؤثر على مخدم الويب، فإذا كان هُناك مشكلة فيها تتعطل هي فقط ولا تؤثر على الـ apache أو مخدم الويب.

نعم, فمثلا صفحة /page1 تفتح page1.exe , و صفحة /page2 تفتح page2.exe, و بالتالى لا يكون هناك ملف تنفيذى واحد كبير.

أيضا المشكلة الأكبر هي الInitialization التي تحدث عند بداية تنفيذ الملف, مثل الاتصال بقاعدة البيانات و حجز الذاكرة, و هذا يعود الى المبرمج لتقليل هذا الوقت الى أقل ما يمكن.

الميزة الأهم فى CGI و FastCGI عن الNSAPI و ما يشابه ذلك هي انه يعمل في ذاكرة منفصلة عن الweb server, خاصة في حالة الc++ و الدلفى, حيث الaccess violation قد يوقف الخادم عن العمل تماما!

أعتقد ان هذا السبب الذى جعل التوجه العام في الويب نحو اللغات الأمنة مثل الphp و السى# و لو على حساب الأداء.

الـ NSAPI/ISAPI ليست ضمنها، فهي مكتبات وتعمل في ذاكرة مخدم الويب.

يوجد شيء آخر مهم في برامج الويب، وهو السرعة والسهولة في التطوير والتعديل ورفع التعديلات، خصوصاً لمبرمج يستخدم البرمجة الرشيقة Agile لتلبية طلبات الزبائن.

الان انت ربطت بين اللغة التي ستعالج HTTP methods مثل POST & GET و السيرفر الذي سيستقبل الطلبات .. فل نتكلم عن اقل الامكانيات مثلا

ارسال طلب GET الى سيرفرك http://127.0.0.1:80/home ومعالجه طلب عبر socket يتنصت على البورت 80 وارسال البيانات كما تم طلبها السؤال هو :

هل يمكنك تغطيه وعمل حلول لجميع ال headers المرسله من ال browser ؟ https://en.wikipedia.org/wi...

ثانياً الان اكبر مشاكل الwebservers هي كم امكانيه ال webserver من ادارة ال connections لكل user فمثلاً ال apache تستخدم تقنية MPMs حيث لكل طلب thread واحد وهكذا لكل طلب ولكل thread يتم حجز مساحة من الذاكرة الخ ولاكن في ال Nginx من الممكن استخدم process واحد لمعالجه الاف الطلبات لذالك تجد بعض الميزات وبعض العيوب لكل سيرفر .. لذالك بناء webserver من الصفر عملياً ليس مجدي لاكن تعليمياً لتعلم ال threads و ال sockets قد يكون مفيداً جدا .

بختصار يوجد فرق بين ال webserver الذي يتلقى الطلبات ويحولها redirecting الى اي لغة تعمل dynamic rendering او ببساطه ارسال static pages .

معلومه اذا كنت فقط من هواه لغة c++ يمكنك برمجه اضافات للapache بلغة c او c++ لتسريع بعض العمليات .

الweb server موضوع أخر لم أتناوله هنا,  لأننى سوف أتناوله لاحقا و هو برنامج منفصل تماما.

عامة قمت ببرمجة الweb server بنفسى طورته من اكواد كتبتها من قبل (ويب سرفر بسيط لجهاز يرسل معلومات), حاليا هو لا يدعم كل الheaders لكنه يدعم معظم الHTTP headers التي أحتاجها, و يستخدم openssl لتشفير البيانات. قررت ان اعلن عنه عندما يكون جاهزا و منافسا.

الخدمات المبرمجة بالسى++ منفصلة عن السرفر.

الweb server يتلقى الطلب GET  او POST مصحوبا بالpage أو الdocument, و على حسب العنوان page يقوم بتشغيل الملف التنفيذى الذى يختص بمعالجة الطلب و يرسل اليه جميع الheaders و الdocuments في حالة الPOST,

لذا فان الملف التنفيذي عليه قراءة هذه المعلومات و العمل على أساسها.

عمليا يمكنك الربط مع أي سرفر يدعم واجهة CGI (أعتقد ان apache و nginx) يمكنهم العمل بهذه الواجهة.

كما يوفر c++ builder اطار عمل لواجهة nsapi,

أنا استخدمت CGI, لذا فموقعى سوف يعمل على أي web server يدعم واجهة CGI.

بناء web server لم يكن سهلا كما اعتقدت في البداية, الا انه ليس بالمهمة المستحيلة,

أي طلب يتم استقباله على الsocket يفتح thread جديد, و يتم حجز مساحة من الذاكرة, و بحسب نوع الصفحة المطلوبة, يحدد الweb server ما اذا كانت dynamic ام static,

في حالتى فضلت ان يعالج process واحد كل طلب حدة, لأن واجهة CGI لا تعمل الا بهذه الطريقة, في الحالة الثانية, حيث يقوم process واحد بمعالجة عدد من الطلبات سوف أطوره الى واجهة FastCGI, و هذا في الخطة!

الصفحات المسموح بها تتحول الى path  للملف و يتم ارساله, و لكن الصفحات من نوع معين .cgi تحتوى على script بسيط يخبر الserver أي ملف تنفيذى يجب تشغيله.

فكرت في البداية العمل على apache, لكن وجدت انه من الأفضل الالمام بتفاصيل الموضوع كله. 

تحياتى.

جميل جداً اخي .. متشوق لمعرفه تفاصل عن المشروع اكثر .. اتمنى لك كل التوفيق :)

بما ان لغة ال rendering هي c++ حذاري الوقوع في ثغرات ال buffer overflow !

وقعت فيها كثيرا!

الحقيقة ما عانيت منه الAccess violation كثيرا,

لكن أكثر ما عانيت منه هو تشغيل الى openssl دون مشاكل, لأكتشف في النهاية أن المشكلة يمكن حلها بمجرد تنزيل أخر نسخة!!

تجربة رائعة . لو اعطيتنا رابط لموقع مبرمج بلغة c++

أجزاء كبيرة من google.com مطورة بالسى++,

موقع okcupid للتعارف مكتوب بالسى++,

https://www.okcupid.com/abo...

و هناك بالتأكيد عدد كبير من المواقع, لكن لا يمكننا معرفة ذلك.

هذه أيضا مكتبات لتطوير مواقع بالسى++, لكن شعبيتها قليلة بالطبع.

https://www.webtoolkit.eu/wt

و هذه بعض النقاشات حول تطوير الويب بالسى++ :

http://stackoverflow.com/qu...

و الله انت عبقري الله يوفقك في مشاريعك القادمة

تركز على هذه النقطة

لا يحتاج الى server خارق للعمل

صدقنى مع سى++ لن تحتاج الا الى خادم بسيط للغاية

السؤال هو

لو قمت بالتنفيذ بغة php مثلا او asp او بايثون هل أنت متأكد أن المواصفات المطلوبة للسيرفر سكون أكبر بكثير ؟ أم مجرد تقدير سريع فقط ؟

السى++ تترجم الى native code أي كود ينفذ مباشرة من المعالج, و تعطيك تحكم كامل في الذاكرة, و تستطيع اختيار المكتبات التي يتم تحميلها, لذا فهى أسرع و تستهلك ذاكرة أقل.

رأيت فى مجال عملى مواقع مطورة بالasp, و هى بطيئة الى حد ما مقارنة بموقعى.

ما هي المكتبة التي استخدمتها للشبكة أم استخدمت API النظام، مكتبة مثل Glib مثلًا؟

بالنسبة للميزات التي ذكرتَ جلها موجودة في لغة Go مع سهولة أكبر بكثير ومع Debugging سهل، ليس من باب المقارنة من باب التعريف فقط.

Glib خاصة بأنظمة unix و linux,

موقعى يعمل على نظام windows server,

استخدمت مكتبات vcl و بيئة تطوير c++ builder و طبعا الwindows sdk.

غريب توقعت أن يعمل على Linux هل هناك سبب في استخدام ويندوز، ملاحظة Glib تعمل أيضًا على ويندوز عبر مجمّع GCC في ويندوز(MinGW) أو حتى MSVC،

معظم الbusiness خاصة الmedium size يستخدم الويندوز, لأن مشاكله أقل و لا يحتاج الى فريق لدعمه و يوفر قدر كبير من الأمان دون حاجة الى مهندسين مختصين , ما يتناسب مع حجم العاملين في هذه المؤسسات.

الlinux أكثر شعبية في المؤسسات البرمجية الكبرى (فيما عدا مايكروسوفت بالطبع) لأن لديها قدرة أكبر على حل مشاكله و متابعة عمله, كما أن عدد الخوادم الكبيرة سوف تصبح مكلفة جدا في حالة الاعتماد على ويندوز (تخيل كم License يحتاجون!!)

لذا فعليك اما اختيار خدمة توفر لك ماكينة افتراضية مخصصة لك, و هذا أغلى ثمنا

لاحظت كثيرون يقولون ذلك , على كل حال سيرفر افتراضي خاص بلينوكس لن يكلفك اكثر من 12$ سنوياً . و بالنسبة لويندوز أقل سيرفر ب 15$ شهرياً

ملاحظة اخيرة بعض الشركات تقوم بتصميم تطبيقاتها باستخدم لغة C++ لطبيعة التطبيقات التي تعمل عليها حيث خاصيةال Real Time اهم من أي شيء آخر . + تواجد عدد كبير من المستخدمون في وقت واحد . الأمر يصبح مستحيل إن نفدته على PHP مثلاً و سيكون هناك تأخير مزعج على ASP.NET

لا اعرف بخصوص Node.JS هل هي قاذرة على الاقتراب منC++ من ناحية السرعة .

أخيراً باقي التطبيقات او مواقع الويب لن تحتاج تلك الحدود من السرعة و تجد تقنيات تساهم بشكل كبير في تسريع تصفح الموقع مثل Nginx Cache هذا مثال لموقعي http://bit.ly/1hUVel6

تذكرت سؤال كان يخطر ببالي دائماُ . ما مستوى الامان الممكن الوصول اليه في تطبيق ويب مثل هذا هل هناك sql injection او ثغراتxss ممكن الوقوع فيها .

nodejs اكيد لن تقترب من ال c++ اذا كان فقط السيرفر بواسطه sockets يتنصت على بورت 8080 مثلا ويعالج طلبات الusers .. لاكن نحن هنا نتكلم عن شيء اكبر من تنصت على البورت وسرعه انتقال البيانات .. هنا نتكلم عن ادارة المستخدمين وتقليل استهلاك موارد النظام هل يستطيع ذالك ؟

بالفعل لا شيء يتغلب على ال Native Codes على كل حال المطور مطلوب منه ايجاد توازن بين سرعة التنفيد و سرعة إنجاز المشروع . لهذا تجد كثير من العاب المتصفح متعددة اللاعبين لاتزال تستخدم PHP بسبب تعقدات تطوير النص البرمجي , لو إستخدموا C++ فقط تكلفة التطويرستكون عالية جداً . أعتقد Node.JS تقدم حلاً وسط بين اللغتين , كنت ساقول ASP.NET لكن التارخيص تكلف الكثير .

ممكن رابط مشروعك بالـ C بلس ؟

للأسف مشروعى ليس ملكى, و لكنه ملك للمؤسسة التي أعمل بها, و لا يمكن الولوج الى خدمات الموقع دون اشتراك خاص للعملاء.

لكن سوف أطرح الframework و مخدم الhttp (الذى هم ملكى) عند اكتمال ميزاتهم بالمجان و بشكل عام قريبا باذن الله.