K.Maebashi's BBS

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

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

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

[1427] Re:(初歩的な)質問
投稿者:(ぱ)こと管理人
2009/09/02 22:33:18

こんにちは。 >mingw32-make.exeというファイル名を gmakeという名前にコピーしたのですが >それをどうすればいいのか分かりません。gmakeをダブルクリックしたのですが >[No such file or directory]と表示され,いくつかファイルが作られるだけです。 「gmakeをダブルクリック」しているところからして、コマンドプロンプトを お使いになったことがないのでは、と想像しています。 crowbarやDiksamは、コンパイルするのも実行するのもコマンドプロンプトから 行うことをを想定しています。 WindowsXPやVistaであれば、スタートメニューから  プログラム → アクセサリ → コマンドプロンプト で、コマンドプロンプトが表示されるはずです。 たとえば、crowbarの圧縮ファイル「crowbar_0_4_02_win.LZH」を C:\直下で展開したのであれば、「C:\crowbar_win」というフォルダができていると 思います。 コマンドプロンプトで cd C:\crowbar_win [Enter] とタイプして C:\crowbar_win に移動し、そこで gmake [Enter] とタイプすることで、crowbarがコンパイルされるはずです。 実行するときも、コマンドプロンプトから、 crowbar xxx.crb のようにタイプして実行します。 コマンドプロンプトの詳細は、たとえば以下のようなページが参考になると思います。 http://ykr414.com/dos/index.html 疑問点があれば遠慮なく書き込んでください。 なお、コマンドプロンプトでエラーが出た場合、それをここに書き込むのであれば かならずエラーメッセージをcopy&pasteしてください(正確なメッセージを知るため です。「エラーが出ました」だけでは何のエラーだかわかりません)。 コマンドプロンプト上のテキストをコピーする際は、コマンドプロンプトの タイトルバーで右クリックし、「範囲指定」→マウスで領域選択→「コピー」で 可能です。 # そのうち「Diksamではじめる12才からのゲームプログラミング」なんてのを # 書いてみたいと思っているのですが、コマンドプロンプトやフォルダ構造のところで # 若い人とはずいぶんギャップがありそうだ、とまさに思っていたところでした…… # とはいえWindowsをちゃんと使うなら、「コマンドプロンプトやフォルダ構造」は # 避けて通れないと思うんですがねえ。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1426] (初歩的な)質問
投稿者:高校生
2009/09/02 11:47:36

crowbarが実行できないのですが Cコンパイラもcygwinもbisonもflexもいれました。電卓(mycalc)は実行形式ができるのですがcrowbarやDiksamは実行形式ができません。 mingw32-make.exeというファイル名を gmakeという名前にコピーしたのですがそれをどうすればいいのか分かりません。gmakeをダブルクリックしたのですが[No such file or directory]と表示され,いくつかファイルが作られるだけです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1425] Re:デバックシステム一応完成
投稿者:(ぱ)こと管理人
2009/08/16 21:38:16

>Diksam 2.0 より流用改変したソースはコンパイルラ部分のみで123K、 >全体の22%。その中はクラス化や、言語仕様の違いで全関数修正している >ため。元の6割ぐらいしか原型が残っていないと思います。VMについては、 >新たに書いているので基本アルゴリズムが同じで、中身は違ったものになっ >ています。 そういえばVMは新規と言う話は以前書いておられたと思うのですけれど、 バイトコードが基本的に同一らしいので、VMも流用かと思い込んでしまいました。 コンパイラをgenerate.cまで含めて流用していれば、そりゃバイトコードは 似たようなものになりますね。 > ソースの件ですが、正式にフリー公開時点でソース公開も考えています。 >現時点ではまだちょっとです。(ぱ)さん以外非公開を条件にVMのソース送り >ましょうか? 了解です。DiksamはGPLとかではないので、現時点では公開されないという 方針でしたらそれでよいかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1423] Re:デバックシステム一応完成
投稿者:
2009/08/14 21:22:27

つ、追記。 いや、ソフトを使って行数カウントしてみた。全体で17,657行ありました。それだけ^^;
[この投稿を含むスレッドを表示] [この投稿を削除]
[1422] Re:デバックシステム一応完成
投稿者:
2009/08/14 19:19:24

