מהי שפת התכנות הטובה ביותר
או: לא כל שפות התכנות דומות ל-C
כשהתחלתי את דרכי בתכנות הייתי עדיין ילד. למדתי את השפה שלימדו באותו זמן בקורס של "סיוון מחשבים" – C. אחר כך קראתי קצת על תכנות והבנתי שיש שפה יותר "חזקה" מ-C שמאפשרת שליטה מוחלטת על מה שיקרה במחשב, ושקוראים לה אסמבלי. למדתי קצת מפה וקצת משם והתעניינתי בשפות נוספות וכל הזמן דנתי עם עצמי בשאלה איזו שפת תכנות מבין השפות שאני מכיר היא הטובה ביותר.
יום אחד שאלתי את גוגל את השאלה הפשטנית הזו בכוונה כדי לראות מה יש לתבונה הגלובלית לומר בנושא. כתבתי את המילים "best programming language" ועברתי בין התוצאות לראות אם יש מישהו שעונה על השאלה בצורה רצינית. התאכזבתי אבל לא הופתעתי לראות בפורומים תשובות שמשוות בין #C ל-Java, בין C ל-++C, בדרך כלל בצורה לא מעמיקה ולא מבוססת. לעומת זאת, אחת מהתוצאות היתה שונה מכולן. אני ציפיתי לתשובה מנומקת שתסביר למה התכונות המתקדמות של #C כל כך טובות, או למה לא ניתן לוותר על השליטה והמהירות של C במקרים מסוימים. מה שודאי לא ציפיתי לו זו כתבה שבוחרת שלוש שפות כטובות ביותר, שעל שלושתן כמעט לא שמעתי, אם בכלל. זה ישר תפס לי את העין. תרמה לכך גם העובדה שהכתבה נכתבה באנגלית גבוהה, והטקסט הקרין ניסיון של שנים והיכרות נרחבת עם מדעי המחשב.
נפתח לי חלון לעולם שלא הכרתי. מסתבר שעולם התכנות לא מסתיים במשפחת השפות המוכרות. למעשה יש להן שם, "שפות אימפרטיביות" (imperative), המתארות פעולות בעזרת משפטי ציווי כמו "קבע את הערך של x ל-5" או בקצרה x=5. לעומתן ישנן שפות שבהן אי אפשר לשנות ערך של משתנה או לכתוב שתי פקודות שורה אחרי שורה ולצפות שהן תקרינה אחת אחרי השניה.
כדי שלא תבינו לא נכון אומר לכם כבר עכשיו שהכתבה ההיא אינה היחידה בנושא והיא גם לא הכי טובה. כשיודעים מה לחפש אפשר למצוא פנינים רבות ברחבי האינטרנט. הסיבה שהחלטתי לשתף אתכם בכתבה היא שאני חושב שאנשים ישמחו להכיר עולמות מופלאים חדשים כמו שאני שמחתי.
בנוסף, אל תקחו את המסקנות בקיצוניות. הרבה מוצאים ש-++C ו-Python עונות על רוב צרכי הפיתוח ולפעמים לא כדאי להתפזר. המשיכו לעבוד עם מה שנוח לכם.
מאז, הבלוג שבו פורסמה הכתבה נסגר ואי אפשר למצוא את המקור לכתבה באינטרנט חוץ מאשר בארכיון אתרים (המקור למטה). לשירותכם תרגמתי את הכתבה והנה היא לפניכם:
The best programming languages
מובן שבלתי אפשרי לבחור בצורה אובייקטיבית ומוחלטת את שפת התכנות הטובה ביותר. בחירת שפת תכנות תלויה ביותר מדי דברים. שפה שיכולה להיות טובה מאוד עבור שימוש מסויים עשויה לא להתאים עבור משימה אחרת.
סביר שהבחירה שלי לשפות התכנות הטובות ביותר (בחרתי 3) תיראה אישית. בטוח שהרבה מקוראי הבלוג הזה לא יסכימו איתי. גם הקריטריונים שעל פיהם בחרתי את השפות הם מאוד סובייקטיביים ומעורפלים. אך למרות שהבחירות שלי קשות להוכחה או להצדקה, הן תוצאה של שימוש במספר רב של שפות תכנות.
כשפות התכנות הטובות ביותר בחרתי את: Common Lisp, Smalltalk, ו- Haskell ואני הולך לנסות לעמוד על המהות של השפות האלה כדי לנסות להסביר מדוע אני חושב שהן הטובות ביותר.
Common Lisp
כמו שתי שפות התכנות האחרות שאני חושב שהן הטובות ביותר, Common Lisp היא שפה עשירה ומורכבת, וניסיון לתאר אותה בכמה עקרונות כוללים נדון לכישלון. בכל זאת אומר שהמהות של ליספ היא, שתוכנות ליספ הן נתונים, ומערכת הליספ היא תוכנת ליספ.
מערכת הליספ היא רפלקסיבית לחלוטין, וזה אפשרי כי (אך לא רק כי) לליספ אין תחביר. מכיון שאין תחביר ניתן לבנות תוכנות ליספ שמרחיבות את מערכת הליספ, ביניהן אנו מוצאים את מערכת המאקרוים המפורסמת של ליספ שלוקחת תוכנות ליספ כקלט ויוצרת תוכנת ליספ כפלט.
המערכת הזו יכולה לשנות את עצמה לפי הצורך. הפונקציות והמקרוים החדשים הנוצרים על ידי המשתמש משתלבים במערכת בצורה מאוד קוהרנטית. כשמסתכלים על אבסטרקציה שהוגדרה על ידי המשתמש, לא ניתן לומר אם זה משהו שנוסף למערכת או שהיה בה מלכתחילה. לדוגמה, מערכת האובייקטים של ליספ (The Common Lisp Object System) היא לא הרחבה של מערכת הליספ. זוהי עדיין אותה ליספ, ואפילו לא גירסה חדשה שלה. מערכת האובייקטים הינה תוכנת ליספ.
אז בקצרה, לתכנת בליספ זה לתכנת את שפת התיכנות. זה להרחיב את הרעיונות ואת אוצר המילים כדי שיהיה אפשר לתאר בעיות ופתרונן בשפה עילית יותר, דבר שיהפוך את התוכנות לקצרות יותר, קלות יותר להבנה, או בקיצור, אלגנטיות יותר.
Smalltalk
ליספ מבוססת על הפעלת "פונקציות" (המרכאות מסביב למילה פונקציות חשובות). זה מודל הפעולה: מפעילים פונקציה/אופרטור/מאקרו על רשימה של נתונים. ל"פונקציה" יכולות להיות תופעות לוואי והיא יכולה להחזיר מידע.
Smalltalk משתמשת במודל אחר לחלוטין. המהות של סמולטוק היא שאתה שולח הודעות לאובייקטים, וכל דבר הוא אובייקט, אפילו בלוקים של קוד. זה הכל. היכן שבליספ צריך להגדיר אופרטור מיוחד עבור משפטי תנאי כי ההתנהגות צריכה להיות שונה מהפעלה של פונקציה (אסור לעבור על כל הארגומנטים של התנאי אלא רק על אלה שמתאימים לתנאי האמת בגלל תופעות לוואי), בסמולטוק משתמשים באותו עיקרון בסיסי גם עבור משפטי תנאי.
כדי לבדוק תנאי אתה שולח הודעה לאובייקט. ההודעה מכילה שני בלוקים של קוד (שגם הם אובייקטים) ומתארת את התנאי שצריך להיבדק. לפי תוצאת הבדיקה, הודעה תישלח לבלוק הקוד המתאים כדי לבקש ממנו שיריץ את עצמו.
בסמולטוק, כמו בליספ, ניתן לומר שאין תחביר. יש קצת יותר תחביר בסמולטוק אבל לא הרבה. סמולטוק במהותה היא שפה ללא תחביר. ההודעות הן אוצר המילים של השפה.
גם כאן, רוב השפה מוגדרת על ידי ספריות ותוכנות סמולטוק. סמולטוק בנויה בסמולטוק, וגם כאן אבסטרקציות שמוגדרות על ידי המשתמש משתלבות במערכת בצורה קוהרנטית ולא ניתן לומר אם הן הוספו למערכת או שהן היו שם מלכתחילה (מנקודת המבט של המשתמש).
תכנות בסמולטוק גם הוא, אם כי בצורה אחרת מאשר בליספ, לתכנת את שפת התכנות.
Haskell
הסקל היא חיה שונה משתי השפות הקודמות, היא בעלת טיפוסיות סטטית. גם הסקל בנויה על הפעלת פונקציות, אבל בניגוד לליספ הפונקציות טהורות, כלומר, אין להן תופעות לוואי. כדי להמנע מהצורך באופרטורים מיוחדים (בשביל תנאים…) הארגומנטים נקראים בצורה עצלה (הערת המתרגם: כלומר, רק לפי הצורך). גם כאן, אין כל כך הרבה תחביר בהסקל (אך יותר מאשר בסמולטוק).
הסקל אינה שפת תכנות הניתנת לתכנות (אלא אם מדברים על הרחבות של השפה כמו Template Haslell) אבל יש מספיק הפשטות בהסקל כדי לבנות בעזרתה בקלות שפות המותאמות לתחום מסויים.
המהות של הסקל היא שאין שום מושג של מצב רגעי, שום מושג של זמן. היא פונקציונלית טהורה. ניתן לומר שזהו פגם בהסקל כי זמן ומצב הם מושגים מהותיים בתיאור העולם, אבל הרעיון של זמן, הרעיון של סידור ברצף, יכול להבנות על גבי מערכת פונקציונלית טהורה, וכאן אנחנו מגיעים למונדות. (הערת המתרגם: אל תדאגו אם אתם לא מבינים מה הן מונדות בדיוק, הרוב לא מבינים…)
מונדות אינן האק של הסקל שנצרך בגלל מודל שחסרה בו תכונה מהותית של העולם האמיתי. מונדות הן ההכרה בכך שניתן לתאר את הרעיון של סידור פעולות ברצף בשפה פונקציונלית טהורה.
המונדה הינה הפשטה שמאפשרת ליצור משפטי בקרה חדשים. בשילוב עם מערכת הטיפוסים החזקה של הסקל שמאפשרת ליצור העמסת אופרטורים אלגנטית, ניתן גם לבנות בקלות הפשטות חדשות שמאפשרות להתאים את השפה לפי הצורך.
איך לדעתי צריכה להיות שפת התכנות הטובה ביותר
זה כבר אמור להיות די ברור. בשבילי שפת תיכנות טובה היא שפה שלא מגבילה את היצירתיות של המפתח. זוהי מערכת שמאפשרת למפתח לחשוב בחופשיות, אבל אין הכוונה ללא שיטתיות והקפדה. שפה טובה היא במהותה שפה שניתן להרחיב אותה בצורה טבעית ושמערכת הטיפוסים שלה (סטטית או דינמית) יכולה למנוע שגיאות בזמן ריצה שהן נפוצות יתר על המידה בשפות כמו C למשל.
לשם הדיון, אתה עשוי להבין עכשיו מדוע אני מעדיף את Ruby על Python. אני חושב שפייתון רגילה יותר מרובי בתחביר שלה אך פחות רגילה ברעיונות. ועל התחביר הפחות רגיל של רובי מפצה בבירור חופש הביטוי המתאפשר על ידי רובי.
כן, אני יודע. שתיהן שפות טובות מאוד. המימוש הרשמי של פייתון (CPython) הוא כרגע מהיר יותר והתמיכה שלהם בתהליכונים וביוניקוד טובה יותר אבל אף על פי כן אני חושב שיש יותר אלגנטיות ברובי, וזה לא צריך להיות הפתעה כי רובי פותחה כליספ/סמולטוק מפושטת.
כן, ניתן לעשות metaprogramming בפייתון. כן, ניתן גם לתכנת את שפת התיכנות. אבל זהו לא סגנון התכנות המועדף על ידי השפה וזוהי לא התרבות של הקהילה של פייתון.
לרוע המזל, ליספ, סמולטוק והסקל יותר מדי שונות מרוב שפות התכנות שנמצאות כרגע בשימוש בתעשייה ושנלמדות בבתי הספר. הן למעשה נראות טכנולוגיות חייזריות לרוב המפתחים.
כצעד ראשון לקראת טכנולוגיית החייזרים הזאת הייתי מייעץ להתחיל עם רובי בשביל צד השפות הדינמיות ו-OCaml בשביל צד השפות הסטטיות. OCaml קלה בהרבה ללמידה מהסקל כי הפונקציונליות שלה אינה טהורה, כלומר תופעות לוואי מותרות. כמו כן יש לה קומפיילר וסביבת פתוח טובות מאוד. אני פשוט חושב שהיא פחות אלגנטית מהסקל.
עד כאן הכתבה.
זהו המקור באנגלית: source
תגיות: common lisp, haskell, ocaml, python, ruby, smalltalk, שפות תכנות, שפת תכנות
פורסם בתאריך 12th יולי 2012 ע"י SoleSoul
2 תגובות
העם דורש פוסט על מכניקות בקרנל!!
תודה על ההתעניינות אבל אנחנו לא ממציאים כדי לכתוב אלא כותבים כשבאמת יש לנו מה לכתוב בתקווה שכך החומר יהיה טוב יותר.