ajhc haskell compiler with reentrant gc

52
Ajhc Haskell Compiler with Reentrant GC Ajhc Haskell Compiler with Reentrant GC Ajhc Haskell Compiler with Reentrant GC Ajhc Haskell Compiler with Reentrant GC Ajhc Haskell Compiler with Reentrant GC Kiwamu Okabe @ Metasepi Project Kiwamu Okabe @ Metasepi Project Kiwamu Okabe @ Metasepi Project Kiwamu Okabe @ Metasepi Project Kiwamu Okabe @ Metasepi Project

Upload: kiwamu-okabe

Post on 08-Sep-2014

1.060 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Ajhc Haskell Compiler with Reentrant GC

Ajhc Haskell Compiler with Reentrant GC

Ajhc Haskell Compiler with Reentrant GC

Ajhc Haskell Compiler with Reentrant GC

Ajhc Haskell Compiler with Reentrant GC

Ajhc Haskell Compiler withReentrant GC

Kiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi ProjectKiwamu Okabe @ Metasepi Project

Page 2: Ajhc Haskell Compiler with Reentrant GC

Who am I?Who am I?Who am I?Who am I?Who am I?

☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/☆ http://www.masterq.net/

☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer☆ Self employed software engineer

☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN☆ Trade name := METASEPI DESIGN

☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project☆ Founder of Metasepi Project

☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer☆ A Debian Maintainer

☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD☆ 10 years' experience in developing OS using NetBSD

Page 3: Ajhc Haskell Compiler with Reentrant GC

Demo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in HaskellDemo: NetBSD driver in Haskell

☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound☆ NetBSD audio driver play sound

☆ The driver's interrupt handler rewrited using Haskell☆ The driver's interrupt handler rewrited using Haskell☆ The driver's interrupt handler rewrited using Haskell☆ The driver's interrupt handler rewrited using Haskell☆ The driver's interrupt handler rewrited using Haskell

☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler☆ GC occurs in interrupt handler

☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at following☆ Watch the movie at followinghttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cAhttps://www.youtube.com/watch?v=XEYcR5RG5cA

☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014☆ Paper for Haskell Symposium 2014http://metasepi.org/doc/metasepi-icfp2014.pdfhttp://metasepi.org/doc/metasepi-icfp2014-demo.pdfhttp://metasepi.org/doc/metasepi-icfp2014.pdfhttp://metasepi.org/doc/metasepi-icfp2014-demo.pdfhttp://metasepi.org/doc/metasepi-icfp2014.pdfhttp://metasepi.org/doc/metasepi-icfp2014-demo.pdfhttp://metasepi.org/doc/metasepi-icfp2014.pdfhttp://metasepi.org/doc/metasepi-icfp2014-demo.pdfhttp://metasepi.org/doc/metasepi-icfp2014.pdfhttp://metasepi.org/doc/metasepi-icfp2014-demo.pdf

Page 4: Ajhc Haskell Compiler with Reentrant GC

AgendaAgendaAgendaAgendaAgenda

☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell☆ [1] Demo: NetBSD driver in Haskell

☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?☆ [2] What's Metasepi?

☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?☆ [3] What's Ajhc compiler?

☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context☆ [4] Reentrancy and Context

☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)☆ [5] Context Local Heap (CLHs)

☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?☆ [6] How to write Haskell driver?

☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?☆ [7] What's coming next?

Page 5: Ajhc Haskell Compiler with Reentrant GC

