メモリ領域に実行権限をつける(Linux x86)

JITコンパイラ実装のために、メモリに機械語を展開して実行させる。 メモリに機械語を配置するだけではなく、OSの機能を使って実行権限をつける必要がある。 Linuxでは、mprotectというシステムコールを使う。 C言語からmprotectを使うには、sys/mman.hをinc…

カーソルキーが使えなくなったのでXmodmapでなんとかする。

キーボードのカーソルキーが断線により動かなくなったので、Xmodmapを使って スペースキーの横あたりにあるいらないキー+hjklで補おうとした。 hjklと同時に押してみて一番良かったのが変換キーなので、こいつに犠牲になってもらう。 keycode 100 = Mode_swi…

Schemeのequal?の実装について調べたメモ

R7RSでは、equal?に循環オブジェクトを入力した場合でも必ず終了することが要求されていて、その実装方針について調べていた。 探している答えそのものな内容の論文が見つかった。 “Efficient Nondestructive Equality Checking for Trees and Graphs"という…

ELFヘッダのe_identについて調べました。

ELFはメジャーなオブジェクトファイルのフォーマット。 今回は、そのELFファイルの最初の16バイトであるe_identについて調べる。 e_identは、ELFヘッダの一部なので、readelf -hで確認することができる。 $readelf -h a.out 0 < 02:49:50 ELF ヘッダ: マジッ…

pycのマジックナンバーについて調べました。

Pythonのバイトコードのpycの最初の4バイトにはマジックナンバーがあって、どのバージョンで作成されたのか分かるようになっている。 各バージョンのマジックナンバーはLib/importlib/_bootstrap_external.pyを見れば分かる。 マジックナンバーは、各バージ…

glutで画像を表示したぞ。

ppm形式(raw)の画像を用意して、それをglutで表示する。 座標とかはやってない。 高さx幅xRGBのサイズのarrayを用意して、画像を読み込み、glDrawPixelsを実行するだけ。 コンパイル方法。(オプションが多いね。) gcc a.c -lglut -lGL コード #include<GL/glut.h> #incl</gl/glut.h>…

syntax-rulesの同じ深さの<ellipsis>

