はじめにの前に これはHaskell Advent Calendar 2021の23日目の記事です。長くなってしまったのと、時間がなくて説明が雑になっているところが多々あるかと。C言語で書かれたライブラリをHaskellから使うときに「ここどうやったらいいかな」というのを自力で解決してきた、いくつかの手法を、ひとつのライブラリをHaskellから使っていくというストーリーのなかで解説してみました。今後また手を入れて洗練させていきたいと思っています。 はじめに ふだんHaskellで楽していたとしても、もっと楽しいことをやろうとしたら、多くの場合にC言語のライブラリを使うことになる。Cの関数を使うことは楽しくスリリングな作業になる。柵のない屋上でローラースケートを楽しむようなものだ。使い捨てのコードであれば、FFIで取り込んだ関数をそのまま使えばいい。そうではなく、すこし腰をすえて取り組むコ
自分は最近RustのROS2クライアントを書いていて、間に合えばこれについて記事を書こうと思ったのですが、案の定間に合わなかったので代わりに書いています. ROS2はROS (Robot Operating System)というPロボット用フームワークの後継で、ROSが抱えるいくつかの問題点を解消するため、互換性を完全に切って新たに作られたものです.問題点の一つに、言語毎のクライアントライブラリの実装の仕様が統一されていないというものがあり、ROS2ではrclcやrmw等のC言語ライブラリを用意し、各言語のクライアントライブラリはそれらをラップして実装することが求められています. こういった事情でRustのROS2クライアントを作るためには、FFIが必須です. と御託はさておき、FFIでよく使う文字列と配列の変換について書いていきます. 前提知識 FFIについては知っているものとします.知
let plugin: Box<dyn Plugin> = unsafe { let load_plugin: Symbol<unsafe extern "C" fn() -> Box<dyn Plugin>> = lib.get(b"load_plugin")?; load_plugin() }; let name: String = plugin.name(); println!("1 {} 2 = {}", plugin.operator(), plugin.calc(1, 2)); // drop(plugin); // (2) 上の方法でトレイトオブジェクトを扱うことは(コンパイルエラーを生じないため)一見問題ないように見えます。しかし、load_plugin の戻り値型を Box にしてしまっているせいで所有権がプラグインとローダ間で移動し、(1) においてプラグイン側のアロケ
module Fib (fib) where -- フィボナッチ数の計算 fibs = 0:1:zipWith (+) fibs (tail fibs) fib i = fibs !! i {-# LANGUAGE OverloadedStrings #-} module Lib where import Foreign.C.String import Data.ByteString.Char8 (unpack, packCString, pack) import qualified Data.ByteString.Lazy.Char8 as BL8 import Data.Aeson -- CStringをAesonが解釈できるData.ByteString.Lazy.Char8に変換し、funcに渡しその結果を、CStringに戻す convertCStringViaJSON :: (
(2018.5.13) (その4)まとめを公開しました。ベンチマーク結果もありますのでご参考に。 はじめに 以前C++を使ってRubyのクラスメソッドを書くを投稿しましたが、大きな配列を扱うことが多いので、C++でデバッグするのはしんどいところがあります。 比較的デバッグがやり易く、速度も出やすいHaskellで書いた整数、浮動小数点、文字列、配列を使う関数をRubyから呼び出す方法を紹介いたします。 GHCのインストールなどでstackを利用している方が多いと思いので、それを使います。 buildなどはPythonからHaskell関数を呼ぶを参考にさせていただきました。 以下 $ stack new testFFI で作成したプロジェクトを前提としてます。 ファイルの変更 app/Main.hsとsrc/Lib.hsにプログラムを書き込みます。 module Main where im
先日 inline-c という、Haskellのソースの中にインラインでCのコードを書けるようにするパッケージがリリースされました。これまでの類似のパッケージよりも使いやすい感じで、愚直にFFIを書いたり、ブリッジライブラリを書いたり使ったりするよりやっぱり楽なもんだなあと感心していたんですが、これってもしかしたらインラインのCのインラインにアセンブリ書けば、Haskellに直接インラインでアセンブリを書くこともできるんじゃないか?と、ふと思ったので、やってみたら普通にできましたという話です。 inline-c inline-c に関しては、GitHubレポジトリに丁寧な README.md があるので、詳しくはこちらを見てくださいというところなんですが、せっかくなので少し試してみましょうか。 {-# LANGUAGE QuasiQuotes #-} import qualified La
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く