[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?[2] What's Metasepi?

http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/http://metasepi.org/

☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.☆ Unix-like OS designed by strong type.

☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.☆ Using ML or more strong type lang.

Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/Haskell http://www.haskell.org/

OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/OCaml http://caml.inria.fr/

MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/MLton http://mlton.org/

. . . and suchlike.. . . and suchlike.. . . and suchlike.. . . and suchlike.. . . and suchlike.

Page 6: Ajhc Haskell Compiler with Reentrant GC

Why need Metasepi?Why need Metasepi?Why need Metasepi?Why need Metasepi?Why need Metasepi?

☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.☆ We have already Linux or Windows.

☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.☆ But the developers are suffering.

☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,☆ If use the kernel changed by you,

☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.☆ you will get many runtime error.

☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.☆ Difficult even to reproduce it.

Page 7: Ajhc Haskell Compiler with Reentrant GC

Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?Doesn't OSS have good quality?

☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"☆ "The Cathedral and the Bazaar"

☆ "Given enough eyeballs, all bugs are shallow."☆ "Given enough eyeballs, all bugs are shallow."☆ "Given enough eyeballs, all bugs are shallow."☆ "Given enough eyeballs, all bugs are shallow."☆ "Given enough eyeballs, all bugs are shallow."http://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.html

☆ But if you develop your own product re-using OSS...☆ But if you develop your own product re-using OSS...☆ But if you develop your own product re-using OSS...☆ But if you develop your own product re-using OSS...☆ But if you develop your own product re-using OSS...

Page 8: Ajhc Haskell Compiler with Reentrant GC

Low quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrellaLow quality out of OSS umbrella

Page 9: Ajhc Haskell Compiler with Reentrant GC

Type safetyType safetyType safetyType safetyType safety

☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.☆ Less runtime errors.

☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"☆ "数理科学的バグ撲滅方法論のすすめ"http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248230/

Page 10: Ajhc Haskell Compiler with Reentrant GC

Kernel wants type desperatelyKernel wants type desperatelyKernel wants type desperatelyKernel wants type desperatelyKernel wants type desperately

☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.☆ Kernels are developed with C lang.

☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV☆ Error on user space => SEGV

☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!☆ Error on kernel space => Halt!

☆ Should design kernel with the greatest care.☆ Should design kernel with the greatest care.☆ Should design kernel with the greatest care.☆ Should design kernel with the greatest care.☆ Should design kernel with the greatest care.

☆ C language is safe?☆ C language is safe?☆ C language is safe?☆ C language is safe?☆ C language is safe?

Page 11: Ajhc Haskell Compiler with Reentrant GC

Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?Remember Heartbleed bug?

Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?Should we use safer language than C?== In English =="Preventing heartbleed bugs with safe programming languages"http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.html

== In Japanease =="安全なプログラミング言語を使って heartbleed を防ぐには"https://github.com/jats-ug/translate/blob/master/Web/bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.md

== In English =="Preventing heartbleed bugs with safe programming languages"http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.html

== In Japanease =="安全なプログラミング言語を使って heartbleed を防ぐには"https://github.com/jats-ug/translate/blob/master/Web/bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.md

== In English =="Preventing heartbleed bugs with safe programming languages"http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.html

== In Japanease =="安全なプログラミング言語を使って heartbleed を防ぐには"https://github.com/jats-ug/translate/blob/master/Web/bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.md

== In English =="Preventing heartbleed bugs with safe programming languages"http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.html

== In Japanease =="安全なプログラミング言語を使って heartbleed を防ぐには"https://github.com/jats-ug/translate/blob/master/Web/bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.md

== In English =="Preventing heartbleed bugs with safe programming languages"http://bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.html

== In Japanease =="安全なプログラミング言語を使って heartbleed を防ぐには"https://github.com/jats-ug/translate/blob/master/Web/bluishcoder.co.nz/2014/04/11/preventing-heartbleed-bugs-with-safe-languages.md

"A safer systems programming language could have prevented the bug.""A safer systems programming language could have prevented the bug.""A safer systems programming language could have prevented the bug.""A safer systems programming language could have prevented the bug.""A safer systems programming language could have prevented the bug."

Page 12: Ajhc Haskell Compiler with Reentrant GC

[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?[3] What's Ajhc compiler?

http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/http://ajhc.metasepi.org/

☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc☆ Ajhc := Arafura designed jhc

☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler☆ jhc := John's Haskell Compiler

☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/☆ http://repetae.net/computer/jhc/

☆ Jhc outputs binary that has low-memory-footprint and runs fast.☆ Jhc outputs binary that has low-memory-footprint and runs fast.☆ Jhc outputs binary that has low-memory-footprint and runs fast.☆ Jhc outputs binary that has low-memory-footprint and runs fast.☆ Jhc outputs binary that has low-memory-footprint and runs fast.

Page 13: Ajhc Haskell Compiler with Reentrant GC

Who is John?Who is John?Who is John?Who is John?Who is John?

☆ John Meacham☆ John Meacham☆ John Meacham☆ John Meacham☆ John Meacham

☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/☆ http://repetae.net/

Page 14: Ajhc Haskell Compiler with Reentrant GC

Why choose jhc?Why choose jhc?Why choose jhc?Why choose jhc?Why choose jhc?

Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values.

Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values.

Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values.

Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values.

Programs to print "hoge" on terminal. The lesser depends on POSIX, the smaller values.

Page 15: Ajhc Haskell Compiler with Reentrant GC

Jhc is translator to C languageJhc is translator to C languageJhc is translator to C languageJhc is translator to C languageJhc is translator to C language

Page 16: Ajhc Haskell Compiler with Reentrant GC

[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context[4] Reentrancy and Context

☆ Metasepi needs language implementation supporting reentrancy.☆ Metasepi needs language implementation supporting reentrancy.☆ Metasepi needs language implementation supporting reentrancy.☆ Metasepi needs language implementation supporting reentrancy.☆ Metasepi needs language implementation supporting reentrancy.

☆ Why?☆ Why?☆ Why?☆ Why?☆ Why?

Page 17: Ajhc Haskell Compiler with Reentrant GC

Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?Why need Reentrancy?

☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking☆ There are 2 way for multitasking

☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking☆ [A] Nonpreemptive multitasking

☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking☆ [B] Preemptive multitasking

☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]☆ Unix-like OS needs [B]

☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts☆ [B] needs the hardware interrupts

☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant☆ Interrupt handler should be reentrant

Page 18: Ajhc Haskell Compiler with Reentrant GC

What's Reentrancy?What's Reentrancy?What's Reentrancy?What's Reentrancy?What's Reentrancy?Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution.

Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution.

Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution.

Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution.

Reentrant code can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution.

Page 19: Ajhc Haskell Compiler with Reentrant GC

What's Context on C language?What's Context on C language?What's Context on C language?What's Context on C language?What's Context on C language?

☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks☆ A set of registers and call stacks

Page 20: Ajhc Haskell Compiler with Reentrant GC

Where Context come from?Where Context come from?Where Context come from?Where Context come from?Where Context come from?

Page 21: Ajhc Haskell Compiler with Reentrant GC

What's Context switch?What's Context switch?What's Context switch?What's Context switch?What's Context switch?The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time.

The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time.

The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time.

The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time.

The process of storing and restoring the state (context) of a process or thread so that execution can be resumed from the same point at a later time.

Page 22: Ajhc Haskell Compiler with Reentrant GC

Support reentrancy with GCSupport reentrancy with GCSupport reentrancy with GCSupport reentrancy with GCSupport reentrancy with GC

☆ Metasepi uses strongly typed language☆ Metasepi uses strongly typed language☆ Metasepi uses strongly typed language☆ Metasepi uses strongly typed language☆ Metasepi uses strongly typed language

☆ Strongly typed language sometimes needs GC☆ Strongly typed language sometimes needs GC☆ Strongly typed language sometimes needs GC☆ Strongly typed language sometimes needs GC☆ Strongly typed language sometimes needs GC

☆ Most languages doesn't support reentrancy with GC☆ Most languages doesn't support reentrancy with GC☆ Most languages doesn't support reentrancy with GC☆ Most languages doesn't support reentrancy with GC☆ Most languages doesn't support reentrancy with GC

☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?☆ How to support reentrancy with GC?

Page 23: Ajhc Haskell Compiler with Reentrant GC

Problem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GCProblem: Interrupt and GC

Page 24: Ajhc Haskell Compiler with Reentrant GC

[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)[5] Context Local Heap (CLHs)

☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap☆ Idea: Isolate contexts by local heap

Page 25: Ajhc Haskell Compiler with Reentrant GC

Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?Isolated contexts are reentrant?

Page 26: Ajhc Haskell Compiler with Reentrant GC

Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"Let's define "Haskell Context"

Page 27: Ajhc Haskell Compiler with Reentrant GC

Haskell Context on jhcHaskell Context on jhcHaskell Context on jhcHaskell Context on jhcHaskell Context on jhc

Page 28: Ajhc Haskell Compiler with Reentrant GC

Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)Haskell Context life cycle (jhc)

Page 29: Ajhc Haskell Compiler with Reentrant GC

Interaction with C on jhcInteraction with C on jhcInteraction with C on jhcInteraction with C on jhcInteraction with C on jhc

Page 30: Ajhc Haskell Compiler with Reentrant GC

Haskell Context on AjhcHaskell Context on AjhcHaskell Context on AjhcHaskell Context on AjhcHaskell Context on Ajhc

Page 31: Ajhc Haskell Compiler with Reentrant GC

Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)Haskell Context life cycle (Ajhc)

