על C++0x ועל TR1.

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

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

היום, gcc מתקדם לאט־לאט ביישום של שינויים בליבה של השפה, אבל מה שיותר מעניין אותנו כרגע, זה שרוב השינויים המוצעים ב־TR1 כבר נכנסו לספריה סטנדרטית (כרגע תחת namespace:‏ tr1). ביניהם: מצביעים חכמים, "אובייקט הפונקציה" או Deligators במונחי C#‎, טבלאות hash, ביטויים רגולריים ועוד.

חלק מהשינויים זמינים כבר בגרסה 4.1 של gcc, אחרים (כמו ביטויים רגולריים) זמינים כבר ב־gcc 4.3. חלק גדול מהשינויים האלה נלקח כפישהו מספריות Boost‏.

נעבור בקצרה על האופציות החדשות:

אובייקט function.

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

התקן החדש מציע אובייקט פונקציה. למשל:

function<int(int,int)> foo;

foo זאת פונקציה שמקבלת שני שלמים ומחזיקה שלם אחר. אנחנו יכולים לעשות לה השמה של פונקציה רגילה כאילו שזה היה מצביע:

int add(int x,int y) 
{
    return x+y;
}

אז אפשר להגיד ש־foo יקרא ל־add.

foo=add;
int x=foo(20,30);

אבל מה שיותר מעניין זה שאפשר לקרוא כמעט לכל פונקציה של כל מחלקה. למשל:

class someclass {
public:
    int add(int x,int y,int z) { return x+y+z; };
};

someclass obj;
foo=bind(&someclass::add,&obj,_1,_2,0);
int x=foo(20,30);

אנחנו מחברים ל־foo פונקציה someclass::add של אובייקט obj שמקבלת כפרמטר ראשון ושני את הפרמטרים הראשון והשני של foo ו־0 כפרמטר שלישי.

המנגנון הזה מזכיר Delegate של C#‎, אבל יותר חזק כי הוא לא מגביל אותך לחתימה ספציפית של פונקציה.

מצביעים חכמים

מעבר ל־auto_ptr שקיים שנים רבות, התווסף shared_ptr --- מצביע שמשתמש ב־reference counting כדי לדעת מתי יש לשחרר את האובייקט. כתבתי על זה בכתבה קודמת.

טבלאות Hash.

מנגנוני חיפוש יעילים --- map כבר קיימים שנים רבות. אבל, map משתמש בעץ אדום־שחור במימוש הפנימי, שנותן זמני ריצה O(log n)‎. זה מאוד יעיל לטבלאות קטנות/בינוניות ומייצר סדר באיברים. למרות זאת, לפעמים יש צורך לעבוד עם טבלאות hash שיותר יעילות במקרה של מבני נתונים גדולים במיוחד.

כך נגדיר מבנה של טבלת hash:

unordered_map<int,int,hash<int> > tbl;
tbl[10]=100;
tbl[20]=200;

שמאוד דומה ל־map רגיל.

ביטויים רגולריים

למרות שספריית PCRE מאוד נפוצה וידועה, היא לא בדיוק ידידותית למפתח C++‎. ספריית ביטויים רגולריים נכנסה ל־TR1 ישירות מ־boost ומאפשרת עבודה קלה כמו ב־Python או ב־PHP. לדוגמה:

bool is_number(string const &s)
{
    static const regex number("^[0-9]+\\.[0-9]+$");
    return regex_match(s, number)
}

סיכום

יש עוד שיפורים רבים בליבה של השפה ובספריה שלא פירטתי. למרות שרבים יגידו שדברים כאלה מזמן קיימים ב־C#/Java/Python/Perl/PHP ושהתחביר של C++‎ עדיין מכוער, אסור לשכוח, שרוב היישומים שאנחנו משתמשים בהם ביום יום, כתובים בשפה הזו וככל נקרא לא יימצאו לה תחליף ראוי בזמן הקרוב.

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

תגובות

עידו, ב־19.8.2008, 21:30

נחמד!

בתור מתכנת Python אני רק שמח שדברים כאלו נכנסים לשפה, זה הופך את החיים שלי ליותר קלים כשחוזרים למקורות (ואפשר לראות את הרוח של פייתון נחה על חלק מהחבילות של boost ועל חלק מהשינויים של C++0x)

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

נ.ב. קראתי בויקי קצת על C++0x והתאכזבתי לגלות של-0x אין איזה הגיון גיקי מאחוריו כמו מספר הקסדצימלי או משהו :/

ארתיום, ב־20.8.2008, 7:08

נ.ב. קראתי בויקי קצת על C++0x והתאכזבתי לגלות של-0x אין איזה הגיון גיקי מאחוריו כמו מספר הקסדצימלי או משהו :/

התשובה היא פשוטה: יותר מידי אנשים חשובים מחברות רבות עובדים על זה.

כשמדובר ב־Python,‏ Java או C#‎ זה יותר קל, כי יש פחות או יותר גוף יחיד שאחראי עליהם... אז אפשר להכניס דברים גיקיים יותר.

אלעזר, ב־2.7.2010, 7:41

למה נראה לך שלא נמצא לה תחליף? לדעתי C# היא התחליף בפועל של C++ לכל פיתוח GUI חדש. אני אשמח לשמוע על דוגמא לסטארטאפ שמפתח כלי GUI חדש, והוא כתוב בC++. במיוחד מה שאמור לרוץ על חלנות.

ואגב, אני לא יודע למה לא הזכרת את Qt, שהוא לדעתי המקבילה לCLR עבור C++.

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

ארתיום, ב־2.7.2010, 13:02

למה נראה לך שלא נמצא לה תחליף? לדעתי C#‎ היא התחליף

ממש לא. C#‎ וגם Java ממלאים נישה אחרת לגמרי. הם נועדו לפיתוח מהיר של יישומים, אבל הם ממש לא שפות טובות לדברים שהם Performance critical או לכל דבר שקצת יותר תשתיתי. שלא לדבר על C#‎ בכלל כובל אותך בפלטפורמה אחת.

אני אשמח לשמוע על דוגמא לסטארטאפ שמפתח כלי GUI חדש

יש לך כלי GUI מצוינים כמו Qt4 או GTK, שאני לא חושב שיש סיבה להחליף אותם.

ואגב, אני לא יודע למה לא הזכרת את Qt, שהוא לדעתי המקבילה לCLR עבור C++‎.

לא הייתי משווה, ספריית Qt היא ספריית GUI כאשר CRL היא פלטפורמה דומה ל־JVM.

תראה, ל־C#/Java יש מקום כבוד, אבל הן אינן תחליף ל־C++‎.

הוסף תגובה:

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

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

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

דפים

נושאים