האם שפת סי עדיין רלוונטית?

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

BravoMan

Active member
את הטענה ש-++C נותנת ביצועים זהים ל-C לא ראיתי משום מקום חוץ מהודעה של Vinney פה.
לרוב, כשמדברים באמת על ביצועים שמחייבים כתיבה ב-C, אפילו ה-vtable הוא בזבזני, רק תשאלו את צוות הקומפיילרים של FB.

כמובן, שוק העבודה בארץ לא משקף, ומעולם לא שיקף את הטרנדים העולמיים או אפילו האמריקאים.
במשך עשורים "NET." היית שיא הטכנולוגיה פה במשרות WEB, ועד היום יותר סביר להיתקל בחברה שקוד ה-legacy שלה הוא ASP מאשר C.
בכנות - אם הייתי רואה חברה שמתחזקת צד שרת ב-C, הייתי מריע להם, ולו הייתי מהתחום, בהחלט הייתי חותם אצלם.

אבל מה לעשות שזה רק אני.

מה שרוב האנשים שוכחים לגבי כל השפות החדשות והמפומפמות, זה שבסוף, מתחת למכסה המנוע של כל אחת, מה שעושה את ה-havy leafting זו שפת C.
גרסת Python ברירת מחדל?
כתובה ב-C, לא ב-++C, וחלק מזה אפילו זלג לעיצוב השפה עצמה.

golang? אמורה להתקמפל סטטית לגמרי, Native לא תלויה בכלום?
בדיוק אתמול גיליתי שברירת מחדל היא תלויה ועוד איך תלויה ב-glibc ואם מבטלים את התלות הזו, הקומפילציה עלולה לקחת יותר זמן, ואפילו חלק מהספרייה הסטנדרטית עלול להישבר!

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

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

vinney

Well-known member
את הטענה ש-++C נותנת ביצועים זהים ל-C לא ראיתי משום מקום חוץ מהודעה של Vinney פה.
לרוב, כשמדברים באמת על ביצועים שמחייבים כתיבה ב-C, אפילו ה-vtable הוא בזבזני, רק תשאלו את צוות הקומפיילרים של FB.
זה נראה שאתה לא בדיוק יודע מה זה CPP ואיך היא עובדת.
 

vinney

Well-known member
בוודאי. אין משהו שאתה יכול לעשות בC ואתה לא יכול לעשות בCPP באותה צורה. לרוב - אפילו באותו הסינטקס.

vtable ספציפית זה פרט מימוש של פונקציונליות מאוד ספציפית שאתה ממש לא חייב להשתמש בה.

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

אני אתן לך דוגמא - זה מאוד מקובל לא להשתמש בRTTI בCPP. זה כלי שקיים, אבל בכל מקומות העבודה שהייתי בו - לא עשו בו שימוש. בכלל. למה? כי זה פוגע בביצועים, פוגע בשימוש זכרון, בזמן קומפילציה, ולא ממש פותר שום בעיה שלא ניתן לפתור בדרכים אחרות. האם זה אומר שלא נשתמש בCPP? לא ולא, וודאי שנשתמש. רק לא בפיצ׳ר הזה. כך גם הדוגמא שלך של vtable - יכול להיות שבמקרים ספציפיים שימוש בvtable יפגע בביצועים מספיק כדי שזה יצדיק המנעות מהשימוש בו. זה נדיר, אבל זה יכול לקרות. אז מה, נזרוק את כל השפה בגלל זה? מה פתאום.
 

BravoMan

Active member
בוודאי. אין משהו שאתה יכול לעשות בC ואתה לא יכול לעשות בCPP באותה צורה. לרוב - אפילו באותו הסינטקס.

vtable ספציפית זה פרט מימוש של פונקציונליות מאוד ספציפית שאתה ממש לא חייב להשתמש בה.

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

אני אתן לך דוגמא - זה מאוד מקובל לא להשתמש בRTTI בCPP. זה כלי שקיים, אבל בכל מקומות העבודה שהייתי בו - לא עשו בו שימוש. בכלל. למה? כי זה פוגע בביצועים, פוגע בשימוש זכרון, בזמן קומפילציה, ולא ממש פותר שום בעיה שלא ניתן לפתור בדרכים אחרות. האם זה אומר שלא נשתמש בCPP? לא ולא, וודאי שנשתמש. רק לא בפיצ׳ר הזה. כך גם הדוגמא שלך של vtable - יכול להיות שבמקרים ספציפיים שימוש בvtable יפגע בביצועים מספיק כדי שזה יצדיק המנעות מהשימוש בו. זה נדיר, אבל זה יכול לקרות. אז מה, נזרוק את כל השפה בגלל זה? מה פתאום.
לא ממש הבנתי - אתה אומר שאם הביצועים של כל מה שמבדיל בין ++C ל-C לא מספקים פרויקט מסוים, אותו פרויקט צריך לכתוב קוד C, לקמפל אותו בקומפיילר ++C, ולומר שבעצם הפרויקט כתוב ב-++C?
 

vinney

