הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
מאמרים בנושא C++.
האם C++ היא שפה דלה?
ב־C++ אין הרבה דברים מאוד נפוצים ושימושיים, למשל:
- אין תמיכה ב־threads.
- אין תמיכה בעבודה עם זיכרון משותף.
- אין תמיכה ב־IPC ויצירת תהליכים.
- אין תמיכה ב־base64 ו־md5.
- אין תמיכה מובנית בעבודה עם בסיסי נתונים כמו sqlite3.
- אין תמיכה מובנית בדחיסת gzip.
- אין כלי עבודה מול XML.
אם תסתכלו בשפות כמו Java/C#/PHP/Python/FPC תגלו שלמעשה, כמעט כל הדברים האלה, נתמכים ברמת השפה עצמה (עם שינויים כאלה ואחרים), אבל C++ דורשת ספריות צד ג' כדי לטפל דברים כל־כך בסיסיים.
האם זה אומר שהשפה דלה או האם זה אמור משהו אחר?
המשך...כתיבת GUI יכולה להיות נסבלת
לפני מספר חודשים, הייתי צריך להתחיל לעבוד על פרויקט בתחום מתמטיקה וויזואליזציה. הייתי צריך לכתוב יישום שמדגים כל מיני דברים מתמטיים מסובכים בצורה יפה ואינטואיטיבית. אחת הדרישות הייתה --- תמיכה בריבוי פלטפורמות (לא הייתי בא למרצה עם יישום שאפשר להריץ רק על לינוקס).
לפני עמדו מספר אפשרויות:
- לממש את הכל ב-Matlab.
- לקחת שפה כמו python עם איזשהם bindings שהם לא תלויים בפלטפורמה.
- לכתוב ב־C++ ולקחת כלי שהוא בלתי תלוי בפלטפורמה:
- להשתמש ב־wxWidgets.
- להשתמש ב־GTKmm.
- להשתמש ב־Qt4.
לצורך העניין, עד היום, הניסיון היחיד שהיה לי בבניית GUI, היה רק עם MFC.
המשך...יצירת dllים בעזרת autotools תחת cygwin.
כידוע, dllים הם ייצורים פגומים שהשימוש בהם הוא סיוט. זה חמור עד כדי כך, שבד"כ, מפתחים רבים משתדלים להמנע ממנו.
הדרך הסטנדרטית, בה רוב חבילות cygwin מתמודדות עם הבעיה: יצירה של ספריות סטטיות בלבד. זה נוח, במקרים מסוימים כי זה מאוד מפשט את העבודה, אבל זה מנפח את קבצי ה־exe בצורה משמעותית. מה שעוד יותר חשוב, מחייב אותך לעשות link עם הספריה והתלויות שלה.
כך למשל, עם ספריה libabc תלויה ב־libxyz1 ו־libcoco2. אז כדי לבנות תכנה שמשתמשת ב־libabc במקום לקמפל:
g++ code.o -o prog -labc
חייבים לקמפל:
g++ code.o -o prog -labc -lxyz1 -lcoco2
זה הופך את הקמפול לפעולה מאוד לא טריוויאלית, במיוחד כשיש הרבה תלויות. לחילופין, ניתן להשתמש ב־libtool שיודע לאתר קבצי עזר עם התלויות -- libabc.la. במקרה כזה הבניה הופכת ל:
libtool --mode=link g++ code.o -labc -o prog
שזה מנפח את כלי הבניה וגם מחייב אותך להשתמש תמיד ב־libtool.
מסתבר, שעם הקפדה על כלל מאוד פשוט בכתיבה של תסריטי automake, ניתן לבנות ספרות דינאמיות בצורה מסודרת ו"כמעט" שקופה למשתמש.
המשך...מה צפוי ב"בטא 2" של CppCMS?
בקרוב תשוחרר בטא השניה של CppCMS. מה החידושים הצפויים:
- מערכת cache מבוזרת מעל TCP/IP שנותנת אפשרות scale up במקרה של עומסים גבוהים במיוחד. המערכת מבצעת ביזור של cache בסגנון memcached ונותנת ניהול load ballancing אוטומטי.
- שינוי משמעותי במערכת התבניות, מעכשיו, התבניות יהיו staticly typed. ה"תוכן" ייוצג ע"י מבני C++ טבעיים, התבניות עצמן יתוגרמו לקוד C++, שמייצר את העמוד מה"תוכן". המעבר מאפשר לממש מספר דברים:
- ירושה של תבניות בסנגון Django.
- יכולת לבצע הרחבות בקלות ע"י השתלת קוד C++ באופן ישיר.
- בעתיד יהיה קל יותר לחבר טיפול בטפסים.
- התבניות יכולות להיות מקומפלות סטטית ישירות ליישום או והיטען כמודולים (so/dll) בנפרד.
ייתכן, שמערכת יצירה ובדיקה של טפסים תצורף לבטא 2, גם כן.
המשך יבוא...
לוותר על gc או לוותר על destructor?
היום, יש נטייה להשתמש בכל שפה אפשרית ב־GC -- כי היא פותרת המון בעיות בניהול זיכרון. כמעט כל השפות פופולריות (למעט C/C++/Pascal) מממשות אותה בצורה זו או אחרת.
כמעט כולם (למעט CPython, Perl ו־vala) משתמשות בשיטה של "בדיקת נגישות" (Reachability). בשיטה זו מנוע GC פועל אחת לזמן מה, מחפש כל מופעי אובייקטים שאינם נגישים יותר ומוחק אותם.
השיטה הפחות נפוצה, שמתשמשים בה למשל ב־CPython, היא שימוש ב"ספירת הפניות" (Reference counting), אבל היא קשה למימוש ובעייתית באופן כללי, בגלל טיפול בלולאות סגורות, כאשר אובייקט יכול להפנות לעצמו, ובכך "מספר הפניות" לעולם לא ירד מתחת ל־0.
שימוש ב־GC שיטה הראשונה פותרת את בעיית ניהול הזיכרון, יחד עם זו היא מציבה בעיה הגדולה אחרת: destructors או finalizers --- מתודות שמבצעות "מחיקה" של האובייקט, הופכות לכמעט ולא רלוונטיות. כי אי אפשר לדעת מתי ישוחרר האובייקט. כלומר ב־Java, C#, IronPython, PHP, D וכמעט כל שפות אחרות שמשתמשות בשיטה הזו, destructors הם חסרי משמעות.
המשך...