Boost חסרת תועלת למפתחי ספריות

ב־21.5.2010, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, CppCMS, C++‎‏, Boost‏; ‏5 תגובות

Boost חסרת תועלת למפתחי הספריות, או ליתר דיוק מפתחי ספריות שמנסים לשמור על ABI יציב של הספריות שלהן. זהו שם הדיון שפתחתי ברשימת תפוצה של Boost שאני חושב שעוררה סערה קטנה בקרב המפתחים שלה. אני מאוד מקווה שזה יגרום לשינויים בתפיסה של Boost ובסופו של דבר יגרום ליצירת Boost-stable, או boost::abi.

רקע קצר: ספרית Boost היא אוסף ספריות C++‎ עשיר שנותן כלים מצוינים למפתחים. אפשר להשוואות אותה ל־JDK של Java שנותן לך כלים כמעט לכל דבר. בעיקר היא ממלא חורים רבים שחסרים בספרית C++‎ סטנדרטית: טבלאות hash, ביטויים רגולריים, מצביעים חכמים, תמיכה בחוטים (threads), ועוד ועוד ועוד.

למעשה החלקים הגדולים שלה כבר נמצאים בסטנדרט C++‎ הבא שישוחרר (בתקווה) בקרוב. למעשה, אם רוב הקומפיילרים היו תומכים ב־C++0x כבר לא הייתי זקוק למחצית הכלים שזמינים לי היום דרך Boost.

למעשה, Boost היא ספריה המנוהלת כמדיניות ע"י דחפים אבולוציוניים משפרת את התכנון שלה כל הזמן, אפיל רכיבים יסודיים ביותר כמו boost::shared_ptr עוברים שיפורים משמעותיים. וכאן מתחילה בעיה:

  • כל שלושה חודשים משוחררת גרסה חדשה של Boost.
  • כל גרסה חדש אינה מבטיחה תאימות כלשהי הן של ABI ואפילו API.

בפועל זה גורם לכך ש:

  • רוב החברות שעובדות עם Boost בד"כ תקועות עם גרסה מיושנות כי מפחדים לשדרג אותה
  • ישנים מקרים רבים של טעויות בהן שתי ספריות צד ג' בנויות עם גרסאות שונות של Boost פשוט קורסות ברגע שהן עבדות באותה יחידה (קובץ ריצה).

    מה שבהחלט לא עוזר להטמעה של Boost לפרויקטים רבים, במיוחד ספריות, כי מטילות עליהן מגבלת תאימות גרסה קשות.

העליתי את זה (בפעם העשירית אולי) ברשימת התפוצה של Boost. אבל נראה לי הפעם זה יצר הד מסוים וגם נראה לי שקיר ה"אי־הבנה" התחיל להישבר, לפחות הרגשתי את זה ממספר מפתחי Boost מרכזיים.

כך או אחרת, בגלל הבעיות האלה וצרכים קיומיים של CppCMS:

  • הסתרתי חלקי Boost שהייתי מוכרח להשתמש בהם תחת namespace חילופי.
  • יצרתי ספריה חלופית Booster‎ שבנויה עם API מאוד דומה ל־API של Boost אבל משתמשת ברכיבים אחרים: למשל, לתמיכה בביטויים רגולריים אני משתמש ב־PCRE ל־threadים אני משתמש ב־pthreads (גם בחלונות).
  • חלקים קריטיים כמו shared_ptr פשוט לקחתי מ־Boost והתאמתי ליציבות בינארית.
  • חלקים שכתבתי כמו booster::function.

בגדול כל דבר שהייתי משתמש בו והייתי זקוק לו ב־API הכנסתי ל־Booster מ־Boost בצורה כזו או אחרת.

האמת? זאת הייתה החלט מאוד קשה ועצובה מבחינתי. כי ללא ספק Boost היא ספריה מצוינת, שאי אפשר בלעדיה ואני כל כך שונא "להמציא גלגל מחדש", מצד שני, Boost יכולה להפוך לסיוט בתנאים מסוימים ו־CppCMS זה בדיוק המקרה בו תלות ב־Boost היא סיוט מתמשך.

מי שמעוניין יכול לקחת Booster מ־svn כאן:

https://cppcms.svn.sourceforge.net/svnroot/cppcms/framework/branches/refactoring/booster

אבל תהיו מודעים לעובדה ש־Booster איננה Boost, והיא נבנתה לצורכי CppCMS בלבד.

תגובות

ik_5, ב־21.5.2010, 16:30

הבעיה כאן מגלמת למעשה את הבעיה של ++C בכללותה. השפה לא תואמת את עצמה, כל הזמן יש לך תוספות של טכנולוגיות בלי קשר אם צריך אותן או לא, ובסוף אתה נכנס לקטע של ספרייה שמפשטת לך את כל הטכנולוגיות האלו, אבל זה לא גורם לשפה להעצר ולהתייצב ולהצביע על הכיוון שלה.

דעתי האישית היא ש ++C מבחינה אקדמית מדהימה, אבל בפועל אי אפשר להשתמש בה בלי להזיק לפיתוח שלך, כי בחירה בה אומר שאתה או מראש מגביל את עצמך לחלקים מאוד צרים שלה, או שאתה בוחר בספרייה שנותנת לך מבנה מאוד אחיד לאיך הטכנולוגיות עובדות, אבל בסופו של דבר אתה מאבד את הידיים והרגליים, וזו הסבה שיש לך כל כך הרבה טכנולוגיות שנולדו לך בגלל ++C כדוגמת Java.

ארתיום, ב־21.5.2010, 16:38

