組込向けhaskellコンパイラajhc / mbedマイコンどうでしょう編

51
組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編 組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編 組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編 組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編 組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編 Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe Kiwamu Okabe

Upload: kiwamu-okabe

Post on 15-Jan-2015

1.859 views

Category:

Technology


0 download

DESCRIPTION

組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

TRANSCRIPT

Page 1: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc 

mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc 

mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc 

mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc

mbedマイコンどうでしょう編

Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe

Page 2: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

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

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

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

Page 3: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

ようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへようこそ、ピストルMetasepiへ

☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも☆ [1] 前菜としてデモでも

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

☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは☆ [3] Metasepi kernelとは

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

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

☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell☆ [6] mbedマイコン上でのHaskell

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

Page 4: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

[1] 前菜としてデモでも[1] 前菜としてデモでも[1] 前菜としてデモでも[1] 前菜としてデモでも[1] 前菜としてデモでも

☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました☆ mbedでRSSリーダーを作ってみました

☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示☆ redditのRSSをLCDにヘッドライン表示

☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます☆ 動画は以下のURLから観れます

http://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmovhttp://bit.ly/mbedmov

☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています☆ このスライドは下のURLに置かれています

http://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhaskhttp://bit.ly/mbedhask

Page 5: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成

アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3アーキティクチャ: ARM Cortex-M3

メモリサイズ: 64kBメモリサイズ: 64kBメモリサイズ: 64kBメモリサイズ: 64kBメモリサイズ: 64kB

デバイス: Ethernet, LED, LCD, SDカード, USBホスト/デバイス, シリアルデバイス: Ethernet, LED, LCD, SDカード, USBホスト/デバイス, シリアルデバイス: Ethernet, LED, LCD, SDカード, USBホスト/デバイス, シリアルデバイス: Ethernet, LED, LCD, SDカード, USBホスト/デバイス, シリアルデバイス: Ethernet, LED, LCD, SDカード, USBホスト/デバイス, シリアル

Page 6: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成

Page 7: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

デモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリーdemo-cortex-m3`-- mbed-nxp-lpc1768 |-- BuildShell <= コンパイル環境設定 |-- build | `-- mbed.ld <= リンカスクリプト |-- external | `-- mbed | `-- LPC1768 | `-- GCC_ARM | `-- libmbed.a <= コンパイル済みmbedライブラリ |-- linux_install <= コンパイル環境構築スクリプト |-- samples | `-- Haskell_Http | |-- EthernetInterface <= TCP/IPプロトコルスタック | |-- c_extern.h | |-- dummy4jhc.c <= Haskell用C言語スタブ | |-- hs_src | | `-- *.hs <= Haskellソースコード | |-- main.c <= C言語main関数 | `-- mbed-rtos <= mbed-rtos OS `-- src `-- gcc4mbed.c

demo-cortex-m3`-- mbed-nxp-lpc1768 |-- BuildShell <= コンパイル環境設定 |-- build | `-- mbed.ld <= リンカスクリプト |-- external | `-- mbed | `-- LPC1768 | `-- GCC_ARM | `-- libmbed.a <= コンパイル済みmbedライブラリ |-- linux_install <= コンパイル環境構築スクリプト |-- samples | `-- Haskell_Http | |-- EthernetInterface <= TCP/IPプロトコルスタック | |-- c_extern.h | |-- dummy4jhc.c <= Haskell用C言語スタブ | |-- hs_src | | `-- *.hs <= Haskellソースコード | |-- main.c <= C言語main関数 | `-- mbed-rtos <= mbed-rtos OS `-- src `-- gcc4mbed.c

demo-cortex-m3`-- mbed-nxp-lpc1768 |-- BuildShell <= コンパイル環境設定 |-- build | `-- mbed.ld <= リンカスクリプト |-- external | `-- mbed | `-- LPC1768 | `-- GCC_ARM | `-- libmbed.a <= コンパイル済みmbedライブラリ |-- linux_install <= コンパイル環境構築スクリプト |-- samples | `-- Haskell_Http | |-- EthernetInterface <= TCP/IPプロトコルスタック | |-- c_extern.h | |-- dummy4jhc.c <= Haskell用C言語スタブ | |-- hs_src | | `-- *.hs <= Haskellソースコード | |-- main.c <= C言語main関数 | `-- mbed-rtos <= mbed-rtos OS `-- src `-- gcc4mbed.c

demo-cortex-m3`-- mbed-nxp-lpc1768 |-- BuildShell <= コンパイル環境設定 |-- build | `-- mbed.ld <= リンカスクリプト |-- external | `-- mbed | `-- LPC1768 | `-- GCC_ARM | `-- libmbed.a <= コンパイル済みmbedライブラリ |-- linux_install <= コンパイル環境構築スクリプト |-- samples | `-- Haskell_Http | |-- EthernetInterface <= TCP/IPプロトコルスタック | |-- c_extern.h | |-- dummy4jhc.c <= Haskell用C言語スタブ | |-- hs_src | | `-- *.hs <= Haskellソースコード | |-- main.c <= C言語main関数 | `-- mbed-rtos <= mbed-rtos OS `-- src `-- gcc4mbed.c

