BASIC
プログラミング言語BASIC(ベーシック)の使用法
はじめに
[編集]BASICの分類
[編集]BASICには大きく分けて、以下のように分類されます(ただ、BASICは数多の方言があるので、これは分類の一例)。
- ダートマスBASIC (DTBASIC)
- ダートマス大学で開発された最も初期のBASICの実装を指します。この時期のBASICは教育用や研究用途が主であり、基本的な数値計算や制御構造を提供し、TinyFORTRANインタプリタとしての性格が強くTSS環境で実行されました。
- マイコンBASIC (MicrocomputerBASIC)
- マイクロコンピューター向けに提供されたBASICの実装を指します。これらの実装は、ハードウェアに特化した機能や拡張が含まれており、ホビストだけでなくビジネスでも広く利用されました。
- 代表的な実装には、N88-BASICやF-BASIC、MSX-BASICなどがあります。
- JIS規格BASIC
- ANSI X3.60-1978「American National Standard for the Programming Language Minimal BASIC」を日本語に翻訳した JIS C 6207-1982「電子計算機プログラム言語 基本BASIC」1982年に日本工業規格によって JIS C 6207-1982 として制定されたJIS規格BASIC。
- マイコンBASICを基にしており、いくつかの機能や文法が追加されました。センター試験(数学)の出題に使われたので、日本の学校で使用されました。
- 1993年に JIS X 3003-1993『電子計算機プログラム言語 Full BASIC (The Programming Language Full BASIC)』に改訂され廃止。
- Visual Basic
- Visual Basicは、1991年にマイクロソフトによって開発されたプログラミング言語です。マイコンBASICをベースに開発されており、GUI(グラフィカルユーザーインターフェイス)を作成するための機能が追加されています。Visual Basicは、Windowsアプリケーションの開発に広く使われています。
日本語ウィキブックスの本ページ『BASIC』では、主にマイコンBASICやJIS規格BASICを基準に、文法を説明しています。 その理由は、マイコンBASICは文法が単純で入門しやすく、また、古くからあるため、他のプログラミング言語にも応用しやすいためです。
歴史
[編集]BASIC(Beginner's All-purpose Symbolic Instruction Code)は、ダートマス大学のジョン・ケメニーとトーマス・カーツによって開発されたプログラミング言語で、初学者が容易に学習できるように設計されました。その誕生から始まり、マイクロコンピュータの台頭や商用バージョンの登場を経て、様々な進化を遂げてきました。本節では、BASIC言語の発展と歴史的な変遷に焦点を当てます。
- 1964年
- ダートマス大学で、ジョン・ケメニー(John Kemeny)とトーマス・カーツ(Thomas Kurtz)によって開発されたBASICの最初のバージョンが使用された。これは、学生が容易にプログラミングを学ぶことを目的としていた。
- 1965年
- BASICの最初の商用バージョン、Dartmouth BASICがリリースされた。
- 1970年
- ジョン・ケメニーとトーマス・カーツによる改訂版のBASICがリリースされた。
- 1971年
- Altair BASICがリリースされ、マイクロソフトの創業者であるビル・ゲイツとポール・アレンによって開発され;た。これは、初めてのマイクロソフトの製品となった。
- 1975年
- マイクロソフトがBASICコンパイラの最初のバージョンをリリースし、これは後に「Microsoft BASIC」として知られるようになる。
- 1977年
- Apple IIがリリースされ、BASICが標準で搭載された最初のパーソナルコンピュータの1つとなった。
- 1979年
- ANSIによるBASICの標準化が試みられたが、失敗に終わった。
- 1982年
- MicrosoftがMSXコンピュータ用にMSX-BASICをリリース。
- 1987年
- ANSIがBASICの標準化を承認し、ANSI X3.113-1987として公開された。
- 1991年
- Visual Basicがマイクロソフトによってリリースされ、イベント駆動型のプログラミングを可能にするなど、大幅な機能向上がなされた。
- 2008年
- MicrosoftがSmall Basicと呼ばれるBASICの新しい教育向け言語をリリース。
- 2010年
- MicrosoftがVisual Basic 2010 Express Editionをリリース。これは、Visual Basicの新しいバージョンで、初心者向けのプログラミングを簡素化するための機能が追加されている。
- 2017年
- MicrosoftがVisual Basicの将来のサポートについての明確な計画を発表。将来の.NET Coreや.NET 5.0以降のリリースでは、VB.NETに対する主要な新機能の提供は見送られることが示された。
このように、BASICはその歴史の中で多くの変遷を経験し、多くのバージョンがリリースされてきました。その後も、さまざまな環境での利用や教育用途などで、いくつかの派生形が使用され続けています。
標準規格化の歴史
[編集]BASIC言語の標準規格化は、その普及とともに重要性を増してきました。標準化は、異なる実装間の互換性を確保し、開発者やユーザーに安定した環境を提供することを目的としています。本節では、BASIC言語の標準規格化に関する歴史を探求します。
- 1978年
- アメリカ国立標準協会(ANSI)は、BASIC言語の標準化を目指して標準化作業を開始する。
- 1983年
-
- ANSI X3.60-1983 Information Systems - Programming Languages - Minimal BASIC
- アメリカ国立標準協会(ANSI)によって発行された初のBASIC言語の標準規格。
- これは、BASICの規格化に関する最初の試みであるが、業界全体での受け入れには至らなかった。
- 1987年
-
- ANSI X3.113-1987 Information Systems - Programming Languages - Full BASIC;
- ANSIによって発行された包括的なBASIC言語の標準規格。
- 多くのBASIC実装で採用された。
- 1991年
-
- ISO/IEC 10279
- 1991 Information technology - Programming languages - Full BASIC
- 国際標準化機構(ISO)および国際電気標準会議(IEC)によって発行された、BASIC言語の国際標準規格。
- 1994年
-
- ISO/IEC 10279
- 1991/Amd 1:1994 Information technology — Programming languages — Full BASIC — Amendment 1: Modules and single character input enhancement
- ISO/IEC 10279:1991 のエラーコードの修正や追加、仕様の明確化などの修正。
- 2000年代
- 標準化作業は一段落し、BASIC言語の主流としての地位は相対的に低下していく。
GUIに対応したBASIC
[編集]GUIに対応したBASICとは、グラフィカルユーザーインターフェース(GUI)を直接サポートするBASIC言語のことです。これらの言語は、ウィンドウやボタン、テキストボックスなどのGUIコンポーネントを使って、直感的で使いやすいGUIアプリケーションを開発することができます。代表的なGUIに対応したBASIC言語には、Visual Basic(VB)があります。
- VBのコード例
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click MessageBox.Show("Hello, World!") End Sub End Class
一方、Small Basic(SB)はGUIに直接対応していません。SBは、主にテキストベースのプログラミングとシンプルなグラフィカル要素の制御に焦点を当てた教育用のプログラミング言語です。SBは初心者向けに設計されており、シンプルな構文や直感的な操作性を提供しますが、高度なGUI開発には適していません。SBは、プログラミングの基礎を学ぶための手段として位置付けられています。
- SBのコード例
TextWindow.WriteLine("Hello, World!")
マイコンBASICの入手方法
[編集]マイコンBASICを入手する方法は、いくつかのアプローチがあります。一部のオプションは、かつて主流だったN-BASICやF-BASICなどの特定のBASIC実行環境を取得するためのものですが、その他のオプションはマイコンBASICの実行環境を再現したり、代替手段を提供することに焦点を当てています。
- フリーソフトウェア配布サイト
- Vector(ベクター; https://www.vector.co.jp/ )などのインターネット上のフリーソフトウェア配布サイトでは、特定のBASIC実行環境ソフトウェアを無償または有償でダウンロードできる場合があります。
- オープンソースプロジェクト
- FreeBASICやQB64などのオープンソースプロジェクトは、Microsoft Quick BASIC(MS-DOS時代)との互換性を提供し、マイコンBASICの実行環境を再現しています。これらのプロジェクトでは、BASICプログラミングを続けたり、新しいプロジェクトを始めたりすることができます。
- 他の企業や個人によるアプリケーション
- 他の企業や個人が開発したマイコンBASICの実行環境を再現したアプリケーションもあります。これらはフリーソフトウェア配布サイトなどで入手できる場合があります。
マイコンBASICの入手が困難になった背景には、以下のような理由が考えられます:
- ワープロソフトや表計算ソフト、はがき印刷ソフトなど、特定の用途に特化したアプリケーションソフトウェアが普及し、一般消費者がプログラミング言語を学ぶ必要がなくなったこと。
- ビジネスでプロブラムを作る人々が、より生産性の高い言語やツールを使用するようになったこと。
- 主流となるコンピュータ環境が変化し、ROM BASICやDisk BASICからWindowsやMacintosh、OS/2などの新しいプラットフォームに移行したこと。
これらの理由により、マイコンBASICの需要が低下し、一般的なプログラミングニーズや技術環境の変化に適応する必要性が生じました[1]。
マイコンBASICでのプログラムの入力
[編集]まず、使用するBASIC(ベーシック)を選び、起動して下さい。
BASICで画面に文字を表示するためには PRINT
文を使います。ただし、新しいBASICでは、まったく別のコマンド文になります。
BASICが起動すると、「Ok」「Ready」など(BASICや機種によって異なります)の文字の下に「■」(カーソル)が出ます。カーソルはカーソルキーの上下左右で移動できます。このカーソルが出ているときに、BASICのプログラムを編集できます。
では最初に、PRINT文を使って、画面に文字を表示させてみましょう。
PRINT "Hello BASIC"
と入力してみてください。入力時の文字モードは、直接入力モードで入力してください。Windowsの場合、右下に、文字入力モードの切り替えのタブがあるので、そこをクリックして、直接入力モードを選んでから、上記のPRINT文を入力してください。
このように上記のPRINT文を入力し、RUN(「ラン」という。「起動せよ」の意味)を実行すると(実行方法は機種によって異なりますので、それぞれの機種を参考にしてください)、画面に Hello BASIC と表示されます。
同様に、新しい行で、画面の左端にカーソルがある状態で、
PRINT 2+3
のように入力してみて(最後にEnterキーを入力して改行します。機種によってはRETURNキー、CRキーとも言います。以下、同じなので省略します)、RUNを実行すると(実行方法はそれぞれの機種を参考にしてください)、5 と計算の結果が表示されます。
このように、PRINT命令は、その直後にあるものを画面に表示します。
また、BASICでは、命令を実行することをRUN(ラン)と言います。英語の「走る」 RUN と同じ単語です。ランニング(走り)やランナー(走者)のランと同じです。
いっぽう、
PRINT "2+3"
をRUNで実行すると、画面に"2+3"とそのまま表示されます。
つまり、二重引用符 " " は、「引用符内の文字列を、画面にそのまま表示しろ」という意味の記号です。
他のプログラミング言語でも、「print」という語をテキスト表示命令に用いるプログラミング言語は多いです。また、他のプログラミング言語でも、文字列を表示する場合は、二重引用符 " " で くくるのが、普通になっています。
もし、二重引用符でくくらないと、
- エラーが出る例
PRINT Hello BASIC
は「エラーのある文なので実行不可能」的な報告を コンピューターから報告されたり、あるいは、まったく予期せぬ数値や文字が表示されるなどのエラーを起こします(例えばundefined)。
行番号
[編集]マイコンBASICでは、プログラムは「行番号+命令」の形でかかれます。行番号をつけないで入力すると、前述のように「命令を即実行して、終了」します。先頭に行番号をつけることで初めて、命令を組み合わせた「プログラム」として実行できるようになります。0未満の数や小数、分数は行番号にできません。
- 簡単なプログラムの例
5 CLS 10 PRINT "3+5="; 20 PRINT 3+5 30 END
各行の最初についている数字が行番号です。10からはじめて10ずつ増やしていくのが一般的です。こうすれば、後から簡単に行を挿入することができます(ただし9行まで)。PRINT は前節で説明した通り画面に文字を出力する命令です。最後の END はプログラムの終了を表す命令で、省略可能なBASICも多いですが、そうでなければ必ず入れるようにします。
入力したら
RUN
と(行番号なしで)入力すると実行します。 このプログラムを実行させると、画面に「3+5= 8」と表示されます。
10行の最後についている ; は、「改行しない」ことをコンピューターに通知します。これを取り除くと、実行したときに「3+5=」と「8」が別の行に表示されてしまいます。これを利用して、一行分空白にすることができます。
なお、マイコンBASICでは「:」を用いると次のようにも書けますが、現在では推奨されません。
5 CLS 10 PRINT "3+5=";:PRINT 3+5 20 END
現在、一部の(再現)BASICでは、
5 CLS 10 PRINT "3+5=";3+5 20 END
のように記述することができます。
なお、ENDはプログラムの終了を表す命令でしたので、たとえば、
5 END 10 PRINT "3+5=";3+5 20 END
のようなプログラムだと、「3+5=」を表示する前に、いきなり終了します。
行番号が順番どおりでない場合
[編集]20 PRINT("aaa20") 10 PRINT ("bbb10")
のように、行番号が順番どおりではない場合、どの行を優先して実行するのでしょうか?
現代のGUI対応のBASICでは、行番号のないものが多いのですが、その理由のひとつも、おそらく、このような、行番号と順序のちがう場合の混乱を防ぐためなど、それなりの理由があるのでしょう。
さて、たいていのマイコンBASICの場合、行番号の小さい順から先に実行すると思います(いくつかの再現BASICソフトで確認)。この場合、特にエラーメッセージなどは、出されません。
おそらく、マイコンBASICでは、ソフトウェアの内部では、プログラムの実行のさいしょに(つまりRUN命令の直後に)、まず行番号にもとづいて並べ替えを行って、
10 PRINT ("bbb10") 20 PRINT("aaa20")
のように並べ替えてから、それからやっと、上から順に実行をしているのでしょう。
つまり、これらのマイコンBASICは、プログラムを最初に実行する際、まず並べ替えを行っているのです。
もし、行数が10行ていどの少ないプログラムなら、それでもかまいませんし、気の利いた便利な機能でしょう。
しかし、もし百行や千行もあるプログラムを並べ替えるとなると、並べ替えには時間が掛かるので、プログラムの実行が終わるまでの時間が長引いてしまいます。
反対に言うと、行番号のないBASICの場合、そのぶん高速化をしている可能性があります(並べ替えの時間が省けるので)。
さらに言うと、行番号のあるBASICの使い道は、処理に時間が掛かってもいいので、処理の順序を確実にまちがいなく、自分以外の他のプログラマーにも伝えたいようなプログラムを書くときには、もしかしたら行番号のあるBASICが便利かもしれません。
プログラムの編集
[編集]エディタのないマイコンBASICでは、
LIST
と入力すると、プログラム(プログラムリスト)を先頭の行からから表示します。
LIST 10
と入力すると10行目だけを、
LIST 20-
と入力すると20行目以降すべてを、
LIST -20
と入力すると先頭の行から20行目までを、
LIST 20-30
と入力すると20行目から30行目を表示します。
また、
AUTO
と入力すると、改行するたびに行番号を10ずつ増やして自動的に表示します。自動表示を停止させるのはBREAKキーを押します(機種によってはSTOPキーや、CTRL+STOPキーを同時押しなど、操作が多少異なります)。
- なぜ、こうなってるのか?
今でこそ、プログラムの実行結果の画面と、プログラム記述用のエディタ画面とは、別々の画面に分かれているのが普通です。
しかし、昔のパソコンでは、表示ウインドウが標準では1つしかありませんでした。そもそも「ウィンドウ」という概念すらなく、昔の古いプログラム言語では、実行結果の表示画面と、エディタ画面とが、同じひとつの画面だったりします。しかもコマンド入力機能がプログラム記述機能も兼ねていたり、あるいはパソコン本体にあるレバースイッチ(小型のレバースイッチがついていたりする)により、コマンド入力モード(「ターミナルモード」という)とプログラミングモードとを切り替えたりしていました。
現代でも、Windowsのコマンドプロンプトのような、OS付属のコマンド入力用アプリケーションでは、普通、ウィンドウは1つだけであり、そのたったひとつのウィンドウが、実行結果の表示画面と、コマンド入力画面とを兼ねています。
新しいBASICでのプログラムの入力
[編集]新しいBASICでは、プログラムを編集するためのエディタを持っており、これを入力に使います。エディタの概要や使い方自体は省略します。また、次のように「行番号を省略」できます。
PRINT "3+5="; PRINT 3+5 END
プログラムの実行は、RUNではなく、エディタのメニューから「実行」を選択します。
マイコンBASICのように「命令を実行して、即終了」するには、中には「直接入力」(例: イミディエイト ウィンドウ )が簡単にできる新しいBASICもありますが、ほとんどの新しいBASICではエディタのメニューから対応した項目を選ぶ必要があります。
ここでは行番号付きのマイコンBASICの書式で説明します。
以下は基本的に古い形式で説明します
[編集]- ここで 古い形式を N-BASIC, MSX-BASIC とします。それ以降のBASICで働くように考慮します。
- 説明はストレートでわかりやすく、具体例を多く入れます。
- 出来るだけ専門用語を使いません。もし使うときは説明を入れます。
最初に
[編集]- BASICのプログラムは行単位で実行されます。
- 行の上から下に向かって実行されます(分岐などもあります)。
- STOP命令, END命令で実行が終了します。
- 空白にも意味がありますので注意しましょう。
※ 他のプログラム言語でも、似たような文法の言語は、多くあります。他のプログラム言語によくあるのは、主に、
- 特別な指示がないかぎり、上から下に向かって順に実行される。
- 空白に意味がある。
です。
REM(コメント)
[編集]BASICのコメントは、プログラム内での説明やメモを記述するためのテキストです。これらのコメントはプログラムの実行時に無視されますが、コードの理解やメンテナンス、共同作業を支援します。
REM(Remarkの略)ステートメントによってコメントを書くことが一般的ですが、マイクロソフト系のBASICでは、 アポストロフィ(')もコメントに使用できます。アポストロフィを使ったコメントは、REMステートメントと同様にプログラムの実行時に無視されます。
例えば:
10 REM この行は画面に「Hello, world!」と表示する 20 PRINT "Hello, world!" 30 ' これも同じく画面に「Hello, world!」と表示する 40 PRINT "Hello, world!"
上記の例では、REMステートメントとアポストロフィの両方を使って、同じ意味のコメントを追加しています。 どちらの方法でも、プログラムの実行時にコメントは無視され、PRINTステートメントが実行されます。
BASICにおけるコメントの利用は、プログラムの可読性やメンテナンス性を向上させるために非常に重要です。コメントを適切に活用することで、他の人がコードを理解しやすくなりますし、自分自身も後でコードを振り返った際に追いやすくなります。
また、BASICではコメントを使ってプログラムの一部を一時的に無効化することもできます。これは、デバッグの際に特定のコードを実行させないようにしたり、あるいはプログラムの一部をテストしたりする際に役立ちます。
コメントは、プログラムのどこにでも追加することができますが、コードの意味や目的を明確にするためには、適切な位置に追加することが重要です。また、コメントは必要最小限に留めることが望ましいです。過度なコメントはコードを読みにくくする可能性がありますので、コード自体が自己説明的であることが理想的です。
PRINT命令
[編集]BASICのPRINT命令は、画面に文字列や数値を表示するために使用されます。以下に、BASICのPRINT命令の使い方とコード例を示します。
PRINT命令の使い方
[編集]PRINT命令は、次のように使用します。
PRINT expression1 [, expression2 [, expression3, ...]]
ここで、expression1
, expression2
, expression3
などは、表示したい文字列、数値、変数、または式です。カンマで区切って複数の値を指定することができます。PRINT命令は、指定された順番に値を画面に表示します。
コード例
[編集]10 PRINT "Hello, world!" ' 文字列の表示 20 LET x = 10 ' 変数に値を代入 30 PRINT "The value of x is: ", x ' 変数の値を表示 40 PRINT "The sum of 3 and 5 is: ", 3 + 5 ' 式の結果を表示 60 PRINT "The value of x is: "; ' (;) で終わると改行しない 70 PRINT x ' 変数の値を表示
上記のコード例では、最初のPRINT命令で文字列 "Hello, world!" を表示し、次に変数xの値を表示しています。また、最後のPRINT命令では、3と5の和を表示する式を使用しています。
Microsoft系の簡略表記
[編集]Microsoft系のBASICでは、PRINT命令を ?
と簡略して記述することができます。
また、セミコロン(;)を使うことで、改行を抑止する事ができます。
10 ? "Hello, world!" ' 文字列の表示 20 LET x = 10 ' 変数に値を代入 30 ? "The value of x is: ", x ' 変数の値を表示 40 ? "The sum of 3 and 5 is: ", 3 + 5 ' 式の結果を表示 60 ? "The value of x is: "; ' (;) で終わると改行しない 70 ? x ' 変数の値を表示
上記の例では、?
を使用してPRINT命令を簡略化し、セミコロン(;)を使用して改行を抑止しています。
これにより、コードをより短く、読みやすくすることができます。
変数
[編集]変数は、数値や文字などのデータを入れておく箱のようなものです。
変数の名前には、以下のような規則があります。
- アルファベットから始まる。
- 1ABC などは不可
- アルファベットと数字で構成される。(記号と空白は不可)
- A:B PI3.14 などは不可
- BASIC内で使用されている命令名と重複しない。
- PRINT などは不可
- 変数名の大文字と小文字は区別されない。
- ABCとaBcは同じ変数と解釈される。
また、マイコンBASICや簡易なBASICでは、機種によって変数名の長さに「2文字以下」「8文字以下」という制限があります。
入力 INPUT
[編集]キーボードから入力するには、INPUT文を使います。
5 REM これは 数値をキー入力して、変数Aに代入、そして変数Aを表示する。 10 INPUT A 20 PRINT A 30 END
10 INPUT A では、数値変数Aに キーボードから入力した数値を代入します。
このような書き方も出来ます。
10 INPUT "数値を入力して下さい ",A 20 PRINT A 30 END
入力を促す文字列を表示してから、入力に入ります。
代入と計算
[編集]変数は、数値や文字などのデータを入れておく箱のようなものです。
10 A=12 20 B=3 30 PRINT A+B 40 PRINT A-B 50 PRINT A*B 60 PRINT A/B 70 END
このプログラムは、変数 A に 12、変数 B に 3 を代入し、足し算・引き算・掛け算・割り算の結果を表示する物です(順に、15 9 36 4 と表示されます)。
変数への代入は = を使用します。上のプログラムでは直接数字を代入しましたが、計算式(変数を使用するものも含む)を評価した値を代入することができます。
BASICにおける代入とは、「記号=の右辺の計算式を評価した値を、記号=の左辺の変数に割当てよ」という意味です。
そのため、
12 = A
という命令はエラーになります。 かならず、代入先の変数は、記号=の左辺にある必要があります。
また、右辺にある計算式を、記号=の左にある変数に代入するので、
A=A+1
のように、自分自身を用いた式を代入することもできます。もし、「A+1=A」という順序だと、エラーになります。
10 A=12 20 A=A+1 30 PRINT A 40 END
を実行すると、計算結果(12+1)の「13」が表示されるでしょう。
なお、変数への代入は「LET」命令で、
A=12
は
LET A=12
なのですが、JIS規格BASICを除いて、ほとんどの新旧のBASICを問わず、LETは省略可能です。
計算の記号は、足し算には+、引き算には-、掛け算には*、割り算には,/ の記号が割り当てられています。余りは「MOD」(モジェロ)です。
括弧()を使う事が出来ます。計算の順序に迷ったら括弧を使うようにしましょう。
100 A=(10+2)/4
将来的に、LET文のある他のプログラミング言語の学習のことを考えて、LET文をつかって上記のプログラムを書いてみましょう。
10 LET A=12 20 LET B=3 30 PRINT A+B 40 PRINT A-B 50 PRINT A*B 60 PRINT A/B 70 END
入力命令
[編集]利用者からキーボードで数値を入力してもらうには、INPUT 文を使います。 INPUT命令を使って数値または文字列(変数名$)を入力させる場合、
- 例
INPUT "ここに文字を表示させることも可能";変数名 PRINT "入力した数値(文字列)は";変数名;"です"
とします。
(プログラム例)
10 INPUT "数値を入力してください" ;A 20 PRINT "入力された数値は" 30 PRINT A 40 PRINT "です。" 50 END
または
5 PRINT "数値を入力してください" 10 INPUT A 20 PRINT "入力された数値は" 30 PRINT A 40 PRINT "です。" 50 END
変数の初期化
[編集]たとえば、上のプログラムを実行したあとに、
PRINT A
を実行すると、さきほど入力した変数が出るかもしれません。
この理由は、メモリ内に、以前に使用した変数が、そのまま残っているからです。
つまり、プログラムを終了しても、それだけでは変数の内容は消去されません。
命令 NEW を使うと、BASICで扱っている変数にすべてゼロ 0 を代入し、初期化(しょきか)します。
もし、上の節のプログラムの実行直後に、まったく別のプログラムを実行する必要があったとして、そこでも同じ変数名の変数が使われていたとしたら、その変数は初期化をしていないと、エラーの原因になってしまいます。
まったく別のプログラムでも、同じ変数名「A」や「B」を、まったく別の内容で使うこともありますので、必要に応じて NEW 命令を使いましょう。
10 NEW 20 LET A=7 30 PRINT A+9 40 END
と書いて実行すれば、このプログラムの実行前にどんなプログラムで変数「A」を用いていようが、それを初期化できます。
なお、上記のプログラムの実行結果として、計算結果として「16」が表示されます。
このプログラムの場合なら、わざわざNEWで変数Aを初期化しなくても、その次の行で A=7と記述しているので、じつは初期化の必要はありません。
ですが、作ろうとするプログラムが複雑になってくると、あつかう変数の個数が多くなり、変数ひとつずつ初期化をするのが大変になる場合もありますし、個数が多いと一つづつ初期化する方法だと、初期化しわすれる変数も出て来るかもしれません。
なので、ねんのため、 NEW 命令で、いっきに、すべての変数を初期化してしまいましょう。初期化される対象は、そのBASICで扱っている「変数」だけですので、安心しても平気です。
なお、下記のように、もし計算途中に、NEWを入れると、
(あまり、よくないプログラム)
20 LET A=7 25 NEW 30 PRINT A+9 40 END
このプログラムなら、PRINT命令で「9」が表示されたりします。なぜならAが初期化されてしまい、Aに0が代入されているからです。
なお、現在のプログラム言語では、NEW命令は別の意味で使われています。
なお、計算作業のときに、初期の瞬間の状態に対応する数値のことを、科学技術用語で「初期値」(しょきち、initial value イニシャル バリュー)といいます。ファミコンソフトなどのゲーム業界などでも、ゲーム開始状態の主人公のライフ(生命力)値とかの数値をまとめて「初期パラメーター」などといいますね。それと同じことです。
理科などでは、たとえばボールを投げた瞬間のボールの速度のこと「初期速度」と言います。
もし、現代のプログラム言語のなかの命令文の語句で、「init」などの語句があったら、それはもしかしたら、初期値(※ 英語で initial value )のことかもしれません。
条件分岐 IF THEN ELSE
[編集]「もし、明日 晴れだったなら、遠足。そうでなく、雨だったらなら、教室で自習。」のような場合わけを条件分岐(じょうけん ぶんき)といいます。
プログラム中である条件に当てはまるかで実行する内容を変えるときには IF~THEN~ELSE文 を使用します。
条件分岐では IF という語句をほぼかならず使うので、条件分岐命令のことを「IF文」とも言います。「IF」とは、「イフ」と読み、「もし 〜〜 ならば、」という意味の英語の接続詞です(日本では、中学校の英語の授業で 接続詞 IF を習うでしょう)。
THEN は「そうであれば〜〜」という意味です。ELSE は「そうでなければ〜〜」という意味です。なお、THENは「ゼン」と読み、ELSEは「エルス」と読みます。
ほかのプログラム言語でも、条件分岐命令のことを普通は「IF文」と言います。
10 A=0 20 B=3 30 IF A > B THEN PRINT "A is bigger than B" ELSE PRINT "B is bigger than A"
ここで使っているA > Bの > は比較演算子(ひかく えんざんし)といい、数値の比較に使います。
演算子 | 意味 | 数学の記号 |
---|---|---|
A = B | AとBは等しい | A=B |
A > B | AはBより大きい | A>B |
A < B | AはBより小さい | A<B |
A >= B | AはB以上 | A≧B |
A <= B | AはB以下 | A≦B |
A <> B | AとBは等しくない | A≠B |
他のプログラム言語でも、IF文 の考え方と 比較演算子 の考えかたは、ほぼかならず使います。なので、いまここのBASICの学習で、比較演算子の考え方を、しっかりと理解しましょう。
IF文は、IFとTHENの間に条件式を書き、THENから条件式が成立するときの命令を書きます。そして成立しなかったときのことはその後ろにELSEに続けて書きます。
例の30行目は、もし A > Bが成立すればPRINT "A is bigger than B"を実行し、もし成立しなければPRINT "B is bigger than A"を実行するという意味であります。文字列の場合は、
IF 変数名$="" THEN 真の場合の行番号または命令 ELSE 偽の場合の行番号または命令
PRINT命令の場合、PRINTを省略(THEN "内容"のように)できます。
なお、ELSEは省略できます。
複数行にわたってしか書けないものを実行させたい場合、GOTO命令(後述)を使い行を飛ばす必要があります(この場合、GOTOと書くのを省略して、行番号だけでも書けます)。
分岐 GOTO
[編集]無条件でジャンプします。
条件分岐ではない、強制の分岐にはGOTO命令を使います。「GOTO」は「ゴー トゥー」と読みます。GOTOの後に行番号を入れると、対応する行の命令を実行します。
10 GOTO 30 20 PRINT "1" 30 PRINT "2" 40 END
このプログラムを実行すると20行目がスキップされ、30行目が実行されて、画面に「2」とだけ表示します。
10 GOTO 40 20 PRINT "1" 30 GOTO 60 40 PRINT "2" 50 GOTO 20 60 END
このプログラムを実行すると、画面に「2」「1」と表示します。が、このようにGOTOの飛び先が入り組んだプログラムは「スパゲティ・プログラム」と呼ばれて、「他の人が見てもプログラムの構造を一目では把握しづらい」ために、通常のプログラムでは 禁じ手(きんじて) とされています。
10 PRINT "1" 20 PRINT "2" 30 GOTO 10 40 END
このプログラムを実行すると、画面に「1」「2」を表示し続けます。このように「終了せずに、実行し続ける」プログラムを「無限ループ」と呼びます。表示を止めるには、マイコンBASICではAUTO命令を止めるときと同様に「BREAK」などのキーを押してください。新しいBASICではメニューから「停止」を選択します(Visual Basicなどでは無限ループを書くとそのまま問答無用で応答不能になってしまうものもありますので、アプリケーションを強制終了させるか、CTRL+ALT+DELするなどしてOSから強制終了させてください)。
新しいBASICでもGOTO命令は使用できますが、推奨はされません。
どうしてもGOTO文を使う必要のある場合には、REM文などによるコメント機能も活用しましょう。GOTO文の前の行で、REM文による説明で、GOTO文の行き先を説明したり、あるいは処理しようとしている内容などを記述すると、他の人がプログラム内容を把握しやすくなるでしょう。
繰り返し FOR NEXT
[編集]プログラム中で同じ処理を繰り返す場合には、FOR~NEXT 文を使用します。
10 J=0 20 FOR N=1 TO 5 30 J=J+N 40 PRINT "N=";N;" J=";J 50 NEXT N 60 END
この例は、FORからNEXTの間を繰り返します。回数は、1から5までの5回。もしSTEPを指定してあれば、増量値の設定ができます。
これを実行すると以下の様に表示されます。
FORの直後の変数(上記の場合はN)と、NEXTの直後の変数は、同じ変数でなければなりません。
N= 1 J= 1 N= 2 J= 3 N= 3 J= 6 N= 4 J= 10 N= 5 J= 15
FOR 文の構文は以下の様になります。
FOR 変数=初期値 TO 最終値 STEP 変更量
上の文のうち、「STEP 変更量」は省略できます。省略されたときには変数は1づつ変化します。
変数が初期値から最終値まで変化し、その各値ごとに NEXT までの文が実行されます。
DATA文
[編集]INPUT文で毎回データ入力するのは大変です。
プログラムの中に記録することが出来ます。 DATA文、READ文、RESTORE文 です。
20 READ A 30 PRINT A 40 DATA 1,2,3
20行でDATA文から1個読み込んで変数Aに代入します。30行で表示します、この例では「1」が表示されます。もし次に読み込んだなら「2」が読み込まれます。
10 RESTORE 50 20 READ A 30 PRINT A 40 DATA 1,2,3 50 DATA 4,5,6
10行のRESTOREでDATA文の読み込み先を指定します、ここでは50行から読み込みます。20行で読んで、30行で表示。この例では「4」が表示されます。普通は FOR NEXT文などを使って 連続して読み込みます。
DATA文の考え方は、ファイル操作のシーケンシャルファイルと似ています。
サブルーチン GOSUB
[編集]同じ内容のプログラムは、まとめてサブルーチンにする事ができます、GOSUBです。
110 INPUT A 120 GOSUB 200 130 PRINT A 150 END 200 REM サブルーチン 210 A=A*2 220 RETURN
プログラムの動きを行番号で書きます。 110 120 200 210 220 130 150 。順番に注目。 RETURNを使うとGOSUBの次に戻ります
関数
[編集]BASICの関数は、特定の入力値を受け取り、処理を行い、その結果を返す手続きです。 これらの関数は、プログラム内で再利用可能な小さなサブルーチンとして使用されます。
以下に、いくつかの一般的なBASICの関数を表形式で解説します。
一般的なBASICの関数 関数 説明 使用例 ABS 渡された数値の絶対値を返します。 x = ABS(-10) SIN 渡された角度の正弦を返します。 x = SIN(30) COS 渡された角度の余弦を返します。 x = COS(45) TAN 渡された角度の正接を返します。 x = TAN(60) INT 渡された数値の整数部分を返します。 x = INT(5.7) RND 0から1までのランダムな浮動小数点数を返します。 x = RND LEN 渡された文字列の長さを返します。 x = LEN("Hello") LEFT 渡された文字列の左端から指定された数の文字を取得します。 x = LEFT("Hello", 2) RIGHT 渡された文字列の右端から指定された数の文字を取得します。 x = RIGHT("Hello", 3) MID 渡された文字列から指定された位置と長さの部分文字列を取得します。 x = MID("Hello", 2, 3) DATE 現在の日付を返します。 x = DATE TIME 現在の時刻を返します。 x = TIME DATEDIFF 2つの日付の間の日数を返します。 x = DATEDIFF("2023-01-01", "2022-12-31")
これらの関数は、BASICプログラムで様々な計算や処理を行う際に使用されます。例えば、数値の操作、文字列の処理、日付や時刻の取得など、多岐に渡る用途に活用されます。
- コード例
10 INPUT A 20 B=ABS(A) 30 PRINT B 50 END
ABS()は絶対値を返す関数です。
文字列操作 $
[編集]ここまでの説明で、数値のみを扱いました。ここでは、文字の入力、表示、操作を説明します。
文字定数と文字変数
[編集]文字を表す時は""で囲みます。
"これは文字です"
文字を表す文字列変数では、変数名の末尾に$を付けます。
A$="文字列"
文字列の結合
[編集]文の足し算が出来ます。
10 A$="今日は" 20 B$="晴れ。" 30 C$=A$+B$ 40 PRINT C$ 50 END
文字の入力と表示
10 INPUT A$ 20 PRINT A$ 30 END
文字列の関数と変換
[編集]BASICでは文字列の便利な関数があります。
ASC(x$) RIGHT$(x$,y) LEFT$(x$,y) MID$(x$,y,z) LEN(x$) STR$(x) VAL(x$) CHR$(x) TAB(x)
浮動小数点 #
[編集]ここまでは数値の整数で行いました。
割り算で割り切れないときに扱う小数点の処理、浮動小数点の定数、変数について説明します。誤差についても。
BASICでは小数点を付けると、小数点付きの実数として扱われます。
100 PI=3.14
100 A=3.14 200 PRINT A 400 END
- 誤差
コンピューターの計算では誤差が発生します。 誤差の程度は機種によって異なります。
10 A=10.0/7.0 20 B=A*7.0 30 PRINT A 40 PRINT B 50 END
配列 DIM
[編集]住所録のようなものを作るときに使います。同じような変数をたくさん作るときに、変数が多くて大変です。そこで配列変数(はいれつ へんすう)を使います。
使い方は、最初に配列変数を宣言します。例えば DIM a(3)と書いたなら、変数a(1) a(2) a(3)の3個の配列変数が使えるようになります(BASICの種類によってはa(0)も使えるものがあります)。
「DIM」とは次元 DIMENSION の略のことです。DIMの部分が、配列宣言の命令です。DIM a(3)の「a」の部分は変数名ですので、べつにbでもcでも、かまいません。
DIM a(3)のカッコとカッコ内の部分を「添え字」(そえじ)と言います。
配列変数の便利な所は、数値で書いた部分に数値変数を使って、例えば、a(i)のように使う事ができ、ループなどと組合わせれば多数の変数を一度に扱うことが出来ます。
10 DIM A(10) 20 FOR I=1 to 10 30 A(I)=I*2 40 NEXT I 50 FOR J=1 TO 10 60 PRINT A(I) 70 NEXT J 90 END
これは、一次元配列の例です。
10 DIM NAMAE$(3) 20 DIM NO(3) 30 FOR I=1 TO 3 40 INPUT "NAMAE";NAMAE$(I) 50 INPUT "BANGO";NO(I) 60 NEXT I 70 FOR I=1 TO 3 80 PRINT NAMAE$(I),NO(I) 90 NEXT I 100 END
これは、3人の名前と番号を入力して、表示するプログラムコードです。配列を使うことにより、簡潔に書くことが出来ます。簡単に人数を多くすることが出来ます。改良して住所録のように作り変えることも容易です。
配列には、このような一次元配列の他に二次元、3次元配列もあります。
あとがき
[編集]ここでは、始めての人が雰囲気をつかめるように基本の中の初歩を最低限に書きました。そして、初級と応用は別の本につづきます。
補足
[編集]複数行のIF文
[編集]現在では構造化BASICもあります。これは条件文が成立すればTHENからENDIFあるいはELSEまでの部分を実行して、成立しなければELSEからENDIFまでを実行するもので、例のプログラムは
10 A=0 20 B=3 30 IF A > B THEN 40 PRINT "A is bigger than B" 50 ELSE 60 PRINT "B is bigger than A" 70 ENDIF 80 END
と書けて、非常に見やすくなります。ただし、必ずしも使えるものではありません。マイコンBASICでは1行で書く方法しか使えません。
マルチステートメント
[編集](:)で区切って、一行に多くのコマンドを書く事ができます。ただし、これはマイコンBASICの文法なのであまり使わない方が良いでしょう。
マルチメディア関係
[編集]円や直線などの画像を表示したり、音声を鳴らしたりなどの機能の命令は、BASIC対応のパソコンを作っている会社ごとに違っていました。ハードウェア側の性能にも関係することであり、そのため、仕様統一しきれなかったのです。
一応、BASICの国際規格も存在していますが、実際には、この規格に従ってないBASICも多いです。おそらく、特に、画像表示や音声などのマルチメディア関係の機能では、そのような規格外の仕様が多いでしょう。
このwikibooks日本語版『BASIC』では、日本の読者を対象にしていることもあり、日本で普及した日本産パソコンのハードウェアを想定して、BASICの、画像表示や音声などのマルチメディア関係のプログラムを記述します。
グラフィック関連
[編集]直線
[編集]- ※ BASICの書籍が入手できないので、記憶とネット上の情報に頼って記述しております。
N88BASIC互換のBASICならば、画像をつくるときは、
LINE (100,130)-(200,230),1
のように記述することで、画像で直線を引けます。
内容は、
LINE(始点のx座標、始点のy座標)-(終点のx座標、終点のy座標)、色番号
です。 気をつけることとして、画面の左上が座標(0,0)です。右下に行くにつれて、座標の値が大きくなります。
色番号は、一般に、
- 0 黒
- 1 青
- 2 赤
- 3 紫
- 4 緑
- 5 水色
- 6 黄色
- 7 白
です。色番号のことを「パレット番号」ともいいます。
背景色が標準設定では黒でしょうから、色番号が0(黒)だと、線が見えないかもしれません。
LINE (100,130)-(200,230),1
は、青色の直線を引きます。
LINE (100,130)-(200,230),2
は、赤色の直線を引きます。
LINE (100,130)-(200,230),2,B
とすると、長方形の枠線のみを描きます。その長方形の対角線の座標が、(100,130)から(200,230)というわけです。 BはBOXの意味です。
この命令 LINE (100,130)-(200,230),2,B では、対角線は、描かれません。また、塗りつぶしも、されません。
塗りつぶしをするには、「B」ではなく「BF」にします。
LINE (100,130)-(200,230),2,BF
FはFILLの意味です。
円
[編集]書式は
CIRCLE (中心のx座標,中心のy座標),半径,色
です。
たとえば、
CIRCLE (250,180),50,2
で、(250,180)座標を中心とする半径50の赤い(色番号: 2)円を書きます。
円弧を描くには、
CIRCLE (中心のx座標,中心のy座標),半径,色,開始角,終了角
の構文を利用します。
角度の測り方は、数学のxy座標での角度の測り方と同じで、右を0度として、半時計まわり(左まわり)です。角度の単位は、ラジアン です。約3.14で半円になります(BASICのソフトウェアの種類によっては、違うかもしれません。それぞれのソフトウェアごとに確認してください。)。
まだラジアンを習っていない中学生のかたは、この節は飛ばしましょう。
5 CLS 10 CIRCLE (250,180),50,2,0,3.14
と書けば、半円弧が描かれます。
楕円(だえん)または楕円弧を書くには、
10 CIRCLE (250,180),50,2,0,3.14,2
のようにします。
CIRCLE命令は、
CIRCLE (中心のx座標,中心のy座標),半径,色,開始角,終了角,比率
という書式になっています。
比率は、縦と横の比率であり、1だと正円になります。1より大きいと縦長の楕円になり、1より小さいと横長の楕円になります。
塗りつぶすには、
点のプロット
[編集]命令「PSET」を使うと、指定した位置に、点をひとつ追加します。
書式は
PSET(x座標,y座標),色番号
です。
PSETの活用方法は通常、次のように、FOR文などの繰り返し文とくみあわせて、計算式などの結果の作図をするのに使用するでしょう。
10 FOR N=0 TO 50 20 PSET(200+N,100+0.01*N*N),1 30 NEXT N 40 END
音
[編集]BEEP
と入力すると、「プツッ」とか「ピー」とかの音を鳴らします。ビープ音といいます。
乱数
[編集]「RND()」で、0から1までの小数を含む乱数を発生させます。
RND(1)のように、括弧の中に数字を入れて使用します。
10 X = RND (1) 20 PRINT X
のように使用します。
サイコロをつくるには(1から6の整数だけを出すプログラムをつくるには)、乱数命令に、整数化の命令などと組み合わせます。
ループさせていますが、INPUT 命令を使ってEnterキーを押すごとに次の乱数を表示させています。RND()は、実際には1の値が生成されることは、ほとんど無いと思われるのでこのプログラムになります。割り込みキー(BREAKキーやESCキー)で実行が終了します。
10 X = INT(RND(1) * 6 + 1) 20 PRINT X 30 INPUT Y 40 GOTO 10
1970〜80年代のパソコン事情が背景にある
[編集]BASICは、形式的には、BASICはプログラム言語であるとして分類されています。しかし、実際には、マイコンBASICを21世紀に再現したBASICでは、他のプログラム言語にはない、画像表示の機能が充実しています。これはどういう事かというと、再現BASICでは、画像表示の命令を実行する際には、OSの画像表示の機能を呼び出して、使っているのです。一般的に、プログラムを通しての画像表示についての仕様は、各OSごとにバラバラです。そのため、BASICのインタプリタ自体の作成者は、それぞれのOSごとに、BASICインタプリタを作りなおす必要があります。このため、再現BASICには、Windows版しかインタプリタの作られてない再現BASICもあります。
そもそも、実際のマイコンBASICの流行した1970年代ごろは、21世紀の今とはパソコン販売の状況が違っています。1970年代ごろの当時は、まだOS(オペレーティング システム)が高度化する前だったこともあり、さらに、OSとパソコン本体がくっついて販売されていたこともあり、1970年代ごろは、BASICが販売されているパソコンと一緒に、OSと一緒にパソコン本体に組み込まれている状態で、販売されていました。
このため、実際の1970〜80年代に市販されていたパソコンに組み込まれていたBASICでは、画面に円や直線などを表示したりする画像表示の命令や、ブザー音を鳴らすなど命令なども、簡単にプログラム記述できるようになっています。
本来、画像表示のための処理は、ディスプレイの種類ごとに、解像度がバラバラだったりするので、パソコン内部動作を分ける必要があるので、オペレーティングシステムの機能を使って、画像を表示したりすることになります。
しかし、当時のBASICでは、オペレーティングシステムの仕組みを、意識する必要はありませんでした。なぜなら、特定企業のパソコンに組み込まれた状態でBASICが配布されていたので、その特定企業のディスプレイやスピーカーといったハードウェアを、簡単に制御できるように、BASICが改良してあったのです。
このような事情のため、そもそも当時のほとんどの消費者は、そもそもオペレーティング システムいう概念すら知りませんでした。
このように、BASICの機能の背景には、1970〜80年当時のパソコン事情があります。
1970年当時は、各パソコン会社のBASICが最初から特定の自社パソコンに対応した状態で、パソコンに組み込まれていて販売されていたので、BASICから直接オペレーティングシステムの機能を利用できるわけです。このため、1970年ごろのBASICの機能は、現在の「プログラム言語」とは、やや違っています。
さて21世紀の現在、プログラムで画像を表示したり、あるいは音声を鳴らしたりなどのプログラムを記述したい場合には、オペレーティングシステムの機能を活用する必要があります。OSの機能を使うためのコマンド群である「API」(エー ピー アイ)といいます。つまり、再現BASICのインタプリタ作成者は、(おそらく)APIを駆使して、再現BASICの画像表示や音声機能などを、作っているのです。
オペレーティングシステムには、ウィンドウズやマックOSやリナックスなど、色々とありますが、それぞれのOSごとに仕組みが違うので、プログラムの記述作業も、それぞれのOSごとに、プログラムを分ける必要があります。
上述のようなパソコン事情が、1970年頃と現代では大きく違うので、もはやBASICだけでは、高度なアプリケーションを作ろうとしても、あまり簡単には作れなくなってしまいました。
なので、もし、21世紀の現代の人が、独学でBASICを学ぶ場合は、けっしてマイコンBASICだけで満足せずに、なるべく、C言語を学んだり、さらに、その後の時代の他のプログラム言語も学びましょう。
参考リンク
[編集]- ^ 中学校・高等学校の情報科や技術・家庭科で取り扱われる3言語は、JavaScript、PythonそれにVisual Basic for Applications(ビジュアルベーシック・フォー・アプリケーションズ、VBA)ですが、VBAはマイコンBASICの範疇ではありません。