מחשביםתכנות

משדר - הוא ... סוגי מהדרים. המרה ותוכניות שידור

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

מושגים בסיסיים

התוכנית היא ייצוג לשוני של חישובים: i → P → P (i). פרשן הוא תכנית אשר מסופקת תכנית הקלט P וכמה x קלט. היא מבצעת בבית x P: אני (P, x) = P (x). העובדה שיש רק רוסי אחת הוא מסוגל לבצע את כל התוכניות האפשריות (אשר יכול להיות מיוצגת במערכת הפורמלית) היא טיורינג תגלית מאוד עמוק ומשמעותי.

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

כמה סוגים של מתרגמים יש שמות מוזרים מאוד:

  • אסמבלר מתרגמת תוכניות בשפת אסמבלי לשפת מכונה.
  • המהדר מתרגם שפה ברמה גבוהה לשפה תחתונה.

המשדר - היא תוכנית שלוקחת כמו נתוני קלט התוכנית בחלק S השפה מייצרת תוכנית T בצורה כזאת כי לשניהם יש את אותה סמנטיקה: P → X → ש כלומר, ∀x. P (x) = Q (x).

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

המהדר קוד המקור → (מתרגם) → → מאסף קוד הרכבה (קומפיילר) → → קוד מכונה מעבד (מפענחת).

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

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

בשלב תרגום

שידור כולל את השלבים של ניתוח וסינתזה:

מנתח קוד המקור → → → גנרטור ייצוג מושגית (סינתיסייזר) → קוד יעד.

זאת בשל סיבות אלה:

  • כל שיטה אחרת אינה מתאימה. תרגום המילה פשוט לא עובד.
  • פתרון הנדסי טוב: אם אתה רוצה לכתוב מתרגם לשפות מקור M ו- N יעד צריך לכתוב תוכניות M + N פשוטות בלבד (polukompilyatorov) ולא מורכב M × N (כולל של מתרגמים).

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

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

המתרגם שיא

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

ישנם שלושה סוגים של מהדרים:

  • משדר - הוא samokompilyator אם זה מתאים את שפת המקור הבסיסית.
  • מהדר אשר למקד שפה הוא הבסיס, שנקרא samorezidentnym.
  • משדר - מהדר-צלב, אם הוא ממוקד ושפות שונות בסיסיות.

למה זה חשוב?

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

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

בנוסף, אם אתה רוצה לכתוב preprocessors, linkers, מעמיסים, debuggers ו למאבחנים, אתה חייב לעבור אותם שלבים כמו בעת כתיבת מהדר.

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

טכנולוגיה מקיפה

טכנולוגית מהדר מכסה תחומים רבים שונים של מדעי מחשב:

  • התיאוריה הפורמלית של השפה: דקדוק, ניתוח, חישוביות;
  • ארכיטקטורת מחשב:. ערכות הדרכה, RISC או CISC, מחזורי שעון ליבת עיבוד pipelined, וכו ';
  • מושגים של שפות תכנות, למשל, ביצוע בקרת רצף, ביצוע מותנה, איטרציה, רקורסיה, פירוק פונקציונלי, מודולריות, סנכרון,-תכנות מטא, היקף, תתי-סוגים מתמיד, תבניות, סוג הפלט, אבות טיפוס, הסברים, זרימה, מונדות, תיבות דואר, להמשיך בתווים כלליים,, ביטוי רגולרי, זיכרון טרנזקציות, ירושה, פולימורפיזם, הגדרות מצב, וכן הלאה וכו..;
  • בשפות מופשטות ומכונות וירטואליות;
  • אלגוריתמי נתוני מבנים: ביטויים רגולריים, אלגוריתמי ניתוח, אלגוריתמי גרפיקה, תכנות דינמי, הכשרה;
  • שפות תכנות: תחביר, סמנטיקה (סטטי ודינמי), פרדיגמות תמיכה (מבנית, OOP, פונקציונלית, הגיונית, מחסנית, הקבלה,-תכנות meta);
  • תוכנת יצירה (מהדרים, בדרך כלל גדולים ומורכבים): לוקליזציה, במטמון, componentize, API ממשקים, שימוש חוזר, סנכרון.

עיצוב מהדר

חלק מהבעיות שנתקלו בהם פיתוח של המתרגם האמיתי:

  • בעיות עם שפת המקור. האם זה קל לקמפל אותו? האם יש Preprocessor? איך הם סוגים? האם יש בספרייה?
  • קיבוץ עובר מהדר: יחיד או כיווני רב?
  • מידת אופטימיזציה רצויה. תוכניות שידור מהירות טמאות עם אופטימיזציה מעט או ללא יכול להיות נורמליות. מהדר יתר אופטימיזציה יאט, אבל קוד טוב יותר בזמן הריצה עשוי להיות שווה את זה.
  • במידה הנדרשת של איתור שגיאות. רק מתרגם יכול לעצור את השגיאה הראשונה? כשזה צריך להפסיק? אם לסמוך על תיקון שגיאות מהדר?
  • הזמינות של כלים. אם השפה המקורית אינה קטנה מאוד, מנתחי סורק גנרטור נדרשים. ישנם גם גנרטורים, גנרטורים קוד, אבל הם לא כל כך נפוצים.
  • סוג של קוד היעד להיווצר. ייבחר מתוך קוד מכונה בתוספת או ווירטואלי טהור. או פשוט לכתוב חלק כניסה שיוצר ייצוג ביניים פופולרי כגון LLVM, RTL, או JVM. או לבצע תרגום של המקור בקוד המקור ב- C או JavaScript.
  • הפורמט של קוד היעד. אתה יכול לבחור שפת אסמבלי, קוד מחשב נייד, תמונת זיכרון קוד מכונה.
  • קהל יעד חדש. כאשר הקבוצה של גנרטורים טובה שיש חלק כניסה משותפת. מסיבה זו עדיף יש גנרטור אחד עבור הקלט של חלקים רבים.

אדריכלות מהדר: רכיבים

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

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

בנוסף, שימוש מנהל משנה איתור שגיאות ושולחנות סמל.

ניתוח לקסיקלי (סריקה)

הסורק ממיר את התווים זרמו מקור לזרם של אסימונים, הסרת רווח לבנה, הערות מאקרו מתרחבת.

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

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

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

ניתוח (ניתוח)

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

שגיאות שנמצאו בשלב זה נקראים תחביר. לדוגמה:

  • K = 5 * (7 - y;
  • j = / 5;
  • 56 = x * 4.

ניתוח סמנטי

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

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

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

דור

דור קוד ביניים מייצר גרף זרימה מורכב tuples, מקובצים בלוקים בסיסיים.

דור קוד מייצר קוד מכונה אמיתי. בשנת מהדרים מסורתיים בו במכונות RISC על המדרגה הראשונה, אתה יוצר מאסף עם מספר אינסופי של מרשמי ווירטואלי. עבור מכונות CISC כנראה לא יקרה.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 iw.delachieve.com. Theme powered by WordPress.