C (שפת תכנות)
מתוך ויקיפדיה, האנציקלופדיה החופשית
| ערך זה זקוק לעריכה, על מנת שיתאים לסגנון המקובל בוויקיפדיה. הסיבה שניתנה לכך היא: דורש השלמה ותיקון טעויות. אם אתם סבורים כי אין בדף בעיה, ניתן לציין זאת בדף השיחה שלו. |
שפת C היא שפת תכנות פרוצדורלית. שפה עילית לכל דבר הכוללת בקרת זרימה ומבני נתונים, שמאפשרת עם זאת ניצול מרבי של יכולות המחשב בדומה לשפת סף. אחת השפות היעילות והמהירות בתעשייה. שפת C השפיעה על שפות תכנות רבות, ובמיוחד על C++, שנכתבה (במקור) כהרחבה של C.
תוכן עניינים |
[עריכה] מאפייני שפת C
שפת C תוכננה לראשונה בין השנים 1969 ל-1973 (ובמיוחד בשנת 1972) על ידי דניס ריצ'י במעבדות בל על מערכות UNIX שרצו על מחשבי PDP-11. הצורך בשפה עלה לשם כתיבת מערכת הפעלה. באותה עת הייתה קיימת שפת ה-B, ובאמצעותה נכתבה שפת C בתחילה. כאשר התפתחה שפת C, הגיעה למצב בו המהדר בו מהדרים את השפה כתוב אף הוא בשפת C עצמה, תהליך הנקרא Bootstrapping. מקור השם של השפה הוא באותה שפת B, תוך התקדמות אות אחת באלפבית.
כיום C אינה קשורה למערכת הפעלה מסוימת או מחשב מסוים.
רוב הגרעין (Kernel) של מערכת ההפעלה לינוקס כתוב ב-C, כמו גם הרבה תוכנות אחרות המהוות את מערכת ההפעלה GNU/Linux.
לשפת C הונהגו כללים שנכתבו על ידי ועדה ולנהלים אלו קוראים ANSI C. על מנת לכתוב בשפה יש צורך במהדר (הממיר תוכנית הכתובה בשפה לשפת מכונה אותה המחשב מבין). סביבות עבודה לשפת C כיום כוללות מהדר, כלי לניפוי שגיאות (מציאת תקלות, באגים), וכן אפשרות לערוך את הקוד, כל זה בחבילת תוכנה אחת.
עיקרון מנחה בשפה הוא עקרון היעילות, ובכך היא מצטיינת. כל פעולה בשפה מתבטאת בפעולה בודדת או במספר מועט של פעולות בשפת סף. משום כך אין בה סוגי מבנים מורכבים כגון מחרוזות או בדיקות סמויות בגישה למערכים. מסיבה זו היא גם כוללת לא מעט אפשרויות לשגיאות שהמהדר (Compiler) לא יאתר אותן, כגון פנייה לאיבר שלא קיים במערך או פנייה למשתנה לא מאותחל וכדומה.
[עריכה] מושגים בתכנות ומימושם בשפת C
כאמור, הייחוד של השפה הוא הפשטות והיעילות שבה, והדבר מתבטא בין השאר גם באופן מימושם של המושגים הבסיסיים בתכנות. למשל, כל המבדיל בין הכרזה על משתנה והכרזה על פונקציה הוא כתיבת () (סוגריים עגולות) לאחר שם הפונקציה המוכרזת. זאת בניגוד לשפות אחרות כמו פסקל, שבהם הכרזת פונקציה נעשית בעזרת מילה שמורה.
[עריכה] משתנים
- משתנה - כינוי לחלק זיכרון שמכיל מידע מסוים. למשל אם מוגדר משתנה מטיפוס מספר בשם x אז x יהיה כינוי למספר שאת ערכו תוכל התוכנית לשנות או לקרוא.
- לדוגמה, הגדרת משתנה מסוג int, המייצג מספר שלם בגודל שני בתים לכל הפחות:
int x;
- מצביע - משתנה המכיל מיקום בזיכרון המחשב - למשל, מיקום של משתנה אחר, או מיקום של פונקציה. משמש בין היתר ליצירה של מבני נתונים דינמיים.
- לדוגמה, מצביע למשתנה מסוג short, או מערך של מספרים מסוג זה, שהוא משתנה המייצג מספר שלם בן שני בתים:
short *x;
- דגל - טיפוס נתונים המכיל אחד משני ערכים המציינים קיומו או סתירתו של תנאי. במרבית שפות התכנות משמש משתנה בוליאני לתפקיד זה, אך בשפת C אין טיפוס בוליאני. במקום זאת, משתמשים בערך השונה מאפס או שווה לאפס כדי לייצג ערכי 'אמת' או 'שקר', בהתאמה.
- אתחול משתנה - מתן ערך התחלתי למשתנה. לעתים (בעיקר בזמן דיבאג) המהדר נותן ערך ערך התחלתי למשתנים, ולעתים לא. אם לא ניתן ערך התחלתי על ידי המהדר, הערך התחלתי של המשתנה הוא נתון אקראי או נתון סתמי (ערך התחלתי כזה מכונה לעתים זבל והוא מכיל את מה שהכיל האזור הזה בזיכרון לפני היווצרות המשתנה), על כן אין להסתמך בשום פנים על כך שערכו ההתחלתי של משתנה מספרי יהיה אפס. הנחה כזו היא שגיאה נפוצה אצל מתחילים.
- לדוגמה, איתחול משתנה מסוג char, המייצג תו בייצוג ASCII:
char ch = 'a';
- מערך - אוסף של משתנים המסודרים ברצף בזיכרון. גם כאן, באה לידי ביטוי החסכוניות שבשפה, מאחר ש'מערך' הוא בעצם מצביע קבוע (const), וכל מה שאפשר לעשות עם מצביע אפשר לעשות עם מערך ולהפך. מספרו הסידורי של התא הראשון במערך בשפת C הוא 0, ולכן האיבר האחרון במערך בן חמישה איברים יהיה איבר מס' 4. גישה לאיבר מתבצעת על ידי רישום מספרו בתוך סוגריים מרובעים.
- לדוגמה, הגדרת מערך של מספרים מסוג float, המייצג מספר נקודה צפה בן ארבע בתים (דיוק יחיד):
float n[5];
- לחלופין, ניתן להגדיר מערך על ידי איתחול ערכיו. נגדיר מערך של מספרים מסוג double, המייצג מספר נקודה צפה בן שמונה בתים (דיוק כפול):
double n[] = {3.14, 2.71, 0.8, 5, 32};
- רשומה (מכונה גם מבנה) - קבוצה של משתנים, שניתן להגדירם בבת אחת ותחת שם זהה, כאשר כל אחד מהמשתנים הוא עצמאי. בניגוד למערך, לא כל המשתנים צריכים להיות מאותו הסוג. רשומה מאפשרת לאחד מספר משתנים העוסקים באותו פריט מידע לתוך משתנה יחיד.
- לדוגמה, רשומה (או מבנה) המתארת שם וגיל של אדם. היא מכילה שני שדות:
struct person { char *name; int age; };
חשוב לציין, כי ב C אין משמעות למבנה בפני עצמו, אלא רק כסימון (tag) המאחד טכנית את המשתנים הכלולים בו. ולכן אין מובן לשם המבנה בפני עצמו, אלא רק בתוספת המילה השמורה struct. לדוגמה, על מנת להגדיר מבנה בשם moshe מהסוג person דלעיל, אין לכתוב:
person moshe;
אלא
struct person moshe;
- מחרוזת - לא קיימת בשפת C כטיפוס בודד אלא כמערך של תווים. מחזורת בגודל n צורכת מקום של n+1 משום שמצטרף תו 0 (0\ או NULL). הטיפול במחרוזת נעשה על ידי פונקציות של הספרייה הסדרתית.
- לדוגמה, המחרוזת:
char name[] = "John";
- הזהה מבחינת תוכנה למערך:
char name[] = {'J', 'o', 'h', 'n', '\0'};
[עריכה] מבני בקרה
- לולאה - מבנה בקרה שמאפשר חזרה על אותו קוד ברצף מספר פעמים. ב־C נהוגים שלושה סוגי לולאות: לולאות while שמבוססות על בדיקת תנאי להמשך הלולאה לפני ביצוע הקוד, לולאות do-while שדומות ללולאות while רק שהתנאי נבדק ביציאה, ולולאות for, שבנוסף לבדיקת התנאי גם משלבות בצורה טבעית משתני עזר שיפקחו על ריצת הלולאה (למשל, ספירת מספר הפעמים שהלולאה חזרה על עצמה).
- לולאת for:
int i; for (i=0; i < 5; i++) { /*your code here... */ }
- לולאת while עם בקרה בכניסה:
while (/*some boolean condition*/) { /*your code here... */ }
- לולאת do-while עם בקרה ביציאה:
do { /*your code here... */ } while (/*some boolean condition*/);
[עריכה] מבנים
- פונקציה - המבנה הבסיסי של השפה שבו יכולות להתבצע פקודות ומבני בקרה. אוסף של פקודות (אלגוריתם) שיכול (אך לא חייב) לקבל ערכים כקלט ולהחזיר משתנה יחיד כפלט. שינוי בערכי משתני הקלט בפונקציה לא ישפיע על ערכיהם בחלקים אחרים בתוכנית, אלא אם מדובר במשתנים מיוחדים שהוגדרו מראש כגלובליים, או לחילופין, אם הערך שהועבר לפונקציה לא היה ערך של משתנה, אלא ערך של המיקום בזיכרון שבו נמצא המשתנה, כלומר מצביע.
- לדוגמה, פונקציה המקבלת שני מספרים ומצביע למקום בזיכרון, מחזירה את הפרשם, ושמה במקום שבזיכרון את סכומם:
int add(int a, int b, int *sum) { *sum = a + b; return a - b; }
- מודול - יחידה עצמאית של תוכנה (או חומרה). למשל: טיפול במדפסת נעשה על ידי מודול למדפסת אשר לא כולל דבר בנוסף למדפסת וטיפולה. כל מודול מקומפל בנפרד אולם הם כולם יוצרים קשר אחד עם השני, בשפת C הקשר נוצר על ידי קובצי h. שמכילים את ההגדרות של המודולים האחרים. בכל תוכנה יש מודול אחד ראשי שמכיל את הפונקציה main שבה מתחילה התוכנית.
- ספריה - אוסף של פקודות המאוגדות יחד במקום אחד המאפשר לנו להשתמש בהן ללא צורך לכתיבתן מחדש. בשפת C יש צורך לבצע פקודת include# לקובץ שמכיל את ההגדרה של הספרייה בשביל להשתמש בה.
- לדוגמה, הכללת הספרייה string, המכילה פונקציות לטיפול במחרוזות:
#include <string.h>
- לפני תרגום התוכנית לשפת מכונה, תוכנית הנקראת "קדם מעבד" (pre-processor) יוצרת קובץ חדש הכולל בנקודה בה מוכרזת ההכללה את תוכן הקובץ המוכלל, ואז מועבר הקובץ להידור לשפת מכונה.
- ספריות סטנדרטיות - שפת C היא בעיקרון שפה מינימאלית. היא אינה מכילה פקודות הקושרות אותה למערכת הפעלה מסוימת או לתחום תוכנה מסוים. מסיבה זו, פקודות ספציפיות שכאלה (למשל לקלט ופלט, לחישובים מתמטיים, לעבודה עם מחרוזות ולהקצאות זיכרון דינמיות) נמצאות בספריות סטנדרטיות, שאינן חלק מתחביר השפה אך עונות לקונבנציה מוכרת וקבועה ומהוות חלק מהתקן הרשמי שלה. ספריות אלה מסופקות עם המהדר עבור מערכת הפעלה וחומרה מסוימות והתוכנה מקושרת (linked) עימן על פי צורך והגדרת כותב הקוד.
[עריכה] שונות
- סוגי קבצים - קובץ טקסט וקובץ בינארי. קובץ טקסט יכול לעלות על ידי כל מעבד תמלילים. קובץ בינארי לעומתו מכיל ייצוגים של נתונים וכדומה ואינו מיועד לקריאה על ידי כל מעבד תמלילים. הגישה השונה מתבצעת בדרך כלל קריאה לפונקציות ספריה שונות.
- גישה לקובץ - גישה לקובץ נעשית לרוב על ידי חוצץ הנוטל בכל פעם קטע נתונים מהקובץ. המיקום של החוצץ ניתן על ידי המצביע לקובץ. ב־C ישנה אפשרות לעקוף את החוצץ אולם היא בשימוש רק בתוכנות מרמה נמוכה (מערכות הפעלה למשל).
- הערה - שימוש בשפה המדוברת להסברת שלבי התוכנית. אינו משפיע על ריצת התוכנית עצמה, אך הכרחי להבנתה בידי מתכנתים אחרים או בזמן מאוחר יותר. (מופיע בין התווים /* */). ראה דוגמאות למעלה.
- שגיאת ריצה - תקלה הנגרמת על ידי התוכנית בזמן הרצתה. למשל: חלוקה באפס, כתיבה לאזור שמור בזיכרון, טיפול בנתונים שגויים (או זבל).
[עריכה] "Hello World" בשפת C
תוכנית פשוטה זו מדפיסה את המחרוזת "!Hello, World" לפלט הסטנדרטי.
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
[עריכה] ראו גם
[עריכה] לקריאה נוספת
- Brian Kernighan, Dennis Ritchie, The C Programming Language
- 1st, Prentice Hall 1978; ISBN 0-13-110163-3. Pre-ANSI C.
- 2nd, Prentice Hall 1988; ISBN 0-13-110362-8. ANSI C.
- ISO/IEC 9899. The official C:1999 standard, along with technical corrigenda and a rationale. As of 2005 the latest version is ISO/IEC 9899:TC2.
- Peter van der Linden, Expert C Programming.
[עריכה] קישורים חיצוניים
| מיזמי קרן ויקימדיה |
|---|
- מדריך בשפת C, אתר איתן
- קורס C שניתן באוניברסיטה העברית
- קורס C שניתן בחיפוקס, מועדון הלינוקס החיפאי
- מדריך שפת C באתר UnderWarrior
| שפות תכנות |
|---|
|
Ada | ALGOL | Awk | Assembly | Basic | BCPL | C | C++ | C# | Cobol | Delphi | Eiffel | Forth | Fortran | Haskell | Java | LISP | Logo | Miranda | Modula-2 | Oberon | Ocaml | Pascal | PHP | Perl | PL/I | PL/SQL | Prolog | Python | REXX | SQL | Ruby | Smalltalk | Visual Basic | Visual Basic .NET |

