組込向けhaskellコンパイラajhc / posix依存から脱出しよう編

41
組込向けHaskellコンパイラAjhc POSIX依存から脱出しよう編 組込向けHaskellコンパイラAjhc POSIX依存から脱出しよう編 組込向けHaskellコンパイラAjhc POSIX依存から脱出しよう編 組込向けHaskellコンパイラAjhc POSIX依存から脱出しよう編 組込向けHaskellコンパイラAjhc POSIX依存から脱出しよう編 Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe

Upload: kiwamu-okabe

Post on 15-Jan-2015

2.573 views

Category:

Technology


6 download

DESCRIPTION

秘密結社Metasepi作戦会議 第3回 @京都 のスライド http://partake.in/events/33be2dc4-19e6-47bf-b6ac-f94f9d70be67 https://www.ospn.jp/osc2013-kyoto/modules/eguide/event.php?eid=72

TRANSCRIPT

Page 1: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

組込向けHaskellコンパイラAjhc POSIX依存から脱出しよう編組込向けHaskellコンパイラAjhc 

POSIX依存から脱出しよう編組込向けHaskellコンパイラAjhc 

POSIX依存から脱出しよう編組込向けHaskellコンパイラAjhc 

POSIX依存から脱出しよう編組込向けHaskellコンパイラAjhc

POSIX依存から脱出しよう編

Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe

Page 2: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

私は誰?私は誰?私は誰?私は誰?私は誰?

☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q☆ Twitter: @master_q

☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催☆ Metasepiプロジェクト主催

☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者☆ Ajhc Haskellコンパイラ開発者

☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer☆ Debian Maintainer

☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました☆ 前はデジタルサイネージの開発してました

☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで☆ その昔はコピー機のOSをNetBSDで

Page 3: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

おしながきおしながきおしながきおしながきおしながき

☆ [1] Ajhcコンパイラとは☆ [1] Ajhcコンパイラとは☆ [1] Ajhcコンパイラとは☆ [1] Ajhcコンパイラとは☆ [1] Ajhcコンパイラとは

☆ [2] Metasepi kernelとは☆ [2] Metasepi kernelとは☆ [2] Metasepi kernelとは☆ [2] Metasepi kernelとは☆ [2] Metasepi kernelとは

☆ [3] OS開発向けコンパイラとは☆ [3] OS開発向けコンパイラとは☆ [3] OS開発向けコンパイラとは☆ [3] OS開発向けコンパイラとは☆ [3] OS開発向けコンパイラとは

☆ [4] Ajhcのインストールと使い方☆ [4] Ajhcのインストールと使い方☆ [4] Ajhcのインストールと使い方☆ [4] Ajhcのインストールと使い方☆ [4] Ajhcのインストールと使い方

☆ [5] AjhcコンパイラでPOSIXの外へ☆ [5] AjhcコンパイラでPOSIXの外へ☆ [5] AjhcコンパイラでPOSIXの外へ☆ [5] AjhcコンパイラでPOSIXの外へ☆ [5] AjhcコンパイラでPOSIXの外へ

☆ [6] これまでのAjhcコンパイラ☆ [6] これまでのAjhcコンパイラ☆ [6] これまでのAjhcコンパイラ☆ [6] これまでのAjhcコンパイラ☆ [6] これまでのAjhcコンパイラ

☆ [7] Ajhcコンパイラの未来☆ [7] Ajhcコンパイラの未来☆ [7] Ajhcコンパイラの未来☆ [7] Ajhcコンパイラの未来☆ [7] Ajhcコンパイラの未来

Page 4: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[1] Ajhcコンパイラとは[1] Ajhcコンパイラとは[1] Ajhcコンパイラとは[1] Ajhcコンパイラとは[1] Ajhcコンパイラとは

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

☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of 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はフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、

☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい

☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも

Page 5: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?どうしてAjhcコンパイラ作るの?

☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト☆ HaskellコミュニティではGHCがデファクト

☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler☆ GHC := Glasgow Haskell Compiler

☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/☆ http://www.haskell.org/ghc/

☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?☆ なぜ別のHaskellコンパイラが必要?

☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため☆ Metasepiというkernelを作るため

Page 6: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[2] Metasepi kernelとは[2] Metasepi kernelとは[2] Metasepi kernelとは[2] Metasepi kernelとは[2] Metasepi kernelとは

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

☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計☆ UNIXモドキkernelを強い型によって設計

☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う☆ ML同等以上に強い型を持つ言語を使う

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/

などなどなどなどなどなどなどなどなどなど

Page 7: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?どうしてMetasepiが必要?

☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?☆ LinuxやWindowsが既にあるのでは?

☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる☆ しかし組込開発は苦しんでいる

☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用☆ kernelをカスタマイズして使用

☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー☆ kernelのランタイムエラー

☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難

Page 8: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?既存OSSの品質は高いのでは?

☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている☆ OSSは品質が高いと言われている

☆ 伽藍とバザール☆ 伽藍とバザール☆ 伽藍とバザール☆ 伽藍とバザール☆ 伽藍とバザール

☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」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

☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...

Page 9: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下

Page 10: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

型安全とは型安全とは型安全とは型安全とは型安全とは

☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる

☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ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 11: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要kernelにこそ型安全が必要

☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される☆ ほとんどのkernelはC言語で設計される

☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV☆ ユーザー空間でエラー → SEGV

☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止☆ kernel空間でエラー → システム停止

☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要☆ kernelの設計には細心の注意が必要

☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?☆ C言語は安全なのか?

Page 12: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは

☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?

☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要

☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!

☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ

☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?

Page 13: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

POSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラ

各数値が小さいほどPOSIX APIへの依存度が小さい各数値が小さいほどPOSIX APIへの依存度が小さい各数値が小さいほどPOSIX APIへの依存度が小さい各数値が小さいほどPOSIX APIへの依存度が小さい各数値が小さいほどPOSIX APIへの依存度が小さい

