プログラミング/プログラミング初心者むけの共通知識

出典: フリー教科書『ウィキブックス(Wikibooks)』
Jump to navigation Jump to search

プログラミングは、windowsでも、mac(マック)でも、linux(リナックス)でも、どのOSでも、できる。

ただし、i-phone(アイ フォーン) や Android(アンドロイド) などのスマートホンでは、プログラミングは通常はできない。

このため、いわゆる「パソコン」が、プログラミングには必要になる。

そもそも「プログラミング」とは何か[編集]

プログラムとはコンピュータにしてもらう指示をまとめたもので、私たちはプログラムを作ってコンピュータに実行させることでコンピュータに仕事をしてもらいます。

コンピュータは、内部では基本的には0と1だけの2進数で動作しています。そのため指示も最終的には0と1だけで表した機械語で与える必要があります。しかし機械語は普通の人には理解するのが難しいですし、毎度毎度機械語で指示を与えるのは困難です。

そこで、私たちの話す言語に近い、決まった文法や単語からなる文で指示を与えて、それをあとで2進数に訳して実行させるという方法が生まれました。これがプログラミングです。2進数で表されていることを「バイナリ」と言います。コンピュータが処理できるのは2進数だということは非常に重要なので覚えておいてください。

文字入力[編集]

文字入力については、ウィンドウズでもリナックスでも、どのOSでも、共通して下記の通りです。

バイナリファイルとテキストファイル[編集]

コンピュータが処理をするときは2進数だということを先に述べましたが、コンピュータが記録したファイルも当然2進数になります。このようなファイルをバイナリファイルと呼びます。バイナリファイルにも、コンピュータが命令と解釈するもの、音声を記述するものなど、様々な規則に沿って書かれたものがあります。

一方で、2進数でも決まった決まりを作って私たちの使う自然言語を表すこともできます。このようにして記録したファイルをテキストファイルとよびます。windowsではテキストファイルには.txtという拡張子を付けて区別します。ただし.txt以外の拡張子でもテキストファイルであることがあります。

プログラムを作るときは普通はテキストファイルで作ります。拡張子は.txtではなく言語に応じたものを付けて区別します。

テキストエディタとは[編集]

プログラムのコードの記述方法については、OS標準の「テキストエディタ」などの名前のアプリに、プログラム用のコードを記述できます。(「テキストエディタ」は、windowsでいう「メモ帳」のような機能のアプリのことです。)

(Linuxの一種である「fedora」(フェドラ)というOSの場合、アプリ「gedit」(ジーエディット)が、windowsの「メモ帳」とほぼ同様の機能があり、プログラム用コードの保存も可能である。)
(アプリ検索画面では、「テキストエディタ」と入力して探すと、目的のアプリが発見できるだろう。さきほど紹介した「gedit」(ジーエディット)も、テキストエディタの一種である。)なお、Fedora(フェドラ)のアプリ検索画面で「メモ」などと入力しても、べつのアプリが発見されるので、気をつけるように。)

メモ帳などのテキストエディタで書いてもよいですが、emacsやvim、Atomと言ったプログラミング向けのエディタもあります。こういったエディタではプログラミング言語に応じて色分けや整理をしてくれるなど優れた機能があります。なので何か1つのエディタの使い方に習熟することをおすすめします。

ワープロソフトには保存しない[編集]

けっして(windowsでいう)『Word』(ワード)のような機能のワープロソフトには、プログラム用コードは保存しないでください。

一般にワープロソフトで保存されるのはテキストファイルではありません。もしワープロソフトに保存してしまうと、たとえ、あとで拡張子を「.c」に書き換えてC言語としてファイル形式を指定しても(※ 拡張子については後述する)、拡張子を書き換えてもプログラムが動作しなかったり、あるいはプログラムの内容が変わってしまい、エラーになってしまうから、です。(なお、Linuxの場合は、ワープロソフトの名前が、OSごとに異なる。)

とにかく、コードを記述する時点でも、けっして、ワープロソフトでは、記述しないでください。

なぜ、エラーになるかというと、ワープロソフトには、「明朝体」や「ゴシック体」などの字体の情報も保存されていたりなど、文字そのもの以外の情報もふくまれているからです。もし、Wordでつくったファイルを、むりやりプログラムのコードに変換しようとすると、エラーになります。[1]

文字入力モード[編集]

テキスト中に書かれる文字は、直接入力モードを原則とします。「print」などの命令文は、直接入力モードで入力しなければなりません。

なお、直接入力モードで書かれた文字は、半角英数で表示されます。しかし、半角モードと直接入力モードとは、べつのモードです。

「昭和天皇は日本国民であるし、あなたも日本国民である」からといって、だからって、もし、あなたが日本国民だとしても、けっして、あなたは天皇ではないでしょう。

それと同様に、けっして「直接入力モードも、半角モードで書かれた英数字も、おなじ半角英数で表示される」からといって、けっして、「半角モードと直接入力モードは同じ」(×)という事にはならないのです。

なので、けっして、プログラムの命令文を半角英数で入力しないでください。

いくつかのプログラム入門書には、まちがって「プログラムは半角英数で入力してください」(×)などと書かれていたりしますが、そのような書籍は初心者むけにゴマカした説明であるので、信用しないでください。

もしかしたら、1980年代くらいの古いパソコンとそのOSなら、半角モードが直接入力を兼ねていたかもしれませんが、しかし現在のパソコンとそのOSでは、そんな保障はありません。なので、「print」などの命令文は、けっして半角モードではなく、直接入力モードで確実に、入力してください。

print("おはよう")

