ג'אווה 8 או פייתון?

hadooper

New member
ג'אווה 8 או פייתון?

מתוך סקרנות, איזו מבין השפות יותר מועדפת…
(אין להחשיב שפות JVM-יות אחרות תחת "ג'אווה 8" כמובן...).
 

28gil28

New member
עדיפה למה?

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

zaske

New member
הדוגמא שלך לא טובה לדעתי

אני לא יודע כמה java באנדרואיד "מיושרת" מול java8. ואל תשכח שמדובר בשני jvm שונים - זה של oracle (או בגרסא האופן סורסית שלו - openjdk , וכן יש גם מימושים של חברות אחרות, כמו ibm וכו') מול דלוויק.
לא יודע אם דברים כמו למבדא הולכים להכנס ל java באנדרואיד. אולי liviur יכול להרחיב פה.
לגבי מניפולציות על קבצי טקסט - אפשר גם ב java , מאוד תלוי כמובן מה אתה רוצה לעשות.
בפיית'ון אפשר לעשות לא מעט דברים. ממליץ לך לקרוא למשל על פרוייקט שנקרא open stack - זה קצת מעבר ל "מניפולציה על קבצי טקסט".
 

hadooper

New member
...

האם תוכל לציין באילו שימושים נוספים פייתון מרגישה יותר כמו ה"כלי" המתאים יותר (על-פני ג'אווה)?
 

user32

Well-known member
מנהל
כמעט כל דבר בתחום התשתיתי

ג'אווה בנוייה לאפליקציות ולקרוס פלטפורם. דברים מסורבלים שנאלצתי לעשות בג'אווה: קריאות לcommand line, טיפול בקבצים, משתמשי מערכת הפעלה, הרשאות וכו'. כל דבר בתחום הרשתות (מציאת רשת, הגדרות IP, קונפיגורציה וכו'), תקשורת עם חומרה (bluetooth, USB) ועוד ועוד. בפיתון יש ספריות כמעט להכל ואם אין אז קל לפתח משהו בC/C++. בג'אווה צריך לשבור שיניים אם רוצים JNI או להסתפק בספריות המקוריות שתאורטית אמורות לרוץ על כל מערכת הפעלה ולכן בנויה בצורה גנרית שמסבכת את הפיתוח או מסתמכת על מימוש JVM ואז בחצי מהמקרים זה פשוט לא יעבוד כי זה לא ממומש למערכת ספציפית. שקלתי לרגע לנסות את Java embedded בשביל לכתוב משהו לרסברי אבל מהר מאוד ירדתי מזה וכתבתי בפיתון.

כשאתה רץ בסביבה סגורה (מערכת הפעלה ידועה מראש ובלי application server) אין יתרון משמעותי לג'אווה ולJVM בכלל. זה עוד יותר משמעותי כשמדובר בקודים יחסית קצרים ואז כל העניין של strongly typed פחות משנה.
 

GuestOfHonor

New member
JNI


 

hadooper

New member
מצד שני, אם אתה עובד נניח על יוניקס/לינוקס...

לא עדיף כבר לבצע את כל ענייני ה- system programming (או לחילופין אפילו תכנות אפליקטיבי אך כזה שעושה שימוש בAPI של מ"ה) באמצעות unix shell scripting (או bash), מאשר לכתוב בפייתון?
 

user32

Well-known member
מנהל
מדובר במצבים מעורבבים

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

pattos

New member
מה לגבי ביצועים?

אאל"ט, בjava הביצועים של מבני נתונים מקביליים יותר מהירים מבפייתון כי יש לה את הlock הכללי הזה על כל מבנה נתונים, לא?
וחוץ מזה יש בפייתון JIT? כי אם לא, אז היא כנראה איטית משמעותית מjava.
 

user32

Well-known member
מנהל
לא יודע

לא התעמקתי בהבדלים בביצועים. בפרוייקטים המועטים שהשתמשתי בהם בפיתון הביצועים כלל לא היו אישיו. יש גם Jython למי שממש רוצה לכתוב פיתון ולהריץ על JVM ואז מן הסתם תקבל אותם ביצועים כמו ג'אווה.

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

pattos

New member
אני מדבר על Global Interpreter Lock

לא אמרתי מסונכרנים. אמרתי מקביליים.
אם יש לך 50 חוטים שניגשים לקריאה לאותו hashmap שהוא thread safe בpython לפי מה שאני מכיר, הם יחכו בתור ויעשו את זה אחד אחרי השני, בעוד שבjava הם יעשו את זה במקביל, (כלומר, במקביל עד כמה שאפשר כתלות במספר הליבות).
 

user32

Well-known member
מנהל
הבנתי אותך

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

hadooper

New member
אולי הוא התכוון ל- concurrent collections...

שפשוט משתמשים מאחורי הקלעים מתי שאפשר ויותר אפקטיבי גם בסוגים אחרים של נעילות שהם לא רק exlusive locks. כמו למשל reader writer lock או interlock.
 

hadooper

New member
כנראה לא הכוונה

אבל בכל זאת כנראה שבג'אווה אין מימוש עם reader writer lock עבור concurrent collections. אני מניח שיש רק שימוש ב- spinning lock וב- interlocked היכן שניתן...
 

pattos

New member
מה מסורבל עם טיפול בקבצים?

אתה יכול להגיע לרמה די נמוכה עם RandomAccessFile, ויש מספיק ספריות open source שמתעסקות עם משתמשי מ"ה (נניח התממשקות עם active directory), ולגבי רשתות- להגדיר ip? לא בשביל זה המציאו את השפה, עם כל הכבוד. אתה רוצה להגדיר ip- תביא לsysadmin לכתוב סקריפט שיעשה את זה.

וגם בJAVA יש ספריות להכל, היא בשכונה הרבה מאוד זמן. יש מלא אנשים שכתבו דברים עם jni וממישקו את זה לjava.
למשל, יש API של hyperic Sigar שהוא בjava והוא מכסה כל אספקט של monitoring של system שאתה יכול לחשוב עליו ועובד מעולה (בדקתי לפני הרבה שנים).

אבל כן, כמובן שאם כל מה שאתה רוצה זה לעשות משהו קצר אז עדיף לך python אבל אם אתה עושה פרויקט גדול ועצום וכבד חישובית אתה רוצה את הstatic typing כדי שהקומפיילר ימנע ממך מלעשות שטויות, ואתה רוצה את הגמישות של הפלטפורמה (אפשר בpython להציג dump של כל החוטים? יש להם דבר מקביל לjconsole?)
 

user32

Well-known member
מנהל
שוב, דברים תשתיתיים

חלק מהדברים עוד לא עשיתי אז אל תתפוס אותי במילה אבל דוגמאות:
סריקת ספריות וחיפוש קבצים לפי RegEx (כמו שעושים בshell)
סריקת קבצי טקסט והחלפת strings בתוך הקבצים לפי קריטריונים מסויימים. בג'אווה? זה ייראה משהו כמו פונקציה רקורסיבית על כל הספריות, טעינת רשימת קבצים עבור כל ספריה, טעינת כל הקובץ לתוך מערכים/באפרים/strings בלולאה בשימוש בInputStreams או מקביליהם (NIO וכו') כתיבה מחדש של כל זה לקובץ זמני, דריסת הקובץ המקורי, וכו'. מתערב איתך שבפיתון זה שורות קוד בודדות וזה כמעט בלי להכיר פיתון.

לגבי מה שכתבת על הרשתות: מאיפה אתה יודע מה הדרישות שלי? אני למשל מפתח רובוט מבוסס לינוקס שצריך לאתר בעצמו את הרשת ולקנפג את עצמו. מה תגיד על זה? "תביא sysadmin"? תן קצת קרדיט אני מתכנת בג'אווה מאז גרסה 1.2. ברובוט הזה יש ליבה אחת ורץ thread אחד, צריך לשנות את הקוד של התוכנה שלו תוך כדי תנועה.

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