협력업체 청정 에너지 프로그램 · 1 day ago · 협력업체 청정 에너지 프로그램 2020년 프로그램 업데이트 Apple은 기후 변화에 대응하고 재생
프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. ·...
Transcript of 프로그램 실행 - Seoul National Universitydreameye/PL/slide/SM5.pdf · 2011. 5. 4. ·...
프로그램 실행
•실행기 만들기 interpreter
•실행기가 있는 다른 언어로 번역하기 compiler
M0 lambda calculus
K- interpreter
SM5가상 머신
Virtual Machine
202 !!! !!
!" !!# $"!!. !!" E1" !! "!% C1! !!"! E1 " ##
#! !" !! $#!. ##$ E2" !! "!% C2! !!"! E2" "!%
#! !" !%!. #! #!" !!! " &" E2" E1" "!##!. '#
" add "!& !!"! “E1 + E2”" "!% #! !" !!$#!.
Exercise 8 #%" !%$ $#'!. E1 + E2! !!# $ C1.C2! !!"!,
#!" !!!"" E2" ## !%!. !"(, ! "" %!% E1" ##$&
#!. #!" !% E1! E2" # !#" !# ## !''" $%&, !" !
!# #!. !#!( #"$ $ '"%?
6.4 !!! !"virtual machine
“!!!!"”virtual machine"($(!#!. $ “!)”%%? !($%!*
“!)$”$$)"!!!!#!. $ “%"”%%? !!)$"!!!interpreter%
"$%$(""%)" #" *!" )(, $%!%$" "!%$ '!!!#!.
!! !"virtual machine" &"" "*%%? %"!!# ($! """"
#, !!compilation" &+!" !$& #!. X "" ($! "+%&!( "
+. #$'"""!"!"!)$ Z"!!'&#!. X! Z"'""!
!"!" ! !#% !" #!. (, #)" ($ Y ! %$'" ! -& .$
"+. X "" Y " !!"(, Y "" Z " !!"+. ,- !#! /!" !
!- $ !#! # %" /!%" !!$!" &!.
Example 35 6.3$" #! #'- %"" !)#!.!
Example 36 !." !)" K--" K- %"!#& !!"" # $&" )&
($! %"#!.
SM5"( !&+. “SM”- “Stack Machine”& $"(, “5”" ! !)" !
!# 5&#! !!#!:
(S,M,E,C,K)
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008스택, 메모리, 환경, 명령어, 남은 할 일
continuation
구성 요소6.4 !!! !"virtual machine 203
S!!!, M!!"!, E!!!, C!#!!, K!!!!"(“continuation”#
!" !")$ """ "% !#!& !!#":
S ! Stack = Svalue list
M ! Memory = Loc " Value
E ! Environment = (Var # (Loc + Proc)) list
C ! Command = Cmd list
K ! Continuation = (Command # Environment) list
v ! Value = Integer + Bool + Unit + Record + Loc
x ! Var
$b, o%, l ! Loc = Base # O!set
O!set = Integer
z ! Integer
b ! Bool
r ! Record = (Var # Loc) list
w ! Svalue = Value + Proc + (Var # Loc) (* stackable values *)
p ! Proc = Var # Command # Environment
Cmd = {push v, push x, push(x,C),
pop, store, load, jtr(C,C),
malloc, box z, unbox x, bind x, unbind, get, put, call,
add, sub, mul, div, eq, less, not}
!#& '!! "%$ %# !#& !"& !""! $!(" !&! " )":
(S,M,E,C,K) & (S !,M !, E !, C !,K !)
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
Domain
6.4 !!! !"virtual machine 203
S!!!, M!!"!, E!!!, C!#!!, K!!!!"(“continuation”#
!" !")$ """ "% !#!& !!#":
S ! Stack = Svalue list
M ! Memory = Loc " Value
E ! Environment = (Var # (Loc + Proc)) list
C ! Command = Cmd list
K ! Continuation = (Command # Environment) list
v ! Value = Integer + Bool + Unit + Record + Loc
x ! Var
$b, o%, l ! Loc = Base # O!set
O!set = Integer
z ! Integer
b ! Bool
r ! Record = (Var # Loc) list
w ! Svalue = Value + Proc + (Var # Loc) (* stackable values *)
p ! Proc = Var # Command # Environment
Cmd = {push v, push x, push(x,C),
pop, store, load, jtr(C,C),
malloc, box z, unbox x, bind x, unbind, get, put, call,
add, sub, mul, div, eq, less, not}
!#& '!! "%$ %# !#& !"& !""! $!(" !&! " )":
(S,M,E,C,K) & (S !,M !, E !, C !,K !)
SNU 4190.310 Programming Languages c!Kwangkeun Yi, Seoul National Univ., 2006, 2007, 2008
실행 과정 1
v ! Value = Integer + Bool + {·} + Record + Loc
x ! Var
"a, o#, l ! Loc = Base $ O!set
O!set = Integer
z ! Integer
b ! Bool
r ! Record = (Var $ Loc) list
w ! Svalue = Value + Proc + (Var $ Loc) (* stackable values *)
p ! Proc = Var $ Command $ Environment
Cmd = {push v, push x, push(x,C),
pop, store, load, jtr(C,C),
malloc, box z, unbox x, bind x, unbind, get, put, call,
add, sub, mul, div, eq, less, not}
!!! "!# !$" #% !!! !!$ !!!" "!&! !!" ! '!:
(S,M,E,C,K) % (S!,M !, E!, C !,K !)
!" "!% (! !!"!! # "!(%)% )"!" !" !$" #!:
(S, M, E, push v :: C, K)
% (v :: S, M, E, C, K)
(S, M, E, push x :: C, K)
% (w :: S, M, E, C, K) if (x,w) is the first such entry in E
(S, M, E, push (x,C !) :: C, K)
% ((x,C !, E) :: S, M, E, C, K)
(w :: S, M, E, pop :: C, K)
% (S, M, E, C, K)
(l :: v :: S, M, E, store :: C, K)
% (S, M{l &' v}, E, C, K)
(l :: S, M, E, load :: C, K)
% (M(l) :: S, M, E, C, K)
2
v ! Value = Integer + Bool + {·} + Record + Loc
x ! Var
"a, o#, l ! Loc = Base $ O!set
O!set = Integer
z ! Integer
b ! Bool
r ! Record = (Var $ Loc) list
w ! Svalue = Value + Proc + (Var $ Loc) (* stackable values *)
p ! Proc = Var $ Command $ Environment
Cmd = {push v, push x, push(x,C),
pop, store, load, jtr(C,C),
malloc, box z, unbox x, bind x, unbind, get, put, call,
add, sub, mul, div, eq, less, not}
!!! "!# !$" #% !!! !!$ !!!" "!&! !!" ! '!:
(S,M,E,C,K) % (S!,M !, E!, C !,K !)
!" "!% (! !!"!! # "!(%)% )"!" !" !$" #!:
(S, M, E, push v :: C, K)
% (v :: S, M, E, C, K)
(S, M, E, push x :: C, K)
% (w :: S, M, E, C, K) if (x,w) is the first such entry in E
(S, M, E, push (x,C !) :: C, K)
% ((x,C !, E) :: S, M, E, C, K)
(w :: S, M, E, pop :: C, K)
% (S, M, E, C, K)
(l :: v :: S, M, E, store :: C, K)
% (S, M{l &' v}, E, C, K)
(l :: S, M, E, load :: C, K)
% (M(l) :: S, M, E, C, K)
2
실행 과정 2
(true :: S, M, E, jtr(C1, C2) :: C, K)
! (S, M, E, C1 :: C, K)
(false :: S, M, E, jtr(C1, C2) :: C, K)
! (S, M, E, C2 :: C, K)
(S, M, E, malloc :: C, K)
! ("a, 0# :: S, M, E, C, K) new a
(w1 :: · · · :: wz :: S, M, E, box z :: C, K)
! ([w1, · · · , wz] :: S, M, E, C, K)
([w1, · · · , wz] :: S, M, E, unbox x :: C, K)
! (v :: S, M, E, C, K) wk = (x, v), 1 $ k $ z
(w :: S, M, E, bind x :: C, K)
! (S, M, (x,w) :: E, C, K)
(S, M, (x,w) :: E, unbind :: C, K)
! ((x,w) :: S, M, E, C, K)
(l :: v :: (x,C !, E!) :: S, M, E, call :: C, K)
! (S, M{l %& v}, (x, l) :: E!, C !, (C,E) :: K)
(S, M, E, empty , (C,E!) :: K)
! (S, M, E!, C, K)
(S, M, E, get :: C, K)
! (z :: S, M, E, C, K) read z from outside
(z :: S, M, E, put :: C, K)
! (S, M, E, C, K) print z and newline
3
레코드 만들기
레코드 필드 접근
실행 과정 3
(true :: S, M, E, jtr(C1, C2) :: C, K)
! (S, M, E, C1 :: C, K)
(false :: S, M, E, jtr(C1, C2) :: C, K)
! (S, M, E, C2 :: C, K)
(S, M, E, malloc :: C, K)
! ("a, 0# :: S, M, E, C, K) new a
(w1 :: · · · :: wz :: S, M, E, box z :: C, K)
! ([w1, · · · , wz] :: S, M, E, C, K)
([w1, · · · , wz] :: S, M, E, unbox x :: C, K)
! (v :: S, M, E, C, K) wk = (x, v), 1 $ k $ z
(w :: S, M, E, bind x :: C, K)
! (S, M, (x,w) :: E, C, K)
(S, M, (x,w) :: E, unbind :: C, K)
! ((x,w) :: S, M, E, C, K)
(l :: v :: (x,C !, E!) :: S, M, E, call :: C, K)
! (S, M{l %& v}, (x, l) :: E!, C !, (C,E) :: K)
(S, M, E, empty , (C,E!) :: K)
! (S, M, E!, C, K)
(S, M, E, get :: C, K)
! (z :: S, M, E, C, K) read z from outside
(z :: S, M, E, put :: C, K)
! (S, M, E, C, K) print z and newline
3
실행 과정 4(v2 :: v1 :: S, M, E, add :: C, K)
! (plus(v1, v2) :: S, M, E, C, K)
(v2 :: v1 :: S, M, E, sub :: C, K)
! (minus(v1, v2) :: S, M, E, C, K)
(z2 :: z1 :: S, M, E, mul :: C, K)
! ((z1 " z2) :: S, M, E, C, K) similar for div
(v2 :: v1 :: S, M, E, eq :: C, K)
! (equal(v1, v2) :: S, M, E, C, K)
(v2 :: v1 :: S, M, E, less :: C, K)
! (less(v1, v2) :: S, M, E, C, K)
(b :: S, M, E, not :: C, K)
! (¬b :: S, M, E, C, K)
less(z1, z2) = z1 < z2
plus(z1, z2) = z1 + z2
plus(#a, z1$, z2) = #a, z1 + z2$ if z1 + z2 % 0
plus(z1, #a, z2$) = #a, z1 + z2$ if z1 + z2 % 0
minus(z1, z2) = z1 & z2
minus(#a, z1$, z2) = #a, z1 & z2$ if z1 & z2 % 0
equal(z1, z2) = z1 = z2
equal(b1, b2) = b1 = b2
equal(·, ·) = true
equal(r1, r2) = ('#x, l$ ( r1 : #x, l$ ( r2) ) ('#x, l$ ( r2 : #x, l$ ( r1)
equal(#a1, z1$, #a2, z2$) = a1 = a2 ) z1 = z2
equal( , ) = false
SM5! !!!! C! !"#!" !", C" "!# #" ! !$!!! $
!! !!# !"%! "!$ %!" "&!:
(empty , empty , empty , C, empty) ! · · · ! · · ·
4
프로그램 실행
(v2 :: v1 :: S, M, E, add :: C, K)
! (plus(v1, v2) :: S, M, E, C, K)
(v2 :: v1 :: S, M, E, sub :: C, K)
! (minus(v1, v2) :: S, M, E, C, K)
(z2 :: z1 :: S, M, E, mul :: C, K)
! ((z1 " z2) :: S, M, E, C, K) similar for div
(v2 :: v1 :: S, M, E, eq :: C, K)
! (equal(v1, v2) :: S, M, E, C, K)
(v2 :: v1 :: S, M, E, less :: C, K)
! (less(v1, v2) :: S, M, E, C, K)
(b :: S, M, E, not :: C, K)
! (¬b :: S, M, E, C, K)
less(z1, z2) = z1 < z2
plus(z1, z2) = z1 + z2
plus(#a, z1$, z2) = #a, z1 + z2$ if z1 + z2 % 0
plus(z1, #a, z2$) = #a, z1 + z2$ if z1 + z2 % 0
minus(z1, z2) = z1 & z2
minus(#a, z1$, z2) = #a, z1 & z2$ if z1 & z2 % 0
equal(z1, z2) = z1 = z2
equal(b1, b2) = b1 = b2
equal(·, ·) = true
equal(r1, r2) = ('#x, l$ ( r1 : #x, l$ ( r2) ) ('#x, l$ ( r2 : #x, l$ ( r1)
equal(#a1, z1$, #a2, z2$) = a1 = a2 ) z1 = z2
equal( , ) = false
SM5! !!!! C! !"#!" !", C" "!# #" ! !$!!! $
!! !!# !"%! "!$ %!" "&!:
(empty , empty , empty , C, empty) ! · · · ! · · ·
4
!!!!,
push 1 :: push 2 :: add :: put :: empty
! K-- !!!! write 1+2! "! "# "# "".
""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "
# "! SM5 !!!!'! "!"! $!
trans: K.program -> Sm5.command
! (""! $$".
trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"
Sm5.run(trans(E))# "&%! "*# ! +# $$".
!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !
Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”
SM5 "!"%!! !'! #! !!$ ##% "$# ! &".
$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#
!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##
"! $! gc! /#"$. #,
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l
$ #%" "$ ")% $$":
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213
(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213
,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#
# ! +! "!$# !'# % $$". !"' "!!! $, !+ #!) &
() "!( " )%! "! $$ %%' !' "!" ##!$ % $$".
!
5
!!!!,
push 1 :: push 2 :: add :: put :: empty
! K-- !!!! write 1+2! "! "# "# "".
""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "
# "! SM5 !!!!'! "!"! $!
trans: K.program -> Sm5.command
! (""! $$".
trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"
Sm5.run(trans(E))# "&%! "*# ! +# $$".
!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !
Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”
SM5 "!"%!! !'! #! !!$ ##% "$# ! &".
$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#
!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##
"! $! gc! /#"$. #,
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l
$ #%" "$ ")% $$":
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213
(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213
,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#
# ! +! "!$# !'# % $$". !"' "!!! $, !+ #!) &
() "!( " )%! "! $$ %%' !' "!" ##!$ % $$".
!
5
!!!!,
push 1 :: push 2 :: add :: put :: empty
! K-- !!!! write 1+2! "! "# "# "".
""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "
# "! SM5 !!!!'! "!"! $!
trans: K.program -> Sm5.command
! (""! $$".
trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"
Sm5.run(trans(E))# "&%! "*# ! +# $$".
!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !
Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”
SM5 "!"%!! !'! #! !!$ ##% "$# ! &".
$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#
!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##
"! $! gc! /#"$. #,
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l
$ #%" "$ ")% $$":
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213
(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213
,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#
# ! +! "!$# !'# % $$". !"' "!!! $, !+ #!) &
() "!( " )%! "! $$ %%' !' "!" ##!$ % $$".
!
5
번역기 작성
Bonus 점수 30점
!!!!,
push 1 :: push 2 :: add :: put :: empty
! K-- !!!! write 1+2! "! "# "# "".
""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "
# "! SM5 !!!!'! "!"! $!
trans: K.program -> Sm5.command
! (""! $$".
trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"
Sm5.run(trans(E))# "&%! "*# ! +# $$".
!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !
Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”
SM5 "!"%!! !'! #! !!$ ##% "$# ! &".
$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#
!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##
"! $! gc! /#"$. #,
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l
$ #%" "$ ")% $$":
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213
(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213
,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#
# ! +! "!$# !'# % $$". !"' "!!! $, !+ #!) &
() "!( " )%! "! $$ %%' !' "!" ##!$ % $$".
!
5
!!!!,
push 1 :: push 2 :: add :: put :: empty
! K-- !!!! write 1+2! "! "# "# "".
""!$ # $!, % !#%! K-- !!!!# &"'! !#! "! "
# "! SM5 !!!!'! "!"! $!
trans: K.program -> Sm5.command
! (""! $$".
trans% !"! ")#$!!!, K-- !!!! E% "%!, K.run(E)"
Sm5.run(trans(E))# "&%! "*# ! +# $$".
!$ Sm5, !$ K, !"& K--) !!! !'""(TA "$! !&). !
Exercise 2 (30pts) “SM5 Limited = SM5 + "!" ,##”
SM5 "!"%!! !'! #! !!$ ##% "$# ! &".
$!, SM5)"!"! 8K(213)()##$+"&"-. .)"!%!#
!" !$ Sm5! #! &"!, malloc# $$ #$# &# ! "!"! ,##
"! $! gc! /#"$. #,
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l
$ #%" "$ ")% $$":
(S,M,E, malloc :: C,K) ! (l :: S,M,E,C,K) new l, if |domM | < 213
(S,M,E, malloc :: C,K) ! (l :: S, gc(· · ·), E,C,K) recycled l, if |domM | = 213
,##$! gc! "! "$#" %' *#"". $, "!"%! #%% $#
# ! +! "!$# !'# % $$". !"' "!!! $, !+ #!) &
() "!( " )%! "! $$ %%' !' "!" ##!$ % $$".
!
5
=
CPSContinuation Passing Style
•다음의 할 일 (continuation)을 명시적으로 표현하는 방식
•모든 함수는 다음의 할 일을 인자로 받는다.
•함수 호출의 인자는 모두 값이거나 lambda expression 이다.
CPS Transformation
λx.λy.x+ y
let rec fac = λn. if n then 1 else n ∗ (fac(n− 1))
let rec faccps = λn.λκ. if n then (κ 1) else faccps(n− 1)(λres.κ(res ∗ n))else faccps(n− 1)(λr.κ (r ∗ n))
λx.λy.λκ.κ (x+ y)
let rec faccps = λn.λκ. if n then (κ 1) else faccps(n− 1)(λres.κ(res ∗ n))else faccps(n− 1)(λr.κ (r ∗ n))
faccps 2 (λx.x)
faccps 1 (λr.(λx.x)(r ∗ 2))
faccps 0 (λr.(λr.(λx.x)(r ∗ 2)) (r ∗ 1))
(λr.(λr.(λx.x)(r ∗ 2)) (r ∗ 1)) 1
(λr.(λx.x)(r ∗ 2)) (1 ∗ 1)
(λx.x) (1 ∗ 2)