2022/04/04
実装したもの
https://github.com/kgtkr/wjit
$ cat ./sample.wjit
func main() {
var x = fib(10) in
println(x);
func_a(10);
println(is_prime(3));
println(is_prime(4));
println(is_prime(5));
println(is_prime(6));
}
func fib(n) {
if (n < 2) {
n;
} else {
fib(n - 1) + fib(n - 2);
};
}
func func_a(x) {
println(x);
if (x <= 0) {
x;
} else {
func_b(x - 1);
};
}
func func_b(x) {
println(x);
2021/11/06
実装したもの
シンタックスハイライト、エラー報告、補完、フォーマットができるProcessingのLanguage ServerとVSCodeの拡張機能を実装しました。
リポジトリ
https://github.com/kgtkr/processing-language-serverhttps://github.com/kgtkr/processing-language-server-vscode
インストール
以下のリンクからインストールしてProcessing(現在4のbeta1とbeta2にしか対応していません)のパスを設定すれば使えます。設定した後に再起動すると自動でLanguage Serverがダウンロードされます。そのあともう一回くらい再起動が必要かもしれません(ここらへんは動作が不安定なので改善が必要ですね)。
https://marketplace.visualstudio.com/items?itemName=kgtkr.processing-language-server-vscode
作った動機
弊学科の授業で
2021/09/22
プログラミング言語の基礎概念を読んで実装したのでメモ。OCaml実装。間違っているところがあったら指摘して下さると助かります。
作ったもの
コードを入力すると型推論結果を返すプログラムです。型チェック失敗時のエラーメッセージは未実装です。
例
関数合成する compose 関数を例にします。
let compose = fun f -> fun g -> fun x -> f (g x) in compose
↓
(let {3: {'2,'3,'4}(('3 -> '4) -> (('2 -> '3) -> ('2 -> '4)))} = (fun {0: {}('3 -> '4)} -> (fun {1: {}('2 -> '3)} -> (fun {2: {}'2} -> ({0}: ('3 -> '4) ({1}: ('2 -> '3) {2}: '2): '3): '4): ('2 -> '4)): (('2 -> '3) -> ('2 -> '4))): (('3 -> '4) -> (('2 -> '3) -> ('2 -
2018/12/02
はじめに
Haskellでwasmにコンパイルする言語を実装してみたので記事にしました。
LLVMなどには依存せず直接wasmを出力します。
また、現段階ではエラー処理などは未完成なので間違ったコードを入力するとコンパイラがクラッシュするか不正なwasmを出力するかその他色々おかしな事が起きたりします。
メモリアロケータはこの記事で実装したものを使っています。
GCは実装は一応終わっているのですが(記事)まだコンパイラ側の対応が終わっていません。
このようにまだかなりひどい状態ですが少しずつ改善していけたらなと思っています。
リポジトリ
https://github.com/kgtkr/cl8w
サンプルソース
先にサンプルを見たほうがイメージしやすいと思うので置いておきます。
まず実行の為のJSのソースです。
main.wasmはコンパイル結果、./memory/memory.wasmはメモリアロケータです。
数値のprintも欲しいのでprint関数をimportしています。
エントリポイントはmain.wasmのmain関数とな
2018/12/01
初めに
この記事でメモリアロケータを実装したので今回はGCを実装してみます。
様々な事情でアロケータのコードが少し変わっているのでソースはここを見て下さい。
大きな変更点はfreeの返り値でfreeしたブロックのポインタを取得出来るようになった事くらいです(ブロックが消失した時は0が返ります)。
今回もwatでとりあえず動く物を作る事を目標に実装していきます。
方針
参照カウントとmark and sweepを組み合わせたような実装をします。
ローカル変数などからの参照のみを参照カウントで管理し(これはコンパイラがinc_countとdec_countを呼び出すコードを挿入する必要がある)、参照カウントが0でないブロックをルートセットとして扱いmark and sweepします。
ブロックには2種類あり「データブロック」と「参照ブロック」です。
これはmark and sweepで使用し、データブロックの場合はbodyをただのバイト列として扱うのでmark and sweepの再帰的なマークには影響しません。参照ブロックの場合はbodyを全
2018/12/01
初めに
WebAssemblyには線形メモリがあるだけで動的なメモリ管理機能はありません。
ライブラリを使うことも出来ますが、今回はmallocとfreeを実際に実装してみます。
方針
パフォーマンスは気にしない。とにかく動くものを作るwasmのテキストフォーマットであるwatで実装する
仕様
mallocを呼び出すとメモリブロックが作られます。
メモリブロックにはヘッダ部とボディ部があり、mallocはボディ部の先頭アドレスを返します。
このボディ部の先頭アドレスをブロックのポインタとします。
メモリアドレスは0から始まり、ボディの前にヘッダが入ることからブロックのポインタが0になることはないことがわかるかと思います。
ブロックの間には隙間がなく、またmallocは要求サイズ以上確保するのではなくぴったり要求サイズ確保するものとします。
ヘッダのメモリ配置
サイズ 名前 説明1 flag 終端ブロック:0、未使用:1、使用中:2
4 size ボディのサイズ
4 prev 前ブロックのポインタ。先頭ブロックなら0
終端ブロックはこ