>山さんのVMがDVMとどれぐらい違うのだろうと思ってダウンロードしてみましたが、 >VM部分のソースはないのでしょうか……  どれぐらい違うのかソースファイルのサイズで定量的に計ってみました。 ・システム管理部分  115K(ソースファイルの合計) ・コンパイラ     150K ・VM         73K ・共用        45K ・組込み関数     34K ・ヘッダーファイル  140K (クラスやテンプレートでヘッダーファイルが大きくなるのはC++の宿命ですね)         合計 557K  プログラムの行数的にはコメント含み1万数千行ほどあります。 Diksam 2.0 より流用改変したソースはコンパイルラ部分のみで123K、 全体の22%。その中はクラス化や、言語仕様の違いで全関数修正している ため。元の6割ぐらいしか原型が残っていないと思います。VMについては、 新たに書いているので基本アルゴリズムが同じで、中身は違ったものになっ ています。  VMは最小になるように作られているので、73K 全体の13%です。ソース の60%は新しく作りこんだ仕様のためでした。内容はマルチVMのシステム・ 言語的にスレッドセーフな仕組み・コンパイルとVM間の協調動作管理、等々です。  私が言ってはいけないのかもしれませんが、結構複雑なシステムになってます。 難しいのもまた楽しくもあります。  ソースの件ですが、正式にフリー公開時点でソース公開も考えています。 現時点ではまだちょっとです。(ぱ)さん以外非公開を条件にVMのソース送り ましょうか?  VMは1つのクラスで、そのクラスのオブジェクトを1つ作ったら、それが1つの VMスレッドになり、VM機能を詰め込んだ、あまりクラスらしくないクラスです。 だから、メモリーがあるだけマルチでVMスレッドを自由に実行できます。  ちなみにコンパイラも見た目は1クラス(内部でいくつかのクラスを使用)で、 機能的にきれいに分離されています。ただその分システム管理で全体の協調 動作制御が必要です。 >あと、フォルダ名の「editer」は固有名詞でしょうか? いえ、LIZA.iniファイルで自由に変えられます。  先のことですが、ライザ言語はC言語のシンタックスにとても似ているので、 ライザ言語をC++のソースにコンパイルすることは簡単です。完成した後、 暇だったらシステムをライブラリー化して、コンパイルしたC++ソースとリンクし、 ネイティブな実行形式作成をやってみたいですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1421] Re:デバックシステム一応完成
投稿者:(ぱ)こと管理人
2009/08/14 00:24:29

>http://ux.getuploader.com/yamamoto/download/3/debug.zip 山さんのVMがDVMとどれぐらい違うのだろうと思ってダウンロードしてみましたが、 VM部分のソースはないのでしょうか…… あと、フォルダ名の「editer」は固有名詞でしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1420] Re:デバックシステム一応完成
投稿者:
2009/08/13 19:38:47

 速いPCでも問題が…、日ごろノートPCで開発しているのですが。 久しぶりにディスクトップでやったら。  デュアルPC以上だと、本体のスピードが早すぎてモニターの処理が 追いつかないです。 約1秒に1000行ぐらいの情報を送っています。  UDP送信後 sleep(0)のウェイトをかけているのですが、シングルCPU だと、それなりに時間がかかるのですが、デュアル以上だと多少のウェイト だけで、高速にUDP送信をしていました。さすがに受けきれない結果に なります。t016.lzp t17.lzp でモニターが動作異常になります。デバック モニターがロックしたような状態、UDP受信例外、等々が発生します。  モニター側で、過負荷のときの処理を追加すべきでした。 そんな訳で、こんなデバックシステムが出来ましたよ程度としてみてください。  その他、ディスアセンブラの行情報異常や、システム変数配列処理ミス、 変数のコンフリクト問題、等々その後見つかった問題も対策終了しています。  見つかったバグのほとんどは、以前は無かったのですが、各種修正と機能 追加で新たにバグを作りこんだようです… 良くあることです orz
[この投稿を含むスレッドを表示] [この投稿を削除]
[1416] Re:デバックシステム一応完成
投稿者:
2009/08/12 18:01:54

 別のPCで実行したところ、MSVCXXXX.DLLが必要でした。 ↓にDLLを添付したファイルをUPしました。申し訳ありません。 http://ux.getuploader.com/yamamoto/download/3/debug.zip  また、add_stringのバイトコードでたまーに、システム変数が コンフリクトを起こす現象を発見しています。  あと、遅いPCでは、UDP通信が大幅に抜ける場合があります。 デバック用に最小時間を指定しているので、遅いPCでは大量の 送信データを受けきれないです。送信後のウェイトを長くすれば 問題ないのですが、デバックターンが長くなるのでこのままに しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1415] デバックシステム一応完成