Page 14: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個jhcバイナリは未定義シンボル20個$ nm hs.out | grep "U " U _IO_putc@@GLIBC_2.2.5 U __libc_start_main@@GLIBC_2.2.5 U _setjmp@@GLIBC_2.2.5 U abort@@GLIBC_2.2.5 U ctime@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U fflush@@GLIBC_2.2.5 U fprintf@@GLIBC_2.2.5 U fputc@@GLIBC_2.2.5 U fputs@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U fwrite@@GLIBC_2.2.5 U getenv@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5 U setlocale@@GLIBC_2.2.5 U sysconf@@GLIBC_2.2.5 U times@@GLIBC_2.2.5

$ nm hs.out | grep "U " U _IO_putc@@GLIBC_2.2.5 U __libc_start_main@@GLIBC_2.2.5 U _setjmp@@GLIBC_2.2.5 U abort@@GLIBC_2.2.5 U ctime@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U fflush@@GLIBC_2.2.5 U fprintf@@GLIBC_2.2.5 U fputc@@GLIBC_2.2.5 U fputs@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U fwrite@@GLIBC_2.2.5 U getenv@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5 U setlocale@@GLIBC_2.2.5 U sysconf@@GLIBC_2.2.5 U times@@GLIBC_2.2.5

$ nm hs.out | grep "U " U _IO_putc@@GLIBC_2.2.5 U __libc_start_main@@GLIBC_2.2.5 U _setjmp@@GLIBC_2.2.5 U abort@@GLIBC_2.2.5 U ctime@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U fflush@@GLIBC_2.2.5 U fprintf@@GLIBC_2.2.5 U fputc@@GLIBC_2.2.5 U fputs@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U fwrite@@GLIBC_2.2.5 U getenv@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5 U setlocale@@GLIBC_2.2.5 U sysconf@@GLIBC_2.2.5 U times@@GLIBC_2.2.5

$ nm hs.out | grep "U " U _IO_putc@@GLIBC_2.2.5 U __libc_start_main@@GLIBC_2.2.5 U _setjmp@@GLIBC_2.2.5 U abort@@GLIBC_2.2.5 U ctime@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U fflush@@GLIBC_2.2.5 U fprintf@@GLIBC_2.2.5 U fputc@@GLIBC_2.2.5 U fputs@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U fwrite@@GLIBC_2.2.5 U getenv@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5 U setlocale@@GLIBC_2.2.5 U sysconf@@GLIBC_2.2.5 U times@@GLIBC_2.2.5

$ nm hs.out | grep "U " U _IO_putc@@GLIBC_2.2.5 U __libc_start_main@@GLIBC_2.2.5 U _setjmp@@GLIBC_2.2.5 U abort@@GLIBC_2.2.5 U ctime@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U fflush@@GLIBC_2.2.5 U fprintf@@GLIBC_2.2.5 U fputc@@GLIBC_2.2.5 U fputs@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U fwrite@@GLIBC_2.2.5 U getenv@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5 U setlocale@@GLIBC_2.2.5 U sysconf@@GLIBC_2.2.5 U times@@GLIBC_2.2.5

Page 15: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器

Page 16: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単

Page 17: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために

☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発

Page 18: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[4] Ajhcのインストールと使い方[4] Ajhcのインストールと使い方[4] Ajhcのインストールと使い方[4] Ajhcのインストールと使い方[4] Ajhcのインストールと使い方

☆ インストールしてみましょう☆ インストールしてみましょう☆ インストールしてみましょう☆ インストールしてみましょう☆ インストールしてみましょう

Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合Ubuntu 12.04 amd64 の場合$ sudo apt-get install haskell-platform libncurses5-dev libwww-perl gcc m4$ cabal update$ cabal install ajhc$ export PATH=$HOME/.cabal/bin/:$PATH$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ ajhc --versionajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44)compiled by ghc-7.4 on a x86_64 running linux

$ sudo apt-get install haskell-platform libncurses5-dev libwww-perl gcc m4$ cabal update$ cabal install ajhc$ export PATH=$HOME/.cabal/bin/:$PATH$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ ajhc --versionajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44)compiled by ghc-7.4 on a x86_64 running linux

$ sudo apt-get install haskell-platform libncurses5-dev libwww-perl gcc m4$ cabal update$ cabal install ajhc$ export PATH=$HOME/.cabal/bin/:$PATH$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ ajhc --versionajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44)compiled by ghc-7.4 on a x86_64 running linux

$ sudo apt-get install haskell-platform libncurses5-dev libwww-perl gcc m4$ cabal update$ cabal install ajhc$ export PATH=$HOME/.cabal/bin/:$PATH$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ ajhc --versionajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44)compiled by ghc-7.4 on a x86_64 running linux

$ sudo apt-get install haskell-platform libncurses5-dev libwww-perl gcc m4$ cabal update$ cabal install ajhc$ export PATH=$HOME/.cabal/bin/:$PATH$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ ajhc --versionajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44)compiled by ghc-7.4 on a x86_64 running linux

あっさりですね!あっさりですね!あっさりですね!あっさりですね!あっさりですね!

Page 19: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs

import System.Environmentimport Data.Algorithm.Diff

main :: IO ()main = do [s1, s2] <- getArgs c1 <- readFile s1 c2 <- readFile s2 print . filter f $ getDiff c1 c2 where f (Both _ _) = False f _ = True

import System.Environmentimport Data.Algorithm.Diff

main :: IO ()main = do [s1, s2] <- getArgs c1 <- readFile s1 c2 <- readFile s2 print . filter f $ getDiff c1 c2 where f (Both _ _) = False f _ = True

import System.Environmentimport Data.Algorithm.Diff

