プログラマーとしてのあり方
まず宣伝から。リンク規制は実質上モラルの問題でしかないので、それに甘えるのが礼儀というものなんでしょうね。
伽藍とバザール(日本語訳)ノウアスフィアの開墾(日本語訳)魔法のおなべ(日本語訳)ハッカーになろう(日本語訳) 私が自称するは「日曜プログラマー見習い」です。しかし、私が到達しようとしている存在である「日曜プログラマー」がどのような存在であるかを今一つ理解していませんでした。
これだ! ええ、私が目標とすべきイメージが固まりました。自分の仕事に誇りを持つ日曜プログラマーとは、こういう人を言うものだと分かり、すっきりしました。
という訳で現在の目標に関して。
取ってつけたようなものもある故に、多分誤解とか沢山あります。
・ネット上で位は英語を扱えるようにする
これは必須ですね。ただし、機会が無いと上達出来ないというのは悪い癖です。
この際「日本語でおk」と罵られようとも練習として英語で書いてゆくべきか否か。
・サンプルでなくても、製作物のソースコードは公開する
ソースコードを公開するという事は、ユーザや友人による解析や改良が容易となります。
あと
ソフトのソースコードを入手する手段を作れとクレーム付けられるのも嫌ですし。
なるべく製作時のメモなんかも同梱出来るといいですね。そこまで気が回るかどうかは怪しいですが、公開したとしてデメリットはほぼありませんし。
・D言語を扱えるようにする
D言語の発展に期待をしている者の一人です。
何というか、あれも頻繁な報告と更新が行われていて、楽しそうなんですよ。何か貢献出来ればと思っていますが、とりあえずは一つアプリケーションを作るのが目標。
実際フリーで開発環境が充実していますし、言語仕様自体もモダンでネイティブコード出力です。gotoやポインタ、インラインアセンブラも完備されていて、C言語と同じくCPUに対応したコンパイラさえあれば何でも作れます。
ただ一つ、知名度が足りないです。最近触っていなかった私も同罪か。
・linuxを使い、ソースコードを読む
自分のPCにはVine linuxをインストールしていますが、カーネルの実装とかそういうものに関してはまだ見ていません。ソースコードもダウンロードしてすぐ読めるのですが、機能の使い方、構造を知らないうちはなんとも。まずそっちから。
・オープンソースプロジェクトに参加する
目標ですね。この流れで英語が必須となるでしょう。
上の目標全てがここに帰結します。そしてここがスタート。
この駄目野郎にはスタートまで何年かかることやら。
2009/06/22
ただの日記
コメント:1
トラックバック:0
アセンブラの導入を考えている
インラインアセンブラは便利ですが、モダンな命令に対応していないというのが重大な欠点です。
ついでに色々と地味な制約が辛くて。C言語から呼び出せる関数をアセンブリで書けなかったり。(やり方を知らないだけ?)
スタックを無駄無く扱おうとすれば、まだまだコンパイラによる最適化では対応しきれません。そのため、完全アセンブリで一部の関数を書くという事も少しはあるだろうと思い、この際普通のアセンブラを使えるようになることにしました。
という訳で今回使うのはNWSAというアセンブラ。当たり前ですが基本的に私が紹介するソフトは無料です。ケチれるところはケチるのだよ。
とりあえず今回作るのはコルーチンであるため、そのようなモダンな命令は必要ありません。コンパイラによってスタックポインタの相対的な位置が変わってしまうような事態を避けるために、関数を完全にアセンブラで記述する必要があったからです。
今回は欲を出してコルーチンに専用のスタックを持たせようと試みました。構造体にある程度の領域を確保し、スタックポインタを
すり替えてスタックとして、関数内で関数を呼び出しても正常な位置を保てるようになります。ただしスタックのサイズは小さい(256バイト程度)のでそう大きな処理は出来ませんが。
ソースコードは
これです。
CやC++から呼び出す事を前提に作られているため、ヘッダファイルも同梱しておきました。
スタティックライブラリ……作り方が分からないんだっての!(泣
2009/06/17
プログラム
コメント:1
トラックバック:0
コルーチンを作……やっぱ無理
おい、pngはどうなったんだ!いや、面白そうな話題があるとついそちらを優先してしまって……
マルチタスクやマルチスレッドに関してを何の意味も無く調べていたら、コルーチンやマイクロスレッドの話を思い出しました。基本的な機能を使えるようにしたいので、原理と実装を軽く調べる程度ですが。
途中で内部から、もしくは外部から止めたり、再度動かせたりします。このような機能をサブルーチンに追加したらあっという間にコルーチンです。
で、どうやって実装するの?という話になりますが、これは
レジスタの退避が必要なためアセンブラでないと実装不可能です。多分。
インラインアセンブラが使えるCやDでなら普通に作れます。まだ使い道は考えていませんが、こういう汎用的な機能は早めに作っておいて損は無い……はず!(汗
※以下のアセンブリコードはBCC Compiler 5.5で出力したものを載せています。DMCもあるけどアセンブリに変換する機能はコンパイラについていないので無理)
どのコンパイラでも多分この位の最適化なら変らないと思いますが……
関数ポインタとリターンアドレスを使ったジャンプが一番実装的に簡単だと思った……
結果がこれだよ!(泣void func(){
/* この部分 */
処理
}この部分に入るスタックの退避処理は、基本的には以下のようになります。
PUSH EBP
MOV EBP, ESP
PUSH ESI
PUSH EDI
これならリターンアドレスの特定は簡単に出来そうなのですが、
引数の無い関数をコールすると大抵下のように最適化されます。
PUSH ESI
PUSH EDI
要するに、最適化を行う事によって、現在のスタックポインタから見たリターンアドレスの相対位置が変わってしまいます。
そのため、スタックポインタの位置が変わらないように、またスタックポインタの位置を記録しておくようにすれば問題ないのでしょうが、それがまた難しい。
サークルのVCも併用して、変換されたアセンブリのコードをを詳しく調べながら試行錯誤していると、かなり分かってきました。インライン展開を無効にすればどこでもコンパイル出来そうなコードが書けそうです。ちなみに関数コールを行った際に引数を渡しますが、あれはPOPされるため割と厄介です。
ああ、スタックの操作ってどうしてこんなに難しいのでしょうね。
全部見る
2009/06/04
ゲーム製作
コメント:0
トラックバック:0
多忙……?違う、これは怠惰だ
DirectInputでマウスの座標を取得するのが難しい。相対座標でも絶対座標でも動かない。
クリックの感知だけはしっかりと出来ているのがもっと腹立たしい。
しかし本題とは全く関係ありません。
さて、今回は事実上最も一般的な画像形式である
pngの話を少しだけ。
pngというのは非可逆圧縮形式、しかもフルカラー形式とパレット形式、どちらもサポートしています。要するに、事実上画像の劣化が全く起きない形式です。
ちなみに事実上と言ったのは減色の劣化も考慮するため 必要なし奇数にあわせて効率よくファイルサイズを小さく出来るところが魅力的ですし、libpngという簡単に扱えるライブラリがあるので簡単に扱えます。
という事で問題なく、かつ手軽に扱える
pngですが、未だにこのフォーマットを扱えない場所があるという事には気付かれない方もいるでしょう。
IPictureインタフェースは未だに対応していない要するにpngの読み込みだけは自前で実装しなければならないようです。一番ポピュラーなのに。
前述の通りlibpngがあるから楽なので、次回はサンプルを用意しておきます。
ソースコードが全世界共通で本当によかったと心底思いますね。
2009/05/19
ゲーム製作
コメント:0
トラックバック:0
Luaを知っておかないとやばい気がする
カービィボウル的なものが作りたい→そうだ始点変更を実装しよう→3Dプログラミングが出来なくては→視点変更で詰まった
そのため気分転換に色々な事に手を出しています。ほとんどプログラミング関係ですが。
その一環で、噂のluaというスクリプト言語にわずかながら手を出してみました。利点は
・言語構造を単純にする事で動作の高速化を図っている
・別の言語との連携を前提に作られた言語なので、組み込みやすい
・中間言語にコンパイルし、そこから実行可能
・中間言語にコンパイルし、そこから実行可能
libやdllは作られていないため、ソースコードを自分でコンパイルする必要はあります(glutもそうでした)。
大抵の使用例ではスクリプトから実行していますが、中間言語への変換を前もって行っておけば更に速くなるはずです。プロジェクトの管理とかテキストエディタ、ボタン一つでプロジェクト内のスクリプト全てのコンパイルが出来るようなソフトウェアがあればいいのですが……(デバッグ機能は最後でもいい)
自分で作れですね、分かります。 使い方はソースコードや他の人の記事をを見ながら学んでゆきますが、今の所自分が作る予定のゲームには組み込む予定がありません。
DLLと比べるとそれでも遅いでしょうし、作業量の軽減率を考えるとどうも。
さすがにFullActiveのAIをアセンブリ言語で書くのはきついですが
2009/05/10
ゲーム製作
コメント:0
トラックバック:0