Page 32: Ajhc Haskell Compiler with Reentrant GC

Interaction with C on AjhcInteraction with C on AjhcInteraction with C on AjhcInteraction with C on AjhcInteraction with C on Ajhc

Page 33: Ajhc Haskell Compiler with Reentrant GC

[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?[6] How to write Haskell driver?

☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler☆ Language: Ajhc Haskell compiler

☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel☆ Base code: NetBSD kernel

☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development☆ Method: Snatch-driven development

Page 34: Ajhc Haskell Compiler with Reentrant GC

Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1Snatch-driven development #1

http://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcherhttp://en.wikipedia.org/wiki/Snatcher

Page 35: Ajhc Haskell Compiler with Reentrant GC

Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2Snatch-driven development #2

Page 36: Ajhc Haskell Compiler with Reentrant GC

To access out of GC heepTo access out of GC heepTo access out of GC heepTo access out of GC heepTo access out of GC heep

Page 37: Ajhc Haskell Compiler with Reentrant GC

Generate code to access C structGenerate code to access C structGenerate code to access C structGenerate code to access C structGenerate code to access C struct

https://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hshttps://github.com/ajhc/struct2hs$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail$ struct2hs sys/dev/pci/auich_extern_SNATCHED.h | tail

offsetOf_Pdevinit_pdev_attach :: Intp_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ()))))p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attachforeign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO ()foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Intp_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count