החיבה שלך ל־C++‎ ידועה. אבל אתה יודע מה? עזוב, אולי קשה לחיות איתה, אבל לפחות היא חיה, נושמת, מפתחת ויש פי כמה סדרי גודל פרויקטים קיימים וחדשים ב־C++‎ מאשר בפסקל, שלא לדבר על הצעות עבודה..

למה? כי כנראה אתה לא צודק ;-)

ik_5, ב־21.5.2010, 18:03

ארתיום, דבר ראשון לא הזכרתי את פסקל בכלל, הזכרתי בעיה מאוד קשה שיש שזו עצם הטכנולוגיה שהיא בעייתית - דבר שבחרת לא תהחייס דבר שאומר שאו שאתה עיוור או שאתה בהכחשה אם אתה לא רואה אותם.

לפי הגישה שלך, צריך לזנוח את לינוקס, צריך לזנוח את היהדות, צריך לזנוח הרבה מאוד דברים כי "כולם בוחרים במשהו אחר". זה שכולם בוחרים במשהו לא הופך את זה להיות טוב. ברגע שבוחרים משהו שהוא רע וכולם יודעים שהוא רע, וממשיכים לדבוק בו וממשיכים לגורם לו להיות רע, זה אומר המון על מי שבוחר בו יותר מאשר על הכלי עצמו. תראה למשל את השאלה שלך על CMake שאתם כולכם כל כך אוהבים את כל הכלי בניה ונראה לכם כל כך טבעי שצריך אותם. אני יכול פתור לך את הבעיה, אבל אם תבחר בדרך שלי שהיא שונה לגמרי מהדרך שאתה לוקח.

ואם נחזור רגע לנושא המקורי שלך, אז דווקא FCL, RTL וכו', הם תואמים בגרסות FPC ולזרוס לדלפי. זה לא שאין התקדמות טכנולוגיות בספריות האלו, הן פשוט יודעות לתת גם תמיכה אחורה נכונה וטובה יותר. אתה מוזמן להמשיך לרוץ עם Boost או Booster או Boosted או כל דבר אחר שתבנה, אבל אתה נשאר במקום כל הזמן בגלל זה. במקום לקחת פרוייקט קיים ולגרום לו להיות יציב ותקין, אתה מתחיל שוב פעם עוד ספרייה בעולם אחת מיני רבות שעושה בדיוק אותו הדבר, אבל זה הזמן שלך, אז מה אכפת לי.

ובקשר לטענות שלך שפסקל לא בפיתוח רק מראה את הבורות שלך יותר מאשר את המצב הקיים, אבל אל תיתן לזה להפריע לך להמשיך ללכת עם הראש בקיר אם אתה כל כך נהנה מזה כמו רוב העולם. אני אמשיך לבחור כלים שעובדים בשבילי במקום שאני אעבוד בשבילהם, גם אם זה לא הגישה הרווחת בעולם.

ארתיום, ב־21.5.2010, 22:59

תראה למשל את השאלה שלך על CMake שאתם כולכם כל כך אוהבים את כל הכלי בניה ונראה לכם כל כך טבעי שצריך אותם.

למען בסדר הטוב: אני לא סובל CMake‏, אבל זה נושא אחר. כמו הנושא שאתה עדיין לא ענית על השאלה שלי כיצד תבנה פרויקט Hello World ב־Pascal כך שהוא יתקמפל עם GPC, FPC ו־Delphi? לא נראה לי שתוכל לעשות את זה ללא כלי כמו auto*‎ או CMake.

ואם נחזור רגע לנושא המקורי שלך, אז דווקא FCL, RTL וכו', הם תואמים בגרסות FPC ולזרוס לדלפי.

אם היית "קצת" עוקב אחרי הבלוג שלי היית יודע שאם אני הייתי מחליט להשתמש רק נגיד ב־GCC >4.4 (עם C++0x מובנה) לא הייתי כלל זקוק לחצי מה־Boost וגם לא היו לי בעיות תאימות.

אבל אתה לא מוכן להקשיב, עזוב להקשיב, אתה מנסה לשכנע אותי בנושאים שאתה כלל לא מבין בהם, אתה לא יודע לא C (ואת זה ראיתי לא פעם מהקוד שלך) ועל אחת כמה וכמה אתה לא יודע C++‎. אני חושב שאפילו אני יודע Pascal יותר טוב ממה שאתה יודע C++‎.

אז לפני שאתה בכלל נכנס עם הערות בנושאי הדקויות האלה כמו שמירה על ABI ב־C++‎, אתה צריך קצת להבין במה מדובר.

אתה מוזמן להמשיך לרוץ עם Boost או Booster או Boosted או כל דבר אחר שתבנה, אבל אתה נשאר במקום כל הזמן בגלל זה. במקום לקחת פרוייקט קיים ולגרום לו להיות יציב ותקין

האמת, אתה צודק. אני בהחלט אשמח לעבוד על Boost-stable, רק הבעיה שלי ש"קצת" קשה:

  1. צריך לשנות את הגישה של מפתחי Boost, זה קשה ויש לזה מספר סיבות (ואחת מהן אגב חלונות).
  2. אני לא יכול לתקן את כל העולם, במיוחד כשאני צריך לשחרר גרסה של משהו עובד וטוב. במיוחד שיש לי גם פרויקטים מעניינים אחרים לעבוד עליהם כמו CppCMS ו־Boost.Locale.
ארתיום, ב־21.5.2010, 23:03

הבעיה כאן מגלמת למעשה את הבעיה של ++C בכללותה. השפה לא תואמת את עצמה

זאת הייתה אחת הפנינים היפים ביותר ששמעתי ממך...

באמת? אני שמח לדעת

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים