yuniFFI

ucontext.hはなぜPOSIXから廃止されたか

基本的に大抵のLinuxやBSD、CygwinはPOSIXに概ね準拠しているということになっている。今のところ最新のPOSIXはIssue 7(2008年 - 2013年が最新のedit)で、これはIssue 6からいくつかAPIを削減している(STREAMSのようにせっかく標準になったのに速攻でOBSOLET…

定数テーブルの取得 - nmosh / larceny / guile / sagittarius / racket / chibi-scheme

chibi-schemeとnmoshで同じライブラリ(yuniffi yunistub graphics SDL2-constants)を読み込み、SDL2の定数SDL_TRUEとSDL_FALSEをクエリしたところ。 というわけで、nmosh / larceny / guile / sagittarius / racket / chibi-schemeの各種R6RS/R7RSでFFIする…

ライブラリサーチパスの取得 - nmosh / Racket / Gauche / chibi-scheme / Sagittarius

DLLのソースコード生成は完成してGitHubにpushしたが特に書くことが無かった。。 というわけで淡々と続きを作っていく。今回はライブラリサーチパスの取得。 どこにDLLを配置するか問題 そろそろyuniFFIについてもテスト環境を構築する必要が有る。yuniFFIが…

スタブDLLの作成 - NCCCとは

前回: http://d.hatena.ne.jp/mjt/20150601/p1 - 定数テーブル 既にGithubには定数スタブのコード生成を完成させてコミットしているが、それについて書くのはDLLの準備が整ったタイミングに延期してcall stubの生成に話を進める。 以前( http://d.hatena.ne.…

スタブDLLの作成 - 定数テーブル

前回: http://d.hatena.ne.jp/mjt/20150523/p1 - データベースの構成 というわけで、DLLが提供すべき定数テーブルのコードをStubIRから生成する。 定数テーブルとは 定数テーブルとは、"ABIを構成する定数"の表を示す。要するにFFIバインディングの関数定義…

スタブDLLの作成 - データベースの構成

前回: http://d.hatena.ne.jp/mjt/20150322/p1 - FFIブリッジを作ろう 移植性のある"FFIブリッジ"ライブラリを作成したことで、Scheme処理系間で共通のFFI関数呼び出しフレームワークができた。もっとも、これだけでは役に立たないので実用性のあるFFIフレー…

FFIブリッジを作ろう - Sagittarius / DLLを何処に置くか問題

http://d.hatena.ne.jp/mjt/20150319/p1#c1426798218 この用途に合うかは分かりませんが、HEADでは(address bv offset)形式でバイトベクタの途中のアドレスを渡せるようにしてみました。 なんと! というわけで、SagittariusでもDynamic bindingだけでnccc呼…

FFIブリッジを作ろう - Sagittarius / Guile / Vicare

前々回: http://d.hatena.ne.jp/mjt/20150213/p1 nmosh / Gauche / Racket 前回: http://d.hatena.ne.jp/mjt/20150316/p1 chibi-scheme / Larceny というわけで、yuniFFIのFFIブリッジ作戦も終盤。Guile / Vicare / Sagittariusの3つはRacket同様libffiベー…

FFIブリッジを作ろう - chibi-scheme / Larceny

前回: http://d.hatena.ne.jp/mjt/20150213/p1 nmosh / Gauche / Racket というわけで、chibi-schemeと最近R7RSサポートがリリースされて話題のLarcenyにもFFIブリッジを書く。ncccやFFIブリッジの目的については前回参照。 これで、nmosh / Gauche / Racket…

制約付き手続きの実装 - 実装方法の検討

(簡単のため、図中のsendは手続きのように描かれているが、実際にはマクロとなる。これは _ (underscore)をパラメタの省略記号として使用するためで、_は補助構文なのでマクロの外では使用できない。) yuniFFIの重要なポイントは、構造体や手続きに"制約"(co…

nmoshのスレッドモデルを整理したいの会

正直作っている本人すらよく説明できていないnmoshのスレッドモデル。0.2.8に向けて用語を整理する。 NMosh Offload 従来FFI VMと呼んでいた、FFI専用のlightweight VMをNMosh Offloadとマーケティング向けの名称に改称。NMoshと名前が付くがyuniの方に実装…

C言語マクロもCPS化して合成可能にする

yuniFFIのAPI記述フォーマットであるstubIR( http://d.hatena.ne.jp/mjt/20141127/p2 )の処理系を作っていく。ひとまず、処理系に期待するCソース出力を手書きしてみることにした。 https://github.com/okuoku/yuni/blob/ac93456515136d2ba418e99da2b9f17f0d…

FFIブリッジを作ろう - nmosh / Gauche / Racketのncccブリッジ

というわけで、nmosh / Gauche / Racket の各Scheme処理系で共通のncccブリッジを実装できた。chibi-scheme(と、Guile2)については後日。 nccc nccc(Normalized C Calling Convention)は、yuniFFIフレームワークで使用する共通呼び出し規約。yuniFFIで呼び出…

StubIRのテストを書く

前回決めたStubIRフォーマット( http://d.hatena.ne.jp/mjt/20141127/p2 )のテストを書いた。 https://github.com/okuoku/yuni/tree/21b4826a2af373729ff7ae2974d9c474d138bd8e/tests/yunistub/trivial FFIのwrap対象となるCコード(中身無し) https://github…

stubIRの設計

Cソースprinter( http://d.hatena.ne.jp/mjt/20141019/p1 )の次は、stubジェネレータの入力となるS式構文(stubIR: stub intermediate representation)を設計する。 (もっとも、Cソースprinterは使わないことにした。出力がみづらくてデバッグに支障があるた…

AndroidエミュレータのOpenGL ESトランスポートに見るAPI記述

Android SDKに付属するエミュレータは、ターゲットのOpenGL ES描画をシリアライズしてホストに転送し、ホスト側のOpenGLスタックで描画する機能が有る。 https://android.googlesource.com/platform/sdk/+/android-5.0.0_r2/emulator/opengl/DESIGN デザイン…

週刊nmosh - Gaucheにer-macro-transformerが入る / FFI VMの必要性

追記: see comment。 Gaucheにer-macro-transformerが入ったようだ。 https://github.com/shirok/Gauche/commit/84908bd56cdf540c02e705fe053a762d21107295 早速置き換えてみた: https://github.com/okuoku/yuni/commit/36d965b5a7152fefca288b141d0a3827237…

C API ブリッジのデザイン

で、作ったジェネレータ( http://d.hatena.ne.jp/mjt/20141019/p1 )を使ってnccc( http://d.hatena.ne.jp/mjt/20141001/p1 )へのブリッジソースジェネレータを作る。 yuniFFIにおけるC API呼び出しの考え方 yuniFFIでは、C API呼び出しをパケットの送受信と…

POSIX組込みOS探し

需要のわりに良く対応できていないのは、"シングルプロセス/マルチスレッド"ユースケース。Windows、LinuxやBSDのようなOSは、マルチプロセス/マルチスレッドであり、普通の処理系はそのような環境を想定して標準ライブラリがデザインされている。 いくつか…

FFI関数呼び出し規約の正規化(Normalized C Calling Convention)

(同じことを何度も書いている。何度も書くとだんだんと内容が洗練されるんじゃないかということで) http://d.hatena.ne.jp/mjt/20130818/p1 http://d.hatena.ne.jp/mjt/20140720/p1 ucid時代はgcccと呼んでいたが紛らわしいのでncccに改名した 目的 yuniFFI…

callbackのarity問題

yuniFFIは、現状可変長引数のcallbackを記述することができない。重要な問題は、これにより可変長引数の関数をAPIトレースできない点にある。 これは、C言語の va_arg はarity(関数の入力数)を取るための方法を提供していないことに因る。 対策A : ABI固有の…

POSIX: C99との共通ヘッダ の1

というわけで、POSIXのうち、C99と共通するヘッダから入力を進めていくことにする。 POSIXは基本的にC99のスーパーセットになっているが、一部、C99から規格を制限する形でサブセットになっている部分が有る。例えば、POSIXのintは最低でも32bit必要となって…

インスタンシエートできないマクロをどうすんのか問題

yuniFFIはPOSIX(より正確にはいわゆるlibc)の記述を重要な目標としている。つまり、POSIXプログラムをC言語で書く状況に近いユーザビリティをScheme上に実現することが要求される。 POSIXの中には、マクロと関数のどちらで実装しても良いシンボルがいくつか…

Gauche対応への道

yuniFFIはyuniライブラリの一部なので移植性が要求される(API記述から生成したbindingを各種scheme処理系で使い回す)。 一つのscheme処理系に移植するにあたって、トピックはいくつか有る: C bridge: DLLロード/呼び出し DLLからシンボルを解決する generic …

stubIR変換処理の作成

(諸般の事情でUCID/pFFIはyuniFFIに改名される。GenericなAPI記述はC++サポートのために再検討を入れ、yuniFFIはSchemeに一旦特化する。) stubIRはCコードに変換され、Cコンパイラで処理されて呼び出し用のstub(DLL)となる。stubはScheme処理系固有の方法で…