同じ深さので、違う場所で宣言された場合どうなるのか確認した。 多くの処理系では、短いほうが優先される。 (define-syntax foo (syntax-rules () ((_ ((a ...) ...) (( b ... ) ... )) (quote ( ((a b) ...) ... ))))) (display (foo ((a b)(c d e)) ((A B…

Schemeでライブラリを定義するぞ

Schemeのr7rsにはライブラリを定義する構文がある。 例↓ (define-library (niyarin test) (import (scheme base)) (export foo1 foo2) (begin (define (foo1 a) (+ a 1 )) (define (foo2 a) (- a 1)))) Schemeのライブラリ名は、ライブラリを一意に判別する…

dynamic-wind。

dynamic-windについてまとめた。 dynamic-windのつかいかた (dynamic-wind before thunk after) 引数はすべてthunk(引数0の手続き)。 before、thunk、afterの順に実行する。 ただし、真ん中のthunkで継続を取り出して外側から呼び出した場合や中から外側の継…

raiseとraise-continuableとwith-exception-handler。

Scheme(R7RS)の例外の発生とハンドラについてまとめた。 with-exception-handerで例外ハンドラを登録し、raise、raise-continuableで例外を発生させる。 raiseとraise-continuableの違いは、handlerを呼び出した後での処理に違いがある。 with-exception-han…

SRFI1 Constructorsを眺めたぞ。

srfi1のリストを生成するやつら。 以下は、てきとーにドキュメント眺めてまとめたもの。 cons,list,make-list,list-copyらはr7rsに含まれているので無視する。 xcons 第二引数をcar部に、第一引数をcdr部にconsセルを生成する。 例 (xcons 1 2) ;(2 . 1) con…

Whitespaceを使ったぞ。

Whitespaceは、esolangの一つで、[space]、[tab]、改行だけでスタックマシン的な命令を表現する言語。 チュートリアル。 これが割とあっさりしてるので、動作確認用に書いたコードをメモとして貼ることにする。 [space]はS、[tab]はT、改行はLとして表記する…

GraphVizを使ったぞ。

GraphVizは、dot言語でグラフを記述してpdfやpngとかで出力できる。 GraphViz for discrete math studentsというページでdotのサンプルを確認した。 僕の場合、重み付き有向グラフの描画をできれば良いのでこれだけでよかった。 <雑なdotサンプル> digraph {…

雑に型推論するものを書いたぞ。

方程式を導出してそれを解くということをしただけ。 サポートする構文、組み込み関数 構文 ifとfunとlambda(1つ以上の引数関数の糖衣構文として) (if bool a a) (fun x body) (lambda (x1 x2 ... ) body) 組み込み関数 succ + zero? の3つだけ。 例 関数適用…

gentooの/etc/portage/distfilesをきれいにするぞ

ecleanを使う。 標準では入っていないので、gentoolkitを入れる必要がある。 dオプションをつけると、現在のバージョン以外が消える。(man曰く、only keep the minimum for a reinstallation) 日付やサイズ等のオプションもつけられるが、再ダウンロードすれ…

scheme処理系を実装中です。

Kobe University Advent Calendar 2016の22日目の記事です。 そして私はB3のniyarinです。 本編に関係ないネタ 本編が少し雑なので、xmas treeを出力するスクリプトをてきとーにschemeで書きました (define decorate #f) (let ((pos-seed 1) (shape-seed 1))…

syntax-rulesの仕様を読んで確認した

r7rsのsyntax-rulesのパターンの部分の仕様を読んで確認する。(vectorは省く) とる形は、以下の4つ(Pはパターンで、[ellipsis]は、0個以上の繰り返し) 1. (P1 ... Pn ) 2. (P1 ... Pn . Pn+1) 3. (P1 ... Pk Pe [ellipsis] Pm+1 ... Pn) 4. (P1 ... Pk Pe [e…

ウサギとカメ(循環リスト)

連結リストで循環しているかどうか、どこで循環が始まっているのかを検出する。 正式には、Floyd's cycle-finding algorithmと呼ぶらしい。 証明は省くが、だいたい↓のような手順 循環判定 ・セルを2つづつ移動するのをウサギ、1つづつ移動するのをカメとし…

schemeのパラメータオブジェクトの使い方を調べた。

r7rsでは標準。 パラメータオブジェクトは、値を束縛して動的存続期間中にその値を変更できるオブジェクト。 make-parameterで、パラメータオブジェクトを作れる。 (define foo (make-parameter 123)) (foo);123 パラメータオブジェクトに値を渡した時の挙動…

python-mechanizeでログインするぞ。

mechanizeは、スクレイピングとか用のweb操作ライブラリ。 標準ではないのでpip等でinstall。 で、ためしにログイン画面をつくってmechanizeでアクセスする。 ログイン画面はこんなかんじ。 index.html <html> <head> </head> <body> <form name="LOGIN" action="/cgi-bin/form_test.py"> USERNAME <input type="text" name="USERNAME"></input><br> PASSWORD <input type="text" name="PASSWORD">

schemeのdatum label

datum labelを使うとschemeの循環構造を表記できる。 (define x (list 1 2 3 )) (set-cdr! (cddr x) x) ;#0=(1 2 3 . #0#) (define y (list 4 x 6)) (set-cdr! (cddr y) y) ;#0=(4 #1=(1 2 3 . #1#) 6 . #0#) (define z (quote #0=(1 2 . #0#))) ;#0=(1 2 . …

openboxにターミナル起動キーバインドを追加しました。

ctrl+alt+tでターミナルエミュレータを起動するようにする。 ~/.config/openbox/rc.xmlにキーバインド関係の設定がある。 <keybord>内に以下のような感じで書き加える。 こちらの環境では、lilytermを使っている。 <keybind key="C-A-t"> <action name="Execute"> <command>lilyterm</command> </action> </keybind> 修飾キーの略語は、 C:Control A:Alt S</keybord>…

gentooにtint2をいれました。

openboxのお供にする。 インストール ランチャー機能がある0.12以上を入れる。 emerge --ask xdotool emerge --ask "=x11-misc/tint2-0.12.3" コンフィグを修正 ~/.config/tint2/tint2rcを編集する。 初期状態では、そんざいしないアプリケーションへのリン…

schemeのcaseについて

キーと各データをどう比較しているのか気になったので調べた。 r5rsによるとeqv?で比較しているそうだ。(4.2.1) というわけで、 ・symbol、char、symbol、空リストは見た目が同じならよい。 ・数値は、正確数同士か不正確同士で数値的に等しければよい。 ・…

3impの3章を読みました。

3impの3章は、schemeのheap型VMとそのコンパイラの実装について書かれている。 コードを見てだいたい分かったので文のほうはさらっとしか読んでないけど。 ・vm用コードもs式 ・レジスタは、a,x,e,r,sの5つで、それぞれ(アキュムレータ(返り値とか次のコード…

lispの自作VMへのコンパイラ。

この記事はKobeUniv Advent Calendar 2015の20日めの記事です。 今回は、僕が書いているlisp処理系をどう実装したかについて書こうと思います。 完成が間に合わなかったので、できたら後日公開します。 実装したこと、してないこと 搭載機能 vm(スタックマシ…