SlideShare uma empresa Scribd logo
1 de 35
Baixar para ler offline
すべてを Racket に取り込もう!
∼Racket FFI と Package システムの使い方∼

菱沼 和弘 (@kazh98)
明治大学理工学部情報科学科 数理最適化研究室
URL: http://www.mo.cs.meiji.ac.jp/kaz/

K. Hishinuma

すべてを Racket に取り込もう!

1 / 35
Let’s Introduction

数学徒の苦悩

マスハラという言葉を
ご存知ですか?

K. Hishinuma

すべてを Racket に取り込もう!

2 / 35
Let’s Introduction

[複名/U] マスハラ (mathematical harassment)

U : 数学徒,
V ⊂ U : 精神的苦痛を感じている数学徒,
T : U → U, 数学的を用いた言動.

T がマスハラである.
⇐⇒ ∃x ∈ U : T x ∈ V.
def

※このスライドもマスハラかもしれない

K. Hishinuma

すべてを Racket に取り込もう!

3 / 35
Let’s Introduction

例. 水面上のマスハラ

「ちょっとそれ証明してよ」
「本当にそれ定義から言えるの?」
「・・・(板書への無言の視線)」

K. Hishinuma

すべてを Racket に取り込もう!

4 / 35
Let’s Introduction

しかし!

CS系数学徒には、
知られざる水面下のマスハラ
もあるのです!!!

K. Hishinuma

すべてを Racket に取り込もう!

5 / 35
Let’s Introduction

例. 水面下のマスハラ

「数値計算なら FORTRAN 使わなきゃ」
「FORTRAN に良いライブラリがあるよ∼」

README: Available for Fortran77

K. Hishinuma

すべてを Racket に取り込もう!

6 / 35
Let’s Introduction

FORTRAN 地獄

いつまでそんな太古の言語を
使っているんだ!!

K. Hishinuma

すべてを Racket に取り込もう!

7 / 35
Let’s Introduction

備考

Fortran (1957–)
Lisp (1958–)
……やばい、そんなに違いない

K. Hishinuma

すべてを Racket に取り込もう!

8 / 35
Let’s Introduction

ということで、

///////////////
過去の遺産人類の叡智を、
1 年未来の言語から
呼びだそう!!
Lisp で書くことに
幸せを感じる人間もいるのです

K. Hishinuma

すべてを Racket に取り込もう!

9 / 35
Racket Foreign Interface

Racket FFI

C 言語向けのライブラリを Racket から叩ける機能。
base パッケージにより標準提供。

FFI 機能の利用



(require ffi/unsafe ffi/unsafe/define)
(require ffi/vector) ; 配列型を扱う場合




K. Hishinuma

すべてを Racket に取り込もう!

10 / 35
Racket Foreign Interface

ということは?

FORTRAN ライブラリ
→ C インターフェイス
→ Racket FFI
で、Racket から呼び出せる!!!
K. Hishinuma

すべてを Racket に取り込もう!

11 / 35
Racket Foreign Interface

BLAS の Racket インターフェイスを書いてみた

成果物は、Github:
https://github.com/kazh98/blas
で公開しています。
※ Lv1 呼び出しのみ完成

K. Hishinuma

すべてを Racket に取り込もう!

12 / 35
Racket Foreign Interface

ライブラリのロード
ライブラリのロードには、ffi-lib 関数を用いる。

ffi-lib 関数



(ffi-lib ライブラリ名 #:fail 失敗時手続き)
ライブラリ名 ロードするライブラリの名前 (e.g. libc)
失敗時手続き ロード失敗時に呼び出される thunk



戻り値 FFI オブジェクトを返す。
これを define-ffi-definer 構文で捕捉すると、
FFI 定義子が手に入る。

K. Hishinuma

すべてを Racket に取り込もう!



13 / 35
Racket Foreign Interface

例. ライブラリのロード

(define-ffi-definer define-cblas
(ffi-lib libcblas #:fail (lambda ()
(ffi-lib libgslcblas))))
ライブラリ名 libcblas,libgslcblas を順に探す。
以後、define-cblas 構文が、FFI 定義子となる。

