Clang - הפתעה נעימה

ב־יום רביעי, 10 באוגוסט 2011, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, C++‎‏; ‏4 תגובות

כבר הרבה זמן אני שומע על Clang. עד לא מזמן די נהגתי להתעלם ממנו, בעיקר בגלל ששמעתי מילים כמו: "מכונה וירטואלית" ו־"JIT" שהטעו אותי. אבל לא זמן התחלתי להתעמק קצת יותר וגיליתי... קומפיילר C++‎ בשל.

מפתחים שעובדים עם שפות כמו C++‎, יודעים שהמצב שלנו שונה ממצבם של המפתחים העובדים עם שפות שיש להם "אבא יחיד". לשפות פופולריות רבות כמו PHP, Python, Perl, Ruby יש "אבא אחד" שמחליט כיצד הכל מתקדם. גם לשפות שיש להן תקן כללי, כמו Java או C#‎, עדיין יש "אבא אחד" בפועל. הוא נותן את הטון: אם זה Sun (ז"ל) עבור Java ו־Microsoft עבור C#‎.

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

עד לא מזמן, ל־GCC היה מונופול כמעט מלאה בתחום C++‎ ותוכנה חופשית. למרות שקיימים מספר קופיילרים של C היה רק קומפיילר חופשי אחד של C++‎. יש לזה יתרון וגם חסכון. היתרון הגדול ביותר הוא שגם קומפיירים אחרים (לפחות בלינוקס) שאפו להיות תואמי GCC. כך למשל הקומפיילר של Intel תואם מבחינה בינארית ל־GCC ומאפשר להשתמש בספריות של אחד יחד עם השני (שזה בכלל לא מובן מאליו בתחום C++‎). גם GCC אפשר זו בקלות יחסית ע"י מעבר ל־ABI סטנדרטי החל מגרסה 3.4.

אז כשניסיתי לפני מספר ימים Clang לראשונה הופתעתי לגלות קומפיילר C++‎ איכותי שתואם GCC כמעט ב־100%, אבל מיצרן אחר ובנוי על בסיס קוד שונה לחלוטין.

ניסיתי לבנות את CppCMS אתו, והצלחתי לעשות זאת מאוד מהר כמעט ללא בעיות!

אני שמח שסוף־סוף יש אלטרנטיבה טובה וחופשית ל־GCC, לא בגלל ש־GCC לא טוב ולא בגלל ש־Clang מעולה. אני שמח כי טוב שיש לך אפשרות בחירה, ובמיוחד טוב שיש תאימות גבוהה ביניהם!

מה שלא התרשמתי ממנו זה הביצועים. למרות הבטחות רבות Clang עבד רק בכ־20% יותר מהר ללא אופטימיזציה והיה אפילו אטי יותר בקומפילציה עם אופטימיזציה מלאה.

כך או אחרת... Clang בהחלט רשם אצלי כמה נקודות זכות!

תגובות

ik, ב־11/08/11 09:02

לא ברור לי מה הכוונה שלך ל"אבא אחד". הכוונה היא למימוש ? רגע הרי היה לך ממציא בודד ל ++C ויש לך ועדה שלמה של אנשים שבוחרים לך איך הוא ימשיך להראות. איך זה לא "אבא אחד" לשיטתך ?

מצטער אבל לא כל כך ברור לי הרעיון הזה שלך. ברובי, פיתון ואפילו פרל יש יותר ממימוש אחד של המפרשים לשפות. גם ל#C יש יותר ממימוש אחד, ויותר מזה לטכנולוגיה כמו CTL של .NET יש יותר משפה אחת שמממשת אותם, כדוגמת דלפי, VB.NET ו #C. בעבר גם היו את IronRuby/Python/Perl.

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

ד"א לגבי g++ של gcc, הוא חרה של מהדר. הוא איטי ברמות מטורפות. לוקח לי שעתיים להדר קוד שעם FPC אשר עובד עם פרוסס בודד ללא טרדים כ5 דקות על אותו מחשב בדיוק. אמור בקרוב (כבר מספר שנים הבקרוב הזה) להשתחרר גרסה שיודעת לעבוד בהידור מבוזר לגמרי. המהדר כבר כולו שוכתב לתמוך בזה, תאר לך שאז זה יכול לקחת לך פחות זמן !

צפריר כהן, ב־11/08/11 11:00

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

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

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

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

ארתיום, ב־11/08/11 11:39

לא ברור לי מה הכוונה שלך ל"אבא אחד"...

אני חושב שצפריר סיכום את זה בצורה מעולה.

ד"א לגבי g++ של gcc, הוא איטי ברמות מטורפות.

אולי הוא לא הכי מהיר אבל כשאני משווה אותו ל־clang, ל־Intel או ל־MSVC הם מתנהגים פחות או יותר אותו דבר מבחינת המהירות +/- כמו עשרות אחוזים.

אפילו gcc קימפל את הפרויקט שלי מהר יותר עם אופטימיזציות מלאות מה־clang "המהיר"

לוקח לי שעתיים להדר קוד שעם FPC אשר עובד עם פרוסס בודד ללא טרדים כ5 דקות על אותו מחשב בדיוק.

אתה משווה תפוחים ותפוזים: הרבה יותר קל להדר Pascal כי זאת שפה שאפשר לממש קומפיילר עבורה שעובד ב־Single-Pass. הדקדוק שלה הוא חופש הקשר, לעומת שפות כמו C++‎ שהשפה עצמה הרבה יותר מורכבת הן מחבינת התחביר והן מבחינת המימוש לטוב וכמובן גם לרע.

אגב, שלא יהיו אי הבנות, אני שונא קומפילציות ארוכות... אבל זאת באמת אחת הבעיות הגדולות ביותר של C++‎.

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

תראה, אני לא ממש סובל מעובדה ש־gcc הוא single-threaded כי יש כלים אחרים שעושים עבורי מקבול. למשל אני תמיד מקמפל make -j 4 על המחשב עם 2 ליבות/4 חוטים וזה מאיץ לי קימפול בצורה לינארית לפי כמות המעבדים.

כמובן יש גם מספיק כלים לביזור .

ליבוביץ, ב־14/08/11 08:41

אתה משווה תפוחים ותפוזים: הרבה יותר קל להדר Pascal כי זאת שפה שאפשר לממש קומפיילר עבורה שעובד ב־Single-Pass. הדקדוק שלה הוא חופש הקשר, לעומת שפות כמו C++‎ שהשפה עצמה הרבה יותר מורכבת הן מחבינת התחביר והן מבחינת המימוש לטוב וכמובן גם לרע.

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

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

הוסף תגובה:

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

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

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

דפים

נושאים