Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Μεταγλωττιστές Νίκος Παπασπύου, Κωστής Σαγώνας Ενδιάμεσος Κώδικας
Άδεια Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άδεια χρήσης άλλου τύπου, αυτή πρέπει να αναφέρεται ρητώς.
ÅíäéÜìåóïò êþäéêáò (i) Ëüãïé ýðáñîçò Äéåõêïëýíåé ôï Ýñãï ôçò ìåôüöñáóçò Äéåõêïëýíåé ôç âåëôéóôïðïßçóç Äéåõêïëýíåé ôçí êáôüôìçóç óå åìðñüóèéï êáé ïðßóèéï ôìþìá 3
ÅíäéÜìåóïò êþäéêáò (ii) ÌåôÜöñáóç ïäçãïýìåíç áðü ôç óýíôáîç (syntax-directed translation) Ãéá êüèå äïìþ ôçò ãëþóóáò ðñïóäéïñßæåôáé ï áíôßóôïé ïò åíäéüìåóïò êþäéêáò Äéåõñýíåôáé ï óõíôáêôéêüò áíáëõôþò ìå óçìáóéïëïãéêýò ñïõôßíåò ðïõ ðáñüãïõí åíäéüìåóï êþäéêá 4
ÅíäéÜìåóïò êþäéêáò (ii) ÌåôÜöñáóç ïäçãïýìåíç áðü ôç óýíôáîç (syntax-directed translation) Ãéá êüèå äïìþ ôçò ãëþóóáò ðñïóäéïñßæåôáé ï áíôßóôïé ïò åíäéüìåóïò êþäéêáò Äéåõñýíåôáé ï óõíôáêôéêüò áíáëõôþò ìå óçìáóéïëïãéêýò ñïõôßíåò ðïõ ðáñüãïõí åíäéüìåóï êþäéêá Ó Ýäéï ðáñáãùãþò åíäéüìåóïõ êþäéêá 5
ÅíäéÜìåóïò êþäéêáò (ii) ÌåôÜöñáóç ïäçãïýìåíç áðü ôç óýíôáîç (syntax-directed translation) Ãéá êüèå äïìþ ôçò ãëþóóáò ðñïóäéïñßæåôáé ï áíôßóôïé ïò åíäéüìåóïò êþäéêáò Äéåõñýíåôáé ï óõíôáêôéêüò áíáëõôþò ìå óçìáóéïëïãéêýò ñïõôßíåò ðïõ ðáñüãïõí åíäéüìåóï êþäéêá Ó Ýäéï ðáñáãùãþò åíäéüìåóïõ êþäéêá ÌåôáâëçôÝò éäéïôþôùí (attributes) ãéá êüèå óýìâïëï ôçò ãñáììáôéêþò 6
ÅíäéÜìåóç ãëþóóá (i) ÔåôñÜäåò (quadruples) n: op, x, y, z 7
ÅíäéÜìåóç ãëþóóá (i) ÔåôñÜäåò (quadruples) n: op, x, y, z ÐáñÜäåéãìá: b*b-4*a*c 1:, b, b, $1 2:, 4, a, $2 3:, $2, c, $3 4:, $1, $3, $4 8
ÅíäéÜìåóç ãëþóóá (ii) ÔñéÜäåò (triples) n: op, x, y 9
ÅíäéÜìåóç ãëþóóá (ii) ÔñéÜäåò (triples) n: op, x, y ÐáñÜäåéãìá: 1:, b, b 2:, 4, a 3:, (2), c 4:, (1), (3) b*b-4*a*c 10
ÅíäéÜìåóç ãëþóóá (iii) ÁöçñçìÝíá óõíôáêôéêü äýíôñá (abstract syntax trees) 11
ÅíäéÜìåóç ãëþóóá (iii) ÁöçñçìÝíá óõíôáêôéêü äýíôñá (abstract syntax trees) ÐáñÜäåéãìá: b*b-4*a*c * * b b * c 4 a 12
ÅíäéÜìåóç ãëþóóá (iv) Ðñïèåìáôéêüò êáé åðéèåìáôéêüò êþäéêáò (prex/postx code) 13
ÅíäéÜìåóç ãëþóóá (iv) Ðñïèåìáôéêüò êáé åðéèåìáôéêüò êþäéêáò (prex/postx code) ÐáñÜäåéãìá: b b 4 a c b b 4 a c b*b-4*a*c ðñïèåìáôéêüò åðéèåìáôéêüò 14
ÅíäéÜìåóç ãëþóóá (v) Êáôåõèõíüìåíïé áêõêëéêïß ãñüöïé (directed acyclic graphs) 15
ÅíäéÜìåóç ãëþóóá (v) Êáôåõèõíüìåíïé áêõêëéêïß ãñüöïé (directed acyclic graphs) ÐáñÜäåéãìá: b+(a+1)*(a+1)+c-(a+1)*(a+1)+2/(a+1) 16
ÅíäéÜìåóç ãëþóóá (v) Êáôåõèõíüìåíïé áêõêëéêïß ãñüöïé (directed acyclic graphs) ÐáñÜäåéãìá: b+(a+1)*(a+1)+c-(a+1)*(a+1)+2/(a+1) + / + * 2 + + c + + a 1 b * a 1 a 1 + + a 1 a 1 17
ÅíäéÜìåóç ãëþóóá (v) Êáôåõèõíüìåíïé áêõêëéêïß ãñüöïé (directed acyclic graphs) ÐáñÜäåéãìá: b+(a+1)*(a+1)+c-(a+1)*(a+1)+2/(a+1) + + / / + * 2 + + 2 + c + + a 1 + c b * a 1 a 1 b * + + + a 1 a 1 a 1 18
Ãëþóóá ôåôñüäùí ÌïñöÞ ôåôñüäáò: n: op, x, y, z üðïõ: n: åôéêýôá ôåôñüäáò (öõóéêüò áñéèìüò) op: ôåëåóôþò x, y, z: ôåëïýìåíá ÁíÜëïãá ìå ôï åßäïò ôïõ ôåëåóôþ, êüðïéá ôåëïýìåíá åíäå ïìýíùò ðáñáëåßðïíôáé 19
Ôåëïýìåíá (i) ÓôáèåñÜ áêýñáéá, ðñáãìáôéêþ, ëïãéêþ áñáêôþñáò, óõìâïëïóåéñü, nil ¼íïìá ìåôáâëçôþ, ðáñáìýôñïò, õðïðñüãñáììá ÐñïóùñéíÞ ìåôáâëçôþ: $n ÁðïôÝëåóìá óõíüñôçóçò: $$ Áðïäåéêôïäüôçóç: [x] x áðëü ôåëïýìåíï Äéåýèõíóç: {x} x áðëü ôåëïýìåíï 20
Ôåëïýìåíá (ii) ÅôéêÝôá åíôïëþò óôï áñ éêü ðñüãñáììá ôåôñüäáò Ôñüðïò ðåñüóìáôïò V : êáô' áîßá R : êáô' áíáöïñü RET : èýóç áðïôåëýóìáôïò óõíüñôçóçò Êåíü : ÐñïóùñéíÜ êåíü : * (ãéá backpatching) 21
ÔåëåóôÝò (i) unit, I,, endu, I,, áñ Þ êáé ôýëïò äïìéêþò ìïíüäáò op, x, y, z op {+, -, *, /, %} z := x op y :=, x,, z z := x array, x, y, z z := ç äéåýèõíóç ôïõ óôïé åßïõ x[y] 22
ÔåëåóôÝò (ii) op, x, y, z op {=, <>, >, <, >=, <=} áí x op y ôüôå ðþãáéíå óôçí ôåôñüäá z ifb, x,, z áí ç ëïãéêþ ôéìþ x åßíáé áëçèþò ôüôå ðþãáéíå óôçí ôåôñüäá z jump,,, z ðþãáéíå óôçí ôåôñüäá z label, I,, jumpl,,, I ïñéóìüò åôéêýôáò êáé Üëìá ðñïò áõôþí 23
ÔåëåóôÝò (iii) call,,, I êüëåóå ôç äïìéêþ ìïíüäá I par, x, m, ðýñáóå ôçí ðñáãìáôéêþ ðáñüìåôñï x ìå ôñüðï ðåñüóìáôïò m ret,,, åðéóôñïöþ áðü ôçí ôñý ïõóá äïìéêþ ìïíüäá 24
ÌåôáâëçôÝò éäéïôþôùí PLACE: èýóç üðïõ âñßóêåôáé áðïèçêåõìýíç ç ôéìþ ìéáò l-value Þ ìéáò r-value TYPE: ôýðïò ìéáò l-value Þ ìéáò r-value NEXT : ëßóôá áðü åôéêýôåò ôåôñüäùí ðïõ ðåñéý ïõí Üëìáôá óôçí åðüìåíç åíôïëþ TRUE, FALSE: ëßóôåò áðü åôéêýôåò ôåôñüäùí ðïõ ðåñéý ïõí Üëìáôá óôïí êþäéêá ðïõ ðñýðåé íá åêôåëåóôåß áí ìéá óõíèþêç åßíáé áëçèþò Þ øåõäþò 25
ÂïçèçôéêÝò õðïñïõôßíåò (i) NEXTQUAD() ÅðéóôñÝöåé ôïí áñéèìü ôçò åðüìåíçò ôåôñüäáò GENQUAD(op, x, y, z) ÃåííÜ ôçí åðüìåíç ôåôñüäá op, x, y, z NEWTEMP(t) Äçìéïõñãåß ìéá íýá ðñïóùñéíþ ìåôáâëçôþ ôýðïõ t EMPTYLIST() Äçìéïõñãåß ìéá êåíþ ëßóôá åôéêåôþí ôåôñüäùí 26
ÂïçèçôéêÝò õðïñïõôßíåò (ii) MAKELIST(x) Äçìéïõñãåß ìéá ëßóôá åôéêåôþí ôåôñüäùí ðïõ ðåñéý åé ìüíï ôï óôïé åßï x MERGE(l 1,..., l n ) ÓõíÝíùóç ôùí ëéóôþí åôéêåôþí ôåôñüäùí l 1... l n BACKPATCH(l, z) ÁíôéêáèéóôÜ óå üëåò ôéò ôåôñüäåò ðïõ ðåñéý ïíôáé óôçí l ôçí Üãíùóôç åôéêýôá ôåôñüäáò ìå ôç z (backpatching) 27
ÁñéèìçôéêÝò åêöñüóåéò ÁêÝñáéåò óôáèåñýò r-value ::= integer-const { P 1 } P 1 : { r-value.place = integer-const ; } 28
ÁñéèìçôéêÝò åêöñüóåéò ÁêÝñáéåò óôáèåñýò r-value ::= integer-const { P 1 } P 1 : { r-value.place = integer-const ; } ÔåëåóôÝò ìå äýï ôåëïýìåíá r-value ::= expr binop expr { P 14 } P 14 : { W = NEWTEMP( r-value.type); GENQUAD( binop.name, expr 1.PLACE, expr 2.PLACE, W ); r-value.place = W ; } 29
ËïãéêÝò åêöñüóåéò (i) <cond>... jump,,, 31... jump,,, 42... jump,,, 31... jump,,, 31... jump,,, 42... <cond>.false <cond>.true 30
ËïãéêÝò åêöñüóåéò (ii) ËïãéêÝò åêöñüóåéò óå óõìâïëéóìü 0/1 cond ::= expr <cond> <expr> ifb, <expr>.place,, * jump,,, * FALSE TRUE 31
ËïãéêÝò åêöñüóåéò (iii) ËïãéêÝò åêöñüóåéò óå óõìâïëéóìü 0/1 cond ::= expr { P 21 } P 21 : { cond.true = MAKELIST(NEXTQUAD()); GENQUAD(ifb, expr.place,, ); cond.false = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); } 32
ËïãéêÝò åêöñüóåéò (iv) ÔåëåóôÝò óýãêñéóçò cond ::= expr 1 relop expr 2 <cond> <expr> 1 <expr> 2 relop, <expr> 1.PLACE, <expr> 2.PLACE, * jump,,, * FALSE TRUE 33
ËïãéêÝò åêöñüóåéò (v) ÔåëåóôÝò óýãêñéóçò cond ::= expr 1 relop expr 2 { P 23 } P 23 : { cond.true = MAKELIST(NEXTQUAD()); GENQUAD( relop.name, expr 1.PLACE, expr 2.PLACE, ); cond.false = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); } 34
ËïãéêÝò åêöñüóåéò (vi) ñíçóç cond ::= \not" cond <cond> TRUE <cond> FALSE FALSE TRUE 35
ËïãéêÝò åêöñüóåéò (vii) Óýæåõîç cond ::= cond 1 \and" cond 2 <cond> FALSE <cond> 1 TRUE FALSE <cond> 2 TRUE FALSE TRUE 36
ËïãéêÝò åêöñüóåéò (viii) Óýæåõîç cond ::= cond 1 \and" { P 25 } cond 2 { P 26 } P 25 : { BACKPATCH( cond 1.TRUE, NEXTQUAD()); } P 26 : { cond.false = MERGE( cond 1.FALSE, cond 2.FALSE); cond.true = cond 2.TRUE; } 37
ÁðëÝò åíôïëýò ÊåíÞ åíôïëþ stmt ::= ɛ { P 29 } P 29 : { stmt.next = EMPTYLIST(); } 38
ÁðëÝò åíôïëýò ÊåíÞ åíôïëþ stmt ::= ɛ { P 29 } P 29 : { stmt.next = EMPTYLIST(); } ÅíôïëÞ áíüèåóçò stmt ::= l-value \:=" expr { P 30 } P 30 : { GENQUAD(\:=", expr.place,, l-value.place); stmt.next = EMPTYLIST(); } 39
Óýíèåôç åíôïëþ (i) stmt ::= block block ::= \begin" stmt ( \;" stmt ) \end" <block> <stmt> 1 NEXT <stmt> 2 NEXT NEXT 40
Óýíèåôç åíôïëþ (ii) stmt ::= block { P 34 } P 34 : { stmt.next = block.next ; } block ::= \begin" stmt 1 { P 35 } ( \;" { P 36 } stmt 2 { P 37 } ) \end" { P 38 } P 35 : { L = stmt 1.NEXT ; } P 36 : { BACKPATCH(L, NEXTQUAD()); } P 37 : { L = stmt 2.NEXT ; } P 38 : { block.next = L; } 41
ÅíôïëÞ if (i) stmt ::= \if " cond \then" stmt [ \else" stmt ] <stmt> FALSE <cond> TRUE <stmt> TRUE <cond> <stmt> 1 FALSE NEXT <stmt> 1 jump,,, * <stmt> 2 NEXT NEXT NEXT NEXT 42
ÅíôïëÞ if (ii) stmt ::= \if " cond { P 39 } \then" stmt 1 [ \else" { P 40 } stmt 2 { P 41 } ] { P 42 } P 39 : { BACKPATCH( cond.true, NEXTQUAD()); L 1 = cond.false; L 2 = EMPTYLIST(); } P 40 : { L 1 = MAKELIST(NEXTQUAD()); GENQUAD(jump,,, ); BACKPATCH( cond.false, NEXTQUAD()); } P 41 : { L 2 = stmt 2.NEXT ; } P 42 : { stmt.next = MERGE(L 1, stmt 1.NEXT, L 2 ); } 43
ÅíôïëÞ while (i) stmt ::= \while" cond \do" stmt <stmt> FALSE <cond> TRUE <stmt> 1 jump,,, * NEXT NEXT 44
ÅíôïëÞ while (ii) stmt ::= \while" { P 43 } cond \do" { P 44 } stmt 1 { P 45 } P 43 : { Q = NEXTQUAD(); } P 44 : { BACKPATCH( cond.true, NEXTQUAD()); } P 45 : { BACKPATCH( stmt 1.NEXT, Q); GENQUAD(jump,,, Q); stmt.next = cond.false; } 45
ÊëÞóç õðïðñïãñáììüôùí (i) call ::= id \(" [ expr ( \," expr ) ] \)" r-value ::= call stmt ::= call ÐÝñáóìá ðáñáìýôñùí ìå ôåôñüäåò par ÐÝñáóìá èýóçò áðïôåëýóìáôïò ìå ôåôñüäá par áí ðñüêåéôáé ãéá óõíüñôçóç ÊëÞóç ìå ôåôñüäá call 46
ÊëÞóç õðïðñïãñáììüôùí (ii) call ::= id \(" { P 46 } [ expr 1 { P 47 } ( \," expr 2 { P 48 } ) ] \)" { P 49 } P 46 : { N = 1; } P 47 : { GENQUAD(\par", expr 1.PLACE, PARAMMODE( id, N ), ); N = N + 1; } P 48 : { GENQUAD(\par", expr 2.PLACE, PARAMMODE( id, N ), ); N = N + 1; } 47
ÊëÞóç õðïðñïãñáììüôùí (iii) call ::= id \(" { P 46 } [ expr 1 { P 47 } ( \," expr 2 { P 48 } ) ] \)" { P 49 } (óõíý åéá) P 49 : { if (ISFUNCTION( id )) { W = NEWTEMP(FUNCRESULT( id )); GENQUAD(par, RET, W, ); call.place = W ; } GENQUAD(call,,, id ); } 48
ÊëÞóç õðïðñïãñáììüôùí (iv) ÊëÞóç óõíüñôçóçò r-value ::= call { P 50 } P 50 : { r-value.place = call.place; } 49
ÊëÞóç õðïðñïãñáììüôùí (iv) ÊëÞóç óõíüñôçóçò r-value ::= call { P 50 } P 50 : { r-value.place = call.place; } ÊëÞóç äéáäéêáóßáò stmt ::= call { P 51 } P 51 : { stmt.next = EMPTYLIST(); } 50
ÊëÞóç õðïðñïãñáììüôùí (v) ÅðéóôñïöÞ áðü õðïðñüãñáììá stmt ::= \return" [ expr { P 52 } ] { P 53 } P 52 : { GENQUAD(retv, expr.place,, ); } P 53 : { GENQUAD(ret,,, ); } 51
ÊëÞóç õðïðñïãñáììüôùí (v) ÅðéóôñïöÞ áðü õðïðñüãñáììá stmt ::= \return" [ expr { P 52 } ] { P 53 } P 52 : { GENQUAD(retv, expr.place,, ); } P 53 : { GENQUAD(ret,,, ); } ÄÞëùóç õðïðñïãñüììáôïò body ::= ( local ) { P 56 } block \;" { P 57 } P 56 : { GENQUAD(unit, I,, ); } P 57 : { BACKPATCH( block.next, NEXTQUAD()); GENQUAD(endu, I,, ); } 52
(i) 53 procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; quicksort(a, m, j); quicksort(a, i, n) end;
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 54
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 55
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 56
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 3: jump,,, 57
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 3: jump,,, 4: ret,,, 58
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 4: ret,,, 59
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, 60
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, 5: :=, m,, i 61
(ii) procedure quicksort (var a : array of integer; m, n : integer); var i, j, temp : integer; begin if n <= m then return; i := m; j := n; 62 1: unit, quicksort,, 2: <=, n, m, 4 3: jump,,, 5 4: ret,,, 5: :=, m,, i 6: :=, n,, j
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 63
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 64
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 8: jump,,, 65
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 66
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 67
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 68
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 69
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 70
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 71
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 14: jump,,, 72
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 73
(iii) 74 while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 15: +, i, 1, $5
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 75 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 15: +, i, 1, $5 16: :=, $5,, i
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 76 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 77 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 78 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 79 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 80 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 81 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 82 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9],
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 83 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 23: jump,,,
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 84 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,,
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 85 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 24:, j, 1, $10
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 86 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 24:, j, 1, $10 25: :=, $10,, j
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 87 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 24:, j, 1, $10 25: :=, $10,, j 26: jump,,, 18
(iii) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; 88 7: <=, i, j, 9 8: jump,,, 9: array, a, i, $1 10: +, m, n, $2 11: /, $2, 2, $3 12: array, a, $3, $4 13: <, [$1], [$4], 15 14: jump,,, 18 15: +, i, 1, $5 16: :=, $5,, i 17: jump,,, 9 18: array, a, j, $6 19: +, m, n, $7 20: /, $7, 2, $8 21: array, a, $8, $9 22: >, [$6], [$9], 24 23: jump,,, 27 24:, j, 1, $10 25: :=, $10,, j 26: jump,,, 18
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 89
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 90
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 28: jump,,, 91
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 92
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 93
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 94
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 95
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 96
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 97 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12]
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 98
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 99
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 100
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i 101
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i 38:, j, 1, $16 102
(iv) if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end 103 27: <=, i, j, 29 28: jump,,, 29: array, a, i, $11 30: :=, [$11],, temp 31: array, a, i, $12 32: array, a, j, $13 33: :=, [$13],, [$12] 34: array, a, j, $14 35: :=, temp,, [$14] 36: +, i, 1, $15 37: :=, $15,, i 38:, j, 1, $16 39: :=, $16,, j
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 104
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 7: <=, i, j, 9 8: jump,,, 105
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 7: <=, i, j, 9 8: jump,,,... 27: <=, i, j, 29 28: jump,,, 106
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 107 7: <=, i, j, 9 8: jump,,,... 27: <=, i, j, 29 28: jump,,,... 40: jump,,, 7
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 108 7: <=, i, j, 9 8: jump,,,... 27: <=, i, j, 29 28: jump,,, 7... 40: jump,,, 7
(v) while i <= j do begin while a[i] < a[(m+n) div 2] do i := i+1; while a[j] > a[(m+n) div 2] do j := j-1; if i <= j then begin temp := a[i]; a[i] := a[j]; a[j] := temp; i := i+1; j := j-1 end end; 109 7: <=, i, j, 9 8: jump,,, 41... 27: <=, i, j, 29 28: jump,,, 7... 40: jump,,, 7
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 110
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 111
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 112
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 113
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 114
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 115
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 116
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, 117
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, 48: call,,, quicksort 118
(vi) quicksort(a, m, j); quicksort(a, i, n) end; 119 41: par, a, R, 42: par, m, V, 43: par, j, V, 44: call,,, quicksort 45: par, a, R, 46: par, i, V, 47: par, n, V, 48: call,,, quicksort 49: endu, quicksort,,
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα» του ΕΜΠ έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.