# שפת תכנות עילית

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

## מאפיינים

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

## מחיר האבסטרקציה

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

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

## משמעות יחסית

לעיתים משתמשים במושגים *high-level* ו-*low-level* כמושגים יחסיים להשוואה בין שפות תכנות שונות המיועדות למתכנתים אנושיים. לדוגמה, לפני כמה עשורים, שפת C נחשבה high-level, מאחר שהיא תומכת ברעיונות כגון הערכת ביטויים (expression evaluation), פונקציות רקורסיביות המקבלות פרמטרים, טיפוסי נתונים ומבנים (structs). לעומת זאת, כיום, מתכנתים רבים מתייחסים לשפת C כ-low-level מאחר שהיא לא כוללת מערכת סביבת הרצה (run-time system) גדולה (למשל, אין איסוף זבל), היא תומכת רק בפעולות סקלריות, ומאפשרת גישה ישירה לזיכרון המחשב. לפיכך, שפת C משתלבת ללא קושי עם שפת סף ועם מעבדים ומיקרו-בקרים ברמת המכונה.

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

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

## מודלים של ביצוע

קיימים שלושה מודלים של ביצוע (execution models) עבור שפות עילית מודרניות:

* **מפורש (interpreted)**

שפות מפורשות (interpreted languages) נקראות ומבוצעות בצורה ישירה, ללא שלב של הידור. תוכנה הנקראת מפרש (interpreter) עוקבת אחר סדר הזרימה של התוכנית, קוראת אותה שורה אחר שורה, ממירה את השורה לשפת מכונה ומבצעת אותה. שפת המכונה אינה נשמרת, ואם יש צורך לבצע שוב את אותה שורת קוד, היא עוברת פירוש מחדש.

* **מהודר (compiled)**

לפני ההרצה של שפות מהודרות (compiled languages), הן עוברות המרה לקובצי הרצה (executable form). קיימים שני סוגים של הידור:

**יצירת שפת מכונה**
חלק מהמהדרים מהדרים קוד מקור ישירות לשפת מכונה. זהו מודל ההידור המקורי, ושפות שעוברות הידור ישיר ומלא לשפת מכונה (native code) בצורה כזאת, נחשבות לשפות "מהודרות באמת".
**ייצוגי ביניים**
כאשר שפה עוברת הידור לייצוג ביניים, ניתן להכניס בו אופטימיזציות נוספות, או לשמור אותו להרצה במועד מאוחר יותר מבלי הצורך לקרוא מחדש את קובץ קוד המקור. כאשר ייצוג הביניים נשמר, הוא מיוצג בדרך כלל בצורה של bytecode. בשלב הבא, כדי להריץ את ייצוג הביניים, יש לפרש אותו, או להדר אותו הלאה. מכונות וירטואליות אשר מריצות bytecode בצורה ישירה או ממירות אותו הלאה לשפת מכונה, טשטשו את ההבחנה שקודם לכן הייתה ברורה, בין ייצוגי ביניים לשפות "מהודרות באמת".
* **מתורגם (translated או transpiled)**

שפה יכולה לעבור תרגום לשפת תכנות שהיא low-level יותר, וקיימים עבורה מהדרים רבים לשפת מכונה. שפות התכנות JavaScript, C ו-Python הן שפות יעד מקובלות עבור מתרגמים מסוג כזה.

## ראו גם

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

* שפת תכנות Low-level
* תכנות גנרי
* אבסטרקציה (מדעי המחשב)
* תוכנה - מונחים
* היסטוריה של שפות התכנות

## הערות שוליים