Ruby

RISC-Vを目指す(6)

やってみたいことが無いわけではないのだけども、なかなか具体的なやり方がイメージできないので、とりあえずRV32Iの命令を一気に実装してしまおう。と言ってもCSR系の制御命令は今のところサッパリわからないので保留。なので残りの命令はlui、auipc、条件…

RISC-Vを目指す(5)

ぼっちの引きこもりはお正月ヒマなので。っていうか年末に大阪行く予定だったのが食あたりでダウンしていたのでそのままって感じ。 ともあれ、今回は今までに作ったロード/ストア系命令を揃えることにしてみる。ちなみに前回のlb命令は符号拡張するべきだっ…

RISC-Vを目指す(4)

新年明けましておめでとうございます。 さて、去年に引き続きRISC-Vの命令セットを実装してみる試練。前回でっちあげたRAMは書き込みしかできなかったので、lb命令を実装してRAMからの読み込みを作ってみよう。書き込みができたのだから読み込みも簡単かと思…

RISC-Vを目指す(3)

いまのところ、プログラムは回路埋め込み状態つまりマイクロコードとなっているわけだが、いずれRAMに書き込んでそれを読んで実行できるようにしたい。とは言えそれができるようになるにはまだまだ先が長いので、とりあえずはRAMを外部に作って値を書き込む…

RISC-Vを目指す(2)

RISC-V命令セットにしてみたらハンドアセンブルで命令を並べるのが大変になってしまったので、非常に雑にアセンブラを作ってみた。これもずっと前に作ったx86アセンブラを持ってきて書き直したものである。RISC-Vアセンブラ · GitHub このような感じにシミュ…

RISC-Vを目指す

なんとも久しぶりの更新なわけだが、今度のネタは2年半ほど前にやってたCPU作成の続きとなる。前回はオレオレアーキテクチャの4bitCPUだった。今回はそれの32bitへの拡張と、命令セットをRISC-VのRV32Iとして、まともなCPUを作ってみようという企画となる。 …

WebAssemblyチャレンジ2

とりあえず作ってみた。 WebAssemblyのバイナリフォーマットを見ながらそのまま書いただけなのでさほど難しくない。 LEB128 ちょっと変わっているのはwasm内での値の表現がLEB128というエンコーディングで表現されているところ。これは可変長整数の表現方法…

WebAssemblyチャレンジ

まだ何かができるという状態ではないのだが。 WebAssemblyとは Apple、Microsoft、Google、Mozillaが力を合わせて開発しているブラウザ用のバイナリフォーマットで、フォーマットっていうか、VMの命令セットと挙動の定義みたいな。バイナリフォーマットはwas…

NanoGLを試す

この記事はRuby Game Developing Advent Calendar 2016 - Adventar の20日目です。昨日は空いてました。 NanoGL NanoGLをGoogleさんに問い合わせるとWebGLラッパーが出てくるが、ここで言うNanoGLはそれではなく、nanovgを描画のベースにしたマルチプラット…

アクティベーションコンテキストについて

RubyでFiddleを使ってWindowsAPIを叩けばWindowsアプリを作ることが、まあ、できるというのは検索するとたくさん出てくるのでわりとメジャーな話。しかし普通に作るとボタンなどの見た目がクラシックになってしまう。こんな感じ。 Windows7なら7的な見た目に…

Rubyの標準添付ライブラリFiddleでゲームプログラミングする

この記事はRuby Game Developing Advent Calendar 2016 - Adventar の12日目です。11日目は土屋つかささんのrubyゲーム開発にユニットテスト/テスティングフレームワークを導入する(2)【実践編】 - 土屋つかさの技術ブログは今か無しかでした。Ruby...ゲ…

連鎖性言語を作る11

原因がまったく想像できない難解なバグに遭遇した場合、怪しいところから調べるのではなく、当たり前に大丈夫なはずのところから本当に大丈夫であることを確定していくほうが結果的に速く原因に辿り着けることがある。急がば回れという話だが、真剣におかし…

連鎖性言語を作る10

オレ言語のコードをRubyコードに変換してevalすれば、VMで実行するのと比べてディスパッチが無くなって速くなる。毎回evalするとRubyのコンパイルが発生してオーバーヘッドがあるので、evalでProcを生成して、実行時はそれを呼ぶだけ、という形にしておくの…

連鎖性言語を作る9

VMの命令列にコンパイルして実行するようになったのでなんとなくVMっぽい気がする感じになったところで、命令が2個しかないのは物足りない。これを増やすことを考えてみよう。オレ言語はスタック指向であり、スタックマシンのVMとは相性がよい。相性がよいと…

連鎖性言語を作る8

オレ言語の実装として、Rubyの配列にオブジェクトを詰めたものをASTとして扱っているのは特徴的だ。実際コード自身がオブジェクトを並べたような見た目をしているのでこれはこれで直感的とも言える。ところでVMはそのASTを解釈して実行しているわけなので、…