Well-known member
לא ממש הבנתי - אתה אומר שאם הביצועים של כל מה שמבדיל בין ++C ל-C לא מספקים פרויקט מסוים, אותו פרויקט צריך לכתוב קוד C, לקמפל אותו בקומפיילר ++C, ולומר שבעצם הפרויקט כתוב ב-++C?
לא, לא הבנת.

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

פולגאר

Well-known member
בוודאי. אין משהו שאתה יכול לעשות בC ואתה לא יכול לעשות בCPP באותה צורה. לרוב - אפילו באותו הסינטקס.

vtable ספציפית זה פרט מימוש של פונקציונליות מאוד ספציפית שאתה ממש לא חייב להשתמש בה.

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

אני אתן לך דוגמא - זה מאוד מקובל לא להשתמש בRTTI בCPP. זה כלי שקיים, אבל בכל מקומות העבודה שהייתי בו - לא עשו בו שימוש. בכלל. למה? כי זה פוגע בביצועים, פוגע בשימוש זכרון, בזמן קומפילציה, ולא ממש פותר שום בעיה שלא ניתן לפתור בדרכים אחרות. האם זה אומר שלא נשתמש בCPP? לא ולא, וודאי שנשתמש. רק לא בפיצ׳ר הזה. כך גם הדוגמא שלך של vtable - יכול להיות שבמקרים ספציפיים שימוש בvtable יפגע בביצועים מספיק כדי שזה יצדיק המנעות מהשימוש בו. זה נדיר, אבל זה יכול לקרות. אז מה, נזרוק את כל השפה בגלל זה? מה פתאום.
במילים אחרות מה שהצעת הוא גישת Quick and dirty, ליצור שכבת HAL שמתחתיו הגישה לחומרה ממומשת בשפת C.
 

ai27

Well-known member
במילים אחרות מה שהצעת הוא גישת Quick and dirty, ליצור שכבת HAL שמתחתיו הגישה לחומרה ממומשת בשפת C.
האמת שיצא לי לפתח משהו כזה.
למטה היהc
ולמעלה היה cpp או #c, לפי דרישת המשתמש,
כי ניוונו את שכבת התקשורת שנכתבה בc למעבד arm, ומעליה כבר רוצים להריץ עלwindows/Linux

בהמון מקרים יש קודlow שכתוב בc,
ואם תעשה יותר ממעטפת יפה, אתה עלול להתקע אחרי זה, כשהדרייבר שלך מתעדכן
 

פולגאר

Well-known member
מה קשור שמיטה להר סיני עכשיו? אתה בוט שזורק ביטויים אקראיים?
לא, רק מבין "קצת" יותר ממך.

שפת C נתמכת כיום ע"י כלל מערכות ההפעלה ל PC וכן מערכות Embedded כגון Windows Linux ועוד.

השימוש העיקרי בשפת C כיום מתבטא בפיתוח ובדיקות מערכות משובצות מחשב, בין אם הן מערכות Embedded המבוססות מערכת הפעלה כגון RTOS Embedded Linux Vxworks Psos ThreadX או פיתוח ללא מערכות הפעלה – Bare Board BareMetal הכוונה לפיתוח ישירות על החומרה .

הפיתוח בשפת C מאוד יעיל, מאפשר גישה ישירה לחומרהׂ, דוגמא טובה לכך הינה מערכת הפעלה Linux, כידוע הגרעין של מערכת הפעלה הנ"ל ה – Linux Kernel מבוסס כולו על פיתוח בשפת C, כמובן שזה כולל את כל ה – Networking Stack ,Kernel Device Drivers ,File Systems ועוד.

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

vinney

Well-known member
לא, רק מבין "קצת" יותר ממך.
לא נראה לי
שפת C נתמכת כיום ע"י כלל מערכות ההפעלה ל PC וכן מערכות Embedded כגון Windows Linux ועוד.
לא, לא כתבת את זה נכון. נסה שוב.

השימוש העיקרי בשפת C כיום מתבטא בפיתוח ובדיקות מערכות משובצות מחשב, בין אם הן מערכות Embedded המבוססות מערכת הפעלה כגון RTOS Embedded Linux Vxworks Psos ThreadX או פיתוח ללא מערכות הפעלה – Bare Board BareMetal הכוונה לפיתוח ישירות על החומרה .
שוב, אתה זורק מושגים שכנראה שאין לך מושג קלוש מה הם אומרים, אבל לא אומר שום דבר מהותי. בשנים האחרונות (עשורים אחרונים?) השימוש בשפת C הולך ופוחת, ואתה מפרט כמה מהתחומים האחרונים בהם עדיין משתמשים בה. אבל אין שום סיבה מיוחדת לכך, חוץ מאינרציה, קוד לגאסי, וסטראוטיפים.

