Menu

מה זה C? שפת התכנות שמאחורי כל השאר

C היא שפה מקומפלת, קטנה ומהירה משנת 1972 שעדיין מריצה מערכות הפעלה, מסדי נתונים וכמעט כל מכשיר משובץ. כאן תמצאו מה היא, איפה היא רצה ולמה שווה ללמוד אותה ב-2026.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

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

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

תוכנית C שלמה

הנה הצורה של כל השפה בשש שורות. הריצו את הקוד.

#include <stdio.h> מביא את ההצהרות הסטנדרטיות של קלט ופלט כדי ש-printf תהיה מוכרת. main הוא המקום שבו כל תוכנית C מתחילה. printf כותבת טקסט, \n הוא ירידת שורה, ו-return 0 אומר למערכת ההפעלה שהתוכנית הסתיימה בהצלחה. זו תוכנית שלמה שמתקמפלת: אין מחלקה שעוטפת אותה ואין framework מתחתיה.

מה מייחד את C

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

  • היא מתקמפלת לקוד מכונה. תוכנית C הופכת לפקודות מכונה עבור מעבד מסוים ורצה ישירות, בלי מפרש ובלי מכונה וירטואלית באמצע.
  • אתם מנהלים את הזיכרון בעצמכם. אין garbage collector. מבקשים זיכרון ומחזירים אותו. זו יותר עבודה, וזו גם הסיבה שתוכניות C צורכות כל כך מעט זיכרון ויש להן תזמון צפוי כל כך.
  • היא קטנה. ל-C יש בערך 32 מילות מפתח. אפשר להחזיק את כל השפה בראש, וזה לא נכון לגבי C++, Java או Python.
  • כמעט אין לה סביבת ריצה. תוכנית C יכולה לרוץ על מיקרו-בקר עם כמה קילובייטים של RAM ובלי מערכת הפעלה בכלל.

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

איפה C באמת רצה

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

  • מערכות הפעלה. הקרנל של Linux הוא בערך 30 מיליון שורות של C. חלקים גדולים מ-Windows ומהקרנל של Apple כתובים גם הם ב-C.
  • מערכות משובצות. מיקרו-בקרים ברכבים, בתרמוסטטים, במכשור רפואי, בנתבים ובמכונות כביסה מתוכנתים ברובם המוחלט ב-C. כשלשבב כולו יש 32 KB של זיכרון, C היא לרוב האפשרות המציאותית היחידה.
  • מסדי נתונים. SQLite, PostgreSQL, MySQL ו-Redis הם תוכניות C.
  • סביבות ריצה של שפות. CPython, מפרש הייחוס של Python, כתוב ב-C. כך גם MRI של Ruby, מנוע Zend של PHP והליבה של Lua. כש-Python "איטית מדי", הפתרון הוא בדרך כלל הרחבה ב-C.
  • כלים וספריות. Git, curl, FFmpeg, OpenSSL, zlib, ושוב SQLite: שכבת התשתית של עולם המחשוב היא C.

זו גם הסיבה שה-application binary interface של C חשוב: כמעט כל שפה יכולה לקרוא לפונקציה של C. ל-Python, Rust, Go, Java ו-JavaScript יש כולן דרך להגיע לספריות C. C היא שפת התיווך בין שפות.

למה ללמוד C

יש שתי תשובות כנות, והן מכוונות לאנשים שונים.

אם אתם רוצים לעבוד על תוכנת מערכות, קרנלים, דרייברים, קושחה משובצת, מסדי נתונים, C היא שפת העבודה של התחום, ורוב מודעות הדרושים בתחומים האלה מזכירות אותה במפורש (לרוב לצד C++ או Rust). קשה לתרום ל-Linux, ל-PostgreSQL או לקוד של מיקרו-בקר בלי לקרוא C בנוחות.

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

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

C ו-C++

C++ התחילה ב-1979 בתור "C עם מחלקות" וגדלה לאחת השפות הגדולות שקיימות: מחלקות, templates, exceptions, העמסת אופרטורים, ה-STL, smart pointers, וספרייה סטנדרטית שמגמדת את כל המפרט של C.