連鎖性言語を作る7

スタックエフェクトはForthではコメントだがFactorではコンパイル時にチェックされる記述になっている。コンパイルはワードの定義時ではなく実行時にされる。らしい。 例えば、 : aaa ( x -- x ) drop ;などと定義すると、これを呼び出すときに「effect-erro…

連鎖性言語を作る6

リテインスタックを作ろう。これは通常のデータスタックとは別のスタックで、一時保存用のものとなる。作るのは非常に簡単で、VMにインスタンス変数を追加して、データスタックとのやりとりをする>r、r>を追加する。 @retain_stack = [] :">r" => ->{@retain…

連鎖性言語を作る5

ループで悩んでいたのだが、とりあえずなるべく簡単に実装するということで、こんな感じにした。 :loop => ->{quot=@stack.pop;loop{self.run(quot);if @break_flg then @break_flg=false;break;end}}, :break => ->{@break_flg=true}, VMはこんな感じ。 def…

連鎖性言語を作る4

色々と調べていたらRubyでForthを作った人のブログ(Forthを作るのじゃ | TECHSCORE BLOG)があった。この記事では作っているのがForthなのでQuotationは無く、シンプルな作りによりParserも無いため、コロン定義は例のコンパイルモード/実行モード切り替え方…

連鎖性言語を作る3

現在のオレ言語の実装にはひとつ問題点がある。それは、数字のリテラルをRubyのオブジェクトに変換して保持し、計算はRubyのメソッドを呼んでいるところだ。それにより挙動がRubyの仕様に引きずられる。これは文字列についても同様であり、Rubyの文字列には+…

連鎖性言語を作る2

連鎖性言語というのは英語でConcatenative Languageと言って、要するに連結、繋げて書く言語のことである。ま、左から右に繋がっているので。対比される言葉は適用型言語(Applicative Language)。CとかRuby、関数型言語など、だいたいほとんどの言語は適用型…

連鎖性言語を作る

スタック指向言語、とか、連鎖性言語、などと呼ばれる言語がある。有名どころではForthやPostScriptあたりで、かなり古くから存在していて、最近ではFactorといった関数オブジェクトを扱える実用的なものまである。 基本的なコードの例としては、 1 2 + prin…

コンポーネント指向

前からぼんやりと考えてはいたのだが、なんとなくこんな感じ?ってイメージがなんとなくできてきたような気がしたのでなんとなく作ってみた、という話。 コンポーネント指向というとオブジェクト指向とかそんな感じの雰囲気に思えるが、実際のところ定義はさ…

名前空間にやさしいRefinementsの使い方

Ruby2.1にはRefinementsが正式に導入された。ネットで検索すると色々出てくるが、特に衝撃的な便利さということもなく、知ってるけど使ったことは無い、みたいな人も多そうである。ぶっちゃけ、どんなときに使うの?って聞かれると答えにくい。 そうだなー。…

複素数を扱う

DXRuby Advent Calendar 2015の20日目の記事です。 19日目はあおいたくさんの[Ruby][DXRuby] ピザ焼けなかったので野良メイドを拾って育てるゲーム作りました - あおたくノートでした。「野メイド」はGUIフレームワークSpriteUIを使ったテキストSLGというこ…

mrubyのVMにバーストMOVEを実装する

ふと思いついたので久しぶりにmrubyのVMをいじる。久しぶりすぎてcodegenが分離したことを知らなくてしばらく探し回った。 VMというものの実装ではVM命令のディスパッチの負荷がどこまでもついてまわることになるが、これを0にするにはコードをCなどに変換し…

パフォーマンスの測定など

SDL2を使った互換インターフェイスなどを構築してみたので、現時点の実装で動作するベンチマークとして、DXRubyサンプルのsprite_simple.rbを動かしてパフォーマンスを測定してみた。 60fpsで動作する最大のオブジェクト数を適当に手で調べた結果である。う…

sdl2rでゲームライブラリを作る(10)

Spriteクラスを作ろう。 DXRubyのクラス群の中では唯一、DirectXを直接叩かないのがSpriteである。描画に必要な情報をまとめ、DXRubyの描画機能を呼び出すことで間接的にDirectXにアクセスする。なので作ろうと思えば他のライブラリでも同様のものは作れるだ…

ブロックのはなし

RubyのProcやlambdaについての記事は検索するとよく出てくるが、ブロックはなぜかいまいちスポットライトが当たらない。あってもProcの説明のオマケみたいな感じが関の山。 この記事ではそんな不遇なブロックについて焦点を当ててみたい。 ブロックとは何か …

sdl2rでゲームライブラリを作る(9)

文字の描画ができないと色々不便なのでFontクラスを作ろう。 DXRubyはWindowsのAPIをベースに設計されているが、SDL_ttfはそれとは違うものなので、制約される条件がまったく違う。互換性を取るためにはそれなりの細工が必要であるが、そこまでして同じ動作…