הבלוג של ארתיום
בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!
מאמרים בנושא C++.
חדשות CppCMS...
לאחרונה אני עובד בענף ה־refactoring של CppCMS ומבצע שינויים גדולים. אביא כאן סקירה קצרה של השינוי שכבר נמצאות בגרסה ניסיונית:
אחד השינויים הגדולים והחשובים זה להיפתר מכל התלויות המיותרות או מגבילות. אחרי שכל השינויים יסתיימו, התלויות היחידות שיישארו הן גרסה עדכנית של Boost ו־Python לצורכי הפיתוח בלבד.
חלק מהספריות הוסרו בגלל אי תאימות לדרישות החדשות:
- libfcgi ירד כי ה־API שלו לא מאפשר גישה א־סינכרונית, במקומו, מימשתי את הפרוטוקול בעצמי על בסיס Boost.Asio.
- ספריית CgiCC ירדה בגלל האיכות הירודה שלה וחוסר יכולת סבירה לתקשר עם המפתח של אותה הספרייה הבעייתית.
כך שבגרסה הבאה, תהיה לי אפשרות להכין debים ו־rpmים בקלות...
עד היום, פיתוח מול CppCMS דרש שימוש בשרת חיצוני, למרות שיש לי סקריפט הפעלה אוטומטית של lighttpd, nginx ו־Apache, עכשיו מימשתי שרתי HTTP פנימי פשוט שמקל על הפיתוח ובנוסף, עתיד יקל על שיבוץ התשתית ביישומים שדורשים ממשק web ובמערכות משובצות מחשב.
כך שכיום, CppCMS החדש תומך בשלושה ממשקים FastCGI, SCGI ו־HTTP.
התווספה תמיכה מסודרת בלוקליזציה עם שימוש ב־std::locale, כך שתצוגת התאריכים, מספרים, מחרוזות וכד' יתבצעו בהתאם למקובל באותה שפה.
בגלל שימוש מקיף ב־Boost -- ספריה בלתי תלויה בפלטפורמה, אני סוף־סוף אוכל להכריז על Windows כפלטפורמה שנתמכת באופן (חצי) רשמי.
יש עוד הרבה עבודת אינטגרציה של רכיבים שיצאו באופן זמני, כמו ניהול sessions, שינויים ב־cache, שכתוב תמיכה בטפסים ועוד.
אבל לאט־לאט ההשפעה של השינויים הארכיטקטוניים מתחילים להתבהר.
לתמוך או לא לתמוך, זאת השאלה (ב־Win32)?
כפי שפרסמתי בעבר, אני עובד על שינויים בפנימיים עמוקים ב־CppCMS שבין השאר יאפשרו:
- תמיכה באירועי צד השרת או Comet.
- תמיכה בבינאום ולורקליזציה.
- תמיכה ב־ABI לאחור.
- ניקיון יסודי של קוד תוך הקטנה משמעותית בשימוש בספריות צד ג'.
בגלל שאני עושה שינויים כל־כך מהותיים, חשבתי, אולי להוסיף גם תמיכה בעוד פלטפורמה בנוסף לתמיכה ב־Linux, FreeBSD, Solaris ו־Cygwin... להוסיף תמיכה ב־Windows.
זה באמת, לא אמור להיות עד כדי כך מסובך, יצא לי כבר פעם לבנות CppCMS עבור Mingw (כמובן נאלצתי לוותר על חלק גדול מהמודולים).
אבל, בין לבנות משהו שרץ עד לפלטפורמת פיתוח אמתית יש תהום.
המשך...תסריט פיתון להחלפת namespace של Boost.
הכנתי תסריט קטן שמאפשר שינוי גורף של Namespace עץ הקוד של Boost ל־Namespace חילופי כדי למנוע התנגשות בין גרסאות Boost שונות: http://art-blog.no-ip.info/files/rename.py.
הרצה: ./rename.py /path/to/boost/tree new_namespace_name
עכשיו כל ה־defineים וכל הסימבולים יימצא ב־namespace אחר ואפשר יהיה לבנות רכיבים ללא תלות בגרסת Boost.
הערות:
- השימוש על אחריותכם, גם אם זה יאכל לכם את החתול או יהרוס את כל הקוד במחשב שלכם.
- הוא עדיין די ראשוני, אבל הצלחתי לקמפל רוב הספריות החשובות ולהריץ כמה regression tests.
את התסריט כתבתי לפתרון אפשרי לבעיה שהצגתי במאמר הקודם
לרגל שחרורו של gcc-4.4... חידושים ושיפורים.
לפני כחודש שוחררה גרסה חדשה של 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.
אני מקווה שזה לא ייקח הרבה זמן...
האם אתה מוכן לבינאום ולוקליזציה?
הכנתי שאלון קצת שמאפשר לכם לבדוק... האם אתם מוכנים לכתיבת תכנה שתהיה מוכנה להתאמה לתרבויות שונות?
- אני רוצה לייצג מחרוזת, כ־
char *some_text. מהו המידע שחסר לי? - יש לי מחרוזת
wchar_t *textאוString textב־Java, אני רוצה לקחת את התו הראשון שלה: wchar_t c=text[0]; // C Char c=text.charAt(0); // Java האם זהו קוד נכון? - אני כותב את הקוד הבא: if n==1: print translate("You have one aplle") else: print translate("You have %d apples") % n מה לא בסדר בקוד הזה?
מה לא בסדר בקוד הבא: #include <stdio.h> #include <time.h>
int main() { time_t now_t=time(NULL); struct tm *now=localtime(&now_t); char str_time[32]; strftime(str_time,sizeof(str_time),"%d/%m/%y",now); printf("Today is %s\n",str_time); return 0; }- מהו גודל הזכרון הנדרש לשמירת תו unicode בודד?
- מהו גודל של wchar_t? (למתכנתי C++/C)?
- מהי גודל של תו unicode בשפת התכנות שאתה אוהב?
- מהו קידוד של מחרוזת (unicode) בשפת התכנות/toolkit שאתה אוהב?
- מה הבדל בין utf-8, utf-16, utf-32?
- מהו אורך התו הארוך ביותר ב־utf8?
- בניתי ספרייה עם שתי פונקציות בלבד. מה לא בסדר בקוד הבא (שתי בעיות לפחות)? extern Char32 to_upper_char(Char32); void to_upper(String str) { for(int i=0;i<str.size();i++) str[i]=to_upper(str[i]); }
- מה לא בסדר בקוד הבא: def print_error_message(message): print translate("Error occured: ")+"“"+translate(message)+"”"
- מה לא בסדר בקוד הזה:
<?php $rtl_langs=array("he","ar","pa"); ?>
...
> ...
- אני רוצה לחתוך את הטקסט בצורה יפה, כך שזה לא ייחתך באמצע המילה: מה לא בסדר בקוד הבא: // Cut nice pice of text wstring cut_nicely(wstring const &orig,int n) { if(orig.size()<=n) return orig; return orig.substr(orig.find_first_of(L" \r\n\t\f",n)); }
