לחץ "Enter" למעבר לתוכן

מחשבות מכנס Core C++ Israel 2019

0

לפני כמה שבועות נערך כנס Core C++ Israel בפעם הראשונה. הכנס נערך במכללה האקדמית תל-אביב יפו, וכלל שלושה וחצי ימים של הרצאות וסדנאות.

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

 

Image result for pictures from core cpp israel 2019

מאין באנו ולאן אנו הולכים

לפני מספר שנים, בתקופה בה התמקדתי יותר בפייתון, חשבתי – כמו מרבים מחברי, ותיקי ה-C++ – כמה חבל על הידע שרכשתי בשנים רבות של התעמקות בשפה, שהנה, עוד רגע קט, יירד לטמיון. C++ נראתה אז כמו דינוזאור בעולם שבו שפות חדשות ונוצצות, שמתאימות יותר לעולם שבו מגבלות ה-bandwidth, ה-clockcycles וה-RAM size הולכות ומתמוססות, תופסות את קדמת הבמה. ואולם, לא זו בלבד שהשפה לא איבדה מזוהרה, אלא שנראה שעדיין לא נמצא לה כל תחליף ראוי עבור המשימות הדורשות כלי שטח אמיתי.

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

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

לינק למצגת

 

זכרון וביצועים

יוסי מועלם, מחברת צ'קפוינט, העביר הרצאה מרתקת על ההשפעה של מבנה הזכרון על הביצועים, ועל הכלים ש-C++ מספקת לטיפול בעניין. אמנם רוב התכנים היו מוכרים למי שעוסק ב-low level (למשל, במאמר המופתי של מאיירס ואלכסנדרסקו על בעיית ה-Double Checked Locking) ובכל זאת, ההרצאה היתה מעניינת והמצגת המעולה הראתה את הדברים בצורה שממחישה היטב את הדברים. בנוסף, לאורך המצגת עבר טסט-קייס ספציפי עם מדידות ביצועים רלוונטיות. ההרצאה סקרה את מבנה הזכרון וה-cache ברמות השונות, וההבנה כיצד צורת הגישה לנתונים, וכן הדרך בה הם מוחזקים בזכרון, משפיעה באופן דרסטי על ביצועי המערכת. לאחר מכן, נכנס למועלם לדיון על משמעות השימוש ב-cache ברמות השונות במערכת multithreads, וכיצד הדבר יכול לגרום לאי סנכרון בנתונים שרואים threads שונים. לבסוף, הוצגו הכלים שמציעה C++11 ליצירת memory fences וגישה מדוייקת לזכרון שתמנע מאופטימיזציות ברמת הקומפיילר וה-CPU לפגוע בקוהרנטיות של המידע במערכת.

לינק למצגת

 

זריקת חריגה או החזרת ערך שגיאה?

פיל נאש, מחברת JetBrains, הציג את הבעייתיות הקיימת כיום בשפה בנושא טיפול בשגיאות: מצד אחד, הנדסת תוכנה נכונה דורשת שימוש ב-Exceptions; מצד שני, שיקולי ביצועים מכתיבים במקרים רבים ויתור על המכניזם הכבד יחסית הזה לטובת החזרת ערכי שגיאה, בסגנון הישן והטוב של קרניגהאן וריצ'י. אם בחרתם לכתוב ב-C++, קיים מראש סיכוי גבוה שאתם בסביבה הדורשת ביצועים – מה שהופך את כל התחום הזה לפחות רלוונטי בשפה. נאש הציג את ההבדלים השונים בין החזרת ערכי שגיאה לבין זריקת חריגות. לאחר מכן, הוא הראה כיצד ניתן להשתמש בכלים שהשפה מציעה לטובת מימוש טוב יותר של טיפול בשגיאות, בדרך שהיא יעילה מבחינת ביצועים אך מציעה הנדסת תוכנה טובה יותר מזו של החזרת ערכי שגיאה בצורה נאיבית. לבסוף, הוא הציג תיזה מלאה, על פתרון שיכול לאפשר טיפול בשגיאות בצורה המאפשרת ניהול דומה יותר לזריקת חריגות אך יחד עם זאת שומר על ביצועים גבוהים; פתרון זה דורש שינויים בשפה, והוא הוגש כהצעה לועדה.

 

הרצאת סגירה: מודולים

