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
  • こんにちは。8aまでとても楽しく読ませていただきました。細かいところは異なりますが、Rustで実装してみました。 -- tamaron 2021-10-31 (日) 22:51:13
  • https://github.com/tamaroning/haribote-lang (文字列は実装していないです) -- tamaron 2021-10-31 (日) 22:52:15
  • おおお!ついにRust版での実装例が!! tamaronさん、どうもありがとうございます! -- K 2021-11-12 (金) 16:48:49
  • いつの間にかRustによる実装がっ! 先々、私も参考にさせてもらうことがあると思います。tamaronさん、ありがとうございます。 -- Masahiro Oono 2021-12-14 (火) 23:03:31
  • 再読中にタイポを見つけましたので報告いたします。a21_txt01_2「(1) HL-2」にて、「TL-1では変数名も数値定数も1文字しか受け付けないという仕様でした」と書かれている箇所の処理系のバージョン表記が「HL-1」ではなく「TL-1」とTLシリーズのものになっています。お手すきの際にご確認願います。 -- Masahiro Oono 2021-12-14 (火) 23:03:55
  • おお、ご指摘ありがとうございます! -- K 2021-12-15 (水) 07:56:49
  • 私はインタプリタ編の処理系を、いけるところまでSwiftで実装してみようと思います。区切りが良いので、各ブランチにHL-1からHL-4までを置いてMIT Licenseで公開しました。https://github.com/ready-player1/machete -- Masahiro Oono 2021-12-23 (木) 19:04:17
  • ところで前回、C言語で実装しながら続編を読んだ際に、「違いが少ないほうが理解が早まるだろうと思って頑張りました!」と書かれているのを読んで、すごい!ほんとうだ!と興奮しながら手を動かしました。 -- Masahiro Oono 2021-12-23 (木) 19:05:11
  • それが印象に残っているので、今回のSwiftでの実装も、オリジナルを読んだ人であれば何をしているかが把握しやすいコードになるといいなぁ、と念じながら書いています(特にLexerまわりは頑張りました)。 -- Masahiro Oono 2021-12-23 (木) 19:07:16
  • おお、ありがとうございます!! -- K 2021-12-23 (木) 23:37:28
  • HL-6aまでの感想を、いままさに言語自作入門を読んでいる人たちと雑談しているような気持ちで書いてみました。https://masahiro-oono.hatenadiary.com/entry/2022-02-05 -- Masahiro Oono 2022-02-05 (土) 11:35:36
  • これは力作!読ませますねー!!どうもありがとうございます! -- K 2022-02-06 (日) 01:55:42
  • 私が実行速度にこだわってHLシリーズを書いていたというのはまさにご推察の通りです。私は「高速な言語は難しいことをしなければ達成できない」と誤解されるのが嫌だったのです。むしろ余計なことをしなければ速くなるはずなのです。だからある程度までは、高速性と処理内容の単純化は両立するはずですし、処理内容が単純なら理解しやすくなるはずなのです。何とか最後までその信条を貫き通せてよかったです! -- K 2022-02-06 (日) 02:17:32
  • この「10日くらいでできる!プログラミング言語自作入門」を読むと、「インタプリタもJITコンパイラも普通のコンパイラもある程度の共通の構造があって、それがおそらく言語処理系の本質なんだ」という感想を持つでしょう。それは私がそう思っていて、それが伝わるように書いているので、そう感じるのです。・・・でもそれが本当に正しい理解かどうかは分かりません。もしかしたら、インタプリタにはインタプリタの、JITコンパイラにはJITコンパイラの最適な構造というのがそれぞれあって、それに沿って作ればもっとシンプルで分かりやすい構造になるかもしれません。私はそこまでは分からないので、この議論は私より頭の良い人たちに任せたいと思っています(きっと私が考えるよりも、共通の構造にしないほうがいいと思う人が作って見せるほうが、より早く深い理解に到達できると思います)。 -- K 2022-02-06 (日) 10:25:16
  • 本日も興味深く拝読しています。一点報告いたします。a21_txt01_7の「(3) 式の評価について」の最後から2つ目の項目にて、「そして最後に、iにkを代入します。これは、「ここまでの計算結果が入っている変数」がkに変わったということです」と書かれています。しかし、変数kについて当該項目の3つ上の項目にて、加算結果を入れるために適当な一時変数として準備したと説明されていますので、「kに変わった」の箇所は(一時変数kから)「iに変わった」と書いても意味が通りそうです。 -- Masahiro Oono 2022-05-04 (水) 19:05:54
  • 「(3) 式の評価について」の節の他の説明で、プログラムが何をしているかということはしっかり読者に伝わると思われますが、この表現だけが少し気になりましたので念のために報告することにしました。「kに変わった」という表現が意図したものであるか、お手すきの際にご確認願います。 -- Masahiro Oono 2022-05-04 (水) 19:06:24
  • 読み返してみて、確かにそこはあいまいな書き方だなと私も思いました。直してみました。ご指摘ありがとうございます! -- K 2022-05-05 (木) 06:18:56
  • お忙しい中ご確認いただきありがとうございます。該当箇所が変更されていることを確認しました。よりわかりやすくなったと思います! -- Masahiro Oono 2022-05-06 (金) 23:59:05
  • 再読中にタイポを見つけましたので報告いたします。a21_txt01_8の「(5) OpGoto最適化について」にて、はりぼて言語のコードの「if (i % 7 == 0) {」に対応する閉じカッコが「]」になっています。お手すきの際にご確認願います。 -- Masahiro Oono 2022-05-06 (金) 23:59:37
  • ありがとうございます。修正しました! -- K 2022-05-08 (日) 06:15:03
  • JITコンパイラ編に続く新たな続編(機能追加編?)を大変興味深く拝見しています。本当にこの続編は私の嗜好にぶっ刺さる内容で、読みながらテンションが上がりっぱなしです! ひとまずa22_txt03_1bまでの内容を試し、私の処理系でもdoubleが使えるようになったところです。お忙しい中、テキストを作成いただき誠にありがとうございます。 -- Masahiro Oono 2022-08-26 (金) 12:49:21
  • 一点報告いたします。a22_txt03_1aの「(2-3) double用の一時変数を整備(2)」の「after」のソースコードにて、tmpAllocDbl関数の本体に「varTyp[i] = TypDbl;」という行があります。このvarTypの添字は「i + TcTmpDbl0」としなくてもよろしいでしょうか。a22用のBBSが見当たりませんでしたので、a_21_bbs01にて報告することにしました。お手すきの際にご確認願います。 -- Masahiro Oono 2022-08-26 (金) 12:50:22
  • 確認しました。確かに varTyp[i + TcTmpDbl0] = TypDbl; とすべきです。とても助かりました。ご指摘ありがとうございます! -- K 2022-09-05 (月) 00:03:04
  • (不具合が直ったかどうかのテスト書き込み。) -- K 2022-09-15 (木) 21:15:55

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-09-15 (木) 21:15:55 (1423d)