main :: IO ()main = do [s1, s2] <- getArgs c1 <- readFile s1 c2 <- readFile s2 print . filter f $ getDiff c1 c2 where f (Both _ _) = False f _ = True

import System.Environmentimport Data.Algorithm.Diff

main :: IO ()main = do [s1, s2] <- getArgs c1 <- readFile s1 c2 <- readFile s2 print . filter f $ getDiff c1 c2 where f (Both _ _) = False f _ = True

import System.Environmentimport Data.Algorithm.Diff

main :: IO ()main = do [s1, s2] <- getArgs c1 <- readFile s1 c2 <- readFile s2

print . filter f $ getDiff c1 c2where

f (Both _ _) = False f _ = True

$ ajhc -p Diff -o mydiff MyDiff.hs$ echo "hoge" > s1.txt$ echo "hofe0" > s2.txt$ ./mydiff s1.txt s2.txt[Second 'f',First 'g',Second '0']

$ ajhc -p Diff -o mydiff MyDiff.hs$ echo "hoge" > s1.txt$ echo "hofe0" > s2.txt$ ./mydiff s1.txt s2.txt[Second 'f',First 'g',Second '0']

$ ajhc -p Diff -o mydiff MyDiff.hs$ echo "hoge" > s1.txt$ echo "hofe0" > s2.txt$ ./mydiff s1.txt s2.txt[Second 'f',First 'g',Second '0']

$ ajhc -p Diff -o mydiff MyDiff.hs$ echo "hoge" > s1.txt$ echo "hofe0" > s2.txt$ ./mydiff s1.txt s2.txt[Second 'f',First 'g',Second '0']

$ ajhc -p Diff -o mydiff MyDiff.hs$ echo "hoge" > s1.txt$ echo "hofe0" > s2.txt$ ./mydiff s1.txt s2.txt[Second 'f',First 'g',Second '0']

Page 20: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

使い方詳細使い方詳細使い方詳細使い方詳細使い方詳細

「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」「Ajhcユーザーズマニュアル」

ajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.htmlajhc.metasepi.org/manual_ja.html

を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!

Page 21: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[5] AjhcコンパイラでPOSIXの外へ[5] AjhcコンパイラでPOSIXの外へ[5] AjhcコンパイラでPOSIXの外へ[5] AjhcコンパイラでPOSIXの外へ[5] AjhcコンパイラでPOSIXの外へ

☆ 「何もしないプログラム」を作りましょう☆ 「何もしないプログラム」を作りましょう☆ 「何もしないプログラム」を作りましょう☆ 「何もしないプログラム」を作りましょう☆ 「何もしないプログラム」を作りましょう$ vi Small.hs$ vi Small.hs$ vi Small.hs$ vi Small.hs$ vi Small.hs

main :: IO ()main = return ()main :: IO ()main = return ()main :: IO ()main = return ()main :: IO ()main = return ()main :: IO ()main = return ()

$ ajhc -o small Small.hs$ ./small$ ajhc -o small Small.hs$ ./small$ ajhc -o small Small.hs$ ./small$ ajhc -o small Small.hs$ ./small$ ajhc -o small Small.hs$ ./small

☆ ではPOSIX依存を少なくしてみましょう☆ ではPOSIX依存を少なくしてみましょう☆ ではPOSIX依存を少なくしてみましょう☆ ではPOSIX依存を少なくしてみましょう☆ ではPOSIX依存を少なくしてみましょう

☆ 現状では未定義シンボルは19個です☆ 現状では未定義シンボルは19個です☆ 現状では未定義シンボルは19個です☆ 現状では未定義シンボルは19個です☆ 現状では未定義シンボルは19個です$ nm small | grep -c "U "19$ nm small | grep -c "U "19$ nm small | grep -c "U "19$ nm small | grep -c "U "19$ nm small | grep -c "U "19

Page 22: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

現状のコンパイルフロー現状のコンパイルフロー現状のコンパイルフロー現状のコンパイルフロー現状のコンパイルフロー

簡単ですね簡単ですね簡単ですね簡単ですね簡単ですね

Page 23: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

GCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べる$ ajhc --tdir rtsdir Small.hs$ lsSmall.hs hs.out* rtsdir/$ head -1 rtsdir/main_code.cchar jhc_c_compile[] = "gcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE'";

$ ajhc --tdir rtsdir Small.hs$ lsSmall.hs hs.out* rtsdir/$ head -1 rtsdir/main_code.cchar jhc_c_compile[] = "gcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE'";

$ ajhc --tdir rtsdir Small.hs$ lsSmall.hs hs.out* rtsdir/$ head -1 rtsdir/main_code.cchar jhc_c_compile[] = "gcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE'";

$ ajhc --tdir rtsdir Small.hs$ lsSmall.hs hs.out* rtsdir/$ head -1 rtsdir/main_code.cchar jhc_c_compile[] = "gcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE'";

$ ajhc --tdir rtsdir Small.hs$ lsSmall.hs hs.out* rtsdir/$ head -1 rtsdir/main_code.cchar jhc_c_compile[] = "gcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE'";

jhc_c_compile文字列からGCCのコンパイルオプションがわかるjhc_c_compile文字列からGCCのコンパイルオプションがわかるjhc_c_compile文字列からGCCのコンパイルオプションがわかるjhc_c_compile文字列からGCCのコンパイルオプションがわかるjhc_c_compile文字列からGCCのコンパイルオプションがわかる

Page 24: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

Makefileを使ってコンパイルMakefileを使ってコンパイルMakefileを使ってコンパイルMakefileを使ってコンパイルMakefileを使ってコンパイル

Page 25: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile

small: rtsdir/main_code.cgcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/

rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small

rtsdir/main_code.c: Small.hsajhc --tdir rtsdir -C Small.hs

clean:rm -rf rtsdir small *~

small: rtsdir/main_code.cgcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/

rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small

rtsdir/main_code.c: Small.hsajhc --tdir rtsdir -C Small.hs