というコードがあったとしたら、「print」は直接入力モードで入力します。「(」も直接入力モードです。ひとつめの「"」も直接入力モードです。

「おはよう」だけ、全角モードで入力します。

そして、ふたつめの「"」は直接入力モードで入力します。さいごの「)」も直接入力モードで入力します。

つまり、例外的に日本語表示をしたい部分だけを除いて、原則的に直接入力モードで、入力することになります。

拡張子[編集]

さて、テキストエディタにコードを記述したら、セーブして保存しておく必要があります。

保存のさい、拡張子(かくちょうし)をつける必要があります。拡張子は、そのプログラミング言語の種類によって変わりますので、それぞれのプログラミング言語についての入門書などを、参考にしてください。

たとえば、C言語で保存するには、「.c」を末尾につけます。

「sanpru」(サンプル)という名前のファイルをC言語として保存した場合には、ファイル名は「sanpru.c」となるわけです。

拡張子を変えるまえに保存しても、べつにエラーになりませんし、むしろ、バックアップを取ることは素晴らしいです。しかし、拡張子を変更しないかぎり、プログラムのコードとしては、認識しません。

つまり、どんなにテキストファイル中に「printf("おはよう")」とかの文が書かれていても、それだけでは、けっして、パソコンがそのファイルをプログラムとしては、認識しません。

拡張子を、そのプログラム言語の拡張子に変えないかぎり、パソコンはそのファイルをプログラムとしては、認識しません。

Linuxの場合[編集]

おおまかな手順[編集]

  1. テキストエディタで、ソースコード(プログラム文)を記述する。
  2. コードを保存するとき、その言語専用の拡張子をつけて、コードだけの書かれたテキストファイルを保存する。
  3. コンパイルの必要な言語の場合、コンパイルなどの作業。この作業は、コマンド端末(windowsに例えると「DOSプロンプト」みたいなアプリ)を用いることになる。
  4. 実行可能な形式になったファイル形式のファイルを、実行する。この作業で、コマンド端末を用いることになる。

コマンド端末の起動と終了のしかた[編集]

Linuxの場合、OSにディストリビューションと呼ばれる種類があります。そのOSの種類により、なかに入っているコマンド端末の名前がちがいます。

しかし、たいてい最近のOSにはアプリケーション検索のための画面が用意されており、そのアプリ検索欄に「コマンド」とか「command」とか「terminal」(※ 「ターミナル」と読む。「端末」という意味)とかの語句を検索欄に入力すれば、そのOSに入っているコマンド端末アプリが発見されるので、OSの指示にしたがえばそのコマンド端末アプリを起動することができます。[2]

またほとんどのOSにはコマンド端末が最初からインストールされているので、わざわざ追加インストールする必要はありません。もしためしてみて追加インストールを要求される場合、アプリケーションをまちがえている場合があります。[3]

コマンド端末の起動方法は、普通のアプリケーションの起動と同じで、アイコンをダブルクリックすれば起動することができます。

なお、Linuxのコマンド端末を終了する場合は、右上(もしくは左上)にある「×」マークをクリックするか、コマンド端末中に「exit」[4]と入力します。

なお、まちがって「exit()」(×。まちがい!)と入力してしまうと、そういう名前の特別な別コマンドだと解釈されてしまい、文字を追加入力する画面になってしまう。その場合、Ctrlキーとcを一緒に押すことで強制終了して元の画面に戻ることができます。

アプリのインストール作業[編集]

言語によっては、そのプログラミング言語が、インストールされてない場合も多くあります。その場合、自分で、追加インストールする必要があります。

Linuxで一般にアプリをインストールする場合、そのOSの種類によって、インストールのためのコマンドが違います。

Linuxの一種である「ubuntu」(ウブントゥー)で、アプリをインストールする場合、OSの文字入力モードを直接入力モードにしてあることを確認したうえで、「sudo apt-get install アプリ名」のようにコマンドを実行します。

Linuxの一種である「Fedora」(フェドラ)で、アプリをインストールする場合、OSの文字入力モードを直接入力モードにしてあることを確認したうえで、「sudo dnf install アプリ名」のようにコマンドを実行します。

なお「sudo」とは、「管理者権限になって、コマンドを実行する」という意味です。「apt」(発音はアプト?)とか「dnf」(ディー エヌ エフ)はソフトウェアの名前のようなものなので、まだ、プログラミング初心者は、「apt」とか「dnf」を気にしなくていいです。

さて、「sudo ◯◯ install アプリ名」をコマンド端末に入力してエンターキーを押したあとに、コマンド端末からパスワードの入力を求められる場合もあります。もし、OSインストールに設定したパスワードをそのまま変更していなければ、どのパスワードを入力します。

なお「sudo install アプリ名」(×。「apt-get」や「dnf」を忘れている。)と入力しても、エラーになります。 さて、インストール作業の途中などで、端末から、「本当に実行しても、よろしいですか? y/n 」的な作業確認のための入力を求められます。もし、本当に実行してもいいなら、直接入力モードでyを入力して、エンターキーを押します。ここでの「y」の意味は、英語yesの頭文字のことです。

実行を取り消したい場合には、直接入力モードでnを入力して、エンターキーを押します。ここでの「n」の意味は、英語noの頭文字のことです。

windowsの場合(※ 未完)[編集]

プログラミング言語の種類によって、プログラミングを始めるためのソフトウェアは違うが、たいていの有名で普及しているプログラミング言語については、『Visual Studio』(ビジュアル スタジオ)のような名前のソフトウェアで、プログラミング作業ができるようになっている。

なお、Linuxでは、『Visual Studio』を使用できない。なぜなら、たとえばワープロソフトの『Word』がウィンドウズ専用のソフトであるのと同様に、『Visual Studio』もwindows専用のソフトであるから。(※ Linuxでは『Word』ソフトは使用できない。なので、ワープロソフトについては、同等の機能をもった別ソフトが、Linuxでは用意されている。)

インタプリタとコンパイラ[編集]

コンピュータが認識できるのは2進数の機械語のみであることは先で述べました。しかしプログラミング言語は一定の規則に従っているとはいえ我々の使う自然言語で書かれています。そこでどうにかして機械語に翻訳する作業が必要になります。

インタプリタ[編集]

コンパイル作業を必要とせずに、かわりに、ソースコードを実行のたびに(機械語に)翻訳しながらプログラムを実行していくという方法のことをインタプリタといいます。

あるいは、そのような方式(コンパイルしなで実行できる方式)での、ソースコード翻訳機能の部分をインタプリタといいます。 です。

1980年代なら、当時のBASICが、インタプリタで動く言語の代表例です。


翻訳するためのソフトを現代では、このような種類のプログラム言語は、文法も初心者向けに簡略化されてることが多く(その代わり、C言語のような高度な機能が使えない、もしくは使いづらい)、現代ではこのような言語のことをスクリプト言語ともいいます。

スクリプト言語の代表例は

  • シェルスクリプト
  • JavaScript
  • Python

などです。

シェルスクリプトとは、Windowsの場合ならDOSプロンプトとか、ああいうのです。

なお、シェルスクリプトやPythonは、1行ずつ機械語に翻訳します。昔のBASICも1行ずつ翻訳する方式です。


これら上記のスクリプト言語はまだ、標準の使用状態ではインタプリタでもあります。

なお、シェルスクルプトのインタプリタ部分(翻訳機能の部分)のことをシェルともいいます。


スクリプト言語は手軽に書いてすぐ実行できるというメリットがあります。しかしプログラムの実行時に毎回解釈をしなおす必要があるので時間が必要になり、そのためプログラムの実行速度が下がっています。

インタプリタであるプログラム言語ではソースコードを直接実行するので、プログラムのコードを書き換えると、実行結果もそれに応じて変化します。

コンパイラ[編集]

プログラムを実行するもう一つの方法は、ソースコードを全部一気に機械語に翻訳してから、機械語のファイルを実行するという方法です。このような種類の言語を一般にコンパイル型言語などと言います。

プログラムのコードを機械語に変換することを、コンパイルと言います。そしてコンパイルする、つまりコードを機械語に変換するためのソフトウェアのことをコンパイラといいます。

コンパイル型言語の代表例は

  • C言語、C++、C#
  • FORTRAN

などです。

コンパイル型言語では、コード入力用に用いるファイルと、実行ファイルとは、別のファイルです。そのためソースコードを変更してもコンパイルしなければ変更が反映されません。

コンパイル型言語の実行ファイルは、機械語で書かれています。コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。

実行ファイルの言語は、OSやハードウェアそれぞれに合わせた機械語になっています。このため、OSが異なると、実行できなくなります。さらに実行ファイルだけでは、もはやもとの内容は分かりません。機械語にはそのOSに合わせてメモリやCPUがどんな動作をすべきかという指示だけが書かれてあり、けっしてその動作の目的は機械語には書かれていません。

つまり、機械語では、けっして、かけ算などの計算をする命令なのか、それとも「おはよう」などの文字表示をするための命令なのか、それは分からないのです。

その反面、機械語に変換された実行ファイルは、配布するプログラムのもともとのコード内容を秘密にしたいときに便利というメリットもあります。

プログラムのコードをコンパイルしたファイル(つまりコンパイル済みのファイル)のことを「オブジェクトファイル」と言います。

  • windowsでのコンパイル言語で書かれたソフトウェアの配布方法

コンパイル言語で書かれたソフトウェアの配布方法は、通常、開発者がコンパイルしてから配布するという形態を取ることが多いようです。

市販のウィンドウズ用ソフトウェアなども、すでにウィンドウズ用にコンパイルされているので、実行ファイル(拡張子が.exe)をクリックするだけで実行できるようになっているわけです。

インターネットからウィンドウズ用のフリーソフトや有料ソフトをダウンロードするときも、たいてい、コンパイル済みになっているのが普通です。

ウィンドウズ用ソフトだけでなく、リナックスの ubuntu(ウブントゥー) や Fedora(フェドラ) などの大手Linuxコミュニティでも、それぞれのOSにあわせてコンパイル済みのソフトウェアを配布公開しています。

しかし原理的には、コンパイル作業を、ソフトウェアの開発者ではなく、ユーザー消費者に行わせることも可能です。

BSD(ビーエスディー)などの いちぶのUnix用OSでは、コンパイル作業を、ソフトウェアの開発者ではなく、ユーザー消費者に行わせています。もしBSD用のアプリケーション インストール用ソフトで、アプリのインストールをボタンクリックひとつで自動的に行うソフトがあれば、それはコンパイルも自動的に行っているという事でしょう。

どちらでもない言語、両方できる言語[編集]

ここまでプログラミング言語をスクリプト言語とコンパイル型言語に分けて説明してきましたが、どちらにも当てはまらないものや、両方の方法で実行できるものも存在します。

中間言語を生成するプログラミング言語[編集]

プログラミング言語のなかには、インタプリタかコンパイラかのどちらかがハッキリしない言語もあります。

例えば、Java(ジャバ)という言語は(JavaScriptとは別の言語です。)、コードを記述後、実行のまえに Java専用の中間言語に変換します。

そしてJavaでは、ユーザーによる使用のたびに、その中間言語を機械語に翻訳するという仕組みです。

機械語には直接翻訳していないので、中間言語ファイルは、特定のOSに依存しないで、どのOSでも使用可能です。


しかし、かわりにJavaのユーザーは、Java中間言語を機械語に翻訳するためのソフトウェアが必要であり、そのようなソフトウェアがJavaランタイム(Javaを利用するためのソフトウェア)には組み込まれています。

そして、そのJavaのランタイムが、ウィンドウズやマックOSやリナックスといった それぞれのOSごとに 用意されています。

一見すると、Javaのような中間言語生成のプログラム言語は、どのOSにも依存しないで動作できて理想的なように見えますが、しかし開発にかなりの資金が必要なようであり、そのため現在、Javaはオラクル社という大手IT企業(アメリカのIT企業)が行っています。

要するに、米国IT企業がOSに依存しないようなプログラム実行環境を開発しようとしたら、まるでOSなみの資金が必要になってしまったわけです。


両方できる言語[編集]

また、比較的新しい言語では両方、つまりコンパイルもスクリプト実行も両方できるものが多くなっています。たとえばPythonはスクリプト型言語ですが、コンパイルすることもできます。Go言語やHaskellでは、コンパイルして実行することもできますし、ソースコードをそのまま実行することもできます。

例外[編集]

インタプリタ版のC言語

コードがC言語で書かれていても、初心者むけに、コンパイルせずに実行のたびに機械語に翻訳するようなソフト上で、そのC言語コードを実行すれば、そのような場合はインタプリタです。

現代でも、初心者などの学習者にむけて、このようなインタプリタ方式と思われる、コンパイル作業を必要としないように改造されたC言語があります。


コンパイラ版のBASIC

逆に、(今では廃れてしまったが、)文法はBASICであっても、コンパイルしてから実行するように作れば(c言語などを活用して、そのようなソフトを作れる)、そのような改造BASICはコンパイラ用の言語です。

かつて、Quick BASIC というBASIC実行ソフトがあり、これが、コンパイルすることによって、実行速度を速めた改良型のBASICでした。

現状[編集]

インターネットとの関係[編集]

HTMLはプログラミング言語ではありませんが、インタプリタのように、使用のたびにコードを解釈しなおします。HTMLファイルを作る時やアップロード時には、けっしてコンパイルしないのが現状です。

おそらく、ホームページを閲覧するユーザーごとに、使用するパソコンのOSやハードウェアがバラバラなので、特定のハードウェアに限定された機械語にコンパイルするのはムダなのでしょう。

また、ウェブページ用プログラミング言語として普及しているJavaScriptは、ブラウザ付属のインタプリタとしてウェブブラウザに実装されているのが一般でありますが、しかし原理的にはコンパイルも可能だと思われています。

つまり、インタプリタかコンパイラかどうかというのは、けっして言語の仕様そのものによるものではなく、実装による違いなのです。

どうやら上記のように、インターネット関係のプログラミング言語やマークアップ言語では、インタプリタ的に動作する言語が多いようです。

このほか、専門的ですが、Pythonのようにインタプリタとして実装されているプログラミング言語に、追加モジュールとしてウェブプログラミング用モジュールを付け加えて(すでにそのようなモジュールが開発されており配布されている)、それでpythonなどでウェブプログラミングを行うという方法もあります。

パーサ[編集]

インタプリタ言語だろうがコンパイル言語やJavaだろうがHTMLだろうが、コードとして書かれた文字列をパソコンが読みとり、それを最終的にプログラムを動作させる直前までには、機械語や中間言語などに置き換えるわけです。

このような、文字列を機械語など別のものに置き換えるアプリケーションのことを、文字列を解析して解釈する機械という意味で、「解釈機」(かいしゃくき、パーサ parser)とか「解析器」(かいせきき)などと言います。

情報科学の書籍で「コンパイラ」と行った場合、それは必ずしもC言語などのコンパイル言語のこととはかぎらず、パーサの意味の場合があります。

「パーサ」という用語はプログラム初心者には不要な知識ですが、長所として、いちいちインタプリタ言語かコンパイル言語か等の細かい区別をする必要がなくなるので、手軽な用語です。

補足[編集]

上記のコンパイラやインタプリタの説明では、Windowsの実行ファイル(exeファイル)を、あたかも機械語のようなものとして扱いました。

しかし、厳密には、Windowsの実行ファイルの言語形式は、機械語ではありません。

Windowsの実行ファイルの書式は、PEフォーマットと言う書式のある、中間言語のようなものです。

ただし、マイクロソフト社が細かい仕様を非公開にしてる事と、かなり高度で専門的な技術であるため、OS開発者などでない専門外の人には、Windowsの実行ファイルは、あたかも機械語のようなものとして扱われる場合も、多くあります。


よくある文法[編集]

「代入」とは[編集]

どのプログラミング言語の勉強でも、「a = a + 1」というような命令文を、かならず習うだろう。

プログラミングでは、「=」記号の意味が、数学とは違う。

プログラミングでは「=」記号が、いろんな意味につかわれるが、「a = a + 1」の場合なら、「=」記号の意味は、「イコール記号の左の変数に、イコール記号の右側の式を計算をした結果を代入せよ」という意味である。

たとえば、aの値がさいしょは2だったとすると、a = a + 1を実行することにより、実行後にはaの値は3になっている。

「変数」とは[編集]

なお、上記の説明で、当然のように「変数」という言葉を用いたが、この「変数」という用語も、数学とは扱いかたが微妙に違うので、気をつける必要がある。詳しくは、それぞれのプログラミング言語を参照のこと。

変数名をつける際に使える文字としては、英語の小文字と大文字が、使える。(日本語の文字や漢字は、変数名には使用できない。)

なお、変数名は、べつに1文字でなくても、かまわない。

変数名にhensuuとか付けてもかまわないので、「hensuu = hensuu+1」という命令文も可能である。

なお、「hen suu」のようにスペースを入れると、エラーになる。変数名は、ひとつづきである必要がある。


また、なお、たいていの言語では、大文字で書かれた変数と、小文字で書かれた変数は、「別々の変数である」として区別する。

たとえば、

例1

a = 2 ;
a = A + 1 ;

のような2行のプログラム文を書いても、たいていはエラーになり、「Aが定義されていません。」のような内容の英文メッセージが表示されたりする。上記のプログラムでは、変数aと変数Aは、別々の変数である。

修正した結果、

例2

a = 2 ;
a = a + 1 ;

なら、たいていのプログラム言語なら、上記の例2のプログラムが実行できるようになっており、実行すれば、aの値は3になる。


初心者のうちは、変数名につかう文字は、英語の小文字のみにするのが良い。


  • その他

変数名につかえる文字は、英数字と、一部の記号である。

でも、どの記号が使えるかを覚えるのはメンドウなので、初心者のうちは、英語の小文字のみを変数名に使うのがオススメである。

なお、たいていのプログラム言語では、変数名の冒頭は、英字でなければならない。つまり、「2hensuu」(×)みたいなのはエラーになる。 「hensuu2」のように、冒頭以外なら、数字を使える。

でも初心者のうちは、英語の小文字のみを変数名に使うのが、簡単なのでオススメである。

プログラムの実行の順序[編集]

なお、プログラムの命令文が複数個ある場合の実行順序は、特に指示がないかぎりは、プログラム文の最初に書かれた順に実行する。

なお、そもそも、それぞれの命令文の終わりを示すために、「;」(セミコロン)記号を用いられているのが、一般的である。(コロン記号「:」ではエラーになるので、気をつけよう。)

たとえば

例3

a = 2 ;
a = a + 1 ;

という順番で書かれた2行のプログラムなら、

まず最初に「a = 2 ;」が実行されることにより、aに2が代入される。その直後に、「a = a + 1 ;」が実行されるので、結果的にaの値は3になる。

数値[編集]

プログラム言語であつかえる数は、特に指定をしないかぎり、10進数である。(日常生活でつかう数え方と同じなので、安心してよい。)

整数と、有限のケタの小数が、普通のプログラム言語では使える。

分数や平方根(√3 など)などは、プログラム言語によっては「sqrt(3)」(平方根を英語で 「square root」という)のような式としては使える場合もあるが、しかし、それらの式(分数や平方根)の計算結果は、有限のケタ(たとえば 1.732050807 )に近似され、小数として近似される。

もしコンピュータで√3が 1.732050807 に近似されたなら、 数学の値におき合えれば 、

けっして 1.73205 08075 68877 29352 74463 41505 87236 69428 05253…でなく、
コンピュータ上では 1.73205080700000000000000000000000000000000・・・・に近似された、

という意味である。


上記のように、本来なら数学的には無限のケタの平方根などを有限ケタの小数に近似してしまうため、誤差が発生する。このような、無限小数を有限小数に近似したために誤差の発生する現象のことを「ケタ落ち」という。

誤差を少なくするためには、途中式はなるべくプログラマーが計算しておいて、最後の最後で数値計算だけをコンピューターにやらせるのが、オススメである。

普通のコンピューターは、いちいち、式変形をしてくれない。

結局、数学の能力がプログラマーには必要である。途中式を式変形できるだけの数学の能力が、必要である。

GUIプログラミング[編集]

てっとり早い方法は?[編集]

アプリをウィンドウで表示したり、マウスでクリックするボタンを配置したり、そのようなグラフィカルな表示をするには、どのようにすれば良いのでしょうか?

結論からいうと、ウィンドウズまたはマックOSの提供するプログラミング環境を使うことになります。

なので、特定のOSに依存しない「C言語」などの書籍を読んでも、画面に直線を1本ひくための操作すら、書籍には書かれていないのが、通常です。

GUIアプリをプログラミングするために一番、簡単な方法は、ウィンドウズやマックOSなど商用の市販OSで、アプリをプログラミングする方法が、一番、簡単です。

市販のOSのプログラム開発用ソフトでは、C言語などの既存のプログラミング言語の文法に、GUI開発用の独自の文法を追加した、やや独自の文法をつかうことで、GUIプログラミングをできます。

どっちみち、市販のOS上でのGUIの動作確認をするために、その市販のOSが必要です。例えば、ウィンドウズ上で動作するGUIアプリを制作したいなら、ウィンドウズを購入して、じっさいにプログラム中にウィンドウズ上で動作確認のためGUIを表示させてみる方法が、安全で確実な確認方法です。

例外として、一部のプログラミング言語には、すでに、グラフィック表示をするためのツールが組み込まれてる場合もあります。その場合も、それぞれのOSの機能を利用しているので、なので、OSごとによって、アプリの表示結果が違っています。

そのようなプログラミング言語の例として、たとえば、「JavaScript」(ジャバ・スクリプト)というwebページで動作するプログラム開発用のプログラム言語(JavaScript)は、GUI表示ができますが、このJavaScriptは、それぞれのOSのGUI機能を利用しており、また、それぞれのwebブラウザのGUI機能を、JavaScriptは利用しております。


初心者にはリナックス用アプリのGUI開発は無理[編集]

いちおう、原理的にはリナックス(Linux)のようなオープンソースOSでもGUIプログラミングは可能ですし、実際にそのようにGUI機能のあってLinuxなどで動作するオープンソースのアプリは公開されています。

しかし、Linux関連企業が、そのような入門書を、まったく出版していませんので、現状では初心者には勉強のやりようがありません。

「GTK を使えば、LinuxのGUIアプリを開発できる」とかの情報を知ってても、そのGTKの入門書が理工専門書をあつかってる専門書店に行ってすらも、見あたらないという有様です。

リナックスのコミュニティも、GUIアプリ開発者の育成などに、不熱心です。


また、そもそもリナックスのアプリの多くは法的にも、ソフトウェア利用条件の「ライセンス」としてGPLというライセンスを採用しており、その規定が制約の強いものであり、そのため初心者は法的・権利的に複雑な問題にも、Linuxプログラミングでは遭遇しやすいのです。初心者は、あまりLinuxでGUIプログラミングをしないほうが、安全です。


WindowsむけGUIプログラミングの書籍を買う場合について[編集]

WindowsむけのGUIアプリを使う場合、たとえば「Visual C# 2017入門」的な、C# または Visual Basic の最新版のタイトルの書籍を買う必要があります。

後述するように、現状では、 初心者は C++ では GUI アプリの開発が困難な状況になっています。

C++ は現状では無理[編集]

「Visual C++ 2017入門」などC++向けの本は、現状のところ、初心者は買わないほうが安全です。

なぜなら、Visual C++ には、昔は、マウスのドラッグ&ドロップなどで直感的にGUI部品をウィンドウ上に配置して(アプリ起動後のグラフィックの)レイアウト編集のできる「フォームデザイナ」という機能があったのですが、2017年バージョンから廃止されました。


さらに、廃止された機能であるにもかかわらず、2017年の発表初期には部分的に機能が残っていたようであり、そのため、入門書にはC++によるフォームデザイナ使用法が書いてあります。(つまり、市販の入門書に、間違った内容が記述されている。)


市販の書籍のとおりに操作しても、現在では、C++が正常に動きません。それらの Visual C++ 入門書 には、フォームデザイナ追加作業時におけるエラー時の回避策が書かれているのですが、その回避策のとおりに行動しても、それでもエラーが直ならかったり、そもそも、回避策に必要な各種のメニューコマンド自体が、Visual C++では、いくつか廃止されており、その回避策じたいを実行できないという有様です。つまり現状では、市販のVisual C++入門本に書いてある内容が、マチガイです。(たぶん、近々、IT書の出版業界が大変な事態になる。2018年に本文章を記述。)


その結果、どうやら、Visual C++ でグラフィックを作るには、コードで直接、命令文を入力しないとイケナイようになってます。困ったことに、市販の Visual C++ の本を読んでも、どのテンプレートを選んでコードのどこに命令文をどう入力したら、どういうグラフィックが作れるのか、まったく書いていません。


マイクロソフト社は、どうやらVisual C++ 向けには、フォームデザイナをサポートしてないようです。

仮に、ネット上などにある「C++上でフォームデザイナを使う方法」などの各種ホームページを信じて実行してみて、一見、フォームデザイナが動いてるように見えても、まったくマイクロソフト社には動作保証されてません。

現状、仕事などに使えるレベルとしてフォームデザイナを使いたいなら、Visual C# や Visual Basic を使うしか、ありません。


最新版を買うこと[編集]

さて、書籍を買う場合の注意事項として、かならず最新版を買うことです。例えば、「Visual C# 2010入門」的な、一昔前のバージョンの本は、使い物になりません。

バージョンが古いと、何らかのコマンドが消えてたりして、そもそも初期設定などの段階で、つまづき、プログラミングの開始すら、できません。


それどころか、現在のバージョン対応をうたってる書籍を買った場合ですら、書籍発売後にマイクロソフト社がVisual C# をアップデートしたのだろうか、書籍にある画面 と 現実に表示される画面 とが、なぜか微妙に違う可能性すら、生じます。

このため、運が悪いと、最新版の書籍を買ったのに、設定変更によって初期設定すらできずに、プログラムを開始できない場合すら、あります。なので、本を買うときは、念のため、別々の出版社から、いくつか入門書を買いましょう。


また、GUIプログラミングは、このように、バージョン違いにより書籍が役立たなくなる期間が早いので、もし、GUIでないコマンドベースのC++プログラミングが分からない場合は、先にコマンドベースのプログラミングをそれ専用の書籍で勉強して、コマンドベースのプログラミングの実践と理解をできてから、あとからGUIプログラミング用の入門書を購入するのが、良いでしょう。

マイクロソフト社のサイトから、古いバージョンのVisual 〇〇を無償ダウンロードしようにも、そもそもマイクロソフト社が、最新版のVisual〇〇しか、ダウンロードさせてくれません。(どこのIT企業でも、一般に無償ソフトは、サポート作業の人件費の節約のため、最新版しか無償提供していない場合が多いのである。)

Win32 API と Direct X[編集]

もし、WindowsをもちいたGUIプログラミングで、(初心者レベルでない、)中級以上の機能のアプリを作りたい場合、Win32 API と Direct X という機能を使うしか、ありません。


Win32 API と Direct Xのうち、初心者がまず先に学ぶべきは Win32 API です。

Direct X プログラミングの文法は、文法上は Win32 API を踏襲しているので、まず先に Win32 API を習得する必要があります。


書店だと、もしかしたらゲームプログラミング書のコーナーで、Direct Xの書籍を見かけるのにWin32 API の書籍を見かけないような事態も、あるかもしれません。しかし、 Win32 APIの知識が無い状態で、 Direct X の書籍だけを買って読んでも、書籍の内容を理解できないでしょう。


Win32 API[編集]

Win32 APIを使うには、Visual C++ で「Windowsデスクトップアプリケーション」というのを選ぶしか、ありません。

一般のVisual C++入門書でよく紹介される「CLR」では、よほどトリッキーなことをしないかぎり、機能が限定的であり、高度なアプリを作れません。


どれが「Windowsデスクトップアプリケーション」か選択画面では分かりづらいかもしれませんので、実際にそれっぽいのを選んでみて、選択決定後に表示されるソースファイルの20行目あたりに「int APIENTRY wWinMain(_In_ HINSTANCE hInstance,」というのがあれば、それが Win32 APIの開発環境です。

「wWinMain」は、昔のC言語でのMain関数に相当します。なお昔は「WinMain」と書かれていました。


Visual Studio で、アプリ作成時にダイアログで質問される、アプリの種類のうち、C#の冒頭のほうにある、.Net Framework 関連の開発環境では、じつは、高度なアプリを作るのには、あまり使えません。

そもそもC#に、Win32 API の開発環境がありません。Visual Studio でC言語系を使う場合、Win32 API を使うには、かならず C++ を選ぶ必要があります。


この理由は、おそらく歴史的な経緯により、まず、win32 API (もしくは、その前身)にあたる開発環境が先に用意されました。そのため、このWin32 API で、ひととおりの事が、できるようになっています。

ただし、Win32 API は設定ファイルなどが長すぎまるのです。(プログラマは、これらの設定ファイルを必要に応じてプログラマーが書き換えたりコードを追記したりする方式で、プログラミングをしていく。)また残念ながら、マウス操作のドラッグ&ドロップなどの機能は、無いのです。コマンドを1つ1つ、キーボードで文字入力するなり、コピーペーストでもいいですが、ともかく、一般のC言語のようなコマンド文の入力で、開発しなければなりません。


これは初心者には厳しすぎるので、あとから、代わりのバージョンとして、初心者むけに機能を制限してあるバージョンだけど、マウスのドラッグドロップなどで開発できる開発環境が、作られていきました。

.Net Framework も、この、機能制限版のマウス操作の開発の流れにある開発環境です。

これだけ聞くと、マウス操作でアプリが作れるなんて理想的に聞こえますが、残念ながら、いろいろと機能的に不完全なことも多く、現状では高度なアプリは作れません。なので、2010年代後半の今でも、もしWindowsプログラミングで高度で複雑な動作をするGUIアプリの制作では、Win32 API と Visual C++ を使わざるを得ない状況です。


また、.Net Framework はランタイムが必要になります。

いっぽう、win32 API で開発すれば、サポート期間中のWindowsなら、よほどの事がないかぎり、ほぼすべてのバージョンで動きます。

しかし、.Net Framework 開発環境で開発されたアプリには、さらに .Net Framework ランタイムがユーザーに必要になります。(プログラマだけでなく、そのアプリを使う人にもまた、専用のランタイムが必要になる。)

Direct X[編集]

Direct X は、主に、Windows用の画像関係のランタイムやライブラリのうち、3D-CGの計算や、GPUなどマルチメディア関係デバイスの制御などの、高度な機能が、まとめられています。

初心者は、当面は Direct X のプログラムを書く必要は、無いでしょう。


ですが、Windowsでアプリを作る際に、知識としてDirect X について、いろいろと知っておく必要があります。

なぜなら、現在の Windows では、実はウィンドウは3D-CGとして処理しています。(アナタが今見ているwebブラウザのウィンドウも、Direct X が起動しており、ウィンドウを 3D-CG として処理して、ディスプレイにウィンドウ表示しています。)

ユーザーにはDirect X の名前が表示されてないだけで、実はWindowsの画像処理のいろいろな箇所で、 Direct X は動作しています。

現在のWinodwsの多くの機能は、Direct X をもとにグラフィック描画をしてる部分もあるからです。


.Net Framework で提供されているAPIのうちの画像関係のAPIには、Win32APIの画像APIでは提供されていない高機能なAPIもありますが、おそらく、,Net Frameworkの画像関係のAPIは、おそらく背後で Direct X が動作しているものと思われます。


なお、よく、Windows向けのゲームで「Direct Xランタイムが必要です」などと説明書などで記載されているので、てっきりDirect X をゲーム専用に追加インストールする必要のある追加機能だと誤解しがちだが、実はゲームとは無関係に既にWindowsのインストール時点で Direct X は Windowsに標準インストールされています。

Windows95くらいの過去のバージョンではDirect X は購入時点ではWindows製品には付属しておらず追加インストールしないと使えなかった時代もありました。、しかし、現時点のwindows7以降(7も含む)のバージョンでは、Direct X はWindowsの購入時点で付属しており、Windowsのインストールと一緒にDirect X もインストールされています。


Win 32 API でのプログラミングを行っていくと、何かと機能的に不完全なところがあります。

そのような機能不足でも、Win32 APIを使って改善するプログラムが作れればよいのですが、しかし、そうとは限りません。GPUなど画像関係ハードウェアの制御などは、Win32APIではサポートされていない場合もあります。


世間一般のソースが非公開にされているアプリでは、もしかしたら、ゲームソフトでなくてもDirect Xを動作させるコードを書いているアプリケーションもあるかもしれません。


マイクロソフト社がソース非公開のため、Windows内部でのグラフィック描画機能にWin32APIとDirectXとをどう使いわけているかも非公開であり、詳細は不明です。

世間では歴史的経緯から、「WindowsのGUI描画はWin32APIをベースにしており、例外としてDirect XでプログラムされたGUIアプリを動作させる時だけDirect Xを使ってる」という解釈が通説ですが、しかし、実はそのような保証は無いのです。

もしかしたら、もはやDirect XがWinodws内部のGUI描画でベースのシステムになっている可能性もあります。ひょっとしたら、近年のWindowsでは(GUIのコードの原則はDirect Xとして)、Win32APIのコードのほうが例外的に処理されている可能性もあります。


少なくとも明確な事実として、マイクロソフト社は、最新の画像技術のサポートなどは、Win32APIではなくDirect Xを通してサポートを提供しています。

このため、もしかしたら将来的には、マイクロソフト社によるGUI技術のサポートは、Win32APIではなくDirectXを優先する可能性もありえます。


オープンソースなどでGUIアプリを開発する場合[編集]

せっかく理工専門書のある大型書店などに行っても、そこですらリナックスでのGUI開発の方法を書いた書籍が置いてなかったりしますので、あきらめたほうが良いと思います。しかし、どうしてでも、リナックスなどでリナックス用GUIアプリなどを開発したい場合、下記のようなソフトがあります。


LinuxのようなオープンソースでのGUI開発の場合、OSの仕組みを理解しなくても、既存のプログラミング言語(たとえばC言語など)に追加で組み込んで、画像表示などをできるアプリを開発できるようにするツールが、提供されており、たとえば「ツールキット」などと呼ばれています。

たとえばC言語なら、冒頭のinclude文で、その開発用ツールキットの導入を宣言することで、使用できるようになります。(ただし、あらかじめOSに、GUI表示用ツールキットとGUI開発用ツールキットとを、インストールしておく必要がある。)

このようなオープンソースOS用のGUI開発用ツールキットは、一般に、ひとつのプログラミング言語に対して、何種類もGUIがあるので、GUI開発用ツールキットも何種類もあります。そして、一般的にことなるGUI用につくられたアプリケーションには互換性がないので、よって、異なる開発用ツールキットどうしにも互換性がないのです。

つまり、あるGUIのGUI開発用ツールキットを仮に「A」として、それとは別のGUIのGUI開発用ツールキットを仮に「B」とした場合、Aで開発されたアプリは、A用の環境でだけ、動作できます。Aで開発されたアプリは、B用の環境では動作できないのです。

いっぽう、ウィンドウズやマックOSならば、そのようなツールキット的なものが、OS開発企業により、あらかじめ1種類に統一されておりますので、いちいち、動作環境で悩む必要がありません。

LINUXのほとんどのGUIアプリは、じつはGUIが、GNOME(グノーム)というGUIに事実上は統一されており、そしてツールキットがGNOME用のGTK(ジーティーケー)というツールキットに統一されています。

なぜ、わざわざこのような事を紹介するかというと、GUIには、GNOME以外のものもあるからです。(たとえば「自動車」と一口にいっても、ホンダ車だけでなく、トヨタ車とかマツダ車とか、いろんなのがあるのと同様です。) LINUXのGUIには、GNOMEとは他の異なる別のGUIとして、KDE(ケーディーイー)というのがあります。ホンダ車とマツダ車とは、まったく別物のように、GNOMEとKDEも、まったく別物です。

GNONEとKDEとで共通してる性質は、単に、LINUX用のGUIである、という点だけです(例えるなら、トヨタ車とホンダ車とマツダ車で共通してるのは、単に「日本車である」という事だけのように)。

なぜ、わざわざこのような事を紹介するかというと、「GUI」と「GNOME」とを混同する人が、ときどきいるからです。(自動車に例えるなら、「マツダ車」を「自動車」そのものと混同するようなのと同様である。)


さて、「GTK」 とは GIMP Toolkit の略です(GIMP(ギンプ)とは、LINUX用の お絵描きソフト のひとつです。もともとGIMPを開発するためのソフトとして、GTKが開発されたという歴史があった)。GIMP Toolkit の名前は覚えなくてもいいです。それより気をつけてほしいのは、GTKは けっして「GUI Toolkit」(×) の略ではないことに気をつけてください。ときどき、まちがえて GUI と GNOME と GTK とを混同する人がいます。

自動車産業に例えるなら、GTKはさしずめ、(自動車の)製図とか生産工場の部品とか、そこらへんでしょう。とにかく、GTKとGUIとGNOMEとは、まったく違うので、混同しないでください。


LINUXには、GNONEのほかにもGUIがあり、Cinnamon(シナモン)やMATE(マテ)など、ほかにもGUIがありますが、しかしこのGUIはもともとGNOMEをベースにつくらており、また、GTK用のコードに合わせて動作されるように作られています。

なので、LINUX用のGUIアプリをC言語などでつくる人は、プログラム中でGTKの提供する関数を呼び出すコードを書くことになります。

LINUXのGUIには、GNOME系のGUIとは他の系統として、KDE(ケーディーイー)というのがありますが、これはツールキットが異なり、QtというGUIツールキットを採用しています。また、Qt用コードの文法は、GTK用コードの文法とは異なります。

よって、GTKにあわせて書いた(C言語などの)コードは、KDEをGUIとする環境では動きません。もし、むりやり起動しても、異常停止などをする場合があります。同様に、Qtにあわせて書いたコードは、GNOME系のGUIでは動きません。

もし、あるLINUXアプリケーションが、GNOMEでもKDEでも正常に動作する場合、その仕組みは、そのアプリのプログラマーが両方のGUIツールキットむけに2倍の量のコードを書いているか、もしくは、GUI側の開発者がそのGUIに移植してコードを追加していたりするわけです。

よって、あまりにもマイナーなGUIは、アプリ制作者がそのGUIにむけて開発しなくなるので、そのGUIは対応アプリが少なくなります。


なお、GUI開発用の「ツールキット」のような開発用ソフトウェアを制作する手間は、事実上はOSをつくる手間、またはOSの部品をつくる手間にちかく、普通の人には、なかなかツールキットは作れません。

脚注[編集]

  1. ^ 実は多くのワープロソフトではテキストファイルを保存する方法が用意されており、それで保存すればプログラミングもできないこともありません。ただしワープロソフトはプログラミングを意図した設計になっていないので、ワープロソフトでやるメリットはほとんどありません。
  2. ^ 「command」とさいごまで入力しなくても、「comm」とか「コマ」あたりまで入力した時点で、目的のコマンド端末アプリが発見されることが多い。
  3. ^ たとえば、Linuxの一種である「Fedora」(フェドラ)というOSの標準バージョンOSを使っている場合なら、さいしょからコマンド端末がインストールされており、「端末」というアプリケーション名のアプリが、目的のコマンド端末アプリケーションである。
  4. ^ 発音はイグジットと読む