איסוף זבל (מדעי המחשב) – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
←‏Finalization: שגיאה דקדוקית
תגיות: עריכה ממכשיר נייד עריכה דרך האתר הנייד
HopeIsland (שיחה | תרומות)
הרחבה, עריכה - תיקון של שימוש לא מחייב במושג אובייקט (ההקצאה היא של זכרון, לא של אובייקט).
שורה 1:
{{פירוש נוסף|נוכחי=מושג בתכנות|אחר=דרכי איסוף פסולת|ראו=[[מדרג הפסולת]]}}
'''איסוף זבל''' (באנגלית: '''Garbage collection''') הוא תהליך שבובו סביבת הריצה של [[תוכנית מחשב]] מנקהמשחררת מה[[זיכרוןבאופן אוטומטי מחשב|זיכרון]] אתשהוקצה ה[[אובייקט (מדעי המחשב)|אובייקטים]]דינאמית שאיןואין בהםבו עוד צורך.
 
המנגנון הומצא ויושם לראשונה בשנת 1959 על ידי ג'ון מקארתי עבור שפת [[Lisp]].{{הערה| ג'ון מקארתי, [http://www-formal.stanford.edu/jmc/history/lisp.ps History Of Lisp], [[אוניברסיטת סטנפורד]], 1979}} איסוף זבל נפוץ בשפות תכנות [[תכנות מונחה-עצמים|מונחות-עצמים]] מודרניות כגון [[Java]] ו-[[C Sharp|#C{{כ}}]], וכן בשפות המורצות על ידי [[מפרש (תוכנה)|מפרש]] כמו [[Perl]], {{כ}}[[פייתון (שפת תכנות)|פייתון]], {{כ}}[[PHP]] ו-[[JavaScript]]. יש שפות כגון [[עדה (שפת תכנות)|עדה]] ו[[D (שפת תכנות)|שפת D]] (ובמידה מסוימת גם [[דלפי (שפת תכנות)|Delphi]]) המאפשרות למתכנת לבחור אם להשתמש במנגנון זה או לנהל הקצאות ושחרור זיכרון באופן עצמאי. התקן החדש של שפת [[C++|++C]],{{כ}} C++11, כולל תמיכה מוגבלת באיסוף זבל.
 
בהקשר הנוכחי, "זבל" הוא אובייקטכל שהזיכרוןמקטע אותו הוא תופסזיכרון ש[[הקצאת זיכרון דינמית|הוקצה באופן דינמי]], אךואין לאבו ניתןולא להתייחסיהיה אליובו דרךשימוש אףנוסף מזהה הנגיש בתוכנית, ולכן לא ניתן להגיע אליובתכנית. מצב בו חלק מאותם אובייקטים שאין בהםזיכרון צורך"זבל" לא נמחקיםמשוחרר מכונה "[[דליפת זיכרון]]" (Memory leak) ועלול להביא למצב בו משאבי הזיכרון שהתוכנית משתמשת בהם הולכים וגדלים ובסופו של דבר אף לקריסה (הפסקת ריצה) של התוכנית.
 
איסוף זבל חוסך מן המתכנתמהמתכנת את המעקב אחר אובייקטיםזיכרון להםשהוקצה הקצהבמהלך זיכרון במהלךריצת התוכנית ואת הצורך לשחרר את הזיכרון בצורה תקינה עם סיום השימוש בהם. כמו כן מונע שגיאות זמן ריצה הנובעות מניסיון לשחרר זיכרוןשחרורו שלאבאופן הוקצהמפורש. באופן עקרוני, יש קושי עצום להגדיר שפת תכנות המכילה רפרנסים (או מצביעים) כך שתהיה בעלת [[טיפוסיות]] חזקה ובטוחה, אם היא הכוללת שחרור זיכרון מפורש (במקום איסוף זבל){{הערה|Benjamin C. Pierce, Types and Programming Languages, pg. 158}}.
 
חסרונו הבולט של המנגנון הוא תוספת מסוימת של תקורות בביצועי התוכנית בפועל, היבט משמעותי במיוחד עבור תוכניות [[מערכת זמן אמת|זמן אמת]].
שורה 12:
==יישום איסוף אוטומטי בשפות תכנות==
 
במספרברוב [[שפת תכנות|שפות תכנותהתכנות]] המודרניות כגון [[Java]]{{כ}}, [[Basica]]{{כ}}, [[Lisp]], [[פייתון]] ו-[[C Sharp|C#{{כ}}]] (כחלק מכלל פלטפורמת ה-{{כ|ימינה=כן}}[[.NET]]) מתנהלקיים מנגנון איסוף הזבל באופן אוטומטיזבל.
 
בשפת [[C (שפת תכנות)|C]] לא קיים איסוף זבל אוטומטי, ועל המתכנת מוטלת האחריות לדאוג לשחרר את הזיכרון שהוקצה באופן מפורש. מסיבה זו, דליפות זיכרון הן בעיה חמורה ושכיחה ביותר בתכנות בשפת C, וישנן תוכנות מיוחדות שמטרתן לעזור לאתר את דליפות הזיכרוןזיכרון.
 
בשפת [[C Plus Plus|++C]], בדומה לשפת [[C (שפת תכנות)|C]], לא קיים איסוף זבל אוטומטי, אבל ניתן ליישםלדמות איסוף זבל אוטומטי באמצעות טכניקה הקרויה "מצביעים חכמים" שהם למעשה, אובייקטים שמתנהגים כמושעוטפים מצביעים רגילים אבל מנהליםומנהלים את איסוף הזבל של האובייקטיםהזיכרון שהםאליו הם מצביעים עליהם באופן אוטומטי (באמצעות [[#מניית התייחסויות|מניית התייחסויות]]). מנגנון זה פותר חלק מהבעיות הקשורות בדליפת זיכרון, אך לא את כולן.
 
==טכניקות איסוף זבל אוטומטי==