Microsoft Small BasicDev Basics/Keyword

Microsoft Small Basicは学習を目的としてマイクロソフトが提供しているBASICの処理系。シンプルな言語仕様、習得が容易、簡潔な記述がその特徴といえる。

» 2017年04月25日 05時00分 公開
[かわさきしんじInsider.NET編集部]
「Dev Basics/Keyword」のインデックス

連載目次

 Microsoft Small Basic(以下、Small Basic)は学習を目的としてマイクロソフトが提供しているBASICの処理系。習得が容易で、簡潔な記述がその特徴といえる。

Small Basicの特徴

 Small Basicは次の3つの要素で構成される、いわば小規模なプログラミング言語およびその処理系といえる。

  • プログラミング言語自体
  • プログラミング環境
  • ライブラリ

 言語としてのSmall Basicは(もちろん)BASICの方言であり、独自の進化を遂げているVisual Basicと比べて非常にシンプルなものとなっている。その特徴を幾つか以下に挙げてみよう。

  • 変数は全てグローバル
  • サポートしているデータ型は数値、文字列、ブール値の3種類
  • While/Forループ内でのbreak、continueが存在しない(Goto文を使用)
  • サブルーティンによる構造化が可能(引数は持てないが、変数は全てグローバル)
  • オブジェクト指向プログラミングをサポートしない単純な命令型言語

 こうした特徴から、プログラミング初心者がプログラミングの基礎概念を学ぶのが比較的容易になっている。その一方で、次のような特徴もある。

  • コマンドプロンプト、ウィンドウ、タートルグラフィック、コントロール、プログラム、システム、ファイルなどを抽象化したライブラリを持つ
  • ライブラリが提供するオブジェクトとそのプロパティ、メソッド、イベントを使用した高度な処理が可能

 Small Basicそのものは.NET Frameworkをベースとしており、Small Basic用のライブラリが提供する各種のオブジェクトを使用して、意外と高度な処理を(場合によっては、Visual Basicのコードよりも簡潔に)行えるようになっているとのことだ。

Small Basicプログラミングの実際

 以下にSmall Basicでプログラミングを行っているところを示す。

Small Basic Small Basic

 前述したようにプログラミング環境となるウィンドウ内でコードを記述し、ツールバーにある[実行]ボタンをクリックして、これを実行するというのがSmall Basicにおけるコーディングの基本となる(Small Basicで作成したプログラムをVisual Basicに移行するためのツールも用意されている)。また、上の画像右側にはライブラリが提供するControlsオブジェクトの紹介が表示されている。プログラミング環境内では以下の画像に示すように、IntelliSenseによる支援もある。

IntelliSenseによるコーディング支援 IntelliSenseによるコーディング支援

 なお、上の画像にあるコードはGUIウィンドウにボタンを2つ表示して、クリックされたボタンに応じてメッセージボックスを表示するというものだ。

GraphicsWindow.BackgroundColor = "Azure"
GraphicsWindow.Width = 300
GraphicsWindow.Height = 200
btn1 = Controls.AddButton("button 1", 65, 150)
btn2 = Controls.AddButton("button 2", 165, 150)
Controls.ButtonClicked = btn_clicked
GraphicsWindow.Show()

Sub btn_clicked
  btn = Controls.GetButtonCaption(Controls.LastClickedButton)
  GraphicsWindow.ShowMessage(btn + " clicked", btn)
EndSub

上記の画像のコード

 GraphicsWindowというのがGUIベースのウィンドウを抽象化したオブジェクトだ。BackgroundColor/Width/HeightはGraphicsWindowが持つプロパティで、ウィンドウの背景色/幅/高さを指定する。ウィンドウを表示するにはShowメソッドを使用する(ただし、このプログラムでは実際にはShowメソッド呼び出しは必要ない。むしろ、ウィンドウの表示/非表示をShow/Hideメソッドで切り替えると考えた方がよいだろう)。

 Controlsオブジェクトは、GraphicsWindowに表示するコントロールを管理するオブジェクト。ここでは、そのAddButtonメソッドを使用して2つのボタンをウィンドウに追加(表示)している。また、Controls.ButtonClickedはContrlsオブジェクトが持つイベントであり、ここではボタンがクリックされたタイミングで実行する処理をその下にあるbtn_clickedというサブルーティンとしている。

 最後にあるbtn_clickedサブルーティンを見ると分かるが、ControlsオブジェクトにはButtonClickedイベントハンドラーを1つしか指定できない。そのため、クリックされたボタンに応じた処理を行うには、Controls.LastClickedButtonプロパティを使用して、どのボタンがクリックされたかを判断する必要がある。ここでは、クリックされたボタンを判断した上で、そのキャプションをControls.GetButtonCaptionメソッドで取得しているだけだが、実際にはIf文での処理の分岐などを行うことになるだろう。

 実行結果を以下に示す。