הרצאת הסיום של הכנס היתה מאת ברייס אדלסטיין ללבאך מחברת Nvidia. הנושא שהוצג היה אחד הנושאים הקונטרוברסאליים בקהילה: מודולים. המודולים אמורים להכנס ל-C++20, אך עדיין מתנהלים קרבות לגבי האופן שבו יוגדרו בסופו של דבר. למעשה, מדובר כנראה בשינוי הגדול ביותר שנעשה בשפה אי פעם. לא מדובר פה על אלמנט מסוג חדש או על סינטקס שמספק יכולות מפתיעות. הרעיון של מודולים עוקר לחלוטין את התפיסה הבסיסית והפשוטה שעמדה מאחורי C++ ואחותה הותיקה C – הרעיון של קידוד –> קומפילציה –> לינקייג', או, אם נסתכל על הקבצים – code file –> object file –> ELF. לאורך כל שנות קיומה של השפה, "יחידת קומפילציה" היתה תמיד קובץ CPP יחיד; אם היה צורך שהקובץ יכיר ישויות נוספות, הדבר נעשה באמצעות הכלה של header files, שלמעשה, לאחר שלב הפרי-פרוססור, הפכו לחלק מקוד המקור של קובץ ה-CPP. לאחר מכן, הלינקר הוא האחראי לרזולוציה של כל ההפניות מתוך כלל ה-object files, וזאת כבר ללא כל היכרות עם קוד המקור. היחסים והתלויות בין הקבצים למעשה לחלוטין אינם מנוהלים באמצעות השפה, אלא באמצעות גורמים חיצוניים, כמו Makefiles או Solutions.

ב-C++20 המצב אמור להשתנות (בפועל, כך על פי ללבאך, ההערכה היא שיחלפו עוד שנים רבות עד שזה יהפוך לסטנדרט מקובל). היחסים בין הקבצים השונים אמורים להיעשות לא ברמת ה-Preprocessor, ולא ברמת כלים חיצוניים. במקום זאת, השפה תגדיר מודולים. מודול יוכל להגדיר, בצורה מפורשת, מהו ה-API שהוא מחצין ומהו המימוש הפנימי. במקום שימוש ב-include#, ייעשה שימוש בפקודה של השפה עצמה – import. כך, למעשה, המבנה של הפרוייקטים ינוהל בידי השפה עצמה ולא בכלים חיצוניים – דבר שיאפשר build בצורה טובה יותר, מהירה יותר ויעילה יותר.

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

לינק למצגת

 

ללמד C++

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

C++03 –> C++20

בסשן שהתמקד בהוראת השפה, העבירו אמיר קירש מהמכללה האקדמית תל-אביב יפו ויחזקאל ברנט (מיקרוסופט ומכללת הדסה) פיצ'רים מרכזיים שנכנסו לשפה – קירש התמקד ב-C++11/14, וברנט עבר על פיצ'רים שנכנסו ב-C++17 וכאלו שעתידים להיכנס ב-C++20. 

למידה מקוונת

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

מטא-פרוגרמינג

אמנם לא כל כך רלוונטי להוראה דווקא, אבל מאוד מעניין. באמצעות השימוש ב-templates ב-C++ ניתן למעשה לכתוב כל לוגיקה שהיא – הסינטקס של templates הוא Turing Complete. העובדה הזו ידועה כבר שנים רבות, אבל מעולם לא יצא לי לראות את ההוכחה המתמטית לכך. בסשן הזה, פרופ' יוסי גיל מהטכניון הציג אותה בקווים כלליים. בנוסף, הוא דן בהבדלים בין templates בשפת C++ לבין generics בשפת ג'אווה.

לתת לסטודנטים להגדיר את הפרוייקטים

קרן כליף (מכללת אפקה) הציגה את מבנה הקורס שהיא מעבירה. במקום להגדיר פרוייקטים שאותם על הסטודנטים לממש, היא מטילה על הסטודנטים להמציא פרוייקטים משלהם. לאחר מכן, עליהם להגדיר את ה-header files ולהכניס לתוכם את ה-API עבור הפרוייקט. בשלב הבא – כל סטודנט צריך לבחור פרוייקט אחר, של אחד מחבריו, אשר את ה-API שלו עליו לממש. כך הסטודנטים מתנסים בשני אספקטים שפעמים רבות אינם באים לידי ביטוי באקדמיה – הגדרה של ממשקים ללא מימוש, ומהצד השני, מימוש של ממשקים קיימים אשר הוגדרו בידי אחרים.

לימוד השפה כשפה ראשונה

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

לעדכן את התכנים, לעדכן את הדרכים

מאיר קומר מהמרכז האקדמי לב העביר הרצאה מרתקת, שבה דן בצורך לפתח את התכנים ואת דרכי ההעברה שלהם. ההרצאה החלה בדיון על הנושאים הבסיסיים המהווים את הליבה של תואר במדעי המחשב או הנדסת תוכנה ועדכונם לאורך השנים. לאחר מכן, עברה אל החלק העיקרי, שבו דן קומר באספקטים המייחדים את "דור המיליניום" – Z Generation, מהן הציפיות שלהם ומהן הדרכים הנכונות ללמד אותם בצורה האפקטיבית ביותר.

להבין את השפה מלמטה

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

רעיונות בסיסיים ב-C++

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

 

ג'וניור C++ – בעיני התעשייה

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

 

לימוד C++ – פאנל בהשתתפות מומחים

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

 

סיכום

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