Upload
kiwamu-okabe
View
1.859
Download
0
Embed Size (px)
DESCRIPTION
組込向けHaskellコンパイラAjhc / mbedマイコンどうでしょう編
Citation preview
組込向けHaskellコンパイラAjhc mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc
mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc
mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc
mbedマイコンどうでしょう編組込向けHaskellコンパイラAjhc
mbedマイコンどうでしょう編
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で
ようこそ、ピストル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コンパイラの過去と未来
[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
デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成デモのハードウェア構成
アーキティクチャ: 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ホスト/デバイス, シリアル
デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成デモのソフトウェア構成
デモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリーデモのソースコードツリー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
[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はフットプリントが小さく、
☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい☆ 高速な実行バイナリを吐くらしい
☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも☆ 組み込みに向いてるかも
どうして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を作るため
[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/
などなどなどなどなどなどなどなどなどなど
どうして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言語は安全なのか?
[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] OS開発向けコンパイラとは[4] 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言語への変換器
クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単クロスコンパイルも簡単
実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために実用化に辿りつくために
実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)実行可能状態を維持しながら開発 (スナッチ)
[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でもインストール可能になる予定です
使い方詳細使い方詳細使い方詳細使い方詳細使い方詳細
「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
を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!を読んでみてください!
[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つに分けようと思います
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
ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認ビルド手順を確認
クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築クロスコンパイル環境構築$ 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がコンパイル結果です
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
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
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
チカチカしました?チカチカしました?チカチカしました?チカチカしました?チカチカしました?
完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境完成したC言語開発環境
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
旧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
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のチューニングにもオプションが必要
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.
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
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あておわりました
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;
}
独自の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に設定してみました
通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です通常用途ならたぶん十分です
雑多な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();
>>>>>
何もしない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
うんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできましたうんコンパイルできました
>>>>>
完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境完成したHaskell開発環境
>>>>>
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 ()
>>>>>
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)
>>>>>
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
長いです。。。長いです。。。長いです。。。長いです。。。長いです。。。
あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!あとで概要を説明します!
>>>>>
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
>>>>>
このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?このHaskellコードはどう動く?
>>>>>
[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来[7] Ajhcコンパイラの過去と未来
☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月☆ Ajhcの開発をはじめて9ヶ月
☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...☆ いろいろありました...
☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと☆ 振り返りと今後の展望をざっくりと
>>>>>
これまでの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プログラミング>>>>>
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
>>>>>
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開発を可能に
>>>>>
宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?宣伝:λカ娘に記事を書きませんか?
☆ 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
>>>>>