הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
מאמרים בנושא C++.
לא רק GCC, או הניסיון הקצר עם קומפיילר של Intel.
בד"כ אני לא נוהג לכתוב כאן הרבה על טכנולוגיות סגורות, במיוחד לכתוב דברים טובים. אבל הפעם יהיה קצת שונה. אעשה סקירה קצרה של קומפיילר של אינטל.
רקע
אף אחד לא אוהב Vendor Lock In אפילו עם מדובר במשהו טוב כמו GCC או Linux. לכן, אני מוודא כי CppCMS ירוץ גם על BSD וגם על Solaris. אבל עם קומפיילר היו לי קצת יותר בעיות. יש מעט מאוד קומפיילרים טובים והנפוץ בין כולם הוא כמובן GCC.
הרבה זמן היו לי תהיות לגבי זה, אפילו ניסיתי להתקין SUN Studio על OpenSolaris ב־Virtual Box, אבל... בינתיים Solaris לא מתנהג יפה אפילו עם GCC.
אז בסופו של דבר אחרי הרבה ייסורים והתקלויות החלטתי לעשות בדיקה ל־icc. התהליך היה מייגע, אבל בסופו של דבר קיבלתי כמה דברים ממש נחמדים שאספר עליהם כאן.
המשך...גם לחלשים מגיע... או CppCMS במערכות משובצות מחשב.
בעיות ביצועים של מערכות web יכולות להופיע לא רק עקב עומסים כבדים אלא גם בגלל מערכות מוגבלות. פה שפות מקומפלות כמו C/C++/Pascal יכולות לתת מענה מצוין. אבל כרגיל חסרים כלים: Klone זה לא הרבה יותר ממשהו דמוי PHP ברק C. Wt הוא בנוי כמו GUI. Pascal? מישהו בכלל זוכר שפה כזו ;).
לכן CppCMS יתמוך גם בצרכים של מערכות משובצות מחשב והן:
- צמצום תלויות למינימום.
- עבודה מהירה.
- גודל קובץ ריצה מינימלי.
לכן, לקחתי CppCMS ועשיתי לו ניתוח --- זרקתי את כל מנגנוני ה־cache, ביטלתי דחיסת zlib ובכל צמצמתי תלות ב־boost::iostreams, העפתי מודי עבודה מיותרים ב־embedded.
בנוסף, אם המפתח רוצה לבנות גרסת cgi אז בכלל, העפתי את כל הקוד שמטפל ב־thread-pool וכמובן גם בפרוטוקולים כמו scgi/fcgi. ובכן, התכנה הצטמצמה לגודל של 500Kb בלבד. שזה כ־10%--20% מגודל משערך PHP אופייני.
ובכך שוחררה גרסת CppCMS 0.0.4 שכוללת תמיכה במערכות משובצות מחשב.
שוחררה CppCMS 0.0.2!
אחרי תקופה ארוכה של פיתוח מאומץ שוחררה גרסה 0.0.2 של CppCMS -- תשתית פיתוח יישומי אינטרנט ב־C++.
- הורדה
- תיעוד -- עדיין לא הושלם ב־100%.
- הוראות התקנה
הגרסה כוללת
- CppCMS תשתית הפיתוח.
- DbiXX --- ספריה לעבודה מול בסיסי נתונים שונים.
- WikiPP מערכת ויקי מובססת CppCMS.
- Examples --- דוגמאות שונות כחלק מתיעוד של CppCMS.
שינויים במדיניות
ישנם מספר שינויים חשובים במדיניות שחרור הגרסאות:
- גרסאות בטא ציבוריות יהיו זמינות רק דרך svn, ענף פיתוח ראשי trunk.
- קצב שחרור הגרסאות יגדל. אמנע משמירת השינויים ב־trunk בלבד.
- רוב הארכיטקטורה של CppCMS התייצבה, אם כי, API עדיין נתון לשינוי. עם זאת, ייצוב API ותאימות לאחרות הן מטרות חשובות של פיתוח עתידי.
השינויים העיקריים
- מערכת תבניות חדשה מבוססת על טיפוסים סטטיים. היא נשענת על קימפול התבניות לקוד המכונה וטעינתן כ־shared objects.
- מערכת תבניות הישנה, מבוססת על טיפוסים דינאמיים לא תיתמך יותר.
השיפורים השונים במערכת התבניות כוללים בין השאר:
- ירושת תבניות בסגנון Django.
- הרחבת תבניות ע"י השתלת קוד C++ לתוכן.
- תבניות הן חלק מהתשתית ולא מהוות ספריה נפרדת.
פותחה מערכת חדשה ליצירה ובדיקה של טפסים. היא משולבת עם מערכת התבניות.
- פיתחה מערכת ניהול sessions חדשה.
- שיפורים ב־API של מערכת caching לתמיכה יותר טובה ב־cache העובד ללא טריגרים.
- התיעוד של המערכת הועבר ל־WikiPP מערכת ויקי שפותחה על בסיס של CppCMS.
- נתמכות מערכות הפעלה חדשות: FreeBSD ו־OpenSolaris, בנוסף ל־Linux ו־Cygwin.
- מערכת ויקי WikiPP שוחררה תחת רישיון GPLv3.
ניהול Sessions ב־CppCMS
הערה 05/01/2009: פורסם מדריך לעבודה עם sessions בויקי
אחד החלקים חשובים של כל תשתית פיתוח יישומי אינטרנט הוא --- תמיכה בניהול Sessions: שמירת מידע בין בקשות שונות. זה מאפשר להפוך פרוטוקול HTTP שהוא stateless בטבעו ל־statefull. זהו מרכיב הכרחי שקיימ ברוב התשתיות כמו Django או RoR.
בד"כ, אני נוהג להסתכל בפתרונות הקיימים, לבחור את הטוב ביותר וליישמו במסגרת האילוצים של CppCMS. גם הפעם הסתכלתי בשתי התשתיות הפופולריות RoR ו־Django והבנתי, שהפתרון שהם מציעים, כפי שהוא לא מתאים בגלל אילוצי ביצועים.
הדרך "זולה" ביותר, היא לשמור את המידע ב"עוגיות" אבל יש לה שני מגרעות:
- יש מגבלה של כ־4K נתונים שניתן לשמור בעוגיה (לא כולל קידוד וכד').
- RoR שנותנת אפשרות ניהול מידע בעוגיות, לא מבטיחה שהמידע השמור לא ייחשף ללקוח --- תחשבו על פתרון Captcha ששמור בתוך עוגיה..
שמירת המידע בצד השרת כרוכה בשתי בעיות:
- ניהול בסיס נתונים כלשהו לשמירת המידע --- שיכול להוות צוואר בקבוק.
- בעית הביזור שלו גישה מרובת משתמשים.
לכן, החלטתי שב־CppCMS אני אלך על פתרון קצת שונה שמשלב את התכונות של שניהם (עם שיפורים).
המשך...מה אני שונא ב־C++.
אחד הדברים החשובים במלחמת "שפות/דתות" זה לדעת טוב מאוד את המגרעות של השפה. כך, כדי "לאזן" את הכתבות על C++ החלטתי לפרסם רשימת הדברים שאני שונא ב־C++.
- זמן קומפילציה --- נוראי. לפעמים כשאני מקמפל קוד C או Java אני לא מבין מה קורה? מדוע לחצתי על "Enter" והקמפול נגמר.
- קשה מאוד ליצור ספריות עם ABI תואם לאחור. כל שינוי קטן בממשק הורס תאימות לאחור. או צריך להמציא טריקים כמו "הסתרת מימוש" או לעבוד עם מחלקות אבסטרקטיות בלבד.
- שגיאות קומפילציה נוראיות: אני כבר מחכה ש־ConceptsGCC יתמזג לענף gcc הראשי --- שוב, חלק מ־C++Ox.
- מתכנתי C++ שאין להם מושג ירוק מה הם עושים.
- קוד C++ כתוב כמו קוד C... מקור מעולה לבאגים.
- ספריות "C++" שתואמות קומפיילרים טרם־היסטוריים --- ללא namespaces, ללא STL, ללא RTTI ועוד. (למשל ממשק C++ של BDB).
- ספריות שממציאות גלגל מחדש: בא לנו string משופר, רשימה מקושרת משופרת ועוד -- אבל הורסות את התאימות עם שאר הספריות.
- עבודה עם ספריות C מתוך C++ --- כי ב־C אין destructors ואז הקוד הופך לספגטי של try/catch. או צריך לעטוף כל שטות במחלקה. מצד שני, אי אפשר לוותר על זה, כי יש המון ספריות מעולות, מדובגות ונפוצות הן ספריות C.
- אני שונא iostreams -- הם מסובכים, לא נוח לעבוד עם format, לא נותנים גישה ל־file descriptors כמו FILE של C. מצד שני, הם הפתרון הטוב ביותר לעבודה אחידה מול streamים שונים -- למשל, כתיבה לקטע בזיכרון, כתיבה ל־socket ועוד.
- כתיבת טיפוסים של iterators --- אני כבר מחכה ל־auto של C++0x.
- קומפיילרים גרועים --- ראה ערך VS6 שאני לא מבין מדוע אנשים עדיין משתמשים בו.
אני מעביר את השרביט ל:
הסבר: הכוונה היא --- לתת ביקורת על מה שאפשר היה לשפר בשפה, או מה שלא ניתן לשנות וזה לפעמים מפריע.