מאמרים בנושא ‏תכנה ומחשבים‏.

השוואת FPC ושפות אחרות

ב־יום שני, 18 במאי 2009, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים; ‏8 תגובות

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

השוואה לפי תכונות:

FeaturePythonJavaCC++FreePascal
Core:
Memory man.AutomaticAutomaticManualSemi-AutomaticManual
Resources man.Automatic1ManualManualSemi-AutomaticManual
InheritenceMultipleSinlgeNoMultipleSingle
PolymorphizmDuckDynamicNoDynamic+StaticDynamic
ReflectionYesYesNoNoNo
Language Features
Generic ProgrammingIrrelevantLimitedNoTuring CompleteLimited
Generic methodsIrrelevantYesNoYesNo
Requires interfeceIrrelevantYes-NoNo
Functional ProgrammingYesVery LimitedNoC++03 Limited
C++0x Full
None
Libraries:
Standard:RichRichPoorLimitedRich
  conteinersYesYesNoYesYes
  threadingYesYesNoNoYes FCL
  GUIYesYesNoNoYes LCL
3rd party libs.:RichRichRichRichPoor
Other:
  StandardsNoneYesYesYesOutdated
  Implementations:CPython, Jthon, IronPythonGNU, Sun, IBMLotsMany: GNU, MS, HP, Sun, Intel...Single
  Defacto-VendorYes: CPythonYes: SunNoneNoneFPC
  PerformancePoorMediumHighHighHigh

הערות:

  1. רק ב־CPython.

סיכום:

  1. Python: נותנת לעבוד עם כל סגנונות פיתוח אפשריים, קל לפיתוח וניהול משאבים, אבל סובל משתי בעיות עיקריות: ביצועים ו־vendor lock in.‏
  2. Java: שפה יחסית מגבילה מבחינת הגישה שלה, אבל בטוחה לפיתוח ותכנות בזכות: GC, ספריה סטנדרטית מאוד עשירה פשטות השפה.
  3. C: שפה שכמטע ולא מספקת כלים "מודרניים"... כבודה במקומה מונח, ועדיין יש לה המון יישומים במיוחד בתחום embedded, או כל תחום אחר בו צריך לרדת לרמת תכנות נמוכה ולשמור על קומפקטיות וקריאות של הקוד.
  4. C++‎: שפה מאוד עשירה, הרכיבים המודרניים היחידים שחסרים לה זה: העדר Reflection, העדר GC מלא (אם כי ב־C++‎‏ RAII מחליף אותו בהצלחה) ואולי צורך בספריות צד ג'. כמובן עם הכוח בא גם החיסרון: שפה מסובכת שלוקח זמן ללמוד אותה לעומק ולהבין את הרבדים השונים שלה.
  5. עכשיו הגיע תורה של FPC:‏ היא נמצאת איפשהו בין C לבין Java:
    • מצד אחד, אין לה GC ומצד שני אין לה גם RAII שיש ב־C++‎, ניהול המשאבים שם ידני לחלוטין ממש כמו ב־C.
    • יכולות הירושה מוגבלות לירושה בסגנון C#/Java.
    • תמיכה ב־Generics מוגבלת, אין תכנות פונקציונלי (במובן lambda calculus) וגם אין Reflection.
    • ספריה סטנדרטית די עשירה (אם לוקחים גם FCL ו־LCL), אבל העדר ספריות צד ג' כואב, הרבה יותר

נשאלת השאלה: מהו הערך המוסף ש־FreePascal נותנת מעבר לתחביר שנחשב לקצת יותר קריא? נדמה שלא הרבה.

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

ב־יום ראשון, 17 במאי 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.

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

"האח הגדול" בהתנדבות ושמו Facebook.

ב־יום רביעי, 29 באפריל 2009, מאת ארתיום; פורסם תחת: מוזיקה וריקוד, אינטרנט, תכנה ומחשבים; ‏15 תגובות

ביום ראשון, חזרתי מקונגרס הסלסה ורציתי למצוא מה מספרים האנשים על הקונגרס באתרי הסלסה הגדולים כמו: LaMusica.co.il‏, ‏salsa.co.il‏ שעד לא מזמן, היו מקורות מידע מעולים. לתדהמתי גיליתי אתרים שוממים לגמרי. אף אחד לא שואל: "איך היה", לא מספר "היה מגניב" או מתלונן, אף אחד לא מביע ביקורת.

