K.Maebashi's BBS

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

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

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

[1375] システム変数について
投稿者:
2009/06/29 17:53:00

 ようやくシステム変数の組込みが終わりました。下記に示すような感じで 使用します。上にある#defineは、システムのヘッダーファイルになり。 #includeされます。 また今回は日本語プログラムにするとこんな感じに なります。と言った感じのプログラムリストです。  システム変数は宣言だけが違い、多少特殊ですが普通の変数と同じように 使用できます。なおかつスレッドセーフで使用できます。 //-- システム変数定義ヘッダーファイル -------------- #define システム変数 sysval #define 生成 1 // システム変数使用 #define 廃棄 2 // システム変数廃棄 #define クリア 3 // システム変数を初期化 #define リスト 4 // システム変数のリスト宣言 #define 辞書 5 // システム変数の辞書宣言(予約) #define 昇順ソート 6 // システム変数をソート #define 降順ソート 7 // システム変数をソート #define システム変数検索 sysval_find #define 線形 1 // システム変数リストを線形検索 #define 二分 2 // システム変数リストを二分検索 #define 辞書 3 // システム変数辞書検索(予約) #define システム変数リスト挿入 sysval_push_list #define システム変数リスト取出 sysval_pop_list #define 先頭 1 // システム変数リストの先頭 #define 最後 2 // システム変数リストの最後 //-- 日本語定義ヘッダーファイル ------------------ #define メイン main #define 表示 print #define 文字列 string #define 整数 int //------------------------------------------------ //-- 日本語で書いた場合 ----------------- 整数 表示(文字列 str); 整数 システム変数(文字列 str,整数 type); 整数 メイン() { システム変数("AAS001",生成); システム変数("AAI001-ACI005",生成); システム変数("BAD001-BCD005",生成); システム変数("CAS001-CCS005",生成); AAS001 = "testdata"; 表示("AAS001 = " + AAS001 + "--\n\n"); AAI001[3][1] = 33; BAD002[2] = 3.2; CAS003[1] = "aaa"; 表示("AAI001 = " + AAI001[3][1] + "--\n\n"); 表示("BAD002 = " + BAD002[2] + "--\n\n"); 表示("CAS003 = " + CAS003[1] + "--\n\n"); } //-----------------------------------    ↓    ↓まったく同じプログラムで英語で書いた場合    ↓ //----------------------------------- int print(string str); int sysval(string str,int type); int main() { sysval("AAS001",CREATION); sysval("AAI001-ACI005",CREATION); sysval("BAD001-BCD005",CREATION); sysval("CAS001-CCS005",CREATION); AAS001 = "testdata"; print("AAS001 = " + AAS001 + "--\n\n"); AAI001[3][1] = 33; BAD002[2] = 3.2; CAS003[1] = "aaa"; print("AAI001 = " + AAI001[3][1] + "--\n\n"); print("BAD002 = " + BAD002[2] + "--\n\n"); print("CAS003 = " + CAS003[1] + "--\n\n"); } -----------------------------------    ↓    ↓日本語版も英語版まったく同じ下記のコードになります。    ↓ ------------------------------------ 1:*** 一般関数情報ダンプ ****************** 1:int main() 1:*** 配列定数 数 = 0 ********** 1:*** 文字列 数 = 23 *** 1: 0: "main" 1: 1: "AAS001" 1: 2: "sysval" 1: 3: "AAI001-ACI005" 1: 4: "sysval" 1: 5: "BAD001-BCD005" 1: 6: "sysval" 1: 7: "CAS001-CCS005" 1: 8: "sysval" 1: 9: "testdata" 1: 10: "AAS001 = " 1: 11: "-- " 1: 12: "print" 1: 13: "aaa" 1: 14: "AAI001 = " 1: 15: "-- " 1: 16: "print" 1: 17: "BAD002 = " 1: 18: "-- " 1: 19: "print" 1: 20: "CAS003 = " 1: 21: "-- " 1: 22: "print" 1:*** 使用予定のスタックサイズ = 1292 1:*** 関数コードのディスアセンブラ size = 223 1: 0 push_string_const 1 1: 3 push_int_1byte 1 1: 5 call_function 2 0 0 2 1: 14 pop 1: 15 push_string_const 3 1: 18 push_int_1byte 1 1: 20 call_function 4 0 0 2 1: 29 pop 1: 30 push_string_const 5 1: 33 push_int_1byte 1 1: 35 call_function 6 0 0 2 1: 44 pop 1: 45 push_string_const 7 1: 48 push_int_1byte 1 1: 50 call_function 8 0 0 2 1: 59 pop 1: 60 push_string_const 9 1: 63 pop_sysval_str 3-0-1 1: 68 push_string_const 10 1: 71 push_sysval_str 3-0-1 1: 76 add_string 1: 77 push_string_const 11 1: 80 add_string 1: 81 call_function 12 0 0 1 1: 90 pop 1: 91 push_int_1byte 33 1: 93 push_sysval_array 1-0-1 1: 98 push_int_1byte 3 1: 100 push_array_int 1 1: 102 push_int_1byte 1 1: 104 pop_array_int 1: 105 push_double_8byte 3.200000e+000 1: 114 push_sysval_array 2-52-2 1: 119 push_int_1byte 2 1: 121 pop_array_double 1: 122 push_string_const 13 1: 125 push_sysval_array 3-104-3 1: 130 push_int_1byte 1 1: 132 pop_array_string 1: 133 push_string_const 14 1: 136 push_sysval_array 1-0-1 1: 141 push_int_1byte 3 1: 143 push_array_int 1 1: 145 push_int_1byte 1 1: 147 push_array_int 0 1: 149 cast_int_to_string 1: 150 add_string 1: 151 push_string_const 15 1: 154 add_string 1: 155 call_function 16 0 0 1 1: 164 pop 1: 165 push_string_const 17 1: 168 push_sysval_array 2-52-2 1: 173 push_int_1byte 2 1: 175 push_array_double 0 1: 177 cast_double_to_string 1: 178 add_string 1: 179 push_string_const 18 1: 182 add_string 1: 183 call_function 19 0 0 1 1: 192 pop 1: 193 push_string_const 20 1: 196 push_sysval_array 3-104-3 1: 201 push_int_1byte 1 1: 203 push_array_string 0 1: 205 add_string 1: 206 push_string_const 21 1: 209 add_string 1: 210 call_function 22 0 0 1 1: 219 pop 1: 220 push_int_1byte 0 1: 222 return 1:*** 行情報 数 = 14 *** 1: 20: from 0 size 15 1: 21: from 15 size 15 1: 22: from 30 size 15 1: 23: from 45 size 15 1: 24: from 60 size 8 1: 25: from 68 size 23 1: 26: from 91 size 14 1: 27: from 105 size 17 1: 28: from 122 size 11 1: 29: from 133 size 32 1: 30: from 165 size 28 1: 31: from 193 size 27 1: 154: from 220 size 2 1: 32: from 222 size 1 1:*** end of main() -------------- --------------------------------------------------
