1 סביבת זמן הריצה. 2 כשאת אומרת x, למה את מתכוונת? מה תדפיס התוכנית הבאה? var x: int; function foo(): int isreturn x; function bar(): int isvar x:int;

Slides:



Advertisements
Similar presentations
Processes and threads. תהליכים ותתי תהליכים תהליכים –כל תוכנית שרצה היא תהליך (process) –ניתן להתפצל מתהליך אחד למספר תהליכים, בעזרת הפקודה fork(). הרבה.
Advertisements

ממיבחניםC שאלות ++.
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
תרגול 8 היכרות עם ++C. C++ מעל שפת Cשפת תכנות שנבנתה מעל שפת C CC++ –כמעט כל תכנית ב -C היא גם תכנית ב C++ עד כדי מספר הבדלים קטן C99C שאימץ כמה מהתכונות.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
מערכות הפעלה תרגול 2 – קריאות מערכת ב-Linux. מערכות הפעלה - תרגול 22 (c) ארז חדד 2003 תוכן התרגול קריאה לפונקציות ב-Linux קריאה לשירותי מערכת ב-Linux.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
1 סביבת זמן הריצה Aho, Sethi, and Ullman – Chapter 7 Cooper and Torczon – Chapter 6.
מערכות הפעלה ( אביב 2009) חגית עטיה ©1 מערכת קבצים log-structured  ה log הוא העותק היחיד של הנתונים  כאשר משנים בלוק (data, header) פשוט כותבים את הבלוק.
תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תרגול 10: הכרות עם ++C ++C כ- C משופר
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
מודל הלמידה מדוגמאות Learning from Examples קלט: אוסף של דוגמאות פלט: קונסיסטנטי עם פונקציה f ב- C ז"א קונסיסטנטי עם S ז"א מודל הלמידה מדוגמאות Learning.
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
מערכות הפעלה ( אביב 2004) חגית עטיה © 1 תהליכים  מהו תהליך ?  מבני הנתונים לניהול תהליכים.  החלפת הקשר.  ניהול תהליכים ע " י מערכת ההפעלה.
מבוא כללי למדעי המחשב הקצאת זיכרון דינאמית
A. Frank File Organization Hardware Size Parameters.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
(C) Yohai Devir January מבנה מחשבים ספרתיים זכרון וירטואלי מבוסס על תרגול של מורן גביש.
מבוא למדעי המחשב תרגול 12 – הקצאת זיכרון דינאמית שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Sscanf example #include int main () { char sentence []="Rudolph is 12 years old"; char str [20]; int i; sscanf (sentence,"%s %*s %d",str,&i); printf ("%s.
Structure. מה לומדים היום ? דרך לבנות מבנה נתונים בסיסי – Structure מייצר " טיפוס " חדש מתאים כאשר רוצים לאגד כמה משתנים יחד דוגמאות : עובד : שם, טלפון,
המשך תכנות מונחה עצמים 1. היום בתרגול  הורשה  שיטות מיוחדות  פולימורפיזם 2.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
 Client, Supplier ומה שביניהם ( ADT!).  שאלה 1: יצירת ADT עבור מעגל במישור נניח שלקוח מעוניין בפעולות הבאות : הזזת מעגל וחישוב שטח מעגל. הספק יספק ללקוח.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Computer Architecture and Assembly Language
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
מבוא לתכנות מונחה עצמים Object Oriented Programming
מבוא למדעי המחשב – סמסטר א' תשע"ב
תוכנה 1 תרגול 13 – סיכום.
תרגול 5 – מימוש זמן תהליכים
Aho, Sethi, and Ullman – Chapter 7 Cooper and Torczon – Chapter 6
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
תרגול 2 – קריאות מערכת ב-Linux
ניתוח מערכות מידע תכנות ב C#
סוגי משתנים קרן כליף.
מבוא למדעי המחשב – סמסטר א' תשע"ד
Programming in C תרגול Introduction to C - Fall Amir Menczel.
מבוא לתכנות מונחה עצמים Object Oriented Programming
Shell Scripts בסביבת UNIX
תוכנה 1 תרגול 13 – סיכום.
תכנות מכוון עצמים ו- C++ יחידה 02 העמסת פונקציות, ערכי ברירת מחדל, enum, קימפול מותנה קרן כליף.
ארכיטקטורת מחשבים ומעבדת תכנות מערכות טל סובול שיקלר שעת קבלה: יום א', 9-10, חדר:
תוכנה 1 תרגול 13 – סיכום.
Computer Architecture and Assembly Language
Presentation transcript:

