שפת תכנות Low-level

במדעי המחשב, שפת תכנות low-level (שפת תכנות "נמוכה" או "תחתית") היא שפת תכנות המספקת אבסטרקציה (הפשטה) מעטה מארכיטקטורת סט הפקודות של המחשב, או כלל לא. בדרך כלל המונח מתייחס לשפת מכונה או לשפת סף. המילה "low" (נמוך) בהקשר זה מתייחסת לכמות הקטנה או לאי הקיום כלל של שכבות הפשטה בין שפת התכנות לשפת המכונה. מסיבה זו, לעיתים שפות low-level מתוארות כ"קרובות לחומרה". שפות תכנות low-level ניתנות להמרה לשפת מכונה מבלי להשתמש במהדר או במפרש, והקוד שנוצר רץ ישירות על גבי המעבד. ניתן לגרום לתוכנית הכתובה בשפה low-level לרוץ במהירות גבוהה ביותר, ועם צריכת זיכרון מעטה. תוכנית שקולה בשפה עילית (high-level) תהיה "כבדה" יותר. שפות low-level הן פשוטות, אך נחשבות קשות לשימוש בגלל הפרטים הטכניים הרבים שיש לזכור. בהשוואה לשפות תכנות low-level, שפות תכנות עיליות מקלות על פיתוח התוכנה על ידי ניתוק הסמנטיקה של ארכיטקטורת המחשב מהמפרט של התוכנה. לעיתים מחלקים שפות תכנות low-level לשתי קטגוריות: "דור ראשון" ו"דור שני".[דרושה הבהרה] ערך מורחב – שפת מכונה שפת מכונה היא השפה היחידה שמיקרו-מעבד יכול לעבד ישירות בלי הצורך לבצע המרה קודמת כלשהי. כיום, מתכנתים כמעט אף פעם לא כותבים תוכניות באופן ישיר בשפת מכונה, מכיוון שהיא דורשת תשומת לב לפרטים רבים ששפה עילית יכולה לטפל בהם באופן אוטומטי, ומשום שכתיבה בשפת מכונה נעשית בקודים מספריים וקשה לזכור אותם. מסיבה זו פותחו שפות תכנות מהדור השני המספקות רמת הפשטה אחת מעל שפת המכונה. דוגמה: פונקציה בשפת מכונה של ארכיטקטורת x86, לחישוב האיבר ה-n בסדרת פיבונאצ'י: 8B542408 83FA0077 06B80000 0000C383 FA027706 B8010000 00C353BB 01000000 B9010000 008D0419 83FA0376 078BD98B C84AEBF1 5BC3 ערך מורחב – שפת סף שפת סף (אסמבלי) משמשת כמיפוי בין אסימונים (tokens) קריאים על ידי בני אדם, לבין הוראות בשפת מכונה (opcodes). האסימונים הקריאים על ידי בני אדם עוברים הרכבה ישירה לשפת מכונה, בדרך כלל בהתאמה של אחד-לאחד בין אסימון להוראה בשפת מכונה. ניתן ליצור שכבת הפשטה נוספת מעל קוד אסמבלי, באופן דומה לדרך שבה שפת מכונה עוברת הפשטה לשפת סף. דוגמה: אותו מחשבון מספרי פיבונאצ'י מהדוגמה למעלה, הפעם כתוב בשפת אסמבלי x86, המשתמשת בתחביר של Microsoft Macro Assembler: fib: mov edx, [esp+8] cmp edx, 0 ja @f mov eax, 0 ret @@: cmp edx, 2 ja @f mov eax, 1 ret @@: push ebx mov ebx, 1 mov ecx, 1 @@: lea eax, [ebx+ecx] cmp edx, 3 jbe @f mov ebx, ecx mov ecx, eax dec edx jmp @b @@: pop ebx ret בשנות ה-60 המאוחרות, ניסיונות לפתח שפות תכנות עיליות (high-level) התומכות בתכנות מערכת (system programming – פיתוח תוכנה לשליטה בחומרה וליצירת תשתיות להרצת יישומי מחשב), הובילו לפיתוח שפות כגון Forth ,BCPL ,BLISS ,PL/S, ולהרחבת שפת ALGOL לתמיכה בתכנות low-level. עם זאת, השפה שהפכה לשפה השלטת בפיתוח תוכנות מערכת (system software) היא שפת C. ערך מורחב – שפת C שפת C היא שפת תכנות עילית הנחשבת לשפה מהדור השלישי (third generation), מאחר שהיא תומכת בתכנות מובנה (structured programming) והיא מספקת הפשטה מעל שפת המכונה. (מבחינה היסטורית, אף אחת משפות התכנות מהדור השני לא התאימה במיוחד לתכנות low-level). עם זאת, כיום מתכנתים רבים מתייחסים לשפת C כשפה low-level, מאחר שהיא לא כוללת מערכת סביבת הרצה (run-time system) גדולה (למשל, אין מנגנון איסוף זבל), היא תומכת רק בפעולות סקלריות, והיא מאפשרת גישה ישירה לזיכרון המחשב. לפיכך, שפת C משתלבת ללא קושי עם שפות סף ועם מעבדים ומיקרו-בקרים ברמת המכונה. היכולת של שפת C ליצור הפשטה מעל רמת המכונה מאפשרת לאותו קוד להיות מהודר עבור פלטפורמות חומרה שונות; עם זאת, שליטה עדינה ברמת המערכת תתאפשר רק אם מערכת היעד כוללת כמה מאפיינים כלליים כגון מודל זיכרון שטוח (flat memory model), וזיכרון המחולק לבתים. ייתכן שתוכניות בשפת C ידרשו "כוונון" (tweaking) מסוים, הממומש בדרך כלל על ידי הידור מותנה (conditional compilation), המיועד עבור פלטפורמות יעד שונות. תהליך ההתאמה של תוכנית עבור פלטפורמה שונה נקרא porting. דוגמה: פונקציה בשפת C לחישוב האיבר ה-n בסדרת פיבונאצ'י, תוך חישוב ברקורסיה של כל האיברים הקודמים לו: #include <stdio.h> unsigned long fib(unsigned int n) { if (n == 0 || n == 1) return 1; else return fib(n-1) + fib(n-2); } int main(void) { unsigned int i, n; scanf("%u", &n); for (i = 0; i <= n; i++) printf("Fibonacci (%u): %lu\r\n", i, fib(i)); return 0; } המושגים "עילית" (high-level) ו"low-level" הם יחסיים. לדוגמה, לפני כמה עשורים, שפת C ודומותיה נחשבו לשפות עיליות. לעומת זאת, כיום, מתכנתים רבים מתייחסים לשפת C כ-low-level. ניתן לחשוב על שפת סף כייצוג "גבוה" יותר של שפת מכונה, מכיוון שהיא כוללת רעיונות כגון מבנים (constructs), ביטויים מוגבלים, ולפעמים אפילו משתנים, פרוצדורות ומבני נתונים. (עם זאת, שפת סף בכל זאת מהווה ייצוג ביחס של אחד-לאחד לשפת המכונה, אלא אם נעשה שימוש במאקרו). שפת המכונה בתורה נמצאת ברמה מעט יותר גבוהה מאשר המיקרוקוד ומיקרו פעולות המשמשים בתוך מעבדים רבים. תוכנה - מונחים