למעשה, בשנה האחרונה, לא קראתי ולא כתבתי באתרים אלו באופן פעיל, אלא הייתי רק מציץ לשתי דקות פעם בחודש--חודשיים. הבנתי, משהו רע מאוד קרה לאתרי הסלסה בארץ. אז נתקלתי בדיון הזה בפורום ב־LaMusica והבנתי שכל הפעילות, כל הדיונים עברו ל־Facebook. למעשה, כל השיחות התפזרו בין קבוצות ומועדונים שונים ב־Facebook עצמו אם כי בצורה שונה מהדיונים שהיו פעם. כפי ש־"Icy" סיכם:

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

מה שכן, כולם שם. למה? כי כולם שם. למה? כי כולם שם...

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

מה שגיליתי, פשוט הפחיד אותי... באמת!

המשך...

האם אתה מוכן לבינאום ולוקליזציה?

ב־יום ראשון, 19 באפריל 2009, מאת ארתיום; פורסם תחת: לינוקס, פיתוח, תכנה ומחשבים, C++‎‏, Unicode; ‏6 תגובות

הכנתי שאלון קצת שמאפשר לכם לבדוק... האם אתם מוכנים לכתיבת תכנה שתהיה מוכנה להתאמה לתרבויות שונות?

  1. אני רוצה לייצג מחרוזת, כ־char *some_text. מהו המידע שחסר לי?
  2. יש לי מחרוזת wchar_t *text או String text ב־Java, אני רוצה לקחת את התו הראשון שלה: wchar_t c=text[0]; // C Char c=text.charAt(0); // Java האם זהו קוד נכון?
  3. אני כותב את הקוד הבא: if n==1: print translate("You have one aplle") else: print translate("You have %d apples") % n מה לא בסדר בקוד הזה?
  4. מה לא בסדר בקוד הבא: #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;
     }
    
  5. מהו גודל הזכרון הנדרש לשמירת תו unicode בודד?
  6. מהו גודל של wchar_t? (למתכנתי C++/C)‏?
  7. מהי גודל של תו unicode בשפת התכנות שאתה אוהב?
  8. מהו קידוד של מחרוזת (unicode) בשפת התכנות/toolkit שאתה אוהב?
  9. מה הבדל בין utf-8,‏ utf-16, ‏utf-32?‏
  10. מהו אורך התו הארוך ביותר ב־utf8?‏
  11. בניתי ספרייה עם שתי פונקציות בלבד. מה לא בסדר בקוד הבא (שתי בעיות לפחות)? 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]); }
  12. מה לא בסדר בקוד הבא: def print_error_message(message): print translate("Error occured: ")+"“"+translate(message)+"”"
  13. מה לא בסדר בקוד הזה: <?php $rtl_langs=array("he","ar","pa"); ?> ...
    > ...
  14. אני רוצה לחתוך את הטקסט בצורה יפה, כך שזה לא ייחתך באמצע המילה: מה לא בסדר בקוד הבא: // 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)); }
המשך...

Unicode ב־C++‎ תיקון טעות.

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

עדכון קטן על תמיכה ב־Unicode ב־C++‎. למעשה, כשאמרתי בכתבה קודמת שאין כל תמיכה ב־Unicode, טעיתי. דווקא יש תמיכה אם כי היא לא מתקרבת למה ש־ICU נותן.

std::locale נותן מספר ממשקים בפרט: std::ctype<>‎ שמאפשר המרה של case והמרת קידוד בין קידוד מקומי כמו utf-8 או cp1255 למחרוזות של wchar_t. הוא מצליח להמודד עם מקרים יחסית פשוטים כמו המרת "Артём" (השם הפרטי שלי ברוסית) לאותיות גדולות וקטנות בצורה נכונה: АРТЁМ. דבר שכל הכלים, אפילו פחות מוצלחים כמו Python ו־qt3 מצליחים לבצע ללא בעיה.

אבל תמיכה מובנית עדיין לא מצליחה להתמודד עם מקרים מסובכים יותר כמו ß הגרמנית ו־Σ היוונית.

כך שלצרכים הבסיסיים, ניתן להסתפק ב־API של C++‎ כפישהו, אבל כמובן זאת לא תמיכה מלאה (כמו גם בשפות אחרות, משל Python).

לדוגמה toupper‏:

// Set global locale
locale::global(locale("en_US.UTF-8"));

// Now we can use locale for various purposes
wchar_t str[]=L"Артём";
use_facet<ctype<wchar_t> >(locale()).toupper(str,str+5);

העמוד הבא

העמוד הבא

דפים

נושאים