פרסומת

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

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

קובץ קוד

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

מצביעים

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

instagram viewer
יחידת עיבוד מרכזית או מעבד לתפקוד מהו מעבד ומה הוא עושה?ראשי תיבות מחשוב מבלבלים. מה בכל זאת מעבד? והאם אני זקוק למעבד מרובע או כפול ליבות? מה דעתך על AMD, או אינטל? אנחנו כאן כדי לעזור להסביר את ההבדל! קרא עוד . זה ידוע בשם קוד המכונה.

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

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

מצביעים

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

  • בסיסי
  • C ++
  • ליספ

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

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

ניהול זיכרון

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

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

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

נניח שיש לך משתנה:

int myNumber;

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

"מצא קצת זיכרון ריק, ושמור מקום גדול מספיק בכדי לאחסן מספר שלם"

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

כעת הקצה ערך למשתנה שלך:

myNumber = 10;

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

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

מצביעים

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

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

מתמטיקה בפונקציה () {int firstNumber = 1; } int secondNumber = 2; הדפס (firstNumber + secondNumber); // לא יעבוד

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

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

הזן: מצביעים.

מצביעים

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

הבה נבחן כיצד מוקצים משתנים בערימה:

מספר מספר int = 1; int numberTwo = numberOne;

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

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

מספר מספר int = 1; int numberTwo = & numberOne;

עכשיו ה מספר שתיים משתנה נקודות למיקום זיכרון, במקום לקבל את המספר הראשון שהועתק למיקום הזיכרון החדש שלו. אם היית מפיק משתנה זה, הוא לא יהיה המספר הראשון (למרות שהוא מאוחסן במיקום הזיכרון). זה יפיק את מיקום הזיכרון שלו (כנראה משהו כמו 2167, אם כי זה משתנה בהתאם למערכת, ו- RAM זמין). כדי לגשת לערך המאוחסן ב מצביע, במקום למיקום הזיכרון, עליך לעשות זאת התקרבות המצביע. זה ניגש ישירות לערך, שיהיה המספר הראשון במקרה זה. כך אתה מפנה מצביע:

int numberTwo = * numberOne;

ה מפעיל התערבות הוא כוכבית (*).

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

  • ה כתובת של מפעיל (&) מאחסן את כתובת הזיכרון.
  • ה מפעיל התערבות (*) ניגש לערך.

התחביר משתנה מעט כשמכריזים על מצביעים:

int * myPointer;

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

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

מצביעים

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

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

מצביעים

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

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

מצביעים

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

זהו זה להיום. אני מקווה שלמדת משהו מועיל בנושא מורכב. כמובן שלא סיקרנו את כל מה שיש לדעת - זה נושא מורכב מאוד. אם אתם מעוניינים ללמוד עוד, אני ממליץ בחום C ++ תוך 24 שעות.

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

האם למדת איך מצביעים עובדים היום? האם יש לך טיפים וטריקים שאתה רוצה לחלוק עם מתכנתים אחרים? קפוץ לתגובות ושתף את מחשבותיך למטה!

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