הרהורים על Java... או זה לא מגניב, אבל זה עובד

ב־יום שישי, 5 באוקטובר 2012, מאת ארתיום; פורסם תחת: תכנה חופשית, פיתוח, תכנה ומחשבים, Java; ‏8 תגובות

לאחרונה יצא לכתוב מעט ב־Java, אחד מהם היה תוסף ל־ImageJ‏ כחלק מהעבדת התזה שלי, במקרה השני כתבתי יישום GUI קטן שהייתי צריך אפשרות להריץ אותו במספר פלטפורמות בצורה פשוטה.

התחושה העיקרית שקיבלתי מהשפה:

בעוד 50 שנה ימשיכו לתחזק ולכתוב קוד שכתוב בה

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

הסדר פשוט מובנה בשפה בצורה שלפעמים "מציקה" אבל מצד שני מאוד מקלה עליך. החל משמות הקבצים ומחלקות, צורה של הגדרת מתודות, התיעוד (JavaDoc) הסטנדרטי, הספציפיקציות המדויקות (ללא Undefined Behaviour). בקוד Java קל התמצא, קל לקרוא, קל לכתוב.

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

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

עושר ה־API:‏ אני חשוב שזה אחד הצדים חזקים ביותר של השפה: GUI,‏ Unicode, ‏ Web, מתמטיקה, רשת, I/O ועוד אלף ואחד דברים וכל זה מובנה, עובד, ותואם לאחור. אתה יכול כתוב יישומים ענקיים בלי להזדקק לספריית צד ג'. אתה רוצה לשלוח חללית למאדים: תייבא org.marse ו־org.nasa.spaceship ותקרא למתודה "lunch".

הפצת תכנה: הקלות בה יכולתי לכתוב תוסף ל־ImageJ ולחבר אותו הייתה פשוט מעולה - אתה מוריד Class וזה "פשוט עובד". נכון, אם לוקחים תכנות כמו GIMP גם להם קל לכתוב תוסף ב־Python, אבל אתה לא תוכל תכתוב שום דבר רציני שדורש חישוב אמתי בו, לעומת זאת ב־Java המהירות קרובה הרבה יותר למהירות קוד ה־C או C++‎.

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


שורה תחתונה, אני מאוד נהניתי לעבוד ב־Java.

תגובות

sijp, ב־06/10/12 10:08

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

לבלנדר למשל יש API שלם בפייטון איתו אפשר לעבוד בשילוב מנוע המשחקים כדי ליצור משחקים אמיתיים.

ארתיום, ב־06/10/12 14:56

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

לא כשזה בא לידי ביטוי בחישובים כבדים. Java אפילו רצה בצורה אטית יותר מ־C++‎ וזה מורגש מאוד (הבדל בין 5 ל־2:30 דקות). כשבאים ל־Python ההבדל הופך לסדרי גודל. תחשוב משהו שהיית מריץ במשך 2 דקות או במשך שעה? בנוסף, בגלל GIL אתה לא ממש יכול לכתוב קוד שמנצל מספר ליבות (הקוד שלי כן והופך פי N יותר מהיר)

לכן, כשמדובר בעיבוד תמונה כבד, Python פשוט לא בא בחשבון

ik, ב־06/10/12 17:54

מי שלא לומד מההיסטוריה כותב אותה שוב בפוסט ...

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

אתה יודע מה קרה ? משהו שלקח בפסקל 3 חודשים לבנות, לקח לפרוייקטים בג'אווה שנה וחצי (לפני מספר אנשים שאני מכיר שהיו בפרוייקטים האלו) !

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

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

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

ואם כבר שפה בסגנון, אז עדיף #C כי היא הרבה יותר הגיונית (וגם הועתקה מפסקל :P), אבל העניין הוא שהיא באמת מתקדמת ולא תקועה במקום. ומכילה המון דברים שתמצא בשפות דינאמיות כמו רובי ופיתון, אבל לא בג'אווה, אבל אין בעיה לקחת קוד ג'אווה, לעשות לו paste ל#C ואולי עם מעט התאמות, לגרום לזה לרוץ.

צריך גם לשאול עוד שאלות בנושא, כדוגמת האם שפות שחייבות IDE לתכנות, באמת כדאי שיהיו ?

מאיר, ב־07/10/12 01:49

שטויות.

  • NumPy/SciPy
  • PyPy
  • Processing

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