実行画面 実行画面

 ここでは[button 1]ボタンをクリックしたので、メッセージボックスに「button 1 clicked」というメッセージが表示されている(タイトルも「button 1」となっている)。また、プログラム実行時にはプログラミング環境ウィンドウには、その旨を示すメッセージがオーバーレイ表示され、操作ができなくなる。

 クリックされたボタンの判断と、それに応じた処理の切り分けなどについては煩雑な処理が必要になるが、「ライブラリが提供する機能=オブジェクト」と「そのオブジェクトが持つプロパティ/イベント/メソッド」をドットで区切り、必要に応じて操作対象を加えていくというSmall Basic独特の流儀に慣れれば、ある程度は直感的にコードを記述できるようになるかもしれない。なお、GraphicsWindowに図形などを作成したり、それらを移動させたりといった用途に使えるShapeオブジェクトもある。このオブジェクトを使うと、GUIウィンドウ上で簡易的なアニメーション処理を比較的容易に実現できる(実際のコード例については「特集:Small Basic開発入門」を参照されたい)。

 もう1つ例を示す。先ほどはGUIウィンドウを抽象化したGraphicsWindowとそれに関連するオブジェクトを見たので、今度はコマンドプロンプトを抽象化したTextWindowを利用するプログラムを見てみよう。

person[0]["name"] = "insider.net"
person[0]["phone"] = "1234-5678"
person[0]["age"] = 40
person[1]["name"] = "build insider"
person[1]["phone"] = "2345-6789"
person[1]["age"] = 24
person[1]["extra"] = "extra info"

For i = 0 To Array.GetItemCount(person)
  info = Array.GetAllIndices(person[i])
  For j = 1 To Array.GetItemCount(info)
    TextWindow.WriteLine(info[j] + ": " + person[i][info[j]])
  EndFor
EndFor

配列の利用例

 ここでは2次元配列を作成し、その要素を(本フォーラムの読者であればおなじみの)WriteLineメソッドを使用してTextWindowオブジェクト(コマンドプロンプト)に出力している。

 2次元配列を作成しているところを見ると、インデックスには数値だけではなく、文字列も使えることが分かる。文字列をインデックスとした場合にForループを行う際には、文字列インデックスを要素とする配列をArray.GetAllIndicesメソッドで作成するとよい。上のコードの内側のForループではそのようにしている(このとき、返される配列が1ベースになっているので注意が必要だ。Small Basicの配列自体は0ベースとなっているが、このようにインデックス0が使われないことがある)。インデックスを要素とする配列infoを利用して2次元配列の要素を「person[i][info[j]]」のように指定している点に注意。

 実行結果は次のようになる。

実行結果 実行結果

 最後にGoto文を利用したループとそこからの脱出についても見ておこう。

number = Math.GetRandomNumber(100)

loop: 'While ("true")
TextWindow.Write("input your guess: ")
guessed = TextWindow.ReadNumber()
If number = guessed Then
  Goto finished
ElseIf number > guessed then
  TextWindow.WriteLine("My number is bigger")
Else
  TextWindow.WriteLine("My number is smaller")
EndIf
Goto loop ' EndWhile

finished:
TextWindow.WriteLine("you win!")

数当てゲーム

 詳細は割愛するが、ここでは2つのラベルloopとfinishedを使用して、If文での数値比較で入力された数値とシークレットナンバーの値が異なればループを続け、一致したらゲームを終了するようにしている。なお、コメントアウトして書いているように「While ("true")」と「EndWhile」で無限ループを作成してもよい。Goto文の利用については議論が大いにあるところであろうが、Small Basicでは必須の構文要素となっている。なお、実行結果については割愛する(等値比較を「=」で行っている点にも注意が必要だ)。

 Small Basicはシンプルな言語仕様でありながら、それなりに強力なライブラリを持っている。例えば、文字列処理に関連する処理を集めたTextオブジェクトや、数学計算を行うためのMathオブジェクト、ファイルを扱うためのFileオブジェクトなど、ネットワークファイルやWebコンテンツをダウンロードするためのNetworkオブジェクトがある。これらのオブジェクトを使用することで、意外に役立つプログラムを作成できるかもしれない。なお、どういったオブジェクトを利用できるかについては「Reference Documentation」ページを参照されたい。


 Microsoft Small Basicは学習を目的としてマイクロソフトが提供しているBASICの処理系。シンプルな言語仕様、習得が容易、簡潔な記述がその特徴といえる。その一方で、Small Basicが提供するライブラリを利用することにより、実際に役立つプログラムも作成できるだろう。プログラミングの楽しみを学ぶという意味ではシンプルで面白い存在かもしれない。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。