offsetOf_Pdevinit_pdev_attach :: Intp_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ()))))p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attachforeign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO ()foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Intp_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count

offsetOf_Pdevinit_pdev_attach :: Intp_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ()))))p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attachforeign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO ()foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Intp_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count

offsetOf_Pdevinit_pdev_attach :: Intp_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr (Int -> IO ()))))p_Pdevinit_pdev_attach p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_attachforeign import ccall "dynamic" call_Pdevinit_pdev_attach :: FunPtr (Int -> IO ()) -> Int -> IO ()foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Intp_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)p_Pdevinit_pdev_count p = return $ plusPtr p $ offsetOf_Pdevinit_pdev_count

offsetOf_Pdevinit_pdev_attach :: Intp_Pdevinit_pdev_attach :: Ptr Pdevinit -> IO (Ptr (Ptr (FunPtr(Int -> IO ()))))p_Pdevinit_pdev_attach p = return $ plusPtr p $offsetOf_Pdevinit_pdev_attachforeign import ccall "dynamic" call_Pdevinit_pdev_attach ::FunPtr (Int -> IO ()) -> Int -> IO ()

foreign import primitive "const.offsetof(struct pdevinit, pdev_count)" offsetOf_Pdevinit_pdev_count :: Intp_Pdevinit_pdev_count :: Ptr Pdevinit -> IO (Ptr Int)p_Pdevinit_pdev_count p = return $ plusPtr p $offsetOf_Pdevinit_pdev_count

