ואללה Vala!

ב־5.7.2010, מאת ארתיום; פורסם תחת: תכנה חופשית, לינוקס, פיתוח, תכנה ומחשבים; ‏10 תגובות

כבר לא מזמן שמתי לב על פרויקט Vala‏‏ של Gnome... אבל רק עכשיו יצא לי לנסות את הגרסה העדכנית שלו לעומק (גרסה 9.2).

כשקראתי בפעם הראשונה על Vala התגובה הייתה: "It is too good to be true".

  • שפה מקומפלת ורצה בצורה טבעית (ללא זבל של VM ו־JIT) שזה אומר שהיא לא צורכת הרבה משאבי CPU.
  • שפה שמשתמשת ב־GC פשוט (שימוש ב־reference counting במקום GC אמתי). מדוע זה טוב? כי יש לך דטרמיניסטיות ו־destructors - שזה אומר שהיא לא צורכת הרבה זיכרון.
  • תמיכה ב־RAII שכל־כך חסר לי שפות כמו Java או C#‎.

ובנוסף לכל:

  • הם הרוויחו ישירות SDK מאוד עשיר של Gnome. כי כל מה שמבוסס על GObject בא בצורה טבעית ל־Vala.
  • הם הרוויחו תמיכה בפלטפורמות רבות בכלל שהם בחרו כשפת ביניים את C, כך שרוב העבודה הקשה הם משאירים למהדרי C (שיש בשפע החל מהדרים חזקים כמו gcc עד מהירים וקלילים כמו tcc).

לטעמי, שפה כמעט מושלמת לפיתוח יישומיים יומיומיים.

