|
||||
|
||||
The C++ Programming Language הוא ספר אימה. (אגב, יצא לך להכיר את שפת התכנות Ruby?) |
|
||||
|
||||
שמעתי עליה. למה? |
|
||||
|
||||
היא הסיבה שבגללה אני מצטמרר בכל פעם שמישהו מזכיר ++C. |
|
||||
|
||||
מה מצמרר בשפה הזאת? (אני לא מכיר אותה ). |
|
||||
|
||||
הכתיבה בה הרבה יותר מסורבלת וחשופה לשגיאות מאשר ב-Ruby המוזכרת, ברמה של סדרי גודל. זו שפה שנותנת (לפחות לכאורה) כוח רב יותר למתכנת מאשר בשפות אחרות, ואמורה (נניח) להיות מהירה יותר, אבל המחיר הוא התעסקות מתמשכת בפרטים קטנים ששגיאה בהם עשויה להיות קריטית (בפרט, ניהול זיכרון) וקוד לא קריא. כדי להשתמש בשפה הזו כמו שצריך חייבים להתבסס על הרבה ספריות מוכנות מראש, אבל רובן בנויות בצורת תבניות כלליות, והשימוש בהן למקרים ספציפיים דורש תמיד עבודת הכנה מסויימת וסירבול קוד נוסף. |
|
||||
|
||||
פגעת בציפור נפשי ): |
|
||||
|
||||
אז הבעיה היא שצריך לדעת לתכנת, כדי לתכנת? |
|
||||
|
||||
לא. שכדאי שתהיה לך שפה נוחה לתכנת איתה. |
|
||||
|
||||
זה לא רק עניין של נוחות או של לדעת לתכנת. C++ היא שפת תכנות שימושית1 אבל עם design גרוע למדי (שנובע מההיסטוריה של התפתחות השפה). מהנסיון שלי, לרוב המאמינים ההדוקים ב-C++, שחייבים לתכנת דווקא בה באופן כפייתי, פשוט אין ניסיון עם שפות תכנות אחרות (ועם היתרונות והחסרונות שיש בכל שפה). את ruby עדיין לא ניסיתי. אתה מכיר את ההבדלים בינה לבין python? עם כל חיבתי ל-python יש בה יותר מידי דברים שאני חושב שהיה אפשר לעשות יותר טוב (ובקלות). __________ 1 לצרכים מאוד מסוימים. לרוב הדברים יש כלים מוצלחים יותר. |
|
||||
|
||||
אני לא בקיא בפייתון, אבל אתה יכול להגיד מה הרגיז אותך שם ואני אנסה לחשוב אם אני יודע איך זה ברובי. |
|
||||
|
||||
כדי לדעת לתכנת באמת, צריך להכיר לעומק יותר משפת תכנות אחת, לדעת מתי להשתמש בכלים שונים (ומתי לשלב ביניהם), לדעת מתי צריך להמציא את הגלגל ומתי לא צריך (בניגוד לאיך שמתנהגים יותר מידי מתכנתים העוסקים בתכנות לשמו - ברוב המוחלט של הבעיות לא צריך). |
|
||||
|
||||
אה, אז לזה מתכוונים ב-"אד הומינום". תהיתי איך זה מרגיש. נו, אם אין ברירה: אני מתכנת אי-אילו שנים לפרנסתי, והרבה לפני זה כתחביב. בזמן הזה הספקתי לתכנת פרוייקטים קצת רציניים יותר מ-"ממש עץ אדום-שחור" בלפחות 5 שפות תכנות שונות, ומן הסתם התנסיתי בעוד כמה שפות פה-שם. יייתכן שאני מסמפט מאד את סיפלוספלוס מכיוון שפשוט לא נתקלתי עדיין בשפה המושלמת באמת, אבל אני בכל זאת מאמין שההסבר להעדפתי אינו טמון כולו בפסיכולוגיסטיקה ובורות. ההארות שלך טריוויאליות למדי, וככאלה כמובן נכונות. אבל לא מאד קשורות למה שאמרתי. מבין הדברים אותם לא אמרתי, אפשר לכלול למשל את "תמיד, ובכל מצב, ובכל מקרה, צריך להשתמש רק בסיפלוספלוס!". |
|
||||
|
||||
ילדודס, חברהל'ך, אתם כולכם מבולבלים. טוב שסוף סוף הבנתי, לא סיפלוספלוס אלא פשוט סיפולוקס! סיפולוקס! אני לא יודע מה כל מה שאתם מקשקשים כאן, אבל אין שום בעיה - אם כל הצרה של המתכנתים זה שחסר כמה סיפולוקסים, יש לי במחסן עשרות! כשאני וסבתא התחתנו ב-1962 סיפולוקס היה השלאגר הכי גדול וכל הדודים והקרובים מכל הארץ הביאו לנו את הסיפולוקסים שלא זכו לגאולה עוד מהחתונות שלהם. רק תגידו מילה ואני יורד ומביא כמה שצריך, סוף סוף הם יקבלו את הכבוד המגיע להם! שהחיינו וקיימנו והגיענו, לעיניים שאת האושר הזה רואות! אומיין! |
|
||||
|
||||
זה לא אתגר אפילו לבלשים מתחילים מאד. |
|
||||
|
||||
זה לא נראה לי ברמתה של החשמנית. |
|
||||
|
||||
Wanna bet?
|
|
||||
|
||||
אני אוסף זה זמן רב סיפולוקסים שונים אשמח לדעת מה עלה בגורלם של הסיפולוקסים שברשותך והאם תסכים למסור אותם לידי למשמרת אשמח לדבר איתך ואף להיפגש דרור 0505457111 |
|
||||
|
||||
(נו, אפשר להתאפק?) |
|
||||
|
||||
את c++ אני מכיר (מלימודיי) ומתעב, אבל חשבתי שזה נובע מזה שיש לי פחות נסיון בה מאשר בjava. ושהלימוד שלה היה מהיר ושישר זרקו אותנו למים העמוקים בלי להשתכשך קצת בבריכה של הילדים, ולא מאיזה בעייה בשפה. את המשפט "היא (רובי) הסיבה שבגללה אני מצטמרר בכל פעם שמישהו מזכיר ++C" הבנתי לא נכון, משהו בסגנון "רובי (המבוססת על C++) היא הסיבה שבגללה אני מצטמרר רק מאזכורה של ++c". אבל מעיון קצר מתברר כנראה שרובי לא קשורה ל++c ואתה הבאת את רובי כדוגמה לשפה "טובה" בהשוואה ל++c. אז אחרי כל ההקדמה, מה כל כך מיוחד ברובי? |
|
||||
|
||||
אין בה שום דבר "מיוחד" במיוחד, היא דומה ללא מעט שפות טובות אחרות (למשל פייתון, המפורסמת הרבה יותר), היא פשוט הראשונה שממש הצליחה לגרום לי להתעניין בה, כך שהייחוד שלה הוא די אינדיבידואלי. לגבי מה שטוב בה - איסוף אשפה (כמו בג'אווה) שמוחק לגמרי את כל מימד בעיות ניהול הזיכרון, תכנות מונחה עצמים שלם יותר (אין פרימיטיבים, הכל אובייקטים), טיפוסי נתונים מורכבים (מערך, hash, ביטויים רגולריים) מובנים בשפה בצורה מאוד נוחה, מנגנון פשוט מאוד של איטרטורים והעברת פונקציות אנונימיות, שבא לידי ביטוי בקוד קריא ו"טבעי" מאוד. באופן כללי, כשאני כותב ב-++C או בג'אווה, אני מרגיש שחצי מהזמן אני בונה פיגומים כדי שאוכל להתמודד עם המטלה התכנותית שלי, וכשבסוף הם מוכנים ואני משתמש בהם, התוצאה מאוד לא קריאה בגלל רמת הסיבוך הנוספת שלהם. ברובי אני פשוט פותר את הבעיה, כשלרוב כל מה שאני צריך להוסיף לפיגומים זה פונקציות של שורה או שתיים שמתווספות אוטומטית לטיפוסי הנתונים הקיימים. |
|
||||
|
||||
יצא לך לכתוב משהו ב-smalltalk ? אם כן, איך Ruby בהשוואה אליה? |
|
||||
|
||||
לא יצא לי, אבל אולי כן אפשר לבצע השוואה כלשהי: התחלתי בעבר ללמוד smalltalk ונשברתי די מהר - עד כמה ש-if שהוא אובייקט הוא דבר מגניב, זה בעיקר מרגיש מסורבל - ואילו ברובי התאהבתי מהרגע הראשון. אני מניח שעכשיו אני כבר מוכן ל"סיבוב שני" עם smalltalk, ואנסה לדווח בעתיד על התוצאות. |
|
||||
|
||||
ב-smalltalk זה לא ש-if הוא אובייקט אלא שהוא מתודה (הודעה) של כל מחלקה. הבלוק שיש לבצע (שהוא בעצם פונקציה אנונימית), הוא האובייקט. כל המושג של בלוקים/פונקציות אנונימיות היה קשה לי להבנה בתחילה, כמו ב-Lisp. אחר כך התרגלתי. אולי הגיע הזמן שאקח את רובי לסיבוב (אולי אפילו On Rails!). |
|
||||
|
||||
איך קרה שדיון בשבוע הספר הפך לדיון ב-ruby? ערן - ממליץ בחום לקחת את רובי לסיבוב, אבל בזהירות. אני נדבקתי בחידק, מה שגרם לי בסופו של דבר לעזוב את העבודה כי לא יכולתי יותר לראות java מול העיניים, ולהקים סטארט-אפ בין היתר כדי שאוכל לקודד בכיף ב-ruby... אתה יכול לחשוב עליה כמשהו קרוב מספיק ל-lisp כדי להיות מוצלח, אבל עם סיכוי טוב להצלחה מסחרית. |
|
||||
|
||||
מה שיפה בדיונים באייל זו האסוציאטיביות הזו, שבה אתה יודע איפה דיון מתחיל, אבל לא יודע לאן הוא יכול להגיע :) |
|
||||
|
||||
You mentioned associations... Look for Topic Maps.
|
|
||||
|
||||
הממ, לא זכרתי טוב, ועכשיו בלבלת אותי עוד יותר - אתה בטוח שהאובייקט הוא לא ערך ה-true/false, והבלוק הוא הפרמטר לפונקציה? אגב, ככה גם רובי עובד - לכל פונקציה אפשר להעביר בלוק/פונקציה אנונימית, וכך גם מממשים איטרטורים. הסינטקס די דומה לזה של smalltalk אבל לדעתי קצת יותר קריא. הנה דוגמה שאני מחבב לקוד ברובי, במקרה הזה שמדפיסה את 1,000 מספרי פיבונאצ'י הראשונים: x=y=1 והנה דוגמה לאיטרטור שלוקח מערך של ערכי x, מפעיל פונקציה f עליהם ומחזיר מערך y של התוצאות:1000.times {x,y=y,x+y; puts x} y=x.collect {|x_value| f(x_value)} אין לי ספק שגם בשפות אחרות יש מבנים דומים, אבל אני תוהה בכמה מהשפות שהן לא ב-Cluster של רובי (כדוגמת פייתון וסמולטוק) זה קריא ואלגנטי בצורה דומה.
|
|
||||
|
||||
הלכתי לבדוק. אם אני מבין נכון את מה שמצאתי כאן: אז האובייקט הוא מופע (יחיד) של תת-מחלקה של Boolean - או True או False. כל אחת מהן מממשת את ההודעות ifTrue ו-IfFalse ושילובים של השתיים (אשר מוצהרות כבר ב-Boolean), כשכל הודעה מקבלת כפרמטר בלוק (או שניים). הנה דוגמה לתחביר (מתוך הערך בוויקיפדיה): result := a > b
ifTrue:[ 'greater' ] ifFalse:[ 'less' ] |
|
||||
|
||||
טוב, עשית לי חשק, ועוד לא גמרתי ללמוד פייתון. תתבייש לך. |
|
||||
|
||||
נו, ואני אפילו עוד לא התחלתי ללמוד פייתון. בוש והיכלם. |
|
||||
|
||||
כשאני למדתי לתכנת לימדו ב-pascal ואז עברו ל-C (או ל-fortran). אח"כ, במהלך הקריירה שלי, למדתי שפות קצת יותר "מתקדמות" כמו C++ Java ושפות סקריפטים (ksh, visual basic, list וכו'). רוב הקריירה שלי עסקתי ב-C++ ובגלל ש"שפת האם" שלי היא עדיין C (למרות שלמדתי אותה שניה, pascal זה ממש איכס), אני ממש נהנה לתכנת ב-C++. כל פעם שאני כותב משהו ב-Java (שזה, בסיכום כולל, 30% מהקוד שכתבתי בקריירה) , אני חייב להכנס לקוד המקור שלהם ולבדוק מה באמת עושה המתודה הזאת, ואם זו באמת הדרך הטובה ביותר לצרכים שלי... רק המחשה על לכתוב בשפה יותר "גבוהה" מצמררת. |
|
||||
|
||||
כמוני כמוך - הן בכך ששפת "אימי" היא C, לימוד ++C בעבודה והבעייה עם ג'אווה. אחת הבעיות שלי כמנהל בחברה מסחרית היא שאלו המתכנתים בג'אווה אינם תמיד מודעים ואף לא איכפת להם מה בדיוק עושה המחשב עם הקוד. לעיתים תכופות אני נדרש לאזן את הגישה של: "קוד נועד בעיקר לבני אדם (מהירות פיתוח, תחזוקה) ולא למחשבים". זו בעייה כאשר הביצועים הנדרשים הם תובעניים במיוחד והינם חלק מן היתרון התחרותי של החברה. זה הרבה יותר מאשר הבדלי הביצועים בין השפות, זה אופן החשיבה עימו ניגשים לפתור בעיות. |
|
||||
|
||||
תוכל להדגים מדוע זה אופן חשיבה שונה, ולמה זה בהכרח טוב? אי הידיעה של איך הפונקציה ממומשת היא מה שמכונה בעגה המחשבית "זה לא באג, זה פיצ'ר" - הפרדה בין רמות אבסטרקציה שונות עוזרת לטפל במטלה התכנותית הנוכחית. כמובן, לא חייבים להסתמך על ספריה סטנדרטית - אם ממש רוצים, אפשר לכתוב את הספריה שלך בעצמך ולדאוג לאופטימיזציות שמתאימות לך. העניין הוא שלעתים קרובות (לא יודע איך זה אצלכם ובמה בדיוק אתם עוסקים) אין בכך צורך, לפחות לא בהתחלה, וכמעט תמיד יש בעיות במימוש שדורשות מספר איטרציות כדי לתקן. |
|
||||
|
||||
זה לא בהכרח טוב, אלא רק לחלקים מסויימים של תוכנה, וגם זה לא בכל תחום. אבל זה חלק מן ההתמחות והעיסוק שלי: אלגוריתמים למחשב לא מופשט. הבעייה במעבר מסודר מרמות הפשטה גבוהות ומטה, הוא שבמקרים מסויימים מסיימים עם מוצר חסר כושר תחרות. דוגמא אחת בה אני נתקל לא פעם היא פירוק טקסט (אני עוסק בעיקר בטקסט). הנטייה של המתכנן הממוצע היא בניית מודול להפרדה בין מילים, מודול להפרדה למשפטים ומודול לפסקאות. לאחר מכן ישנם מודולים לניתוחי עומק. בפועל, כל אלו תלויים הדוקות זה בזה - יש מילים המכילות נקודות, יש סופי שורה שאינם חותכים משפט ויש שהם מבטאים אף פסקה חדשה - לפי ההקשר וסגנון הכתיבה וגם בניתוחי העומק (למשל תחביר, סגנון כתיבה) התלות בין הפירוקים השונים אינה תמיד פשוטה. לפעמים לא ניתן להגיע לזה באיטרציות ומה שקורה הוא שכדי לחלק את המשימה, כופים הפרדות שלא עובדות, מה שבא לידי ביטוי באיטיות בריצה ובתחזוקה כאחד. הבעייה היא כללית, כאשר מנסים לעשות דברים בהם גם המוח מערב דרגות הפשטה שונות, כמו למשל ניתוח מידע ויזואלי ולינגוויסטי. עדיין, כמעט בכל המקרים, שיטות העבודה המקובלות ובראשן פירוק מירבי למודולים ומעבר מסודר בין רמות הפשטה, הן המומלצות. נקודה אחרת היא התאמה מראש של אלגוריתם למשאבים, ובראשם כמות הזיכרון, מהירות הגישה וקצב הכתיבה והקריאה מן הדיסק וכן גודל זכרון המטמון של המעבד. התברר לנו למשל שגישה אקראית לזיכרון האקראי היא איטית באופן דטרמיניסטי. תוצאה: החלפת אלגוריתם ושינוי מערכתי משמעותי שהפך את המערכת לתחרותית. לפעמים, כאלו שהתרגלו לחיים הטובים עם שפות שכבר עושות הכל בשבילם, מעסיקים את עצמם רק ברעיונות נעלים, מבלי תן-דעת על הטראומה אותה הם גורמים למחשב באצבע כה קלה על המקלדת. התוצר אינו סקיילבילי – עקב התעלמות מטבעו הלא מופשט של הדיסק וכן צריכת זיכרון גבוהה, או צריכה נמוכה, המסתמכת על איסוף אשפה – אך מסתיימת בפרגמנטציה של הזיכרון. התוצאה – צריך לבנות הכל מחדש, אם רוצים לעבור למערכת מסחרית, שעובדת על pc פשוט, על כמויות גדולות של מידע, ולא על מחשב עם ארבעה מעבדים ומערך יקר של דיסקים מסוג scsi. אגב, אכן, כפי שניחשת, במקום הספריות הטובות לרוב המקרים יש לעיתים צורך בספריות ומחלקות לטיפול באבני הבניין של המערכות עליהן אני מדבר: מחרוזות, קבצים וטיפול בזיכרון. רציתי לכתוב תגובה יותר משכנעת ורהוטה - אבל איני מוצא לכך את הזמן. אני מקווה שעיקר הטענות מובן. |
|
||||
|
||||
תודה, מעניין מאוד. כעת השאלה היא האם שפה רב תכליתית כמו ++C היא אכן הפתרון הטוב ביותר, ולא עדיף להשתמש בשפות תכנות שמותאמות במיוחד לבעיות שאתם מתמודדים איתן... (אם יש כאלו) |
|
||||
|
||||
כשאתה אומר "לתכנת ב-++C", הכוונה לתכנות ב-++C (כלומר, הסתמכות רחבה על ספריות בכלל ועל ה-STL בפרט) או לתכנות ב-C עם עוד כמה תוספות ואולי שמץ של תכנות מונחה עצמים? בכל אופן, אם אתה צריך להיכנס לקוד המקור כדי לדעת מה *עושה* המתודה, יש בעיה חמורה בדוקומנטציה של הספריה שאתה עובד איתה. אגב, Visual Basic זו שפת סקריפטינג? באיזה מובן? |
|
||||
|
||||
הסתמכות על STL ודומות כשאפשר. יש ב-STL דברים שלא עובדים כל כך טוב (למשל STRING בהרבה מערכות הפעלה מקצה זיכרון בצורה בעייתית), אבל הכוונה בעיקר לתכנות מונחה עצמים ככל הניתן (בכל זאת, זה מיעל את הפיתוח והתחזוקה). הדוקומנטציה לא תמיד עוזרת, לפעמים, בעיקר בשביל יעילות, חשוב לך לדעת מה בדיוק "הם" עושים שם, בשביל שתוכל לספק להם תשתית שתהיה יעילה בשבילם. התכוונתי ל-VBA |
|
||||
|
||||
כמו שאמרתי במקום אחר כאן, אם רוצים יעילות סופר-דופר, צריך לרוב כתוב את הקוד בעצמך, בצורה שמתאימה הכי טוב לאפליקציה. לא תמיד חייבים יעילות סופר-דופר, ולעתים קרובות אין צורך לייעל עד שלב מתקדם יחסית (כלומר, עד שהתוכנה כבר רצה, ואפשר לבדוק מה בדיוק צווארי הבקבוק). אני לא מכיר את VBA, אבל באיזה מובן היא שפת סקריפטינג? כי היא מפורשת ולא מקומפלת? |
|
||||
|
||||
לשפות גבוהות יש הרבה פעמים גג להתיעילות האפשרית, ובחירה בשפה מתקדמת בתחית הפרוייקת עלולה להגביל את ההתיעלות שלך בעתיד, דבר שהוא לפעמים בלתי סביר מבחינת ניהול פרוייקט. היא מפורשת, קלה לכתיבה, קלה ללימוד ראשוני ("hello world"), קשה ללימוד כולל (לך תבנה בה עץ בינארי...), לא אלגנטית, מאד קשה לעשות בה מה שהתכננים שלה לא חשבו שתרצה לעשות, ומאד פשוט לעשות בה מה שהמתכננים שלה חשבו שתרצה לעשות. |
|
||||
|
||||
כאן נכנס היתרון של שפות שמאפשרות שילוב קוד בשפות "נמוכות" כמו C. לא יודע איך זה הולך בג'אווה, אמנם, אבל אני לא חסיד גדול של ג'אווה (וממילא המטרה שלה אינה להיות סופר-דופר יעילה). אני לא חושב שהמאפיינים מ"לא אלגנטי" והלאה תואמים שפות סקריפטינג (כשאתה אומר "שפות סקריפטינג" מה שיש לי בראש הוא רובי ופייתון, למשל). |
|
||||
|
||||
בג'אווה אתה יכול להשתמש ב-Java Native Interface כדי לקרוא לפונקציות ב-C. זה לא המנגנון הכי נוח בעולם, אבל זה עובד. |
|
||||
|
||||
אולי אנחנו מגדירים "אלגנטי" בצורה שונה, ג'אווה, למשל, היא שפה מאד אלגנטית לדעתי, שפה שכמעט מאלצת מתכנתים לא אלגנטים לכתוב בצורה אלגנטית. למעשה, יש הרבה מאד מתכנתים שהייתי מעביר לעבוד בג'אווה לתקופה מסויימת, רק בשביל שידעו לעבוד בצורה אלגנטית. במובן הזה שפות סקריפט (כולל, עד כמה שאני מכיר, פיתון ורובי) הן מאד לא אלגנטיות. C++ יכולה להיות אלגנטית מאד או לא אלגנטית מאד בתלות במתכנת בלבד. זה מה שיפה בה, וזה מה שעושה אותה לבעייתית. |
|
||||
|
||||
מה זה אלגנטי? לדעתי אלגנטי פירושו "לכתוב את מה שרוצים לעשות, עם מינימום כתיבה של מה שצריך לעשות כדי שמה שרוצים לעשות יתבצע". במילים אחרות, ככל שמשהו יותר קרוב לפסאודו-קוד, הוא יותר אלגנטי. אתן דוגמה פשוטה: הצורך לכתוב for (i=0; i<n; i++){ כדי לעשות משהו על מערך בן n איברים הוא לא אלגנטי כמו, לדוגמה, לכתובdoSomething(array[i]); } array.each{|item| doSomething(item)} ה-Vector שב-STL של ++C מותיר את אי האלגנטיות במקומה, כשה-i מתחלף באובייקט של איטרטור שעושה בערך את אותו הדבר. במקרה הראשון אנחנו צריכים לגלוש לפרטים - קח איטרטור, אתחל אותו לתחילת המערך, הגדל אותו כל עוד לא הגענו לסוף. במקרה השני הכל מתמצה בכתיבת array.each.עוד דרך נחמדה להמחיש את ההבדל היא לנסות לקרוא בקול (או סתם להקריא בראש) את שני קטעי הקוד. הראשון פחות נוח להקראה, ויוצא מבולבל יותר. השני נשמע כמעט כמו שפה טבעית. |
|
||||
|
||||
אמנם חלפו בערך שש שנים מאז הפעם האחרנה שכתבתי קוד ב-C++ ובערך שבע מאז שכתבתי עם שימוש כבד ב-STL, אבל עד כמה שאני זוכר, יש בה for_each שמקבל איטרטור ו-function object. אולי זה מה שאתה מחפש? |
|
||||
|
||||
אכן, אבל אתה חייב להודות שהקוד שם נראה מסורבל למדי... ולא ברור לי מה קורה כשעושים משהו מורכב יותר - למשל, כשרוצים לעשות משהו דמוי collect, שמחזיר את המערך שמתקבל אחרי שמפעילים פונקציה על כל אברי המקור, או find שמחזיר תת מערך של אברי המקור שמקיימים קריטריון מסויים, וכשמשלבים אותם יחד באותה שורה. |
|
||||
|
||||
כפי שכבר נאמר כאן, סיפלוספלוס היא מולטי-פאראדיגמטית וגם קצת מסובכת (יחסית לשפות תיכנות אחרות). יש לזה חסרונות ברורים: זמן הפיתוח קצת ארוך יותר, למתכנתים ולמעצבים פחות מנוסים קל יותר לשגות והקוד לפעמים עלול להיות קצת קשה יותר להבנה. אבל יש לזה גם יתרונות ברורים, בעיקר בפרוייקטים עם דיזיין מורכב ודרישות לביצועים גבוהים. לא ערכתי מחקר השוואתי, ורפרטואר שפות התכנות שלי כנראה טעון-שיפור, אבל אני לא מכיר אלטרנטיבה שיכולה להתחרות עם השפה, כמעט מכל בחינה (כולל אלגנטיות, תיעוד-עצמי, ויעילות). האמת היא שרוב יתרונותיה מצויים בפיצ'רים שלעיתים נזנחים (ואפילו מוקצים מחמת ה-"פחד שמישהו יעשה שטות"), כמו ייחוד (חלקי ומלא) של תבניות, העמסת-יתר של אופרטורים, ירושה מרובה, ואריתמטיקת מצביעים. במקרה כזה, אם אופטימיזציה אינה קריטית ותכנות "רמה-נמוכה" אינו נדרש, אולי באמת עדיף לבחור באפשרות אחרת. לשאלותך, עד כמה שהבנתי אותן, ב-STL נכללים לא-מעט אלגוריתמים שימושיים, וביניהם כאלה שעונים עליהן. יש פונקציות רבות לחיפוש מותנה כמו למשל find_if, search_n או search, ויש גם כמה אפשרויות להפעיל פונקציה על כל אברי קונטיינר, כמו for_each שכבר הוזכר קודם, ו-transform. אפשר לשלב את שתי הפעולות בשורה יחידה, אם כי לטעמי לא באופן יפה. במקרה כזה, כמובן, אפשר לעשות זאת בשתי שורות. בסופו של דבר, כשמדובר בפרוייקט בינוני עם כמה עשרות תבניות ומחלקות-קונקרטיות, אני באמת מתקשה לראות בזה חיסרון ממשי. הגישה הכללית של ה-stl היא אכן להשתמש ב-functors, וזה לא תמיד נוח או אלגנטי. אבל יש אינסוף אלטרנטיביות, החל ממימוש אד-הוק (אין-ליין) של הפעולה הדרושה, דרך כתיבה של פונקציות, פונקציות-תבנתיות או מאקרו-יים לצורך הענייין וכלה בשימוש בספריות חיצוניות, שחלקן סטדנדרטיות מאד, כמו למשל ספריות ה-boost. לדוגמא: |
|
||||
|
||||
אני מסכים איתך כמעט לגבי הכל, פרט ל-Operator overloading. המנגון הזה בדרך כלל אינו אינטואיטיבי (בניגוד לאחרים, טוב, גם חישובי קיצין ומצביעים לא היו כוס התה שלי) ויש לו תועלת לדעתי רק במקרים מאוד ספציפיים - מחלקות מתמטיות, מצביעים חכמים ו-function objects. ספרטניות בשימוש במנגנון זה דווקא עדיפה בעיני. |
|
||||
|
||||
לא בהכרח. לא היית רוצה שתהיה לך, לדוגמה, אפשרות של חיסור מערכים? יש שתי משמעויות מוסכמות בלבד שאני יכול לחשוב עליהן לדבר הזה, ולא קשה לבחור אחת ולדבוק בה. |
|
||||
|
||||
כשאתה אומר "חיסור מערכים" אתה מתכוון לפעולות על מטריצות באופן כללי? אם כן, זה נופל אצלי תחת "מחלקות מתמטיות". |
|
||||
|
||||
לא, הכוונה היא ''תוציא מהמערך שבאגף שמאל את האיברים שיש במערך שבצד ימין''. |
|
||||
|
||||
אני מוכן להתפשר איתך גם על זה למערכים ו-collections (אבל מעדיף שמות משמעותיים כמו union, intersect וכו'). אבל לא הרבה מעבר לזה. לא רוצה ש-Employee יתווסף ל-Department על ידי האופרטור +, ויגרע ממנה על ידי האופרטור -. |
|
||||
|
||||
כן, זה כבר באמת נראה כמו הורדה לזנות. |
|
||||
|
||||
גם new ו-delete הם אופרטורים. |
|
||||
|
||||
אולי כדאי להעיר שוב שהדוגמה (הפשוטה) של for_each שהבאתי קודם באה בעיקר להציג עד כמה התחביר של רובי אלגנטי לעומת מה שקורה במקומות אחרים. שימוש ב-STL, לפחות השימוש שיצא לי לעשות, דורש קצת עבודת הכנה והוא אף פעם לא אלגנטי באותה המידה. זו לא תחרות של "מה השפה שלי יודעת לעשות ששלך לא" (אבל מה שכן, האם ב-++C יש יכולות אינטרוספקטיביות?) |
|
||||
|
||||
(למיטב זכרוני, רק בהרחבות שפה של Visual C++ של מייקרוסופט. בשפה עצמה אין אינטרוספקציה, ואין טעינה דינאמית כמו ב-Java). |
|
||||
|
||||
מה הן יכולות אינטרוספקטיביות? |
|
||||
|
||||
גישה לעצם המתאר את המחלקה. בדרך כללל זה נותן גישה לשם המחלקה, לעצמים המחזיקים את המתודות שלה וכו'. זה גם מאפשר לטעון באופן דינמי מחלקות בזמן ריצה (למשל, לקרוא שם של מחלקה מקובץ קונפיגורציה, למשל שימוש ב-Factory שונה לכל מערכת הפעלה, עבור מחלקות המימוש של הספריה הגרפית. ברגע שיש לנו את שם המחלקה, נשתמש בטוען מחלקות: ב-Java זהו ה-ClassLoader, כדי ליצור מופע חדש של עצם מהמחלקה הנ"ל), ואפילו להפעיל מתודות לא דרך הממשק הרגיל של object.someMethod(arg1, arg2) אלא על ידי שימוש במחלקה ש"מפעילה" את המתודה. למשלinvoker.invoke(object, methodName, argsArray) ובטח יש עוד דברים שלא הזכרתי כאן.
|
|
||||
|
||||
תודה. |
|
||||
|
||||
קוד אלגנטי הוא קוד שקל להבין מה קורה בו (מה תעשה המכונה, ומה חשב המתכנת כשהוא כתב את הקוד), קל לשנות אותו, קל לפרק אותו, קל להגדיל אותו וקל לתקן אותו, במינימום עבודה, וכל זה ללא צורך בהערות, או בשיחה עם מי שכתב את הקוד. (כצפוי, לג'אווה יש פתרון אלגנטי לבעיה שלך, for each, http://java.sun.com/j2se/1.5.0/docs/guide/language/f...) עכשיו, תקח קוד פשוט בruby, למשל ה-MegaGreeter מתוך http://www.ruby-lang.org/en/documentation/quickstart... ותנסה לקרוא אותה. איכס. |
|
||||
|
||||
אז שוב, לא ברור לי במה ++C יותר אלגנטי. הפתרון של ג'אווה נחמד. מענין איך הם מתמודדים עם דברים יותר מורכבים. מה שכן, הוא שקול למשהו שקיים גם ברובי (תחביר ה-for item in collection). לא הבנתי מה הבעיה עם הדוגמה שנתת. אולי יותר כדאי להשוות אותה למשהו בעל אותה פונקציונליות בשפות אחרות. אני גם לא בטוח שכדאי לקחת קוד שמיועד ל-tutorial ולכן מפורט יתר על המידה בתור דוגמה. |
|
||||
|
||||
C++ הוא פלסטלינה, הוא יכול להיות אלגנטי יותר מכל שפה אחרת, ויכול להיות מאד לא אלגנטי. זה היתרון שלו, וזה החסרון שלו. הפתרון של java לקוח משפות סקריפטים. אני אוהב את זה שהם חסכו במילה מיותרת (each או in) בלי להרוס את הקריאות. לדברים מורכבים יש את האיטראטורים. קשה לי להסביר. מילים השמורות במקום סימני פיסוק, גישה ישירה לחברים, ומה זה ה"puts "Hello #{name}!"" המכוער הזה? |
|
||||
|
||||
ב(http://www.dmh2000.com/cjpr/index.shtml) יש מאמר ארוך יחסית שמנסה לתאר את היתרונות והחסרונות בכל שפה, ומכיל את אותו קוד (עץ אדום שחור http://www.dmh2000.com/cjpr/cmpframe.html) בכמה שפות. |
|
||||
|
||||
כן, ראיתי את המאמר הזה, אם כי לא את השוואת הקוד. נראה לי שהשורה התחתונה שלו היא "רובי/פייתון נוחים יותר לתכנות", לא? |
|
||||
|
||||
הדיונים על איזה שפה יותר טובה, מזכירים לי במשהו את הדיונים בצבא על מה יותר טוב, גליל או m-16. מה גם, שבמקרים רבים, אותם אנשים שהתווכחו בדיון הראשון, התווכחו לאחר שנה שנתיים בדיון השני. אני לא אומר שאין טעם לדיונים האלו; אני בעצמי חטאתי בדיונים ארוכים כמו האם צריך לקרוא למתודה Processor.process או אולי דווקא Processor.act (ברור שהשני עדיף, כאילו דה). אני רק רוצה להציב את הדיון בפרופורציה. יש כלי נשק עתיקים כמו קרבין, שלא ניתן אותם ליחידה מבוחרת; מצד שני, היחידה המובחרת שלנו כנראה תבצע את המשימה שלה בהצלחה גם עם גליל וגם עם m-16 . מצד שלישי ייתכן שהייתרונות הקטנים של כל כלי (למשל, עמידות למים) הם מאד רלוונטיים. אבל זה נדיר. הרבה פעמים היתרונות הם לא פונקציונאליים - למשל נשק מסויים הוא יותר זול, יותר לוחמים מכירים אותו, יותר כיף לירות בו, או פשוט למפקד היחידה יש חיבה אישית לכיוון מסויים. גם זה חשוב, מפקד מרוצה הוא מפקד טוב. אחרי התובנות הלא ממש עמוקות האלו, אפשר לחזור לדיון המקורי. קודם כל, ברור ש m-16 יותר טוב. שנית, לי יש חיבה אישית ל #C . כנראה בגלל שיצא לי לעבוד איתה לא מעט. יש לה כמה תכונות נחמדות שאין ב Java (יצא לי לעבוד גם ב Java. שתי השפות די קרובות) - למשל Properties , Attributes ו Events-delegates (לא שאין לתכונות האלו תחליף, פשוט התחליף הוא פחות נוח). אבל הייתרון העיקרי של #C ושל NET. הוא הספריות המוצלחות מאד שמגיעות עם החבילה, והתעוד המצויין. חסרון רציני מאד גם של #C וגם של NET. הוא שממש קשה לכתוב את השם שלהם בעברית. הוא מתהפך. אין ספק שהיו לא מעט מנהלי פיתוח שהתחילו לכתוב מייל בסגנון "החלטתי שנכתוב את הפרוייקט ב C#" ואז ניסו לתקן את המייל במשך חצי שעה, ובסוף התייאשו ואמרו לעצמם, לעזאזל הכל, נכתוב אותו ב Java וזהו. |
|
||||
|
||||
לסי-שארפ יש יתרון גדול אחד על ג'אווה - אתה יכול לסנן בעזרתה אידיוטים בראיון עבודה. "אז אתה אומר שיש לך עשר שנות ניסיון עם סי-סולמית? אנחנו מצטערים, אתה overqualified. אל תיתן לדלת להסביר לך שהשפה לא קיימת עשר שנים בדרכך החוצה." |
|
||||
|
||||
הנה קטעים מראיון עבודה שנערך היום במקום עבודתי. משתתפים: אני, מראיין מתלמד (שותק רוב הזמן), מרואיין - ד"ר למדעי המחשב בתחום האלגוריתמים, בעל ניסיון מקצועי עשיר בתעשייה (לפי קוה"ח), אך עם טון דיבור ושפת גוף מלאי זילזול. אתה אולי רוצה לתאר משהו שעשית? מה למשל? משהו... יש הרבה דברים. תבחר אחד... אין משהו מיוחד. איך פותרים את הבעייה? יש את זה בספר של קנות'. מה הסיבוכיות של הכנסה לעץ? זה יוצא די הרבה. כמה הרבה? נו, אם הייתי יושב עם דף וחושב אז בטח הייתי אומר לך. (לפניו היה מונחים דף ועט) יש לך רעיון איך לגשת לזה? גם את זה אתה יכול למצוא בספר של קנות'. אני מנסה לכוון אותו ושואל לבסוף: נו, אז איך עושים את זה? נו, זה שורה שתיים. בכ"ז...? יש שם And לוגי. יפה! של מה עם מה? בטח יש את זה בגוגל- אין טעם להמציא שוב את הגלגל. (המערכה המסכמת כללה כתיבת קוד - שגוי לחלוטין) ככה שלושת רבעי שעה, כדי שלפחות ירגיש שקיבל הזדמנות. |
|
||||
|
||||
כמו שאתה מתאר אותו, אולי כדאי שתראיין אותי. |
|
||||
|
||||
אני מכיר עוד ספרים מלבד זה של קנות' להגיד שהפתרון נמצא בוודאי בהם. |
|
||||
|
||||
אתה בהחלט בכיוון! אם בנוסף אתה גם טוב בשיחות מסדרון, שיטוטים באינטרנט, פלירטוטים עם המזכירה ולקיחת קרדיט על עבודה של אחרים - אנו זקוקים גם ליכולותיך הניהוליות. |
|
||||
|
||||
כמה אתם משלמים? כדאי שתמהר, יש לי הצעה מתחרה ממקדונלד'ס. |
|
||||
|
||||
משלמים? מי דיבר בכלל על כסף? כל הרעיון שמאחרי הקמת החברה היה מה שנקרא בבתי הספר למנהל עסקים "ראיונות מוכווני רווח": המערכות המפותחות בחברה מאופיינות, מתוכננות, ממומשות, נבדקות ומופעלות ע"י מרואיינים, כחלק ממבחני הקבלה לעבודה. המראיינים הם מועמדים לתפקיד "מנהל כ"א" וגם עלויות בניין אין, מאחר והראיונות מתבצעים בבתי קפה עם לפטופים. אז למתי קבענו? |
|
||||
|
||||
כמו כן, אין צורך במזכירה וטלפון. הראיונות מתואמים דרך תגובות באייל. |
|
||||
|
||||
שמע, רק עכשיו עליתי על הפתיל הזה והחברה שלך נשמעת לי יוצאת מן הכלל. אם תתנו לי לפטופ, אשמח להיות מראיינת. |
|
||||
|
||||
ייתנו לך להביא אחד מהבית, אבל תצטרכי להשיב אותו לחברה אחרי הראיון. |
|
||||
|
||||
מראיינות אינן אמורות להשיב, אלא לשאול בלבד. |
|
||||
|
||||
אכן, כמעט ועברתי ל-#C, אבל אז גיליתי את רובי. לא ציינתי שהדיון כאן הוא על העדפות אישיות ואני לא באמת מנסה לשכנע איש בעליונות אובייקטיבית, מה? |
|
||||
|
||||
לדעתי הדיון לגיטימי ומעניין, למרות שנבצר ממני לקחת בו חלק פעיל. |
|
||||
|
||||
הנה לינק משעשע שקשור בעקיפין לנושא. טיזר: אין לנו מושג, אבל יש לנו כמה גרפים מאד מעניינים כמו: כמות ההיטים בגוגל פר שפה, כמות הצעות העבודה, כמות הצעות העבודה חלקי כמות ההיטים וכו' וכו'. ואגב, נזכרתי במשפט של סטואי מהפרק האחרון של family guy שראיתי (נא לקרוא במבטא בריטי). How can you say you don't like it, if you haven't really given it a chance? לתשומת ליבו של הקורא אח של אייל.
|
|
||||
|
||||
כשאני הייתי בצבא זה היה ברור, M-16 היה "מטאטא" של ג'ובניקים, וגליל זה נשק של הקרביים הקולים. כג'ובניק חזרתי הביתה בכל יום, והצלב שנאלצתי לשאת על גבי בכל ערב במשא המפרך היה הנשק הארוך, המסורבל והלא אטרקטיבי (לחיילות שלא מסתכלות עליך, ולנהגים שלא עוצרים לך). גם כשהתחלתי לתכנת זה היה ברור. היה פסקל בשביל ללמוד, C בשביל לעשות טריקים ובשביל לתחזק קוד שנכתב לפני שלוש שנים ויותר, C++ בשביל לעבוד על קוד חדש, וקובול בשביל בנקים ועורק. היום ג'ובניקים מסתובבים בלי נשק, צנחנים מסתובבים עם M-16, וכל מתכנת יודע 5 שפות. C# זאת שפה שעובדת במערכת הפעלה אחת, של החברה שהמציאה אותה, לא? |
|
||||
|
||||
לפחות בתיאוריה לא (לא ברור לי מה קורה בפרקטיקה): |
|
||||
|
||||
(אבל M16 מקוצר) |
|
||||
|
||||
(אחרי יותר משנתיים עם M-16 ארוך באמת קיבלתי M-16 קצר. פתאום חיילות שלא ירקו לכיוון שלי ניסו להתחיל איתי. אבל אני כבר הייתי לפני שחרור וממש לא הייתי בקטע של ילדות מפגרות ששופטות אותך לפי סוג הנשק שלך) |
|
||||
|
||||
אני מקווה שאחרי כמעט 8 שנות נסיון אני ראוי להקרא מתכנת, אבל חוץ מהכרות לצורך קורסי חובה באוניברסיטה ובתיכון עם בייסיק, אסמבלר (8086), פסקל, ג'אווה ו++C, אני יודע למעשה רק שפה אחת. |
|
||||
|
||||
C# עובדת טוב במערכ(ו)ת הפעלה של החברה שהמציאה אותה. ובנוסף, עובדת, בערך, על מע"ה אחרות: |
|
||||
|
||||
אם אתה רוצה משהו אלגנטי, אני חושב שאתה צריך לחוש ולמצוא את לוח המקשים עם כל הסימנים מיוחדים ולבדוק את שפת APL. |
|
||||
|
||||
עד כמה ש-APL היא שפה נהדרת, אני חושב ש-Malbolge [Wikipedia] מנצחת אותה בנוק-אאוט. |
|
||||
|
||||
(חרמפף, רק עכשיו ראיתי את תגובה 447123) |
|
||||
|
||||
מה אתה מדבר? ספר נפלא, מרתק ביותר. רק שמעתי עליו וכבר רותקתי למיטה לכמה שעות טובות. בהחלט C השיאים. |
|
||||
|
||||
לאילו מטרות את משתמש בה? |
|
||||
|
||||
לכל מה שאני מתכנת... גם הדברים שאני עושה במחקר וגם משחקים. |
|
||||
|
||||
האם המשימות בהן אתה עוסק תובעניות מבחינת ביצועים (מהירות, זיכרון)? אם כן, כיצד עומדת בכך Ruby? |
|
||||
|
||||
לא ברמה שבה אני עוסק כרגע (לבדוק אם האלגוריתם בכלל עובד כמו שרוצים ממנו). באופן כללי הביצועים *אמורים* להיות פחות טובים מאשר ב-C ו-++C. יש לי תוכנה אחת שמומשה כבר ב-++C ומימשתי שוב ברובי (הרבה יותר בקלות) וכן דורשת רמת ביצועים גבוהה - אני אבצע השוואה ואחזור אלייך. מצד שני, אפשר (בתיאוריה - טרם ניסיתי) לשלב בתוכניות רובי קטעי קוד ב-C, כך שאם כתבת תוכנית ברובי והביצועים לא משהו, והתוכנית שלך מתנהגת בהתאם לכלל ה-80-20, אפשר לבצע אופטימיזציה בלי יותר מדי קושי. |
|
||||
|
||||
תודה ואחכה גם להשוואה. |
|
||||
|
||||
טוב, בבדיקה שעשיתי יש עדיפות ברורה ל-++C - רובי רץ על אותה מטלה פי עשרות מונים יותר לאט. מצד שני, לא ביצעתי שום אופטימיזציה לקוד הרובי. אבל כמו שאמרתי קודם, לדעתי לא זו הנישה שאליה רובי ושפות מסוגה מכוונות. |
|
||||
|
||||
Ruby היא מהודרת או מפורשת? אם היא נשארת ברמת המפרש (אלא אם כן יש מנגנון של הידור JIT) הרי שצפוי שהיא תהיה איטית יותר מ-C++ המהודרת. |
|
||||
|
||||
מפורשת. לא אמרתי שלא צפוי - זה צפוי לגמרי, ולכן ההשוואה באספקט הזה לא נראית לי רלוונטית. זה ש-++C היא מהירה לא אומר שנעים לתכנת בה. |
|
||||
|
||||
תודה. נראה אם כך שרובי אכן אינה ברובריקה שלי (: |
|
||||
|
||||
אפרופו הנוחות והאלגנטיות של רובי, ניסית כבר brainfuck? אני ממליץ בחום. לוקח קצת זמן להתרגל, אבל זה שווה את זה. |
חזרה לעמוד הראשי | המאמר המלא |
מערכת האייל הקורא אינה אחראית לתוכן תגובות שנכתבו בידי קוראים | |
RSS מאמרים | כתבו למערכת | אודות האתר | טרם התעדכנת | ארכיון | חיפוש | עזרה | תנאי שימוש | © כל הזכויות שמורות |