2017-01-01から1年間の記事一覧

メモリ領域に実行権限をつける(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) 日付やサイズ等のオプションもつけられるが、再ダウンロードすれ…