למעשה, היום ל־C++‎ יש מספר חלופות מצומצם שנותנות יכולות דומות עם פישוט של השפה עצמה: D‏, Vala,‏ ו־FPC. (אני לא מדבר על Java או C#/Mono כי הם בכלל בליגה אחרת)

שפת D היא בעלת פוטנציאל גבוהה ביותר מכולם, אבל אני אישית חושב שעבודה עם Garbage Collection מקשה על הרבה דברים. היא מפרידה בין שני סוגי המשאבים: זיכרון וכל השאר (שהם הרבה יותר יקרים) כמו קבצים, נעילות, קשרי רשת פתוחים ועוד, שכן דורשים ניהול דטרמיניסטי. כך שאני חושב שעובדה עם Reference Counting נותנת מענה ל־95% מהמקרים, והשאר, נפתרים בקלות עם מעט תחכום.

Pascal בעייתית מהרבה בחינות, כולל ניהול משאבים ידני, העדר RAII וגם GC ועוד הרבה דברים שהופכים אותה מזדנבת מאחורי הטכנולוגיות המודרנית (עידו, זאת דעתי, אתה יכול להסכים או לא להסכים אתה).

עכשיו, על הנייר, נראה ש־Vala לקחה את הטוב ביותר מהרבה שפות

  • מ־C היא לקחה ה־ABI הפשוט וקלות חיבור עם שפות אחרות, בסה"כ מדובר ב־C!
  • מ־C++‎ היא לקחה את RAII, לקחה את ה־Destructors.
  • מ־C#‎ היא לקחה את OOP ואת הקלות של הכתיבה כך אפשר מהר ובקלות להיכנס לפיתוח.

אז החלטתי להסתכל לעומק

ציפו לי מספר אכזבות:

  • Vala לא תומכת ב־Overloading בדיוק כמו ש־C לא תומך. ההיגיון מאחורי הוא די פשוט: הם רוצים שקוד C שנוצר יהיה שימושי גם מחוץ ל־Vala, קרי יישום של GTK יוכל להשתמש במחלקות שבמקור כתובות ב־Vala וזאת טענה מאוד חזקה שאני מוכן לקבל.
  • החריגות (Exceptions) ב־Vala הן ממש לא חריגות כפי שאנחנו מכירים אותם ב־C++‎ או ב־Java - הן לא מחלקות. אי אפשר ליצור היררכיה של חריגות, למשל DiskError שיורש מ־IOException והוא בתורו יכול יורש מ־Exception הבסיסי.

    החריגות הן למעשה צירוף של תחום (domain) קוד ומחרוזת המייצגת את השגיאה, כך למשל כדי להציג חריגה שדיברנו עליה אנחנו מייצרים errordomain IOError בתוכו אנחנו בוחרים סוגים כמו DISK_ERROR שהוא פרמטר של החריגה, וכמובן גם טקסט. מבחינה זו, היה יותר נכון לקרוא להן Error Code מאשר חריגה במובן הקלסי.

    נכון שזה מכסה 95% מכל המקרים, אבל זה כן מייצר בעיה כשאתה רוצה להעביר מידה יותר מורכב (אם כי זה נדיר).

  • התיעוד עדיין לוקה בחסר הן מבחינת השפה עצמה והן מבחינת הספריות (אני צריך לפנות כל פעם לתיעוד GTK של C כדי להבין מה מתודה מסוימת עושה).

  • לפחות בשלב זה, אתה חייב לדעת C, כי לפעמים, כן קוראות שגיאות קומפילציה ברמת C, במיוחד עם ספריות חסרות או גרסאות לא תואמות.

אבל בגדול: שפה מהירה מאוד, פשוטה, בעלת SDK מאוד עשיר ואני צופה לה עתיד מעניין.

סיכום

היום Vala היא עדיין לא שפה מוכנה ל־Prime Time, אלא אם אתם מוכנים להיות בודקי הבטא שלה, מצד שני אם אתה יודע C ומכיר Gtk מספיק טוב, אתה תוכל להסתדר בקלות אתה.

היום מספר שפות יחסית מהירות ומתאימות לפיתוח יישומי Destkop:‏ C‏, C++‎‏, D,‏ C#‎‏, Java,‏ Pascal ו־Vala. אני בהחלט רואה ב־Vala פוטנציאל גבוהה (כמובן לצידה של C++‎).

תגובות

ליבוביץ, ב־5.7.2010, 15:30

הבעיה העיקרית שלי עם כל השפות הזניחות הנ"ל, היא, שאין להם תמיכה (קרי תיעוד), וקוד כתוב כבר כמו לC++. הן עדיפות בעיני בהרבה על סי++, אבל אין להן מספיק משתמשים.

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

ארתיום, ב־5.7.2010, 15:54

לא אמרתי ש־Vala היא תחליף ל־C++‎, אבל זה כן פרויקט מאוד מעניין.

ik_5, ב־5.7.2010, 17:12

ארתיום ממתי אין לפסקל RAII ?! לא רק שיש לה תמיכה לזה, אתה גם יכול להחליט איפה השיחרור של המשאבים יקרה.

try bla bla except on e:Exception do .... end; finally do something end;

בקשר לGC -> זה דבר שאני מעוד שונא http://idkn.wordpress.com/2010/06/29/memory-leak-in-dynamic-languages/

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

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

ארתיום, ב־5.7.2010, 17:39

ארתיום ממתי אין לפסקל RAII ?!‏

הכוונה לא ל־finally - ברור שזאת הדרך הטבעית לעשות את זה ברוב השפות. הכוונה ניקיון משאבים אוטומטי ביציאה מה־scope מבלי לציין את המשאב פעמיים. קרי

File f = new File("test.txt");
try {
...
finally {
  f.close()
}

אתה מציין את המשאב פעמיים כשאתה יוצר אותה וכשאתה סוגר אותו.

זאת גם שיטה שרוב השפות עובדות איתה, אבל היא לא RAII, כי באותה מידה גם ל־C היה RAII.

void foo();
{
  FILE *f=fopen("test.txt","r");
  ...
exit_point:
  fclose(f);
  return result
}

הכוונה לניקיון אוטומטי:

std::ifstream f("test.txt");

אתה לא חייב לקרוא ל־f.close()‎, כי בצורה אוטומטית הקובץ ייסגר ביציאה מהפונקציה.

ראה RAII‏

לגבי ה־GC אני מסכים איתך.

ארתיום, ב־5.7.2010, 17:40

לא רק שיש לה תמיכה לזה, אתה גם יכול להחליט איפה השיחרור של המשאבים יקרה.

הערה קטנה, אני מבין את הנקודה, פשוט ב־C++‎ אם אתה רוצה לשלוט באופן מפורש אתה תמיד יכול לקרוא ל־f.close()‎ בכל מקום... אבל אתה יכול גם להסתמך על ההורס.

elcuco, ב־5.7.2010, 20:07

ארתיום, אתה יודע שב־D אפשר למחוק אובייקטים explicitly. אני פספסתי משהו שאתה פספסת...?

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

  1. איך אני מדבג? (כמו שאני מדבג תמיד...?)
  2. מה רמת התלות של השפה ב־glib. האם אני יכול לתכנת יישום שלא משתמש ב־glib כלל?
  3. מה עם הדברים האלו שחסרים ב־C ויש ב־C++‎ כמו containers ... מה עם מחרוזות? מה עם threads? (בעצם מה התחליף ל־stl+boost שם?)

נ.ב. אתה לא יודע כמה אני מבואס תחת משני דברים שקרו השבוע ... כן כן, ה־4-0 המביש הזה הוא אחד מהם...

ארתיום, ב־5.7.2010, 22:23

איך אני מדבג? (כמו שאני מדבג תמיד…?)

כן, זאת נקודה בעייתית. בגדול הוא כן מציג את הקוד, זה דומה לדיבוג של אובייקטים של GObject. בכל מקרה צריך להבין את ה־C שמאחורי הקלעים. האמת, צריך תמיכה טובה בדיבאגרים שעדיין איננה. מה שכן, הבנתי שיש IDE עבורו, אולי זה מפשט דברים.

מה רמת התלות של השפה ב־glib. האם אני יכול לתכנת יישום שלא משתמש ב־glib כלל?

כל ה־Vala בנויה מסביב ל־glib ו־gobject כך שזה חלק מרכזי. למעשה, זה דומה למה שקיים ב־C#‎ או ל־Java בו הכל יורש מאובייקט אחד בסיסי. כך שכן יש לך תלות מלאה. כי ב־C אין אובייקטים, אז glib+gobject מביא אותם.

מה עם הדברים האלו שחסרים ב־C ויש ב־C++‎ כמו containers … מה עם מחרוזות? מה עם threads? (בעצם מה התחליף ל־stl+boost שם?)

זה דווקא יש בשפע... הרי יש לך glib שזה כמו boost עבור C. בגדול, יש לך גם בספריית Gee שנותנת לך קונטיינרים גנריים כמו map, multimap hash ועוד. בחינה הזו אתה מקבל את כל ה־SDK המלא וזה מה שבאמת יפה פה.

כמובן יש לשפה הזו עוד דרך מאוד ארוכה... מצד שני בהשוואה ל־D שקיימת כבר כ־10 שנים Vala שקיימת 4 שנים עשתה צעדים יפים.

כך או אחרת, זה נראה פרויקט מבטיח ומעניין (אם כי אני עדיין אעדיף את C++‎).

shlomil, ב־7.7.2010, 1:20

גם אני מצאתי את עצמי מתעניין ב vala וב D ואף בשפת go שאתה קצת הזנחת בפוסט הזה. אז ככה:

המפתח הראשי של D מעצבן אותי כי הוא לא משחרר את הקומפיילר שלו לגמרי. יש מימוש די נטוש תחת gcc ויש מימוש חדש שנקרא lldc תחת llvm אבל אף מימוש לא מתקרב למקור. השפה הזו כרגע מתה מבחינתי. אני נורא אוהב את התכנות הגנרי שם - יש שם רעיונות פורצי דרך.

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

ל vala יש סיכוי להפוך למשהו מדהים שלדעתי יהיה הדבק שמחבר את כל הספריות המעולות בלינוקס למשהו רב עוצמה. אין ide איכותי עדיין - וניסיתי את כולם. בא לי לכתוב לה ide משלי:-) יש אפשרות לדבג עם gdb . זה עובד. אבל קשה.

ארתיום, ב־7.7.2010, 7:19

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

זה בדיוק מה שמסקרן אותי ב־Vala.

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

לגבי Go, אני ממש לא מתלהב... זאת אפילו לא שפה שתומכת ב־OOP.

אלרום, ב־10.7.2010, 10:51

take a quick look at google's go, it introduces quite a few interesting features...

(unfortunately it also has gc....)

http://code.google.com/p/go

הוסף תגובה:

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

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

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

דפים

נושאים