Page 38: Ajhc Haskell Compiler with Reentrant GC

Access C struct in kernelAccess C struct in kernelAccess C struct in kernelAccess C struct in kernelAccess C struct in kernel/* C code */static intauich_set_port(void *v, mixer_ctrl_t *cp){ struct auich_softc *sc;

sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);}

/* C code */static intauich_set_port(void *v, mixer_ctrl_t *cp){ struct auich_softc *sc;

sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);}

/* C code */static intauich_set_port(void *v, mixer_ctrl_t *cp){ struct auich_softc *sc;

sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);}

/* C code */static intauich_set_port(void *v, mixer_ctrl_t *cp){ struct auich_softc *sc;

sc = v; return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);}

/* C code */static intauich_set_port(void *v, mixer_ctrl_t *cp){

struct auich_softc *sc;

sc = v;return sc->codec_if->vtbl->mixer_set_port(sc->codec_if, cp);

}

-- Haskell codeforeign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp

-- Haskell codeforeign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp

-- Haskell codeforeign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp

-- Haskell codeforeign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek =<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp

-- Haskell codeforeign export ccall "auichSetPort" auichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort :: Ptr AuichSoftc -> Ptr MixerCtrl -> IO IntauichSetPort sc cp = do codecif <- peek =<< p_AuichSoftc_codec_if sc f <- peek =<< p_Ac97CodecIfVtbl_mixer_set_port =<< peek

=<< p_Ac97CodecIf_vtbl codecif call_Ac97CodecIfVtbl_mixer_set_port f codecif cp

Page 39: Ajhc Haskell Compiler with Reentrant GC

AC'97 sound driverAC'97 sound driverAC'97 sound driverAC'97 sound driverAC'97 sound driver

Page 40: Ajhc Haskell Compiler with Reentrant GC

HD Audio sound driverHD Audio sound driverHD Audio sound driverHD Audio sound driverHD Audio sound driver

Page 41: Ajhc Haskell Compiler with Reentrant GC