הפיתוח בשפת C מאוד יעיל,
יעיל? לא נראה לי. איך מדדת את ה״יעילות״ הזאת? אם הפיתוח בשפת C היה יעיל - כולם היו כותבים אך ורק בC, אבל עובדה היא שC דווקא נדחקת החוצה כמעט מכל תחום. הידעת שפעם פיתוח אפליקציות למערכת הפעלה חלונות היה בC? אני עוד זוכר כתיבת קוד עם MFC בVisal Studio, סיוט לא קטן. יעיל זה לא.

מאפשר גישה ישירה לחומרהׂ,
C ממש לא יוצאת דופן בזה. כמעט כל שפת תכנות מודרנית מאפשרת גישה ישירה לחומרה בצורה כזאת או אחרת.

דוגמא טובה לכך הינה מערכת הפעלה Linux,
דוגמא מצוינת - הידעת שיש אנשים שכותבים תוכנות לLinux בשפות כמו Java או פייתון? הם אפילו לא יודעים שC קיימת.

כידוע הגרעין של מערכת הפעלה הנ"ל ה – Linux Kernel מבוסס כולו על פיתוח בשפת C,
כידוע הגרעין של מערכת ההפעלה הנ״ל נכתב לפני 30 שנה. כמו שאמרתי, יש הרבה פרוייקטים שעדיין נכתבים בC כי יש להם מלא קוד לגאסי.

יתרון נוסף של שפת C מתבטא במהירות שלה, לאחר שמקמפלים קובץ מקור בשפת C נוצר קובץ Object הכולל סדרת פקודות מעבד המותאמות למעבד המיועד ומאפשרות גישה ישירה לכל חלקי החומרה.
ומה ההבדל בין C לCPP בהיבט הזה?
 

פולגאר

Well-known member
לא נראה לי

לא, לא כתבת את זה נכון. נסה שוב.


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


יעיל? לא נראה לי. איך מדדת את ה״יעילות״ הזאת? אם הפיתוח בשפת C היה יעיל - כולם היו כותבים אך ורק בC, אבל עובדה היא שC דווקא נדחקת החוצה כמעט מכל תחום. הידעת שפעם פיתוח אפליקציות למערכת הפעלה חלונות היה בC? אני עוד זוכר כתיבת קוד עם MFC בVisal Studio, סיוט לא קטן. יעיל זה לא.


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


דוגמא מצוינת - הידעת שיש אנשים שכותבים תוכנות לLinux בשפות כמו Java או פייתון? הם אפילו לא יודעים שC קיימת.


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


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

user32

Well-known member
מנהל
אם יורשה לי: אין דבר כזה שפה "יותר יעילה". זה משפט חלול עם כל הכבוד. גם פיתון שטענת שנחשבת "איטית" הוא גם משפט סתמי.
מה שויני הציע, זה שאפשר לכתוב בCPP ולוודא שהחלקים שצריכים לרוץ במהירות מסויימת ירוצו בדיוק באותה מהירות כפי שהיו רצים לו נכתבו בC. גם מניסיוני דל השנים (כתבתי C וגם CPP עד שנת 2004 בערך) זה נכון. במקרה כזה אפשר לנצל את הפיצ'רים המוצלחים של CPP ווודא שחלקים מסויימים ירוצו במהירות הנדרשת וזאת בלי התקורה שיש בכתיבה בכמה שפות נפרדות שמתקמפלות כל אחת במקביל עם חיבורים ביניהם כפי שאחרים העידו שעשו.
 

הפרבולה1

Well-known member
אם יורשה לי: אין דבר כזה שפה "יותר יעילה". זה משפט חלול עם כל הכבוד. גם פיתון שטענת שנחשבת "איטית" הוא גם משפט סתמי.
מה שויני הציע, זה שאפשר לכתוב בCPP ולוודא שהחלקים שצריכים לרוץ במהירות מסויימת ירוצו בדיוק באותה מהירות כפי שהיו רצים לו נכתבו בC. גם מניסיוני דל השנים (כתבתי C וגם CPP עד שנת 2004 בערך) זה נכון. במקרה כזה אפשר לנצל את הפיצ'רים המוצלחים של CPP ווודא שחלקים מסויימים ירוצו במהירות הנדרשת וזאת בלי התקורה שיש בכתיבה בכמה שפות נפרדות שמתקמפלות כל אחת במקביל עם חיבורים ביניהם כפי שאחרים העידו שעשו.
מה עושה את ההבדל במהירות בין C ל CPP ?
 

vinney

Well-known member
ה"כבדות" של העצמים ותפיסת המקום בזיכרון.
הסבר בבקשה.

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

struct { int i; } struct_memory;

ו:

class {public: int i; } class_memory;
מה תופס יותר מקום או פחות מקום בזכרון משני המשתנים האלה?
 

פולגאר

Well-known member
הסבר בבקשה.

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

struct { int i; } struct_memory;

ו:

class {public: int i; } class_memory;
מה תופס יותר מקום או פחות מקום בזכרון משני המשתנים האלה?
ל-class בד”כ מוקצה זכרון על ה-Heap ואילו ל-struct בד”כ על ה-Stack.
צריך הסבר נוסף? מה אתה עושה ער בשעה כזאת? אין לך מחר בית ספר?
 
למעלה