למד Java מהיסוד

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

מאמר ראשון זה מציג את פלטפורמת Java ומסביר את ההבדל בין שלוש המהדורות שלה: Java SE, Java EE ו- Java ME. תוכלו ללמוד גם על תפקידה של מכונת הווירטואלית של Java (JVM) בפריסת יישומי Java. אני אעזור לך להגדיר ערכת פיתוח ג'אווה (JDK) במערכת שלך, כך שתוכל לפתח ולהריץ תוכניות ג'אווה, ואתחיל להתחיל בארכיטקטורה של יישום Java טיפוסי. לבסוף תלמד כיצד להרכיב ולהפעיל אפליקציית Java פשוטה.

עודכן עבור Java 12 ו- JShell החדש

סדרה זו עודכנה עבור Java 12 וכוללת היכרות מהירה עם החדש jshell: כלי אינטראקטיבי ללימוד Java וטיפוס קוד Java.

הורד קבל את הקוד הורד את קוד המקור למשל יישומים במדריך זה. נוצר על ידי ג'ף פרייזן עבור JavaWorld.

מה זה ג'אווה?

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

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

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

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

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

ג'אווה היא שפה בקיאה ברשת . ספריית הרשת הנרחבת של Java מקלה על ההתמודדות עם פרוטוקולי רשת Transmission Control Protocol / Internet Protocol (TCP / IP) כמו HTTP (HyperText Transfer Protocol) ו- FTP (File Transfer Protocol), ומפשטת את משימת יצירת חיבורי הרשת. יתר על כן, תוכניות ג'אווה יכולות לגשת לאובייקטים ברשת TCP / IP, באמצעות Locators Locator Locators (URLs), באותה הקלות שבה תהיה לך גישה אליהם ממערכת הקבצים המקומית.

ג'אווה היא שפה מפורשת . בזמן ריצה, תוכנית Java מבצעת בעקיפין בפלטפורמה הבסיסית (כמו Windows או Linux) באמצעות מכונה וירטואלית (שהיא ייצוג תוכנה של פלטפורמה היפותטית) וסביבת הביצוע המשויכת לה. המכונה הווירטואלית מתרגמת את קודי ה- BYT של תוכנית Java (הוראות ונתונים נלווים) להוראות ספציפיות לפלטפורמה באמצעות פרשנות. פרשנות היא פעולה של להבין מה המשמעות של הוראת קוד byt ואז לבחור הוראות מקובלות "משומרות" ספציפיות לביצוע. המחשב הווירטואלי מבצע את ההוראות הספציפיות לפלטפורמה.

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

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

היבט נוסף של החוסן של ג'אווה הוא כי לולאות חייבות להיות נשלטות על ידי ביטויים בוליאניים במקום ביטויים שלמים כאשר 0 שקר וערך שאינו אפס נכון. לדוגמה, ג'אווה אינה מתירה לולאה בסגנון C כגון while (x) x++;מכיוון שהלולאה לא תסתיים במקום הצפוי. במקום זאת, עליך לספק במפורש ביטוי בוליאני, כגון while (x != 10) x++;(מה שאומר שהלולאה תפעל עד xשווה ל- 10).

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

בתיאוריה, ג'אווה מאובטחת. בפועל, אותרו ונוצלו פרצות אבטחה שונות. כתוצאה מכך, Sun Microsystems אז ו- Oracle ממשיכות כעת לשחרר עדכוני אבטחה.

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

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

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

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

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

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

שלוש מהדורות של Java: Java SE, Java EE ו- Java ME

סאן מיקרוסיסטמס פרסמה את ערכת פיתוח התוכנה Java 1.0 (JDK) במאי 1995. ה- JDK הראשון שימש לפיתוח יישומים שולחניים ויישומונים, וג'אווה התפתחה לאחר מכן כדי להקיף תכנות שרת ארגוני ומכשירים ניידים. אחסון כל הספריות הדרושות ב- JDK יחיד היה הופך את ה- JDK לגדול מכדי להפיץ אותו, במיוחד משום שההפצה בשנות התשעים הייתה מוגבלת על ידי תקליטורים בגודל קטן ומהירויות רשת איטיות. מכיוון שרוב המפתחים לא היו זקוקים לכל ממשק API אחרון (מפתח יישומי שולחן עבודה בקושי יצטרך לגשת לממשקי API של Java של ארגונים), Sun ייצרה את Java לשלוש מהדורות עיקריות. אלה נודעו בסופו של דבר כ- Java SE, Java EE ו- Java ME:

  • Java Platform, Standard Edition (Java SE) היא פלטפורמת Java לפיתוח יישומי צד לקוח (הפועלים על שולחנות עבודה) ויישומונים (הפועלים בדפדפני אינטרנט). שים לב שמסיבות אבטחה יישומונים כבר אינם נתמכים רשמית.
  • Java Platform, Enterprise Edition (Java EE ) היא פלטפורמת Java הבנויה על גבי Java SE, המשמשת אך ורק לפיתוח יישומי שרת מוכווני ארגונים. יישומים בצד השרת כוללים סרוולטים של Java , שהם תוכנות Java הדומות ליישומונים אך פועלות בשרת ולא בלקוח. Servlets תואמים ל- Java Servlet API.
  • Java Platform, Micro Edition (Java ME) בנוי גם על גבי Java SE. זוהי פלטפורמת Java לפיתוח MIDlets , שהן תוכניות Java הפועלות במכשירי מידע ניידים ו- Xlets , שהן תוכניות Java הפועלות בהתקנים מוטבעים.

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

פלטפורמת Java ו- JVM

ג'אווה היא גם שפת תכנות וגם פלטפורמה להפעלת קוד Java מורכב. פלטפורמה זו מורכבת בעיקר מ- JVM, אך כוללת גם סביבת ביצוע התומכת בביצוע ה- JVM בפלטפורמה הבסיסית (המקומית). ה- JVM כולל מספר רכיבים לטעינה, אימות וביצוע קוד Java. איור 1 מראה כיצד תוכנית Java פועלת בפלטפורמה זו. 

ג'ף פריזן

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

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

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

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

חלק מרצפי ההוראות של קוד הביצוע מבוצעים בתדירות גבוהה יותר מאשר אחרים. כאשר המתורגמן מזהה מצב זה, מהדר ה- JIT של ה- JVM בדיוק (JIT) מרכיב את רצף קוד הביצוע לקוד מקורי לביצוע מהיר יותר.

במהלך הביצוע, המתורגמן בדרך כלל נתקל בבקשה לביצוע קוד הביס של קובץ מחלקה אחר (השייך לתוכנית או לספריה). כאשר זה קורה, מעמיס הכיתה טוען את קובץ המחלקה ומאמת קוד ה- byt מאמת את קוד התיקיה של קובץ המחלקה הנטען לפני שהוא מבוצע. גם במהלך הביצוע, הוראות קוד הקוד יכולות לבקש מה- JVM לפתוח קובץ, להציג משהו על המסך, להשמיע או לבצע משימה אחרת הדורשת שיתוף פעולה עם הפלטפורמה המקורית. ה- JVM מגיב באמצעות טכנולוגיית הגשר של Java Native Interface (JNI) כדי ליצור אינטראקציה עם הפלטפורמה המקורית לביצוע המשימה.