ひとり勉強会

ひとり楽しく勉強会

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

RealLib ソースコード勉強会 (1:終)

XR

RealLibの実装がどういう原理になってるのか解明しようシリーズです。シリーズといいながら、読み始めてみたらかなりシンプルだったので1回で終わらせちゃいます! 実数オブジェクトの構造 // Real.h class Real { private: RealObject *m_pObject; ... }; …

RealLib ではじめる誤差ゼロ実数計算

XR

RealLib のソースコード読みを始めるはずだったんですが、なんだか全然進んでないので適当なまとめエントリでお茶を濁します! RealLib が普通にかっこよすぎるので紹介しまくりたくなりましたので紹介記事です。 実数計算と誤差 たいていのプログラミング言…

次回予告

おひさしぶりです!次から「Exact Real Arithmetic (完全精度実数計算?定番の訳語ってなんだろう?)」のお勉強をはじめます。 The RealLib Project のコードを読みつつ A Calculator for Exact Real Number Computation を読みつつ、という形になる予定で…

レジスタマシンとスタックマシン

LUA

こちらで見かけた話題・・・ http://natu.txt-nifty.com/natsutan/2008/06/vm_e3c7.html http://shinh.skr.jp/m/?date=20080624#p01 Lua の VM は 4.0 でのスタックマシンから 5.0 でレジスタマシンに変更されたらしく、その時の理由が Lua: papers の "The …

LuLu 0.05 Released!

LUA

http://lulu.luaforge.net/index.ja.htmlリリースしました!よろしくお願いします!もっとソースを綺麗に整頓してからluaforgeに上げようと思っていたんですが・・・なんだか飽きちゃって(^^;)、すっごい中途半端です。ごめんなさい。でも、このままずるずる…

LuaForge

LuaForgeにプロジェクトページでも作ってみるか!といきおいでアカウント作っちゃいました。でもプロジェクト申請する度胸が出ないよ困った!

おまけ:LuLu (4)

LUA

今日の成果:http://hzkr.kokage.cc/lulu4.zip コルーチンと getfenv/setfenv 実装しました。あと、今回はインチキして loadfile 関数でホストのLuaにコンパイル処理をやってもらうことにしたので、luac の出力ではなく、直接 .lua のソースも実行できるよう…

環境

LUA

ここまでグローバル変数の扱いすっごく適当に見てたんですけど、 Foo = {x = 100} (function () setfenv(1, Foo) y = 2 z = x + y end)() print(Foo.x) -- 100 print(Foo.y) -- 2 print(Foo.z) -- 102 setfenv/getfenvというので、グローバル変数の参照する…

コルーチン

LUA

Luaには「coroutine(コルーチン)」という機能があって、Lua 5.0のVMのデザインもこれを楽に実装するために採用された面もあるらしいので、VMを学ぶにあたって重要なポイントです。こんな機能。 function countUp() local n = 0 while true do coroutine.yi…

Luaソースコード勉強会 (4)

LUA

今回は、割と言語のコアな部分だけれど(VMじゃなくて)ライブラリ実装になってる部分を拾っておきます。

Yueliang

Yueliang - Lua 5 in Lua てのを知りました。Lua 5 in Lua って、うわーネタかぶってるってレベルじゃねーぞ!と思ったけど、こちらは今のところフロントエンド (ソーステキストをVMのコードにコンパイルするまで)の実装のようでした。LuLu と組み合わせら…

おまけ:LuLu (3)

LUA

今日の成果 → http://hzkr.kokage.cc/lulu3.zip ちょっとソースコードが酷いですごめんなさい。CALLのコードが3カ所くらいにコピペされてます。あとでちゃんとリファクタリングする。。。 今回読んだ全命令を実装(ただし、メタテーブルの処理は除く)して…

VM命令:まとめ

LUA

Lua 5.1 の VM の全命令を分類すると、こうなります。 変数/定数コピー MOVE, LOADK, LOADNIL グローバル GETGLOBAL, SETGLOBAL 関数呼び出し CALL, TAILCALL, RETURN 演算子 ADD, SUB, MUL, DIV, MOD, POW, UNM, NOT, LEN, CONCAT, GETTABLE, SETTABLE ジャ…

VM命令:可変長引数

LUA