投稿者:
2009/08/11 19:20:41

 プログラムのブレーク、ステップ処理等を除き一応の完成、ブレーク等は アプリケーションのGUIが出来上がらないとボタンが無いので。その他にも いろいろ修正をしました。  ・言語の内部コードをSJISからワイド文字wchat_tに変更。  ・動的コンパイラの組込み。  ・コンパイルエラーのモニター連携  ・VM実行時エラーのモニター連携  ・デバックシステムの組込み(第1段階終了、全体の80%以上は終わったかな)  ・コンパイラのpool導入による高速メモリー確保と一括開放。  ・VMも一部Pool化。  ・VMの言語関数起動の最適化と高速化。  ・ライザ付属エディターの組込み。  ・LIZA.iniファイルによる初期化設定を組込み  等々いろいろ修正しました。特にデバッグシステムの組み込みは大きかった。 もう、文字で示すのも画像で示すのも困難と思うので。↓にUPしています。 http://ux.getuploader.com/yamamoto/download/2/debug.zip もしお暇がありましたら試してみて、何かありましたらよろしくお願いします。 まだ本体はCUIで出来ています。多分バグだらけです。  手順は、ライザデバックモニタ「LZ_moniter1_001.exe」を実行して、本体の 「lz002.exe」を実行するとデフォルトの「start.lzp」を実行します。以前出した タイマプログラムです。  2つともローカルでUDP通信をしているので、通信許可でお願いします。 初期起動時は、UDP通信がごっそり抜ける時があるので、本体は2回以上起動して みたほうがいいかもしれません。時々モニターのログが抜ける時があります  本体はデバックモードのままなのでEXEも大きく、動作はとても遅いです。 大量のデバックトレースをモニターに送っているので。  また、XXX.lzpの起動をlz002.exeに起動リンクすれば、その他のプログラムは、 ダブルクリックで直接実行できます。そこに入っているXXX.lzpは総て動きます。 ただ、修正するとこける可能性が高いです。試作以前の段階なので。  デバックの組込みで以下の言語仕様が追加されました。 ただ、まだほとんど機能しません。本体のGUIを作る時でないと2度手間に なってしまうので。  次からはようやくアプリケーションの本体です。ああ~~長かった~ 次も長いんだろうな //-- デバック行コントロール ------------- #define DBL        // デバック行有効 //#define DBL       /-/ // デバック行のコメント化 //-- デバック関係関数 ----------------------- #define 一時停止    debug_break //-- デバックログ関係関数 ------------------- #define ファイル表示  debug_file_disp // モニタにファイル表示 #define トレースログ  debug_trace_log // トレースログに表示 #define システムログ  debug_system_log // sysログに表示 #define ログ1      debug_log1 // ログ1に表示 #define ログ2設定    debug_log2_set // ログ2にタブ追加設定 #define ログ2      debug_log2 // ログ2に表示 #define ログsys変数   debug_sysval // ログするシステム変数の登録 #define クリア     "クリア" // ログするシステム変数のクリア //-- デバックモニタ制御関数 ------------------- #define デバックモニタ制御 debug_monitor_control #define 変数ログクリア   1 // モニタ02の変数ログクリア #define 全ログクリア    2 // モニタ01全ログクリア #define トレースログクリア 3 // トレースログクリア #define sysログクリア    4 // sysログクリア #define ログ1クリア     5 // デバックログ1クリア #define ログ2クリア     6 // デバックログ2クリア //-- ログ出力制御用システム変数 --------------- #define 全ログSW      SLI001 // 全てのログ0:停止1:開始 #define トレースログSW   SLI002 // トレースログSW #define システムログSW   SLI003 // #define ログ1SW       SLI004 // #define ログ2SW       SLI005 // #define ローカル変数ログSW SLI006 // #define システム変数ログSW SLI007 // //-- 組込み関数宣言 -------------------- DBL int 一時停止()     // 戻り=0 DBL int デバックモニタ制御(int type); // 戻り=0 DBL int ファイル表示(string fname); // 戻り=0 DBL int システムログ(string str); // 戻り=0 DBL int トレースログ(string str); // 戻り=0 DBL int ログ1(string str); // 戻り=0 DBL int ログ2設定(string tag_name); // 戻り=log2id DBL int ログ2(int log2id,string str); // 戻り=0 DBL int ログsys変数(string str); // 戻り=0 //--------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1412] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/27 20:28:42

>この週末は、土曜の夜からなんだかまぶたが腫れ上がってましてほとんど寝てました >(医者には行って薬ももらいましたが、原因は不明です)。 >反応が遅れましてすみません。 いえいえ、十分反応は早いですよ。 最近の投稿の時間を見ると夜中の3時前後・・・。 余計なことかもしれませんが、あまり無理をなさらずに。 ご自愛ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1411] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/27 03:09:48

この週末は、土曜の夜からなんだかまぶたが腫れ上がってましてほとんど寝てました (医者には行って薬ももらいましたが、原因は不明です)。 反応が遅れましてすみません。 >プログラミング言語を作るをもう一度読んでいて2つミスプリントを見つけました。 > >p106 3-3-3「解析木の構築---corwbar.yとcreate.c」の第5パラグラフに >「アクションにて、crb_crete_binary_expression()」とありますが、 >「アクションにて、crb_create_binary_expression()」だと思います。 > >p189 補足「別のあるべき姿---Code Set Independent」の最後から3つめのパラグラフに >「それに対し、CSIだと(N-1)必要になります。」とありますが、 >これではUnicodeに正規化する方法よりエンコーディングを変換するコンバーターが少なくなってしまいます。 >(N-1)はN(N-1)の間違いでしょうか? たびたびすみません。ご指摘ありがとうございます。 正誤表に追加しました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1410] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/26 21:09:33

