[トップ][編集][本文][編集履歴][一覧][最近の更新][->English]

Note:HSP用語辞典

  • 説明文は簡潔なHSP向けの文章でいいと思うのですがどうでしょう?一般的な意味合いで解説しようとすると長くなるし無駄ではないかなと思うのですが。GENKI?
  • 解説は掘り下げればきりがないので、ここでは簡潔にお願いします。詳しい説明が必要な場合は新規でページを作るか、別サイトへの誘導で対応願います。検索の手がかりや理解の手助け程度になれば十分じゃないかなと思っています。GENKI?
  • "バッファオーバーフロー","オフセット","引数",演算子" を、加えておきました - anomy
  • "アドバイス"は違うとこじゃない?
    • 確かに、用語を扱うとこですし… 移動しておきましょうかね? - anomy
  • "戻り値"、"メモリの確保"を加えておきました。後、自分が書いたデタラメなことを消しておきました - anomy
  • 用語に関して(HGIMG等)をリンクさせて頂きました。リンクが異なる場合修正してください - anomy
  • 英字表記で複数列挙は、/の方が良くないですか?orだと文字列の中に埋まっちゃって見にくく感じるんですが。(変えたらいつの間にか戻ってた。:-P)
    • Buffer over flow or Buffer over run 等の表記を、Buffer over flow / Buffer over run にするということですね? - anomy
    • "/"の形式に変更しておきました - anomy
  • 他の用語の並びをみていて、あれ・・・ソートされてないじゃん、と思ったらアルファベット順ではなくて、アイウエオ順だったみたいですね?^^; - kz3
    • 用語のみが行頭に来るように余計な改行を一旦削除したうえで、サクラエディタのソート機能を使ってソートしています。ソート後はあらかじめ改行位置に埋め込んで置いたキーワードを改行に置換して、もとのレイアウトに戻しています。- GENKI?
  • 解説について不安なところや、ここをこんな具合にかえてみましたがどうでしょう?みたいな内容についてはこっち(ノート)に書くようにしませんか?
    私もついつい本文にコメントで書いてしまうのですが、どうもコメント使いすぎでとっ散らかってきてるようなので、何とかしましょう。- GENKI?
    • そうですね。次からそうします。 - anomy
  • 書き換えたなどの更新内容については、できるだけ「ChangeLog (変更箇所の簡単なメモ):」を使うよう心がけたいです。はい、次から心がけますです。- GENKI?

オフセット(Offset)

  • 文字列検索命令instrは基準位置から見つかった位置までのオフセットを返す(代入する)。
    だから、検索対象文字列全体の位置だと勘違いしないように注意。<kz3
  • kz3さん、移動しておきました - anomy
  • anomyさんありがとうございます、ソートを乱していたのをかすかに覚えてます^^;
  • あんまり4byte単位でオフセットを扱う事はないんじゃないかな。どっちかというと文字列。
  • そのbyte単位"オフセット"というのはポインタが指す型のポインタのインクリメント幅とか、
    4の倍数というのは構造体のパディングのことかな・・・<kz3


実引数と、仮引数というのがある。

    • ある命令において、呼び出し元(側)で指定する引数を実引数、
      定義側で値を受け取る引数を仮引数と呼ぶ(どんな引数が指定されるか、
      その時点では分からないから"仮"と付く)
      例えば
      ;HSP2.61ver de run
      #module
      #deffunc hoge str
      mref hoge__,32
              print "hoge["+hoge__+"]"
              return
      #global
              hoge "hoge"
              stop
      
      この場合、strの部分が仮引数で、呼び出し元のhogeの引数"hoge"が実引数である
      これはHSP3の記述の方がわかりやすい
      ;HSP3.0ver de run
      #module
      #deffunc hoge str hoge__
              print "hoge["+hoge__+"]"
              return
      #global
              hoge "hoge"
              stop
      
  • 仮引数と実引数について加えておきました。なんか違うような気もしますが… - anomy
  • ソース書いても意味ないですかね? - anomy
  • _hoge,hogeと続いていてちょっと分かりにくいと思います^^;
  • ある命令において、呼び出し元(側)で指定する引数を実引数、定義側で値を受け取る引数を仮引数と呼ぶ(どんな引数がくるか分からないから"仮"と付く)。<kz3どうかな?
  • いいですね。...そのまま加えておきましたw - anomy
  • 細かいけれど、_が前につくものは予約語になってるので、後ろに変えました。
    • そういえば、そうでしたね。修正ありがとうございます。 - anomy
  • そういえば、予約語って言葉も要るかな。HSPではあまり聞かないけど。


