צור שפת תכנות משלך (I)

האבולוציה של שפות התכנות

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

אתה בטח תוהה: «מכונה וירטואלית? אבל האם זה לא מאוד קשה והאם זה גם מאט את התוכניות? " לעומת זאת, מכונה וירטואלית פשוטה היא מאוד פשוטה ומהירה יחסית. בחרתי חלודה כשפה למכונה הווירטואלית. אבל מה זה חלודה?

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

חלודה מתקין ב לינוקס בצורה פשוטה. עם זאת, אין חבילה רשמית. משתמשים של אובונטו אתה יכול להוסיף את שני אלה 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

בפרק הבא נראה עוד על שפת התכנות שלנו.


השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.

  1.   מטייל דיג'ו

    סקרנות מעניינת, למרות שזה לא מאוד שימושי במציאות, זה לא כואב לדעת.

    נהדר שאתה מפרסם Rust, זו שפה שמבטיחה הרבה, לא רק שהיא בטוחה יותר מ- ++, אלא (לעת עתה) ברורה יותר בתחביר שלה.

    באשר לתצלום, לא אשקול java evolution XD.

    1.    מטייל דיג'ו

      ומפרטרן מעולם לא השתמשתי בו, אבל לא שמעתי עליו הרבה דברים טובים ...

      1.    זועף דיג'ו

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

      2.    ג'ון דיג'ו

        פורטרן היא אולי השפה הגדולה האחרת יחד עם ג. עדיין היום בשאלות קריטיות באמת יהיה זה או אחר.

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

        למרות שניתן להתווכח על העמדות הסופיות מנקודת מבט כלשהי.

    2.    פרנסיסקו דיג'ו

      +1 ל- Java

  2.   פורטארו דיג'ו

    בוא נראה אם ​​אני אוהב את זה, אני נותן משהו לתכנות אבל בסיסי כדי לראות אם אני מבין יותר.

  3.   usergnulinux דיג'ו

    מה המטרה האמיתית של יצירת שפת תכנות חדשה? נראה לי באופן אישי שמדובר בתחבולה להסתיר את קוד המקור.

  4.   יילי דיג'ו

    חבר, מה קרה להמשך "מערכת ההפעלה שלך"? אל תשאיר את זה שם בבקשה המשך את זה.

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

    אני יודע שרבים מאיתנו חושבים אותו דבר ואנחנו מחכים להמשך ולמסקנות של הנושאים המעניינים האלה.

  5.   כריסטיאן דייוויד דיג'ו

    מעניין מאוד, תודה רבה. 🙂

  6.   פרנקו דיג'ו

    אני לא רואה בג'אווה שפת תכנות, אלא מתורגמן לפקודה, מכיוון שהיא אינה ניתנת לביצוע

    1.    מריו דיג'ו

      [שפת תכנות היא שפה רשמית שנועדה לבטא תהליכים שניתן לבצע על ידי מכונות כגון מחשבים.]

      מסיבה זו, ג'אווה היא שפת תכנות. אפילו שפת הבאש (שפת מעטפת לינוקס) היא שפת תכנות בפני עצמה.

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

      המתורגמנים מאוד שימושיים כשמדובר בריבוי צורות ואין להם ביצועים הרסניים בשביל זה. Java, VB.NET, C ++ .NET, F #, C # הן שפות מעורבות. השפה הבאסית, העטלף, ה- PHP, ה- Javascript ועוד רבות אחרות הן שפות המתפרשות.

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

      ולמה לא? אפילו שפת מכונה לא יכולה להיחשב לשפה מכיוון שהיא באמת רק קבוצה של פקודות ש"מפורשות "על ידי המעבד.

      מכיוון שלמעשה, כל השפות אינן אלא מערך פקודות המתפרש על ידי מעבד.

      יתכן שתאהב שפה פחות או יותר (ג'אווה, במקרה זה), נראית פחות או יותר שימושית וחזקה, אך לומר שהיא איננה שפת תכנות מכיוון שהיא אינה מורכבת ... זה מנוגד לכל הגדרות שפת התכנות.

    2.    מריו דיג'ו

      אני מקווה שלא נראה לי גס יותר מדי

      1.    מריה אנטוניטה דה מנואלה קרדנאס דיג'ו

        אין שקט הרסת רק את חיינו

      2.    מריו דיג'ו

        חחחחחח, פרדואון. זו לא הייתה הכוונה שלי xD

    3.    קרלוס דיג'ו

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

  7.   אליאס מונגלוס דיג'ו

    מידע טוב מאוד

  8.   קרלוס ארתורו דיג'ו

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