clean:rm -rf rtsdir small *~

small: rtsdir/main_code.cgcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/

rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small

rtsdir/main_code.c: Small.hsajhc --tdir rtsdir -C Small.hs

clean:rm -rf rtsdir small *~

small: rtsdir/main_code.cgcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/

rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small

rtsdir/main_code.c: Small.hsajhc --tdir rtsdir -C Small.hs

clean:rm -rf rtsdir small *~

small: rtsdir/main_code.cgcc rtsdir/rts/profile.c rtsdir/rts/rts_support.c rtsdir/

rts/gc_none.c rtsdir/rts/jhc_rts.c rtsdir/lib/lib_cbits.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small

rtsdir/main_code.c: Small.hsajhc --tdir rtsdir -C Small.hs

clean:rm -rf rtsdir small *~

$ make$ nm small | grep -c "U "19 # <= 依存度は変化なし

$ make$ nm small | grep -c "U "19 # <= 依存度は変化なし

$ make$ nm small | grep -c "U "19 # <= 依存度は変化なし

$ make$ nm small | grep -c "U "19 # <= 依存度は変化なし

$ make$ nm small | grep -c "U "19 # <= 依存度は変化なし

Page 26: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

ランタイムのソースを限定ランタイムのソースを限定ランタイムのソースを限定ランタイムのソースを限定ランタイムのソースを限定

Page 27: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile

small: rtsdir/main_code.c dummy.cgcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/

rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small# --snip--

small: rtsdir/main_code.c dummy.cgcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/

rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small# --snip--

small: rtsdir/main_code.c dummy.cgcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/

rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small# --snip--

small: rtsdir/main_code.c dummy.cgcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/

rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small# --snip--

small: rtsdir/main_code.c dummy.cgcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/

rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' -o small# --snip--

$ vi dummy.c$ vi dummy.c$ vi dummy.c$ vi dummy.c$ vi dummy.c

#include "jhc_rts_header.h"

void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void jhc_print_profile(void) {}

$ make$ nm small | grep -c "U "15 # <= 依存度が4減少

$ make$ nm small | grep -c "U "15 # <= 依存度が4減少

$ make$ nm small | grep -c "U "15 # <= 依存度が4減少

$ make$ nm small | grep -c "U "15 # <= 依存度が4減少

$ make$ nm small | grep -c "U "15 # <= 依存度が4減少

Page 28: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

ダミー関数をさらに投入ダミー関数をさらに投入ダミー関数をさらに投入ダミー関数をさらに投入ダミー関数をさらに投入

Page 29: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)$ vi dummy.c$ vi dummy.c$ vi dummy.c$ vi dummy.c$ vi dummy.c

#include "jhc_rts_header.h"

void abort() {for (;;);}char *setlocale(int category, const char *locale) {return NULL;}int fputc(int c, FILE *stream) {return 0;}int fputs(const char *s, FILE *stream) {return 0;}int fprintf(FILE *stream, const char *format, ...) {return 0;}int fflush(FILE* stream) {return 0;}size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {return 0;}void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void abort() {for (;;);}char *setlocale(int category, const char *locale) {return NULL;}int fputc(int c, FILE *stream) {return 0;}int fputs(const char *s, FILE *stream) {return 0;}int fprintf(FILE *stream, const char *format, ...) {return 0;}int fflush(FILE* stream) {return 0;}size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {return 0;}void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void abort() {for (;;);}char *setlocale(int category, const char *locale) {return NULL;}int fputc(int c, FILE *stream) {return 0;}int fputs(const char *s, FILE *stream) {return 0;}int fprintf(FILE *stream, const char *format, ...) {return 0;}int fflush(FILE* stream) {return 0;}size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {return 0;}void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void abort() {for (;;);}char *setlocale(int category, const char *locale) {return NULL;}int fputc(int c, FILE *stream) {return 0;}int fputs(const char *s, FILE *stream) {return 0;}int fprintf(FILE *stream, const char *format, ...) {return 0;}int fflush(FILE* stream) {return 0;}size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {return 0;}void jhc_print_profile(void) {}

#include "jhc_rts_header.h"

void abort() {for (;;);}char *setlocale(int category, const char *locale) {return NULL;}int fputc(int c, FILE *stream) {return 0;}int fputs(const char *s, FILE *stream) {return 0;}int fprintf(FILE *stream, const char *format, ...) {return 0;}int fflush(FILE* stream) {return 0;}size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {return 0;}void jhc_print_profile(void) {}

$ make$ nm small | grep -c "U "8 # <= 依存度が7減少

$ make$ nm small | grep -c "U "8 # <= 依存度が7減少

$ make$ nm small | grep -c "U "8 # <= 依存度が7減少

$ make$ nm small | grep -c "U "8 # <= 依存度が7減少

$ make$ nm small | grep -c "U "8 # <= 依存度が7減少

Page 30: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

例外を無視する例外を無視する例外を無視する例外を無視する例外を無視する

Page 31: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)$ vi Makefilesmall: rtsdir/main_code.c dummy.c main.c

gcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c main.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' '-D_JHC_STANDALONE=0' -o small$ vi main.c#include "jhc_rts_header.h"

intmain(int argc, char *argv[]){ hs_init(&argc,&argv);

_amain(); hs_exit(); return 0;}$ nm small | grep -c "U "7 # <= 依存度が1減少

$ vi Makefilesmall: rtsdir/main_code.c dummy.c main.c

gcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c main.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' '-D_JHC_STANDALONE=0' -o small$ vi main.c#include "jhc_rts_header.h"

intmain(int argc, char *argv[]){ hs_init(&argc,&argv);

_amain(); hs_exit(); return 0;}$ nm small | grep -c "U "7 # <= 依存度が1減少

$ vi Makefilesmall: rtsdir/main_code.c dummy.c main.c

gcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c main.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' '-D_JHC_STANDALONE=0' -o small$ vi main.c#include "jhc_rts_header.h"

intmain(int argc, char *argv[]){ hs_init(&argc,&argv);

_amain(); hs_exit(); return 0;}$ nm small | grep -c "U "7 # <= 依存度が1減少

$ vi Makefilesmall: rtsdir/main_code.c dummy.c main.c

gcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c main.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' '-D_JHC_STANDALONE=0' -o small$ vi main.c#include "jhc_rts_header.h"

intmain(int argc, char *argv[]){ hs_init(&argc,&argv);

_amain(); hs_exit(); return 0;}$ nm small | grep -c "U "7 # <= 依存度が1減少

$ vi Makefilesmall: rtsdir/main_code.c dummy.c main.c

gcc rtsdir/rts/rts_support.c rtsdir/rts/jhc_rts.c rtsdir/rts/gc_jgc.c rtsdir/rts/stableptr.c rtsdir/rts/conc.c dummy.c main.c -Irtsdir/cbits -Irtsdir rtsdir/main_code.c '-std=gnu99' -D_GNU_SOURCE '-falign-functions=4' -ffast-math -Wextra -Wall -Wno-unused-parameter -fno-strict-aliasing -DNDEBUG -O3 '-D_JHC_GC=_JHC_GC_JGC' '-D_JHC_CONC=_JHC_CONC_NONE' '-D_JHC_STANDALONE=0' -o small$ vi main.c#include "jhc_rts_header.h"

intmain(int argc, char *argv[]){ hs_init(&argc,&argv);

_amain(); hs_exit(); return 0;}$ nm small | grep -c "U "7 # <= 依存度が1減少

Page 32: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

残ったPOSIX依存は何?残ったPOSIX依存は何?残ったPOSIX依存は何?残ったPOSIX依存は何?残ったPOSIX依存は何?$ nm small | grep "U " U __libc_start_main@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5

$ nm small | grep "U " U __libc_start_main@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5

$ nm small | grep "U " U __libc_start_main@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5

$ nm small | grep "U " U __libc_start_main@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5

$ nm small | grep "U " U __libc_start_main@@GLIBC_2.2.5 U exit@@GLIBC_2.2.5 U free@@GLIBC_2.2.5 U malloc@@GLIBC_2.2.5 U memset@@GLIBC_2.2.5 U posix_memalign@@GLIBC_2.2.5 U realloc@@GLIBC_2.2.5

☆ mallocなどのメモリ管理だけが実行に必要☆ mallocなどのメモリ管理だけが実行に必要☆ mallocなどのメモリ管理だけが実行に必要☆ mallocなどのメモリ管理だけが実行に必要☆ mallocなどのメモリ管理だけが実行に必要

☆ mallocのない環境ではNetBSD alloc.cを流用するのがおすすめ☆ mallocのない環境ではNetBSD alloc.cを流用するのがおすすめ☆ mallocのない環境ではNetBSD alloc.cを流用するのがおすすめ☆ mallocのない環境ではNetBSD alloc.cを流用するのがおすすめ☆ mallocのない環境ではNetBSD alloc.cを流用するのがおすすめ

Page 33: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?

以下2つのしくみを使ってC言語側を触れます以下2つのしくみを使ってC言語側を触れます以下2つのしくみを使ってC言語側を触れます以下2つのしくみを使ってC言語側を触れます以下2つのしくみを使ってC言語側を触れます

☆ Foreign Function Interface (FFI)☆ Foreign Function Interface (FFI)☆ Foreign Function Interface (FFI)☆ Foreign Function Interface (FFI)☆ Foreign Function Interface (FFI)

☆ Foreign.Storableクラス☆ Foreign.Storableクラス☆ Foreign.Storableクラス☆ Foreign.Storableクラス☆ Foreign.Storableクラス

Page 34: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

FFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえる

Page 35: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

Storableでメモリ直読み書きStorableでメモリ直読み書きStorableでメモリ直読み書きStorableでメモリ直読み書きStorableでメモリ直読み書き

Page 36: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[6] これまでのAjhcコンパイラ[6] これまでのAjhcコンパイラ[6] これまでのAjhcコンパイラ[6] これまでのAjhcコンパイラ[6] これまでのAjhcコンパイラ

☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳☆ ユーザーズマニュアルの翻訳http://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.htmlhttp://ajhc.metasepi.org/manual_ja.html

☆ Cortex-M4マイコンへの移植☆ Cortex-M4マイコンへの移植☆ Cortex-M4マイコンへの移植☆ Cortex-M4マイコンへの移植☆ Cortex-M4マイコンへの移植https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3https://github.com/ajhc/demo-cortex-m3

☆ cabalによるインストール☆ cabalによるインストール☆ cabalによるインストール☆ cabalによるインストール☆ cabalによるインストール

☆ 省メモリGC☆ 省メモリGC☆ 省メモリGC☆ 省メモリGC☆ 省メモリGC

☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現

>>>>>

Page 37: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

[7] Ajhcコンパイラの未来[7] Ajhcコンパイラの未来[7] Ajhcコンパイラの未来[7] Ajhcコンパイラの未来[7] Ajhcコンパイラの未来

☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中☆ 内部仕様ドキュメント作成中https://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guidehttps://github.com/ajhc/ajhc-hacking-guide

☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有☆ 型によるスレッド間状態共有

☆ GHCのライブラリを移植☆ GHCのライブラリを移植☆ GHCのライブラリを移植☆ GHCのライブラリを移植☆ GHCのライブラリを移植

☆ さらなる応用例の提案☆ さらなる応用例の提案☆ さらなる応用例の提案☆ さらなる応用例の提案☆ さらなる応用例の提案

☆ 小さな組み込みOSを型によって再設計☆ 小さな組み込みOSを型によって再設計☆ 小さな組み込みOSを型によって再設計☆ 小さな組み込みOSを型によって再設計☆ 小さな組み込みOSを型によって再設計

☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計☆ NetBSD kernelを型によって再設計

>>>>>

Page 38: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?

☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/☆ http://www.paraiso-lang.org/ikmsm/

☆ 関数型言語の同人誌☆ 関数型言語の同人誌☆ 関数型言語の同人誌☆ 関数型言語の同人誌☆ 関数型言語の同人誌

☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか☆ HaskellとかOCamlとか圏論とか

☆ 囲碁AIの記事まで、なんでもあり?☆ 囲碁AIの記事まで、なんでもあり?☆ 囲碁AIの記事まで、なんでもあり?☆ 囲碁AIの記事まで、なんでもあり?☆ 囲碁AIの記事まで、なんでもあり?

☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました☆ C84にはAjhcの解説記事を投稿しました

☆ Call For Articlesはイカ☆ Call For Articlesはイカ☆ Call For Articlesはイカ☆ Call For Articlesはイカ☆ Call For Articlesはイカhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.htmlhttp://www.paraiso-lang.org/ikmsm/books/c85.html

>>>>>

Page 39: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

本スライドで使用した画像 #1本スライドで使用した画像 #1本スライドで使用した画像 #1本スライドで使用した画像 #1本スライドで使用した画像 #1* sunny side up | Flickr - Photo Sharing! http://www.flickr.com/photos/97335141@N00/4623354472/* Mud Slide | Flickr - Photo Sharing! http://www.flickr.com/photos/ben_salter/2676953286/* Feelin' Safe | Flickr - Photo Sharing! http://www.flickr.com/photos/mstyne/3654056683/* STOP ALL WAY | Flickr - Photo Sharing! http://www.flickr.com/photos/peterkaminski/1510724/* Bungee jump | Flickr - Photo Sharing! http://www.flickr.com/photos/gj_thewhite/8855033499/* The C Programming Language | Flickr - Photo Sharing! http://www.flickr.com/photos/mrbill/2482009942/* The 20 Yard Line | Flickr - Photo Sharing! http://www.flickr.com/photos/eschipul/2957264066/* _MG_3881 | Flickr - Photo Sharing! http://www.flickr.com/photos/63209717@N05/6873025064/* Mini Cross | Flickr - Photo Sharing! http://www.flickr.com/photos/hdrexperience/6727601691/* Goal for the Sky | Flickr - Photo Sharing! http://www.flickr.com/photos/giantsqurl/5165392772/* Manual and driver disc | Flickr - Photo Sharing! http://www.flickr.com/photos/tseedmund/3859079008/

* sunny side up | Flickr - Photo Sharing! http://www.flickr.com/photos/97335141@N00/4623354472/* Mud Slide | Flickr - Photo Sharing! http://www.flickr.com/photos/ben_salter/2676953286/* Feelin' Safe | Flickr - Photo Sharing! http://www.flickr.com/photos/mstyne/3654056683/* STOP ALL WAY | Flickr - Photo Sharing! http://www.flickr.com/photos/peterkaminski/1510724/* Bungee jump | Flickr - Photo Sharing! http://www.flickr.com/photos/gj_thewhite/8855033499/* The C Programming Language | Flickr - Photo Sharing! http://www.flickr.com/photos/mrbill/2482009942/* The 20 Yard Line | Flickr - Photo Sharing! http://www.flickr.com/photos/eschipul/2957264066/* _MG_3881 | Flickr - Photo Sharing! http://www.flickr.com/photos/63209717@N05/6873025064/* Mini Cross | Flickr - Photo Sharing! http://www.flickr.com/photos/hdrexperience/6727601691/* Goal for the Sky | Flickr - Photo Sharing! http://www.flickr.com/photos/giantsqurl/5165392772/* Manual and driver disc | Flickr - Photo Sharing! http://www.flickr.com/photos/tseedmund/3859079008/

* sunny side up | Flickr - Photo Sharing! http://www.flickr.com/photos/97335141@N00/4623354472/* Mud Slide | Flickr - Photo Sharing! http://www.flickr.com/photos/ben_salter/2676953286/* Feelin' Safe | Flickr - Photo Sharing! http://www.flickr.com/photos/mstyne/3654056683/* STOP ALL WAY | Flickr - Photo Sharing! http://www.flickr.com/photos/peterkaminski/1510724/* Bungee jump | Flickr - Photo Sharing! http://www.flickr.com/photos/gj_thewhite/8855033499/* The C Programming Language | Flickr - Photo Sharing! http://www.flickr.com/photos/mrbill/2482009942/* The 20 Yard Line | Flickr - Photo Sharing! http://www.flickr.com/photos/eschipul/2957264066/* _MG_3881 | Flickr - Photo Sharing! http://www.flickr.com/photos/63209717@N05/6873025064/* Mini Cross | Flickr - Photo Sharing! http://www.flickr.com/photos/hdrexperience/6727601691/* Goal for the Sky | Flickr - Photo Sharing! http://www.flickr.com/photos/giantsqurl/5165392772/* Manual and driver disc | Flickr - Photo Sharing! http://www.flickr.com/photos/tseedmund/3859079008/

* sunny side up | Flickr - Photo Sharing! http://www.flickr.com/photos/97335141@N00/4623354472/* Mud Slide | Flickr - Photo Sharing! http://www.flickr.com/photos/ben_salter/2676953286/* Feelin' Safe | Flickr - Photo Sharing! http://www.flickr.com/photos/mstyne/3654056683/* STOP ALL WAY | Flickr - Photo Sharing! http://www.flickr.com/photos/peterkaminski/1510724/* Bungee jump | Flickr - Photo Sharing! http://www.flickr.com/photos/gj_thewhite/8855033499/* The C Programming Language | Flickr - Photo Sharing! http://www.flickr.com/photos/mrbill/2482009942/* The 20 Yard Line | Flickr - Photo Sharing! http://www.flickr.com/photos/eschipul/2957264066/* _MG_3881 | Flickr - Photo Sharing! http://www.flickr.com/photos/63209717@N05/6873025064/* Mini Cross | Flickr - Photo Sharing! http://www.flickr.com/photos/hdrexperience/6727601691/* Goal for the Sky | Flickr - Photo Sharing! http://www.flickr.com/photos/giantsqurl/5165392772/* Manual and driver disc | Flickr - Photo Sharing! http://www.flickr.com/photos/tseedmund/3859079008/