K. Hishinuma

すべてを Racket に取り込もう!

14 / 35
Racket Foreign Interface

インターフェイス定義
FFI 定義子 define-cblas を使って、
ライブラリ関数へのインターフェイスを定義する。
C 言語のプロトタイプ宣言に相当。

define-cblas 構文



(define-cblas 名前 型)
名前 ライブラリからインターフェイスを張る関数名
型 ライブラリから張られる関数の型

(_fun 引数型 1 引数型 2 ... - 戻り値型)



K. Hishinuma

すべてを Racket に取り込もう!



15 / 35
Racket Foreign Interface

インターフェイス定義型

C 言語
int
unsigned int
double
size_t
intptr_t
void*
char*

Racket
_int
_uint
_double*
_size
_intptr
_pointer
_string

C 言語
int32_t*
int64_t*
double*

Racket
_s32vector
_s64vector
_f64vector

呼び出し時には、スカラ型は対応する Racket の値を、
配列型は対応する SRFI-4 のベクタを用いればよい。

K. Hishinuma

すべてを Racket に取り込もう!

16 / 35
Racket Foreign Interface

例. インターフェイス定義
 言語プロトタイプ宣言 (cblas.h)
C

double cblas_dnrm2(const int N,
const double *X, const int incX);







↓

Racket インターフェイス定義

(define-cblas cblas_dnrm2
(_fun _int _f64vector _int - _double))







これで、cblas_dnrm2 が普通の関数同様に呼び出せる。
K. Hishinuma

すべてを Racket に取り込もう!

17 / 35
Racket Foreign Interface

FFI 完成

(require math/cblas ffi/vector)
(cblas_dnrm2 2 (f64vector 3.0 4.0) 1)
;= 5.0

K. Hishinuma

すべてを Racket に取り込もう!

18 / 35
Package Management

再利用可能のために

Racket 新機能の Package システムで、
標準に準拠した 1 ライブラリを書こう!

1

http://pkgs.racket-lang.org/ で公開できる
K. Hishinuma

すべてを Racket に取り込もう!

19 / 35
Package Management

ライブラリ作成の手順

1

2

3

ファイルの配置と provide
info.rkt の作成
Github で公開

K. Hishinuma

すべてを Racket に取り込もう!

20 / 35
Package Management

ファイルの配置

(require [パッケージ名]/[ライブラリ名])
で読み込まれるライブラリを、
/[パッケージ名]/[ライブラリ名].rkt
に配置する。

今回の例
/math/blas.rkt
/math/cblas.rkt



K. Hishinuma




すべてを Racket に取り込もう!

21 / 35
Package Management

provide の宣言
provide 構文を用いて、
外部参照可能な関数を指定する。

今回の例
(provide
cblas_dswap cblas_dscal cblas_dcopy cblas_daxpy
cblas_ddot cblas_dnrm2 cblas_dasum cblas_idamax)







※ FFI インターフェイスは、Racket 上では単なる手続きなので、
それらと同様にしてよい。

K. Hishinuma

すべてを Racket に取り込もう!

22 / 35
Package Management

みなさま

お気づきでしょうか・・・
悲劇に向かって
直進してきたことを。

K. Hishinuma

すべてを Racket に取り込もう!

23 / 35
Package Management

なんということをしてくれたのでしょう

K. Hishinuma

すべてを Racket に取り込もう!

24 / 35
Package Management

なんということをしてくれたのでしょう!

K. Hishinuma

すべてを Racket に取り込もう!

25 / 35
Package Management

なんということをしてくれたのでしょう!!

K. Hishinuma

すべてを Racket に取り込もう!

26 / 35
Package Management

契約プログラミングへの冒涜

FFI が、関数契約生成子-と
同じ名前-を使うので、
契約付き provide など 2
ができない!!
2

see, http://www.mo.cs.meiji.ac.jp/kaz/km-iter
K. Hishinuma

すべてを Racket に取り込もう!

