שפה מפורשת
שפה מפורשת היא שפת תכנות, אשר מרבית היישומים הכתובים בה מבצעים הוראות באופן ישיר, בלי לעבור הידור לשפת מכונה (machine code). תוכנית הכתובה בשפה מפורשת מוזנת, פקודה אחר פקודה, למפרש. המפרש, עבור כל פקודה בשפת המקור, מבצע אוסף מוגדר מראש של פקודת מכונה.
באופן תאורטי, ניתן לטעון כי המונחים שפה מפורשת או שפה מהודרת אינם מוגדרים היטב, שכן ניתן לפרש או להדר כל שפת תכנות. על כן, ההגדרה האם שפת תכנות מסוימת היא מפורשת או מהודרת נבחרת על פי דרך השימוש הנפוצה בשפה. כל זאת ועוד, ניתן להשוות בין שפות מפורשות לשפות מכונה. ניתן לטעון שפירוש וביצוע- זהים הם: קריאת הפקודה הבאה וביצועה. בנוסף, ניתן לטעון שבייטקוד זהה אף הוא לקוד מכונה, ויש לו ייצוג אסמבלי.
על אף האמור לעיל, בשימוש נפוץ, שמור המונח שפה מפורשת לשפות תוכנה הרצות על גבי תוכנות אחרות, כלומר, לפחות שכבת ביניים אחת בינן לבין החומרה.
שפות רבות מומשו באמצעות הן מהדר והן מפרש, לדוגמה, BASIC, C, Lisp, פסקל, ופייתון. ג'אווה וסי-שארפ מהודרות ל-bytecode. מימושים של ליספ מערבבים בין קוד מפורש לקוד מהודר באופן חופשי.
רקע היסטורי
[עריכת קוד מקור | עריכה]בימים הראשונים של המחשב המודרני, עיצוב השפה הושפע במידה רבה על ידי ההחלטה להשתמש בהידור או בתרגום כצורת ביצוע הקוד. לדוגמה, סמולטוק (1980), שתוכננה להתפרש בזמן ריצה, איפשרה לאובייקטים לתקשר זה עם זה באופן דינמי.
הידור ביניים
[עריכת קוד מקור | עריכה]בתחילה, פירש שפות מפורשות תורגמו שורה אחר שורה, כלומר, כל פקודה תורגמה בעת שאמורה הייתה להתבצע. אם לולאה או פונקציה גרמו לשורות להתבצע מס' פעמים, שורות אלה פורשו בכל פעם מחדש. בכך נתבקשה החומרה המריצה את המפרש לבצע את אותן פקודות שוב ושוב. בשלב מוקדם נוהג זה נחסך, על ידי שימוש במטמון פקודות מפורשות. רוב השפות המפורשות עושות שימוש במטמון פקודות מפורשות העושה שימוש בייצוג ביניים, המשלב פירוש והידור.
את ייצוג הביניים ניתן להדר פעם אחת (כמו ב-Java, בה לא נהוג לפרסם את קוד המקור), או לפני הביצוע (כמו Perl או Ruby), או בעת שמתגלה שינוי בקוד המקור (כמו בפייתון).
יתרונות
[עריכת קוד מקור | עריכה]שפה מפורשת מקנה ליישומים הכתובים בה יותר גמישות על פני יישומים הכתובים בשפה מהודרת. דוגמאות לתכונות שקל יותר להקנות ליישומים בשפות מפורשות:
- Reflection תוך שימוש במפרש (למשל, פונקציית eval מסדר ראשון.)
- מערכת טיפוסים דינאמית (dynamic typing)
- יישום מופץ קטן יותר. (חלק גדול מרוטינות העזר נשלח עם המתרגם)
- תחום דינאמי (dynamic scoping)
כמו כן, ניתן להפוך יישומים בשפות אלה לחוצי פלטפורמות (platform-independent) יותר בקלות (לדוגמה, אותו יישום פייתון ירוץ לרוב על כל מע' הפעלה בה המפרש של פייתון מותקן).
בנוסף, הואיל ונהוג לפרסם באופן ישיר את קוד המקור, למשתמשים יש יותר חופש לקרוא או להעתיק אותו.
חסרונות
[עריכת קוד מקור | עריכה]- ללא בדיקת טיפוסים סטאטית, בדיקה המתבצעת לרוב על ידי מהדר, תוכניות עלולות להיות פחות אמינות.
- מפרשים עלולים להיות רגישים למתקפות הזרקת קוד.
- קוד מפורש ירוץ לאט יותר מקוד מכונה הרץ ישירות על המעבד. טכניקות המנסות לחפות על בעיה זו כוללות תרגום-זמן-אמת (just-in-time compilation): כאשר המפרש מזהה כי קטע קוד מסוים רץ מס' רב של פעמים- הוא בוחר לתרגם קטע קוד זה ישירות לקוד מכונה.
- במקרים בהם קוד המקור מהווה קניין רוחני, היכולת לקרוא אותו בחופשיות מהווה בעיה (למשל JavaScript בדפי אינטרנט). במקרים מסוימים, ניתן להתמודד עם בעיה זו באמצעות טכניקות של ערפול-קוד-מקור (obfuscation).