שפות תכנות - עושים קצת סדר - מקומפלות או מפוענחות?

2025-01-15 - תכנות, שפות תכנות

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

והפעם, נדבר על - מקומפלות או מפוענחות?

מקומפלות או מפוענחות

מהן שפות מקומפלות (compiled) ומהן שפות מפוענחות (interpreted)?

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

פיענוח (interpretation) הוא תהליך בו אנו לוקחים קוד הכתוב בשפה מסויימת ומריצים את התוכנית ישירות, כמו שטבח עוקב אחרי מתכון.

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

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

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

> CHICKEN Scheme (אגב שפת התכנות עם הלוגו היפה ביותר)
היא דיאלקט של Scheme, שפת תכנות עם טיפוסיות דינמית, שלה יש קומפיילר שמתרגם Scheme ל-C.
> Haskell (עלייה כנראה אכתוב פוסט כחלק מסדרת "שפות תכנות").
היא שפת תכנות בעלת טיפוסיות סטטית חזקה, והיא דוגמא לשפה שיש לה גם אינטרפרטר וגם קומפיילר. הקומפיילר הנפוץ ביותר של Haskell נקרא GHC ובהפצה של קומפיילר זה מצורף בנוסף גם אינטרפרטר בשם GHCi. GHCi מריץ בודק הטיפוסים לפני ריצת התוכנית, ואם זה סיים בהצלחה, מריץ אותה בלי לקמפל אותה לקוד מכונה.
> Python כנראה לא צריכה הקדמות
בעוד שהמימוש הרשמי הוא (סוג של) מפענח, והוא היה רוצה לגרום לכם לחשוב שפייתון היא "שפה מפוענחת", אפשר בהחלט לכתוב קומפיילר לפייתון, ו-Cython הוא אחד כזה.

סיכום

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

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

רוצים להגיב? בדקו מהי שאלת הסינון בעמוד הראשי.