モダンなHSP環境を構築しよう [2018年]

# 過去に書いたHSP記事

※執筆時期が古いので、今回の記事とは異なる内容も含まれています。もちろん、今回の記事の方が新しいのでより正しいです。

- [使いやすいけど使いづらいプログラミング言語「HSP」について](https://qiita.com/YSRKEN/items/0c059abfb8685051cb16)
- [HSPで本格的にプログラムを書きたい人向けのtips](https://qiita.com/YSRKEN/items/7fd6d95e358cc78377d4)
- [HSPで画像処理する際の覚書](https://qiita.com/YSRKEN/items/c3a69959c88cc56785a1)
- [HSPのコードをオブジェクト指向プログラミングで書いてみる話](https://qiita.com/YSRKEN/items/bbd3cad4cc1c1de9dcbb)

# 概要

　**みなさんHSPしてますか！**
　[プログラミング言語HSP](http://hsp.tv)が誕生してから22年。多くの初学者がHSPに触れ、そしてプログラミングの基礎を学んできました。恐らく、

- 開発用のテキストエディタが標準搭載されている
- GUIを簡単に作れる
- 豊富なAPIでゲーム・ツールなど多様なソフトを開発できる
- Webブラウザやスマホなど様々な環境で動作させられる

ことなどが、高い人気の理由なのでしょう。
　しかし、プログラミングに慣れ親しんだ人ほど、HSPの仕様に悩まされ、そして **卒業** していく傾向があります。その理由としては、

- 開発用のテキストエディタが **低機能**
- GUIをBASICのような文法で書くので **コードが複雑になりがち**
- 開発ジャンルごとに言語を使い分ける方が **速いし楽だし便利**
- そもそも **文法と公式ドキュメントがクソ**

などが挙げられるでしょう。初心者への敷居が低いのは良いことなのですが、現状だとプロユースに耐えうる品質ではない(ステップアップする際の踏み台になってしまう)……ということなのでしょうね。

　ただ、たとえHSPでも、努力次第で**開発をより快適にする**ことができます。今日日は「オブジェクト指向」だの「関数型志向」だのが主流になっていますが、どちらも学習コストは相応に高いですからね……。
　そこで今回は、便利なツールやテクニックについて解説していきます。

# エディタ編

　HSPに標準搭載されているテキストエディタではなく、より上等なエディタで書きたいことはよくあります。特に、[hsp3utf.as](http://www.onionsoft.net/hsp/v35/doclib/hsp3utf.txt)を使ってUnicodeでソースを書き始めると、**標準搭載エディタではUnicode編集できない**といったギャグのような仕様が降ってくるため、外部エディタが必須条件になります。
　HSPのコードをコンパイル・実行する際は、

- hspcmp.exeでソースコードを.axファイルに変換
- hsp3.exeで.axファイルを読み取り実行

といった処理が働いています。なのでこれをシミュレーションすれば任意のテキストエディタでHSPのコードを実行できます。……ただ、現実的には、[hspc.exe](http://dev.onionsoft.net/seed/info.ax?id=1392)などのコマンドラインコンパイラを使用するのが簡便だと思われます。
　代表なエディタ＋コンパイラの組み合わせとしては、例えば次のようなものが挙げられます。
(これ以外に良い組み合わせがあったら教えて下さい。秀丸エディタ＋プラグインの組み合わせを昔は使っていたのですが、[コンパイル用プラグイン](https://hide.maruo.co.jp/lib/macro/hspcompile-ver110.html)が動かなくなっていて悲しみ……)

- hspc.exeをVisual Studio Codeから叩いてビルド・実行する([参考リンク](http://honobonopoo.hatenablog.jp/entry/2017/09/13/172519))
- hspc.exeをAtomから叩いてビルド・実行する([参考リンク](http://honobonopoo.hatenablog.jp/entry/2018/07/07/214255))
- テキストエディタMeryのプラグインからhspcmp.exeを叩く([参考リンク](https://www.haijin-boys.com/wiki/プラグイン:HSPコンパイル実行プラグイン))

# デバッガ編

　良さげなエディタがあっても、デバッガに問題があっては作業が捗りません。なので**絶対にknowbugを導入しましょう**。導入方法は[GitHubのReadme.md](https://github.com/vain0x/knowbug)にわかりやすく書かれています。添付画像はちょい古いVerのものですが、それでもこれぐらい視認性が違います。

![image](https://camo.qiitausercontent.com/4edea163c2ae3c5f3310e2aa14616fcc4d9c7370/687474703a2f2f692e696d6775722e636f6d2f614f3477434c742e706e67)

# プログラミング編

　まず、HSPは生DLLを叩けるため、頑張れば様々なライブラリを使用できます。[コールバック処理](http://chokuto.ifdef.jp/download/index.html#hscallbk)や[多倍長整数演算](http://hp.vector.co.jp/authors/VA034288/longint/index.html)や[連想配列](http://prograpark.ninja-web.net/CollectField/)や[形態素解析](https://codetter.com/?p=923)や[FFT](https://qiita.com/YSRKEN/items/c3a69959c88cc56785a1#%E7%94%BB%E5%83%8F%E3%82%92%E3%83%95%E3%83%BC%E3%83%AA%E3%82%A8%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)など、C言語流のインターフェースならばだいたい大丈夫だと思われます(当然WinAPIもOK)。
　とはいえ、標準ライブラリでも[SQLite](http://www.onionsoft.net/hsp/v34/doclib/SQLele/SQLele.txt)や[OpenCV](https://github.com/zakki/openhsp/blob/master/package/win32/doclib/hspcv.txt)や[GDI+画像処理](http://www.onionsoft.net/hsp/v35/doclib/Artlet2D/Artlet2D.txt)など、色々な処理を実行できます。自分が行いたい処理を検討した上で、適切なDLLを選択しましょう。

　次に記法についてですが、基本的には[以前書いた記事の内容](https://qiita.com/YSRKEN/items/7fd6d95e358cc78377d4#%E6%9B%B8%E3%81%8D%E6%96%B9)を参考にして下さい。つまり、**なるべく分かりやすく書け**ということです。
　使いたい機能はなるべくモジュールとして切り分け、サブルーチンで処理を記述することはなるべく避けるようにします。HSPだと**モジュール内にもラベルを書ける**ので、例えばbutton命令で飛ばされる先もモジュール内にすることができます。そこで、GUI処理もモジュールで固めた話を[以前の記事](https://qiita.com/YSRKEN/items/bbd3cad4cc1c1de9dcbb)で説明しました。

　……ただ、昔は知らなかったのですが、「モジュール変数」は想像より大きな可能性を秘めていたようです。
　ただモジュール機能を使うだけだと、単なる名前空間＋staticなクラスとしてしか使えませんでした。それがモジュール変数になると、インスタンスを作成し、それに生やしたメソッドを処理する……といった**よりオブジェクト指向っぽい処理**が書けるようになります。詳しくは、yosgspecさんの記事を参照して下さい。
　この技術を使えば、HSPを使っているにも関わらず、グローバル変数祭りにならずに済みます。若干高度なコードになりますが、開発・デバッグ効率は上がりますので是非利用しましょう。

- [HSPでモジュール型変数入門](https://qiita.com/yosgspec/items/f3f58e817c919277e8be)
- [HSPのモジュール仕様を暴く](https://qiita.com/yosgspec/items/a19df3e966fa307618f0)