JavaScript: סיפור של אהבה ושנאה

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

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

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

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

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

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

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

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

לסיכום, בין JavaScript ובין מפתחי אתרים קיימת מערכת יחסים מלאה באהבה ושנאה, זאת מעצם היותה של השפה, למרות חסרונותיה הרבים, אחת החשובות בעולם התכנות כיום. JS היא לב ליבו של תכנות הweb בחיינו, וככזו חשוב להכיר וללמוד אותה. ישנם אספקטים נוספים הקשורים לשפה שלא הספקתי לגעת בהם, כמו סביבת ההרצה NodeJS ומנהל הספריות NPM. בנוסף, קיימת שפה שהיא למעשה אחותה של JS, הנקראת TypeScript ( או TS בקיצור), אשר עושה שימוש בטיפוסים ובJS. כן כן, מה ששמעתם: תכנות פונקציונלי כמו בJS אבל ביחד עם טיפוסים כמו בJava. אבל כל אלה הם נושאים ליום אחר.