プログラミング言語を作るをもう一度読んでいて2つミスプリントを見つけました。 p106 3-3-3「解析木の構築---corwbar.yとcreate.c」の第5パラグラフに 「アクションにて、crb_crete_binary_expression()」とありますが、 「アクションにて、crb_create_binary_expression()」だと思います。 p189 補足「別のあるべき姿---Code Set Independent」の最後から3つめのパラグラフに 「それに対し、CSIだと(N-1)必要になります。」とありますが、 これではUnicodeに正規化する方法よりエンコーディングを変換するコンバーターが少なくなってしまいます。 (N-1)はN(N-1)の間違いでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[1409] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/23 02:11:11

>>確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは >>挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 >確かにその通りのようです。 一応、「プログラミング言語を作る」では、p.153にて、本当にちょっとだけ ダイナミックスコープの説明をしています。お気づきかもしれませんが念のため 補足します。 今読み返すと、ここでのCRB_LocalEnvironment構造体のnextメンバが何を 指しているのかわかりにくいような気がします…… ここでのnextは、 呼び出し元のCRB_LocalEnvironment構造体を指しています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1408] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/23 02:05:08

ひとまずここだけ。 > Windowsのメッセージシステム…、あれは同期非同期以前のシーケンシャル >処理システムなんです。1スレッドでメッセージ取り出しループ処理して、メッセー >ジを受け取り、そのメッセージに対応する関数を呼んでいるだけで、並列処理は >していないです。 Windowsのメッセージシステムが並列でないのは当然ですけど、 ブラウザであれば、コンテンツの取得の方を別スレッドで回せるはずですよね。 IEがどうなっているかは知りませんが、いまどきのアプリですから当然そうなって いるのではないでしょうか。 でも、コンテンツ取得スレッドがネットワークの待ちでブロックされていたり、 ActiveXコンポーネントが動作中だったりすると、結局×ボタンで止められない ような感じがしています。まあいろいろ難しいよね、という程度の意味です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1407] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/22 20:51:40

>確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは >挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 確かにその通りのようです。 >>myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた >>のでしょう? > >過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と >思ったことがある、ということなのではないでしょうか。 そういう歴史があるとは知りませんでした。 わざわざ回答してくださってありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1406] Re:マルチスレッドについて
投稿者:
2009/07/22 20:46:20

>一応検索はしたのですが、Googleでは普通に非同期処理の記事しか出てこなかった >ような……  私のほうでは出るのですが…、では「非同期分散処理」という言い方でも いいかな、「非同期処理」までいくと意味合いがちょっと違うんですよね。 >ここのところが、yieldとかwait()とかの方法ではいけないのかな、というのが >私の疑問です。  その場合、キュー処理にいろいろ問題が出てくるのです。まず第1に、キューの 優先順位ができない、全部のスレッドに優先順位処理を作りこめばいいのかも しれませんが、まったく非効率です。次に、キューを送る元と受け側が同期処理 していなければいけない。こえは、たとえば受け側がキューを処理中に、いくつも キューを送れない。これもまた各スレッドに…。つぎに、受け側がスレッドを 終了した場合、送り元に終了した旨の連絡して止めてもらう同期処理をしなければ、 相手がいないのにキューを送って宙ぶらりんとなる。等々キュー処理には(ぱ)さん が示したスレッドの関数だけでは無理なことが多いです。  いろいろと作りこめば非同期もできます。しかしそれには、そのスレッド以外 でキューの管理システムを作らなければならないわけで。使用者にその管理部分 を作れと要求しているわけです。その要求をしている言語は「非同期分散処理」 をサポートしているとはいえません。  (作れば何でもできると考えれば、アセンブラでOKってなってしまう)  また、スレッド起きに監視ループが必要になってきますが。私が作りたい のは何十何百ものスレッドをターゲットに考えているので、そのスレッドの待機 処理時間が馬鹿にならないのです。私の言語は100スレッドあっても、待機時は 負荷0です。  「非同期分散処理」を純粋にサポートしようと思ったら、今のスレッド仕様で は無理があるのです。C言語でも、OOPの様にクラスやカプセル化のようなことが 出来ます。でもだれもC言語がOOP言語とは言いません。それと同じことを言って いるように感じます。単純な基本機能があれば、その組み合わせでほとんどの ことが出来ます。しかし、その言語でできる事をサポートしているとはいえま せん。 >固定個のスレッドプールを持っているようなので、それを使い切った場合を想定して >いるのでしょうか? うーん。  いえ、「非同期分散処理」を言語レベルでサポートするためにです。 >脱線しますけど、よく言われるマルチスレッドのメリットで、GUIのスレッドを >処理のスレッドと分けておけば、ユーザの操作にすぐ反応できる、というのが >ありますけど、じゃあ重たいページをIEで表示してしまった時、×ボタンですぐに >停止できるのかというと、さっぱり押せないことばっかりで……  Windowsのメッセージシステム…、あれは同期非同期以前のシーケンシャル 処理システムなんです。1スレッドでメッセージ取り出しループ処理して、メッセー ジを受け取り、そのメッセージに対応する関数を呼んでいるだけで、並列処理は していないです。だからその関数が終わらないと次の処理ができないシステム です。IEの中身がどうなっているかわかりませんが。即応できるシステムを作る のは難しいと思います。  だからと言って、私の言語は即応かというと、作り方いかんで幾らでも遅く 作れますし、シングルスレッドでも作り方いかんでは早く処理できるし。  マルチスレッドの方が融通は利きますが、その件は本質ではないと思います。 「非同期処理」だとイメージが違ってくるんです。掲示板で説明するのは難しい ので、作ったソフトを動かしてもらえれば…、ずいぶん先になりますが…。  PS.終了だけを考えれば、私の言語は終了は遅いです。言語上のスレッドの 終了処理、VMスレッドの終了処理、その他組み込みスレッドの終了処理、 それぞれにリソースの開放処理等々、多分重い。  終了は結構大変です。問題なければ1秒以内に終わると思いますけど。 何か問題があって、タイムアウト待ちでもしようものなら。冷汗たらー
[この投稿を含むスレッドを表示] [この投稿を削除]
[1405] 言語のデバックシステム
投稿者:
2009/07/22 20:10:38

 下記に示すURLに言語デバックシステムのプロトタイプイメージが あります。 http://dl7.getuploader.com/g/yamamoto/1/lz_db.gif こんな感じのデバックシステムを作る予定。エラーが発生したら、 モニターにファイルと行を表示して修正ができます。ただし、行番号 はないので、好みのエディターを使いたい場合は編集を押押すか エディターを登録してそのエディターを起動します。  ファイルタブは、ファイルリストとファイルが表示され編集可能 です。簡単な修正ならここでできます。  関数のトレースとログ1はスレッド置きにタブが作成されるので、 トレースが混合してわけワカメにならない予定。タブは200まで自動 で増えるので問題なし。  システム情報のログはsysログに、自由に定義して使用可能なのが ログ2です。また、モニタ02がローカル変数とシステム変数のログ を表示します。全部でモニター2種、本体1を起動します。  通信はUDPを使うので、LAN内の他PCでモニターできます。  これはまだGUIを作ったものなので、これから詳細の実装です。 また、本体の表示部分はできていないので、真っ黒です。それ に、右上の実行・ステップ・ステップインのボタンはイメージで、 画像合成です。こんなボタンとシステムログが透過で表示される 予定。  久しぶりにC#触ったけど、ユーザーインターフェース作るのが簡単だった。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1403] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/22 03:33:57