* sunny side up | Flickr - Photo Sharing! http://www.flickr.com/photos/97335141@N00/4623354472/* Mud Slide | Flickr - Photo Sharing! http://www.flickr.com/photos/ben_salter/2676953286/* Feelin' Safe | Flickr - Photo Sharing! http://www.flickr.com/photos/mstyne/3654056683/* STOP ALL WAY | Flickr - Photo Sharing! http://www.flickr.com/photos/peterkaminski/1510724/* Bungee jump | Flickr - Photo Sharing! http://www.flickr.com/photos/gj_thewhite/8855033499/* The C Programming Language | Flickr - Photo Sharing! http://www.flickr.com/photos/mrbill/2482009942/* The 20 Yard Line | Flickr - Photo Sharing! http://www.flickr.com/photos/eschipul/2957264066/* _MG_3881 | Flickr - Photo Sharing! http://www.flickr.com/photos/63209717@N05/6873025064/* Mini Cross | Flickr - Photo Sharing! http://www.flickr.com/photos/hdrexperience/6727601691/* Goal for the Sky | Flickr - Photo Sharing! http://www.flickr.com/photos/giantsqurl/5165392772/* Manual and driver disc | Flickr - Photo Sharing! http://www.flickr.com/photos/tseedmund/3859079008/

>>>>>

Page 40: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

本スライドで使用した画像 #2本スライドで使用した画像 #2本スライドで使用した画像 #2本スライドで使用した画像 #2本スライドで使用した画像 #2* Simple Heart | Flickr - Photo Sharing! http://www.flickr.com/photos/21148821@N02/2055189101/* GNU Wallpaper | Flickr - Photo Sharing! http://www.flickr.com/photos/jeffpro/8603895629/* The core | Flickr - Photo Sharing! http://www.flickr.com/photos/mukluk/484631726/* Dummies. Someday they'll take over the world. They already have. http://www.flickr.com/photos/keoni101/5244610841/* Michael Caputo, "just tryin' to break the ice, with nothin'... http://www.flickr.com/photos/sixteen-miles/3757672365/* Groundskeeper sweeping, Citi Field | Flickr - Photo Sharing! http://www.flickr.com/photos/48913243@N00/4605448536/* Carrier Pigeon | Flickr - Photo Sharing! http://www.flickr.com/photos/enzymedesign/4983070657/* Arrows showing up (Blender) | Flickr - Photo Sharing! http://www.flickr.com/photos/61423903@N06/7382239368/* Handshakes | Flickr - Photo Sharing! http://www.flickr.com/photos/ndanger/4425413794/* STM32 Development Board | Flickr - Photo Sharing! http://www.flickr.com/photos/randomskk/3920434183/* Hiking | Flickr - Photo Sharing! http://www.flickr.com/photos/aigle_dore/5824862885/

* Simple Heart | Flickr - Photo Sharing! http://www.flickr.com/photos/21148821@N02/2055189101/* GNU Wallpaper | Flickr - Photo Sharing! http://www.flickr.com/photos/jeffpro/8603895629/* The core | Flickr - Photo Sharing! http://www.flickr.com/photos/mukluk/484631726/* Dummies. Someday they'll take over the world. They already have. http://www.flickr.com/photos/keoni101/5244610841/* Michael Caputo, "just tryin' to break the ice, with nothin'... http://www.flickr.com/photos/sixteen-miles/3757672365/* Groundskeeper sweeping, Citi Field | Flickr - Photo Sharing! http://www.flickr.com/photos/48913243@N00/4605448536/* Carrier Pigeon | Flickr - Photo Sharing! http://www.flickr.com/photos/enzymedesign/4983070657/* Arrows showing up (Blender) | Flickr - Photo Sharing! http://www.flickr.com/photos/61423903@N06/7382239368/* Handshakes | Flickr - Photo Sharing! http://www.flickr.com/photos/ndanger/4425413794/* STM32 Development Board | Flickr - Photo Sharing! http://www.flickr.com/photos/randomskk/3920434183/* Hiking | Flickr - Photo Sharing! http://www.flickr.com/photos/aigle_dore/5824862885/

* Simple Heart | Flickr - Photo Sharing! http://www.flickr.com/photos/21148821@N02/2055189101/* GNU Wallpaper | Flickr - Photo Sharing! http://www.flickr.com/photos/jeffpro/8603895629/* The core | Flickr - Photo Sharing! http://www.flickr.com/photos/mukluk/484631726/* Dummies. Someday they'll take over the world. They already have. http://www.flickr.com/photos/keoni101/5244610841/* Michael Caputo, "just tryin' to break the ice, with nothin'... http://www.flickr.com/photos/sixteen-miles/3757672365/* Groundskeeper sweeping, Citi Field | Flickr - Photo Sharing! http://www.flickr.com/photos/48913243@N00/4605448536/* Carrier Pigeon | Flickr - Photo Sharing! http://www.flickr.com/photos/enzymedesign/4983070657/* Arrows showing up (Blender) | Flickr - Photo Sharing! http://www.flickr.com/photos/61423903@N06/7382239368/* Handshakes | Flickr - Photo Sharing! http://www.flickr.com/photos/ndanger/4425413794/* STM32 Development Board | Flickr - Photo Sharing! http://www.flickr.com/photos/randomskk/3920434183/* Hiking | Flickr - Photo Sharing! http://www.flickr.com/photos/aigle_dore/5824862885/

