Java Script – (כבר) לא שפת צעצוע

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

היסטוריה קצרה ולא אובייקטיבית

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

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

איך הפסקתי לפחד ולמדתי לאהוב java script

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

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

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

HTML5 – העתיד כבר כאן

תקן HTML5 הוא גם זרז משמעותי להתפתחות של ג'אווה סקריפט, וגם הכרה בחשיבות שלה ובתצורה של לקוח עשיר (ואפילו מה שנקרא אפליקציות של דף אחד) באינטרנט. בעצם הפלטפורמה שעליה אמור לרוץ כל מה שמדברים עליו (אפליקציות עשירות, גרפיקת 2 וגם 3 ממדים, אחסון מקומי, מיקום גיאוגרפי וכו' כחלק מהסטנדרט) היא js, וכל זה כחלק מתקן, ולא במצב שכל דפדפן מפתח יכולות באופן עצמאי. העניין הזה כבר נתן דחיפה עצומה לפיתוח של ספריות חזקות (מישהו אמר jquery?), אפליקציות ואפילו משחקים שלמים בjs. למשל גרסת הכרום של angry birds, על הגרפיקה שלה, המנוע הפיזיקלי וכו', כתובה כולה בjs.

V8 engine – קפיצת מדרגה

לחובבי הרכב, לא מדובר על מנוע 8 הבוכנות בתצורת V, אלא על מנוע הג'אווה סקריפט שרץ בין היתר בדפדפן כרום של גוגל. מתוך הכרה בחשיבות ההולכת וגדלה של הנושא הם השקיעו בפיתוח סביבת ריצה שהיוותה קפיצת מדרגה מול כל מה שהיה מסביב, וכללה כל מה שיש במכונה וירטואלית מודרנית – אופטימיזציות קוד מראש ותוך כדי ריצה, אלגוריתמים טובים לאיסוף אשפה, ממשק אמיתי לדיבאגר וכו'. הדבר הזה מאפשר להריץ אפליקציות בסדר גודל אחר של מורכבות יחסית למה שרץ על מנועי js ישנים, מה שכמובן גם מעודד מירוץ חימוש של שיפור מתמיד בין יצרני הדפדפנים, ותהליכים כאלה מתקדמים רק בכיוון אחד.

Node.js וצד שרת

האמת היא שחשבתי לפרט יותר על node , אבל הפוסט נהיה ארוך והנושא הזה מצדיק פוסט בפני עצמו. בכל מקרה, על קצה המזלג, נעשו מספר פיתוחים שמטרתם להשתמש בjs בצד השרת. אני למשל מכיר פרויקט שנכתב כולו בjs ורץ מעל rhino – פרויקט שמריץ js על JVM.

כל הדברים האלה לדעתי שייכים לתחום האיזוטריה הטכנולוגית, אבל יש פרויקט אחד שפרץ את הגבול הזה – Node.js. הוא מבוסס על מנוע V8 שכמו שאמרנו הוא כבר סביבת ריצה מודרנית ורצינית, וחושף מודל תכנותי מבוסס אירועים. המודל הזה מאוד מתאים לאפליקציות עתירות IO (כמו חדרי צ'אט למשל) ומאפשר לכתוב אפליקציות סקלביליות במודל שהוא פשוט יחסית. כאמור, הנושא הזה ראוי להרחבה, כרגע אני אסתפק בלהגיד שהפרויקט הזה מאוד נחשב בסביבת הקוד הפתוח, ותופס תאוצה רבה.

Dart – העתיד?

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

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

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

וואו, מי חשב שיש כל כך הרבה להגיד על javascript.

4 מחשבות על “Java Script – (כבר) לא שפת צעצוע

    • הי אלון, ברוך הבא🙂

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

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s