לאחר כתיבת המאמר הראשון על כיצד ליצור מערכת הפעלה משלךמישהו אמר לי אם אוכל לעשות מאמר בנושא כיצד ליצור שפת תכנות. בהתחלה לא שמתי לב הרבה, אבל עכשיו ובמובנים אחרים למדתי הרבה יותר על יצירת שפות תכנות. אז בואו נעשה שפת תכנות בסיסית, ניתן להטמעה בקלות בתוכניות אחרות ושעובד עם מכונה וירטואלית אותה אנו גם נעצב. היום עלינו ליצור את המכונה הווירטואלית הבסיסית ביותר.
אתה בטח תוהה: «מכונה וירטואלית? אבל האם זה לא מאוד קשה והאם זה גם מאט את התוכניות? " לעומת זאת, מכונה וירטואלית פשוטה היא מאוד פשוטה ומהירה יחסית. בחרתי חלודה כשפה למכונה הווירטואלית. אבל מה זה חלודה?
חלודה מתקין ב לינוקס בצורה פשוטה. עם זאת, אין חבילה רשמית. משתמשים של אובונטו אתה יכול להוסיף את שני אלה PPA: ppa: hansjorg / חלודה y ppa: cmrx64 / מטעןמשתמשים של קשת יכול להשתמש AUR (מטען-גיט היא החבילה שמתקינה הכל). השאר יכולים להשתמש ב:
curl -s https://static.rust-lang.org/rustup.sh | sudo sh
איך עובדת מכונה וירטואלית?
אם אתה יודע איך עובד עולם המאספים זה בדיוק אותו הדבר, עם הערימה או הערימה. אם לא, אסביר לך את זה. בואו נדמיין את הקוד הבא:
הדפס 2 + 3
המחשב אינו מבין מה פירוש 2 + 3, וגם אינו יודע באיזה סדר יש לעקוב. מחשבים עובדים עם סוללות או ערימות שבהן הנתונים נצברים ונשלפים ברציפות. קוד זה במכונה הווירטואלית שלנו צריך להראות בערך כך:
לדחוף 2 לדחוף 3 להוסיף הדפסה
בעיקרון היינו שמים את 2 על הערימה מעל, את 3 גם כן. ADD היה מושך (כלומר מסיר אותו מהערימה ומקבל את ערכו) בשני הפריטים האחרונים בערימה ומוסיף את התוצאה לראש הערימה. PRINT היה לוקח את הפריט האחרון בערימה ומשתמש בו כדי להציג אותו בפנינו. עכשיו בואו נעשה את זה ב חלודה.
ראשית עלינו להגדיר שפה עבור ה- קוד בתיםנוכל להשתמש בקיים קיים כמו זה שבתוכו Java או CLR של .NET / מונו, אבל אנחנו הולכים ליצור אחד בסיסי יותר.
https://gist.github.com/a01de8904fd39a442c20
אנו משתמשים בסימון הקסדצימלי לכל הוראה. גבוה שמנו # [נגזר (מ- Primitive)], הוא ייחוד של חלודה וזה יעזור לנו בהמשך להיות מסוגלים להשוות את המניין עם בתים באופן ישיר.
עכשיו עלינו לבצע פונקציה שמבצעת כל אחת מההוראות האלה. לשם כך עלינו לקרוא בית ולהשוות אותו להוראות שיש לנו בספירה. אם אתה מוצא כאלה שקיימים, עליך לבצע את הפעולה שלך.
https://gist.github.com/8950ce212a2de2f397f9
אנו עושים זאת כדי לקרוא כל בית בנפרד ולבצע אותם:
https://gist.github.com/12e24a1f0dd65e4cd65d
כפי שאתה יכול לראות, אנו מבדילים אם קיבלנו את פקודת ה- PUSH (הפקודה INTEGER שלנו) לפני כן, הבית הבא יועבר לחלוטין לערימה. שם אנו משתמשים בשתי פונקציות שלא לימדתי אותך, self.pop () y self.push (), אשר כמובן האחראים על הטיפול בערימה.
https://gist.github.com/54147f853a8a2b8c01d9
הם לא מורכבים במיוחד, אך לפונקציית הפופ יש מנגנוני זיהוי שגיאות. למעשה, ב חלודה, אם נסיר את אותם מנגנונים זה היה נותן לנו שגיאת אוסף. עכשיו אנחנו פשוט חייבים להזמין תוכנית פרין (המכונה הווירטואלית שלנו) ולבצע קוד byt.
https://gist.github.com/99b1ab461318b3a644d0
ניתן לקרוא את קוד ה- BYT הזה מקובץ, אך כאן לשם הפשטות שמרתי אותו במשתנה. אם נבצע את זה, זה ייתן לנו את התוצאה הצפויה:
Perin v0.1 Perin VM מבצע FlopFlip bytecode החל מופע PerinVM PerinVM v0.1.0 ערך שלם 5
כל הקוד זמין בכתובת GitHub תחת רישיון אפאצ'י 2.0: https://github.com/AdrianArroyoCalle/perin. כדי לקמפל הם חייבים להיות מטען מותקן ולשים:
charge build && ./target/main
בפרק הבא נראה עוד על שפת התכנות שלנו.
סקרנות מעניינת, למרות שזה לא מאוד שימושי במציאות, זה לא כואב לדעת.
נהדר שאתה מפרסם Rust, זו שפה שמבטיחה הרבה, לא רק שהיא בטוחה יותר מ- ++, אלא (לעת עתה) ברורה יותר בתחביר שלה.
באשר לתצלום, לא אשקול java evolution XD.
ומפרטרן מעולם לא השתמשתי בו, אבל לא שמעתי עליו הרבה דברים טובים ...
אני כן, וזה שימושי במיוחד בהנדסה למרות שפייתון תופס מקום.
פורטרן היא אולי השפה הגדולה האחרת יחד עם ג. עדיין היום בשאלות קריטיות באמת יהיה זה או אחר.
וניתן יהיה להתווכח על כך שפורטרן היא כ'אבולוציה 'של C, כאשר אולי זה צריך להיות הפוך, מכיוון ש- C חדשה יותר, מודרנית יותר ועם אפשרויות רבות יותר; אם כי האחד אינו מנותק מהשני לפחות.
למרות שניתן להתווכח על העמדות הסופיות מנקודת מבט כלשהי.
+1 ל- Java
בוא נראה אם אני אוהב את זה, אני נותן משהו לתכנות אבל בסיסי כדי לראות אם אני מבין יותר.
מה המטרה האמיתית של יצירת שפת תכנות חדשה? נראה לי באופן אישי שמדובר בתחבולה להסתיר את קוד המקור.
חבר, מה קרה להמשך "מערכת ההפעלה שלך"? אל תשאיר את זה שם בבקשה המשך את זה.
למעשה, אתה אדון ורק שני השירים האלה כבשו את תשומת ליבי לחלוטין, אבל לא הייתי רוצה שהם יישארו באמצע הדרך.
אני יודע שרבים מאיתנו חושבים אותו דבר ואנחנו מחכים להמשך ולמסקנות של הנושאים המעניינים האלה.
מעניין מאוד, תודה רבה. 🙂
אני לא רואה בג'אווה שפת תכנות, אלא מתורגמן לפקודה, מכיוון שהיא אינה ניתנת לביצוע
[שפת תכנות היא שפה רשמית שנועדה לבטא תהליכים שניתן לבצע על ידי מכונות כגון מחשבים.]
מסיבה זו, ג'אווה היא שפת תכנות. אפילו שפת הבאש (שפת מעטפת לינוקס) היא שפת תכנות בפני עצמה.
ישנם שני סוגים של שפות:
- מלוקט
- פירשתי
- מעורב (מכונות וירטואליות, הספריות המקומיות נערכות והקוד הפונקציונלי מתפרש)
המתורגמנים מאוד שימושיים כשמדובר בריבוי צורות ואין להם ביצועים הרסניים בשביל זה. Java, VB.NET, C ++ .NET, F #, C # הן שפות מעורבות. השפה הבאסית, העטלף, ה- PHP, ה- Javascript ועוד רבות אחרות הן שפות המתפרשות.
אם אינך מחשיב את Java כשפה מכיוון שהיא מתפרשת (שהיא אינה), אין לשקול שפות רבות אחרות המשמשות להכנת תוכניות. יתר על כן, על פי כלל זה של שלושה, אין לשקול כי קיימת שפת תכנות פרט לשפת המכונה עצמה.
ולמה לא? אפילו שפת מכונה לא יכולה להיחשב לשפה מכיוון שהיא באמת רק קבוצה של פקודות ש"מפורשות "על ידי המעבד.
מכיוון שלמעשה, כל השפות אינן אלא מערך פקודות המתפרש על ידי מעבד.
יתכן שתאהב שפה פחות או יותר (ג'אווה, במקרה זה), נראית פחות או יותר שימושית וחזקה, אך לומר שהיא איננה שפת תכנות מכיוון שהיא אינה מורכבת ... זה מנוגד לכל הגדרות שפת התכנות.
אני מקווה שלא נראה לי גס יותר מדי
אין שקט הרסת רק את חיינו
חחחחחח, פרדואון. זו לא הייתה הכוונה שלי xD
java היא שפת תכנות. מכיוון שאתה יכול לפתח יישום וכשאתה קומפילציה אתה יוצר .jar שמתפרש על ידי ה- JVM. אז על פי הגיון הפיתון שלך הוא גם לא מתפרש, אלא הוא מתכנס למבצעים שונים ...
מידע טוב מאוד
מידע טוב אך יש לי ספק, ניתן יהיה ליצור שפת תכנות חדשה מאפס מבלי להסתמך על אנלוגיות או תוכנות אחרות. אני מדבר באותו אופן ששפות אחרות נוצרו כמו Java או HTML.
אודה מאוד לעזרתך בשאלה זו.