タグ

Haskellとffiに関するsiroccoのブックマーク (11)

  • 第22回 FFIを使って他の言語の関数を呼び出す

    Haskellを使ってアプリケーションを作成しようとすると,ライブラリの機能不足に遭遇することがあります。不足しているこうした機能の中には,C言語で書かれたライブラリやOSのAPIなどの力を借りなければ記述できないものがあります。 このためHaskellでは,第7回で触れたように,実行環境の外にある他言語のライブラリを扱うためにFFIという機能を用意しています。FFIを使えば,Haskellにはない機能を実装できます。 今回はFFIの基的な使い方を説明します。 FFI使用の最初の一歩 最初に,FFIを使ったごく簡単な関数呼び出しを見てみましょう。以下のようなコードで,HaskellからCの関数を呼び出すことができます。 {-# LANGUAGE ForeignFunctionInterface #-} module SimpleFFIExample where foreign impor

    第22回 FFIを使って他の言語の関数を呼び出す
    sirocco
    sirocco 2013/06/07
    hsc2hsコマンドを使ってCの構造体にアクセスするHaskellコードを吐き出す。
  • HaskellからCライブラリを呼ぶ(FFI) - yunomuのブログ

    Haskellのなんでもアリ具合。 ライブラリをビルドしてるとちょいちょい見えるFFIという文字列、気になって調べてみると、ForeignFunctionInterfaceというものがあって、これはHaskellからCの関数を呼び出すためのモジュールというか拡張らしい。 Haskellのものすごいライブラリの充実度の影にはこういうものがあったりするんですね。 ということでちょっと遊んでみました。 だいたいこの記事のトレスです。 物のプログラマはHaskellを使う - 第22回 FFIを使って他の言語の関数を呼び出す:ITpro 既存のライブラリを呼ぶ 上の記事に習って、libmのsinを呼び出してみます。 まず、何はなくともmanです。sin(3)のmanを見ると、 NAME sin, sinf, sinl - sine function SYNOPSIS #include doubl

    HaskellからCライブラリを呼ぶ(FFI) - yunomuのブログ
    sirocco
    sirocco 2013/04/19
    カーネルコールはすべからくIO。Ptrで包まれた型は、Ptrで包んでいる限りは制約なしに自由にキャストできる。メモリを扱うにはForeign.Marshal.AllocでStorableのインスタンスになったポインタを確保し、peek/pokeで読み書きする。
  • Haskellの構造体をCと同期させる - 椿の日記

    Haskellの代数的データ型とCの構造体を通信するためにhsc2hsというツールを使うと便利らしい。次のHogeという構造体でテストしてみた。 サンプルコード // Types.h struct Hoge { uint32_t field; }; -- Types.hsc {-# LANGUAGE ForeignFunctionInterface #-} #include "Types.h" data Hoge = Hoge { field :: UINT } deriving (Show,Eq) instance Storable Hoge where sizeOf = #size struct Hoge alignment = sizeOf peek (Hoge x) = (#peek struct Hoge, field) x poke ptr (Hoge x) = (#poke

    Haskellの構造体をCと同期させる - 椿の日記
    sirocco
    sirocco 2011/01/12
    hsc2hs というコマンドを使って、Cの構造体をHaskellの代数的データ型に変換すプログラムの解説です。
  • CGI Error

    The error was detected while processing this request. Be sure of followings: The CGI script does exist. The permission of CGI script is 755. The Perl path in CGI script is #!/usr/local/bin/perl. CGIスクリプトの呼び出し中にエラーが発生しました。 下記の点をご確認ください。 ・CGIスクリプトが存在すること。 ・CGIスクリプトのパーミッションが755であること。 ・CGIスクリプトのperlのパスが #!/usr/local/bin/perl であること。

  • ポインタで値を受け取る関数のFFI - 椿の日記

    C言語は、言語の都合上、関数へ渡したアドレスを用いて戻り値を受け取ることがしばしばあります。 extern "C" void ReceivePointer( int* p ) { *p = 100; }これをHaskellで受け取るために、次のような手順をとります。 allocaでスタック上にメモリを割り当てる Cの関数へポインタを渡して値を受け取る ポインタ先の値をpeek関数で取得 (alloca関数が終わるのでメモリが開放される) 型が理解しやすくなるように関数を分割して記述するとこんな感じ。 {-# LANGUAGE ForeignFunctionInterface #-} import Foreign.Storable import Foreign.Marshal import Foreign.Ptr foreign import ccall "ReceivePointer" c

    ポインタで値を受け取る関数のFFI - 椿の日記
  • 備忘録 [Haskell]FFI使ってC++バインディングに入門

    この記事はHaskell Advent Calendarのために書いたものです。 FFIでCの関数を呼び出すところまではすんなりいったので、次C++行ってみよう!として ドハマりしたという内容です。 C++でクラスを作成して、ラッパー関数を書き、Haskellから呼び出すという手順でやってみます。 とりあえず何も考えずに以下のコードを書きました。 point.h point.cpp wrapper.cpp main.hs /* point.h */ class Point{ public: Point(int, int); int getX(); int getY(); private: int x, y; }; /* point.cpp */ #include "point.h" Point::Point(int x, int y){ this->x = x; this->y = y;

    sirocco
    sirocco 2010/12/16
    途中で挫折したことがあるので参考になります。こんどやってみます!
  • FFI (C++/CLI) - 七誌の開発日記

    FFIでC言語を呼び出せたので、extern "C"でラップした.NET APIを呼び出せるか試しました。Windows FormsでGUIが表示できました。右がスクリーンショットで、以下がソースです。 https://gist.github.com/738961 gccではC++/CLIを扱えないため、DLLはVisual C++ 2010 Express Editionで作成しました。今回はテスト目的のためラッパーを自作しましたが、hs-dotnetという汎用ラッパーが存在します。 id:sirocco:20101026:1288085914 今回は使いませんが、HaskellとF#を連携させることもできそうです。 マーシャリング マネージオブジェクトはpinで止めないとポインタが取り出せません。面倒なのでオブジェクトを配列に入れて、インデックスをハンドルとして扱うことにしました。この

    FFI (C++/CLI) - 七誌の開発日記
  • はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知

    はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28

    はてなグループの終了日を2020年1月31日(金)に決定しました - はてなの告知
  • 12.2. CコードへのHaskellインタフェースを書く: hsc2hs

    hsc2hsコマンドを使うと、CコードのHaskellバインディングを書く作業を一部自動化することができる。このコマンドは、特別な構文要素の埋め込まれたHaskellのコードを読み、Cのヘッダから得た情報を使ってこれらの要素を処理し、当のHaskellファイルを出力する。この特別な構文要素は、HaskellからCのデータにアクセスするにあたって必要なことを扱う。 hsc2hsはCファイルとCヘッダを出力することもある。Cファイルには、プログラムにリンクすべき追加のC関数が置かれ、ヘッダファイルは、そのHaskellモジュールがコンパイルされてできるCコードからincludeされるものである。この二つのファイルは#defという構文要素(下記参照)が使われたときに作られる。 hsc2hsは実際には直接Haskellコードを出力するわけではない。問題のヘッダをインクルードするCプログラムを作り

  • Haskell/FFI - Wikibooks, open books for an open world

  • ものぐさ備忘録 : Haskellだってバグるよねっていう話し(C言語の関数をHaskellで呼ぶ)

  • 1