הקשר בפועל:

  • C++ שמרה על התחביר של C, ולכן if, for, while, אופרטורים, מצביעים ומערכים נראים אותו דבר בשתיהן.
  • רוב קוד ה-C הכתוב היטב מתקמפל כ-C++, עם כמה חריגים (למשל C++ דורשת המרה של התוצאה של malloc).
  • קוד C++ כמעט אף פעם אינו C תקין.

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

עם זאת, C היא לא תת-קבוצה של C++ בשום מובן רשמי. אלה תקנים נפרדים שמתפתחים בנפרד, ול-C המודרנית יש יכולות שאין ל-C++ (designated initializers שהגיעו ב-C99, מצביעי restrict ומערכים באורך משתנה).

איזו C: גרסאות התקן

C היא שפה מתוקננת, והגרסה חשובה כשקוראים קוד ישן.

תקןשנהכדאי להכיר בגלל
C89 / C901989הבסיס העתיק. משתנים מוצהרים רק בראש בלוק.
C991999הערות //, הצהרה על משתנים בכל מקום, bool דרך stdbool.h, long long
C112011threads, פעולות אטומיות, פונקציות ספרייה בטוחות יותר
C172018גרסת תיקוני באגים של C11: ברירת המחדל הנפוצה היום
C232024true/false/bool כמילות מפתח, nullptr, ליטרלים בינאריים

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

gcc -std=c17 -Wall -Wextra hello.c -o hello

מה אין ב-C

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

  • אין מחרוזות. מחרוזת ב-C היא מערך של char שמסתיים בבית אפס. שרשור של שתיים פירושו לקרוא לפונקציה ולדאוג שהיעד גדול מספיק.
  • אין אוספים. אין רשימות, מילונים או קבוצות. יש מערכים בגודל קבוע ומצביעים; טבלת hash היא משהו שכותבים לבד או מקשרים מספרייה.
  • אין exceptions. פונקציות מדווחות על כישלון בהחזרת ערך מיוחד, -1, NULL או קוד סטטוס, ומצופה מהקורא לבדוק.
  • אין generics או העמסה. שם פונקציה אחד פירושו פונקציה אחת. בגלל זה בספרייה הסטנדרטית יש abs, labs ו-fabs לשלושה טיפוסים שונים.
  • אין namespaces או מודולים. כל פונקציה שאינה static חולקת מרחב שמות גלובלי אחד, ולכן ספריות C מוסיפות קידומת לכל דבר (sqlite3_open, png_read_info).
  • אין garbage collector. כל malloc צריך free תואם, ושכחה היא דליפת זיכרון.

אף אחד מאלה אינו פספוס. חלקם מנגנוני זמן ריצה ש-C מסרבת לסחוב (garbage collector, פריסת exceptions, מחרוזות שגדלות), וזה חלק גדול מהסיבה שהיא נכנסת לשבב עם 2 KB של RAM; אחרים, כמו namespaces ו-generics, הם יכולות שפה שהופיעו אחרי התכנון של C ונשארו בחוץ כדי לשמור על השפה קטנה.

ה-buffer הוא 32 בתים כי אתם החלטתם שזה מספיק. C לא תבדוק, וההחלטה הזו היא כל האופי של השפה בשורה אחת.

האם C קשה?

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

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

שאלות נפוצות

מה זו שפת התכנות C?

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

למה משתמשים ב-C היום?

קרנלים של מערכות הפעלה (Linux, חלקים מ-Windows ומ-macOS), קושחה משובצת ברכבים, במכשירי חשמל ובמיקרו-בקרים, מסדי נתונים כמו SQLite ו-PostgreSQL, סביבות ריצה של שפות כמו CPython ו-Redis, וספריות שהביצועים שלהן קריטיים ששפות אחרות קוראות להן.

האם עדיין שווה ללמוד C ב-2026?

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

מה ההבדל בין C ל-C++?

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

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל