K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[344] プログラミング言語を作る
投稿者:mizu
2007/02/20 02:13:25

こんにちは。 新企画「プログラミング言語を作る」楽しみにしています。私はよく 友達(もちろん、一応プログラミング経験者の)に、「言語作ろうぜ。 面白いよ」とよく言っているのですが、プログラミング言語を作るというと、 やはり「難しそう」というイメージがあるのか、敬遠されることが 多いです。 こういうページを見て、「俺言語を作ってやろう」という人が増えるなら、 プログラミング言語好きとしては、嬉しいので、頑張ってください。もちろん、 無理をされない程度に。 ------------------------ 以下、ちょっと宣伝です。 実は私も新しいプログラミング言語をJavaCCで作っていまして、近いうちに 公開しようかと考えているところです。 どんな言語かと言いますと、Java VMのバイトコードを吐く、静的型の オブジェクト指向言語で、JavaのOOP機能に、委譲やクロージャなどを備えた言語 です。既にほとんどの機能のコンパイルができる所まで完成していて、今少しずつ ドキュメントを書いているところです。 一応、特色としては、Javaライクな静的型オブジェクト指向言語でありながら、 スクリプト言語のようにトップレベルにスクリプトがかけたり、型宣言が省略可能 な辺りでしょうか。
[この投稿を含むスレッドを表示] [この投稿を削除]
[343] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>>・制御構文はとりあえずifとgotoのみ(とほほ・・・) >>・他の制御構文はifとgotoで実装してライブラリ提供 > > どのような形式で実行する言語を想定しておられますでしょうか。 むむっ、実はあまり考えていません。あれこれ空想する際には、アセンブリのイメージで考えていて、無条件ジャンプと条件ジャンプがあればとりあえず事足りるかな、という風に思って上記のように書きました。 中間コードを吐くタイプにしようかと考えていて、中間コードはXMLにしようかとも思っています。 > foreach(collection, function(item) { > print(item); > }); > >こんな感じだと読みにくいですかねえ。 そんなことはないですよ。むしろ読みやすいと思います。 >> return x + y, x * y #戻り値の数は任意個数 >>b, a = a, b #スワップ > >これはおそらくリストのような概念を導入し、コンマで区切った式でリストが >生成され、代入時左辺がリストで区切られていると、対応する要素に代入される、 >ということですよね。 >関数呼び出しの際も引数がコンマで区切られていますが、これも、リストとして >渡されて、仮引数に代入される、ということでしょうか。面白そうだと思います。 すごい考察です。僕はそこまで考えていませんでした(^-^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[342] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>・制御構文はとりあえずifとgotoのみ(とほほ・・・) >・他の制御構文はifとgotoで実装してライブラリ提供  どのような形式で実行する言語を想定しておられますでしょうか。  gotoって、現状のcrowbarのような、解析木実行形式の言語だと、結構実装が 難しいと思っています。バイトコード実行形式だと楽なんですが。  制御構造をライブラリで提供する、というのは、crowbarでも考えてはいて、 クロージャで実現できると思ってはいますが…  foreach(collection, function(item) { print(item); }); こんな感じだと読みにくいですかねえ。 > return x + y, x * y #戻り値の数は任意個数 >b, a = a, b #スワップ これはおそらくリストのような概念を導入し、コンマで区切った式でリストが 生成され、代入時左辺がリストで区切られていると、対応する要素に代入される、 ということですよね。 関数呼び出しの際も引数がコンマで区切られていますが、これも、リストとして 渡されて、仮引数に代入される、ということでしょうか。面白そうだと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[341] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>>Java並みとはいわないまでも、Digital Marsにはもうちょっとがんばって、 >>標準ライブラリをもう少し整えてもらいたいものです。 > > むむ。言語作りかけの身としてはプレッシャーです (^^; うっ、墓穴だったかも(^-^;; でも思うに、言語仕様はシンプルで、機能はライブラリとして実現するのがやっぱり移植性とかメンテナンスとかを考えるとベストなので、ライブラリ作りは必須ですよね。でも、それこそシェアを握っている言語のライブラリ相当をそろえるのは不可能なので、 >いっそWindowsに特化してゲームとかを楽に作れる言語にしようか、とか >考えているところです。 特定用途に特化したライブラリでテリトリーを構築するのはよい案ですね。かくいう僕はターゲットはまだ決めてないんですが、プロトタイプはこんな言語にしようと考えています。 ・いわゆる型なし ・制御構文はとりあえずifとgotoのみ(とほほ・・・) ・他の制御構文はifとgotoで実装してライブラリ提供 def foo(x, y) { #関数宣言 return x + y, x * y #戻り値の数は任意個数 } a, b = foo(10, 20) #セミコロン不要 b, a = a, b #スワップ print(b, " ", a) 上記コードで 30 200 と表示されるような。
[この投稿を含むスレッドを表示] [この投稿を削除]
[340] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>前橋さんもおっしゃってましたけど、DはCやJavaに比べて決定的にライブラリや >ツールが不足していて、言語仕様的には同等あるいは勝っているにも関わらず、 >ちょっと大き目のコードを書こうと思うととたんに苦しくなります。  なるほど。  でも、Cと比べれば、これだけ揃ってればまあそこそこ、という気もします。  http://www.kmonos.net/alang/d/phobos.html  GUIはWindowsのAPIを叩けるわけですよね。 >Java並みとはいわないまでも、Digital Marsにはもうちょっとがんばって、 >標準ライブラリをもう少し整えてもらいたいものです。  むむ。言語作りかけの身としてはプレッシャーです (^^;  言語そのものの機能が一通り揃ったら、鬼車でもくっつけるか、 いっそWindowsに特化してゲームとかを楽に作れる言語にしようか、とか 考えているところです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[339] 業務連絡:しばらく繋がらなかったようです
投稿者:(ぱ)
2007/02/20 02:13:25

 さっき私も、繋がらないなあ、と思っていたのですが、復旧したようです。  レンタルサーバ屋さんのお知らせより。 >上位回線プロバイダIDCの管理下にあるレイヤ3ファイアウォールルータの障害により、 >本日12:10頃より13:00頃の間、一時的にサーバーに接続できない状態となっておりま >した。 >現在は復旧いたしましたので、アクセス可能となっております。 >この度は障害によりご迷惑をお掛けし、誠に申し訳ございませんでした。
[この投稿を含むスレッドを表示] [この投稿を削除]
[338] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

>「フロンティア」は「あがり」なのか「ババをひく」係なのか… >いやその第三者的には是非ともがんばっていただきたく(ひでぇ) 前橋さんもおっしゃってましたけど、DはCやJavaに比べて決定的にライブラリやツールが不足していて、言語仕様的には同等あるいは勝っているにも関わらず、ちょっと大き目のコードを書こうと思うととたんに苦しくなります。 Java並みとはいわないまでも、Digital Marsにはもうちょっとがんばって、標準ライブラリをもう少し整えてもらいたいものです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[337] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>lex/yaccで独自言語を作った場合、gccのフロントエンドにして各種Linuxディストリ >ビューションに標準で組み込まれるのが、もっともよいあがりですか。 現状で、個人作の独自言語で成功しているものというと、私としては PerlとかRubyとかPythonとかが浮かぶわけですが、このへんはたいてい ネイティブコードに落とさずインタプリタで実行していますよね。 # Dは違いますけど。 でも、多少なりとも速度を求めるのなら、JITでJavaやC#に勝負を挑むのは無謀なので、 gccのバックエンドを使ってネイティブコードを吐かせるというのは妥当な手段の ような気もします。というわけで自分用のメモ。 GCC Frontend HOWTO http://www.tldp.org/HOWTO/GCC-Frontend-HOWTO.html >JavaCCの場合は、Java VM上で動くようなバイトコードを吐いてWrite Once, >Run Anywhereなんでしょうか。 JVMのバイトコードを吐くのは簡単だと思うのですが、JVMはJavaの言語仕様に 強く依存しているのがなんとも… CLRはよく知らないのですが、JVMより制限が緩いようなら、勉強しようという 気になります。 >Dで独自にパースする場合は、D言語フロンティアになる、ってところでしょうか。 「フロンティア」は「あがり」なのか「ババをひく」係なのか… いやその第三者的には是非ともがんばっていただきたく(ひでぇ) >まだlex/yaccかJavaCCか確定していませんが、理解度からすると8:2でlex/yaccですね。 了解です。もしよろしければ公開を希望、という意思表示だけしときます、 ということにさせていただきたく存じますです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[336] Re:「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

こんばんは。緒方です。 >>前橋さんがlex/yaccで作られるので、やっぱりそうかぁ~、ということで >>僕もそうしようと思います。 > >いやどうせならここは敢えて違う方法をとってみるということでひとつ。 ># 別にプレッシャーかけるつもりはないですが… (^^; それぞれで作った場合の「あがり」について考えるわけです。「あがり」というのはサラリーマンなら社長、政治家なら総理大臣、フリーターなら発明家、という人生ゲームのそれです。 lex/yaccで独自言語を作った場合、gccのフロントエンドにして各種Linuxディストリビューションに標準で組み込まれるのが、もっともよいあがりですか。 JavaCCの場合は、Java VM上で動くようなバイトコードを吐いてWrite Once, Run Anywhereなんでしょうか。 Dで独自にパースする場合は、D言語フロンティアになる、ってところでしょうか。 他にもSmalltalkで書いてSmalltalk VM上で動作するようにしようかとか、C#で書いて.NET上で動作するようにしようかとかも考えたのですが、現実的なのはコンパイラコンパイラで作る方法なので、というかフルスクラッチはさすがにげんなりですね。 まだlex/yaccかJavaCCか確定していませんが、理解度からすると8:2でlex/yaccですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[335] Re:「プログラミング言語を作る」
投稿者:(ぱ)
2007/02/20 02:13:25

>こんばんは、はじめまして。緒方と申します。  どうも。はじめまして。書き込みありがとうございます。 >新しく始められた「プログラミング言語を作る」は僕にとってすごく >タイムリーな話題です。僕も今年に入ってから独自言語の「構想」を練っています。  独自言語の構想を練るのも楽しいですよね。  欲張りすぎると発散するケースが多いのですが… (経験上) >前橋さんがlex/yaccで作られるので、やっぱりそうかぁ~、ということで >僕もそうしようと思います。 いやどうせならここは敢えて違う方法をとってみるということでひとつ。 # 別にプレッシャーかけるつもりはないですが… (^^; >連載楽しみにしています。  それがその、最近体調が優れないのと、仕事のほうがアレなので、あまり時間が 避けそうにない状況です。  ただ、まぬけなバグが2件、残ったままになっているのは気持ちが悪いので、マイナー バージョンアップ版(配列なしでbooleanとネイティブポインタ型を組み込んだ版)を、 さっさと出そうと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[334] ネットのお仕事です!
投稿者:taro
2007/02/20 02:13:25

************************ ディスカバリーネットのSOHOアルバイター急募要項 ************************ 夢のパソコンライフで副収入を得てみませんか? ノルマやペナルティーはなく、1日30分から1時間程度のお仕事です! 風俗的、反社会的な業務を委託することは一切ございません。 一攫千金は無理ですが、少しずつ確実に収入を得たい方は必見です! ディスカバリーネットは、SOHOで高収入を得るお手伝いをいたします! お申し込みの際には紹介者ID【HS‐87】が必要になります。 ↓このHPに登録してみましょう!(詳細はこちら) http://discovery.sub.jp/
[この投稿を含むスレッドを表示] [この投稿を削除]
[333] 「プログラミング言語を作る」
投稿者:緒方
2007/02/20 02:13:25