メモリの確保

  1. 変数の宣言をし、メモリ領域を確保する。
    • メモリには番地(Addres)が割り当てられている
    • 例えば、aという変数を宣言をすると、何処かの番地にaという変数の内容が格納される

例:
あまりいい例ではありませんが…

;HSP2.61ver de run
#include "llmod.as"

        print "変数の場合"
        print "------------------------------------------------------------------"
        a = 0 :getptr pa,a :hpa = pa
        str hpa,23                              ;paの数値を8桁の16進数文字列に変換
        print "a の内容:     "+a+" | 番地[10進数]: "+pa+" | 番地[16進数]: 0x"+hpa
        b = 0 :getptr pb,b :hpb = pb
        str hpb,23                              ;pbの数値を8桁の16進数文字列に変換
        print "b の内容:     "+b+" | 番地[10進数]: "+pb+" | 番地[16進数]: 0x"+hpb
        print "------------------------------------------------------------------"

        print "配列変数の場合"
        print "------------------------------------------------------------------"
        repeat 4
           ary.cnt = cnt : getptr pary.cnt,ary.cnt :hpary = pary.cnt :str hpary,23
           print "ary."+cnt+" の内容: "+ary.cnt+" | 番地[10進数]: "+pary.cnt+" | 番地[16進数]: 0x"+hpary
        loop
        stop
  • と、このようになる
    これでよいのでしょうか? - anomy
    • いいと思います。
      一般的にメモリアドレスは16進数で示されることが多いので、
              str pa,23   ;paの数値を8桁の16進数文字列に変換
              str pb,23   ;pbの数値を8桁の16進数文字列に変換
      
      とすると、それっぽく見えます。(どうでもいいか^^;) arrayの短縮形にaryがあったとは、見に来てよかったです。ありぃ(^^;<kz3
      • 確かに、16進数表記の方が一般的でしたw...変えておきました。
        後、aryはarrayだと長い気がしたので(そうでもないかw)、短縮しました。
        合ってるかどうかはわかりません(w ̄A; - anomy


バッファオーバーフロー

  • バッファオーバーランが既にありますが、まだ必要なんでしょうか? - anomy
  • これは要らないでしょう。バッファじゃないオーバーフローの説明は欲しいかも。
  • そうですね。しかし、桁あふれについて説明するには、型の概念も説明しなくてはならないですね… - anomy


宣言

    i=1                 ; 変数iは宣言(数値型)、確保(64byte)、代入(数値)されている。

    s="1"               ; 変数sは宣言(文字列型)、確保(64byte)、代入(文字列)されている。
                        ; 変数の型は代入時に更新される。

    poke sary1,0,'H'    ; 変数sary1は宣言(数値型)、確保(64byte)されている。
    poke sary1,1,'S'    ; 変数sary1は代入されていないので数値型変数。
    poke sary1,2,'P'

    mes "sary1 = "+sary1
    if sary1!"HSP"{     ; 数値と文字列の比較は(基本的)にできない
        mes "sary1 isn't \"HSP\"."
    }else{
        mes "sary1 is \"HSP\"."
    }

// だが・・・

    str sary2           ; 変数sary2は宣言(文字列型)、確保(64byte)されている。

    poke sary2,0,'H'
    poke sary2,1,'S'
    poke sary2,2,'P'

    mes "sary2 = "+sary2
    if sary2!"HSP"{     ; 文字列と文字列の比較
        mes "sary2 isn't \"HSP\"."
    }else{
        mes "sary2 is \"HSP\"."
    }

// ちなみに・・・リトルエンディアン環境で、
// sary1のメモリイメージ
// H   S   P  \0
// 48  53  50 00
//--------------
// 00  50  53 48 = 5264200(リトルエンディアンではLSBがアドレスの若い位置に来る)

    if sary1!"5264200"{ ; 数値と数値文字列との比較はできる。
        mes "sary1 isn't number\"5264200\"."
    }else{
        mes "sary1 is number\"5264200\"."
    }

    stop
/*
*** メモリへの格納順序方式 ***
一般的にメモリの一つのアドレスに格納できるバイト幅は``1byte''である。
なので、2byte以上のバイト幅を持つデータは分割してメモリに格納しなければならない。
プロセッサ毎に以下のような方式がある。

[Little endian]
主にIntel系CPUで採用されている方式。
この方式は最下位byte(Least Significant Byte/Bit - LSB)からメモリに割り当てていく方式である。
[Big endian]
主にMotorola系CPUで採用されている方式。
この方式はリトルエンディアン方式とは逆に、最上位byte(Most Significant Byte/Bit - MSB)から割り当てていく方式である

[``hello,world''のメモリイメージ]
+---+--+--+--+--+--+--+--+--+--+--+--+--+
|AZS| h| e| l| l| o| ,| w| o| r| l| d|\0|
+---+--+--+--+--+--+--+--+--+--+--+--+--+
|BiE|68|65|6c|6c|6f|2c|77|6f|72|6c|64|00|
+---+--+--+--+--+--+--+--+--+--+--+--+--+
|LiE|00|64|6c|72|6f|77|2c|6f|6c|6c|65|68|
+---+--+--+--+--+--+--+--+--+--+--+--+--+
[``HSP''のメモリイメージ]
+---+-----+-----+-----+--+
|AZS|  H |  S |  P |\0|
+---+-----+-----+-----+--+
|BiE|67|82|72|82|6f|82|00|
+---+-----+-----+-----+--+
|LiE|00|82|6f|82|72|82|67|
+---+--+-----+-----+-----+
*/
  • あ・・・ちょっとまてよ?^^;<kz3
  • うーん、ちょっと宣言とは違う方向に行った気もするけど・・・。<kz3
    • Σ( ̄Д ̄;)チョット待ってくださいwww
    • - 初心者にリトルエンディアンってw - anomy
      • あぁっ!!すみません!!!!<kz3
  • ...とか言いながら説明文を加えておきましたw - anomy

アドバイス

  • アドバイスは違うとこに動かしたほうがいいでしょうか? - anomy
    • 今のところ他に移すあてもないのでそのままでいいんじゃないでしょうか?だめかな? - GENKI
    • 確かに、移すとこがないですし…そのままにしておきましょう。 - anomy
    • え?なければ新しく作ればいいんじゃ?
  • いかんいかん・・・昨日は変なページを作ってしまいました。。。朝起きたら消されていまして、「あちゃぁ・・・」と反省してます。<kz3
    ※昨晩は冷静さを欠きました;;
    この行き先不明なアドバイスページと本当にプログラミング自体が初めてでHSPを触ったという人向けのガイドが必要なのかな・・・と思ったのですが、wikiはサポートページじゃないし、なのかな・・・。
  1. HSPを使い始めたけど何から手を付けていいのか分からない
  2. 本がたくさんありすぎて何を買ったらいいのかわからない
  3. 初心者でも分かりやすく解説しているHSP講座のサイトを教えてください
    などなど・・・。なんかかわいそうに思えてきました。
    またそういう人に対して、優しくしたらいいのか、厳しくしたらいいのか・・・。 初心者といえば、文字列操作や繰り返し処理など小さいプログラムから覚えていって・・・。
    よくある問題(課題)のようなものを列挙して、でも回答例は載せずに一応実行結果のようなものだけ示して、こういう問いに対してこういう結果になるようなプログラムを作ってみよう、的なものとか。
    別に気にする必要ないのかな・・・。どうでしょう?皆さん|_・);長くてすいません・・・。<kz3
    • どんな内容だったのかは知りませんが、サポートページがここにあっても、悪いなんて事はないでしょう。個人サイトの講座だと新しいバージョンに対応してない場合があったりしますが、ここだと気付いた人が修正出来たりとか。本当に消されたんですかね?
      本当の初心者に厳しくしたってどうしようもないでしょう。生まれたての子に自分でオムツを替えろと言ってる様なもの。学校行ってるのに靴下履けないとかは困りものだけど。(^^;
    • 久々に来たからどんな内容だったのかは同じく知りませんが。
      サポートについては、いいと思いますよ。
      もともとWikiというのは、誰でも自由に(時には規制も…)編集できたり修正できるシステムですから。Wiki上で講座とか、ピッタリだと思います。 - anomy
  • 情報に敏欲→情報に貪欲、ですか? <kz3
    • はい。そうです。しかし、貧欲よりも敏欲のほうがいい気がしてw - anomy
      • あまり聞かない言葉だったので「敏欲?」と思って辞書を調べてみましたが造語ですね^^;
        敏感+貪欲=敏欲・・・びんよくびよくびよーく・・・Bjork(ビヨーク)
        すみません・・・。<kz3

予約語

例えばllmod.asにはgetptrという変数のアドレスを取得する命令がある。

    ; getptr命令の正しい使い方
    #include "llmod.as"
    n=5 : m=0
    mes "n="+n
    mes "m="+m
    getptr pn,n     ; nのアドレスを取得
        ll_peek4 m,pn   ; nのアドレスから4バイトをmに読み込む
    mes "n="+n
    mes "m="+m
    stop
    ; getptrは命令じゃない
    n=5 : m=0
    mes "n="+n
    mes "m="+m
    getptr=pn,n     ; nのアドレスを取得・・・じゃないよ
                    ; ll_peek4は使っちゃダメです。
    mes "n="+n
    mes "m="+m
    mes "getptr.0="+getptr.0
    mes "getptr.1="+getptr.1

    stop

この通りgetptr命令を定義しているllmod.asがインクルードされていない場合、 予約語にない単語は変数として扱われます。広く考えれば変数として使えない名前≒予約語(命令語・システム変数・プリプロセッサ定数など)

用語区分

HSP3になってからAPI呼び出しが簡単に、あるいはHSPの機能かのように呼び出せるようになったので、初心者も手を出しやすくなったと思います。(初心者も簡単に扱える、という意味ではなく。)そうなってくるとHSP用語だけではなく、API用語、またCOMも扱えるようになった->COM関連の用語も「HSP用語」に入ってくるのかな、と思います。そういったものが五十音順で入り混じってくると調べにくい(読みにくい)一面もあると思います。というわけでHSP用語辞典とは別でAPI用語、COM用語と分ける必要はあるかどうか、という意見をお聞かせください。

  • 例えば
  1. HSP用語辞典::HSP
  2. HSP用語辞典::API
  3. HSP用語辞典::COM みたいな。

モジュール変数について

「モジュール変数」を追加しました。しかしまだ満足いきません。以下のような場合、全てを「モジュール変数」と括ってしまうのは語弊があるように思います。

#module "MModuleStructure" m_x, m_y, m_z ; ここでのモジュール名の""の有無は問題ないけど...
#modinit
  modname = "MModuleStructure"
  modarg  = 3
  return
#global

  newmod m_exp, MModuleStructure ; ここでのモジュール名の""の有無はコンパイルに影響を与える。
                                 ; どっちかというと""で囲みたいです。

区別するべき変数は「m_x , m_y , m_z ( 仮:モジュールメンバ変数? )」「modname , modarg ( 仮:モジュール(内)変数? )」「m_exp ( 仮:モジュール変数? )」の3種類だと思いますが、これ以外にいい名称はないでしょうか...? < kz3

  • HSP3 で「モジュール変数」と呼んでいるのは #module プリプロセッサの引数として指定する(上記でのモジュールメンバ変数)変数です。モジュール内で定義されている変数はモジュール空間内の普通の変数です。分けて呼ぶとすればモジュール内変数かモジュール空間変数とでもいえばいいでしょうか。モジュール型の変数はモジュール変数をモジュール外部で操作するためのハンドルですよね(?)。あと、モジュール内ではローカル変数もあります。
  • 経過のまとめ。上記コードにおいてこれより下では次の仮名称で使います。
    m_x    : モジュールメンバ変数 => モジュール変数
    modarg : モジュール(内)変数   => モジュール内変数
    m_exp  : モジュール型変数     => モジュール型変数
    
    モジュール型変数はモジュール変数を外部で操作というのはちょっと言葉のあやが...モジュール外部からはモジュール変数は操作できないですね(PValポインタを取得すれば出来る) 。hsp2.xはモジュール変数といったらhsp3.xでのモジュール内変数だったと思いますが、名称が変わるとまた一つ以降してくる人にとっては混乱の元に...
  • hsp3.x付属文書のmodule.htm『モジュール機能ガイド』の冒頭で、
    このテキストには、Hot Soup Processor ver3.0でサポートされている モジュール機能についての説明が含まれています。 
    
    と書かれてはいますが、hsp3.0から新たに拡張されたモジュール機能モジュール変数型については書かれていませんね。モジュール変数型について書かれているのはhspprog.htm『プログラミング・マニュアル』の拡張文法の章に「■モジュール変数の定義 」という項が設けられていますが、この新しく追加されたモジュール機能こそ、module.htmに詳細に書いておき、
    hsp3.0からサポートされた新しいモジュール機能『モジュール型変数』についてはmodule.htmをお読みください。
    
    のほうが読みやすいと思いますがどうでしょうか。< kz3
  • あと「モジュール変数」について気づいたのですが、hsp2.61・hsp3.0の標準デバッグウィンドウに「モジュール変数を表示」というような項目がありますよね?それを有効にすると、ここでいうモジュール内変数が表示されます。この点を含めて、モジュールに関する用語の整理が必要だと思います。 < kz3
  • 「モジュール変数について」は別途専用ページを設ける予定です。HSP2.6:moduleのようなページをどこに設けるか...HSP3:module?