1 סביבת זמן הריצה

2 כשאת אומרת x, למה את מתכוונת? מה תדפיס התוכנית הבאה? var x: int; function foo(): int isreturn x; function bar(): int isvar x:int; x = 1; return foo(); procedure main() isx = 0; print bar();

3 תוצאות אפשריות התוכנית תדפיס 0 C, פסקל, C++, Java ורוב השפות ה"מודרניות" התוכנית תדפיס 1 LISP, APL, Perl (לפעמים),... התוכנית תדפיס הודעת שגיאה PHP

4 מה ההבדל? Scoping – איך מחליטים לאיזו כתובת בזכרון מתייחס כל שם dynamic scoping – חריג static scoping – ההכרזה המקיפה הקרובה ביותר main ( ) { int a = 0 ; int b = 0 ; { int b = 1 ; { int a = 2 ; printf (“%d %d\n”, a, b) } { int b = 3 ; printf (“%d %d\n”, a, b) ; } printf (“%d %d\n”, a, b) ; } printf (“%d %d\n”, a, b) ; } B0B0 B1B1 B3B3 B3B3 B2B2

5 מימוש dynamic scoping לכל שם יש מחסנית (ריקה בפוטנציה). אפשר לנהל hash table של שמות. כניסה ל-scope שבו מוגדר משתנה: דחיפה של ההגדרה למחסנית. יציאה מ-scope שבו מוגדר משתנה: pop מהמחסנית. גישה למשתנה: לפי ראש המחסנית. האם אפשר לגלות גישות לא חוקיות (למשתנים לא קיימים) בזמן קומפילציה? מה לגבי בדיקות טיפוסים?

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

7 מימוש static scoping למשל: var x: int; function foo(): int isreturn x; function bar(): int isvar x:int; x = 1; return foo(); procedure main() isx = 0; print bar(); שםכתובת שהוקצתה עבורו x (גלובלי) x (בתוך bar)

8 מימוש static scoping רק רגע: מה הכתובת של המשתנה b בדוגמה הבאה? procedure fib(n:int) isvar a:int; var b:int; if (n ≤ 1) return 0; a = fib(n – 1); b = fib(n – 2); return a + b; procedure main() isprint fib(5); שימו לב לכך שהבעיה לא קיימת במקרה של dynamic scoping.

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

10 ארגון הזיכרון code static data stack   heap גודל זה ידוע בזמן קומפילציה המחסנית גדלה וקטנה בזמן ריצה. היא מכילה רשומות הפעלה (activation records) הקצאת זיכרון בשליטת התוכנית top of stack → משתנים גלובליים

11 הכתובות של משתנים מקומיים בכל כניסה לפרוצדורה, מוסיפים רשומת הפעלה למחסנית בכל יציאה, מסירים רשומת הפעלה משתנים מקומיים הם חלק מרשומת ההפעלה של כל פרוצדורה כתובת של משתנה מקומי: S-a S היא כתובת ראש המחסנית a היא הכתובת היחסית של המשתנה המקומי הכתובות היחסיות נקבעות בזמן קומפילציה!

12 דוגמה: הפעלה של fib … other parts of activation record … n (addr: S-20) a (addr: S-16) b (addr: S-12) … other parts of activation record … n (addr: S-20) a (addr: S-16) b (addr: S-12) … other parts of activation record … n (addr: S-20) a (addr: S-16) b (addr: S-12) … other parts of activation record … פרמטרים הם משתנים מקומיים.