こんばんは、はじめまして。緒方と申します。 新しく始められた「プログラミング言語を作る」は僕にとってすごくタイムリーな話題です。僕も今年に入ってから独自言語の「構想」を練っています。 lex/yaccを使用するか(この場合実装はC/C++)JavaCCを使用するか(これなら実装はJava)、それとも構文解析機は手書きするか(だとすると実装はD)、かなり長い間悩みました(電卓がいくつか出来上がりました^^;)。前橋さんがlex/yaccで作られるので、やっぱりそうかぁ~、ということで僕もそうしようと思います。 連載楽しみにしています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[332] Re:センス・オブ・プログラミング買いました
投稿者:(ぱ)
2007/02/20 02:13:25

>「センス・オブ・プログラミング」購入しました。 どうもです。お買い上げいただきありがとうございます。 >ところがこの本は違う!いわば企画モノですがパワーがあります。 (たぶん)おほめいただきありがとうございます。 企画モノAV… いや別に嫌いなわけじゃないですが(ぉぃ >きちんと読み込みたいです。Cの本も読んでみます。 こちらもよろしくお願いします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[331] Re:ほげほっぽ
投稿者:(ぱ)
2007/02/20 02:13:25

>ほげほっぽなる麦焼酎があるようです。仕事の後に、ほげほっぽ。  風邪引いて寝込んでいます。返事が遅くなりましてすみません。  情報ありがとうございました。今やる体力はないですが、後ほど 「ほげを考えるページ」に追記しておきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[330] センス・オブ・プログラミング買いました
投稿者:orange
2007/02/20 02:13:25

マエバシさん はじめまして。 「センス・オブ・プログラミング」購入しました。 かなり良い本ですね~!! 書店でぱっと手にとって、つい買ってしまいました。 初心者向けにもかかわらずかなり高度な内容が書かれていて グッジョブ!です。 日経BPに似たようなサイズの本がありますが、あちらはいわば 有名AV女優のようなもの。 なんかお高くとまってイマイチ・・・な気がしていました。 ところがこの本は違う!いわば企画モノですがパワーがあります。 そしてなにより愛がある!! 技術的に普段どうなんだろうね・・と思っていた点にも明快に 書かれていて非常にコ気味良かった(ハンガリアン表記法など)。 そしてこれだけ笑える技術書というのも珍しい! 「おかしい・・・・どこもおかしくない」は爆笑す! ワタクシデビューが遅く小さなシステム屋でaccessVBAでシコシコ作ってました。 このたび、けっこう大きめのところに開発で入ることになり 本格的に勉強せねばと思い本を買いあさっていたところです。 きちんと読み込みたいです。Cの本も読んでみます。 ありがとうございました~。
[この投稿を含むスレッドを表示] [この投稿を削除]
[329] ほげほっぽ
投稿者:HOGE
2007/02/20 02:13:25

ほげ症候群から抜け出せません。気が付くと、ほげほげしてしまいます。 ほげほっぽなる麦焼酎があるようです。仕事の後に、ほげほっぽ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[328] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:chikato
2007/02/20 02:13:25

ご回答有難うございます。 遅くなりまして申し訳有りません。 > その mingw\stdio.h は使われていないからです。 > cygwin の gcc のデフォルトは -mcygwin であり mingw ではありません。 > とりあえず gcc -mno-cygwin test5.c とすればコンパイル通るような気もします。 これで出来ました。 実行結果も同じになりました。 「-mno-cygwin」オプションはMinGWランタイムライブラリを使用せよリンクの為のオプションなのですね。 ランタイム…関連するヘッダファイルと対応するライブラリの総称 > ちょっと調べれば判る程度の問題だと思うのですが、聞く前に調べましたか? 文法エラーとばかり思い込んでいました。 > ただ、\cygwin\usr\include\mingw\stdio.hを見つけることができたなら、 > \cygwin\usr\include\stdio.hを先に見つけてそうですし、ふたつあるなら > どっちか片方が使われているはずで、デフォルトで使われるのは、 > パスの短い方(\cygwin\usr\include\stdio.h)と推論するのが普通じゃないかなあ、 > とは思います。 そういわれてみればそうですよね。 スイマセン。二つあるのもそんなものなのかなと思って疑問視してませんでした。 > \cygwin\usr\include\stdio.hそのものにFILEの定義はないかもしれないですが、 > そこから#includeしているファイルの中にあるはずです。 \cygwin\usr\include\stdio.h内に typedef __FILE FILE; を見つけ ↓ \cygwin\usr\include\sys\reent.h内に typedef struct __sFILE __FILE; を見つけ ↓ \cygwin\usr\include\sys\reent.h内に struct __sFILE { unsigned char *_p; /* current position in (some) buffer */ int _r; /* read space left for getc() */ int _w; /* write space left for putc() */ short _flags; /* flags, below; this FILE is free if 0 */ short _file; /* fileno, if Unix descriptor, else -1 */ struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */ int _lbfsize; /* 0 or -_bf._size, for inline putc */ #ifdef _REENT_SMALL struct _reent *_data; #endif /* operations */ _PTR _cookie; /* cookie passed to io functions */ _READ_WRITE_RETURN_TYPE _EXFUN((*_read),(_PTR _cookie, char *_buf, int _n)); _READ_WRITE_RETURN_TYPE _EXFUN((*_write),(_PTR _cookie, const char *_buf, int _n)); _fpos_t _EXFUN((*_seek),(_PTR _cookie, _fpos_t _offset, int _whence)); int _EXFUN((*_close),(_PTR _cookie)); /* separate buffer for long sequences of ungetc() */ struct __sbuf _ub; /* ungetc buffer */ unsigned char *_up; /* saved _p when _p is doing ungetc data */ int _ur; /* saved _r when _r is counting ungetc data */ /* tricks to meet minimum requirements even when malloc() fails */ unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */ unsigned char _nbuf[1]; /* guarantee a getc() buffer */ /* separate buffer for fgetline() when line crosses buffer boundary */ struct __sbuf _lb; /* buffer for fgetline() */ /* Unix stdio files get aligned to block boundaries on fseek() */ int _blksize; /* stat.st_blksize (may be != _bf._size) */ int _offset; /* current lseek offset */ #ifndef _REENT_SMALL struct _reent *_data; /* Here for binary compatibility? Remove? */ #endif #ifndef __SINGLE_THREAD__ _flock_t _lock; /* for thread-safety locking */ #endif }; を見つけました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[327] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:(ぱ)
2007/02/20 02:13:25

時間がないのでちょっとだけ。 >ちょっと調べれば判る程度の問題だと思うのですが、聞く前に調べましたか? MinGWとcygwinの関係とかに関する知識がないと、そっち方向を調べることを 思いつかなくても不思議はないかもしれません。 ただ、\cygwin\usr\include\mingw\stdio.hを見つけることができたなら、 \cygwin\usr\include\stdio.hを先に見つけてそうですし、ふたつあるなら どっちか片方が使われているはずで、デフォルトで使われるのは、 パスの短い方(\cygwin\usr\include\stdio.h)と推論するのが普通じゃないかなあ、 とは思います。 \cygwin\usr\include\stdio.hそのものにFILEの定義はないかもしれないですが、 そこから#includeしているファイルの中にあるはずです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[326] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:774RR
2007/02/20 02:13:25

その mingw\stdio.h は使われていないからです。 cygwin の gcc のデフォルトは -mcygwin であり mingw ではありません。 とりあえず gcc -mno-cygwin test5.c とすればコンパイル通るような気もします。 ちょっと調べれば判る程度の問題だと思うのですが、聞く前に調べましたか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[325] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:chikato
2007/02/20 02:13:25

遅くなりまして申し訳有りません。 > というわけで修正プログラムです。 : > return 0; > } 大変有難うございます。 でもコンパイルすると $ gcc -o test5 test5.c test5.c: In function `dump_buffer': test5.c:7: error: structure has no member named `_cnt' test5.c:8: error: structure has no member named `_ptr' test5.c:11: error: structure has no member named `_ptr' となってしまい、プログラム実行できずじまいです。 cygwinのを(\cygwin\usr\include\mingw\stdio.h)調べてみましたら #ifndef _FILE_DEFINED #define _FILE_DEFINED typedef struct _iobuf { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE; となってました。 うーん、どうしてコンパイルエラーになってしまうんでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[324] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:(ぱ)
2007/02/20 02:13:25

まず前回のコードにポカがあったので再掲します。ついでに色々いじりました。 > _baseがバッファの根元を押さえ、_cntが現在格納されているデータのサイズだと >想像し(外しているかも)、こんなプログラムを書いてみました。 baseはおそらくバッファの根元を押さえているのでしょうが、バッファから 1文字消費されるたびに中身を移動させていくとは思えないので、 おそらく環状バッファか何かになっていて、現在バッファリングされている 内容の先頭は_ptrが抑えているのでしょう。 というわけで修正プログラムです。 #include <stdio.h> void dump_buffer(FILE *fp) { int i; printf("["); for (i = 0; i < fp->_cnt; i++) { if (fp->_ptr[i] == '\n') { printf("<\\n>"); } else { putchar(fp->_ptr[i]); } } printf("]\n"); } int main(void) { int c; for (;;) { dump_buffer(stdin); c = getchar(); if (c == EOF) break; putchar(c); } return 0; } うちの環境での実行結果。 C:\ctest>buffer [] abcdefg a[bcdefg<\n>] b[cdefg<\n>] c[defg<\n>] d[efg<\n>] e[fg<\n>] f[g<\n>] g[<\n>] [] さて、 >> C:\ctest>buffertest >> aaa >これはエコーバックですよね。 そうです。 >> [aaa] >これはdump_buffer関数でのputchar、printf出力ですね。 そうです。 >> a[aa] >aが一回だけ入力されているのにこのようになるのですかね?? ここに誤解があります。ここで左端に出ている[]に入らないaは、 エコーバックではなく、main()の中でputchar()されている文字です。 つまり、手で「aaa」と入力すると、バッファから1文字ずつ消費しながら putchar()している、という様子を示しているわけです。 # でも、前回のプログラムに「abc」と入れると、変な出方をするのでした(^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[323] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:chisato
2007/02/20 02:13:25

ご回答大変有難うございます。 > 掲示板では一般にマルチポストは嫌われます。 マルチだと思われたのならお詫び致します。m(_ _)m >  ただ、今回の例だと、時期がずれていて、質問内容も違うので、マルチポストに > 当たるかどうかはわかりません。 そう思っていただければ大変助かります。m(_ _)m > が、この手の掲示板を見ている人は、同じような > ジャンルの掲示板は見ていることが多い、ということは意識している必要があると > 思います。かずまさんも、たまにこの掲示板にも登場されます。 今後、誤解が生じませぬよう成るべく異なるサンプルリストを提示するよう心がけま す。 >>select関数についての振舞いについて調べています。 > 端末ドライババッファとstdinバッファの振舞いについて調べるのに、 > わざわざselectを使う必要があるのでしょうか。もちろん別にselectでもいいです > が、 > getchar()とputchar()でもよいような。 そうですか。参考にしてみます。ただ、最近、select関数を知ったのでちょっと使っ てみたくなりまして。 >  端末ドライバのバッファは覗けないと思います(少なくとも標準的な方法では)。 >  標準入力のバッファは、FILE構造体に紐づいていますから、stdio.hから > 調べればよいでしょう。 >  私の環境(gcc (GCC) 3.4.2 (mingw-special))ではこうなっていました。 : > > [実行結果] > C:\ctest>buffertest > aaa これはエコーバックですよね。 > [aaa] これはdump_buffer関数でのputchar、printf出力ですね。 > a[aa] aが一回だけ入力されているのにこのようになるのですかね??
[この投稿を含むスレッドを表示] [この投稿を削除]
[322] Re:正誤の誤?
投稿者:(ぱ)
2007/02/20 02:13:25

 はじめまして。 > それはさておいて、なんとなしに同書の正誤表を見ていたら「賭け網」と書かれた >箇所に気づきました。「賭け」でよかったのかな、と思ったもので。ちなみにGoogleで >検索するとこちらのサイトがトップ3にランクインしてました。  ご指摘ありがとうございます。まぬけなポカでした。修正しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[321] 正誤の誤?
投稿者:田中
2007/02/20 02:13:25

 貴著「センス・オブ・プログラミング!」が図書館にあったので今度借りようと思っている者です(著者さんとしてはうれしさ半減?)。  それはさておいて、なんとなしに同書の正誤表を見ていたら「賭け網」と書かれた箇所に気づきました。「賭け」でよかったのかな、と思ったもので。ちなみにGoogleで検索するとこちらのサイトがトップ3にランクインしてました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[320] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:(ぱ)
2007/02/20 02:13:25

 掲示板では一般にマルチポストは嫌われます。  ただ、今回の例だと、時期がずれていて、質問内容も違うので、マルチポストに 当たるかどうかはわかりません。が、この手の掲示板を見ている人は、同じような ジャンルの掲示板は見ていることが多い、ということは意識している必要があると 思います。かずまさんも、たまにこの掲示板にも登場されます。 >select関数についての振舞いについて調べています。 端末ドライババッファとstdinバッファの振舞いについて調べるのに、 わざわざselectを使う必要があるのでしょうか。もちろん別にselectでもいいですが、 getchar()とputchar()でもよいような。 ... >端末ドライバのバッファやstdinバッファの中身を覗くにはどうすれば >いいのでしょうか?  端末ドライバのバッファは覗けないと思います(少なくとも標準的な方法では)。  標準入力のバッファは、FILE構造体に紐づいていますから、stdio.hから 調べればよいでしょう。  私の環境(gcc (GCC) 3.4.2 (mingw-special))ではこうなっていました。 typedef struct _iobuf { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE;  _baseがバッファの根元を押さえ、_cntが現在格納されているデータのサイズだと 想像し(外しているかも)、こんなプログラムを書いてみました。 #include <stdio.h> void dump_buffer(FILE *fp) { int i; printf("["); for (i = 0; i < fp->_cnt; i++) { putchar(fp->_base[i]); } printf("]\n"); } int main(void) { int c; while ((c = getchar()) != EOF) { dump_buffer(stdin); putchar(c); } } [実行結果] C:\ctest>buffertest aaa [aaa] a[aa] a[a] a[] bbb [bbb] b[bb] b[b] b[]  それっぽく動いているように見えます。  重要なのは、標準入出力ライブラリの関数は、そのバッファリングのメカニズムを 含め、普通にCで、システムコールの上に実装されている、ということです。 実装を想像すると、理解が深まると思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[319] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:774RR
2007/02/20 02:13:25

http://www3.realint.com/cgi-bin/tarticles.cgi?pointc2+3409 ここの人ですか? せっかく「とても適切でわかりやすい」回答があるのですから、 100回くらい繰り返して読むべきです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[318] 端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:chisato
2007/02/20 02:13:25

select関数についての振舞いについて調べています。 (Win2k+Cygwin) #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/types.h> #include <curses.h> #include <signal.h> #include <unistd.h> //=================== void session_loop(){ fd_set mask; FD_ZERO(&mask); FD_SET(0,&mask); fd_set readOK; int width=1; char c; printf("う\n"); while(1){ printf("あ\n"); readOK=mask; printf("こwidth=%d\n",width); select(width,(fd_set *)&readOK,NULL,NULL,NULL); printf("け\n"); if ( FD_ISSET(0, &readOK ) ){ printf("い\n"); c=getchar(); //getcharはバッファリングあり関数 printf("c=%c\n",c); printf("さ\n"); } } } //================= int main(void){ session_loop(); return 0; } というリストで 端末ドライババッファやstdinバッファの振舞いについて学習しています。 端末ドライバにバッファリングされた文字群がgetchar関数のread要求とかでstdinバッファに排出される様子や stdinバッファの文字群がgetchar関数の読込み毎に減っていく様子を垣間見たく思っています。 端末ドライバのバッファやstdinバッファの中身を覗くにはどうすればいいのでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[317] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

> ゲームプログラマじゃないですって(^-^;) ありゃりゃ、すみません。旧掲示板でゲームのフレームワークの話をしておられたので ゲーム系の人かと思ってました。失礼しました。 > あとは「僧侶が使うと魔法が発動するが、勇者が使うと武器になる」とか >「フィールドによっては効果が封印されてしまう」など作り込み次第で例外は >いくらでもありそうです。 … > あとはリフレクトされるカウンターなんかがあると更に面倒になるのでしょうね。 >そしてそのカウンターに「反応」できるとなると・・・考えるだけで目が回りそう >です。 うわあ。なるほど。 これで、武器や職業の種類が少なければ、いっそif文べたべたでやってしまえという ことになりそうですが、おそらくそうでもないんでしょうね。 大筋はポリモルフィズムで、例外的なのはif文で場合分け、とかするのかな。 何にせよ大変そうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[316] Re:書き方覚えて後から理解
投稿者:れぷ
2007/02/20 02:13:25

 ゲームプログラマじゃないですって(^-^;) 大昔に書いたと思いますがバリバリC/S系です。 # 確かに趣味ではゲーム作ってますけど・・・  Cでも関数は書き方、作り方にある程度の定石がありますが、結局のところは適材適所になって例外はいくらでもあるわけで、この辺りは悩みどころかもしれませんね。CADに関してはやったことないのであまり深く言及できませんが、ShapeのZオーダだけで単純に判定できなそう、くらいの認識です。 > このへんは、ダブルディスパッチ(いや、Character→Arm→Enemyのトリプル >ディスパッチかな)でいけそうな気がしますが、どうなんでしょうか。  そうですね・・・アイテム攻撃でも「武器を選択すれば殴れる」ような場合とか「魔法が発動してしまう」場合もあるのでもう1回くらいディスパッチが必要になるかもしれませんね。  あとは「僧侶が使うと魔法が発動するが、勇者が使うと武器になる」とか「フィールドによっては効果が封印されてしまう」など作り込み次第で例外はいくらでもありそうです。  ひと昔前のRPGであれば、攻撃が0、魔法が1などになっていて、引数でどの武器、どの魔法なんて指定していましたが、それをしっかりOOPで纏めるほどディスパッチの回数が多くなりそうな気がします。  あとはリフレクトされるカウンターなんかがあると更に面倒になるのでしょうね。そしてそのカウンターに「反応」できるとなると・・・考えるだけで目が回りそうです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[315] Re:書き方覚えて後から理解
投稿者:(ぱ)
2007/02/20 02:13:25

>使う側は全体魔法の場合は、こう書く...かなぁ? > for( i=0; i<number_of_enermy; i++) Attack( enermy[i], magic); 「全体魔法の場合は」というif文が出てくるのが、本来は美しくないんでしょうけど。 現実問題そこの場合分けなしではうまく書けないのかもしれませんし。 >でも、やっぱりattack()がintを返すのは問題かなぁ。 >enermyのステータスなり何なりに効果を与えるのが自然...かな? ということで、条件分岐は避けられないとするのなら、いっそget_attack_point() にして後の判断は上位に任せるという方法もあるかとは思います。OO的ではないですが。 もちろん、そのメソッド名が「attack()」では全然ダメですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]