שפת תכנות Low-level

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

במדעי המחשב, שפת תכנות low-level (שפת תכנות "נמוכה") היא שפת תכנות המספקת אבסטרקציה מעטה מארכיטקטורת סט הפקודות של המחשב, או כלל לא. בדרך כלל המונח מתייחס לשפת מכונה או לשפת סף. המילה "low" (נמוך) בהקשר זה מתייחסת לכמות הקטנה או לאי הקיום כלל של שכבות אבסטרקציה בין שפת התכנות לשפת המכונה. מסיבה זו, לעתים שפות low-level מתוארות כ"קרובות לחומרה".

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

בהשוואה לשפות תכנות low-level, שפות תכנות עיליות מקלות על פיתוח התוכנה על ידי ניתוק הסמנטיקה של ארכיטקטורת המחשב מהמפרט של התוכנה.

לעתים מחלקים שפות תכנות low-level לשתי קטגוריות: דור ראשון ודור שני.

שפת מכונה[עריכת קוד מקור | עריכה]

Postscript-viewer-shaded.png ערך מורחב – שפת מכונה

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

דוגמה: פונקציה בשפת מכונה של ארכיטקטורת x86, לחישוב האיבר ה-n בסדרת פיבונאצ'י:

8B542408 83FA0077 06B80000 0000C383
FA027706 B8010000 00C353BB 01000000
B9010000 008D0419 83FA0376 078BD98B
C84AEBF1 5BC3

שפת סף[עריכת קוד מקור | עריכה]

Postscript-viewer-shaded.png ערך מורחב – שפת סף

שפת סף (אסמבלי) אינה נחשבת לשפת תכנות בגלל שלא קיים עבורה דקדוק או מפרט רשמי. שפה זו משמשת כמיפוי בלבד בין אסימונים (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

תכנות low-level בשפות תכנות עיליות[עריכת קוד מקור | עריכה]

בשנות ה-60 המאוחרות של המאה ה-20, נסיונות לפתח שפות תכנות עיליות (high-level) התומכות בתכנות מערכת (system programming - פיתוח תוכנה לשליטה בחומרה וליצירת תשתיות להרצת יישומי מחשב), הובילו לפיתוח שפות כגון Forth ,BCPL ,BLISS ,PL/S, ולהרחבת שפת ALGOL לתמיכה בתכנות low-level. עם זאת, השפה שהפכה לשפה השלטת בפיתוח תוכנות מערכת (system software) היא שפת C.

שפת C[עריכת קוד מקור | עריכה]

Postscript-viewer-shaded.png ערך מורחב – שפת 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>
 
long fib (int n)
{
       if ((n == 0) || (n ==1))
      	 return 1;
   	else
      	 return (fib (n-1) + fib (n-2));
}
 
void main()
{
   	int n,i ;
       scanf("%d", &i);
   	for ( n=0 ; n <= i; n++)
      	 printf ("Fibunachi (%d): %ld\n\r", n, fib(n));
}

משמעות יחסית[עריכת קוד מקור | עריכה]

המושגים high-level ו-low-level הם מושגים יחסיים מטבעם. לדוגמה, לפני כמה עשורים, שפת C ושפות דומות לה נחשבו high-level. לעומת זאת, כיום, מתכנתים רבים מתייחסים לשפת C כ-low-level.

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

שפת המכונה בתורה נמצאת ברמה מעט יותר גבוהה מאשר ה-microcode ו-micro-operations המשמשים בתוך מעבדים רבים.

ראו גם[עריכת קוד מקור | עריכה]

עיינו גם בפורטל

P Hello World.svg

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