[Powered by Google Translate] ROB אודן: בואו ידבר על מהדרים. עד לנקודה זו, יש לך רק הקליד את קוד המקור שלך לתוך כמה קבצים, שלחו אותם דרך התיבה שחורה הגדולה שהיא קלאנג, והכול יבוא על קובץ ההפעלה שלך שעושה בדיוק מה שכתבת בקוד המקור שלך. כקסום כפי שהיה, אנחנו הולכים לקחת קרובים להסתכל על מה שקורה בפועל כאשר אנו עורכים קובץ. אז מה זה אומר לקמפל משהו? ובכן, במובן הכללי ביותר, זה רק אומר קוד הפיכה נכתב באחד שפת תכנות למשנו. אבל בדרך כלל כשאנשים אומרים שהם לקמפל משהו, הם אומרים שהם לוקחים את זה מתכנות ברמה גבוהה יותר שפה לשפת תכנות ברמה נמוכה יותר. אלה אולי נראים כמו מונחים מאוד סובייקטיביות. לדוגמה, סביר להניח שאתה לא חושב על C כגבוה שפת תכנות ברמה, אבל אתה לקמפל אותו. אבל זה הכול היחסי. כפי שנראה, קוד ההרכבה וסופו של דבר מכונה קוד שאנו עורכים אל הוא ללא ספק ברמה נמוכה מ ג למרות שאנחנו משתמשים בי קלאנג בהפגנה של היום, הרבה מהרעיונות כאן לשאת מעל למהדרים אחרים. לקלאנג, ישנם ארבעה שלבים עיקריים בכללי הידור. אלה הם אחד, preprocessing נעשה על ידי preprocessor; שתיים, הידור נעשה על ידי המהדר, שלוש, הרכבה נעשה על ידי המאסף, וארבעה, קישור נעשה על ידי המקשר. זה יכול להיות מבלבל, כי אחד מsubsteps של כללי מהדרי צלצול נקראים מהדרים, אך אנחנו עוד נגיע לזה. אנחנו נהיה באמצעות תכנית שלום עולם פשוטה כדוגמא שלנו לאורך כל הסרטון. בואו נעיף מבט. השלב הראשון הוא שלב עיבוד מוקדם. מה preprocessor עושה? בכמעט כל תכנית C שאי פעם קראו או בכתב, אתה השתמשת שורות קוד שמתחילות בחשיש. אני אקרא לו חשיש, אבל אתה יכול גם לקרוא לזה ק"ג, מספר לחתום, או חדה. כל קו כזה הוא הוראת preprocessor. בטח כבר ראה # # להגדיר וכוללים בעבר, אבל יש הנם עוד כמה שpreprocessor מכיר. בואו נוסיף לדוגמא # define שלום העולם שלנו. עכשיו בואו לרוץ רק בעיבוד המוקדם בקובץ זה. על ידי העברת clage דגל הדואר, אתה מורה לה להפעיל רק בעיבוד המוקדם. בואו לראות מה קורה. זה נראה כמו קלאנג פשוט יורק את הכל בשורת הפקודה. כדי לשמור את כל פלט זה לקובץ חדש בשם hello2.c, אנחנו נצרף> hello2.c לפקודה שלנו. עכשיו בואו נסתכל על קובץ המעובד שלנו. וואו, מה קרה לתכנית קצת הקצרה שלנו? אם נלך כל הדרך עד לתחתית של קובץ זה, נראה חלק מהקוד שכתבנו בפועל. שים לב ש# להגדיר נעלם וכל המופעים של שם הוחלף בדיוק מה שאנחנו מצוינים ב # להגדיר קו. אז מה הם כל אלה typedefs והצהרות פונקציה בחלק העליון של הקובץ? שים לב ש# להגדיר לא היה בעיבוד המוקדם בלבד הוראה שצוינו. אנחנו גם # שכוללים stdio.h. אז כל הקווים המשוגעים הם בעצם רק העתיק stdio.h ולהדביק את החלק העליון של קובץ זה. זו הסיבה שקבצי כותרת כל כך שימושיים לתפקוד הצהרות. במקום שתצטרך להעתיק ולהדביק את כל הפונקציה הצהרות אתם מתכננים להשתמש בחלק העליון של הקובץ שלך, את preprocessor יהיה להעתיק ולהדביק אותם מהכותרת להגיש לך. עכשיו שאנחנו עושים preprocessing, אנו עוברים על הידור. הסיבה שאנו מכנים אוסף שלב זה היא כי זו הצעד שבו אין למעשה קלאנג הקומפילציה מC כדי קוד הרכבה. כדי שתהיה לי קלאנג לקמפל קובץ למטה להרכבה, אבל תמשיך לא יותר, להעביר אותו הדגל-S בשורת הפקודה. בואו נסתכל על ההרכבה הקובץ שoutputted. זה נראה כמו די בשפה שונה. קוד העצרת הוא מאוד מעבד ספציפי. במקרה זה, שכן CS50 המכשיר פועל על מעבדי x86 וירטואליים, זה קוד ההרכבה x86. מעט מאוד אנשים לכתוב ישירות בקוד הרכבה בימים אלה, אבל כל תכנית C תכתוב פעם מקבלת הפכה למטה להרכבה. שוב, אנו קוראים לצעד זה הידור C להרכבה מאז אנחנו הולכים מרמה גבוהה לרמה נמוכה יותר שפת תכנות. מה עושה את רמת הרכבה נמוכה מג'? ובכן, בהרכבה, אנחנו מאוד מוגבלים במה שאנו יכולים לעשות. אין אם ', ואילו, ולקבל תמורתו, או לולאות מכל סוג. אבל אתה יכול להשיג את אותם דברים ששליטתם מבנים מציעים שימוש בפעולות המוגבלות ש הרכבה אינה מספקת. אבל כדי לראות בדיוק איך הרכבת רמה נמוכה באמת, בואו נלך צעד אחד קדימה באוסף שלנו, הרכבה. זה התפקיד של המאסף להפוך את קוד ההרכבה לאובייקט או קוד מכונה. זכור שהמאסף לא הרכבת פלט; ולא, זה לוקח בהרכבה וקוד מכונים תפוקות. קוד מכונית הוא 1 של 0 בפועל ושל שמעבד יכול תבין, למרות שעדיין יש לנו מעט מעבודה שנשארה לפני שנוכל להפעיל את התכנית שלנו. בואו להרכיב קוד ההרכבה שלנו על ידי העברה קלאנג הדגל-C. עכשיו בואו לראות מה יש בקובץ כנס. ובכן, זה לא יעזור לנו מאוד. זכור כי קוד המכשיר הוא את אלה ואפסים ש המחשב שלך יכול להבין. זה לא אומר שזה קל לנו להבין. אז איך בדיוק ברמה נמוכה היא הרכבה? זה כמעט זהה לקוד יעד. הולך מאסיפה לקוד יעד הוא הרבה יותר של תרגום משינוי, ולכן אחד לא יכול לשקול את המאסף ל לעשות את כל ליקוט בפועל. למעשה, זה די קל באופן ידני כדי לתרגם מ הרכבה לקוד מכונה. כאשר מסתכלת על ההרכבה לתפקיד ראשי, שהשורה הראשונה קורה למתאים ל0x55 הקסדצימליים. בינארי, זה 1010101. הקו השני שקורה לי מתאים 0x895 הקסדצימלי. ולמחרת, 0x56. קבל שולחן פשוט יחסית, אתה יכול לתרגם הרכבה לקוד שמכונה יכול להבין יותר מדי. אז יש צעד אחד שנשאר ב אוסף, שקישור. קישור משלב חבורה של קבצי אובייקט לתוך קובץ אחד גדול כי אתה בעצם יכול לבצע. הקישור הוא מאוד תלוי מערכת. אז הדרך הקלה ביותר להשיג קלאנג רק כדי לקשר אובייקט קבצים ביחד הוא להתקשר קלאנג על כל הקבצים ש אתה רוצה לקשר יחד. אם תציין. קבצי o, אז זה לא צריך לעבד מחדש, לקמפל, ולהרכיב את כל קוד המקור שלך. בואו נזרוק פונקצית מתמטיקה לתוך הקובץ שלנו, כך שיש לנו משהו לקשר פנימה עכשיו בואו לאסוף אותו חזרה לקוד יעד ו קורא קלאנג על זה. אופס. מכיוון שאנו כלל פונקצית מתמטיקה, אנחנו צריכים לקשר ב ספריית המתמטיקה עם lm. אם אנחנו רוצים לקשר בין חבורה של קבצים. O שאנחנו כתב בעצמנו, אנחנו פשוט לציין את כולם ב שורת פקודה. ההגבלה היא שרק אחד מהקבצים הללו חייבים למעשה לציין פונקציה עיקרית, או אחר הפעלת כתוצאה לא יודעת איפה להתחיל להריץ הקוד שלך. מה ההבדל בין ציון קובץ לקישור ב ב- l ורק לציין קובץ ישירות? שום דבר. זה רק קלאנג שקורה לדעת בדיוק מה קובץ כמו LM-קורה משהו להפנות אליו. אם היית יודע שקובץ בעצמך, אתה יכול לציין את זה באופן מפורש. רק תזכור שדגלים כל הליטר צריכים לבוא בסוף הביקוש של הלקוח שלך. וזה כל מה שיש בו. כאשר אתה פשוט להפעיל קלאנג בקבצים מסוימים, זה מה שזה בעצם עושה. השם שלי הוא רוב אודן, וזה CS50.