回答が遅れましてすみません。 >でも、初期起動の中で必要なことを実行して、終了リターン >すれば、普通のスレッドと同じことが出来ます。 ここは了解です。 >違いは待機リターンが有りキュー待ち状態で待機できることです。 ここのところが、yieldとかwait()とかの方法ではいけないのかな、というのが 私の疑問です。 もちろん、yieldとかwait()とかで待つためには、VMがその状態を保持しなければ ならないので、固定数のネイティブスレッドのスレッドプールしか持たないのであれば 理解できます。これは前回 >固定個のスレッドプールを持っているようなので、それを使い切った場合を想定して >いるのでしょうか? うーん。 と書いたとおりです。 >これを説明しようとすると、とても長くなってしまいます。もしよろしけ >れば、「非同期協調処理」「非同期協調作業」「非同期分散処理」を検索 >していただければ嬉しいです。 一応検索はしたのですが、Googleでは普通に非同期処理の記事しか出てこなかった ような…… > 普通のスレッドを使用しないの理由は、起動するのも遅いし、終わる >のも遅い、非同期協調作業が出来るほど軽いものじゃないです。それに、 >キュー処理にはまったく対応していない。 脱線しますけど、よく言われるマルチスレッドのメリットで、GUIのスレッドを 処理のスレッドと分けておけば、ユーザの操作にすぐ反応できる、というのが ありますけど、じゃあ重たいページをIEで表示してしまった時、×ボタンですぐに 停止できるのかというと、さっぱり押せないことばっかりで……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1402] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/22 02:58:59

>P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを >付けて宣言するとローカル変数となる。」とあります。 >しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのは >かなり違和感があると思います。 確かにPerlのlocalはダイナミックスコープですから、CやJavaのローカル変数とは 挙動が異なります。とはいえグローバル変数とも明確に違うものだと思います。 以下のサンプルで、きっぱり再帰できていますし。 ================================================== &hoge(0); sub hoge { my $depth = shift; #print 'depth..' . $depth; if ($depth > 2) { return; } local $i; for ($i = 1; $i <= 3; $i++) { print ' ' x $depth . '$i..' . $i . "\n"; hoge($depth + 1); } } ================================================== 私の感覚だと、ダイナミックスコープの変数は、自分自身とそこから呼び出された 関数からしか見えないという点でローカルだと思うのですが、確かに単に 「localとかmyとかを付けて宣言するとローカル変数となる。」とだけ書いて しまうのは確かに乱暴かもしれません。まあでもここはPerl, Ruby, PHPそれぞれの 言語の特徴をさらりと書いているだけのところなので、正誤表に載せるような ことではないのでは、と思います。 後日、補足記事をWebに上げようかと思います。 >myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られた >のでしょう? 過去のある一時点において、多くの人が「ダイナミックスコープかっこいい!」と 思ったことがある、ということなのではないでしょうか。 http://hagi.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/tensai | 僕は、Schemeの開発こそ、コンピュータ・サ | イエンスの典型的なセンスの一つではないかと | 思うのである。それまでは、LISPの考案者 | McCarthyのまやかしともいえる「変数の動的な | スコープ」に、皆がだまされ続けていたわけで | ある。 http://www.rubyist.net/~matz/20041025.html#p01 | 歴史的にはLispは(少なくともインタプリタ処理系では)、ダイナミックスコープが | 当たり前だったのだが、SchemeやCommonLisp以来すっかりスタティックスコープの | 言語になってしまっている。ダイナミックスコープなら外側のローカル変数もごく | 自然に見える。変数名の重複にだけ気をつければ良い(そういう意味ではcondやcommの | ようなありふれた引数名は良くない)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1401] Re:「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/21 21:32:14

もう一つ間違いとは言い切れないのですが、気になったところがあるのでついでに書いておきます。 P85の補足「各言語のグローバル変数の扱い」のPerlの部分に「localとかmyとかを付けて宣言するとローカル変数となる。」とあります。 しかし、Cやjavaをおもに使っている人にとってlocalがローカル変数というのはかなり違和感があると思います。 例えば、localを使った次のようなプログラムだとおかしな結果になります。 =============================================================== #!/usr/bin/perl $hoge = "global"; &func_local; &func_my; sub print_hoge { print "hoge is $hoge\n"; } sub func_local { local $hoge = "local"; print "func_local: "; print_hoge; } sub func_my { my $hoge = "my"; print "func_my: "; print_hoge; } =============================================================== 上記のプログラムを実行すると出力結果は func_local: hoge is local func_my: hoge is global になります。 myをつけた変数はCのローカル変数と同じように使えますが、localをつけた変数はCのローカル変数とは違います。 ちなみに、「初めてのPerl 第3版」の4.7 local演算子には「しかしlocalという名前は間違っています---あるいは、少なくとも、誤解を招く名前です。(中略)そうです、local変数と呼ばれる変数の正体は、実はグローバル変数なのです!」と書かれています。 myがない頃はlocalが使われていたそうですが、なぜmyより先にlocalが作られたのでしょう? 実装が楽だったとかなのでしょうか。 Cより新しい言語なのにCと同じローカル変数が使えなかったというのはどうなんだ・・・。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1400] Re:「プログラミング言語を作る」について
投稿者:(ぱ)こと管理人
2009/07/21 03:04:21

「名無しの読者」様 >「プログラミング言語を作る」を読ませていただきました。 >前橋さまの本は「C言語 ポインタ完全制覇」から読んでいるのですが、 >今回もおもしろい内容でした。 ありがとうございます。 >と書かれていますが、「Javaならファイナライザ、C++やC#なら・・・」の >間違いではないでしょうか? ご指摘ありがとうございます。正誤表に載せておきました。 普通に読んで変だと思う(たとえJavaやC++やC#をまったく知らなかったとしても!)であろう 文章であるにもかかわらず、チェック時に見落とすとは、人間の思い込みとは 侮れないものです……
[この投稿を含むスレッドを表示] [この投稿を削除]
[1399] 「プログラミング言語を作る」について
投稿者:名無しの読者
2009/07/20 15:43:49

前橋さま 「プログラミング言語を作る」を読ませていただきました。 前橋さまの本は「C言語 ポインタ完全制覇」から読んでいるのですが、 今回もおもしろい内容でした。 ところで、ミスプリントらしい部分を見つけました。 303ページの補足「ファイナライザというかデストラクタというか」の第1パラグラフに 「Javaならデストラクタ、C++やC#ならデストラクタというメソッドが呼び出されます。」 と書かれていますが、「Javaならファイナライザ、C++やC#なら・・・」の 間違いではないでしょうか? まだ、正誤表には載っていなかったようなので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1398] Re:マルチスレッドについて
投稿者:
2009/07/19 23:45:20

以下の2行がミスです > なぜこうしたのかは、真に意味で完全な非同期協調処理をするためです。   ↓ > なぜこうしたのかは、真の意味で完全な非同期協調処理をするためです。 > この説明で、疑問に答えられてのかまったく持って不安です。   ↓ > この説明で、疑問に答えられたのかまったく持って不安です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1397] Re:マルチスレッドについて
投稿者:
2009/07/19 10:35:19