27 / 35
Package Management

エラーになる例

(provide
cblas_dswap cblas_dscal cblas_dcopy
(contract-out
(SWAP (- f64vector? f64vector? void?))
(SCAL (- real? f64vector? void?))
(COPY (- f64vector? f64vector? void?))))

K. Hishinuma

すべてを Racket に取り込もう!

28 / 35
Package Management

公式見解

Eli Barzilay: The Racket Foreign Interface
It’s unfortunate that this literal has the
same name as - from racket/contract,
but it’s a different binding.
unfortunate か、それなら仕方ない。
……では済まないでしょ!!!

K. Hishinuma

すべてを Racket に取り込もう!

29 / 35
Package Management

対策

FFI インターフェイス定義のみを、
別ファイルに隔離する。
blas.rkt (require される) ライブラリ
cblas.rkt FFI 定義の隔離先

K. Hishinuma

すべてを Racket に取り込もう!

30 / 35
Package Management

info.rkt
Package のルートに、info.rkt を配置する。

info.rkt



#lang setup/infotab
(define collection ’multi)
(define version
バージョン番号)
(define deps
’(依存関係))
バージョン番号 数字とピリオド区切りの文字列
依存関係 依存するパッケージ名を表す文字列のリスト




K. Hishinuma

すべてを Racket に取り込もう!

31 / 35
Package Management

Github で公開
あとは、
作ったものを Github で公開すれば OK !

% raco pkg install github://github.com/
ユーザ名/リポジトリ名/master
とか叩けば、
ライブラリをインストールできる。

K. Hishinuma

すべてを Racket に取り込もう!

32 / 35
あとがき