BenchmarkBenchmarkBenchmarkBenchmarkBenchmark(O) Original NetBSD 6.1.2 kernel(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc(N) (S) + using naive GC(B4) (S) + having GC block 16 Byte(B5) (S) + having GC block 32 Byte(B6) (S) + having GC block 64 Byte

(O) Original NetBSD 6.1.2 kernel(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc(N) (S) + using naive GC(B4) (S) + having GC block 16 Byte(B5) (S) + having GC block 32 Byte(B6) (S) + having GC block 64 Byte

(O) Original NetBSD 6.1.2 kernel(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc(N) (S) + using naive GC(B4) (S) + having GC block 16 Byte(B5) (S) + having GC block 32 Byte(B6) (S) + having GC block 64 Byte

(O) Original NetBSD 6.1.2 kernel(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc(N) (S) + using naive GC(B4) (S) + having GC block 16 Byte(B5) (S) + having GC block 32 Byte(B6) (S) + having GC block 64 Byte

(O) Original NetBSD 6.1.2 kernel(S) The kernel includes AC'97 and HD Audio driver snatched by Ajhc(N) (S) + using naive GC(B4) (S) + having GC block 16 Byte(B5) (S) + having GC block 32 Byte(B6) (S) + having GC block 64 Byte

Page 42: Ajhc Haskell Compiler with Reentrant GC

[7] What's coming next?[7] What's coming next?[7] What's coming next?[7] What's coming next?[7] What's coming next?

Page 43: Ajhc Haskell Compiler with Reentrant GC

What's ATS language?What's ATS language?What's ATS language?What's ATS language?What's ATS language?

http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/http://www.ats-lang.org/

☆ Dependent types☆ Dependent types☆ Dependent types☆ Dependent types☆ Dependent types

☆ Linear types☆ Linear types☆ Linear types☆ Linear types☆ Linear types

☆ Without any runtime☆ Without any runtime☆ Without any runtime☆ Without any runtime☆ Without any runtime

☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC

☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University☆ Developing at Boston University

☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi☆ Designer := Hongwei Xi

>>>>>

Page 44: Ajhc Haskell Compiler with Reentrant GC

Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Date: Mon Dec 23 11:40 JST 2013

Hi Metasepi-chan,

I spent quite some time today browsing metasepi.org.

I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS.

I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus.

Date: Mon Dec 23 11:40 JST 2013

Hi Metasepi-chan,

I spent quite some time today browsing metasepi.org.

I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS.

I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus.

Date: Mon Dec 23 11:40 JST 2013

Hi Metasepi-chan,

I spent quite some time today browsing metasepi.org.

I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS.

I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus.

Date: Mon Dec 23 11:40 JST 2013

Hi Metasepi-chan,

I spent quite some time today browsing metasepi.org.

I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS.

I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus.

Date: Mon Dec 23 11:40 JST 2013

Hi Metasepi-chan,

I spent quite some time today browsing metasepi.org.

I am really interested in your Metasepi project, partly because I myself wanted to implement NetBSD in ATS about 5 years ago. Unfortunately, I never had time to get the project started as I needed to spend so much time on ATS2. By the way, I had planned to use the very same approach which you call "Snatch". I had also considered Minix but I chose NetBSD because it was a real OS.

I think I know first-handedly the dilemma you are currently in. On one hand, you want to be able to fully focus on writing the kernel. On the other hand, you also need to add features to Ajhc constantly to address all kinds of issues that keep popping up, which undoubtedly makes it very difficult for you to focus.

>>>>>

Page 45: Ajhc Haskell Compiler with Reentrant GC

Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)Hongwei said... (cont.)I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :)

I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users.

I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap.

I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :)

I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users.

I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap.

I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :)

I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users.

I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap.

I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :)

I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users.

I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap.

I would highly recommend that you use ATS to implement NetBSD kernel. Unlike jhc, there is no semantics gap between ATS and C. In particular, they both use the same native unboxed data representation. Once you become familiar with ATS, you can readily visualize the C code that your ATS source is to be compiled into. ATS is truly an ideal language for the kind of "Snatch" approach you want to take to re-write NetBSD. If you take the lead, then I will be happy to "chip in" :)

I also spent some time reading documentation on jhc. Personally, I feel that there is simply too much uncertainty to use it in real kernel implementation. Features like GC could make the kernel highly unpredictable, scaring away potential users.

I think that we both believe C is the right language for systems programming. The problem with C is that it is too difficult to write correct C programs. ATS is designed to allow the programmer to correctly write the kind of C programs he or she wanted to write in the first place. While jhc generates C code, the kind of C code it generates may not be suited for kernel. This is what I call a semantics gap.

>>>>>

Page 46: Ajhc Haskell Compiler with Reentrant GC

Hongwei said...Hongwei said...Hongwei said...Hongwei said...Hongwei said...I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise.

Cheers,

--Hongwei

I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise.

Cheers,

--Hongwei

I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise.

Cheers,

--Hongwei

I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise.

Cheers,

--Hongwei

I write this message in the hope that we could join effort in doing something that has not been done up to now: Writing a real kernel in (largely) functional style that can truly deliever safety-wise as well as performance-wise.

