הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
האם C++ היא שפה דלה?
ב־C++ אין הרבה דברים מאוד נפוצים ושימושיים, למשל:
- אין תמיכה ב־threads.
- אין תמיכה בעבודה עם זיכרון משותף.
- אין תמיכה ב־IPC ויצירת תהליכים.
- אין תמיכה ב־base64 ו־md5.
- אין תמיכה מובנית בעבודה עם בסיסי נתונים כמו sqlite3.
- אין תמיכה מובנית בדחיסת gzip.
- אין כלי עבודה מול XML.
אם תסתכלו בשפות כמו Java/C#/PHP/Python/FPC תגלו שלמעשה, כמעט כל הדברים האלה, נתמכים ברמת השפה עצמה (עם שינויים כאלה ואחרים), אבל C++ דורשת ספריות צד ג' כדי לטפל דברים כל־כך בסיסיים.
האם זה אומר שהשפה דלה או האם זה אמור משהו אחר?
עכשיו בואו נראה את ההבדל בין שפת C++/C לבין השפות האלה.
נתחיל מ־Python, היא שפה שפחות או יותר מפותחת ע"י ארגון יחיד. אם אתם נצמדים למימוש יחיד שלה, אז יש לכם את רוב הכלים, אבל אם תלכו רגע שמאלה ל־JPython או ימינה ל־IronPython תגלו, שהרבה דברים שמובנים מאליהם, לא יעבדו לכם בשפות האחרות.
לדוגמה: ל־destructor ב־IronPython יש סמנטיקה שונה לחלוטין מזו שיש ל־Python הרגיל.
- נקח PHP... אהה בעצם יש לו מפתח יחיד -- חברת Zend.
- נקח C# --- אין צורך להרחיב, בפועל יש לו אבא יחיד. (כי mono נגררים אחרי מה ש־MS קובע)
- נקח FPC, היא שפה בפני עצמה, שאספה בתוכה כמה דיאלקטים, וכמובן גם לה יש אבא יחיד.
- נקח Java, אומנם יש הרבה מימושים, אבל, בפועל מי שקובע את ה"סטנדרט" זוהי חברת Sun.
לעומתם ל־C++ וגם ל־C יש תקן מסודר שנכתב ע"י ארגון התקנים בשיתוף חברות רבות. הוא פרי פיתוח והתקדמות של המון ארגונים. יש לו עשרות קומפיילרים של חברות וארגונים שונים, ביניהם: Intel, GNU, Microsoft, Sun, HP. כולם שואפים לתמוך באותו התקן במידה כזו או אחרת. הם רצים על עשרות פלטפורמות החל ממערכות משובצות מחשב ועד למחשבי־על, על עשרות ארכיטקטורות ומערכות הפעלה, שרובנו אפילו לא שמענו עליהן.
לכן, יש צורך לעשות הפרדה ברורה בין:
- הגרעין הכרחי של השפה שקובע את העיקרונות.
- הספריות הסטנדרטיות שבאמת ישקפו את הצורך האמתי של רוב המפתחים --- דברים שבאמת חייבים להיות בשפה.
- כל השאל שאפשר להשאיל לספריות צד ג' שיתנו לך מענה לדרישות פיתוח אמתיות
למשל, האם Sqlite3 ו־gzip צריכים להיות שם --- הם בסה"כ אחד מסוגי בסיסי הנתונים ופורמט ספציפי של דחיסה?
תגובות
אתה לוקח ספריות שמגיעות עם השפה והופך אותן ל issue המרכזי בשביל להגן על ++C.
בוא נשאל אותך משהו אחר אבל. האם אתה מסוגל עכשיו רק עם מה ש ++C בסיסי ביותר מגיע לעשות כל דבר שאתה רוצה (עזוב כרגע את כמות העבודה שזה דורש) בצורה סבירה ?
הבעיה של ++C היא לא בכך שצריך ספריות צד שלישי, אלא בכך שבשביל לשלוט בכל מרכיבי השפה, אתה צריך כל כך הרבה שנים, שלא משתלם לעבוד איתה בלי להשתמש בכלים כדוגמת Boost או QT, וכל מי שמנסה לעבוד עם ++C ללא הכלים האלו, מוצא את עצמו לא משתמש ב 3/4 מיכולות השפה, דבר שגורם לה להיות לא כדאית לשימוש אם אתה מסתכל על ג'אווה למשל שגם אם לא תשתמש בספריות הנוספות, אתה עדיין יכול לקבל כלים מספיק טובים ופשוטים לעבודה. זה גם מה שאמרתי לך ב whatsup בדיון לגבי שפת פסקל (בלי קשר ל FPC).
זה פשוט לא נכון. עובדה שהמון פרויקטים עובדים ללא הספריות האלה. שפת C++ היא מספיק חזקה בלי רוב הדברים ה"נוחי" ש־boost מספק. הוא מוסיף עוד דרגה של נוחות ויעילות בעבודה. אבל זה לא הכרחי.
שפת קומפיילר, מעצם טיבה, אמורה להיות רק תקן הקובע את השפה וכלים שמקמפלים אותה, הפונקציונליות עצמה, פרוצדורות, מתודות ומחלקות, אמורה להיות בספריות. יכולות להיות ספריות סטנדרטיות המופצות יחד עם הקומפיילרים ונותנות פונקציונליות בסיסית שנחשבת להכרחית בכל מקום, אבל זו לא השפה.
זה נכון שלרוב שפות האינטפרטור יש מימוש אחד (או לפחות אחד לכל מערכת הפעלה, על ידי אותו ספק). בכל זאת כמה תיקונים קטנים : זנד היא לא המפתח של PHP, יש לPHP קבוצת פיתוח עצמאית מזנד, זנד דוחפת ומקדמת את השפה בהרבה מובנים אבל אינה מתחזקת את הקוד. יש גם מימוש אחר לPHP, אבל לפחות כרגע הוא לא יותר מקוריוז. לג'אווה יש מימוש של IBM ומימוש של גנו, היה גם מימוש של מיקרוסופט ויש עוד מימושים למערכות משובצות.
אין שום בעיה בלהצטרך ספריות כדי לקבל יכולות שאחרים כבר פיתחו, ושזה יהיה נתון לבחירה במקום שזה יהיה מובנה בקומפיילר, נראה לי החלק הכי בסדר בC++
לג'אווה יש וועדה. לא נכנסים סתם שינויים, גם אם סאן חפצה בכך (JCP, JSR). גם בג'אווה וגם ב-C++ רואים בפירוש שזה משהו שתוכנן ע"י וועדה - וכך גם הרושם ששתי השפות האלה משאירות (C++ זה יותר סמטוכה, ואני עוקב אחרי השפה כבר הרבה זמן, עוד בימיה המוקדמים).
אבל ברצינות: לא נמאס לכם ?
אתה מביא פה שתי טענות. אחת, בC++ בניגוד לשפות אחרות, אין תמיכה ברמת השפה במאפיינים כאלה ואחרים, אלא רק בעזרת ספריות צד ג'. בניגוד לטענה זו, בדוגמאות שאתה מביא (ואני מתייחס לשפות שאני מכיר), אין תמיכה "בשפה" במאפיינים האלה, אלא ברמת הclass library, או הcore modules. באותה מידה יכולה חברה מסויימת לתמוך בספריות או מודולים ברמת הקומפיילר והנה "תמיכה מובנית בשפה". בנוסף, אתה מציג פה את התמיכה בSQLITE וGZIP כטענה לגיטימית, ואחרי זה מסביר שבעצם, זה לא משהו חשוב, שזה קצת דמגוגיה.
שתיים, הטיעון לגבי יישומים (implementation) חלקיים של שפות שונות הוא טועה ומטעה. נניח שמחר אני מחליט לפתח מהדר לC++. מן הסתם אני ארצה לעמוד בסטנדרט שלו, אבל עד אז, יש לי יישום חלקי, וכזה יש בו דברים ש"לא יעבדו לכם". למזלך יש הרבה מהדרים וכלים שכבר עברו את השלב הזה ועבודה היום בC++ היא ברובה סטנדרטית, אבל מחר, לכשייצא הסטנדרט החדש, האם כל הכלים בכל היישומים, בכל החברות ייתמכו בו מיד, ובלי באגים, ובהתאמות מלאות?
ובכלל, תקן מבטיח תאימות מינימלית, לא מקסימלית. לא סתם קוד שהודר על מהדר מסויים לא בהכרח יעבור הידור עם יישום אחר, וזה בגלל שמעבר לתקן, לכל יישום יש מאפיינים שהם "מעבר" לסטנדרט והוא מכניס אותם מסיבות שונות, וקוד שיכתב תוך שימוש במאפיינים אלה, לא ירוץ על יישום אחר. כלומר הדרך היחידה לעבוד על יישומים של C++ בצורה אחידה היא לכתוב אך ורק בעזרת מאפיינים סטנדרטיים.
לסיכום: יש סטנדרט, ויש הרחבות. בכל שפה יש ספריות/מודולים שנוצרים ע"י מפתחי השפה או צד ג' במטרה לענות על צרכים של מפתחים שונים. בשפות שלהן גב מסחרי, הרחבות אלה לרוב מגיעות עם ה"הפצה הסטנדרטית", למרות שכל אחד יכול לכתוב משלו. בשפות שנוצרו בסביבה אקדמית או מחקרית (לדוגמה C++), הרחבות אלה מגיעות מצד ג'. אין פה להעיד על יתרון של שפה אחת על אחרת, אלא רק על ההיסטוריה שלהן.
ל-++C יש כזה גדול!
אני רואה כאן איזושהי סתירה. מצד אחד אתה מתלונן ש- C++ אינו תומך ברשימה ארוכה של תכונות שכן נתמכות בספריות שלו. מצד שני אתה טוען ששפות אחרות (יעני Java/C#/PHP/Python/FPC) כן תומכות בתכונות אלה, כמעט תמיד ע"י ספריות שמסופקות בהתקנה הסטנדרטית.
חוץ מנושא ה-threads, שבו יש תמיכה מהשפה ב-Java, אינני רואה סיבה ליחס מפלה זה בין C++ לבין השפות האחרות.
הויכוח בין ספריות סטנדרטיות לבין אפשרות הבחירה של המפתח (שקיימת ב-C++ כי המפתח יכול למשל לבחור בין Qt4 לבין Boost) הינו כמו הויכוח בין משתמשי MS-Windows לבין משתמשי לינוקס. ב-MS-Windows יש יישומים רבים שמימושם בא רק בכלי אחד, בניגוד ללינוקס, שבו המשתמש "מתבלבל" מרוב הכלים האפשריים.
אני אישית מעדיף את אפשרויות הבחירה, אבל בהחלט אפשר להגדיר רשימה של ספריות (או יישומים) מומלצים למי שעבודתו אינה תובענית ואינו רוצה לבזבז הרבה זמן על בחירת כלים. משהו בנוסח של "אלא אם יש לך דרישות מיוחדות, השתמש ב-Boost" או "השתמש במעבד התמלילים OOWriter אלא אם אתה צריך צורת עבודה מיוחדת".
הוסף תגובה:
חובה לאפשר JavaScript כדי להגיב.