SlideShare a Scribd company logo
SECDマシン
実装と動きとその他もろもろについて
@t-sin
2020-10-29
lispmeetup #91
おことわり
●
SECDマシンの上にLispKit Lispを実装した
Peter Hendersonの本の内容は出てきませ
ん
– “Functional Programming Application and
Implementation”
– 先日届いたけどまだ読めてないので…
– 目次には並列化や手続き型プログラムからの変換など
のトピックがあった
●
純Lispにコンパイルする話はありません
●
予告していた継続の話もありません
もくじ
●
SECDマシンの概要
●
SECDマシンの詳細
●
SECDマシンの実装
●
SECDマシンへ翻訳 (次回)
●
SECDマシンと継続 (次回)
SECDマシンの概要
まずは一般的な説明から
SECDマシンの概要: 基本
●
ラムダ計算を評価・実行するための抽象機械
– つまり純粋関数型言語のための抽象機械
●
Peter Landinによる論文[3]で提唱された
– 命令一覧が載ってないくらいには抽象的
●
具体的な命令はLispKit Lispの実装が有名
– Peter Hendersonによる
– ググるとでてくる具体的な命令はだいたいこ
れが元
SECDマシンの概要: 特徴
●
スタックマシン
– 4つのレジスタにスタックを保持する
●
レキシカルスコープをもつ
●
第一級の関数オブジェクト
●
関数は引数を1個のみ取る
– カリー化されている
– 複数の引数は関数呼び出しの入れ子で表現する
●
コアの機能は命令でいうと8個ほど
SECDマシンの概要: 詳細
●
スタックマシン
– 引数等のデータの一時保管場所がスタックな
もの
– レジスタマシンは一時保管場所がレジスタな
もの
●
4つのスタックをもつ
– Stack: データスタック
– Environment: 引数の束縛
– Controll: 未実行の命令のリスト
– Dump: 関数適用や分岐時のデータ退避場所
SECDマシンの概要: 動作
●
プログラムをControllスタックに読み込む
●
以下を繰り返す
– Controllスタックが空なら終了
– Controllスタックから命令をポップ
– 命令に対応した処理を実行
●
これによりS, E, C, Dの値が変化する
SECDマシンの詳細
ここからは実装を視野に入れ、
もうちょっと具体的な説明をしていきます
SECDマシンの詳細: スタック
●
Stack (データスタック)
– 命令や関数への引数のやりとりに用いる
●
Environment (環境)
– 関数適用の実引数を積む場所
– 数字(添字)を使ってアクセスする
●
Controll (制御)
– 次に実行する命令列
– 木構造をしている(コンスセルでできている)
– プログラムカウンタに対応する
●
Dump
– 関数適用や条件分岐の終了時に戻ってくる先を保持
– じつは継続(この話はまたいつか)
SECDマシンの詳細: 命令一覧
●
ロード系命令
– ld, ldc, ldf
●
制御系命令
– ap, rtn, dum, rap
sel, join
●
コンスセル系命令
– cons, car, cdr
●
述語系命令
– eq, atom
●
数値演算・比較系命令
– add, sub, mul, div,
rem, leq
SECDマシンの詳細: 命令 (1)
●
ロード系命令
– ld, ldc, ldf
●
制御系命令
– ap, rtn, dum, rap
sel, join
●
コンスセル系命令
– cons, car, cdr
●
述語系命令
– eq, atom
●
数値演算・比較系命令
– add, sub, mul, div,
rem, leq
環境から
値をロード
定数を
ロード
関数を
ロード
SECDマシンの詳細: 命令 (2)
●
ロード系命令
– ld, ldc, ldf
●
制御系命令
– ap, rtn, dum, rap,
– sel, join
●
コンスセル系命令
– cons, car, cdr
●
述語系命令
– eq, atom
●
数値演算・比較系命令
– add, sub, mul, div,
rem, leq
関数適用
(再帰呼び出し)
関数適用
関数を抜ける
ダミー値を
環境に入れる
条件分岐 条件分岐を
抜ける
SECDマシンの詳細: 命令 (3)
●
ロード系命令
– ld, ldc, ldf
●
制御系命令
– ap, rtn, dum, rap
sel, join
●
コンスセル系命令
– cons, car, cdr
●
述語系命令
– eq, atom
●
数値演算・比較系命令
– add, sub, mul, div,
rem, leq
コンスセル
つくる
car部を取る cdr部を取る
オブジェクト
同値性!
アトムか否か
+, -, *, /,
%, <=
SECDマシンの詳細: 命令
●
ロード系命令
– ld, ldc, ldf
●
制御系命令
– ap, rtn, dum, rap,
sel, join
●
コンスセル系命令
– cons, car, cdr
●
述語系命令
– eq, atom
●
数値演算・比較系命令
– add, sub, mul, div,
rem, leq
これらの命令が
SECDマシンを
理解する上で重要
SECDマシンの詳細: ロード命令
●
ld (load)
– 環境から値をロードする
– 1つの定数を引数に取る
– 環境(Eスタック)のn番目の値をSスタックにpush
●
ldc (load constant)
– 引数の定数をSスタックにpush
●
ldf (load function)
– 引数に機械語コードを取る
– 引数のコードをSスタックにpush
– このとき実行時の環境をコピーしてコードと一緒に
push
●
これがレキシカルな束縛となる
SECDマシンの詳細: 制御命令
●
ap (apply)
– 関数適用するための命令
– やることは3つ
●
現在の実行状態の退避(戻り先の保持)
●
新しい環境を作って引数をpush
– カリー化されているので引数は1つだけであ
る点に注意
●
関数本体に入る準備(環境とコードを変更)
●
rtn (return)
– 関数本体の処理から抜ける命令
– apで退避した実行状態を復元し、
関数適用の次の処理を開始できるようにする
SECDマシンの詳細: 制御命令
●
dum (dummy)
– 環境のトップにダミー値を設定する
– これはrapで書き換えるためのプレースホルダ
– ldfの前(レキシカル環境を作る前)にdumする必要がある
●
rap (recursive apply)
– 再帰的に関数適用するための命令
– (dum)(ldf …) のように作られた関数に対して用いる
– apとの違いは
●
「新しい環境を作って引数をpush」するのではなく
●
「関数のレキシカル環境の先頭(ダミー値)を引数で上書き」する
●
以降の再帰呼び出しでもrapの引数は環境に置かれる
=参照できる
●
rapの引数を関数にするとその関数を無限に呼べる!
SECDマシンの詳細: 制御命令
●
sel (select)
– 条件分岐を行う命令
– コードを2つ引数に取る(true節とfalse節)
– やることは2つ
●
実行状態(EとC)をDにバックアップ
●
Sのトップの値によりCに設定するコードを変える
●
join (join)
– 分岐の後始末をする命令
– selの各節の最後に必ず置く
– Dにバックアップした実行状態(EとC)を元に戻す
SECDマシンの実装
以上の説明を踏まえて
SECDマシンの実装方法を紹介します
長いし疲れてそう
なので質問タイム
SECDマシンの実装: サンプル
●
勉強のため実装を用意してみた
– https://github.com/t-sin/secdm
– Common Lisp製
– 2年前に実装してたPython製のやつあるのでそち
らも参考に
●
python-implementation タグ
SECDマシンの実装: 概要(1)
●
VMの表現を考える
●
VMが扱うデータの種類も考える
●
VMのマシン語の表現を考える
– バイト型の配列?
– Lispのリスト?
●
VMの実行の流れを考える
– プログラムはどこからくる?
– データはどこからくる?
SECDマシンの実装: 概要(2)
●
VMの表現
– S,E,C,Dのフィールドがある構造体
●
VMが扱うデータの種類
– シンボル、整数、コンスセル
●
VMのマシン語の表現
– リストで表現
– 1個の命令もまたリスト(例は後ほど)
– 分岐等はリストのネストで表現
●
VMの実行の流れを考える
– プログラムは基本的にCスタックのトップから
– データはSスタックからか命令の引数
SECDマシンの実装: 入力(1)
●
入力はCommon Lispリーダに任せて
以下のようなS式とする
●
木構造をしている点に注意
; test1
(ldc 42)
(ldc 1)
(cons)
(car)
(ldf ((ldc 100) (ldc 200) (rtn)))
(ap)
(dum)
(ldc "> ")
(print)
(input)
(println)
(stop)
SECDマシンの実装: 入力(2)
●
入力はCommon Lispリーダに任せて
以下のようなS式とする
●
木構造をしている点に注意
; test1
(ldc 42)
(ldc 1)
(cons)
(car)
(ldf ((ldc 100) (ldc 200) (rtn)))
(ap)
(dum)
(ldc "> ")
(print)
(input)
(println)
(stop)
SECDマシンの実装: 入力(3)
●
分岐と再帰をやっているコード例
●
Python版とCL版で入出力命令の有無とかあ
るので注意
;; printlnなどのせいでPython版でだけ動くコード
(dum)
(ldc 0)
(ldf ((ld 0) (cdr) (ldc 10) (eq)
(sel ((ldc "stop counting up.") (println) (join))
((ld 0) (cdr) (println)
(ld 0) (cdr) (ldc 1) (add)
(ld 0) (car)
(cons)
(ld 0) (car) (ap)
(join)))
(rtn)))
(cons)
(ldf ((ld 0) (ld 0) (car) (rap)
(rtn)))
(ap)
(stop)
SECDマシンの実装: VM
●
まずはS,E,C,Dのスタックを格納する構造体を
用意
●
構造体のスロットのデフォルト値はnil (空)
– ここにpush/pop関数で値を出し入れしていく
●
デバッグする用のスロットもいくつか用意
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defstruct (vm (:constructor make-vm*))
(debug-p nil)
(step-p nil)
(running-p t)
s e c d)
SECDマシンの実装: 命令の実行
●
命令をCスタックから1個取って実行
●
命令はシンボルに関数としてセットしておく
設計にした
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defun run-1 (vm)
(when (vm-debug-p vm) ; デバッグ出力
(print-vm vm))
(when (null (vm-c vm)) ; コードがなくなったら抜ける
(return-from run-1 nil))
(let ((op (pop (vm-c vm)))) ; 命令をCスタックから取り出す
(assert (listp op))
(let ((name (car op)) ; 名前と引数を取り出す
(args (cdr op)))
(assert (symbolp name))
(apply name vm args) ; 名前のシンボルに対応する命令を実行
(if (vm-running-p vm)
t
nil))))
ここが本体
SECDマシンの実装: 命令の定義(1)
●
命令をどうやって定義しよう?
●
こんな感じで定義したいな…
– nil: nilをスタックにプッシュする
– ldc: 定数をスタックにプッシュする
(defop nil (vm)
"Load nil to S register."
(push nil (vm-s vm)))
(defop ldc (vm n)
"Load a constant to S register."
(push n (vm-s vm)))
SECDマシンの実装: 命令の定義(2)
●
命令はリスト
●
名前(0番目)と引数(1番目以降)を持つ
– 引数は値(定数)やコード(分岐など)を埋め込むとき用
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defpackage #:secdm.op ; 命令のシンボルだけを入れる名前空間
(:use))
(defpackage #:secdm.symbol ; 命令以外のシンボルを入れる名前空間
(:use #:secdm.op))
;; 命令を定義するためのマクロ
(defmacro defop (name (&rest args) doc &body body)
(let ((fn-name (intern (symbol-name name) :secdm.op)))
`(progn
(defun ,fn-name ,args
,doc ,@body)
(export ',fn-name :secdm.op))))
SECDマシンの実装: 関数(1)
●
関数とはなにか
– 処理本体のマシン語
– 定義位置での束縛(レキシカルな束縛)
●
VMが扱えるデータで、
他のデータと区別が付けばよい
●
ldf (load function)
– 引数に機械語コードを取る
– 引数のコードをSスタックにpush
– このとき実行時の環境をコピーしてコードと一緒に
push
●
これがレキシカルな束縛となる
SECDマシンの実装: 関数(2)
●
関数とはなにか
– 処理本体のマシン語
– 定義位置での束縛(レキシカルな束縛)
●
VMが扱えるデータで、
他のデータと区別が付けばよい
→じゃあリストでいいや!!!!!
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop ldf (vm code)
"Load a function to S register."
(let ((f (list :fn :code code :env (vm-e vm))))
(push f (vm-s vm))))
SECDマシンの実装: 関数(3)
●
関数呼び出しとはなにか
– 実行コンテキスト(Sスタックや環境、コード)の切り替え
●
現在のコンテキスト退避
●
引数を入れる環境の用意
●
Cスタック(プログラム)の切り替え
– 実行が終わったら元のコンテキストに戻す
●
return文的な
●
ap (apply)
– 関数適用するための命令
– やることは3つ
●
現在の実行状態の退避(戻り先の保持)
●
新しい環境を作って引数をpush
– カリー化されているので引数は1つだけである点に注意
●
関数本体に入る準備(環境とコードを変更)
●
rtn (return)
– 関数本体の処理から抜ける命令
– apで退避した実行状態を復元し、
関数適用の次の処理を開始できるようにする
SECDマシンの実装: 関数(4)
●
実行コンテキスト(Sスタックや環境、コード)の切り替え
– 現在のコンテキスト退避(Dスタックに入れる)
– 引数を入れる環境の用意
– Cスタック(プログラム)の切り替え
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop ap (vm)
"Apply a function to a value on top of S register."
(let ((f (pop (vm-s vm)))
(v (pop (vm-s vm))))
(assert (eq (car f) :fn))
(let ((dump (list :s (vm-s vm) :e (vm-e vm) :c (vm-c vm)))
(env (append (list v) (vm-e vm))))
(setf (vm-s vm) nil
(vm-e vm) env
(vm-c vm) (getf (cdr f) :code))
(push dump (vm-d vm)))))
SECDマシンの実装: 関数(5)
– 実行が終わったら元のコンテキストに戻す
●
Dスタックのトップの内容から呼び出し前を復元
●
関数の返り値をSスタックに入れておく
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop rtn (vm)
"Exit from function evaluation and return a value
on the top of S stack."
(let ((v (pop (vm-s vm)))
(dump (pop (vm-d vm))))
(setf (vm-s vm) (append (list v) (getf dump :s))
(vm-e vm) (getf dump :e)
(vm-c vm) (getf dump :c))))
SECDマシンの実装: 再帰する(1)
●
やりかた
– dumを実行して環境にプレースホルダを置く
– 関数を引数に取る関数を定義する(1つめのldf)
– 再帰のスタート用関数を定義する(2つめのldf)
●
本体では、引数にきた関数をrapする
●
こうすると1つめの関数がずっと環境に残る(dumしたところ)
;; https://github.com/t-sin/secdm/blob/master/program/loop.l
(dum)
(ldc 0)
(ldf ((ld 0) (cdr) (ldc 10) (eq)
(sel ((ldc "stop counting up.") (println) (join))
((ld 0) (cdr) (println)
(ld 0) (cdr) (ldc 1) (add)
(ld 0) (car)
(cons)
(ld 0) (car) (ap)
(join)))
(rtn)))
(cons)
(ldf ((ld 0) (ld 0) (car) (rap)
(rtn)))
(ap)
(stop)
SECDマシンの詳細: 再帰する(2)
●
dum (dummy)
– 環境のトップにダミー値を設定する
– これはrapで書き換えるためのプレースホルダ
– ldfの前(レキシカル環境を作る前)にdumする必要がある
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop dum (vm)
"Load a dummy value to current enviroment.
This dummy value :omega will be replaced by `rap` operator."
(push :omega (vm-e vm)))
SECDマシンの詳細: 再帰する(3)
●
rap (recursive apply)
– apとの違いは
●
「新しい環境を作って引数をpush」するのではなく
●
「関数のレキシカル環境の先頭(ダミー値)を引数で上書き」する
●
以降の再帰呼び出しでもrapの引数は環境に置かれる
=参照できる
●
rapの引数を関数にするとその関数を無限に呼べる!
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop rap (vm)
(let ((f (pop (vm-s vm)))
(v (pop (vm-s vm))))
(assert (eq (car f) :fn))
(let ((dump (list :s (vm-s vm)
:e (cdr (vm-e vm)) ; :omegaは除く
:c (vm-c vm)))
(env (getf (cdr f) :env)))
(rplaca env v) ; car部を変更するCLの関数で:omegaを引数に変更
(setf (vm-s vm) nil
(vm-e vm) env
(vm-c vm) (getf (cdr f) :code))
(push dump (vm-d vm)))))
SECDマシンの実装: 分岐する(1)
●
分岐とは
– Sスタックの値により次に実行するコードを切り替えること
– 真と偽のときのコードは命令の引数で指定する
– つまり、以下のsel命令みたいになる
– もちろん、分岐の終了時に元のコンテキストに戻す必要あり
;; https://github.com/t-sin/secdm/blob/master/program/loop.l
(dum)
(ldc 0)
(ldf ((ld 0) (cdr) (ldc 10) (eq)
(sel ((ldc "stop counting up.") (println) (join))
((ld 0) (cdr) (println)
(ld 0) (cdr) (ldc 1) (add)
(ld 0) (car)
(cons)
(ld 0) (car) (ap)
(join)))
(rtn)))
(cons)
(ldf ((ld 0) (ld 0) (car) (rap)
(rtn)))
(ap)
(stop)
SECDマシンの実装: 分岐する(2)
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop sel (vm true false)
(let ((v (pop (vm-s vm)))
(dump (list :s nil :e nil :c (vm-c vm))))
(push dump (vm-d vm))
(setf (vm-c vm) (if v true false))))
●
sel (select)
– 条件分岐を行う命令
– コードを2つ引数に取る(true節とfalse節)
– やることは2つ
●
実行状態(EとC)をDにバックアップ
●
Sのトップの値によりCに設定するコードを変える
SECDマシンの実装: 分岐する(3)
;; https://github.com/t-sin/secdm/blob/master/vm.lisp
(defop join (vm)
"Terminate branching.
True/False causes for `sel` should ends with this operator."
(let ((dump (pop (vm-d vm))))
(setf (vm-c vm) (getf dump :c))))
●
join (join)
– 分岐の後始末をする命令
– selの各節の最後に必ず置く
– Dにバックアップした実行状態(EとC)を元に戻す
まとめ
これを読めば今日の発表完全理解!
まとめ
●
SECDマシンはラムダ計算を実行する抽象機械
– Stack・Environment・Controll・Dump!
●
Peter HendersonがLispKit Lispを実装す
る際に具体化した
●
レキシカルスコープと1引数の関数をもつ
●
再帰もできるよ!
今後の話
●
実際に純LispをSECDマシン語にコンパイル
してみる話
– 準備中(コンパイラ実装中)
●
SECDのDが継続である話
– Dump用命令dump/restoreを実装し制御フロー
の実現?
●
副作用や並列化を実現する話?
– Peter Henderson本の目次にある
参考文献
●
[1] SECDマシンとLispあれこれ - Arantium
Maestum
– https://zehnpaard.hatenablog.com/entry/
2018/12/23/075158
●
[2] SECD machine – Wikipedia
– https://en.wikipedia.org/wiki/SECD_machi
ne
●
[3] Peter Landin, The Mechanical
Evaluation of Expression
●
[4] Miloˇs Radovanovi, Mirjana Ivanovi, An
Implementation of LispKit Lisp in Java

More Related Content

What's hot

ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
MITSUNARI Shigeo
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
Akihiko Horiuchi
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
Nobuyuki Matsui
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
Rui Watanabe
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
 
M5StackをRustで動かす
M5StackをRustで動かすM5StackをRustで動かす
M5StackをRustで動かす
Kenta IDA
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
多段階計算の型システムの基礎
多段階計算の型システムの基礎多段階計算の型システムの基礎
多段階計算の型システムの基礎
T. Suwa
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
shigeki_ohtsu
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
豊明 尾古
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
Fixstars Corporation
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろKazuma Mikami
 

What's hot (20)

ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
 
高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと高速な暗号実装のためにしてきたこと
高速な暗号実装のためにしてきたこと
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
M5StackをRustで動かす
M5StackをRustで動かすM5StackをRustで動かす
M5StackをRustで動かす
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
多段階計算の型システムの基礎
多段階計算の型システムの基礎多段階計算の型システムの基礎
多段階計算の型システムの基礎
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
Ormとの付き合い方
Ormとの付き合い方Ormとの付き合い方
Ormとの付き合い方
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
 

Similar to SECDマシン 実装と動きとその他もろもろについて

続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
t-sin
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
Etsuji Nomura
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
Takeshi Takaishi
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
Takefumi MIYOSHI
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
Shigeru UCHIYAMA
 
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
Naoto MATSUMOTO
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングKiwamu Okabe
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
ssuser8b389c
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
Shin-ya Koga
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料
Koichiro Sasaki
 
20210515 cae linux_install_vb
20210515 cae linux_install_vb20210515 cae linux_install_vb
20210515 cae linux_install_vb
YohichiShiina
 
181106 02
181106 02181106 02
181106 02
openrtm
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングComputational Materials Science Initiative
 
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェアEmacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Masaharu IWAI
 
osoljp 2011.08
osoljp 2011.08osoljp 2011.08
osoljp 2011.08
@ otsuka752
 
Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
Masami Hiramatsu
 
about dakota6.7 gui
about dakota6.7 guiabout dakota6.7 gui
about dakota6.7 gui
Etsuji Nomura
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
ssuser3a4b8c
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
Ryuji TAKEHARA
 

Similar to SECDマシン 実装と動きとその他もろもろについて (20)

続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
 
about DakotagUI
about DakotagUIabout DakotagUI
about DakotagUI
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング8 並列計算に向けた pcセッティング
8 並列計算に向けた pcセッティング
 
Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)Synthesijer.Scala (PROSYM 2015)
Synthesijer.Scala (PROSYM 2015)
 
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
名古屋Ruby会議01 A3.製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
 
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
高速ネットワーク最新動向と具体例 (ENOG58 Meeting)
 
HaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミングHaskellではじめるCortex-M3組込みプログラミング
HaskellではじめるCortex-M3組込みプログラミング
 
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptxTypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
TypeScriptで書くLambdaをCDKでいい感じに管理する.pptx
 
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
2014年の社内新人教育テキスト #2(関数型言語からオブジェクト指向言語へ)
 
SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料SQL Server 2016 R Services + Microsoft R Server 技術資料
SQL Server 2016 R Services + Microsoft R Server 技術資料
 
20210515 cae linux_install_vb
20210515 cae linux_install_vb20210515 cae linux_install_vb
20210515 cae linux_install_vb
 
181106 02
181106 02181106 02
181106 02
 
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティングCMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
CMSI計算科学技術特論B(14) OpenACC・CUDAによるGPUコンピューティング
 
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェアEmacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
Emacsでの翻訳 - Emacsで訳す、gettextで国際化されたソフトウェア
 
osoljp 2011.08
osoljp 2011.08osoljp 2011.08
osoljp 2011.08
 
Mincs 日本語版
Mincs 日本語版Mincs 日本語版
Mincs 日本語版
 
about dakota6.7 gui
about dakota6.7 guiabout dakota6.7 gui
about dakota6.7 gui
 
C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml C base design methodology with s dx and xilinx ml
C base design methodology with s dx and xilinx ml
 
Smart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless DesignSmart Tennis Lesson Serverless Design
Smart Tennis Lesson Serverless Design
 

More from t-sin

Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったCommon Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
t-sin
 
Common Lispっぽいものをつくっています
Common LispっぽいものをつくっていますCommon Lispっぽいものをつくっています
Common Lispっぽいものをつくっています
t-sin
 
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
t-sin
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
t-sin
 
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)
t-sin
 
バッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使うバッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使う
t-sin
 
Common lispでグラフィックアート
Common lispでグラフィックアートCommon lispでグラフィックアート
Common lispでグラフィックアート
t-sin
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
t-sin
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-
t-sin
 

More from t-sin (9)

Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくったCommon Lisp製のテキストエディタLemにフレーム多重化機能をつくった
Common Lisp製のテキストエディタLemにフレーム多重化機能をつくった
 
Common Lispっぽいものをつくっています
Common LispっぽいものをつくっていますCommon Lispっぽいものをつくっています
Common Lispっぽいものをつくっています
 
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミングSounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
Sounds Like Common Lisp - ゼロからはじめるサウンドプログラミング
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
 
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)
 
バッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使うバッテリー強奪! PythonをCommon Lispから使う
バッテリー強奪! PythonをCommon Lispから使う
 
Common lispでグラフィックアート
Common lispでグラフィックアートCommon lispでグラフィックアート
Common lispでグラフィックアート
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-
 

SECDマシン 実装と動きとその他もろもろについて