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


過去に書いたHSP記事

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


概要

 みなさんHSPしてますか!

 プログラミング言語HSPが誕生してから22年。多くの初学者がHSPに触れ、そしてプログラミングの基礎を学んできました。恐らく、


  • 開発用のテキストエディタが標準搭載されている

  • GUIを簡単に作れる

  • 豊富なAPIでゲーム・ツールなど多様なソフトを開発できる

  • Webブラウザやスマホなど様々な環境で動作させられる

ことなどが、高い人気の理由なのでしょう。

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


  • 開発用のテキストエディタが 低機能

  • GUIをBASICのような文法で書くので コードが複雑になりがち

  • 開発ジャンルごとに言語を使い分ける方が 速いし楽だし便利

  • そもそも 文法と公式ドキュメントがクソ

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

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

 そこで今回は、便利なツールやテクニックについて解説していきます。


エディタ編

 HSPに標準搭載されているテキストエディタではなく、より上等なエディタで書きたいことはよくあります。特に、hsp3utf.asを使ってUnicodeでソースを書き始めると、標準搭載エディタではUnicode編集できないといったギャグのような仕様が降ってくるため、外部エディタが必須条件になります。

 HSPのコードをコンパイル・実行する際は、


  • hspcmp.exeでソースコードを.axファイルに変換

  • hsp3.exeで.axファイルを読み取り実行

といった処理が働いています。なのでこれをシミュレーションすれば任意のテキストエディタでHSPのコードを実行できます。……ただ、現実的には、hspc.exeなどのコマンドラインコンパイラを使用するのが簡便だと思われます。

 代表なエディタ+コンパイラの組み合わせとしては、例えば次のようなものが挙げられます。

(これ以外に良い組み合わせがあったら教えて下さい。秀丸エディタ+プラグインの組み合わせを昔は使っていたのですが、コンパイル用プラグインが動かなくなっていて悲しみ……)


  • hspc.exeをVisual Studio Codeから叩いてビルド・実行する(参考リンク)

  • hspc.exeをAtomから叩いてビルド・実行する(参考リンク)

  • テキストエディタMeryのプラグインからhspcmp.exeを叩く(参考リンク)


デバッガ編

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

image


プログラミング編

 まず、HSPは生DLLを叩けるため、頑張れば様々なライブラリを使用できます。コールバック処理多倍長整数演算連想配列形態素解析FFTなど、C言語流のインターフェースならばだいたい大丈夫だと思われます(当然WinAPIもOK)。

 とはいえ、標準ライブラリでもSQLiteOpenCVGDI+画像処理など、色々な処理を実行できます。自分が行いたい処理を検討した上で、適切なDLLを選択しましょう。

 次に記法についてですが、基本的には以前書いた記事の内容を参考にして下さい。つまり、なるべく分かりやすく書けということです。

 使いたい機能はなるべくモジュールとして切り分け、サブルーチンで処理を記述することはなるべく避けるようにします。HSPだとモジュール内にもラベルを書けるので、例えばbutton命令で飛ばされる先もモジュール内にすることができます。そこで、GUI処理もモジュールで固めた話を以前の記事で説明しました。

 ……ただ、昔は知らなかったのですが、「モジュール変数」は想像より大きな可能性を秘めていたようです。

 ただモジュール機能を使うだけだと、単なる名前空間+staticなクラスとしてしか使えませんでした。それがモジュール変数になると、インスタンスを作成し、それに生やしたメソッドを処理する……といったよりオブジェクト指向っぽい処理が書けるようになります。詳しくは、yosgspecさんの記事を参照して下さい。

 この技術を使えば、HSPを使っているにも関わらず、グローバル変数祭りにならずに済みます。若干高度なコードになりますが、開発・デバッグ効率は上がりますので是非利用しましょう。