
.class.הטקסט המלא של הדקות הראשונות בהרצאה «מושגי יסוד בשפת ג'אווה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו מגיעים למונחים בסיסיים בשפת ג'אווה ובמערכת עצמה של שפת ג'אווה. דבר ראשון, Operating System, OS, מערכת הפעלה.
זה בעצם התוכנה שמותקנת לראשונה במחשב, מנהלת את החומרה של המחשב ומאפשרת לתוכנות אחרות להיות מותקנות, לרוץ, היא מנהלת אותן, מאפשרת להן להשתמש עם ה-facilities של המחשב, עם כל החומרה של המחשב.
שלושת מערכות ההפעלה הגדולות שיש היום בעולם הן Windows, Linux ו-MacOS. יש עוד מערכות הפעלה חוץ מהן. Central Processing Unit, CPU.
זה בעצם המעבד של המחשב. זה בעצם היחידה במחשב שמריצה את התוכנות שאנחנו כותבים. ככה היא נראית. Source Code.
Source code זה הקוד שאנחנו כותבים בשפת התכנות. הרבה פעמים מתייחסים אליו פשוט בתור קוד. הנה לדוגמה קטע קוד בשפת Java שמדפיס את השם Hello או את הטקסט Hello על המסך.
Machine code, קוד מכונה. קוד מכונה זה שפה שבנויה אך ורק ב-0 ו-1' שהיא בעצם נכנסת ל-CPU וה-CPU, ה-Central Processing Unit, המעבד של המחשב יודע לקרוא אותה ולהוציא לפועל את מה שכתוב בשפה הזאת.
ה-CPU מכיר אך ורק Machine Code וזה הדבר היחידי שהוא יכול לקבל בתור input, בתור קלט, ולהוציא אותו לפועל. זה הדבר היחידי שהוא מבין.
אז יש לנו פה את הקוד מכונה שפשוט אנחנו מכניסים אותו לתוך ה-CPU וה-CPU קורא אותו ומוציא אותו לפועל. צריך בעצם ה-source code שאנחנו כותבים בסופו של דבר מתורגם ל-0 ו-1 עם הקוד המכונה בשביל שהוא ייכנס ל-CPU ויצא לפועל על ידי ה-CPU.
Machine code compiler מהדר בעברית. Machine code compiler זה מנגנון שמה שהוא יכול לעשות זה לקחת את ה-source code שלנו ופשוט להפוך אותו לקוד מכונה. כל מיני שפות ידועות בעולם שעובדות עם קומפיילר כזה הן Fortran, Pascal, C, C++ ויש עוד הרבה אחרות.
אז הנה לדוגמה קטע קוד ב-C++ ואנחנו פשוט לוקחים את קטע הקוד הזה, מכניסים אותו ל-Machine Code Compiler של C++, שהוא יודע לקחת קוד של C++ ולהפוך אותו לקוד מכונה וזה כמובן יכול להיכנס לאחר מכן ל-CPU, לרוץ אבל קיימת בעיה עם Machine Code Compiler איזה בעיה קיימת עם הסוג של הקומפיילר הזה
כל מיני מערכות הפעלה מדברות טיפה שונה עם ה-CPU זאת אומרת שה-CPU עצמו מושפע ממערכות ההפעלה השונות ולכן מכיר קוד מכונה שהוא קצת שונה בין מערכת הפעלה אחת למערכת הפעלה אחרת אז הקוד מכונה שאמור להיכנס ל-CPU הוא שונה בין מערכת הפעלה אחת למערכת הפעלה אחרת, אפילו שה-source code עצמו הוא אותו ה-source code.
Windows לדוגמה מכירה סוג אחד של קוד מכונה ומתקשרת איתו, לינוקס מכירה סוג טיפה אחר ומאק מתקשרת עם סוג טיפה אחר של קוד מכונה. אז אם יש לנו קטע קוד שכתבנו, או אפליקציה למעשה, תוכנה שכתבנו אותה ב-C++, ואנחנו מכניסים אותה לתוך Machine Code Compiler של C++ אבל ה-Machine Code Compiler הזה רץ על Windows כי אנחנו
בעצם רצים על Windows אז ה-Compiler הזה יתרגם את הקוד מכונה, סליחה, את ה-Source Code ל-Machine Code שמסוגל לרוץ רק על Windows.
ואם אנחנו לוקחים את אותו ה-Source Code שלנו ומריצים אותו על קומפיילר של לינוקס, אז אנחנו נקבל קוד מכונה שמסוגל לרוץ רק על לינוקס ורק לינוקס מכיר את הקוד המכונה הזה.
אותו הדבר מתרחש עם macOS, אם אנחנו מפתחים איזושהי תוכנה, במקרה הזה c++ ומריצים אותה על קומפיילר של macOS אז הקומפיילר יהפוך את ה-source code שלנו לקוד מכונה שמסוגל לרוץ אך ורק על macOS.
ולכן אם אנחנו לוקחים c++ ומריצים אותה על קומפיילר של Windows אנחנו נקבל קוד מכונה של Windows ואנחנו לא נוכל להריץ את קוד המכונה הזה לא על Linux ולא על Mac OS. אם אנחנו נבצע את אותו הדבר על Linux הקומפיילר של Linux ייצר קוד מכונה שמתאים אך ורק ללינוקס ואנחנו לא נוכל להריץ אותו על Windows או על Mac OS.
ואם אנחנו ניקח את ה-thrive code שלנו ונפתח על Mac OS, הקומפיילר יהפוך את זה לקוד מכונה של Mac OS ואנחנו לא נוכל להריץ אותו על Windows ולא על Linux.
אז זה בעצם יוצר לנו בעיה מאוד חמורה כי אנחנו רוצים לכתוב פעם אחת ושנוכל להריץ את הקוד שלנו על כל מערכת הפעלה ולא משנה לנו איזה מערכת הפעלה במקרה יש אצל הלקוח שלנו.
אנחנו רוצים שכל הלקוחות שלנו יוכלו ליהנות מהתוכנות שאנחנו כותבים. אז מה בעצם הפתרון לכל הסיפור הזה? בייט קוד. בייט קוד זה ייצוג לול-לבל של הקוד שאנחנו כותבים, ה-source code שלנו.
לפעמים מתייחסים לזה בתור intermediate code, כלומר קוד ביניים. זה לא machine code, זה בעצם סוג של קוד ביניים בין ה-source code שאנחנו כותבים, לדוגמה ב-FAT Java, לבין המשין קוד הסופי שאמור להיכנס ל-CPU אבל ה-CPU עצמו לא יכול להבין את הבייט קוד הזה ולא יכול לקרוא אותו ולא יכול להוציא
אותו לפועל. הנה לדוגמה מצב שבו יש לנו source code ב-Java ואנחנו רוצים להוציא ממנו את אותו בייט קוד שפחות או יותר ככה הוא נראה בכדי לפתור את הבעיה שדיברנו עליה לפני זה.
אז יש דבר שנקרא בייטקוד קומפיילר. בייטקוד קומפיילר זה מנגנון שמסוגל לקחת את הסורס קוד שלנו ולייצר ממנו את הדבר המוזר הזה שנקרא בייטקוד, את הקוד הביניים הזה.
לפעמים בייטקוד קומפיילר נקרא בילדר. שפות ידועות שעובדות עם סוג כזה של קומפיילר הן csharp, vb.net, פייתון, php וגם שפת Java וכמובן יש עוד הרבה אחרות.
אז יש לנו את הקטע קוד שאנחנו כותבים ב-FAT Java ואנחנו מכניסים אותו לבייט קוד קומפיילר ולא משין קוד קומפיילר, זה סוג של קומפיילר אחר, בהקשר הזה זה נקרא בילדר והוא מוציא לנו את הבייט קוד הזה, הייצוג הנמוך הזה של ה-Solve code שאנחנו כותבים.
אבל איך הדבר הזה נכנס בסופו של דבר ל-CPU בשביל להוציא לפועל את הפקודות? אז קודם כל יש משהו שנקרא Java בייט קוד, וזה בעצם הבייטקוד שנוצר בשפת Java. הסורס קוד שלנו כתובים בקבצים עם סיומת Java.
Java בייטקוד קומפיילר נקרא JavaC, או בקיצור JavaC. הבייטקוד שנוצר על ידי JavaC, הקומפיילר של Java, נקרא Java בייטקוד.
Java בייטקוד הזה מאוחסן בקבצי .class. אז יש לנו לדוגמה את הסורס קוד שלנו שאנחנו עובדים איתו. יש לנו לדוגמה קובץ שנקרא גריטר נקודה ג'אווה שבו אנחנו כותבים פונקציה, יש כמובן עוד הרבה דברים אחרים בקובץ הזה בסוס קוד אבל לצורך הפשטות כתבנו איזשהו קטע קוד שמציג הלו
על המסך ואנחנו מכניסים אותו לתוך ג'אווה סי, ג'אווה קומפיילר והוא מוציא את הגריטר נקודה קלאף שמכיל את הג'אווה בייט קוד. ואיך הדבר הזה פותר לנו את הבעיה?
אינטרפרטר. אינטרפרטר הוא בעברית פרשן ומנגנון שמסוגל לקרוא את הבייט קוד בזמן הריצה ולתרגם אותו בזמן הריצה למאשין קוד וכך הוא יכול להכניס פקודה פקודה לתוך ה-CPU.
אז יכול להיות אינטרפרטר לכל מערכת ההפעלה. יש אינטרפרטר מסוימים שקיימים ממש לכל מערכת ההפעלה ויש אינטרפרטר אחרים של שפות אחרות שקיימים עבור חלק ממערכות ההפעלה. אז יש לנו את ה-Java bytecode ואנחנו מכניסים אותו ל-interpreter זה כמובן מתבצע בזמן הריצה של התוכנית וה-interpreter הזה מוציא קוד מכונה שמותאם ל-CPU.
אז הבעיה נפתרת בצורה הזאת אנחנו כותבים פעם אחת את הקוד לדוגמה בשפת Java שלנו אנחנו מכניסים את זה ל-Builder או ל-Java Compiler אנחנו מקבלים את קבצי הדוט קלאס שמכילים את ה-Java bytecode ואז אנחנו מכניסים את זה כתלות במערכת ההפעלה לאינטרפרטר המתאים.
אם אנחנו כרגע מריצים את זה על מערכת ההפעלה Windows אז במערכת ההפעלה Windows יושב אינטרפרטר שמתאים ל-Windows והאינטרפרטר הזה מוציא לנו on the fly תוך כדי הריצה קוד מכונה שמתאים ל-Windows וכך התוכנה שלנו יכולה לרוץ על Windows.
אבל אם אנחנו נמצאים על לינוקס, אז על לינוקס רץ אינטרפרטר שמכיר את לינוקס, ותוך כדי הריצה מוציא קוד מכונה שמתאים ללינוקס, וכך התוכנה שלנו יכולה לרוץ גם על לינוקס.
ואם אנחנו נרצים על Mac OS, אותו הדבר, יושב