בתשובה להאייל האלמוני, 17/06/07 1:04
הנוער של ימינו 447385
כאן נכנס היתרון של שפות שמאפשרות שילוב קוד בשפות "נמוכות" כמו C. לא יודע איך זה הולך בג'אווה, אמנם, אבל אני לא חסיד גדול של ג'אווה (וממילא המטרה שלה אינה להיות סופר-דופר יעילה).

אני לא חושב שהמאפיינים מ"לא אלגנטי" והלאה תואמים שפות סקריפטינג (כשאתה אומר "שפות סקריפטינג" מה שיש לי בראש הוא רובי ופייתון, למשל).
הנוער של ימינו 447402
בג'אווה אתה יכול להשתמש ב-Java Native Interface כדי לקרוא לפונקציות ב-C. זה לא המנגנון הכי נוח בעולם, אבל זה עובד.
הנוער של ימינו 447426
אולי אנחנו מגדירים "אלגנטי" בצורה שונה, ג'אווה, למשל, היא שפה מאד אלגנטית לדעתי, שפה שכמעט מאלצת מתכנתים לא אלגנטים לכתוב בצורה אלגנטית. למעשה, יש הרבה מאד מתכנתים שהייתי מעביר לעבוד בג'אווה לתקופה מסויימת, רק בשביל שידעו לעבוד בצורה אלגנטית. במובן הזה שפות סקריפט (כולל, עד כמה שאני מכיר, פיתון ורובי) הן מאד לא אלגנטיות. C++ יכולה להיות אלגנטית מאד או לא אלגנטית מאד בתלות במתכנת בלבד. זה מה שיפה בה, וזה מה שעושה אותה לבעייתית.
הנוער של ימינו 447428
מה זה אלגנטי?

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

אתן דוגמה פשוטה: הצורך לכתוב

for (i=0; i<n; i++){
doSomething(array[i]);
}

כדי לעשות משהו על מערך בן n איברים הוא לא אלגנטי כמו, לדוגמה, לכתוב

array.each{|item| doSomething(item)}

ה-Vector שב-STL של ++C מותיר את אי האלגנטיות במקומה, כשה-i מתחלף באובייקט של איטרטור שעושה בערך את אותו הדבר. במקרה הראשון אנחנו צריכים לגלוש לפרטים - קח איטרטור, אתחל אותו לתחילת המערך, הגדל אותו כל עוד לא הגענו לסוף. במקרה השני הכל מתמצה בכתיבת array.each.

עוד דרך נחמדה להמחיש את ההבדל היא לנסות לקרוא בקול (או סתם להקריא בראש) את שני קטעי הקוד. הראשון פחות נוח להקראה, ויוצא מבולבל יותר. השני נשמע כמעט כמו שפה טבעית.
הנוער של ימינו 447432
אמנם חלפו בערך שש שנים מאז הפעם האחרנה שכתבתי קוד ב-C++ ובערך שבע מאז שכתבתי עם שימוש כבד ב-STL, אבל עד כמה שאני זוכר, יש בה for_each שמקבל איטרטור ו-function object. אולי זה מה שאתה מחפש?

הנוער של ימינו 447448
אכן, אבל אתה חייב להודות שהקוד שם נראה מסורבל למדי... ולא ברור לי מה קורה כשעושים משהו מורכב יותר - למשל, כשרוצים לעשות משהו דמוי collect, שמחזיר את המערך שמתקבל אחרי שמפעילים פונקציה על כל אברי המקור, או find שמחזיר תת מערך של אברי המקור שמקיימים קריטריון מסויים, וכשמשלבים אותם יחד באותה שורה.
הנוער של ימינו 447544
כפי שכבר נאמר כאן, סיפלוספלוס היא מולטי-פאראדיגמטית וגם קצת מסובכת (יחסית לשפות תיכנות אחרות). יש לזה חסרונות ברורים: זמן הפיתוח קצת ארוך יותר, למתכנתים ולמעצבים פחות מנוסים קל יותר לשגות והקוד לפעמים עלול להיות קצת קשה יותר להבנה.

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

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

לשאלותך, עד כמה שהבנתי אותן, ב-STL נכללים לא-מעט אלגוריתמים שימושיים, וביניהם כאלה שעונים עליהן. יש פונקציות רבות לחיפוש מותנה כמו למשל find_if, search_n או search, ויש גם כמה אפשרויות להפעיל פונקציה על כל אברי קונטיינר, כמו for_each שכבר הוזכר קודם, ו-transform.

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