前回可変長の扱いをサボったので今回ちゃんと読むことにしました。 まず、可変長引数の関数が呼び出されたときは、luaD_precall内でその「調整」が行われます。 else { /* vararg function */ int nargs = cast_int(L->top - func) - 1; base = adjust_varar…

VM命令:クロージャ

LUA

お待ちかね?のクロージャの実装です。こんなサンプル行ってみましょう。 function counter() local x = 0 local up = function() x=x+1 return x end local dn = function() x=x-1 return x end return up, dn end up,dn = counter() print(up()) -- 1 prin…

VM命令:ループ

LUA

while文やrepeat文は特別なことは何もなく、条件分岐を使って実現されてます。問題はfor文で、これには専用命令が用意されています。まずは数値に関するループから。 for i=1,100 do print(i) end これは、ループの頭にFORPREP命令と、実際にループを司るFOR…

VM命令:ジャンプ

LUA

LuaVMには純粋なジャンプ命令は1つしかありません。相対距離をオペランドにとって、pcを変化させる無条件ジャンプです。 case OP_JMP: { dojump(L, pc, GETARG_sBx(i)); continue; } dojumpマクロの定義はこうで #define dojump(L,pc,i) {(pc) += (i); luai…

VM命令:演算子

LUA

Luaの演算子に一対一に対応した命令がそれぞれ用意されています。OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_POW, OP_UNM, OP_NOT, OP_LEN, OP_CONCAT, OP_GETTABLE, OP_SETTABLE。例として、OP_ADDの実装はこんなんです。 case OP_ADD: { arith_op(luai_n…

Luaソースコード勉強会 (3)

LUA

今回の目標は、Lua VMの命令セット完全制覇!です。

次回予告

コンパイル。 > luac -o lulu.out lulu.lua > luac -o test1.out test1.lua > cat test1.lua function foo(a,b,c,d) print(a,b,c,d) end function bar(a,b) return b,a end foo(1,2,bar(3,4))Lua! > timeit lua test1.out 1 2 4 3 ... Elapsed Time: 0:00:00…

おまけ:LuLu (2)

LUA

というわけで、Lua VM on Lua 略して LuLu を実装するシリーズ第2回です。今日やったことの把握ということで、これ function foo(a,b,c,d) print(a,b,c,d) end function bar(a,b) return b,a end foo(1,2,bar(3,4)) を動かすことを目標にします。

luaV_execute

LUA

VMの構成はわかったのであとは各命令の実装を見るのみ!!!メインループのluaV_execute関数は、細かいところを除くと非常に素直なループです。例によって、ANSI C 互換にするためにスレッデッドコードのような最適化はしていません、とのことでした。 void …

命令フォーマット

LUA

スタックの構造の次は、Luaの仮想マシン語の命令の構造を見ていきます。命令を表す型 Instruction // llimits.h typedef lu_int32 Instruction; は、32bit整数で、命令毎に、bitの使い方は3通りあります。 ABC型 B:9bit, C:9bit, A:8bit, OpCode:6bit ABx型 …

データスタックの構造

LUA

まず、LuaのVMのスタックがどのように使われるかを調べます。前回ちょっと触れたように、LuaのVMは「レジスタマシン」といえども、スタックと別に特別な「レジスタ」があるわけではありません。ローカル変数や全てスタックに保存されて管理されます。いや、…

Luaソースコード勉強会 (2)

LUA

今回は Lua VM のメインループの実装を見ていこうと思います。思いました。まず最初に、Lua VMスタックの構造を把握してから・・・と思って始めたら長くなってしまったので、適当なところで次回に回します。^^そういえば A No-Frills Introduction to Lua 5.…

とくになし

雑談タグを挟まないとサイドバーの最新タイトルのとこで区切りがわかりにくいなーと思って昔[雑談]を挟むことにしてたのを今思い出しました。といっても特に書くこともないですね。どうしましょう。えーとえーと、http://b.hatena.ne.jp/hzkr/ はてなブック…

おまけ:LuLu (1)

LUA

読んだコードの確認として、"LuaVM on Lua" 略して "LuLu" を作ってみようと思います。Luaの字句解析や構文解析から入るのは大変そうなので、まずは、プリコンパイル済みのコードを読み込んで実行するVMを作ります。読み込み分は、lundump.c/lundump.h の lu…

起動の流れ

LUA

〜mainからluaV_executeまで〜ということで、次に、luaインタプリタの起動から、VMのメインループにたどりつくまでの流れを読みます。Luaはアプリケーションへの組み込みを考えてしっかり内部もAPI化されているので、始めて読む身には逆に中身が入り組んでい…

データ構造

LUA

値を表すデータ構造 // lua.h #define LUA_TNIL 0 #define LUA_TBOOLEAN 1 #define LUA_TLIGHTUSERDATA 2 #define LUA_TNUMBER 3 #define LUA_TSTRING 4 #define LUA_TTABLE 5 #define LUA_TFUNCTION 6 #define LUA_TUSERDATA 7 #define LUA_TTHREAD 8 // lo…

Luaソースコード勉強会 (1)

LUA

今日は、LuaのVMに使われてるデータ構造をさささっと眺めてみます。 あと、mainからはじまってVMのメインループに到達するまでの流れを確認しちゃいます。