>「終了指示」を含めると8回になるように思えるのですが……  タイマ表示関数に終了指示の処理がありますが、それのデバックのために 書いた部分が残っていました。このプログラムでは終了指示は出していない ので、7回です。 終了待ちをする関数コール > rtn[0] = スレ終了待ち(sid[0],終了待ち,10); 終了指示を出し終了を待ちをする関数コール > rtn[0] = スレ終了待ち(sid[0],終了指示待ち,10);  出したプログラムは上のコールを使っていました。 誤解を与えるようなプログラムですみません。 >私が不思議なのは、なぜユーザプログラムの側をこのように細切れに >呼び出さなければならないのか、ということです。ユーザプログラムが >自ら処理を明け渡す必要がないことが、マルチスレッドの利点だと思う >のですが。  一般的なマルチスレッドと、私が組み込みたいマルチスレッドは性格が 少し違います。でも、初期起動の中で必要なことを実行して、終了リターン すれば、普通のスレッドと同じことが出来ます。違いは待機リターンが有り キュー待ち状態で待機できることです。  なぜこうしたのかは、真に意味で完全な非同期協調処理をするためです。 これを説明しようとすると、とても長くなってしまいます。もしよろしけ れば、「非同期協調処理」「非同期協調作業」「非同期分散処理」を検索 していただければ嬉しいです。いいHPでもあれば紹介するのですが、 びみょーに全部専門的で、びみょーに違うので。  簡単に言うと、真のマルチ処理(複数CPU)環境における、同期処理を 必要としないで協調してひとつの処理を実行する。ああ、言葉を長くした だけだ。orz  私はそれを、理論的に構築しようと思っているわけではなく、今のプロ グラミングパラダイム、この場合一番単純なC言語ライクな関数言語パラダ イムの上で、実際的に動くものを構築しようとしている、実利主義的に 泥臭いことをやっているわけです。動けばなんでもOK、きれいな理論なん て求めてません。^^ 的な立場で作っています。 (動けばなんでもOKだから、シートなんて取って付けた物を使うあたりが)  orz orz  その目的に必衰だったのが、今回のスレッドの仕様です。  普通のスレッドを使用しないの理由は、起動するのも遅いし、終わる のも遅い、非同期協調作業が出来るほど軽いものじゃないです。それに、 キュー処理にはまったく対応していない。  この説明で、疑問に答えられてのかまったく持って不安です。 もしよろしければ、説明不足な点をご指摘ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1396] Re:マルチスレッドについて
投稿者:(ぱ)こと管理人
2009/07/18 23:59:26

まず訂正です。 >>その「タイマ表示」関数は、引数のqidを順に >>変えながら、3回呼び出されているように見えますが……(そして毎回、自ら >>returnしている) 3回ではないですね。指定回数分だけqidが「タイマ」で呼び出されるのだろう、 ということは前回投稿時も認識していたはずですが、書き損じました。 >例えば、6回実行のスレは、初期1回とタイマー6回で、合計7回実行 >しています。 「終了指示」を含めると8回になるように思えるのですが…… それはさておき。 私が不思議なのは、なぜユーザプログラムの側をこのように細切れに呼び出さなければ ならないのか、ということです。ユーザプログラムが自ら処理を明け渡す必要が ないことが、マルチスレッドの利点だと思うのですが。 確認ですが、「スレ開始」(#defineをはがした実体はthread_start)は、山さんの 言語自体が提供しているシステム関数的なものですよね? そして、「タイマ表示」は、ユーザプログラマが作成することを想定したものですよね? マルチスレッドというのなら、ユーザのプログラムがreturnすることで処理を 手放さなくても、別のスレッドは動くわけですから、こんなふうに細切れに 呼び出さなくてもよいと思うのですが。この形式だと、ユーザプログラムは、 毎回カウンタを見て処理を切り替える必要があります。 固定個のスレッドプールを持っているようなので、それを使い切った場合を想定して いるのでしょうか? うーん。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1395] Re:マルチスレッドについて
投稿者:
2009/07/18 00:47:27

>2:キュー処理開始 vm=3 procid=0 Qid=1 p1=999 >2:キュー処理開始 vm=4 procid=1 Qid=1 p1=6 >2:キュー処理開始 vm=2 procid=2 Qid=1 p1=5 >2:キュー処理開始 vm=0 procid=3 Qid=1 p1=4 >2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 >2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 >2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=2 procid=3 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 >2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1  こ、これはVM1の実行が多い… タイマ処理が周期に比べて短くなったので、VMの待機状態が多くなったのでしょう。 その結果、VM1がキューをGETしやすいタイミングになったのではないかと思わ れます。VM3はmainが占有しているので。私のPCはデュアルなので、たまたま VM1が、空きCPUに割り振られたのかもしれませんね。  面白い結果だと思います。もう少し重くなれば結果的にCPUの処理に対して 均等に負荷が割り振られるでしょう。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1394] Re:マルチスレッドについて
投稿者:
2009/07/18 00:37:21