הגישה הכללית של ה-stl היא אכן להשתמש ב-functors, וזה לא תמיד נוח או אלגנטי. אבל יש אינסוף אלטרנטיביות, החל ממימוש אד-הוק (אין-ליין) של הפעולה הדרושה, דרך כתיבה של פונקציות, פונקציות-תבנתיות או מאקרו-יים לצורך הענייין וכלה בשימוש בספריות חיצוניות, שחלקן סטדנדרטיות מאד, כמו למשל ספריות ה-boost. לדוגמא:
הנוער של ימינו 447546
אני מסכים איתך כמעט לגבי הכל, פרט ל-Operator overloading. המנגון הזה בדרך כלל אינו אינטואיטיבי (בניגוד לאחרים, טוב, גם חישובי קיצין ומצביעים לא היו כוס התה שלי) ויש לו תועלת לדעתי רק במקרים מאוד ספציפיים - מחלקות מתמטיות, מצביעים חכמים ו-function objects. ספרטניות בשימוש במנגנון זה דווקא עדיפה בעיני.
הנוער של ימינו 447550
לא בהכרח. לא היית רוצה שתהיה לך, לדוגמה, אפשרות של חיסור מערכים? יש שתי משמעויות מוסכמות בלבד שאני יכול לחשוב עליהן לדבר הזה, ולא קשה לבחור אחת ולדבוק בה.
הנוער של ימינו 447551
כשאתה אומר "חיסור מערכים" אתה מתכוון לפעולות על מטריצות באופן כללי? אם כן, זה נופל אצלי תחת "מחלקות מתמטיות".
הנוער של ימינו 447555
לא, הכוונה היא ''תוציא מהמערך שבאגף שמאל את האיברים שיש במערך שבצד ימין''.
הנוער של ימינו 447557
אני מוכן להתפשר איתך גם על זה למערכים ו-collections (אבל מעדיף שמות משמעותיים כמו union, intersect וכו'). אבל לא הרבה מעבר לזה. לא רוצה ש-Employee יתווסף ל-Department על ידי האופרטור +, ויגרע ממנה על ידי האופרטור -.
הנוער של ימינו 447558
כן, זה כבר באמת נראה כמו הורדה לזנות.
הנוער של ימינו 447573
גם new ו-delete הם אופרטורים.
הנוער של ימינו 447548
אולי כדאי להעיר שוב שהדוגמה (הפשוטה) של for_each שהבאתי קודם באה בעיקר להציג עד כמה התחביר של רובי אלגנטי לעומת מה שקורה במקומות אחרים. שימוש ב-STL, לפחות השימוש שיצא לי לעשות, דורש קצת עבודת הכנה והוא אף פעם לא אלגנטי באותה המידה. זו לא תחרות של "מה השפה שלי יודעת לעשות ששלך לא" (אבל מה שכן, האם ב-++C יש יכולות אינטרוספקטיביות?)
הנוער של ימינו 447554
(למיטב זכרוני, רק בהרחבות שפה של Visual C++ של מייקרוסופט. בשפה עצמה אין אינטרוספקציה, ואין טעינה דינאמית כמו ב-Java).
הנוער של ימינו 447779
מה הן יכולות אינטרוספקטיביות?
הנוער של ימינו 447799
גישה לעצם המתאר את המחלקה. בדרך כללל זה נותן גישה לשם המחלקה, לעצמים המחזיקים את המתודות שלה וכו'. זה גם מאפשר לטעון באופן דינמי מחלקות בזמן ריצה (למשל, לקרוא שם של מחלקה מקובץ קונפיגורציה, למשל שימוש ב-Factory שונה לכל מערכת הפעלה, עבור מחלקות המימוש של הספריה הגרפית. ברגע שיש לנו את שם המחלקה, נשתמש בטוען מחלקות: ב-Java זהו ה-ClassLoader, כדי ליצור מופע חדש של עצם מהמחלקה הנ"ל), ואפילו להפעיל מתודות לא דרך הממשק הרגיל של

object.someMethod(arg1, arg2)

אלא על ידי שימוש במחלקה ש"מפעילה" את המתודה. למשל

invoker.invoke(object, methodName, argsArray)

ובטח יש עוד דברים שלא הזכרתי כאן.
הנוער של ימינו 447880
תודה.
הנוער של ימינו 447433
קוד אלגנטי הוא קוד שקל להבין מה קורה בו (מה תעשה המכונה, ומה חשב המתכנת כשהוא כתב את הקוד), קל לשנות אותו, קל לפרק אותו, קל להגדיל אותו וקל לתקן אותו, במינימום עבודה, וכל זה ללא צורך בהערות, או בשיחה עם מי שכתב את הקוד.

(כצפוי, לג'אווה יש פתרון אלגנטי לבעיה שלך, for each, http://java.sun.com/j2se/1.5.0/docs/guide/language/f...)

עכשיו, תקח קוד פשוט בruby, למשל ה-MegaGreeter מתוך http://www.ruby-lang.org/en/documentation/quickstart... ותנסה לקרוא אותה. איכס.
הנוער של ימינו 447450
אז שוב, לא ברור לי במה ++C יותר אלגנטי.

הפתרון של ג'אווה נחמד. מענין איך הם מתמודדים עם דברים יותר מורכבים. מה שכן, הוא שקול למשהו שקיים גם ברובי (תחביר ה-for item in collection).

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

הפתרון של java לקוח משפות סקריפטים. אני אוהב את זה שהם חסכו במילה מיותרת (each או in) בלי להרוס את הקריאות. לדברים מורכבים יש את האיטראטורים.

קשה לי להסביר. מילים השמורות במקום סימני פיסוק, גישה ישירה לחברים, ומה זה ה"puts "Hello #{name}!"" המכוער הזה?
הנוער של ימינו 447471
ב(http://www.dmh2000.com/cjpr/index.shtml) יש מאמר ארוך יחסית שמנסה לתאר את היתרונות והחסרונות בכל שפה, ומכיל את אותו קוד (עץ אדום שחור http://www.dmh2000.com/cjpr/cmpframe.html) בכמה שפות.
הנוער של ימינו 447473
כן, ראיתי את המאמר הזה, אם כי לא את השוואת הקוד. נראה לי שהשורה התחתונה שלו היא "רובי/פייתון נוחים יותר לתכנות", לא?
מה יותר טוב, גליל או m-16? 447520
הדיונים על איזה שפה יותר טובה, מזכירים לי במשהו את הדיונים בצבא על מה יותר טוב, גליל או m-16. מה גם, שבמקרים רבים, אותם אנשים שהתווכחו בדיון הראשון, התווכחו לאחר שנה שנתיים בדיון השני. אני לא אומר שאין טעם לדיונים האלו; אני בעצמי חטאתי בדיונים ארוכים כמו האם צריך לקרוא למתודה Processor.process או אולי דווקא Processor.act (ברור שהשני עדיף, כאילו דה).
אני רק רוצה להציב את הדיון בפרופורציה. יש כלי נשק עתיקים כמו קרבין, שלא ניתן אותם ליחידה מבוחרת; מצד שני, היחידה המובחרת שלנו כנראה תבצע את המשימה שלה בהצלחה גם עם גליל וגם עם m-16 . מצד שלישי ייתכן שהייתרונות הקטנים של כל כלי (למשל, עמידות למים) הם מאד רלוונטיים. אבל זה נדיר. הרבה פעמים היתרונות הם לא פונקציונאליים - למשל נשק מסויים הוא יותר זול, יותר לוחמים מכירים אותו, יותר כיף לירות בו, או פשוט למפקד היחידה יש חיבה אישית לכיוון מסויים. גם זה חשוב, מפקד מרוצה הוא מפקד טוב.

אחרי התובנות הלא ממש עמוקות האלו, אפשר לחזור לדיון המקורי. קודם כל, ברור ש m-16 יותר טוב. שנית, לי יש חיבה אישית ל #C . כנראה בגלל שיצא לי לעבוד איתה לא מעט. יש לה כמה תכונות נחמדות שאין ב Java (יצא לי לעבוד גם ב Java. שתי השפות די קרובות) - למשל Properties , Attributes ו Events-delegates (לא שאין לתכונות האלו תחליף, פשוט התחליף הוא פחות נוח). אבל הייתרון העיקרי של #C ושל NET. הוא הספריות המוצלחות מאד שמגיעות עם החבילה, והתעוד המצויין.
חסרון רציני מאד גם של #C וגם של NET. הוא שממש קשה לכתוב את השם שלהם בעברית. הוא מתהפך. אין ספק שהיו לא מעט מנהלי פיתוח שהתחילו לכתוב מייל בסגנון "החלטתי שנכתוב את הפרוייקט ב C#" ואז ניסו לתקן את המייל במשך חצי שעה, ובסוף התייאשו ואמרו לעצמם, לעזאזל הכל, נכתוב אותו ב Java וזהו.
מה יותר טוב, גליל או m-16? 447524
לסי-שארפ יש יתרון גדול אחד על ג'אווה - אתה יכול לסנן בעזרתה אידיוטים בראיון עבודה. "אז אתה אומר שיש לך עשר שנות ניסיון עם סי-סולמית? אנחנו מצטערים, אתה overqualified. אל תיתן לדלת להסביר לך שהשפה לא קיימת עשר שנים בדרכך החוצה."
ראיון עבודה בחמש מערכות 447559
הנה קטעים מראיון עבודה שנערך היום במקום עבודתי.
משתתפים: אני, מראיין מתלמד (שותק רוב הזמן), מרואיין - ד"ר למדעי המחשב בתחום האלגוריתמים, בעל ניסיון מקצועי עשיר בתעשייה (לפי קוה"ח), אך עם טון דיבור ושפת גוף מלאי זילזול.

אתה אולי רוצה לתאר משהו שעשית?
מה למשל?
משהו...
יש הרבה דברים.
תבחר אחד...
אין משהו מיוחד.

איך פותרים את הבעייה?
יש את זה בספר של קנות'.

מה הסיבוכיות של הכנסה לעץ?
זה יוצא די הרבה.
כמה הרבה?
נו, אם הייתי יושב עם דף וחושב אז בטח הייתי אומר לך.
(לפניו היה מונחים דף ועט)

יש לך רעיון איך לגשת לזה?
גם את זה אתה יכול למצוא בספר של קנות'.
אני מנסה לכוון אותו ושואל לבסוף: נו, אז איך עושים את זה?
נו, זה שורה שתיים.
בכ"ז...?
יש שם And לוגי.
יפה! של מה עם מה?
בטח יש את זה בגוגל- אין טעם להמציא שוב את הגלגל.

(המערכה המסכמת כללה כתיבת קוד - שגוי לחלוטין)
ככה שלושת רבעי שעה, כדי שלפחות ירגיש שקיבל הזדמנות.
ראיון עבודה בחמש מערכות 447815
כמו שאתה מתאר אותו, אולי כדאי שתראיין אותי.
ראיון עבודה בחמש מערכות 447821
מה אתה יודע לעשות?
ראיון עבודה בחמש מערכות 447822
אני מכיר עוד ספרים מלבד זה של קנות' להגיד שהפתרון נמצא בוודאי בהם.
ראיון עבודה בחמש מערכות 447836
אתה בהחלט בכיוון!
אם בנוסף אתה גם טוב בשיחות מסדרון, שיטוטים באינטרנט, פלירטוטים עם המזכירה ולקיחת קרדיט על עבודה של אחרים - אנו זקוקים גם ליכולותיך הניהוליות.
ראיון עבודה בחמש מערכות 447840
כמה אתם משלמים? כדאי שתמהר, יש לי הצעה מתחרה ממקדונלד'ס.
הראיון הוא הרעיון 447856
משלמים? מי דיבר בכלל על כסף? כל הרעיון שמאחרי הקמת החברה היה מה שנקרא בבתי הספר למנהל עסקים "ראיונות מוכווני רווח": המערכות המפותחות בחברה מאופיינות, מתוכננות, ממומשות, נבדקות ומופעלות ע"י מרואיינים, כחלק ממבחני הקבלה לעבודה. המראיינים הם מועמדים לתפקיד "מנהל כ"א" וגם עלויות בניין אין, מאחר והראיונות מתבצעים בבתי קפה עם לפטופים.
אז למתי קבענו?
הראיון הוא הרעיון 447879
כמו כן, אין צורך במזכירה וטלפון. הראיונות מתואמים דרך תגובות באייל.
הראיון הוא הרעיון 448317
:-)
הראיון הוא הרעיון 448351
שמע, רק עכשיו עליתי על הפתיל הזה והחברה שלך נשמעת לי יוצאת מן הכלל. אם תתנו לי לפטופ, אשמח להיות מראיינת.
הראיון הוא הרעיון 448353
ייתנו לך להביא אחד מהבית, אבל תצטרכי להשיב אותו לחברה אחרי הראיון.
הראיון הוא הרעיון 448355
מראיינות אינן אמורות להשיב, אלא לשאול בלבד.
מה יותר טוב, גליל או m-16? 447528
אכן, כמעט ועברתי ל-#C, אבל אז גיליתי את רובי.

לא ציינתי שהדיון כאן הוא על העדפות אישיות ואני לא באמת מנסה לשכנע איש בעליונות אובייקטיבית, מה?
מה יותר טוב, גליל או m-16? 447530
לדעתי הדיון לגיטימי ומעניין, למרות שנבצר ממני לקחת בו חלק פעיל.
מה יותר טוב, גליל או m-16? 447574
הנה לינק משעשע שקשור בעקיפין לנושא.

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

ואגב, נזכרתי במשפט של סטואי מהפרק האחרון של family guy שראיתי (נא לקרוא במבטא בריטי).
How can you say you don't like it, if you haven't really given it a chance?

לתשומת ליבו של הקורא אח של אייל.
מה יותר טוב, גליל או m-16? 447532
כשאני הייתי בצבא זה היה ברור, M-16 היה "מטאטא" של ג'ובניקים, וגליל זה נשק של הקרביים הקולים. כג'ובניק חזרתי הביתה בכל יום, והצלב שנאלצתי לשאת על גבי בכל ערב במשא המפרך היה הנשק הארוך, המסורבל והלא אטרקטיבי (לחיילות שלא מסתכלות עליך, ולנהגים שלא עוצרים לך). גם כשהתחלתי לתכנת זה היה ברור. היה פסקל בשביל ללמוד, C בשביל לעשות טריקים ובשביל לתחזק קוד שנכתב לפני שלוש שנים ויותר, C++ בשביל לעבוד על קוד חדש, וקובול בשביל בנקים ועורק. היום ג'ובניקים מסתובבים בלי נשק, צנחנים מסתובבים עם M-16, וכל מתכנת יודע 5 שפות.

C# זאת שפה שעובדת במערכת הפעלה אחת, של החברה שהמציאה אותה, לא?
מה יותר טוב, גליל או m-16? 447534
לפחות בתיאוריה לא (לא ברור לי מה קורה בפרקטיקה):

מה יותר טוב, גליל או m-16? 447538
(אבל M16 מקוצר)
מה יותר טוב, גליל או m-16? 447540
(אחרי יותר משנתיים עם M-16 ארוך באמת קיבלתי M-16 קצר. פתאום חיילות שלא ירקו לכיוון שלי ניסו להתחיל איתי. אבל אני כבר הייתי לפני שחרור וממש לא הייתי בקטע של ילדות מפגרות ששופטות אותך לפי סוג הנשק שלך)
מה יותר טוב, גליל או m-16? 447553
אני מקווה שאחרי כמעט 8 שנות נסיון אני ראוי להקרא מתכנת, אבל חוץ מהכרות לצורך קורסי חובה באוניברסיטה ובתיכון עם בייסיק, אסמבלר (8086), פסקל, ג'אווה ו++C, אני יודע למעשה רק שפה אחת.
מה יותר טוב, גליל או m-16? 447570
C# עובדת טוב במערכ(ו)ת הפעלה של החברה שהמציאה אותה.
ובנוסף, עובדת, בערך, על מע"ה אחרות:
הנוער של ימינו 447460
אם אתה רוצה משהו אלגנטי, אני חושב שאתה צריך לחוש ולמצוא את לוח המקשים עם כל הסימנים מיוחדים ולבדוק את שפת APL.
הנוער של ימינו 447472
עד כמה ש-APL היא שפה נהדרת, אני חושב ש-Malbolge [Wikipedia] מנצחת אותה בנוק-אאוט.
הנוער של ימינו 447474
(חרמפף, רק עכשיו ראיתי את תגובה 447123)

חזרה לעמוד הראשי המאמר המלא

מערכת האייל הקורא אינה אחראית לתוכן תגובות שנכתבו בידי קוראים