SlideShare uma empresa Scribd logo
1 de 41
Baixar para ler offline
組込向けHaskellコンパイラAjhc 
POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc 
POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc 
POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc 
POSIX依存から脱出しよう編
組込向けHaskellコンパイラAjhc
POSIX依存から脱出しよう編
Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
私は誰?私は誰?私は誰?私は誰?私は誰?
☆ 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で
おしながきおしながきおしながきおしながきおしながき
☆ [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コンパイラの未来
[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はフットプリントが小さく、
☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい
☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも
どうして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を作るため
[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/
などなどなどなどなどなどなどなどなどなど
どうして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のランタイムエラー
☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難
既存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
☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...
主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下主開発からそれると品質急降下
型安全とは型安全とは型安全とは型安全とは型安全とは
☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる
☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ
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/
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言語は安全なのか?
[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは
☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?
☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要
☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!
☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ
☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?
POSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラPOSIX外で使いやすいコンパイラ
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
各数値が小さいほどPOSIX APIへの依存度
が小さい
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
jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器jhcはC言語への変換器
クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単
実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために
☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発☆ 実行可能状態を維持しながら開発
[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 --version
ajhc 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 --version
ajhc 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 --version
ajhc 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 --version
ajhc 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 --version
ajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44)
compiled by ghc-7.4 on a x86_64 running linux
あっさりですね!あっさりですね!あっさりですね!あっさりですね!あっさりですね!
簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう
$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs
import System.Environment
import 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.Environment
import 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.Environment
import 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.Environment
import 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.Environment
import 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
$ 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']
使い方詳細使い方詳細使い方詳細使い方詳細使い方詳細
「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
を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!
[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
現状のコンパイルフロー現状のコンパイルフロー現状のコンパイルフロー現状のコンパイルフロー現状のコンパイルフロー
簡単ですね簡単ですね簡単ですね簡単ですね簡単ですね
GCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べる
$ ajhc --tdir rtsdir Small.hs
$ ls
Small.hs hs.out* rtsdir/
$ head -1 rtsdir/main_code.c
char 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
$ ls
Small.hs hs.out* rtsdir/
$ head -1 rtsdir/main_code.c
char 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
$ ls
Small.hs hs.out* rtsdir/
$ head -1 rtsdir/main_code.c
char 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
$ ls
Small.hs hs.out* rtsdir/
$ head -1 rtsdir/main_code.c
char 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
$ ls
Small.hs hs.out* rtsdir/
$ head -1 rtsdir/main_code.c
char 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のコンパイル
オプションがわかる
Makefileを使ってコンパイルMakefileを使ってコンパイルMakefileを使ってコンパイルMakefileを使ってコンパイルMakefileを使ってコンパイル
Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)
$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile
small: rtsdir/main_code.c
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' -o small
rtsdir/main_code.c: Small.hs
ajhc --tdir rtsdir -C Small.hs
clean:
rm -rf rtsdir small *~
small: rtsdir/main_code.c
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' -o small
rtsdir/main_code.c: Small.hs
ajhc --tdir rtsdir -C Small.hs
clean:
rm -rf rtsdir small *~
small: rtsdir/main_code.c
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' -o small
rtsdir/main_code.c: Small.hs
ajhc --tdir rtsdir -C Small.hs
clean:
rm -rf rtsdir small *~
small: rtsdir/main_code.c
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' -o small
rtsdir/main_code.c: Small.hs
ajhc --tdir rtsdir -C Small.hs
clean:
rm -rf rtsdir small *~
small: rtsdir/main_code.c
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' -o small
rtsdir/main_code.c: Small.hs
ajhc --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 # <= 依存度は変化なし
ランタイムのソースを限定ランタイムのソースを限定ランタイムのソースを限定ランタイムのソースを限定ランタイムのソースを限定
ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)
$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile
small: rtsdir/main_code.c dummy.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 -
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.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 -
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.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 -
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.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 -
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.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 -
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減少
ダミー関数をさらに投入ダミー関数をさらに投入ダミー関数をさらに投入ダミー関数をさらに投入ダミー関数をさらに投入
ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)
$ 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減少
例外を無視する例外を無視する例外を無視する例外を無視する例外を無視する
例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)
$ vi Makefile
small: 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"
int
main(int argc, char *argv[])
{
hs_init(&argc,&argv);
_amain();
hs_exit();
return 0;
}
$ nm small | grep -c "U "
7 # <= 依存度が1減少
$ vi Makefile
small: 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"
int
main(int argc, char *argv[])
{
hs_init(&argc,&argv);
_amain();
hs_exit();
return 0;
}
$ nm small | grep -c "U "
7 # <= 依存度が1減少
$ vi Makefile
small: 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"
int
main(int argc, char *argv[])
{
hs_init(&argc,&argv);
_amain();
hs_exit();
return 0;
}
$ nm small | grep -c "U "
7 # <= 依存度が1減少
$ vi Makefile
small: 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"
int
main(int argc, char *argv[])
{
hs_init(&argc,&argv);
_amain();
hs_exit();
return 0;
}
$ nm small | grep -c "U "
7 # <= 依存度が1減少
$ vi Makefile
small: 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"
int
main(int argc, char *argv[])
{
hs_init(&argc,&argv);
_amain();
hs_exit();
return 0;
}
$ nm small | grep -c "U "
7 # <= 依存度が1減少
残った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を
流用するのがおすすめ
これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?
以下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クラス
FFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえるFFIでお互いの関数を呼びあえる
Storableでメモリ直読み書きStorableでメモリ直読み書きStorableでメモリ直読み書きStorableでメモリ直読み書きStorableでメモリ直読み書き
[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
☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現
[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を型によって再設計
宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?
☆ 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
本スライドで使用した画像 #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/
本スライドで使用した画像 #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/
本スライドで使用した画像 #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/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931381358/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931247866/
* 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/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931381358/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931247866/
* 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/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931381358/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931247866/
* 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/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931381358/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931247866/
* 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/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931381358/
* Hooded Cuttlefish | Flickr - Photo Sharing!
http://www.flickr.com/photos/silkebaron/931247866/

Mais conteúdo relacionado

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

ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
Akihiro Kuwano
 
Cake Matsuri Nanapi
Cake Matsuri NanapiCake Matsuri Nanapi
Cake Matsuri Nanapi
Shuichi Wada
 
Apache CloudStack コントリビューション
Apache CloudStack コントリビューションApache CloudStack コントリビューション
Apache CloudStack コントリビューション
Satoshi KOBAYASHI
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
urasandesu
 

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

組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編
組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編
組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編
 
Ajhcコンパイラの押売りに来ました
Ajhcコンパイラの押売りに来ましたAjhcコンパイラの押売りに来ました
Ajhcコンパイラの押売りに来ました
 
不惑の生存戦略
不惑の生存戦略不惑の生存戦略
不惑の生存戦略
 
ocamloptの全体像
ocamloptの全体像ocamloptの全体像
ocamloptの全体像
 
mbed+Haskellどうでしょう
mbed+Haskellどうでしょうmbed+Haskellどうでしょう
mbed+Haskellどうでしょう
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミング
 
ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~ザ・ドキュメント~うまくいかないNoSQL~
ザ・ドキュメント~うまくいかないNoSQL~
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
組込Haskellとλカ娘本の紹介
組込Haskellとλカ娘本の紹介組込Haskellとλカ娘本の紹介
組込Haskellとλカ娘本の紹介
 
【concrete5】CMS夏祭り2015@mttokyo
【concrete5】CMS夏祭り2015@mttokyo【concrete5】CMS夏祭り2015@mttokyo
【concrete5】CMS夏祭り2015@mttokyo
 
AmazonElasticBeanstalk
AmazonElasticBeanstalkAmazonElasticBeanstalk
AmazonElasticBeanstalk
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワーク
 
Cake Matsuri Nanapi
Cake Matsuri NanapiCake Matsuri Nanapi
Cake Matsuri Nanapi
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
Apache CloudStack コントリビューション
Apache CloudStack コントリビューションApache CloudStack コントリビューション
Apache CloudStack コントリビューション
 
簡単便利!Laravel Homestead
簡単便利!Laravel Homestead簡単便利!Laravel Homestead
簡単便利!Laravel Homestead
 
ドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkinsドリコムを支える課金ライブラリを支えるJenkins
ドリコムを支える課金ライブラリを支えるJenkins
 
SocketStream入門
SocketStream入門SocketStream入門
SocketStream入門
 
Power shell で DSL
Power shell で DSLPower shell で DSL
Power shell で DSL
 

Último

Último (11)

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

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

  • 2. 私は誰?私は誰?私は誰?私は誰?私は誰? ☆ 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で
  • 3. おしながきおしながきおしながきおしながきおしながき ☆ [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コンパイラの未来
  • 4. [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はフットプリントが小さく、 ☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい ☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも
  • 5. どうして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を作るため
  • 6. [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/ などなどなどなどなどなどなどなどなどなど
  • 7. どうして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のランタイムエラー ☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難☆ 再現することでさえ困難
  • 8. 既存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 ☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...☆ ところが社内開発は...
  • 10. 型安全とは型安全とは型安全とは型安全とは型安全とは ☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる☆ ランタイムエラーを少なくできる ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ☆ 参考:数理科学的バグ撲滅方法論のすすめ 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/
  • 11. 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言語は安全なのか?
  • 12. [3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは[3] OS開発向けコンパイラとは ☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは?☆ 強い型が使えてOSを作れるコンパイラは? ☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要☆ C言語のような使い勝手が必要 ☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう!☆ ないみたいなので作りましょう! ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ☆ スクラッチから作るのはツライ ☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?☆ 要求に近いコンパイラはないかな?
  • 14. 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
  • 18. [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 --version ajhc 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 --version ajhc 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 --version ajhc 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 --version ajhc 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 --version ajhc 0.8.0.8 (f6c3f4b070acad8a5012682810f0f4d7b7b9ed44) compiled by ghc-7.4 on a x86_64 running linux あっさりですね!あっさりですね!あっさりですね!あっさりですね!あっさりですね!
  • 19. 簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう簡単なプログラムを作ってみましょう $ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs$ vi MyDiff.hs import System.Environment import 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.Environment import 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.Environment import 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.Environment import 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.Environment import 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 $ 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']
  • 21. [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
  • 23. GCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べるGCCコンパイルオプションを調べる $ ajhc --tdir rtsdir Small.hs $ ls Small.hs hs.out* rtsdir/ $ head -1 rtsdir/main_code.c char 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 $ ls Small.hs hs.out* rtsdir/ $ head -1 rtsdir/main_code.c char 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 $ ls Small.hs hs.out* rtsdir/ $ head -1 rtsdir/main_code.c char 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 $ ls Small.hs hs.out* rtsdir/ $ head -1 rtsdir/main_code.c char 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 $ ls Small.hs hs.out* rtsdir/ $ head -1 rtsdir/main_code.c char 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のコンパイル オプションがわかる
  • 25. Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細)Makefileを使ってコンパイル(詳細) $ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile small: rtsdir/main_code.c 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' -o small rtsdir/main_code.c: Small.hs ajhc --tdir rtsdir -C Small.hs clean: rm -rf rtsdir small *~ small: rtsdir/main_code.c 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' -o small rtsdir/main_code.c: Small.hs ajhc --tdir rtsdir -C Small.hs clean: rm -rf rtsdir small *~ small: rtsdir/main_code.c 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' -o small rtsdir/main_code.c: Small.hs ajhc --tdir rtsdir -C Small.hs clean: rm -rf rtsdir small *~ small: rtsdir/main_code.c 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' -o small rtsdir/main_code.c: Small.hs ajhc --tdir rtsdir -C Small.hs clean: rm -rf rtsdir small *~ small: rtsdir/main_code.c 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' -o small rtsdir/main_code.c: Small.hs ajhc --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 # <= 依存度は変化なし
  • 27. ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細)ランタイムのソースを限定(詳細) $ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile$ vi Makefile small: rtsdir/main_code.c dummy.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 - 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.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 - 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.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 - 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.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 - 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.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 - 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減少
  • 29. ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細)ダミー関数をさらに投入(詳細) $ 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減少
  • 31. 例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細)例外を無視する(詳細) $ vi Makefile small: 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" int main(int argc, char *argv[]) { hs_init(&argc,&argv); _amain(); hs_exit(); return 0; } $ nm small | grep -c "U " 7 # <= 依存度が1減少 $ vi Makefile small: 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" int main(int argc, char *argv[]) { hs_init(&argc,&argv); _amain(); hs_exit(); return 0; } $ nm small | grep -c "U " 7 # <= 依存度が1減少 $ vi Makefile small: 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" int main(int argc, char *argv[]) { hs_init(&argc,&argv); _amain(); hs_exit(); return 0; } $ nm small | grep -c "U " 7 # <= 依存度が1減少 $ vi Makefile small: 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" int main(int argc, char *argv[]) { hs_init(&argc,&argv); _amain(); hs_exit(); return 0; } $ nm small | grep -c "U " 7 # <= 依存度が1減少 $ vi Makefile small: 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" int main(int argc, char *argv[]) { hs_init(&argc,&argv); _amain(); hs_exit(); return 0; } $ nm small | grep -c "U " 7 # <= 依存度が1減少
  • 32. 残った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を 流用するのがおすすめ
  • 33. これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの?これでプログラミングできるの? 以下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クラス
  • 36. [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 ☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現☆ 再入可能とスレッドの実現
  • 37. [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を型によって再設計
  • 38. 宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか? ☆ 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
  • 39. 本スライドで使用した画像 #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/
  • 40. 本スライドで使用した画像 #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/
  • 41. 本スライドで使用した画像 #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/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931381358/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931247866/ * 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/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931381358/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931247866/ * 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/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931381358/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931247866/ * 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/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931381358/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931247866/ * 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/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931381358/ * Hooded Cuttlefish | Flickr - Photo Sharing! http://www.flickr.com/photos/silkebaron/931247866/