פסקל להמונים

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

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

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

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

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

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

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

גישה נוספת שיש בשפה, היא שאין כפל משמעות של דברים (יש כמה מקרי קצה, אבל מאוד קל להתמודד איתם כאשר מבינים אותם). יש הבדל בין שוויון לבין הצבה. יש הבדל בין פעולה בוליאנית לבין פעולה של bitwise. יש namespace ברורים מאוד לכל דבר, אנחנו יודעים מתי פונקציה מסויימת מיובאת מספרייה חיצונית ואנחנו יודעים מה כל קובץ של קוד מקור יעשה בדיוק (האם הוא יחידה, האם הוא תוכנה או האם הוא ספרייה [משותפת/סטטית]).

הגישה הזו חוסכת מאיתנו הרבה מאוד כלים חצוניים כדוגמת autotools או Makefiles מסובכים, היות והכל ברור ברמת הקוד ולא צריך להגדיר אותם במיוחד.

בד"כ אין צורך בכלי בנייה לשפה עצמה, וכאשר יש צורך, הם בד"כ פשוטים מאוד, או נוצרים בצורה אוטומטית עבורינו. במידה ואנחנו רוצים שליטה טובה יותר בפריסה, יצירה ו/או ליצור חבילה (לא חבילה של מערכת הפעלה, אלא של כלים שיש בשפה שמזכירים את ruby gems ואת Perl cpan), יש גם כלים מאוד פשוטים ליצירתם.

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

16 מחשבות על “פסקל להמונים

  1. elcuco

    בזמן האחרון אני מסתכל על קוד שאני כותב וחושב "ואללה, את זה יכולתי לעשות בפסקל יותר בקלות" אני גם חושב את זה על JavaScript, במקום לתכנת ב-C++‎ הייתי יכול לכתוב את הלוגיקה ב־JS ולהיות שמח יותר.

    למה? חסרות לי local proceduces, מה שאונס אותי לכתוב מחלקה שלמה ב־C++‎ ואז להתחיל לדאוג להקצאות זיכרון, כשבעצם כל מה שאני רוצה זה לשמור על ה־scope של המשתנה הזה שיש לי בפוקנקציה. מעצבן טילים.

  2. יורם

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

  3. elcuco

    יורם, בהחלט closure יפתור את הבעייה הזאת (זה מה שאני משתמש בו ב-JavaScript, כפי שהסברתי).

    בנוסף, הרעיון שך headers היה אולי טוב בשנות השבעים, אבל כיום כל המידע שיש ב-Header אפשר למצוא בדרכים טובות יותר. לראיה, שפות מודרניות כמו D, C#, Java ואפילו פסקל, יודעות להיסתדר בלי headers.

  4. ik_5 מאת

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

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

  5. ארתיום

    הי עידו,

    כמה טעויות קטנות:

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

    .

    לצורך העניין C ניתן לקמפל במעבר אחד (כמובן ש־C++‎ לא).

    אבל צר לי, אני לא רואה בזה שום יתרון.

    לגבי זמן קומפילציה – מסכים להשוואה עם C++‎ אבל לא עם C.

    קומפיילרים של C בד"כ מאוד מהירים: אם יש לך ספק חפש על Tiny C comiler וכיצד הוא היה מסוגל לטעון קרמל Linux שלום מקוד מקור ב-15 שניות: http://bellard.org/tcc/tccboot.html

    (הייתי מת שהיה tcc++‎ אבל אין חיה כזו)

  6. ik_5 מאת

    היתרון של מעבר אחד על קוד הוא עצום גם בשבלך המתכנת, וגם למהדר.
    נגיד ואתה כותב תוכנית בעלת 100,000 שורות קוד, והמהדר צריך לעבור 100,000 שורות קוד אם בהתחלה הוא לא מוצא הגדרה מסויימת בשביל להגיד שיש בעיה.
    אחרי זה עוברים עוד שורה, ושוב פעם במידה וההגדרה הזו לא בעץ שלך, אתה צריך לעבור קרוב ל100,000 שורות קוד בשביל למצוא את ההגדרה. זה נראה לך הגיוני שתוכנה תעשה דבר כזה (שלא לדבר על זה שאדם צריך לעשות את זה ידנית כשכותבים קוד -> אני יודע שתזכיר IDE אבל זה להתעלם מהבעיה).

  7. דני

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

  8. ik_5 מאת

    תלוי מה הפיתוח שלכם. אם אתם מפתחים ב web אין סיבה לגעת בפסקל (למרות שיש כלים ממש מגניבים לזה).

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

  9. שמוליקיפוד

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

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

  10. יורם

    דיאגו, יש דיבורים על תמיכה בclosure בתקן הבא של C++ אבל לא הייתי בונה על זה הרבה, זה נוגד את ההגיון של השפה…
    כשאני רוצה פתרונות מהסוג הזה אני משתמש בפרל, מלכת הclosure…

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

  11. ik_5 מאת

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

    אנשים מנסים להצדיק ללא הצלחה אמיתית את השימוש ב C ו ++C. תראה את הבעיה של ++C מרוב ניסיון לכסות כל אופציה אפשרית, יצרו טכנולוגיה שאי אפשר להשתמש בה בלי להתחיל להתעלם מכל האופציות האפשריות, ועדיין אצלי בפסקל יש יותר יכולות מ ++C בהרבה מקומות. למשל המקום של local procedure קיים אצלי בפסקל הרבה מאוד שנים, והיום כולם משתמשים ברעיון הזה שעבר שידורג בשפות אחרות בסגנון של lambda ו proc וכו'… אז כמובן שזה לא התחיל בפסקל, אבל זה פאקינג יעיל לתכנות. אין לך את זה ב C.
    תראה את ה namespace המוגדר בפסקל בו אתה תמיד יודע בכל מצב מה הוא אותו namespace ובמידה ואתה לא בטוח, אתה פיזית מציין אותו ופתרת את הבעיה. ב ++C אתה אומר על include או קובץ c את ה namespace שלך ואתה די תקוע אחרי זה כאשר אתה צריך לחרוג ממנו אתה חייב לציין בכל מקום את החריגה הזו , ואנשים חושבים שזה עצמה …

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

  12. יורם

    עידו, אתה צודק בהחלט במשפט האחרון.
    כמתכנת C ו-C++ שאוהב לעבוד בשפות האלו אין לי בכלל בעיה לדבר על הבעיות שלהן, כך שאין הרבה טעם בהטפה.
    לגבי local procedure, אני לא רואה את זה כשימושי במיוחד. זה בניגוד לפונקציות למבדה שעיקר כוחן הוא הוא שהן מוגדרות בסקופ אחד ונקראות בסקופ אחר (כלומר, הן לא בדיוק לוקאליות…).

  13. ik_5 מאת

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

  14. יוחאי

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

  15. ik_5 מאת

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

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s