a21に関する簡易掲示板#1

  • (by K, 2021.01.27)
  • コメントを書き込む際には、「NameLink」の欄をチェックしないままで「コメントの挿入」ボタンを押してください。

  • 感想や意見、質問など、どうぞお気軽にご利用ください。 -- K 2021-01-27 (水) 17:24:23
  • ご無沙汰してます。ちょうどよい課題と思いまだ序盤ですがHL-2までbashで実装してみています。 https://gist.github.com/gamix255/0b1eae0fcf538f12bfe5c4de5aa1f116 -- gamix255 2021-03-29 (月) 21:57:22
  • 興味深いテキスト及び実装を公開していただき感謝です! -- gamix255 2021-03-29 (月) 21:58:08
  • おお、ありがとうございます! 活用してもらえてとてもうれしいです!! -- K 2021-03-29 (月) 23:16:47
  • しかしbashで実装っていうのはすごいなあ。私の発想では絶対に出てこない。勉強になります。 -- K 2021-03-30 (火) 17:28:11
  • 本当はposix shellで挑んでみたかったのですが、今回の内容ならbashの方がまだ近道と考えました。 -- gamix255 2021-03-30 (火) 20:27:32
  • ソースの見た目が悪いのは私の問題と思っています。今日も通勤中に抜けていた処理を追加しましたが、シェルスクリプトならではのミスをしてしまいました。修正します。 -- gamix255 2021-03-30 (火) 20:27:50
  • gamix255さんのHLシリーズのbash版開発プロジェクトが、なんとHL-4まできている!・・・やっぱりREPLは楽しいですよね!! -- K 2021-04-06 (火) 10:57:15
  • 確認&言及ありがとうございます!本当はbash自体普段からREPLそのものの中で生活していると言えますし、スキップするか迷いましたがやって見ると、REPLは楽しいです! -- gamix255 2021-04-07 (水) 08:19:46
  • HL-5もbash では速くならないし、速さをモチベーションとしていないですし、記述も慣れてきたので少し迷いましたが、もうちょっと後のステップまで進めるなら似た感じにしておくほうが楽なので何パターンか考えて、試し始めたところです。 -- gamix255 2021-04-07 (水) 08:22:22
  • はじめまして。a21_txt01を楽しく読んでいます。公開いただきありがとうございます! -- Masahiro Oono 2021-04-11 (日) 18:39:38
  • 一点報告いたします。a21_txt01_6aにて、ソースコードの1行目に`OpLop`が2つ定義されています。お手すきの際にご確認願います。 -- Masahiro Oono 2021-04-11 (日) 18:40:14
  • お知らせありがとうございます!正しく修正いたしました。 -- K 2021-04-13 (火) 00:53:17
  • プログラミング言語の本質を理解するには、BNFや操作的意味論、型理論などを理解することも念頭に置かれると良いと思います。Prologで一階述語論理を理解しながら作ってみるといいのではないかと思います。https://github.com/hsk/newlang2018/tree/master/prolog こんな感じでw -- h_sakurai 2021-04-22 (木) 22:54:09
  • 適切なアドバイスをありがとうございます。実は最初はそういう路線も少し検討していました。しかし結局その路線だと私じゃない人が説明したほうがずっとうまくできそうで、私が今やる必然性は薄いと思い、まずは私らしい方法を極めてみることにしました。私らしい方法とは、私はプログラムを単純化して小さくすることが得意なので、とにかく小さく小さく作って、それで残ったものを「本質」とみなしてみよう、というやり方です。 -- K 2021-04-22 (木) 23:03:41
  • 本日も興味深く拝読しました。一点報告いたします。a21_txt01_8aにて、compile関数内の「// コンマ以外のトークンを数える.」とコメントが付いた行の2行下から「// } と ; の分.」とコメントが付いた行の3行上までの間のインデントの位置が若干不自然に感じます。現状の位置が意図したものであるか、お手すきの際にご確認願います。 -- Masahiro Oono 2021-04-25 (日) 18:28:25
  • ありがとうございます。これは途中で二度間違ったせいで、間違いに気づけないパターンでした。教えてもらえて助かりました! -- K 2021-04-26 (月) 11:34:13
  • 本日も興味深く拝読しました。一点報告いたします。a21_txt01_9にて、exec関数内のswitch文の定数式に`OpPrm`が記述されていません(その他の新規に追加された`OpOpnWin`以下のopcodeが、当該箇所に全て記述されていることもあわせて確認しました)。お手すきの際にご確認願います。 -- Masahiro Oono 2021-04-28 (水) 18:03:57
  • これはいい質問です。まずそれは間違いではありません。OpPrmはパラメータが4個よりも多い時に使う特別な命令なのですが、通常ではそれは読み飛ばされるので、それがswitchに引っかかることはないはずなのです。もしswitchでOpPrmにひっかかるようだと、それは言語処理系がバグっている場合だと思われます。ということで、行数をケチるために、OpPrmは記述していなかったのです。 -- K 2021-04-28 (水) 20:48:50
  • お忙しい中、ご確認・ご回答いただきありがとうございます。`OpPrm`はパラメータが4個よりも多い時に使う特別な命令という仕様を理解いたしました。引き続き読み進めていきます。ありがとうございました! -- Masahiro Oono 2021-04-28 (水) 21:31:40
  • Masahiro Oonoさんが着々と進めてくれるので、私のテキストの問題点が見つかって、非常にありがたいです! -- K 2021-05-01 (土) 23:15:15
  • 楽しみに拝読していますので、微力ながら当コンテンツの作成に貢献できていれば幸いです。 -- Masahiro Oono 2021-05-02 (日) 12:37:02
  • 一点報告いたします。私はmacOS (Catelina 10.15.7) で、Homebrew経由でsdl2を入れた上で(https://formulae.brew.sh/formula/sdl2)aclライブラリを利用しています。上記の環境において、a21_txt01_9のグラーデーションを表示するサンプルおよびa21_txt01_9aのmaze.cを実行すると、黒く塗りつぶされたウィンドウが一瞬表示された後すぐに閉じてしまい実行が終了します(mandel.cは黒く塗りつぶされたウィンドウがしばらく表示され続けますが、ターミナルにtimeが表示された直後にやはり終了します)。ソースコードの末尾にmsを指定して`aWait(3000);`などと書いておくと、その間、グラフィックが描画された状態でウィンドウが表示されますので、そのように書いて対応しました。報告の一部はaclib_bbsの方に書くべきか迷いましたが、読みにくくなるかもしれないと考えてこちらにまとめて書きました。 -- Masahiro Oono 2021-05-02 (日) 12:42:32
  • ご連絡ありがとうございます!後日調査します。 -- K 2021-05-02 (日) 13:29:37
  • 区切りが良いのでインタプリタ編のソースコード(オリジナルと同じくC言語で書いています)をアップしました。https://github.com/ready-player1/haribote -- Masahiro Oono 2021-05-06 (木) 21:38:00
  • どうもありがとうございます! -- K 2021-05-06 (木) 22:55:54
  • こちらこそありがとうございます。本当に楽しい10日間【くらい】でした! -- Masahiro Oono 2021-05-07 (金) 13:54:16
  • 一点確認させてください。オリジナルバージョンに適用されているライセンスは何でしょうか? もしオリジナルバージョンのライセンスと抵触しなければ私のソースコードはMIT Licenseで公開しようと考えています。 -- Masahiro Oono 2021-05-07 (金) 13:55:06
  • おおこれもいい質問です。私はHLシリーズの派生物に対して一切の権利を主張しません。ですからMITライセンスを設定いただいても大丈夫です。 -- K 2021-05-07 (金) 14:00:13
  • ありがとうございます。MIT Licenseで公開いたしました。ご丁寧に回答いただきありがとうございました。 -- Masahiro Oono 2021-05-07 (金) 16:43:44
  • 再読中にタイポを見つけましたので報告いたします。21_txt01_7の演算子一覧にて、形式「--j」の名前が「後置デクリメント演算子」と表記されています。お手すきの際にご確認願います。 -- Masahiro Oono 2021-06-15 (火) 17:25:53
  • おお、ご指摘ありがとうございます!自分ではなかなか見つけられないので助かります。 -- K 2021-06-17 (木) 23:51:35
  • とんでもないです。こちらこそコンテンツを公開いただいたことにいつも感謝しています。一点報告いたします。a21_txt02_4にて、「[1]putIcX86_sub()関数の前に以下を追加」のソースコードの下から2行目と3行目のインデントが若干不自然に感じます。現状の位置が意図したものであるか、お手すきの際にご確認願います。 -- Masahiro Oono 2021-06-24 (木) 16:38:07
  • おおっと、確かにこれはおかしいです。修正しました。どうもありがとうございます! -- K 2021-06-25 (金) 02:03:34
  • 本日も興味深く拝読しています。些細な内容で恐縮ですが一点質問させてください。a21_txt02_4aにて、putIcX86関数の%拡張命令で使用する文字「L」と「S」は、例えば「RegisterのR」 のように何らかの用語の頭文字なのでしょうか? -- Masahiro Oono 2021-06-25 (金) 16:15:43
  • Lはレジスタへのロード、Sはレジスタからのストア、という思い付きで作っていました。 -- K 2021-06-29 (火) 14:44:28
  • 今気づいたのですが、LとSの組み合わせって、ロード・ストアのほかにも、ラージ・スモール、ロング・ショートなど、いろいろありますね! -- K 2021-06-29 (火) 14:50:39
  • ロード/ストアの頭文字だったのですね、ありがとうございます! 私ははりぼて言語の処理系の実装を通じて初めて機械語に触れました。特にJITコンパイラ編ではModR/Mバイトのregフィールドのビットの操作が興味深く、IA-32のソフトウェア・デベロッパーズ・マニュアルを適宜参照しながら書いています。そのため深読みしすぎて気づくことができませんでした。もっとソースをしっかり読んで、やっていることを深く理解できるように努めます。 お忙しい中、ご回答いただきありがとうございました。 -- Masahiro Oono 2021-06-30 (水) 08:08:18
  • そこまで丁寧に読んでいただけて、本当にありがたいです!! -- K 2021-06-30 (水) 14:24:14
  • 一点報告いたします。私のバージョンのHL-14aで「regVar(0,i); i=i+1;」と書いたプログラムを実行した際、無限ループが発生することを確認しました。本件について調査したところ、a21_txt02_4aの「[2]putIcX86_sub()関数に書き足し&変更」のソースコードの「if (s[i + 2] == 'S') {」のブロックにて、「if (r == 0) {」のブロックの中に書かれている「i += 3;」をブロックの外に書いたところ正常に動作することを確認しました。同様の現象がオリジナルバージョンでも発生する可能性があります。お手すきの際にご確認願います。 -- Masahiro Oono 2021-07-03 (土) 08:11:50
  • ご指摘ありがとうございます。確認してみました。
                if (s[i + 2] == 'S') {
                    if (r == 0) {
                        k = 0;
                        *icq = 0x89;
                        icq++;
                        i += 3;
                        goto subcmd_m;
                    }
                }
                if (s[i + 2] == 'i') {	// int.
                    (中略)
                }
                if (s[i + 2] == 'c') {	// char.
                    (中略)
                }
                if (s[i + 2] == 'r') {	// relative.
                    (中略)
                } 
                if (s[i + 2] == 'l') {	// label.
                    (中略)
                }
                i += 3; // ← (s[i + 2] == 'S') && (r != 0) のときはここへ落ちて無事に処理される
            } else {
                (中略)
            }
        }
    }
  • というように処理されて、オリジナル版ではそのままでもうまく動いているようです。 -- K 2021-07-03 (土) 16:07:18
  • ご確認いただきありがとうございます。「無事に処理される」というコメントでご教示いただいた箇所を再度確認したたところ、私が間違えていました。大変失礼いたしました。 -- Masahiro Oono 2021-07-03 (土) 22:13:53
  • 私のバージョンでは、オリジナルでは「if (s[i + 2] == 'S') {」と書いている分岐処理を「switch (str[pos + 2]) {」で分岐させているのですが、条件式「case 'S':」に対応する処理の末尾に「continue;」と書いていたために、ご教示いただいた箇所に到達していないことが原因で発生している問題でした。 -- Masahiro Oono 2021-07-03 (土) 22:15:36
            continue;
          case 'S': // Store
            if (regCode == 0) {
              reg = 0;
              *ip = 0x89;
              ++ip;
              putModRM(reg, addVal, operands[i]);
              regCode = 0;
              //pos += 3;
            }
            //continue; <- breakに書き換え
            break;
          case 'i': // int
            (中略)
            break;
          case 'c': // char
            (中略)
            break;
          case 'r': // relative
            (中略)
            break;
          case 'l': // label
           (中略)
            break;
          }
          pos += 3;
        }
  • と書き直したところ、オリジナルと同様に「i += 3;」をブロックの外に書かない場合でも正常に動作することを確認いたしました。お忙しい中、ご確認・ご教示いただき誠にありがとうございました。 -- Masahiro Oono 2021-07-03 (土) 22:17:58
  • なんのなんの、お安い御用です! -- K 2021-07-03 (土) 23:48:31
  • 本日も拝読しています。些細な内容で恐縮ですが、a21_txt02_5aについて一点質問させてください。「optimizerX86()関数の中(8b用)」や「optimizerX86()関数の中(0f_af用)」に記述されている「(reg * 9 + 0xc0)」は、ModR/Mバイトのregフィールドとr/mフィールドに、変数regの値をセットしているという理解でよろしいでしょうか? -- Masahiro Oono 2021-08-22 (日) 19:33:47
  • 「* 9 って何だろう?」と考えた末に、「r/mフィールドの値がregフィールドの値と等しいということかな」と思い付きましたが、確信を持つに至らず質問しました。お手数をおかけして申し訳ありませんが、ご教示くださいますと幸いです。 -- Masahiro Oono 2021-08-22 (日) 19:34:54
  • 全くその通りです! *1 と *8 を足して、 *9 になっているのです。 -- K 2021-08-23 (月) 15:49:29
  • (Masahiro Oonoさんが書き込んでくれると、いつもなんだか楽しい気分になります!ありがとうございます!) -- K 2021-08-23 (月) 16:00:12
  • ありがとうございます! 下位3ビットと真ん中の3ビットに値をセットする記述なのですね。少しずつですが以前より読めるようになってきている気がして嬉しいです。お忙しい中、ご教示いただき誠にありがとうございました。 -- Masahiro Oono 2021-08-24 (火) 01:25:15
  • 先日、「10日くらいでできる!プログラミング言語自作入門」の続編のx86用の記事をa21_txt02_6aまで読み終えました。JITコンパイラ編を読み始めて機械語が出てきた時は、正直若干怯んでしまいましたが、公開いただいているソースコードをじっくり読むことで、なんとか自分のバージョンを実装することができました。ありがとうございました! -- Masahiro Oono 2021-08-27 (金) 21:12:20
  • 続編の内容とは関係がないのですが、本掲示板の書き込みについて一点質問させてください。私がPukiWikiの仕様を把握していなかったために汚してしまった以前の自分の書き込みを修正してもよいでしょうか? ルールがよく分かりませんでしたので、事前に質問させていただきました。 -- Masahiro Oono 2021-08-27 (金) 21:13:10
  • 修正はOKです! -- K 2021-08-27 (金) 22:32:11
  • 「なんとか自分のバージョンを実装することができました。」おめでとうございます!! -- K 2021-08-27 (金) 22:32:51
  • そしてここのやり方が参考になりましたという報告は、何よりもありがたいです(私はどこかに大きなミスがあったりはしないかと心配してたのです)。どうもありがとうございます! -- K 2021-08-27 (金) 23:01:41
  • 過去の投稿を修正しました。今後も拝読するのが楽しみです! 区切りが良いのでJITコンパイラ編のソースコード(x86用のみ)を公開しました。https://github.com/ready-player1/haribote-x86-jit -- Masahiro Oono 2021-08-28 (土) 00:30:40
  • haribote-x86-jitの公開、どうもありがとうございます!! -- K 2021-08-28 (土) 06:47:43

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-08-28 (土) 06:47:43 (30d)