Cheers,

--Hongwei

>>>>>

Page 47: Ajhc Haskell Compiler with Reentrant GC

Follow me!Follow me!Follow me!Follow me!Follow me!

☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/☆ http://jats-ug.metasepi.org/

☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug☆ https://twitter.com/jats_ug

>>>>>

Page 48: Ajhc Haskell Compiler with Reentrant GC

License of photos used #1License of photos used #1License of photos used #1License of photos used #1License of photos used #1* ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0* Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0* Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0* Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0

* ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0* Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0* Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0* Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0

* ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0* Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0* Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0* Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0

* ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0* Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0* Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0* Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0

* ゴミ収集車 | Flickr - Photo Sharing! https://www.flickr.com/photos/shuto/8816770503/ Copyright: 2013 Shuto Araki / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931247866/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Hooded Cuttlefish | Flickr - Photo Sharing! https://www.flickr.com/photos/silkebaron/931381358/ Copyright: 2007 Silke Baron / License: CC BY 2.0* Javi Recio y David Cabrera | Flickr - Photo Sharing! https://www.flickr.com/photos/otakumunidad/5787704531/ Copyright: 2011 Otakumunidad Damned / License: CC BY 2.0* Obsolete CDs | Flickr - Photo Sharing! https://www.flickr.com/photos/automaciej/203064118 Copyright: 2006 Maciej Bliziński / License: CC BY-SA 2.0* Рынок / Bazaar | Flickr - Photo Sharing! https://www.flickr.com/photos/atbaker/81637 Copyright: 2004 Adam Baker / License: CC BY 2.0* Cheonggyecheon Umbrellas | Flickr - Photo Sharing! https://www.flickr.com/photos/traveloriented/13436873274 Copyright: 2014 travel oriented / License: CC BY-SA 2.0

>>>>>

Page 49: Ajhc Haskell Compiler with Reentrant GC

License of photos used #2License of photos used #2License of photos used #2License of photos used #2License of photos used #2* Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0* Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0* Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0* Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0* jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0

* Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0* Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0* Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0* Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0* jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0

* Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0* Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0* Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0* Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0* jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0

* Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0* Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0* Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0* Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0* jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0

* Jordan shooting Jenna with shield | Flickr - Photo Sharing! https://www.flickr.com/photos/jasoneppink/80772834 Copyright: 2005 Jason Eppink / License: CC BY 2.0* Imagine a world without trees | Flickr - Photo Sharing! https://www.flickr.com/photos/aloshbennett/3480223314 Copyright: 2009 Alosh Bennett / License: CC BY 2.0* Soyuz TM-19 Re-entry Capsule | Flickr - Photo Sharing! https://www.flickr.com/photos/pasukaru76/10543300415 Copyright: 2013 Pascal / License: CC BY 2.0* Do You Know Where Your Valves Are? | Flickr - Photo Sharing! https://www.flickr.com/photos/thristian/371670597 Copyright: 2007 Timothy Allen / License: CC BY-SA 2.0* Whirlpool | Flickr - Photo Sharing! https://www.flickr.com/photos/59195512@N00/4697467290 Copyright: 2010 The Mighty Tim Inconnu / License: CC BY 2.0* jumping for the sunset | Flickr - Photo Sharing! https://www.flickr.com/photos/jorgempf/233188420 Copyright: 2006 Jorge / License: CC BY-SA 2.0* DIY: Shutter Release Switch for Canon DSLRs | Flickr - Photo Sharing! https://www.flickr.com/photos/ivyfield/4763965911 Copyright: 2010 Yutaka Tsutano / License: CC BY 2.0

>>>>>

Page 50: Ajhc Haskell Compiler with Reentrant GC

License of photos used #3License of photos used #3License of photos used #3License of photos used #3License of photos used #3* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0* Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0* The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0* Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0* Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0

* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0* Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0* The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0* Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0* Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0

* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0* Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0* The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0* Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0* Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0

* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0* Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0* The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0* Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0* Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0

* 72C Duna SHEER MADNESS Lab Re-entry | Flickr - Photo Sharing! https://www.flickr.com/photos/39416639@N02/12702229414 Copyright: 2014 TheBullethead / License: CC BY 2.0* Supernova Remnant W49B | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/4479812068 Copyright: 2009 NASA Goddard Space Flight Center / License: CC BY 2.0* The Great Wall of China | Flickr - Photo Sharing! https://www.flickr.com/photos/kk/2149165957 Copyright: 2007 kris krüg / License: CC BY-SA 2.0* Headshift business card discussion | Flickr - Photo Sharing! https://www.flickr.com/photos/criminalintent/2744040362 Copyright: 2008 Lars Plougmann / License: CC BY-SA 2.0* Bali Indonesia | Flickr - Photo Sharing! https://www.flickr.com/photos/julzart/9266448615 Copyright: 2013 julia Chapple / License: CC BY 2.0* Scuba diving Indonesia - Bali - Komodo - Bunaken 2008 | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/3666275538 Copyright: 2008 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0

>>>>>

Page 51: Ajhc Haskell Compiler with Reentrant GC

License of photos used #4License of photos used #4License of photos used #4License of photos used #4License of photos used #4* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0* Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0* 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0

* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0* Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0* 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0

* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0* Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0* 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0

* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0* Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0* 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0

* Scuba diving Bali Nusa Lembongan | Flickr - Photo Sharing! https://www.flickr.com/photos/39891373@N07/4177189387 Copyright: 2009 Ilse Reijs and Jan-Noud Hutten / License: CC BY 2.0* Project 365 #56: 250210 Thanks For The Memory | Flickr - Photo Sharing! https://www.flickr.com/photos/comedynose/4388430444 Copyright: 2010 Pete / License: CC BY 2.0* Audio Codec 97 - Wikipedia http://ja.wikipedia.org/wiki/Audio_Codec_97#mediaviewer/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Realtek_alc655.jpg Copyright: 2007 Futase tdkr / License: CC BY-SA 3.0* 紙飛行機 | Flickr - Photo Sharing! https://www.flickr.com/photos/32926922@N08/4281868756 Copyright: 2010 バイク便八王子立川所沢 / License: CC BY 2.0* Antares Rocket With Cygnus Spacecraft Launches | Flickr - Photo Sharing! https://www.flickr.com/photos/gsfc/9807812154 Copyright: 2013 NASA Goddard Space Flight Center / License: CC BY 2.0

>>>>>

Page 52: Ajhc Haskell Compiler with Reentrant GC

License of photos used #5License of photos used #5License of photos used #5License of photos used #5License of photos used #5* Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0* e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0* File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0* Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0* Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0

* Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0* e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0* File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0* Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0* Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0

* Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0* e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0* File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0* Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0* Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0

* Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0* e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0* File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0* Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0* Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0

* Boston à l'heure bleue | Flickr - Photo Sharing! https://www.flickr.com/photos/ensh/4769294947 Copyright: 2010 Emmanuel Huybrechts / License: CC BY 2.0* e-mail symbol | Flickr - Photo Sharing! https://www.flickr.com/photos/gsi-r/5341765493 Copyright: 2007 Micky Aldridge / License: CC BY 2.0* File:Göteborg in moon light.jpg - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/File:G%C3%B6teborg_in_moon_light.jpg Copyright: 2004 Amjad Sheikh / License: CC BY-SA 3.0* Creative Commons BBB | Flickr - Photo Sharing! https://www.flickr.com/photos/steren/2732488224 Copyright: 2008 Steren Giannini / License: CC BY 2.0* Full body | Flickr - Photo Sharing! https://www.flickr.com/photos/timothytsuihin/2852272823 Copyright: 2008 Timothy Tsui / License: CC BY-SA 2.0

>>>>>