לרגל שחרורו של gcc-4.4... חידושים ושיפורים.

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

לפני כחודש שוחררה גרסה חדשה של gcc:‏ 4.4. אחד הדברים המעניינים זה התקדמות בתמיכה בתקן C++‎ החדש C++0x. הנה כמה תכונות מאוד מעניינות שכבר מזמן חיכיתי להן:

  • סוף־סוף, הגיע אחת התכונות הנחשקות ביותר --- תמיכה ב־auto, שחוסכת המון הקלדה מיותר ומקלה בצורה משמעותית על כתיבת קוד בלתי תלוי בקונטיינרים. לדוגמה, היום כך כותבים לולאה שמדפיסה איברי הרשימה:

      for(list<int>::contst_iterator p=numbers.begin();p!=numbers.end();++p)
      {
          cout<< *p <<endl;
      }
    

    ואם רוצים לשנות את סוג הקונטיינר מ־list ל־vector צריך לשנות את list ל־vector בלולאה. עם טיפוס auto זה מתקצר בצורה משמעותית:

      for(auto p=numbers.begin();p!=numbers.end();++p)
      {
          cout<< *p <<endl;
      }
    

    ובנוסף ל"קיצור" הכתיבה, אין שום אזכור של סוג הקונטיינר בלולאת for.

  • טיפוסי תווים חדשים. בסטנדרט הנוכחי יש בעיה משמעותית בהגדרת תווי unicode, או ליתר דיוק העדר הגדרה ראויה שלהם. כך wchar_t למעשה יכול להיות בגודל של 32 ביטים, 16 ביטים ואפילו 8 ביטים. למעשה, בסביבת Windows, ‏wchar_t הוא בגודל של שני בתים ומייצג utf-16 (או ucs-2), כאשר בכל סביבות ה־UNIX, ‏wchar_t מייצג נקודת קידוד בודדת והוא בגודל של 32 ביט. זה יוצר לא מעט בעיות בטיפול במחרוזות unicode. כי הקידוד של std::wstring לא ברור.

    התקן החדש הגדיר שני טיפוסי תווים חדשים: char16_t ו־char32_t שמונעים את האי בהירות בנושא. כך שהעבודה עם std::u16string ו־std::u32string הופכת להרבה יותר שקופה. כך, בנוסף הוגדר ייצוג חדש למחרוזות:

      std::string normal="שלום"; // encoded as 8 bit
      std::wstring wide=L"שלום"; // utf16 or utf32 depending on your OS
      std::u16string utf16=u"שלום"; // utf16 encoded
      std::u32string utf32=U"שלום"; // utf32 encoded
    
  • כמובן, לא צריך לשכוח את התמיכה ב־Variadic templates שהתווספה ב־gcc-4.3, המאפשרת לבנות פונקציות typesafe עם מספר משתנה של פרמטרים בצורה בטוחה, קצרה ומהירה. התמיכה בהן מקצרת בצורה בסדר גודל את זמן הקומפילציה של תבניות כמו std::function או std::bind.

מבחינתי, יש עוד מספר תכונות שאני מחכה להן:

  • תמיכה בביטויי למבדא.
  • תמיכה ב־delegating and inheriting constructors שמקצרת בצורה משמעותית את הכתיבה של overloaded constructors.
  • תמיכה ב־Concepts שייאפשר לספק פלט שגיאות הרבה יותר ידידותי.
  • תמיכה מלאה ב־STL החדש, כולל regular expressions.

אני מקווה שזה לא ייקח הרבה זמן...

תגובות

ik_5, ב־17.5.2009, 16:35

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

ארתיום, ב־17.5.2009, 17:37

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

אתה מתבלבל בין static polymorphism, שזה כמו compile time duck typing שקיימת כבר שנים רבות ב־C++‎ ולמעשה אחד המרכיבים המרגזיים שלו, לבין שפה דינאמית.

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

לעומת זאת, כשאתה מציין a=c+b בשפות דינאמיות, אתה יודע מהו c ו־b רק בזמן ריצה, ורק בזמן ריצה תגלה מהי הבעיה.

נדב, ב־17.5.2009, 23:08

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

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

הוסף תגובה:

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

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

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

דפים

נושאים