13 מה עוד יש ברשומת הפעלה? ערך מוחזר; לעיתים -- רגיסטרreturned value פרמטרים אקטואליים; לעיתים רגיסטריםactual parameters מצביע לרשומת ההפעלה של הפרוצדורה הקוראתoptional control link דרוש לפעמים על מנת להתייחס למשתנים לא מקומיים (display)optional access link מצב המכונה לפני התחלת עבודתה של הפרוצדורה הנוכחיתsaved machine status משתים מקומייםlocal data ערכי בינייםtemporaries

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

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

16 פרוצדורות בתוך פרוצדורות: פסקל בפסקל, תוכנית (program) מוגדרת כאוסף של שגרות (procedure ו/או function) לכל שגרה יכולות להיות תת-שגרות כל תת-שגרה יכולה לגשת לכל מה שהוגדר ב-scopes המכילים אותה הרעיון: תכנון תוכנה מתבצע top-down בשיטת stepwise refinement Niklaus Wirth, “Program Development by Stepwise Refinement”, Communications of the ACM, April 1971.

17 פרוצדורות בתוך פרוצדורות: פסקל So, naturalists observe, a flea Hath smaller fleas that on him prey; And these have smaller fleas to bite 'em And so proceed ad infinitium Jonathan Swift ( )

18 פרוצדורות בתוך פרוצדורות: פסקל program p; var x: Integer; procedure a var y: Integer; procedure b begin… b … end; function c var z: Integer; procedure d begin… d … end; begin… c …end; begin… a … end; begin… p … end. מה הכתובת של משתנה y מתוך הפרוצדורה d? סדרת קריאות אפשרית: p →a→ a →c→ b →c→d

19 פרוצדורות בתוך פרוצדורות: פסקל הפתרון: access links ברשומת ההפעלה כל access link מכיל מחוון לרשומת ההפעלה של רמת הקינון שמעליו למשל, ה-access link של d מכיל מחוונים לרשומת ההפעלה של c. ה-access links נבנים בזמן ריצה מספר ה-links שצריך "לטייל" ידוע בזמן קומפילציה

20 פרוצדורות בתוך פרוצדורות: פסקל a a c b c d y y z z

21 בעיות מודרניות: תכנות מונחה-עצמים class A { virtual void foo() { print “A”; } } class B extends A { virtual void foo(){ print “B”; } } main() { A myA = (…) ? new A() : new B(); myA.foo(); } לאיזו כתובת פונה הקריאה הזו?

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

23 למה זה טוב? class Shape { int x; int y; virtual moveBy(dX, dY) { … }; virtual draw(); } class Square extends Shape { int size; virtual draw() { … } } class Circle extends Shape { int radius; virtual draw() { … } } function animate(Shape s) { for (int i = 0 ; i < 10; i++) s.moveBy(1,1); s.draw(); } }

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

25 מימוש dynamic binding אובייקטים בזמן ריצה קוד (בזכרון בזמן ריצה, כתובות ידועות כבר בזמן קומפילציה) Shape::moveBy Circle::drawSquare::draw Circle x : int = 17 y : int = 24 draw : addr moveBy : addr radius : int = 9 Square x : int = 76 y : int = 39 draw : addr moveBy : addr size : int = 23 Circle x : int = 73 y : int = 5 draw : addr moveBy : addr radius : int = 76

26 מימוש מעשי יותר: VMT המימוש הנאיבי מאוד בזבזני בזכרון כל Circle מכיל את אותה טבלה בדיוק הטבלה יכולה להיות ענקית (המון מתודות) מימוש יעיל יותר: Virtual Method Table טבלה אחת המשותפת לכל האובייקטים מכל סוג כל אובייקט רק מצביע לטבלה הרלוונטית לטיפוס שלו מה המחיר?

27 מימוש dynamic binding על-ידי VMT אובייקטים בזמן ריצה קוד (בזכרון בזמן ריצה, כתובות ידועות כבר בזמן קומפילציה) Shape::moveBy Circle::drawSquare::draw Circle VMT x : int = 17 y : int = 24 radius : int = 9 Square VMT x : int = 76 y : int = 39 size : int = 23 Circle VMT x : int = 73 y : int = 5 radius : int = 76 Circle VMT draw : addr moveBy : addr Square VMT draw : addr moveBy : addr

28 אופטימיזציות מתי ניתן להחליף dynamic binding ב-static binding? מדוע זה כדאי?