* Simple Heart | Flickr - Photo Sharing! http://www.flickr.com/photos/21148821@N02/2055189101/* GNU Wallpaper | Flickr - Photo Sharing! http://www.flickr.com/photos/jeffpro/8603895629/* The core | Flickr - Photo Sharing! http://www.flickr.com/photos/mukluk/484631726/* Dummies. Someday they'll take over the world. They already have. http://www.flickr.com/photos/keoni101/5244610841/* Michael Caputo, "just tryin' to break the ice, with nothin'... http://www.flickr.com/photos/sixteen-miles/3757672365/* Groundskeeper sweeping, Citi Field | Flickr - Photo Sharing! http://www.flickr.com/photos/48913243@N00/4605448536/* Carrier Pigeon | Flickr - Photo Sharing! http://www.flickr.com/photos/enzymedesign/4983070657/* Arrows showing up (Blender) | Flickr - Photo Sharing! http://www.flickr.com/photos/61423903@N06/7382239368/* Handshakes | Flickr - Photo Sharing! http://www.flickr.com/photos/ndanger/4425413794/* STM32 Development Board | Flickr - Photo Sharing! http://www.flickr.com/photos/randomskk/3920434183/* Hiking | Flickr - Photo Sharing! http://www.flickr.com/photos/aigle_dore/5824862885/

* Simple Heart | Flickr - Photo Sharing! http://www.flickr.com/photos/21148821@N02/2055189101/* GNU Wallpaper | Flickr - Photo Sharing! http://www.flickr.com/photos/jeffpro/8603895629/* The core | Flickr - Photo Sharing! http://www.flickr.com/photos/mukluk/484631726/* Dummies. Someday they'll take over the world. They already have. http://www.flickr.com/photos/keoni101/5244610841/* Michael Caputo, "just tryin' to break the ice, with nothin'... http://www.flickr.com/photos/sixteen-miles/3757672365/* Groundskeeper sweeping, Citi Field | Flickr - Photo Sharing! http://www.flickr.com/photos/48913243@N00/4605448536/* Carrier Pigeon | Flickr - Photo Sharing! http://www.flickr.com/photos/enzymedesign/4983070657/* Arrows showing up (Blender) | Flickr - Photo Sharing! http://www.flickr.com/photos/61423903@N06/7382239368/* Handshakes | Flickr - Photo Sharing! http://www.flickr.com/photos/ndanger/4425413794/* STM32 Development Board | Flickr - Photo Sharing! http://www.flickr.com/photos/randomskk/3920434183/* Hiking | Flickr - Photo Sharing! http://www.flickr.com/photos/aigle_dore/5824862885/

>>>>>

Page 41: 組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編

本スライドで使用した画像 #3本スライドで使用した画像 #3本スライドで使用した画像 #3本スライドで使用した画像 #3本スライドで使用した画像 #3* Next Kyoto 懐石 | Flickr - Photo Sharing! http://www.flickr.com/photos/edsel_/8330803003/* Portal 2 fly | Flickr - Photo Sharing! http://www.flickr.com/photos/warvan/4984607550/* Sticker Nation - 8 | Flickr - Photo Sharing! http://www.flickr.com/photos/oskay/411003747/* I love flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/theresasthompson/3279837886/* flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/zanastardust/145197704/* flickr was here | Flickr - Photo Sharing! http://www.flickr.com/photos/sarahrosenau/185196442/

* Next Kyoto 懐石 | Flickr - Photo Sharing! http://www.flickr.com/photos/edsel_/8330803003/* Portal 2 fly | Flickr - Photo Sharing! http://www.flickr.com/photos/warvan/4984607550/* Sticker Nation - 8 | Flickr - Photo Sharing! http://www.flickr.com/photos/oskay/411003747/* I love flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/theresasthompson/3279837886/* flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/zanastardust/145197704/* flickr was here | Flickr - Photo Sharing! http://www.flickr.com/photos/sarahrosenau/185196442/

* Next Kyoto 懐石 | Flickr - Photo Sharing! http://www.flickr.com/photos/edsel_/8330803003/* Portal 2 fly | Flickr - Photo Sharing! http://www.flickr.com/photos/warvan/4984607550/* Sticker Nation - 8 | Flickr - Photo Sharing! http://www.flickr.com/photos/oskay/411003747/* I love flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/theresasthompson/3279837886/* flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/zanastardust/145197704/* flickr was here | Flickr - Photo Sharing! http://www.flickr.com/photos/sarahrosenau/185196442/

* Next Kyoto 懐石 | Flickr - Photo Sharing! http://www.flickr.com/photos/edsel_/8330803003/* Portal 2 fly | Flickr - Photo Sharing! http://www.flickr.com/photos/warvan/4984607550/* Sticker Nation - 8 | Flickr - Photo Sharing! http://www.flickr.com/photos/oskay/411003747/* I love flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/theresasthompson/3279837886/* flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/zanastardust/145197704/* flickr was here | Flickr - Photo Sharing! http://www.flickr.com/photos/sarahrosenau/185196442/

* Next Kyoto 懐石 | Flickr - Photo Sharing! http://www.flickr.com/photos/edsel_/8330803003/* Portal 2 fly | Flickr - Photo Sharing! http://www.flickr.com/photos/warvan/4984607550/* Sticker Nation - 8 | Flickr - Photo Sharing! http://www.flickr.com/photos/oskay/411003747/* I love flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/theresasthompson/3279837886/* flickr | Flickr - Photo Sharing! http://www.flickr.com/photos/zanastardust/145197704/* flickr was here | Flickr - Photo Sharing! http://www.flickr.com/photos/sarahrosenau/185196442/

>>>>>