אחרות לא קמו שלשום. בגרסאות ציבוריות, פייתון קיימת מ-89, רובי מ-95 פרל מ-87 (וגם לה כלי עיבוד מידע חזקים מאוד, כמו PDL), הן ותיקות מאוד והן פה להשאר.

ליבוביץ, ב־07/10/12 05:07

הנושא של checked Exceptions שנוי במחלוקת. למשל ב-C++‎11 כבר לא תומכים בו בכלל (למעט הכרזה על פונקציה כ"לא זורקת כלום בכלל"). ב-C#‎ גם החליטו לא לאפשר את זה.

אני אישית חושב שאין סיבה להשתמש בזה. אם השגיאה מספיק חשובה כך שכל משתמש בפונקציה צריך לשים לב אליה - אל תשתמש ב-exception, פשוט תחזיר שגיאה (ממילא זה רק להשתמש ב-exception למשהו שהוא לא exceptional), ואם לא - ה-exception צריך להיות unchecked ממילא.

ריאיון

דיון על ג'אווה

שו"ת מ-Visual Studio

queency, ב־09/10/12 09:13

אין ספק שהאינטואיטיביות ב JAVA לאחר שאתה תופס את הסדר מדהימה. התיעוד קל ומהיר ובגלל זה כל כך נוח לעבוד איתה וגם כייף ועם זאת 1) יש קצת אי בהירות לגבי המונח קוד פתוח ו JAVA לא ידוע האגנדה של יוצרי השפה יסגרו יום אחד לא יסגרו ? זה לא בדיוק GPL . 2) אני לא מומחה בעניני מהירות ו\ או עבודה עם מולטי מעבד אבל למשל פה http://norvig.com/sudoku.html פיתון עושה עבודה די מהירה אם אתה יודע לנצל את הכלי הזה 3) ראיתי כמה מימושים של הצגת מספרים ראשוניים בפיתון והופתעתי לראות את ההבדל בגישות השונות באותה השפה ועוד יותר הופתעתי לראות את ההבדלים במהירות החישוב ראה כאן: http://stackoverflow.com/questions/1628949/to-find-first-n-prime-numbers-in-python

4) לינק שנתקעתי בו היום טרם בדקתי : http://www.scottkirkwood.com/2006/07/shortest-sudoku-solver-in-python.html#!/2006/07/shortest-sudoku-solver-in-python.html

5) יש לי חבר בעירייה שאמר לי: בכלים הלינוקסים אני מתקן בעיה ברבע שעה . בJAVA לוקח לי 3 שעות .

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

שי, ב־13/10/12 20:38

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

בהקשר של checked exceptions, זה בדיוק סוג הדברים שנשמע נהדר על שולחן השרטוט, אבל כושל בצורה מחפירה בשטח. הסיבה: כשלאנשים אין כח לטפל ב־exceptions, הם בוחרים דרך קלה שמביסה את המטרה של כל העניין. ואז, כשיש לך פונקציה (סליחה, מתודה) שקוראת לארבע אחרות, שכל אחת מהן מצהירה על שתי exceptions שהיא זורקת, אתה פתאום מוצא את עצמך עם 6-7 exceptions שאתה צריך לטפל בהן. אז אם זה מעניין אותך, אתה מטפל בשלוש שאתה יכול לטפל בהן ומעביר ארבע הלאה או משהו. ואם זה לא, אתה פשוט משאיר את כולן בכותרת, או שנשבר לך מכל הטררם ואתה מחליף את זה ב־throws Exception וגמרנו (או, אם אתה לא יכול כי אתה מממש interface, אתה מכניס catch ריק שזה באמת זוועה).

עכשיו, אתה יכול להגיד, „בכל שפה אפשר לעשות catch ריק”. אבל בשפות בלי checked exceptions, הפיתוי לזה הרבה פחות חזק; ובפרט, Java תוכננה לכאורה במיוחד עבור סוג המתכנתים שחושבים ש־catch ריק הוא פתרון קביל – המתכנתים, בוא נגיד, הפחות מחויבים לאיכות מקצועית.

בלעם, ב־31/01/14 20:29

"בקוד Java קל להתמצא, קל לקרוא, קל לכתוב"

זה אולי היה נכון פעם, לפני ש- AOP, Spring ודומיהם נהיו ״מגניבים״.

היום קוד ג׳אווה שאני רואה הוא הכל חוץ מקריא - וגם לדבג, לעשות Profiling וכו׳ נהיה כמעט בלתי אפשרי.

היתרונות של ג׳אווה קיימים, אבל בשום אופן קלות כתיבה וקריאה של הקוד אינם ביניהם.

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים