はじめに
本記事は日本語プログラミング言語Mind8のC言語で実装されているランタイムディスパッチャをC#で代替実装し、.NETのライブラリ資産を利用しやすくしたいという思惑の元に遂行されている企画の続きです。ただし現状はMind8が実装している基本的な言語仕様の部分で互換性を実装するところで難航しているところです。前回の記事で検証用コンソールの完走点を確認しましたので、今回はそれに対してコードを追加します。
前提条件
Windows11 Pro 22H2
VSCode(Visual Studo Code) 1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 8.0.08 for Windows
C# 12
dotnet-sdk-8.0.204-win-x64
VSCodeの拡張機能
C/C++ for Visual Studio Code 1.18.5 Microsoft
C/C++ Extension Pack 1.3.0 Microsoft
.NET Install Tool 2.0.2 Microsoft
Base language support for C# 2.18.16 Microsoft
C/C++のデバッガはCで実装されているMind8kernelの動作をデバッグ実行で探るために使用します。こちらの記事の環境となります。
カスタマイズConsoleのビルド
Mind開発者の@killyさんよりご提供いただいた情報に従い、下記のようにカスタマイズConsoleのビルド用のフォルダfilelevel群を作成しています。
ビルド用フォルダ構成
現状は下記のようなフォルダ構成となります。filedummyフォルダは起動検証用Consoleのビルド環境です。fileフォルダは正規のソースファイルが格納されたフォルダです。
filedummyの内容はこちらの記事を、filelevel1,2(旧0)の内容はこちらの記事を参照してください。
C:\developments\vscode\mind8>tree
C:.
├─bin
├─file
│ └─obj
├─filedummy <--完走
│ └─obj
├─filelevel0 <--完走
│ └─obj
├─filelevel1 <--完走
│ └─obj
├─filelevel2 <--未完走
│ └─obj
├─filelevel3 <--完走
│ └─obj
├─filelevel4 <--完走
│ └─obj
├─filelevel5 <--未完走
│ └─obj
├─filelevel6 <--未完走
│ └─obj
├─kernel
│ └─.vscode
├─lib
├─libY
└─sample
filelevel5,6フォルダは本記事のバージョンの格納フォルダです。
お題のMindソースコード
前回の記事で「コンソール初期化・基本部」の定義部に独自に簡略化した「私のプログラム名と起動パラメータを設定0」を導入しています。
コンソール初期化・基本部とは (・ → ・)
(しばらくはシステムコールするな)
終了パラメータを クリアし ※CCONST.SRC
エラー文字列初期化し ※CERROR.SRC
空白文字列初期化し ※COUTPUT.SRC
エラー出力を本来の出力に切り替え ※COUTPUT.SRC
私のプログラム名と起動パラメータを設定0し
。
各ライブラリ初期化とは 本定義 (・ → ・)
コンソール初期化・基本部し ※本ソース示すること。
この範囲は今回の記事でも同じです。今回は「私のプログラム名と起動パラメータを設定0」の内容を変更しています。
下記は前回記事の状態です。
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換して次のアドレスを得て0
。
これに対して今回は
level5
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
アドレス1を バイトロードし ゼロ?
ならば 空列と 0を 返し
終り
つぎに
空列と 0を 返し
。
Mind文字列に変換0とは 処理単語 .N
(ASCIZアドレス → 文字列)
Mind文字列に変換して次のアドレスを得て0 捨てること。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換0して
捨てること
。
level6
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
空列と 0を 返し
。
Mind文字列に変換0とは 処理単語 .N
(ASCIZアドレス → 文字列)
Mind文字列に変換して次のアドレスを得て0 捨てること。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換0して
捨てること
。
としています。level5は欲張りすぎで結果的には動きませんでした。そこでlevel6でコード量を削減しました。が、こちらも動きませんでした。しかし、両者の実行結果からある仮説が導き出されました。
本来のお題のMind8のソースファイル
前回の記事を参照してください。
お題のMind8の中間コード実行リスト
今回は省略しました。
level5は 80ステップ。 lebel6は 74ステップでした。
level4は 70ステップです。
お題のMind8の中間コードのC#代替ディスパッチャ実行リスト
少し長くなりますが前回完走しているlevel4のソースコード状態も例示していますので、結果も参考掲示いたします。完走している状態とその後のlevel5,6の結果の違いを説明しやすくするためです。
level4
SqNo mcode mc(dec) mpoint dtp.point dtp+0 dtp+1 rtp.point rtp+0 rtp+1
1 8019 32793 114 1024 0 0 1024 0 0
2 002F 47 102 1024 0 0 1023 114 0
3 0012 18 8062 1024 0 0 1023 114 0
4 0036 54 8064 1024 0 0 1023 114 0
5 0080 128 8070 1024 0 0 1023 114 0
6 0036 54 8072 1024 0 0 1023 114 0
7 0070 112 8078 1024 0 0 1023 114 0
8 803A 32826 8080 1024 0 0 1023 114 0
9 002F 47 238 1024 0 0 1022 8080 114
10 80E8 33000 8058 1024 0 0 1022 8080 114
11 0036 54 8040 1024 0 0 1021 8058 8080
12 0071 113 8046 1024 0 0 1021 8058 8080
13 8046 32838 8048 1024 0 0 1021 8058 8080
14 8045 32837 326 1024 0 0 1020 8048 8058
15 0012 18 314 1024 0 0 1019 326 8048
16 0036 54 316 1024 0 0 1019 326 8048
17 0074 116 322 1024 0 0 1019 326 8048
18 0020 32 324 1024 0 0 1019 326 8048
19 0020 32 328 1024 0 0 1020 8048 8058
20 80A3 32931 8050 1024 0 0 1021 8058 8080
21 0036 54 3884 1024 0 0 1020 8050 8058
22 0012 18 3890 1024 0 0 1020 8050 8058
23 016E 366 3892 1024 0 0 1020 8050 8058
24 0020 32 3898 1024 0 0 1020 8050 8058
25 808F 32911 8052 1024 0 0 1021 8058 8080
26 0097 151 3626 1024 0 0 1020 8052 8058
27 0065 101 3628 1022 0 2 1020 8052 8058
28 0020 32 3634 1024 0 0 1020 8052 8058
29 80E7 32999 8054 1024 0 0 1021 8058 8080
30 0261 609 8034 1024 0 0 1020 8054 8058
31 80E6 32998 8036 1022 0 7878112 1020 8054 8058
32 001A 26 8026 1022 0 7878112 1019 8036 8054
33 006B 107 8028 1022 0 7878112 1017 0 0
34 0022 34 8032 1024 0 0 1017 7878112 0
35 0020 32 8038 1024 0 0 1020 8054 8058
36 0020 32 8056 1024 0 0 1021 8058 8080
37 0020 32 8060 1024 0 0 1022 8080 114
38 00A5 165 8082 1024 0 0 1023 114 0
39 803C 32828 8106 1022 20 8084 1023 114 0
40 002F 47 246 1022 20 8084 1022 8106 114
41 001A 26 5802 1022 20 8084 1022 8106 114
42 006E 110 5804 1022 20 8084 1020 8054 8058
43 0015 21 5808 1024 0 0 1020 20 8058
44 00ED 237 5810 1022 0 1 1020 20 8058
45 0022 34 5830 1024 0 0 1020 20 8058
46 00A5 165 8108 1024 0 0 1023 114 0
47 00C1 193 8126 1022 14 8110 1023 114 0
$$COLD_FORTH
48 0020 32 8128 1024 0 0 1023 114 0
49 80F3 33011 116 1024 0 0 1024 0 0
50 00A5 165 8578 1024 0 0 1023 116 0
51 8083 32899 8596 1022 14 8580 1023 116 0
52 0012 18 3510 1022 14 8580 1022 8596 116
53 004E 78 3512 1022 14 8580 1022 8596 116
54 00EC 236 3518 1020 0 0 1022 8596 116
55 0096 150 3524 1022 14 8580 1022 8596 116
56 026D 621 3526 1020 0 1 1022 8596 116
Hello by mind8
57 0020 32 3528 1024 0 0 1022 8596 116
58 0020 32 8598 1024 0 0 1023 116 0
59 801A 32794 118 1024 0 0 1024 0 0
60 002F 47 106 1024 0 0 1023 118 0
61 00A5 165 8156 1024 0 0 1023 118 0
62 00C1 193 8170 1022 10 8158 1023 118 0
実行終り
63 801B 32795 8172 1024 0 0 1023 118 0
64 002F 47 110 1024 0 0 1022 8172 118
65 00A5 165 8130 1024 0 0 1022 8172 118
66 00C1 193 8152 1022 18 8132 1022 8172 118
実行終り時の処理
67 0020 32 8154 1024 0 0 1022 8172 118
68 0012 18 8174 1024 0 0 1023 118 0
69 004E 78 8176 1024 0 0 1023 118 0
70 0014 20 8182 1022 0 0 1023 118 0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[11372] mind8dispatch.dll' がコード 0 (0x0) で終了しました。
続いてlevel5の結果です。これはちょっとわたし的には衝撃的で、けっこう思っていたより手前で動かなくなっていました。
level5
SqNo mcode mc(dec) mpoint dtp.point dtp+0 dtp+1 rtp.point rtp+0 rtp+1
1 8019 32793 114 1024 0 0 1024 0 0
2 002F 47 102 1024 0 0 1023 114 0
3 0012 18 8102 1024 0 0 1023 114 0
4 0036 54 8104 1024 0 0 1023 114 0
5 0080 128 8110 1024 0 0 1023 114 0
6 0036 54 8112 1024 0 0 1023 114 0
7 0070 112 8118 1024 0 0 1023 114 0
8 803A 32826 8120 1024 0 0 1023 114 0
9 002F 47 238 1024 0 0 1022 8120 114
10 80E9 33001 8098 1024 0 0 1022 8120 114
11 0036 54 8080 1024 0 0 1021 8098 8120
12 0071 113 8086 1024 0 0 1021 8098 8120
13 8046 32838 8088 1024 0 0 1021 8098 8120
14 8045 32837 326 1024 0 0 1020 8088 8098
15 0012 18 314 1024 0 0 1019 326 8088
16 0036 54 316 1024 0 0 1019 326 8088
17 0074 116 322 1024 0 0 1019 326 8088
18 0020 32 324 1024 0 0 1019 326 8088
19 0020 32 328 1024 0 0 1020 8088 8098
20 80A3 32931 8090 1024 0 0 1021 8098 8120
21 0036 54 3884 1024 0 0 1020 8090 8098
22 0012 18 3890 1024 0 0 1020 8090 8098
23 016E 366 3892 1024 0 0 1020 8090 8098
24 0020 32 3898 1024 0 0 1020 8090 8098
25 808F 32911 8092 1024 0 0 1021 8098 8120
26 0097 151 3626 1024 0 0 1020 8092 8098
27 0065 101 3628 1022 0 2 1020 8092 8098
28 0020 32 3634 1024 0 0 1020 8092 8098
29 80E8 33000 8094 1024 0 0 1021 8098 8120
30 0261 609 8072 1024 0 0 1020 8094 8098
31 80E7 32999 8074 1022 0 2151883808 1020 8094 8098
32 80E6 32998 8066 1022 0 2151883808 1019 8074 8094
33 001A 26 8026 1022 0 2151883808 1018 8066 8074
34 006B 107 8028 1022 0 2151883808 1016 0 0
35 0055 85 8032 1024 0 0 1016 2151883808 0
36 008F 143 8036 1022 0 2151883808 1016 2151883808 0
37 00ED 237 8038 1022 0 2151883808 1016 2151883808 0
38 0012 18 8054 1024 0 0 1016 2151883808 0
39 0052 82 8056 1024 0 0 1016 2151883808 0
40 0A74 2676 8058 1024 0 0 1016 2151883808 0
例外がスローされました: 'System.IndexOutOfRangeException' (mind8dispatch.dll の中)
続いてlevel6の結果です。level5のコードの後ろをけずったにも関わらず、同じような位置で止まっていますことから、ある仮設を思い浮かべます。
level6
SqNo mcode mc(dec) mpoint dtp.point dtp+0 dtp+1 rtp.point rtp+0 rtp+1
1 8019 32793 114 1024 0 0 1024 0 0
2 002F 47 102 1024 0 0 1023 114 0
3 0012 18 8078 1024 0 0 1023 114 0
4 0036 54 8080 1024 0 0 1023 114 0
5 0080 128 8086 1024 0 0 1023 114 0
6 0036 54 8088 1024 0 0 1023 114 0
7 0070 112 8094 1024 0 0 1023 114 0
8 803A 32826 8096 1024 0 0 1023 114 0
9 002F 47 238 1024 0 0 1022 8096 114
10 80E9 33001 8074 1024 0 0 1022 8096 114
11 0036 54 8056 1024 0 0 1021 8074 8096
12 0071 113 8062 1024 0 0 1021 8074 8096
13 8046 32838 8064 1024 0 0 1021 8074 8096
14 8045 32837 326 1024 0 0 1020 8064 8074
15 0012 18 314 1024 0 0 1019 326 8064
16 0036 54 316 1024 0 0 1019 326 8064
17 0074 116 322 1024 0 0 1019 326 8064
18 0020 32 324 1024 0 0 1019 326 8064
19 0020 32 328 1024 0 0 1020 8064 8074
20 80A3 32931 8066 1024 0 0 1021 8074 8096
21 0036 54 3884 1024 0 0 1020 8066 8074
22 0012 18 3890 1024 0 0 1020 8066 8074
23 016E 366 3892 1024 0 0 1020 8066 8074
24 0020 32 3898 1024 0 0 1020 8066 8074
25 808F 32911 8068 1024 0 0 1021 8074 8096
26 0097 151 3626 1024 0 0 1020 8068 8074
27 0065 101 3628 1022 0 2 1020 8068 8074
28 0020 32 3634 1024 0 0 1020 8068 8074
29 80E8 33000 8070 1024 0 0 1021 8074 8096
30 0261 609 8048 1024 0 0 1020 8070 8074
31 80E7 32999 8050 1022 0 2322422464 1020 8070 8074
32 80E6 32998 8042 1022 0 2322422464 1019 8050 8070
33 001A 26 8026 1022 0 2322422464 1018 8042 8050
34 006B 107 8028 1022 0 2322422464 1016 0 0
35 0052 82 8032 1024 0 0 1016 2322422464 0
36 0A74 2676 8034 1024 0 0 1016 2322422464 0
例外がスローされました: 'System.IndexOutOfRangeException' (mind8dispatch.dll の中)
お題のMindソースコード(level6の切り分け用修正)
もしかして「空列と 0を 返し」の「空列」がよろしくないのでは?と。
そこで、level6を下記のように修正してみました。「空列と」を除く。
level6(改)
Mind文字列に変換して次のアドレスを得る0とは 処理単語 .N ※1999.07.04訂正
(ASCIZアドレス → 文字列、次のASCIZアドレス(または0))
アドレス1は 変数
バイト位置は 変数 ※←32bitに(1999.07.04)
アドレス1に 入れ
0を 返し
。
Mind文字列に変換0とは 処理単語 .N
(ASCIZアドレス → 文字列)
Mind文字列に変換して次のアドレスを得て0 捨てること。
私のプログラム名と起動パラメータを設定0とは (・ → ・)
※※※※※※※※※※※※※※※※※※※※※※※※※
※ ・当モジュール内の$$COLD_FORTHから呼ばれる ※
※ ・この中で「私のプログラム名」もセットする ※
※※※※※※※※※※※※※※※※※※※※※※※※※
(私のプログラム名を決定)
c_mcodeFullFilenameを Mind文字列に変換0して
。
お題のMind8の中間コードのC#代替ディスパッチャ実行リスト
level6(改)
SqNo mcode mc(dec) mpoint dtp.point dtp+0 dtp+1 rtp.point rtp+0 rtp+1
1 8019 32793 114 1024 0 0 1024 0 0
2 002F 47 102 1024 0 0 1023 114 0
3 0012 18 8070 1024 0 0 1023 114 0
4 0036 54 8072 1024 0 0 1023 114 0
5 0080 128 8078 1024 0 0 1023 114 0
6 0036 54 8080 1024 0 0 1023 114 0
7 0070 112 8086 1024 0 0 1023 114 0
8 803A 32826 8088 1024 0 0 1023 114 0
9 002F 47 238 1024 0 0 1022 8088 114
10 80E9 33001 8066 1024 0 0 1022 8088 114
11 0036 54 8048 1024 0 0 1021 8066 8088
12 0071 113 8054 1024 0 0 1021 8066 8088
13 8046 32838 8056 1024 0 0 1021 8066 8088
14 8045 32837 326 1024 0 0 1020 8056 8066
15 0012 18 314 1024 0 0 1019 326 8056
16 0036 54 316 1024 0 0 1019 326 8056
17 0074 116 322 1024 0 0 1019 326 8056
18 0020 32 324 1024 0 0 1019 326 8056
19 0020 32 328 1024 0 0 1020 8056 8066
20 80A3 32931 8058 1024 0 0 1021 8066 8088
21 0036 54 3884 1024 0 0 1020 8058 8066
22 0012 18 3890 1024 0 0 1020 8058 8066
23 016E 366 3892 1024 0 0 1020 8058 8066
24 0020 32 3898 1024 0 0 1020 8058 8066
25 808F 32911 8060 1024 0 0 1021 8066 8088
26 0097 151 3626 1024 0 0 1020 8060 8066
27 0065 101 3628 1022 0 2 1020 8060 8066
28 0020 32 3634 1024 0 0 1020 8060 8066
29 80E8 33000 8062 1024 0 0 1021 8066 8088
30 0261 609 8042 1024 0 0 1020 8062 8066
31 80E7 32999 8044 1022 0 2155348288 1020 8062 8066
32 80E6 32998 8036 1022 0 2155348288 1019 8044 8062
33 001A 26 8026 1022 0 2155348288 1018 8036 8044
34 006B 107 8028 1022 0 2155348288 1016 0 0
35 0095 149 8032 1024 0 0 1016 2155348288 0
36 0022 34 8034 1022 0 0 1016 2155348288 0
37 0122 290 8038 1022 0 0 1019 8044 8062
38 0020 32 8040 1024 0 0 1019 8044 8062
39 0020 32 8046 1024 0 0 1020 8062 8066
40 0020 32 8064 1024 0 0 1021 8066 8088
41 0020 32 8068 1024 0 0 1022 8088 114
42 00A5 165 8090 1024 0 0 1023 114 0
43 803C 32828 8114 1022 20 8092 1023 114 0
44 002F 47 246 1022 20 8092 1022 8114 114
45 001A 26 5802 1022 20 8092 1022 8114 114
46 006E 110 5804 1022 20 8092 1020 8062 8066
47 0015 21 5808 1024 0 0 1020 20 8066
48 00ED 237 5810 1022 0 1 1020 20 8066
49 0022 34 5830 1024 0 0 1020 20 8066
50 00A5 165 8116 1024 0 0 1023 114 0
51 00C1 193 8134 1022 14 8118 1023 114 0
$$COLD_FORTH
52 0020 32 8136 1024 0 0 1023 114 0
53 80F4 33012 116 1024 0 0 1024 0 0
54 00A5 165 8594 1024 0 0 1023 116 0
55 8083 32899 8612 1022 14 8596 1023 116 0
56 0012 18 3510 1022 14 8596 1022 8612 116
57 004E 78 3512 1022 14 8596 1022 8612 116
58 00EC 236 3518 1020 0 0 1022 8612 116
59 0096 150 3524 1022 14 8596 1022 8612 116
60 026D 621 3526 1020 0 1 1022 8612 116
Hello by mind8
61 0020 32 3528 1024 0 0 1022 8612 116
62 0020 32 8614 1024 0 0 1023 116 0
63 801A 32794 118 1024 0 0 1024 0 0
64 002F 47 106 1024 0 0 1023 118 0
65 00A5 165 8164 1024 0 0 1023 118 0
66 00C1 193 8178 1022 10 8166 1023 118 0
実行終り
67 801B 32795 8180 1024 0 0 1023 118 0
68 002F 47 110 1024 0 0 1022 8180 118
69 00A5 165 8138 1024 0 0 1022 8180 118
70 00C1 193 8160 1022 18 8140 1022 8180 118
実行終り時の処理
71 0020 32 8162 1024 0 0 1022 8180 118
72 0012 18 8182 1024 0 0 1023 118 0
73 004E 78 8184 1024 0 0 1023 118 0
74 0014 20 8190 1022 0 0 1023 118 0
例外がスローされました: 'Mind8Kernel.Dispatcher.ExitModule' (mind8dispatch.dll の中)
プログラム '[8204] mind8dispatch.dll' がコード 0 (0x0) で終了しました。
とりあえず「空列と」を除けば完走することがわかりました。
つづく
この記事を書いている途中では「空列」がどのようにまずいのかは未確認ですが、Cの空列のターミネーションと現状のC#関数との相性がよろしくないのだと推定しております。次回解決編に乞うご期待?
空列は 文字列実体 長さ 0。