連投すみませんです。 このタイミングでスレを起動したときの実行結果です デバックトレースはそのままです。それらしい出力になったと思いますよ。   sid[0] = スレ開始("タイマ表示",200,6," 200ms"," で6回実行");   sid[1] = スレ開始("タイマ表示",300,5," 300ms"," で5回実行");   sid[2] = スレ開始("タイマ表示",400,4," 400ms"," で4回実行");   ↓   ↓   ↓ 3:### スレッド起動 ### 3: sid[0] =1 sid[1] =2 sid[2] =3 3:眠る前 ms=36239130 3:タイマ表示スレッド開始 SID=1 QID=1 回数=6 200ms で6回実行 3:タイマ表示スレッド開始 SID=2 QID=1 回数=5 300ms で5回実行 3:タイマ表示スレッド開始 SID=3 QID=1 回数=4 400ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=1 200ms で6回実行 3:眠る後 ms=36239440 3:タイマ表示 SID=2 QID=2 cnt=1 300ms で5回実行 3:タイマ表示 SID=3 QID=2 cnt=1 400ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=2 200ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=2 300ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=3 200ms で6回実行 3:タイマ表示 SID=3 QID=2 cnt=2 400ms で4回実行 3:タイマ表示 SID=1 QID=2 cnt=4 200ms で6回実行 3:タイマ表示 SID=2 QID=2 cnt=3 300ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=5 200ms で6回実行 3:タイマ表示 SID=3 QID=2 cnt=3 400ms で4回実行 3:タイマ表示 SID=2 QID=2 cnt=4 300ms で5回実行 3:タイマ表示 SID=1 QID=2 cnt=6 200ms で6回実行 3:タイマ表示スレッド終了 SID=1 QID=2 3:タイマ表示 SID=2 QID=2 cnt=5 300ms で5回実行 3:タイマ表示スレッド終了 SID=2 QID=2 3:タイマ表示 SID=3 QID=2 cnt=4 400ms で4回実行 3:タイマ表示スレッド終了 SID=3 QID=2 3: rtn[0] =0 rtn[1] =0 rtn[2] =0 3:### 全スレッド終了 ### 2:### システム開始----- 2:### 組込み関数登録処理開始----- 2:### 組込み関数登録処理終了----- 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=0 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=1 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=2 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=3 2:### CL_VMexeスレッド 開始 2:スレッドRUN開始 vmid=4 2:### コンパイル初期化処理開始----- 2:### コンパイル開始----- 2:### コンパイル終了----- 2:### コンパイルの総てのリソースを開放----- 2:キュー処理開始 vm=3 procid=0 Qid=1 p1=999 2:キュー処理開始 vm=4 procid=1 Qid=1 p1=6 2:キュー処理開始 vm=2 procid=2 Qid=1 p1=5 2:キュー処理開始 vm=0 procid=3 Qid=1 p1=4 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=2 procid=3 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=4 procid=1 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=2 Qid=2 p1=1 2:キュー処理開始 vm=1 procid=3 Qid=2 p1=1 2:スレッドRUN終了 vmid=3 2:スレッドRUN終了 vmid=1 2:スレッドRUN終了 vmid=0 2:スレッドRUN終了 vmid=2 2:スレッドRUN終了 vmid=4 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:### CL_VMexeスレッド 終了 2:### CL_VMexeスレッドハンドルをクローズしました 2:#debugMsg 残っているメモリーを開放 66 66 2:#debugMsg 残っている配列メモリーを開放 26 26 2:### システム終了----- 2:### CL_systemスレッド 終了 2:### CL_systemスレッドハンドルをクローズしました 2:### ダミーmain終了-----
[この投稿を含むスレッドを表示] [この投稿を削除]
[1393] Re:マルチスレッドについて
投稿者:
2009/07/17 21:55:22

ミスです… orz >  初期化とパラメーターをセーブして、待機終了 returnする >  初期化とパラメーターをセーブして、待機returnする
[この投稿を含むスレッドを表示] [この投稿を削除]
[1392] Re:マルチスレッドについて
投稿者:
2009/07/17 21:31:11

 追記の追加。  このプログラムは、周期タイマーを例に挙げていますが。本来の使い方は、 メッセージキューによる、完全非同期協調作業のための機能です。 おもに、スレが起動されたらすぐにキュー待ちになり。作業要求が来たら 処理するためにあります。仮にスレッドが100有っても、キュー待ち状態 のときは、CPU負荷が0なのでなんら問題は有りません。  う~~これ以上は、絵に描いた餅になりそうなのでこれで終わって。 実物のソフトで示して行きたいと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1391] Re:マルチスレッドについて
投稿者:
2009/07/17 20:40:51

 追記、オンメモリーだけでも切り替わりのタイミングを調べるのは困難かも しれない。切り替わったことを調べるためには、それぞれのタイミングで どこかにその情報を書くのですが、書き先は順番が分かるために共通の場所に 書かなくてはいけないのだけど、共通の場所とは、セマホ等で排他処理をする わけで、排他処理の時点でスレッドが切り替わってしまうので。意味が無い。  物理的に信号監視できるICEがほしいと思ってしまう。^^ まあ問題が起こらなければ、いつ起ころうが関係が無いですけどね。
[この投稿を含むスレッドを表示] [この投稿を削除]