[この投稿を含むスレッドを表示] [この投稿を削除]
[1376] Re:システム変数について
投稿者:(ぱ)こと管理人
2009/06/30 01:22:32

> システム変数は宣言だけが違い、多少特殊ですが普通の変数と同じように >使用できます。なおかつスレッドセーフで使用できます。 (中略) > sysval("AAS001",CREATION); 割と素朴な疑問だと思うんですが、システム変数の宣言がこのように関数形式だとすると、 システム変数の型について、コンパイラは知らないままだということになりませんか? ……と思ったのですが、「AAS」という名前がstring型だという型宣言を兼ねている (かつそれをコンパイラが解釈する)のでしょうか? > sysval("AAI001-ACI005",CREATION); そして、こういう書き方だと、AA「I」なので、intの配列の宣言になる、と。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1377] Re:システム変数について
投稿者:
2009/06/30 19:08:00

 さすが(ぱ)さんと言うか、鋭い突っ込みありがとうございます。実はシステム変数に ついては多少触れるのを避けていました。。なぜなら(ぱ)さんの「表計算ソフトって」 のコラムで表についての意見を読んでいて、まさにその表を言語に組み込もうとしている のです。だから、完成する前にキツイ指摘を受けるのではないかと…  システム変数は、簡単に説明すると。項と列によって構成されるシートが基本で、この シートによって複数の機能と特徴を持っています。   Aシート    ・・・~・・・     Zシート (26シート)   ----------- ------------   | | | |   | | | |   ----------- ------------  このシート名が変数の最初の「A」にあたり   000 ...................................... 999 (1000個の項目) ------------------------------------------------- A | | ・・・ | | : | | --------------------- | | Z | | | int double string | | | a | | --------------------- | | : | | ↑一つのセルの中に | | : | | 3つのデータがある | | z | | ・・・ | | ------------------------------------------------- (52の列)  変数名は 「シート+列+データ型+項目番号」 = AAI000 となります。だから 自由に変数名はつけれない。それを解消するために#defnieが必衰でした。  ちなみに、システム変数にアクセスする方法は、直値=AAI001と言う形と、相対配列 =ABI010「X][Y] これは、指定の座標から項にX値の相対座標指定、列にY値の相対座標を 指定してアクセスします。 ABI010[X] は項目のX相対座標指定です。  もともとこのシート形式は、目的アプリケーションで必要だった機能を実現する為の 些細なアイデアでした。しかし、言語を作っていく上でシステムの基本となり。言語上 でもかなめ的要素(中心的要素)になったのです。注意、EXCELを作るわけではありません。  ここからは既存の言語的常識を一時保留にして読んでください。  例えば、市役所等での情報の伝達はシート、書式を持った紙です。市民登録、婚姻届等に 必要な項目を記入し提出する。それを受け取り保存する。別にガッシリとデータ定義された 構造体やclassがあるわけではありません。記入する方も総ての項目を初期化したり記入し たりしません、必要な項目のみ記入して提出します。  このイメージをモジュール間の情報伝達に使用しようと考えたのです。例えばシートAに に必要なことを書いて、他のモジュールに動作指示を出す。その時シート名を伝達するだ けでいい、構造体やclassは不要です。なおかつしたい事の種類のよって、多くの構造体や 多くのクラス定義が必要になったりしますが、シートでは必要な部分だけを書けばいい。  と発想したのが元です。  情報伝達の単位は、最小のint,double,string、そして一つのセル、相対X領域,相対Y領域、 相対矩形の領域、列、シート、そしてパックされた情報の8つの単位で情報伝達を考えてい ます。この処理単位で情報伝達するために、言語は関数内では普通の言語的整合性を持って いますが、一歩外のグローバルではシステム変数で情報伝達する。その結果グローバル変数 はシステム変数となり、言語的整合性ではなくシステムの目的にそって作られています。 補足 1、一つのセルの中にint,double,stringデータの情報が入っているのは、もともとはデータ の型別にシートが分かれていました。しかし、リストやソート、検索、辞書(map)の場合、 3つのデータをまとめて処理したほうが利便性がいいとの理由です。そのため1セルに3つの 情報を入れました。しかし、変数としては別々にアクセスします。  例えばstringでソートした場合、intもdoubleもいっしょにソートされます。  例えば、intに優先NOが入っていたら、intでソートしたら文字列もいっしょにソート されます。  利便性の目的のためだけに、3つの情報を一セルに入れました。 2、パックされた情報は、stringデータに入ります。なのでstringデータは複数のデータ を大量に保持することが出来ます。 3.システム変数を言語内の変数と同じように、透過的にアクセスできるように作れたため、 システム変数の操作を速くする事ができた。これは、関数を用いてシステム変数を操作する ことを思えば、スレッドセーフでも、格段に融通が利き速い動作を保証できる。 最後に  この言語だけでは、奇妙な言語が一つ出来ただけの事です。この仕組が受け入れられる かは、その上に乗ったアプリケーションが洗練されていて使いやすく受け入れるか如何に かかっています。ここから先はいかにいい物を作るかだけでしょう。それに、言語の 初心者を対象にしているので、ここからはバリバリな日本語化に走ります。  プログラミング言語ができる人は、C/C++なりJavaなり、その他各種汎用言語を使って ください。がベースにあります。^^  今ある汎用言語は洗練されていて複雑で優秀です。だから私がいまさら作る意味が無い ですし。 追加の補足  上記のことを書いた後に、グローバル変数でもいいのではないか。の発想もありますが、 その場合、情報の集合体としての構造体やclassが必要です。でも、移転届用紙のような 多数の関係の薄そうなデータ総てを構造体やclassに入れるのは、根本的にシステム設計 が間違っている方向でしょう。やはり書式用紙に代表されるデータ構造と、プログラム上の データ構造とは明らかに違っています。プログラムでは関連のあるデータを参照やキー 情報、その他関連情報で持ちます。しかし、この構造は前にも話したように他の何かの サポート無しに完全な一意の意味を保証することは不可能です。  でも、シート形式なら完全かと言うとそうでもありません。実は時系列な情報変化の 保証は出来ないのです。これはあきらめています。時系列的な情報の変化とは、転移届を 受理して完全に処理される前に。同じ人から違う転移届を受け取ってしまった場合の矛盾 です。 これは外部の何らかのサポート、受理処理が完全に終了するまで受け付けない フラグ等のサポートが必要になり。これはシステムではなく、プログラマがそれを理解し 作らなければならないのです。  完全なデータフローマシンでも作ればいいのですが、そのプログラミングはまた違った、 別の複雑な知識が必要になってきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1378] Re:システム変数について
