6 minute read

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

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

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

צ’אט עם המחשב

פעם, מזמן, המחשב לא סיפק לנו ממשק שהוא ויזואלי באותה מידה שהוא היום. פעם, כל מה שהיה לאנשים כדי לתקשר עם מחשב, היה חלון הטרמינל (terminal) – מה שידוע גם כ”שורת הפקודה” (command line). זה היה דומה לצ’אט עם המחשב – היו מקלידים לו, “שולחים”, והמחשב היה עונה. ההקלדה של המשתמש הייתה הקלט, המחשב היה חושב, עושה דברים (עיבוד), ומציג את התשובה שלו – פלט. מכאן, אנחנו מקבלים את אחת הצורות העיקריות לחשוב על “מהי תוכנה” – תוכנה, לפי צורת החשיבה הזו, מורכבת מקלט, עיבוד, ופלט (לאו דווקא בסדר הזה, אגב, ולאו דווקא כל אלה).

(זו לא דוגמה אמיתית מהחיים שלי כי אני חי במאה ה-21 ומשתמש באפליקציות מודרניות כדי לרשום דברים)

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

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

זה גם המקום לומר שכדי להתחיל, אני ממליץ להתקין JDK מכאן, ואז להתקין IntelliJ IDEA ולהתחיל עם המדריך כאן כדי לפתוח פרויקט Java ב-IntelliJ ולהריץ אותו. כשנרצה להתחיל לתכנת קוד לרובוט נצטרך להתקין את WPILib, שכוללת התקנה נפרדת ל-Java וכן מהדורה מיוחדת של WPI לסביבת העבודה Visual Studio Code. מי שממש תרצה לחסוך כל גיגה-בייט על המחשב יכולה להתקין רק את WPILib ולעבוד “רק” עם ההתקנה הנפרדת ל-Java שמגיעה איתו, אבל למי שלא, אני ממליץ על להתקין את JDK ואת IntelliJ IDEA בלי קשר. מדריך להתחלת העבודה ב-Java עם Visual Studio Code אפשר למצוא כאן - זה אמנם מתייחס לגרסה ה”כללית” של Visual Studio Code ולא לזו של WPI אבל לא אמור להיות הבדל מהותי.

שלום עולם

אז שלושת הדברים הבסיסיים העיקריים שאנחנו רוצים לדעת לעשות ב-Java הם פלט, עיבוד וקלט. נתחיל בפלט. המסורת בעולם התכנות, היא שכאשר ניגשים ללמוד תכנות, למשל בשפת תכנות שאנחנו מתחילים ללמוד, הדבר הראשון שנרצה ללמוד לעשות הוא להציג כפלט את ההודעה “Hello, World!”. באיזה מדריך שזה לא יהיה שבחרתן למעלה (Visual Studio Code או IntelliJ IDEA), ודאי הרצתן בו קוד שדומה לקוד הבא:

package learning_java.hello_world; 
public class HelloWorld {
    public static void main(String[] args) { 
        System.out.println("Hello, world!");
    }
}

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

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

כאמור, כעת, הקוד שלנו, מבחינתנו, הוא שורה אחת בלבד:

System.out.println("Hello, world!");

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

System.out.println(/* something */);

כאשר במקום /* something */ יבוא מה שנרצה להדפיס, במקרה שלנו “Hello, world!”. המשמעות של System.out.println היא פקודה שאומרת “את זה, צריך להדפיס”.

מה זאת אומרת “להדפיס”? ציינו קודם שאנחנו עובדים כרגע במודל שבו המחשב מדבר איתנו כמו בצ’אט, ושמה שהמחשב כותב לנו הוא הפלט שלנו. “הדפסה” כאן היא כתיבה לפלט. למה זה נקרא “הדפסה”? כנראה שהאסוציאציה מגיעה ממכונות כתיבה. אז הפקודה System.out.println(/* something */); אומרת “להדפיס את מה שיש בסוגריים”.

ומה אנחנו מדפיסים? אנחנו מדפיסים את הטקסט “Hello, world!”. הטקסט נמצא במרכאות. המרכאות הן לא חלק מהטקסט, אלה מה שמסמן ל-Java איפה הטקסט מתחיל ונגמר. דבר כזה ב-Java נקרא String (מחרוזת).

אוקיי, זה לקח קצת זמן, אבל בתקווה, הבנו את תוכנית ה”שלום, עולם” שלנו. כעת, בואו נשנה אותה מעט. החליפו את הקוד של ה-main בקוד הבא:

System.out.print("Hello, ");
System.out.println("world!");

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

מהן שתי הפקודות שלנו? באחת אנחנו מבצעים System.out.print עם הטקסט “Hello, “, ובשניה, אנחנו מבצעים System.out.println עם הטקסט “world!”. התוצאה זהה למה שהיה לנו קודם – הטקסט “Hello, world!” מודפס למסך, אבל הפעם, זה מתבצע בשתי פקודות.

בנוסף, נשים לב שבאחת יש לנו print ובאחת println. מה ההבדל? println מבצעת הדפסה של הטקסט ואחריה ירידת שורה, בעוד print מדפיסה את הטקסט בלבד. נסו להחליף את ה-print ב-println ולהריץ את הקוד ולראות מה ההבדל שנגרם.

בנוסף, ניתן לכתוב פקודת println בלי כלום בסוגריים:

System.out.println();

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

System.out.print();

לסיום, נסו להריץ את הקוד הבא, ולהבין למה הוא מדפיס מה שהוא מדפיס.

System.out.print("*");
System.out.println();

System.out.print("*");
System.out.print("*");
System.out.println();

System.out.print("*");
System.out.print("**");
System.out.println();

נקודות עיקריות

  • התחלנו ללמוד Java מלהגיד “שלום, עולם!” (כי… כי כך נהוג)
  • Java מאפשרת לנו לספק פלט על ידי “הדפסה”
  • System.out.print ו-System.out.println משמשות להדפסה ב-Java
  • ב-Java יש מחרוזות (String) - אלמנט בקוד שהמשמעות שלו הוא טקסט. אפשר לכתוב אחד על ידי שימוש במרכאות.
  • לבינתיים, עלינו להתעלם ממה ש”מסביב” לצמד הסוגריים המסולסלים הפנימיים, ואנחנו מתרכזים ב-main (התכנית הראשית), שנמצאת ביניהם.

Comments