demo-cortex-m3`-- mbed-nxp-lpc1768 |-- BuildShell <= コンパイル環境設定 |-- build | `-- mbed.ld <= リンカスクリプト |-- external | `-- mbed | `-- LPC1768 | `-- GCC_ARM | `-- libmbed.a <= コンパイル済みmbedライブラリ |-- linux_install <= コンパイル環境構築スクリプト |-- samples | `-- Haskell_Http | |-- EthernetInterface <= TCP/IPプロトコルスタック | |-- c_extern.h | |-- dummy4jhc.c <= Haskell用C言語スタブ | |-- hs_src | | `-- *.hs <= Haskellソースコード | |-- main.c <= C言語main関数 | `-- mbed-rtos <= mbed-rtos OS `-- src `-- gcc4mbed.c

Page 8: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc☆ Ajhc := A fork of jhc

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

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

☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、☆ jhcはフットプリントが小さく、

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

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

Page 9: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

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

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

Page 10: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

[3] Metasepi kernelとは[3] Metasepi kernelとは[3] Metasepi kernelとは[3] Metasepi kernelとは[3] Metasepi kernelとは

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

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

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

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

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

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

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

Page 11: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

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

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

Page 12: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」☆ 「目玉の数さえ十分あれば、どんなバグも深刻ではない」http://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.htmlhttp://cruel.org/freeware/cathedral.html

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

Page 13: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

Page 14: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

Page 15: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

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

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

Page 16: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

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

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

Page 17: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

Page 18: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

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

Page 19: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

Page 20: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

Page 21: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)

Page 22: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

[5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方[5] Ajhcのインストールと使い方[5] 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 gcc m4$ cabal update$ export PATH=$HOME/.cabal/bin/:$PATH$ cabal install ajhc$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ echo 'main = print "hoge"' > Hoge.hs$ ajhc Hoge.hs$ ./hs.out"hoge"

$ sudo apt-get install haskell-platform libncurses5-dev gcc m4$ cabal update$ export PATH=$HOME/.cabal/bin/:$PATH$ cabal install ajhc$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ echo 'main = print "hoge"' > Hoge.hs$ ajhc Hoge.hs$ ./hs.out"hoge"

$ sudo apt-get install haskell-platform libncurses5-dev gcc m4$ cabal update$ export PATH=$HOME/.cabal/bin/:$PATH$ cabal install ajhc$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ echo 'main = print "hoge"' > Hoge.hs$ ajhc Hoge.hs$ ./hs.out"hoge"

$ sudo apt-get install haskell-platform libncurses5-dev gcc m4$ cabal update$ export PATH=$HOME/.cabal/bin/:$PATH$ cabal install ajhc$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ echo 'main = print "hoge"' > Hoge.hs$ ajhc Hoge.hs$ ./hs.out"hoge"

$ sudo apt-get install haskell-platform libncurses5-dev gcc m4$ cabal update$ export PATH=$HOME/.cabal/bin/:$PATH$ cabal install ajhc$ which ajhc/home/ユーザ名/.cabal/bin/ajhc$ echo 'main = print "hoge"' > Hoge.hs$ ajhc Hoge.hs$ ./hs.out"hoge"

バージョン0.8.0.9からはWindowsとOS Xでもインストール可能になる予定ですバージョン0.8.0.9からはWindowsとOS Xでもインストール可能になる予定ですバージョン0.8.0.9からはWindowsとOS Xでもインストール可能になる予定ですバージョン0.8.0.9からはWindowsとOS Xでもインストール可能になる予定ですバージョン0.8.0.9からはWindowsとOS Xでもインストール可能になる予定です

Page 23: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

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

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

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

Page 24: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell[6] mbedマイコン上でのHaskell

mbedマイコン上でHaskellコードを動かす手順をステップ毎に説明しますmbedマイコン上でHaskellコードを動かす手順をステップ毎に説明しますmbedマイコン上でHaskellコードを動かす手順をステップ毎に説明しますmbedマイコン上でHaskellコードを動かす手順をステップ毎に説明しますmbedマイコン上でHaskellコードを動かす手順をステップ毎に説明します

☆ C言語の開発環境構築☆ C言語の開発環境構築☆ C言語の開発環境構築☆ C言語の開発環境構築☆ C言語の開発環境構築

☆ Haskellの開発環境構築☆ Haskellの開発環境構築☆ Haskellの開発環境構築☆ Haskellの開発環境構築☆ Haskellの開発環境構築

☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング☆ Haskellを使ったプログラミング

の大きく3つに分けようと思いますの大きく3つに分けようと思いますの大きく3つに分けようと思いますの大きく3つに分けようと思いますの大きく3つに分けようと思います

Page 25: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築C言語の開発環境構築

まずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうまずベースとなるソースコードを入手しましょうhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbedhttps://github.com/adamgreen/gcc4mbed

githubにmbedのC言語プロジェクトがあったので、これをベースに開発をはじめますgithubにmbedのC言語プロジェクトがあったので、これをベースに開発をはじめますgithubにmbedのC言語プロジェクトがあったので、これをベースに開発をはじめますgithubにmbedのC言語プロジェクトがあったので、これをベースに開発をはじめますgithubにmbedのC言語プロジェクトがあったので、これをベースに開発をはじめます$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git$ git clone https://github.com/adamgreen/gcc4mbed.git

Page 26: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認

クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築$ cd gcc4mbed$ ./linux_install$ cd gcc4mbed$ ./linux_install$ cd gcc4mbed$ ./linux_install$ cd gcc4mbed$ ./linux_install$ cd gcc4mbed$ ./linux_install

設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...設定したクロスコンパイラを使うには...$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ lsmain.c makefile$ make$ lsBlink.bin Blink.elf Blink.hex LPC176x main.c makefile

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ lsmain.c makefile$ make$ lsBlink.bin Blink.elf Blink.hex LPC176x main.c makefile

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ lsmain.c makefile$ make$ lsBlink.bin Blink.elf Blink.hex LPC176x main.c makefile

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ lsmain.c makefile$ make$ lsBlink.bin Blink.elf Blink.hex LPC176x main.c makefile

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ lsmain.c makefile$ make$ lsBlink.bin Blink.elf Blink.hex LPC176x main.c makefile

Blink.elfがコンパイル結果ですBlink.elfがコンパイル結果ですBlink.elfがコンパイル結果ですBlink.elfがコンパイル結果ですBlink.elfがコンパイル結果です

Page 27: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1mbedにプログラムを書き込む #1

☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降に☆ mbedファームウェアをrev.141212以降にhttp://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24http://mbed.org/handbook/Firmware-LPC1768-LPC11U24

☆ pyOCDのインストール☆ pyOCDのインストール☆ pyOCDのインストール☆ pyOCDのインストール☆ pyOCDのインストール$ sudo apt-get install python libusb-1.0-0-dev$ git clone [email protected]:walac/pyusb.git$ cd pyusb && sudo python setup.py install$ git clone [email protected]:mbedmicro/mbed.git$ cd mbed/workspace_tools/debugger$ sudo python setup.py install$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py

$ sudo apt-get install python libusb-1.0-0-dev$ git clone [email protected]:walac/pyusb.git$ cd pyusb && sudo python setup.py install$ git clone [email protected]:mbedmicro/mbed.git$ cd mbed/workspace_tools/debugger$ sudo python setup.py install$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py

$ sudo apt-get install python libusb-1.0-0-dev$ git clone [email protected]:walac/pyusb.git$ cd pyusb && sudo python setup.py install$ git clone [email protected]:mbedmicro/mbed.git$ cd mbed/workspace_tools/debugger$ sudo python setup.py install$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py

$ sudo apt-get install python libusb-1.0-0-dev$ git clone [email protected]:walac/pyusb.git$ cd pyusb && sudo python setup.py install$ git clone [email protected]:mbedmicro/mbed.git$ cd mbed/workspace_tools/debugger$ sudo python setup.py install$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py

$ sudo apt-get install python libusb-1.0-0-dev$ git clone [email protected]:walac/pyusb.git$ cd pyusb && sudo python setup.py install$ git clone [email protected]:mbedmicro/mbed.git$ cd mbed/workspace_tools/debugger$ sudo python setup.py install$ cp test/gdb_test.py ~/gcc4mbed/gdbserver.py

☆ gdbスクリプト設置☆ gdbスクリプト設置☆ gdbスクリプト設置☆ gdbスクリプト設置☆ gdbスクリプト設置$ vi gcc4mbed/gdbwrite.boottarget remote localhost:3333load

$ vi gcc4mbed/gdbwrite.boottarget remote localhost:3333load

$ vi gcc4mbed/gdbwrite.boottarget remote localhost:3333load

$ vi gcc4mbed/gdbwrite.boottarget remote localhost:3333load

$ vi gcc4mbed/gdbwrite.boottarget remote localhost:3333load

Page 28: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2mbedにプログラムを書き込む #2

☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加☆ gcc4mbed.mkにgdbターゲット追加--- a/build/gcc4mbed.mk+++ b/build/gcc4mbed.mk@@ -255,6 +255,14 @@ endif all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm size +GDB = arm-none-eabi-gdb++gdbwrite: all+ @echo '################################################'+ @echo '# Use me after running "sudo ./gdbserver4.py". #'+ @echo '################################################'+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf+ $(PROJECT).bin: $(PROJECT).elf @echo Extracting $@ $(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin

--- a/build/gcc4mbed.mk+++ b/build/gcc4mbed.mk@@ -255,6 +255,14 @@ endif all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm size +GDB = arm-none-eabi-gdb++gdbwrite: all+ @echo '################################################'+ @echo '# Use me after running "sudo ./gdbserver4.py". #'+ @echo '################################################'+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf+ $(PROJECT).bin: $(PROJECT).elf @echo Extracting $@ $(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin

--- a/build/gcc4mbed.mk+++ b/build/gcc4mbed.mk@@ -255,6 +255,14 @@ endif all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm size +GDB = arm-none-eabi-gdb++gdbwrite: all+ @echo '################################################'+ @echo '# Use me after running "sudo ./gdbserver4.py". #'+ @echo '################################################'+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf+ $(PROJECT).bin: $(PROJECT).elf @echo Extracting $@ $(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin

--- a/build/gcc4mbed.mk+++ b/build/gcc4mbed.mk@@ -255,6 +255,14 @@ endif all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm size +GDB = arm-none-eabi-gdb++gdbwrite: all+ @echo '################################################'+ @echo '# Use me after running "sudo ./gdbserver4.py". #'+ @echo '################################################'+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf+ $(PROJECT).bin: $(PROJECT).elf @echo Extracting $@ $(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin

--- a/build/gcc4mbed.mk+++ b/build/gcc4mbed.mk@@ -255,6 +255,14 @@ endif

all:: $(PROJECT).hex $(PROJECT).bin $(OUTDIR)/$(PROJECT).disasm size

+GDB = arm-none-eabi-gdb++gdbwrite: all+ @echo '################################################'+ @echo '# Use me after running "sudo ./gdbserver4.py". #'+ @echo '################################################'+ $(GDB) -x ../../gdbwrite.boot $(PROJECT).elf+ $(PROJECT).bin: $(PROJECT).elf @echo Extracting $@ $(Q) $(OBJCOPY) -O binary $(PROJECT).elf $(PROJECT).bin

Page 29: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3mbedにプログラムを書き込む #3

☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続☆ mbedとPCをUSBケーブルで接続

☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行☆ 一つ目のターミナルで以下を実行$ cd gcc4mbed$ sudo python gdbserver.py$ cd gcc4mbed$ sudo python gdbserver.py$ cd gcc4mbed$ sudo python gdbserver.py$ cd gcc4mbed$ sudo python gdbserver.py$ cd gcc4mbed$ sudo python gdbserver.py

☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行☆ 別のターミナルを開き以下を実行$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ make gdbwrite(gdb) c

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ make gdbwrite(gdb) c

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ make gdbwrite(gdb) c

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ make gdbwrite(gdb) c

$ cd gcc4mbed$ ./BuildShell$ cd samples/Blink$ make gdbwrite(gdb) c

チカチカしました?チカチカしました?チカチカしました?チカチカしました?チカチカしました?

Page 30: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境

Page 31: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築Haskellの開発環境構築

☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る☆ Haskellプロジェクトディレクトリを掘る$ cd gcc4mbed/samples$ cp -a Blink Haskell$ cd Haskell$ lsmain.c makefile

$ cd gcc4mbed/samples$ cp -a Blink Haskell$ cd Haskell$ lsmain.c makefile

$ cd gcc4mbed/samples$ cp -a Blink Haskell$ cd Haskell$ lsmain.c makefile

$ cd gcc4mbed/samples$ cp -a Blink Haskell$ cd Haskell$ lsmain.c makefile

$ cd gcc4mbed/samples$ cp -a Blink Haskell$ cd Haskell$ lsmain.c makefile

Page 32: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ旧makefileを新Makefileでラップ$ mv makefile forc.mk$ vi MakefileHSBUILD = build_haskellTINI = $(HSBUILD)/targets.ini

all:: $(HSBUILD)/hs_main.c make -f forc.mk

include forc.mk

$(HSBUILD)/hs_main.c: $(HSSRC) mkdir -p $(HSBUILD) ajhc -fffi -p containers --tdir=$(HSBUILD) -C --include=hs_src -o $@ $< rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c $(HSBUILD)/rts/slub.c

$ mv makefile forc.mk$ vi MakefileHSBUILD = build_haskellTINI = $(HSBUILD)/targets.ini

all:: $(HSBUILD)/hs_main.c make -f forc.mk

include forc.mk

$(HSBUILD)/hs_main.c: $(HSSRC) mkdir -p $(HSBUILD) ajhc -fffi -p containers --tdir=$(HSBUILD) -C --include=hs_src -o $@ $< rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c $(HSBUILD)/rts/slub.c

$ mv makefile forc.mk$ vi MakefileHSBUILD = build_haskellTINI = $(HSBUILD)/targets.ini

all:: $(HSBUILD)/hs_main.c make -f forc.mk

include forc.mk

$(HSBUILD)/hs_main.c: $(HSSRC) mkdir -p $(HSBUILD) ajhc -fffi -p containers --tdir=$(HSBUILD) -C --include=hs_src -o $@ $< rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c $(HSBUILD)/rts/slub.c

$ mv makefile forc.mk$ vi MakefileHSBUILD = build_haskellTINI = $(HSBUILD)/targets.ini

all:: $(HSBUILD)/hs_main.c make -f forc.mk

include forc.mk

$(HSBUILD)/hs_main.c: $(HSSRC) mkdir -p $(HSBUILD) ajhc -fffi -p containers --tdir=$(HSBUILD) -C --include=hs_src -o $@ $< rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c $(HSBUILD)/rts/slub.c

$ mv makefile forc.mk$ vi MakefileHSBUILD = build_haskellTINI = $(HSBUILD)/targets.ini

all:: $(HSBUILD)/hs_main.c make -f forc.mk

include forc.mk

$(HSBUILD)/hs_main.c: $(HSSRC) mkdir -p $(HSBUILD) ajhc -fffi -p containers --tdir=$(HSBUILD) -C --include=hs_src -o $@ $< rm -f $(HSBUILD)/rts/gc_none.c $(HSBUILD)/rts/profile.c $(HSBUILD)/rts/slub.c

Page 33: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加forc.mkにAjhc用オプション追加$ vi forc.mk # <= 以下を追加HS_ENABLE = 1GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCEGCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIOGCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAPGCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE

$ vi forc.mk # <= 以下を追加HS_ENABLE = 1GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCEGCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIOGCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAPGCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE

$ vi forc.mk # <= 以下を追加HS_ENABLE = 1GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCEGCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIOGCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAPGCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE

$ vi forc.mk # <= 以下を追加HS_ENABLE = 1GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCEGCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIOGCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAPGCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE

$ vi forc.mk # <= 以下を追加HS_ENABLE = 1GCFLAGS += -std=gnu99 -ffreestanding -nostdlib -falign-functions=4GCFLAGS += -Wno-unused-parameter -fno-strict-aliasing -D_GNU_SOURCEGCFLAGS += -DNDEBUG -D_JHC_GC=_JHC_GC_JGC -D_JHC_STANDALONE=0GCFLAGS += -D_LITTLE_ENDIAN -D_JHC_USE_OWN_STDIOGCFLAGS += -D_JHC_ARM_STAY_IN_THUMB_MODE -D_JHC_JGC_STACKGROW=16GCFLAGS += -D_JHC_JGC_LIMITED_NUM_MEGABLOCK=2GCFLAGS += -D_JHC_JGC_MEGABLOCK_SHIFT=13 -D_JHC_JGC_BLOCK_SHIFT=8GCFLAGS += -D_JHC_JGC_GC_STACK_SHIFT=8GCFLAGS += -D_JHC_JGC_LIMITED_NUM_GC_STACK=1GCFLAGS += -D_JHC_JGC_NAIVEGC -D_JHC_JGC_SAVING_MALLOC_HEAPGCFLAGS += -D_JHC_CONC=_JHC_CONC_NONE

普段はajhcがgcc呼び出し時に自動的につけてくれるものもある普段はajhcがgcc呼び出し時に自動的につけてくれるものもある普段はajhcがgcc呼び出し時に自動的につけてくれるものもある普段はajhcがgcc呼び出し時に自動的につけてくれるものもある普段はajhcがgcc呼び出し時に自動的につけてくれるものもある

GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要GCのチューニングにもオプションが必要

Page 34: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1gcc4mbed.mkを修正 #1--- gcc4mbed/build/gcc4mbed.mk.back+++ gcc4mbed/build/gcc4mbed.mk@@ -100,6 +100,11 @@ GCC4MBED_TYPE ?= Release MRI_BREAK_ON_INIT ?= 1 MRI_UART ?= MRI_UART_MBED_USB+HS_ENABLE ?= 0+HSDIR ?= hs_src+HSBUILD ?= build_haskell+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)+HSMAIN ?= $(HSDIR)/Main.hs # Configure MRI variables based on GCC4MBED_TYPE build type variable.

--- gcc4mbed/build/gcc4mbed.mk.back+++ gcc4mbed/build/gcc4mbed.mk@@ -100,6 +100,11 @@ GCC4MBED_TYPE ?= Release MRI_BREAK_ON_INIT ?= 1 MRI_UART ?= MRI_UART_MBED_USB+HS_ENABLE ?= 0+HSDIR ?= hs_src+HSBUILD ?= build_haskell+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)+HSMAIN ?= $(HSDIR)/Main.hs # Configure MRI variables based on GCC4MBED_TYPE build type variable.

--- gcc4mbed/build/gcc4mbed.mk.back+++ gcc4mbed/build/gcc4mbed.mk@@ -100,6 +100,11 @@ GCC4MBED_TYPE ?= Release MRI_BREAK_ON_INIT ?= 1 MRI_UART ?= MRI_UART_MBED_USB+HS_ENABLE ?= 0+HSDIR ?= hs_src+HSBUILD ?= build_haskell+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)+HSMAIN ?= $(HSDIR)/Main.hs # Configure MRI variables based on GCC4MBED_TYPE build type variable.

--- gcc4mbed/build/gcc4mbed.mk.back+++ gcc4mbed/build/gcc4mbed.mk@@ -100,6 +100,11 @@ GCC4MBED_TYPE ?= Release MRI_BREAK_ON_INIT ?= 1 MRI_UART ?= MRI_UART_MBED_USB+HS_ENABLE ?= 0+HSDIR ?= hs_src+HSBUILD ?= build_haskell+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)+HSMAIN ?= $(HSDIR)/Main.hs # Configure MRI variables based on GCC4MBED_TYPE build type variable.

--- gcc4mbed/build/gcc4mbed.mk.back+++ gcc4mbed/build/gcc4mbed.mk@@ -100,6 +100,11 @@ GCC4MBED_TYPE ?= Release MRI_BREAK_ON_INIT ?= 1 MRI_UART ?= MRI_UART_MBED_USB+HS_ENABLE ?= 0+HSDIR ?= hs_src+HSBUILD ?= build_haskell+HSSRC ?= $(wildcard $(HSDIR)/*.hs $(HSDIR)/*/*.hs $(HSDIR)/*/*/*.hs $(HSDIR)/*/*/*/*.hs $(HSDIR)/*/*/*/*/*.hs)+HSMAIN ?= $(HSDIR)/Main.hs

# Configure MRI variables based on GCC4MBED_TYPE build type variable.

Page 35: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2gcc4mbed.mkを修正 #2@@ -212,13 +217,14 @@ ifneq "$(NO_FLOAT_PRINTF)" "1" LDFLAGS += -u _printf_float endif+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0 # Compiler/Assembler/Linker Paths GCC = arm-none-eabi-gcc GPP = arm-none-eabi-g++ AS = arm-none-eabi-as-LD = arm-none-eabi-g+++LD = arm-none-eabi-gcc OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SIZE = arm-none-eabi-size

@@ -212,13 +217,14 @@ ifneq "$(NO_FLOAT_PRINTF)" "1" LDFLAGS += -u _printf_float endif+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0 # Compiler/Assembler/Linker Paths GCC = arm-none-eabi-gcc GPP = arm-none-eabi-g++ AS = arm-none-eabi-as-LD = arm-none-eabi-g+++LD = arm-none-eabi-gcc OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SIZE = arm-none-eabi-size

@@ -212,13 +217,14 @@ ifneq "$(NO_FLOAT_PRINTF)" "1" LDFLAGS += -u _printf_float endif+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0 # Compiler/Assembler/Linker Paths GCC = arm-none-eabi-gcc GPP = arm-none-eabi-g++ AS = arm-none-eabi-as-LD = arm-none-eabi-g+++LD = arm-none-eabi-gcc OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SIZE = arm-none-eabi-size

@@ -212,13 +217,14 @@ ifneq "$(NO_FLOAT_PRINTF)" "1" LDFLAGS += -u _printf_float endif+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0 # Compiler/Assembler/Linker Paths GCC = arm-none-eabi-gcc GPP = arm-none-eabi-g++ AS = arm-none-eabi-as-LD = arm-none-eabi-g+++LD = arm-none-eabi-gcc OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SIZE = arm-none-eabi-size

@@ -212,13 +217,14 @@ ifneq "$(NO_FLOAT_PRINTF)" "1" LDFLAGS += -u _printf_float endif+LDFLAGS += -Wl,--defsym,jhc_zeroAddress=0

# Compiler/Assembler/Linker Paths GCC = arm-none-eabi-gcc GPP = arm-none-eabi-g++ AS = arm-none-eabi-as-LD = arm-none-eabi-g+++LD = arm-none-eabi-gcc OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump SIZE = arm-none-eabi-size

Page 36: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3gcc4mbed.mkを修正 #3@@ -279,7 +285,7 @@ @echo Cleaning up all build generated files $(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES)) $(QUIET)- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).map) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).disasm) $(QUIET) $(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)

@@ -279,7 +285,7 @@ @echo Cleaning up all build generated files $(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES)) $(QUIET)- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).map) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).disasm) $(QUIET) $(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)

@@ -279,7 +285,7 @@ @echo Cleaning up all build generated files $(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES)) $(QUIET)- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).map) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).disasm) $(QUIET) $(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)

@@ -279,7 +285,7 @@ @echo Cleaning up all build generated files $(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES)) $(QUIET)- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).map) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).disasm) $(QUIET) $(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)

@@ -279,7 +285,7 @@ @echo Cleaning up all build generated files $(Q) $(REMOVE) -f $(call convert-slash,$(OBJECTS)) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(DEPFILES)) $(QUIET)- $(Q) $(REMOVE_DIR) $(OUTDIR) $(QUIET)+ $(Q) $(REMOVE_DIR) $(OUTDIR) $(HSBUILD) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).map) $(QUIET) $(Q) $(REMOVE) -f $(call convert-slash,$(OUTDIR)/$(PROJECT).disasm) $(QUIET) $(Q) $(REMOVE) -f $(PROJECT).bin $(QUIET)

ぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりましたぜぇぜぇ。これでpatchあておわりました

Page 37: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

C言語main関数修正(main.c)C言語main関数修正(main.c)C言語main関数修正(main.c)C言語main関数修正(main.c)C言語main関数修正(main.c)#include "LPC17xx.h"#include "jhc_rts_header.h"#include "c_extern.h"

volatile int g_LoopDummy;

void delay(int times){ int i; for (i = 0 ; i < times && !g_LoopDummy ; i++) {}}

int main() { int hsargc = 1; char *hsargv = "q"; char **hsargvp = &hsargv; hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化 _amain(); // Haskellコード呼び出し hs_exit(); for (;;) {} return 0;}

#include "LPC17xx.h"#include "jhc_rts_header.h"#include "c_extern.h"

volatile int g_LoopDummy;

void delay(int times){ int i; for (i = 0 ; i < times && !g_LoopDummy ; i++) {}}

int main() { int hsargc = 1; char *hsargv = "q"; char **hsargvp = &hsargv; hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化 _amain(); // Haskellコード呼び出し hs_exit(); for (;;) {} return 0;}

#include "LPC17xx.h"#include "jhc_rts_header.h"#include "c_extern.h"

volatile int g_LoopDummy;

void delay(int times){ int i; for (i = 0 ; i < times && !g_LoopDummy ; i++) {}}

int main() { int hsargc = 1; char *hsargv = "q"; char **hsargvp = &hsargv; hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化 _amain(); // Haskellコード呼び出し hs_exit(); for (;;) {} return 0;}

#include "LPC17xx.h"#include "jhc_rts_header.h"#include "c_extern.h"

volatile int g_LoopDummy;

void delay(int times){ int i; for (i = 0 ; i < times && !g_LoopDummy ; i++) {}}

int main() { int hsargc = 1; char *hsargv = "q"; char **hsargvp = &hsargv; hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化 _amain(); // Haskellコード呼び出し hs_exit(); for (;;) {} return 0;}

#include "LPC17xx.h"#include "jhc_rts_header.h"#include "c_extern.h"

volatile int g_LoopDummy;

void delay(int times){

int i;for (i = 0 ; i < times && !g_LoopDummy ; i++) {}

}

int main() {

int hsargc = 1;char *hsargv = "q";char **hsargvp = &hsargv;

hs_init(&hsargc, &hsargvp); // Ajhcランタイム初期化 _amain(); // Haskellコード呼び出し hs_exit();

for (;;) {}return 0;

}

Page 38: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)独自のmalloc関数(alloc.c)

ソースコードが大きいのでwgetソースコードが大きいのでwgetソースコードが大きいのでwgetソースコードが大きいのでwgetソースコードが大きいのでwget$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-lpc1768/samples/Haskell/alloc.c$ grep MALLOC_HEAPSIZE alloc.c#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE#define MALLOC_HEAPSIZE (2*1024)char malloc_heapstart[MALLOC_HEAPSIZE];char *malloc_heaplimit = (char *) (malloc_heapstart + MALLOC_HEAPSIZE);

$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-lpc1768/samples/Haskell/alloc.c$ grep MALLOC_HEAPSIZE alloc.c#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE#define MALLOC_HEAPSIZE (2*1024)char malloc_heapstart[MALLOC_HEAPSIZE];char *malloc_heaplimit = (char *) (malloc_heapstart + MALLOC_HEAPSIZE);

$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-lpc1768/samples/Haskell/alloc.c$ grep MALLOC_HEAPSIZE alloc.c#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE#define MALLOC_HEAPSIZE (2*1024)char malloc_heapstart[MALLOC_HEAPSIZE];char *malloc_heaplimit = (char *) (malloc_heapstart + MALLOC_HEAPSIZE);

$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-lpc1768/samples/Haskell/alloc.c$ grep MALLOC_HEAPSIZE alloc.c#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE#define MALLOC_HEAPSIZE (2*1024)char malloc_heapstart[MALLOC_HEAPSIZE];char *malloc_heaplimit = (char *) (malloc_heapstart + MALLOC_HEAPSIZE);

$ wget https://raw.github.com/ajhc/demo-cortex-m3/master/mbed-nxp-lpc1768/samples/Haskell/alloc.c$ grep MALLOC_HEAPSIZE alloc.c#define MALLOC_HEAPSIZE _JHC_MALLOC_HEAP_SIZE#define MALLOC_HEAPSIZE (2*1024)char malloc_heapstart[MALLOC_HEAPSIZE];char *malloc_heaplimit = (char *) (malloc_heapstart + MALLOC_HEAPSIZE);

malloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみましたmalloc用ヒープは2kBに設定してみました

通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です

Page 39: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

雑多なAjhc向け設定雑多なAjhc向け設定雑多なAjhc向け設定雑多なAjhc向け設定雑多なAjhc向け設定

☆ 標準入出力を無力化☆ 標準入出力を無力化☆ 標準入出力を無力化☆ 標準入出力を無力化☆ 標準入出力を無力化// File: dummy4jhc.c#include "jhc_rts_header.h"

int jhc_printf_stderr(const char *format, ...) { return 0; }int jhc_fputs_stderr(const char *s) { return 0; }int jhc_fflush_stdout() { return 0; }void jhc_print_profile(void) {}int jhc_utf8_getchar(void) { return 0; }int jhc_utf8_getc(FILE *f) { return 0; }int jhc_utf8_putchar(int ch) { return 0; }int jhc_utf8_putc(int ch, FILE *f) { return 0; }

// File: dummy4jhc.c#include "jhc_rts_header.h"

int jhc_printf_stderr(const char *format, ...) { return 0; }int jhc_fputs_stderr(const char *s) { return 0; }int jhc_fflush_stdout() { return 0; }void jhc_print_profile(void) {}int jhc_utf8_getchar(void) { return 0; }int jhc_utf8_getc(FILE *f) { return 0; }int jhc_utf8_putchar(int ch) { return 0; }int jhc_utf8_putc(int ch, FILE *f) { return 0; }

// File: dummy4jhc.c#include "jhc_rts_header.h"

int jhc_printf_stderr(const char *format, ...) { return 0; }int jhc_fputs_stderr(const char *s) { return 0; }int jhc_fflush_stdout() { return 0; }void jhc_print_profile(void) {}int jhc_utf8_getchar(void) { return 0; }int jhc_utf8_getc(FILE *f) { return 0; }int jhc_utf8_putchar(int ch) { return 0; }int jhc_utf8_putc(int ch, FILE *f) { return 0; }

// File: dummy4jhc.c#include "jhc_rts_header.h"

int jhc_printf_stderr(const char *format, ...) { return 0; }int jhc_fputs_stderr(const char *s) { return 0; }int jhc_fflush_stdout() { return 0; }void jhc_print_profile(void) {}int jhc_utf8_getchar(void) { return 0; }int jhc_utf8_getc(FILE *f) { return 0; }int jhc_utf8_putchar(int ch) { return 0; }int jhc_utf8_putc(int ch, FILE *f) { return 0; }

// File: dummy4jhc.c#include "jhc_rts_header.h"

int jhc_printf_stderr(const char *format, ...) { return 0; }int jhc_fputs_stderr(const char *s) { return 0; }int jhc_fflush_stdout() { return 0; }void jhc_print_profile(void) {}int jhc_utf8_getchar(void) { return 0; }int jhc_utf8_getc(FILE *f) { return 0; }int jhc_utf8_putchar(int ch) { return 0; }int jhc_utf8_putc(int ch, FILE *f) { return 0; }

☆ Haskellから使うC言語API☆ Haskellから使うC言語API☆ Haskellから使うC言語API☆ Haskellから使うC言語API☆ Haskellから使うC言語API// File: c_extern.hextern volatile void jhc_zeroAddress;void delay();

// File: c_extern.hextern volatile void jhc_zeroAddress;void delay();

// File: c_extern.hextern volatile void jhc_zeroAddress;void delay();

// File: c_extern.hextern volatile void jhc_zeroAddress;void delay();

// File: c_extern.hextern volatile void jhc_zeroAddress;void delay();

>>>>>

Page 40: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

何もしないHaskellコードでお試し何もしないHaskellコードでお試し何もしないHaskellコードでお試し何もしないHaskellコードでお試し何もしないHaskellコードでお試し$ mkdir hs_src$ vi hs_src/Main.hsmain :: IO ()main = return ()$ lsMakefile c_extern.h forc.mk main.calloc.c dummy4jhc.c hs_src/$ make$ lsBlink.bin LPC176x build_haskell forc.mkBlink.elf Makefile c_extern.h hs_srcBlink.hex alloc.c dummy4jhc.c main.c

$ mkdir hs_src$ vi hs_src/Main.hsmain :: IO ()main = return ()$ lsMakefile c_extern.h forc.mk main.calloc.c dummy4jhc.c hs_src/$ make$ lsBlink.bin LPC176x build_haskell forc.mkBlink.elf Makefile c_extern.h hs_srcBlink.hex alloc.c dummy4jhc.c main.c

$ mkdir hs_src$ vi hs_src/Main.hsmain :: IO ()main = return ()$ lsMakefile c_extern.h forc.mk main.calloc.c dummy4jhc.c hs_src/$ make$ lsBlink.bin LPC176x build_haskell forc.mkBlink.elf Makefile c_extern.h hs_srcBlink.hex alloc.c dummy4jhc.c main.c

$ mkdir hs_src$ vi hs_src/Main.hsmain :: IO ()main = return ()$ lsMakefile c_extern.h forc.mk main.calloc.c dummy4jhc.c hs_src/$ make$ lsBlink.bin LPC176x build_haskell forc.mkBlink.elf Makefile c_extern.h hs_srcBlink.hex alloc.c dummy4jhc.c main.c

$ mkdir hs_src$ vi hs_src/Main.hsmain :: IO ()main = return ()$ lsMakefile c_extern.h forc.mk main.calloc.c dummy4jhc.c hs_src/$ make$ lsBlink.bin LPC176x build_haskell forc.mkBlink.elf Makefile c_extern.h hs_srcBlink.hex alloc.c dummy4jhc.c main.c

うんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできました

>>>>>

Page 41: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境

>>>>>

Page 42: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

Haskellを使ったプログラミングHaskellを使ったプログラミングHaskellを使ったプログラミングHaskellを使ったプログラミングHaskellを使ったプログラミング

☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!☆ HaskellからLEDチカチカしたい!

☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう☆ まず時間待ちを作りましょう

☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出☆ C言語のdelay関数をHaskellから呼出-- File: hs_src/Delay.hsmodule Delay where

foreign import ccall "c_extern.h delay" delay :: Int -> IO ()

-- File: hs_src/Delay.hsmodule Delay where

foreign import ccall "c_extern.h delay" delay :: Int -> IO ()

-- File: hs_src/Delay.hsmodule Delay where

foreign import ccall "c_extern.h delay" delay :: Int -> IO ()

-- File: hs_src/Delay.hsmodule Delay where

foreign import ccall "c_extern.h delay" delay :: Int -> IO ()

-- File: hs_src/Delay.hsmodule Delay where

foreign import ccall "c_extern.h delay" delay :: Int -> IO ()

>>>>>

Page 43: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

LED操作 #1LED操作 #1LED操作 #1LED操作 #1LED操作 #1-- File: hs_src/Led.hs (つづく)module Led whereimport Data.Wordimport Data.Bitsimport Foreign.Ptrimport Foreign.Storable

foreign import ccall "c_extern.h &jhc_zeroAddress" c_jhc_zeroAddress32 :: Ptr Word32

addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR, addr_FIOPIN :: Ptr Word32addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020addr_FIODIR = addr_LPC_GPIO1_BASEaddr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)

-- File: hs_src/Led.hs (つづく)module Led whereimport Data.Wordimport Data.Bitsimport Foreign.Ptrimport Foreign.Storable

foreign import ccall "c_extern.h &jhc_zeroAddress" c_jhc_zeroAddress32 :: Ptr Word32

addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR, addr_FIOPIN :: Ptr Word32addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020addr_FIODIR = addr_LPC_GPIO1_BASEaddr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)

-- File: hs_src/Led.hs (つづく)module Led whereimport Data.Wordimport Data.Bitsimport Foreign.Ptrimport Foreign.Storable

foreign import ccall "c_extern.h &jhc_zeroAddress" c_jhc_zeroAddress32 :: Ptr Word32

addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR, addr_FIOPIN :: Ptr Word32addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020addr_FIODIR = addr_LPC_GPIO1_BASEaddr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)

-- File: hs_src/Led.hs (つづく)module Led whereimport Data.Wordimport Data.Bitsimport Foreign.Ptrimport Foreign.Storable

foreign import ccall "c_extern.h &jhc_zeroAddress" c_jhc_zeroAddress32 :: Ptr Word32

addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR, addr_FIOPIN :: Ptr Word32addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020addr_FIODIR = addr_LPC_GPIO1_BASEaddr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)

-- File: hs_src/Led.hs (つづく)module Led whereimport Data.Wordimport Data.Bitsimport Foreign.Ptrimport Foreign.Storable

foreign import ccall "c_extern.h &jhc_zeroAddress" c_jhc_zeroAddress32 :: Ptr Word32

addr_LPC_GPIO_BASE, addr_LPC_GPIO1_BASE, addr_FIODIR,addr_FIOPIN :: Ptr Word32addr_LPC_GPIO_BASE = c_jhc_zeroAddress32 `plusPtr` 0x2009C000addr_LPC_GPIO1_BASE = addr_LPC_GPIO_BASE `plusPtr` 0x00020addr_FIODIR = addr_LPC_GPIO1_BASEaddr_FIOPIN = addr_LPC_GPIO1_BASE `plusPtr` (4 + 4 * 3 + 4)

>>>>>

Page 44: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

LED操作 #2LED操作 #2LED操作 #2LED操作 #2LED操作 #2-- File: hs_src/Led.hs (つづき)led1, led2, led3, led4, ledAll :: Word32led1 = 1 `shiftL` 18led2 = 1 `shiftL` 20led3 = 1 `shiftL` 21led4 = 1 `shiftL` 23ledAll = foldl (.|.) 0 [led1, led2, led3, led4]

initLeds :: IO ()initLeds = poke addr_FIODIR ledAll

ledsOn :: [Word32] -> IO ()ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls

-- File: hs_src/Led.hs (つづき)led1, led2, led3, led4, ledAll :: Word32led1 = 1 `shiftL` 18led2 = 1 `shiftL` 20led3 = 1 `shiftL` 21led4 = 1 `shiftL` 23ledAll = foldl (.|.) 0 [led1, led2, led3, led4]

initLeds :: IO ()initLeds = poke addr_FIODIR ledAll

ledsOn :: [Word32] -> IO ()ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls

-- File: hs_src/Led.hs (つづき)led1, led2, led3, led4, ledAll :: Word32led1 = 1 `shiftL` 18led2 = 1 `shiftL` 20led3 = 1 `shiftL` 21led4 = 1 `shiftL` 23ledAll = foldl (.|.) 0 [led1, led2, led3, led4]

initLeds :: IO ()initLeds = poke addr_FIODIR ledAll

ledsOn :: [Word32] -> IO ()ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls

-- File: hs_src/Led.hs (つづき)led1, led2, led3, led4, ledAll :: Word32led1 = 1 `shiftL` 18led2 = 1 `shiftL` 20led3 = 1 `shiftL` 21led4 = 1 `shiftL` 23ledAll = foldl (.|.) 0 [led1, led2, led3, led4]

initLeds :: IO ()initLeds = poke addr_FIODIR ledAll

ledsOn :: [Word32] -> IO ()ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls

-- File: hs_src/Led.hs (つづき)led1, led2, led3, led4, ledAll :: Word32led1 = 1 `shiftL` 18led2 = 1 `shiftL` 20led3 = 1 `shiftL` 21led4 = 1 `shiftL` 23ledAll = foldl (.|.) 0 [led1, led2, led3, led4]

initLeds :: IO ()initLeds = poke addr_FIODIR ledAll

ledsOn :: [Word32] -> IO ()ledsOn ls = poke addr_FIOPIN $ foldl (.|.) 0 ls

長いです。。。長いです。。。長いです。。。長いです。。。長いです。。。

あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!

>>>>>

Page 45: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

Haskellのmain関数Haskellのmain関数Haskellのmain関数Haskellのmain関数Haskellのmain関数-- File: hs_src/Main.hsimport Control.Monadimport Data.Wordimport Ledimport Delay

main :: IO ()main = do initLeds realmain

ledList :: [Word32]ledList = [led1, led2, led3, led4]

realmain :: IO ()realmain = forever $ do ledsOn [] >> mydelay ledsOn (take 1 ledList) >> mydelay ledsOn (take 2 ledList) >> mydelay ledsOn (take 3 ledList) >> mydelay ledsOn (take 4 ledList) >> mydelay where mydelay = delay 1000000

-- File: hs_src/Main.hsimport Control.Monadimport Data.Wordimport Ledimport Delay

main :: IO ()main = do initLeds realmain

ledList :: [Word32]ledList = [led1, led2, led3, led4]

realmain :: IO ()realmain = forever $ do ledsOn [] >> mydelay ledsOn (take 1 ledList) >> mydelay ledsOn (take 2 ledList) >> mydelay ledsOn (take 3 ledList) >> mydelay ledsOn (take 4 ledList) >> mydelay where mydelay = delay 1000000

-- File: hs_src/Main.hsimport Control.Monadimport Data.Wordimport Ledimport Delay

main :: IO ()main = do initLeds realmain

ledList :: [Word32]ledList = [led1, led2, led3, led4]

realmain :: IO ()realmain = forever $ do ledsOn [] >> mydelay ledsOn (take 1 ledList) >> mydelay ledsOn (take 2 ledList) >> mydelay ledsOn (take 3 ledList) >> mydelay ledsOn (take 4 ledList) >> mydelay where mydelay = delay 1000000

-- File: hs_src/Main.hsimport Control.Monadimport Data.Wordimport Ledimport Delay

main :: IO ()main = do initLeds realmain

ledList :: [Word32]ledList = [led1, led2, led3, led4]

realmain :: IO ()realmain = forever $ do ledsOn [] >> mydelay ledsOn (take 1 ledList) >> mydelay ledsOn (take 2 ledList) >> mydelay ledsOn (take 3 ledList) >> mydelay ledsOn (take 4 ledList) >> mydelay where mydelay = delay 1000000

-- File: hs_src/Main.hsimport Control.Monadimport Data.Wordimport Ledimport Delay

main :: IO ()main = do initLeds realmain

ledList :: [Word32]ledList = [led1, led2, led3, led4]

realmain :: IO ()realmain = forever $ do ledsOn [] >> mydelay ledsOn (take 1 ledList) >> mydelay ledsOn (take 2 ledList) >> mydelay ledsOn (take 3 ledList) >> mydelay ledsOn (take 4 ledList) >> mydelaywhere mydelay = delay 1000000

>>>>>

Page 46: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?

>>>>>

Page 47: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月

☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...

☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと

>>>>>

Page 48: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

これまでのAjhcコンパイラこれまでのAjhcコンパイラこれまでのAjhcコンパイラこれまでのAjhcコンパイラこれまでの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-M3マイコンへの移植☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植☆ Cortex-M3マイコンへの移植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

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

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

☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド☆ ChibiOS/RT上でのHaskellスレッド

☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング☆ mbed-rtos上でのTCP/IPプログラミング>>>>>

Page 49: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

Ajhcにまつわる発表資料Ajhcにまつわる発表資料Ajhcにまつわる発表資料Ajhcにまつわる発表資料Ajhcにまつわる発表資料* "How do you like jhc?" http://www.slideshare.net/master_q/20121216-jhc* "What is Metasepi?" http://www.slideshare.net/master_q/what-is-metasepi* "HaskellではじめるCortex-M3組込みプログラミング" http://www.slideshare.net/master_q/20130222-jhc-stm32* "Ajhcコンパイラの押売りに来ました" http://www.slideshare.net/master_q/20130422-ajhc-igarashi* "Debianを用いたCortex-M3マイコン開発事例のご紹介" http://www.slideshare.net/master_q/20130629-deb-cortexm3* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編" http://www.slideshare.net/master_q/20130802-osc-kyotoajhc* "組込Haskellとλカ娘本の紹介" http://www.slideshare.net/master_q/20130825-nagoya-festival* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編" http://www.slideshare.net/master_q/haskellajhc-mbed

* "How do you like jhc?" http://www.slideshare.net/master_q/20121216-jhc* "What is Metasepi?" http://www.slideshare.net/master_q/what-is-metasepi* "HaskellではじめるCortex-M3組込みプログラミング" http://www.slideshare.net/master_q/20130222-jhc-stm32* "Ajhcコンパイラの押売りに来ました" http://www.slideshare.net/master_q/20130422-ajhc-igarashi* "Debianを用いたCortex-M3マイコン開発事例のご紹介" http://www.slideshare.net/master_q/20130629-deb-cortexm3* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編" http://www.slideshare.net/master_q/20130802-osc-kyotoajhc* "組込Haskellとλカ娘本の紹介" http://www.slideshare.net/master_q/20130825-nagoya-festival* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編" http://www.slideshare.net/master_q/haskellajhc-mbed

* "How do you like jhc?" http://www.slideshare.net/master_q/20121216-jhc* "What is Metasepi?" http://www.slideshare.net/master_q/what-is-metasepi* "HaskellではじめるCortex-M3組込みプログラミング" http://www.slideshare.net/master_q/20130222-jhc-stm32* "Ajhcコンパイラの押売りに来ました" http://www.slideshare.net/master_q/20130422-ajhc-igarashi* "Debianを用いたCortex-M3マイコン開発事例のご紹介" http://www.slideshare.net/master_q/20130629-deb-cortexm3* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編" http://www.slideshare.net/master_q/20130802-osc-kyotoajhc* "組込Haskellとλカ娘本の紹介" http://www.slideshare.net/master_q/20130825-nagoya-festival* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編" http://www.slideshare.net/master_q/haskellajhc-mbed

* "How do you like jhc?" http://www.slideshare.net/master_q/20121216-jhc* "What is Metasepi?" http://www.slideshare.net/master_q/what-is-metasepi* "HaskellではじめるCortex-M3組込みプログラミング" http://www.slideshare.net/master_q/20130222-jhc-stm32* "Ajhcコンパイラの押売りに来ました" http://www.slideshare.net/master_q/20130422-ajhc-igarashi* "Debianを用いたCortex-M3マイコン開発事例のご紹介" http://www.slideshare.net/master_q/20130629-deb-cortexm3* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編" http://www.slideshare.net/master_q/20130802-osc-kyotoajhc* "組込Haskellとλカ娘本の紹介" http://www.slideshare.net/master_q/20130825-nagoya-festival* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編" http://www.slideshare.net/master_q/haskellajhc-mbed

* "How do you like jhc?" http://www.slideshare.net/master_q/20121216-jhc* "What is Metasepi?" http://www.slideshare.net/master_q/what-is-metasepi* "HaskellではじめるCortex-M3組込みプログラミング" http://www.slideshare.net/master_q/20130222-jhc-stm32* "Ajhcコンパイラの押売りに来ました" http://www.slideshare.net/master_q/20130422-ajhc-igarashi* "Debianを用いたCortex-M3マイコン開発事例のご紹介" http://www.slideshare.net/master_q/20130629-deb-cortexm3* "組込向けHaskellコンパイラAjhc / POSIX依存から脱出しよう編" http://www.slideshare.net/master_q/20130802-osc-kyotoajhc* "組込Haskellとλカ娘本の紹介" http://www.slideshare.net/master_q/20130825-nagoya-festival* "組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編" http://www.slideshare.net/master_q/haskellajhc-mbed

>>>>>

Page 50: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

Ajhcコンパイラの未来Ajhcコンパイラの未来Ajhcコンパイラの未来Ajhcコンパイラの未来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のライブラリを移植

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

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

☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に☆ Metasepi上でMetasepi開発を可能に

>>>>>

Page 51: 組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編

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

☆ 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とか圏論とか

☆ 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

>>>>>