投稿者:(ぱ)こと管理人
2009/07/01 02:35:56

> 変数名は 「シート+列+データ型+項目番号」 = AAI000 となります。だから >自由に変数名はつけれない。それを解消するために#defnieが必衰でした。 こ、これは…… 名前が連番というのは私にはちょっと、と思いますし、この方法でプログラムを 作るとなると、「システム変数レイアウトシート」みたいなドキュメント(方眼紙か Excelシート?)上で、「ここからここまでにはこのデータを入れて…」といった 管理をしなければならなさそうです。ソースから離れたところにドキュメントが 必要になるのは、メンテナンスされないのでは、と心配になります。 ……というのが私の感想ですが、たとえばゲーム業界ではNScripterという言語が 結構広く使われているようなのですが、この言語は変数名が連番です。 http://kamakura.cool.ne.jp/o_show/nscripter/syo/08.htm 私の感覚ではのけぞってしまいますが、ユーザがいる以上、この仕様がよいという 人がいるということなのでしょう(山さんは、#defineでセル名を隠そうとして いますから、連番がよいと思っておられるわけではないと思いますが)。 あと、システム変数がこういう形式だと、入力フォームや出力帳票に直接 結びつけることができると便利かもしれませんね。 なつかしのRPGあたりを彷彿とさせますが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1379] Re:システム変数について
投稿者:
2009/07/03 22:04:56

 ここ数日いろいろ考えたすえ、プロのプログラマやプログラミングに精通して いる人ほど抵抗が大きいと思いました。当初は#defineでは、との返信もありま したが、結局の所シートを前面に出す以上、座標の変数が使われることが多いで しょう。  なぜこの様になったかを説明しても理解してもらうのは困難と思います。 結局(ぱ)さんにとって、奇妙な言語ができたに過ぎないのではないかと思う にいたりました。少し残念です。  今は、マルチスレッド化に専念しています。仕組みのベースがほぼ出来上がっ たので、より深く検証した上で本体に組み込と試験になります。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1380] Re:システム変数について