BLAS Interface for Racket の使用例
閉球 C := {x ∈ Rn : ∥x − c∥ ≤ r} への距離射影
{
x + ∥c−x∥−r (c − x) (∥x − c∥  r)
∥c−x∥
PC (x) :=
.
x
(Otherwise)

(require math/blas)
(define (PROJ C R X)
(let ((T (make-vect (vect-length C))) (U 0.))
(COPY C T)
(AXPY -1 X T)
(set! U (NRM2 T))
(when ( U R)
(AXPY (/ (- U R) U) T X))
X))
K. Hishinuma

すべてを Racket に取り込もう!

33 / 35
あとがき

参考文献

[1] E. Barzilay: The Racket Foreign Interface.
URI: http://docs.racket-lang.org/foreign/
[2] J. McCarthy: Package Management in Racket.
URI: http://docs.racket-lang.org/pkg/
[3] K. Hishinuma: Racket(Scheme) による Krasnosel’skii-Mann
iterations の数値実験.
URI: http://www.mo.cs.meiji.ac.jp/kaz/km-iter
[4] K. Hishinuma: K. Hishinuma: BLAS Interface for Racket.
URI: http://www.mo.cs.meiji.ac.jp/kaz/blas

K. Hishinuma

すべてを Racket に取り込もう!

34 / 35
あとがき

Thanks for your listening.

K. Hishinuma

すべてを Racket に取り込もう!

35 / 35

Mais conteúdo relacionado

Mais de Kazuhiro Hishinuma

Properties of a Convex Set in Linear Space
Properties of a Convex Set in Linear SpaceProperties of a Convex Set in Linear Space
Properties of a Convex Set in Linear SpaceKazuhiro Hishinuma
 
What Does R7RS Change Programming in Scheme?
What Does R7RS Change Programming in Scheme?What Does R7RS Change Programming in Scheme?
What Does R7RS Change Programming in Scheme?Kazuhiro Hishinuma
 
不動点×不動点×不動点コンビネータ
不動点×不動点×不動点コンビネータ不動点×不動点×不動点コンビネータ
不動点×不動点×不動点コンビネータKazuhiro Hishinuma
 
最急降下法で制約つき最適化問題を解いてみた
最急降下法で制約つき最適化問題を解いてみた最急降下法で制約つき最適化問題を解いてみた
最急降下法で制約つき最適化問題を解いてみたKazuhiro Hishinuma
 
再帰でつくる、計算の世界
再帰でつくる、計算の世界再帰でつくる、計算の世界
再帰でつくる、計算の世界Kazuhiro Hishinuma
 
Implementation of Counters in ScopedBASIC
Implementation of Counters in ScopedBASICImplementation of Counters in ScopedBASIC
Implementation of Counters in ScopedBASICKazuhiro Hishinuma
 
Lisper は競プロを楽しめるか?
Lisper は競プロを楽しめるか?Lisper は競プロを楽しめるか?
Lisper は競プロを楽しめるか?Kazuhiro Hishinuma
 
GaucheでCGIプログラミング
GaucheでCGIプログラミングGaucheでCGIプログラミング
GaucheでCGIプログラミングKazuhiro Hishinuma
 
How to Implement a CPU Emulator in Scheme
How to Implement a CPU Emulator in SchemeHow to Implement a CPU Emulator in Scheme
How to Implement a CPU Emulator in SchemeKazuhiro Hishinuma
 
The Programming Language Scheme
The Programming Language SchemeThe Programming Language Scheme
The Programming Language SchemeKazuhiro Hishinuma
 
情報と職業プレゼン予告
情報と職業プレゼン予告情報と職業プレゼン予告
情報と職業プレゼン予告Kazuhiro Hishinuma
 
#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon ResultKazuhiro Hishinuma
 

Mais de Kazuhiro Hishinuma (17)

Properties of a Convex Set in Linear Space
Properties of a Convex Set in Linear SpaceProperties of a Convex Set in Linear Space
Properties of a Convex Set in Linear Space
 
大学生活概論
大学生活概論大学生活概論
大学生活概論
 
床下からCommon Lisp
床下からCommon Lisp床下からCommon Lisp
床下からCommon Lisp
 
What Does R7RS Change Programming in Scheme?
What Does R7RS Change Programming in Scheme?What Does R7RS Change Programming in Scheme?
What Does R7RS Change Programming in Scheme?
 
不動点×不動点×不動点コンビネータ
不動点×不動点×不動点コンビネータ不動点×不動点×不動点コンビネータ
不動点×不動点×不動点コンビネータ
 
最急降下法で制約つき最適化問題を解いてみた
最急降下法で制約つき最適化問題を解いてみた最急降下法で制約つき最適化問題を解いてみた
最急降下法で制約つき最適化問題を解いてみた
 
再帰でつくる、計算の世界
再帰でつくる、計算の世界再帰でつくる、計算の世界
再帰でつくる、計算の世界
 
Implementation of Counters in ScopedBASIC
Implementation of Counters in ScopedBASICImplementation of Counters in ScopedBASIC
Implementation of Counters in ScopedBASIC
 
Lisper は競プロを楽しめるか?
Lisper は競プロを楽しめるか?Lisper は競プロを楽しめるか?
Lisper は競プロを楽しめるか?
 
GaucheでCGIプログラミング
GaucheでCGIプログラミングGaucheでCGIプログラミング
GaucheでCGIプログラミング
 
How to Implement a CPU Emulator in Scheme
How to Implement a CPU Emulator in SchemeHow to Implement a CPU Emulator in Scheme
How to Implement a CPU Emulator in Scheme
 
明治大の活動2
明治大の活動2明治大の活動2
明治大の活動2
 
明治大の活動予告
明治大の活動予告明治大の活動予告
明治大の活動予告
 
The Programming Language Scheme
The Programming Language SchemeThe Programming Language Scheme
The Programming Language Scheme
 
情報と職業プレゼン予告
情報と職業プレゼン予告情報と職業プレゼン予告
情報と職業プレゼン予告
 
#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result#upcamp '12 Hack-a-thon Result
#upcamp '12 Hack-a-thon Result
 
Scoped BASIC Presentation1
Scoped BASIC Presentation1Scoped BASIC Presentation1
Scoped BASIC Presentation1
 

Último

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 

Último (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 

すべてをRacketに取り込もう! ~Racket FFI と Package システムの使い方~