投稿者:(ぱ)こと管理人
2009/07/05 13:18:44

> なぜこの様になったかを説明しても理解してもらうのは困難と思います。 >結局(ぱ)さんにとって、奇妙な言語ができたに過ぎないのではないかと思う >にいたりました。少し残念です。 ええと、私が先の投稿で書きたかったことは、「私から見れば変に見えるけど、 (NScripterがそうであるように)それがよいという人もいるのでしょう」という ことです。お気を悪くされましたらすみません。 私から見れば奇妙な言語であることは確かですが、Domain Specific Languageが 奇妙な言語に見えるのはよくあることですし、奇妙な言語でなければ、わざわざ 自作する価値がない、とも言えるでしょう(その意味で、crowbarやDiksamは 「おとなしすぎる」んだよなー)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1386] Re:システム変数について
投稿者:
2009/07/16 01:17:37

あれからもいろいろ考えましたが、システム変数をシート形式でやる方法 以上の良い案が浮かびませんでした。ワーク用のグローバル変数を作ること は簡単なのですが、サービスのほとんどはシート上にて提供されるため、 これを越える案が今の所出そうに無いです。  もしよろしければ、システム変数が座標であることは少し目をつぶって いただけたら嬉しいです。確かに私も抵抗が有りますが、良い代替案が浮か ばない、有れば変えるのもそう難しくないと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]