「プログラミング/共通知識」の版間の差分

出典: フリー教科書『ウィキブックス(Wikibooks)』
削除された内容 追加された内容
関連項目 プログラミング/学習方法 学習方法/高校情報
表記ブレを修正、執筆者の大幅な思い込みをカット、時代遅れの文章を修正
1 行 1 行
プログラミングは、windowsも、mac(マック)でも、linux(リナックス)でも、どOSでも、できる。
このページでは、プログラミングにおいて頻出ある共通知識を説明する。


== 概要 ==
ただし、iPhone(アイ フォーン) や Android(アンドロイド) などのスマートフォンで、プログラミングを行うことは可能であるものの、一般的ではない。
プログラミングはWindows(ウィンドウズ)、macOS(マック)、Linux(リナックス)、どのOSでも、行うことができる。
スマートフォン向けのOS、iPhone(アイ フォーン) や Android(アンドロイド)などで行うこともできる。


※注釈:以下では、電子計算機を指す用語として「コンピュータ」、「コンピューター」が混在している場合があるが、どちらも同じ意味である。
このため、いわゆる「パソコン」が、プログラミングには必要になる。


== そもそも「プログラミング」とは何か ==
==「プログラミング」とは ==
プログラムはコンピュータにしてもらう指示をまとめたもので、私たちはプログラムを作ってコンピュータに実行させることでコンピュータに仕事をしてもらいます。
「'''プログラム'''」はコンピュータにしてもらう指示をまとめたものです。「'''プログラミング'''」は「'''プログラム'''」を作成することです。私たちはプログラムを作ってコンピュータに実行させることでコンピュータに仕事をしてもらいます。現代のコンピュータは、内部では0と1だけの2進数で動作しています<ref>[[w:3値論理]]など、特殊なアーキテクチャを採用しているコンピューターを除く</ref>。2進数で表現されていることを特に「'''バイナリ'''」と呼びます。それに合わせて、指示は0と1のみで表現される「'''機械語'''」で与える必要があります。しかし機械語は直接読み書きすることは困難です。そこで、より私たちの話す言語に近い文法や単語からなる”記号”で指示を記述して、それをあとで2進数に訳して実行させるという方法が生まれました。この「訳する」作業を「'''コンパイル'''」と呼びます。

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

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


== 文字入力 ==
== 文字入力 ==
プログラミングをするからには、文字の入力ができなくては始まらない。以下は、文字に関する概念を簡単に述べる。
文字入力については、ウィンドウズでもリナックスでも、どのOSでも、共通して下記の通りです。


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


一方で2進数でも決まった決まりを作って私たち使う自然言語を表すこともできます。このようにして録したファイルをテキストファイルとよびます。windowsではテキストファイルには<code>.txt</code>という拡張子を付けて区別しますただし.txt以外の拡張子テキストファイルであことがあります
コンピュータはHDDSSDなどの記憶媒体にファイルを保存する。「'''テキストファイル'''」は、文字として解釈ることを想定されたファイルを指す。対となる概念として、「'''バイナリファイル'''」があるWindowsではテキストファイルには<code>.txt</code>という拡張子を付けることが多いプログラムを作るとき、拡張子は言語に応じたのを付けて区別する。


=== テキストエディタ ===
プログラムを作るときは普通はテキストファイルで作ります。拡張子は<code>.txt</code>ではなく言語に応じたものを付けて区別します。
'''概要''': テキストエディタは怖くない。


文字を入力するときは、専用のアプリを起動する。以下に不完全なOSに付属しているエディターのリストを示す:
=== テキストエディタとは ===
* Windows: メモ帳 (<code>notepad.exe</code>)
プログラムのコードの記述方法については、OS標準の「テキストエディタ」などの名前のアプリに、プログラム用のコードを記述できます。(「テキストエディタ」は、windowsでいう「メモ帳」のような機能のアプリのことです。)
* Linux
** fedora: gedit


さらに、emacsやvim、Atom、VSCodeもテキストエディタと呼ばれる。エディタによっては、シンタックスハイライトと呼ばれる色分けをする機能や、折りたたみ機能など、特色ある機能を搭載している場合がある。テキストエディタのインストール方法については、ここでは取り扱わないので、各エディタのマニュアルを参照すること。
:(Linuxの一種である「fedora」(フェドラ)というOSの場合、アプリ「gedit」(ジーエディット)が、windowsの「メモ帳」とほぼ同様の機能があり、プログラム用コードの保存も可能である。)


=== ワープロソフトは使えない ===
:(アプリ検索画面では、「テキストエディタ」と入力して探すと、目的のアプリが発見できるだろう。さきほど紹介した「gedit」(ジーエディット)も、テキストエディタの一種である。)なお、Fedora(フェドラ)のアプリ検索画面で「メモ」などと入力しても、べつのアプリが発見されるので、気をつけるように。)
'''概要''': マイクロソフト社のWord(ワード)のようなワープロソフトでは、テキスト以外に付属するデータがあるため、プログラミングには使えない。


ワープロソフトで保存されるのはバイナリファイルであることが非常に多い。ワープロソフトで文章を保存しても、文章がそのままテキストとして保存されるわけではない。そのファイルの拡張子を「.c」に書き換えてC言語として再解釈しようとしても、コンパイルエラーになってしまうだろう。なぜエラーになるかというと、ワープロソフトには、メタデータと呼ばれるフォントの種類、大きさ、色、位置関係の情報など、文字そのもの以外の情報もふくまれているからだ<ref>実は多くのワープロソフトではテキストファイルを保存する方法が用意されており、それで保存すればプログラミングもできないこともありません。ただしワープロソフトはプログラミングを意図した設計になっていないので、ワープロソフトでやるメリットはほとんどありません。</ref>。
メモ帳などのテキストエディタで書いてもよいですが、emacsやvim、Atomと言ったプログラミング向けのエディタもあります。こういったエディタではプログラミング言語に応じて色分けや整理をしてくれるなど優れた機能があります。なので何か1つのエディタの使い方に習熟することをおすすめします。


=== 入力モード ===
=== ワープロソフトには保存しない ===
'''概要''': 大半のプログラミング言語において、ほとんどの記号、数字は、半角英数字で入力しなければならない。表示させたい文章などは、その限りではない。
けっして(windowsでいう)『Word』(ワード)のような機能のワープロソフトには、プログラム用コードは保存しないでください。


プログラム中に出現する記号は、ほとんどの場合、半角英数字で入力する必要がある。大抵のOSでは直接入力モードに切り替える必要がある。OSによっては、半角モードと直接入力モードとは、べつのモードの場合がありますので、気をつけましょう。なお、Windows7では、半角英数が直接入力です。
一般にワープロソフトで保存されるのはテキストファイルではありません。もしワープロソフトに保存してしまうと、たとえ、あとで拡張子を「.c」に書き換えてC言語としてファイル形式を指定しても(※ 拡張子については後述する)、拡張子を書き換えてもプログラムが動作しなかったり、あるいはプログラムの内容が変わってしまい、エラーになってしまうから、です。(なお、Linuxの場合は、ワープロソフトの名前が、OSごとに異なる。)


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

なぜ、エラーになるかというと、ワープロソフトには、「明朝体」や「ゴシック体」などの字体の情報も保存されていたりなど、文字そのもの以外の情報もふくまれているからです。もし、Wordでつくったファイルを、むりやりプログラムのコードに変換しようとすると、エラーになります。<ref>実は多くのワープロソフトではテキストファイルを保存する方法が用意されており、それで保存すればプログラミングもできないこともありません。ただしワープロソフトはプログラミングを意図した設計になっていないので、ワープロソフトでやるメリットはほとんどありません。</ref>

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

なお、直接入力モードで書かれた文字は、半角英数で表示されます。OSによっては、半角モードと直接入力モードとは、べつのモードの場合がありますので、気をつけましょう。

なお、windows7では、半角英数が直接入力です。

いっぽう、半角カタカナは直接入力'''ではない'''ので、プログラム命令には使えません。


<syntaxhighlight lang="text">
print("おはよう")
print("おはよう")
</syntaxhighlight>
</syntaxhighlight>
というコードがあったとしたら、「print」は直接入力モードで入力します。「(も直接入力モードです。ひとつめの「"」直接入力モードです。
というコードがあったとしたら、「print」「(」「"」は直接入力モードで入力します。「おはようを全角モードで入力します。そして、ふたつめの「"」「)」は直接入力モードで入力します。つまり、例外的に日本語表示をしたい部分だけを除いて、原則的に直接入力モードで、入力することになります。

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

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

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


=== 拡張子 ===
=== 拡張子 ===
'''概要''': ファイルの最後の「.」より後ろを[[w:拡張子]]と呼ぶ。ファイルの名前にはわかりやすくするために拡張子をつけておく。
さて、テキストエディタにコードを記述したら、セーブして保存しておく必要があります。


保存のさい、拡張子(かくちょうし)つける必要があります。拡張子は、そのプログラミング言語の種類によって変わりますので、それぞれのプログラミング言語についての入門書などにしてください
'''拡張子'''(かくちょうし)はテキストエディタで保存する時つける必要があ。拡張子は、プログラミング言語の種類によって変わるため、それぞれのプログラミング言語についてのマニュアルを参照する。C言語で保存するは、「.c」を末尾につける。{{code|sample}}という名前のファイルをC言語として保存する場合には、ファイル名を{{code|sample.c}}とする


=== コマンドラインと慣れ親しむ ===
たとえば、C言語で保存するには、「.c」を末尾につけます。
'''概要''': キャラクターインターフェイスのみ用意されている場合は、コマンドラインで諸々の準備を行わなければならない。
* Windowsの場合: {{code|[[w:コマンドプロンプト|cmd]]}}または{{code|[[w:Powershell|powershell]]}}
* macOS、Linuxの場合: {{code|/bin/sh}}


真っ黒な画面、白い文字。恐怖心を覚えるかもしれないが、避けては通れない道である。プログラミング言語によっては扱う必要がないかもしれない。パッケージマネージャーによるインストールなどはここでは扱わないので、各OSのマニュアルを参照。
「sanpru」(サンプル)という名前のファイルをC言語として保存した場合には、ファイル名は「sanpru.c」となるわけです。

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

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

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


* コマンドラインから抜ける: {{code|exit}}
<!--
== Linuxの場合 ==
== Linuxの場合 ==
=== おおまかな手順 ===
=== おおまかな手順 ===
83 行 64 行
# テキストエディタで、ソースコード(プログラム文)を記述する。
# テキストエディタで、ソースコード(プログラム文)を記述する。
# コードを保存するとき、その言語専用の拡張子をつけて、コードだけの書かれたテキストファイルを保存する。
# コードを保存するとき、その言語専用の拡張子をつけて、コードだけの書かれたテキストファイルを保存する。
# コンパイルの必要な言語の場合、コンパイルなどの作業。この作業は、コマンド端末(windowsに例えると「DOSプロンプト」みたいなアプリ)を用いることになる。
# コンパイルの必要な言語の場合、コンパイルなどの作業。この作業は、コマンド端末(Windowsに例えると「DOSプロンプト」みたいなアプリ)を用いることになる。
# 実行可能な形式になったファイル形式のファイルを、実行する。この作業で、コマンド端末を用いることになる。
# 実行可能な形式になったファイル形式のファイルを、実行する。この作業で、コマンド端末を用いることになる。


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


しかし、たいてい最近のOSにはアプリケーション検索のための画面が用意されており、そのアプリ検索欄に「コマンド」とか「command」とか「terminal」(※ 「ターミナル」と読む。「端末」という意味)とかの語句を検索欄に入力すれば、そのOSに入っているコマンド端末アプリが発見されるので、OSの指示にしたがえばそのコマンド端末アプリを起動することができます。<ref>「command」とさいごまで入力しなくても、「comm」とか「コマ」あたりまで入力した時点で、目的のコマンド端末アプリが発見されることが多い。</ref>
しかし、たいてい最近のOSにはアプリケーション検索のための画面が用意されており、そのアプリ検索欄に「コマンド」とか「command」とか「terminal」(※ 「ターミナル」と読む。「端末」という意味)とかの語句を検索欄に入力すれば、そのOSに入っているコマンド端末アプリが発見されるので、OSの指示にしたがえばそのコマンド端末アプリを起動することができます。<ref>「command」とさいごまで入力しなくても、「comm」とか「コマ」あたりまで入力した時点で、補完することができる。</ref>


またほとんどのOSにはコマンド端末が最初からインストールされているので、わざわざ追加インストールする必要はありません。もしためしてみて追加インストールを要求される場合、アプリケーションをまちがえている場合があります。<ref>たとえば、Linuxの一種である「Fedora」(フェドラ)というOSの標準バージョンOSを使っている場合なら、さいしょからコマンド端末がインストールされており、「端末」というアプリケーション名のアプリが、目的のコマンド端末アプリケーションである。</ref>
またほとんどのOSにはコマンド端末が最初からインストールされているので、わざわざ追加インストールする必要はありません。もしためしてみて追加インストールを要求される場合、アプリケーションをまちがえている場合があります。<ref>たとえば、Linuxの一種である「Fedora」(フェドラ)というOSの標準バージョンOSを使っている場合なら、さいしょからコマンド端末がインストールされており、「端末」というアプリケーション名のアプリが、目的のコマンド端末アプリケーションである。</ref>
117 行 98 行
実行を取り消したい場合には、直接入力モードでnを入力して、エンターキーを押します。ここでの「n」の意味は、英語noの頭文字のことです。
実行を取り消したい場合には、直接入力モードでnを入力して、エンターキーを押します。ここでの「n」の意味は、英語noの頭文字のことです。


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


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




143 行 124 行


Windows製品にかぎらず(Linuxなどでも)「IDE」とは一般に、コンパイラとプログラム実行環境と編集用エディタが付属したソフトウェアの事であり、統合開発環境(Integrated Development Environment)を略してIDEと読んでいる。
Windows製品にかぎらず(Linuxなどでも)「IDE」とは一般に、コンパイラとプログラム実行環境と編集用エディタが付属したソフトウェアの事であり、統合開発環境(Integrated Development Environment)を略してIDEと読んでいる。
-->

== 実行、意味論の解釈 ==
== インタプリタとコンパイラ ==
コンピュータが認識できるのは2進数の機械語のみであることは先で述べました。しかしプログラミング言語は一定の規則ているとはいえ我々の使う自然言語で書かれています。そこでどうにして機械語翻訳する作業が必要になります
コンピュータが認識できるのは機械語のみであることは先で述べました。しかしプログラミング言語は文法沿言語で書かれています。それらの書れた文章を'''ソースコード'''と呼びます。では、プログラミング言語→機械語の変換 (翻訳) はどうするのか


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


'''スクリプト言語'''と呼ばれる言語は、おおよそインタプリタ方式を採用している。インタプリタ方式を採用しているプログラミング言語は、JavaScript、Pythonなどがある。手軽に書いてすぐ実行できるというメリットがある反面、プログラムの実行時に毎回解釈をする必要があるのでプログラムの実行速度はコンパイル方式のプログラミング言語に実行速度が劣る場合がある。インタプリタであるプログラム言語ではソースコードを直接実行するので、プログラムのコードを書き換えると、実行結果もそれに応じて変化します。
あるいは、そのような方式(コンパイルしなで実行できる方式)での、ソースコード翻訳機能の部分をインタプリタといいます。
です。


=== コンパイル ===
1980年代なら、当時のBASICが、インタプリタで動く言語の代表例です。
ソースコードを全部一気に機械語に翻訳してから、機械語のファイルを実行するという方法もある。プログラムのコードを機械語に変換することを、'''コンパイル'''と言う。コンパイルするためのソフトウェアのことを'''コンパイラ'''という。コンパイルが必要な言語をまとめて'''コンパイル型言語'''と言うことがある。


コンパイル型言語は

* C言語

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

スクリプト言語の代表例は
* シェルスクリプト
* JavaScript
* Python
などです。

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

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


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

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


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

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

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

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

コンパイル型言語の代表例は
* C言語、C++、C#
* FORTRAN
* FORTRAN
などです
などがある


コンパイル型言語では、コード入力用に用いるファイルと、実行ファイルとは、別のファイルです。そのためソースコードを変更してもコンパイルしなければ変更が反映されません。コンパイル型言語の実行ファイルは、機械語で書かれています。コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。実行ファイルの言語は、OSやハードウェアそれぞれに合わせた機械語になっています<ref>OSごとに使われるレジスタなどが異なる</ref>。WindowsをターゲットにしたファイルをLinuxにコピーしても動作しない。実行ファイルから元々のソースコードを取り出すこと ('''デコンパイル''') は一般的には厳しいです。機械語にはそのOSに合わせてメモリやCPUがどんな動作をすべきかという指示だけが書かれてあり、けっしてその動作の目的は機械語には書かれていません。機械語に変換された実行ファイルは、配布するプログラムのもともとのコード内容を秘密にしたいときに便利というメリットもあります。プログラムのコードをコンパイルしたファイルを実行ファイルにまとめる前のファイルを'''オブジェクトファイル'''言う。ソースコード→オブジェクトファイル→実行ファイルという形。
コンパイル型言語では、コード入力用に用いるファイルと、実行ファイルとは、別のファイルです。そのためソースコードを変更してもコンパイルしなければ変更が反映されません。


=== 違いは? ===
コンパイル型言語の実行ファイルは、機械語で書かれています。コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。
* ソースコードを書き換えた場合

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

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

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

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

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

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

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

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

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

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


=== どちらでもない言語、両方できる言語 ===
=== どちらでもない言語、両方できる言語 ===
218 行 154 行


==== 中間言語を生成するプログラミング言語 ====
==== 中間言語を生成するプログラミング言語 ====
[[File:JvmSpec7.png|300px|ソースコード→classファイル→機械語|right]]
プログラミング言語のなかには、インタプリタかコンパイラかのどちらかがハッキリしない言語もあります。
プログラミング言語のなかには、インタプリタかコンパイラかの分類に当てはまらない言語もあります。例えば、Javaはソースコードを、Java仮想マシンが解釈できる中間言語 (classファイル) にコンパイルします。そして実行時に、その中間言語を機械語に翻訳するという仕組みです。中間言語ファイルは機械語から独立しているため、どのOSでも使うことができる。かわりにユーザーは、Java中間言語を機械語に翻訳するためのソフトウェア (これを「Java Runtime Environment」、あるいは略してJREと呼ぶ) をインストールします。そして、そのJavaのランタイムは、Windows、macOS、Linux系列といったそれぞれのOSごとで動作するようにメンテナンスされている。ユーザーから見れば、Javaのように中間言語を生成するプログラミング言語は、どのOSにも依存せず動作するので理想的なように見える。しかし、ユーザーから見て統一的なAPIを提供しつつ、統一的なAPIとそれぞれのOSを橋渡しする部分を実装することは非常に手間がかかる。

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

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

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


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

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

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

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



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


==== 例外 ====
==== 例外 ====
;インタプリタC言語
;コンパイル型言語を逐次実行、あるいはインタプリタの言語をコンパイルして使用する場合
コンパイル型言語であるC言語を逐次実行したり、インタプリタ型のBASIC<ref>注釈: Quick BASIC というBASIC実行ソフトがあり、これが、コンパイルすることによって実行速度を速めた改良型のBASICでした。</ref>をコンパイルしたりする場合は分類に当てはまらない。
コードがC言語で書かれていても、初心者むけに、コンパイルせずに実行のたびに機械語に翻訳するようなソフト上で、そのC言語コードを実行すれば、そのような場合はインタプリタです。

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


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

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


=== 現状 ===
=== 現状 ===
==== インターネットとの関係 ====
==== インターネットとの関係 ====
ウェブページ用プログラミング言語としても <!-- "Node.js" --> 普及しているJavaScriptは、ブラウザ付属のインタプリタとしてウェブブラウザに実装されていることがほとんどだ。インタプリタかコンパイラかどうかは、けっして言語の仕様そのものによるものではなく、実装による違いだ。Pythonのようにインタプリタとして実装されているプログラミング言語に、追加モジュールとしてウェブプログラミング用モジュールを付け加えて(すでにそのようなモジュールが開発されており配布されている)、それでpythonなどでウェブプログラミングを行うという方法もあります。
HTMLはプログラミング言語ではありませんが、インタプリタのように、使用のたびにコードを解釈しなおします。HTMLファイルを作る時やアップロード時には、けっしてコンパイルしないのが現状です。

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

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

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

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

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


=== パーサ ===
=== パーサ ===
プログラミング言語から機械語に変換するためには、そのソースコードがなにを意味するのか解釈する必要がある。このような、文字列を機械語など別のものに置き換えるアプリケーションのことを、文字列を解析して解釈する機械という意味で、「解釈機」(かいしゃくき、パーサ parser)とか「解析器」(かいせきき)などと言います。情報科学の書籍で「コンパイラ」と行った場合、それは必ずしもC言語などのコンパイル言語のこととはかぎらず、パーサの意味の場合があります。
インタプリタ言語だろうがコンパイル言語やJavaだろうがHTMLだろうが、コードとして書かれた文字列をパソコンが読みとり、それを最終的にプログラムを動作させる直前までには、機械語や中間言語などに置き換えるわけです。


== 文法 ==
このような、文字列を機械語など別のものに置き換えるアプリケーションのことを、文字列を解析して解釈する機械という意味で、「解釈機」(かいしゃくき、パーサ parser)とか「解析器」(かいせきき)などと言います。
=== 代入 ===
'''注釈''': <code>a = a + 1</code>が何を指すかご存知だろうか。{{code|a}}が変数、 {{code|<var>x</var> {{=}} <var>y</var>}}が変数{{code|x}}に式{{code|y}}の評価結果を代入していることが理解できるのであればこの文章は読み飛ばしても良い。


プログラミングと数学では、<code>=</code>が指す意味が違う。数学では<math>a = b</math>とすることで、<math>a</math>と<math>b</math>が同一であることを意味するが、プログラミングにおいて<code>a = b</code>は変数{{code|a}}に式{{code|b}}の評価結果を代入する。たとえば、{{code|a {{=}} a + 1}}で、{{code|a}}が2とすると、{{code|a {{=}} 2 + 1}}となり、{{code|2 + 1}}の評価結果が{{code|a}}に設定される。ほとんどの場合は、{{code|2 + 1}}が{{code|3}}に評価されて代入される。
情報科学の書籍で「コンパイラ」と行った場合、それは必ずしもC言語などのコンパイル言語のこととはかぎらず、パーサの意味の場合があります。

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

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

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

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

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


== よくある文法 ==
=== 「代入」とは ===
どのプログラミング言語の勉強でも、「<code>a = a + 1</code>」というような命令文を、かならず習うだろう。

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

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

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

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

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

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

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

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


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

たとえば、


=== 変数 ===
なお、上記の説明で、当然のように「変数」という言葉を用いたが、この「変数」という用語も、数学とは扱いかたが微妙に違うので、気をつける必要がある。
変数名の命名規則については、それぞれのプログラミング言語のマニュアルを参照すること。
また、なお、たいていの言語では、大文字、小文字を区別 (case-sensitive) する。
C言語で例を示す:
例1
例1
<syntaxhighlight lang="c">
a = 2 ;
a = A + 1 ;
a = 2;
a = A + 1;

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

変数{{code|a}}を1増やしたいのであれば、例2のようにする。
修正した結果、


例2
例2
<syntaxhighlight lang="c">
a = 2 ;
a = a + 1 ;
a = 2;
a = a + 1;
なら、たいていのプログラム言語なら、上記の例2のプログラムが実行できるようになっており、実行すれば、aの値は3になる。
</syntaxhighlight>
実行すれば、aの値は3になる。


=== 実行順序 ===

単文は出現順序が先の方から順に実行されることがほとんどである。文を区切るのは改行、あるいは<code>;</code> (セミコロン) を使用することが多い。例2で示したプログラムなら、<code>a = 2;</code>のあとに、<code>a = a + 1;</code>が実行される。
初心者のうちは、変数名につかう文字は、英語の小文字のみにするのが良い。


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

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

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

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

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

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

たとえば

例3
a = 2 ;
a = a + 1 ;
という順番で書かれた2行のプログラムなら、

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


=== 数値 ===
=== 数値 ===
ソースコードで記述する整数リテラル、及び小数リテラルは、特に指定をしないかぎり、10進数である。整数と、(ほとんどの場合、[[w:IEEE 754|IEEE 754]]に準拠した) 有限のケタの小数が、普通のプログラム言語では使える。分数や平方根(<math>\sqrt 3</math> など)などは、関数として用意されている場合でも、評価結果が近似される。また、小数も精度以下の部分は近似して表される。
プログラム言語であつかえる数は、特に指定をしないかぎり、10進数である。(日常生活でつかう数え方と同じなので、安心してよい。)

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

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

もしコンピュータで√3が 1.732050807 に近似されたなら、コンピュータ内部では、
:けっして 1.73205 08075 68877 29352 74463 41505 87236 69428 05253…でなく、
:コンピュータ内部では 1.73205080700000000000000000000000000000000・・・・に近似されている、
という意味である。


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

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

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


<!-- 1.73205 08075 68877 29352 74463 41505 87236 69428 05253 -->
結局、数学の能力がプログラマーには必要である。途中式を式変形できるだけの数学の能力が、必要である。
もし<math>\sqrt 3</math>が <math>1.732050807</math> に近似されたなら、コンピュータ内部では、<math>1.73205 \, 08075 \, 68877 \, 29352 \, 74463 \, 41505 \, 87236 \, 69428 \, 05253 \, \cdots</math>ではなく、<math>1.732050807 \times 10^0</math>という値として表現されている。上記のように、本来なら数学的には無限のケタの平方根などを有限ケタの小数に近似してしまうため、誤差が発生する。このような、無限小数を有限小数に近似したために誤差の発生する現象のことを'''ケタ落ち'''という。


== GUIプログラミング ==
== GUIプログラミング ==
=== てっとり早い方法は? ===
=== Windows/macOS ===
アプリをウィンドウで表示したり、マウスでクリックするボタンを配置したり、そのようなグラフィカルな表示をするには、どのようにすれば良いのでしょうか?
アプリをウィンドウで表示したり、マウスでクリックするボタンを配置したり、そのようなグラフィカルな表示をするには、どのようにすれば良いのでしょうか?一番簡単な方法は、WindowsやmacOSの提供するAPIを使い、アプリをプログラミングすることになります。デバッグも重要です。Windows上で動作するGUIアプリを制作したいなら、実際にWindowsでプログラムを動作確認し、GUIを表示させてみることが、確実な方法です。例外として、一部のプログラミング言語には、プレビュー機能がついています。その場合も、それぞれのOSの機能を利用しているので、OSごとによってアプリの表示結果が違う場合が有ります。JavaScriptは、HTML経由でGUI表示ができますが、そのHTMLは、それぞれのOSのGUI機能を利用している。


=== Linux ===
結論からいうと、ウィンドウズまたはマックOSの提供するプログラミング環境を使うことになります。
であれば、Linuxはどうだろうか。結論からすると可能だ。wikibooksの[[GTKプログラミング]]や[[GNOMEフレームワーク]]を参照されたい。


=== Windows ===
なので、特定のOSに依存しない「C言語」などの書籍を読んでも、画面に直線を1本ひくための操作すら、書籍には書かれていないのが、通常です。
==== 概要  ====
<!-- TODO: Win64、Win RT -->
<!-- DirectXが正式表記 -->
発展的なことをする場合、'''Win32 API'''と'''DirectX'''という機能を使う。
Win32 APIとDirectXのうち、初心者がまず先に学ぶべきは Win32 APIです。DirectXのパラダイムは、文法上Win32 APIを踏襲しているので、まず先にWin32 APIを習得する必要があります。
なお、「Win32」の32とは32ビットのことです。お使いのパソコンが64ビットでも、Win32APIの機能を使います。
Windows95の発売された1995年のころの時代が、CPUのビットが当時は最新だった32ビットに切り替わったころの時代であり(それ以前の時代のCPUは16ビットまたは8ビットのCPUが多かった)、その時代にWindowsのGUIプログラミングの文法が整備されたのでWin32 APIと呼んでいるわけです。
なので、64ビットCPUの普及した今でも Win32 APIの文法を使います。
書店だと、もしかしたらゲームプログラミング書のコーナーで、DirectXの書籍を見かけるのにWin32 API の書籍を見かけないような事態も、あるかもしれません。しかし、 Win32 APIの知識が無い状態で、 DirectX の書籍だけを買って読んでも、書籍の内容を理解できないでしょう。


==== Win32 API ====
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などで動作するオープンソースのアプリ(GTKなど)は公開されています。

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

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

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


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

もしあなたが、それがわかった上でどうしてもLinux対応のGUIアプリを開発したければ、wikibooks教科書では [[GTKプログラミング]] や [[GNOMEフレームワーク]] などが参考になるでしょう。

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

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

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

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

いちおう、インストーラーを再度立ち上げなおして『C++によるデスクトップ開発』にあるチェックボックス一覧(画面右側にある)の『C++/CLI』にチェックを入れれば、過去にフォームデザイナと互換性のあった文法を使える仕様ですが、しかし標準設定ではこれにチェックボックスが入ってないことから、マイクロソフト社は本音ではあまりC++にフォームデザイナをサポートしたくないようです。

そもそも『C++/CLI』が保証しているのは、あくまでもC++/CLI自身の文法の保証だけであり、一言も「フォームデザイナの動作を保証する」とはマイクロソフト社もVisual Studio も言及していません。

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

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

さらに問題点として、せっかく上手くC++/CLIをインストールおよびプログラミングできたとしても、動作に.Net Frameworkなどが追加で必要なので(標準のVisual C++では不要だった)、標準のC++のコードとは互換性が無くなり運用性の手軽さが低下します。(プログラマだけでなく、そのアプリを使う人にもまた、専用の.Net Frameworkランタイムが必要になる。)


マイクロソフト社は、どうやら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 を習得する必要があります。


なお、「Win32」の32とはCPUの32ビットのことですが、たとえアナタのお使いのパソコンが64ビットCPUのパソコンでも、Win32APIの機能を使います。

Windows95の発売された1995年のころの時代が、CPUのビットが当時は最新だった32ビットに切り替わったころの時代であり(それ以前の時代のCPUは16ビットまたは8ビットのCPUが多かった)、その時代にWindowsのGUIプログラミングの文法が整備されたのでWin32APIと呼んでいるわけです。

なので、64ビットCPUの普及した今でも Win32 API の文法を使います。

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


===== Win32 API =====
Win32 APIを使うには、初心者には、Visual C++ で「Windowsデスクトップアプリケーション」というのを選ぶしかないでしょう。(もしかしたらC#などでも出来るかもしれませんが、初心者には返って複雑でしょう。)なお、Visual Studio をインストールしただけではVisual C++はインストールされてないので、事前にVisual Studio の設定画面などから Visual C++ をインストールする必要があります。
Win32 APIを使うには、初心者には、Visual C++ で「Windowsデスクトップアプリケーション」というのを選ぶしかないでしょう。(もしかしたらC#などでも出来るかもしれませんが、初心者には返って複雑でしょう。)なお、Visual Studio をインストールしただけではVisual C++はインストールされてないので、事前にVisual Studio の設定画面などから Visual C++ をインストールする必要があります。


Windows95の発売されたころにマイクロソフトが開発していたプログラム言語がVisual C++ですので、これからWin32APIを学ぶならVisual C++ を使うのが一番、マニュアルなども入手しやすくて初心者むけでしょう。
Windows95の発売されたころにマイクロソフトが開発していたプログラム言語がVisual C++ですので、これからWin32APIを学ぶならVisual C++ を使うのが一番、マニュアルなども入手しやすくて初心者むけでしょう。


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


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

「wWinMain」は、昔のC言語でのMain関数に相当します。なお昔は「WinMain」と書かれていました。
「wWinMain」は、昔のC言語でのMain関数に相当します。なお昔は「WinMain」と書かれていました。
Visual Studio で、アプリ作成時にダイアログで質問される、アプリの種類のうち、C#の冒頭のほうにある、.NET Framework 関連の開発環境では、じつは、高度なアプリを作るのには、あまり使えません。


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

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


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

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


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

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

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


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

いっぽう、win32 API で開発すれば、サポート期間中のWindowsなら、よほどの事がないかぎり、ほぼすべてのバージョンで動きます。
いっぽう、win32 API で開発すれば、サポート期間中のWindowsなら、よほどの事がないかぎり、ほぼすべてのバージョンで動きます。
しかし、.NET Framework 開発環境で開発されたアプリには、さらに .NET Framework ランタイムがユーザーに必要になります。(プログラマだけでなく、そのアプリを使う人にもまた、専用のランタイムが必要になる。)


==== DirectX ====
しかし、.Net Framework 開発環境で開発されたアプリには、さらに .Net Framework ランタイムがユーザーに必要になります。(プログラマだけでなく、そのアプリを使う人にもまた、専用のランタイムが必要になる。)
DirectX は、主に、Windows用の画像関係のランタイムやライブラリのうち、3D-CGの計算や、GPUなどマルチメディア関係デバイスの制御などの、高度な機能が、まとめられています。

初心者は、当面は DirectX のプログラムを書く必要は、無いでしょう。
===== Direct X =====
ですが、Windowsでアプリを作る際に、知識としてDirectX について、いろいろと知っておく必要があります。
Direct X は、主に、Windows用の画像関係のランタイムやライブラリのうち、3D-CGの計算や、GPUなどマルチメディア関係デバイスの制御などの、高度な機能が、まとめられています。
なぜなら、現在の Windows では、実はウィンドウは3D-CGとして処理しています。(アナタが今見ているwebブラウザのウィンドウも、マイクロソフト社の公式の仕様上ではDirectX が起動しており、ウィンドウを 3D-CG として処理して、ディスプレイにウィンドウ表示しているハズです。)

ユーザーにはDirectX の名前が表示されてないだけで、実はWindowsの画像処理のいろいろな箇所で、 DirectX は動作しています。
初心者は、当面は Direct X のプログラムを書く必要は、無いでしょう。
現在のWinodwsの多くの機能は、DirectX をもとにグラフィック描画をしてる部分もあるからです。

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

なお、よく、Windows向けのゲームで「DirectXランタイムが必要です」などと説明書などで記載されているので、てっきりDirectX をゲーム専用に追加インストールする必要のある追加機能だと誤解しがちだが、実はのWindows7以降(win7自身も含む)ではゲームとは無関係に既にWindowsのインストール時点で DirectX は Windowsに標準インストールされています。
ですが、Windowsでアプリを作る際に、知識としてDirect X について、いろいろと知っておく必要があります。
Windows95くらいの過去のバージョンではDirectX は購入時点ではWindows製品には付属しておらず追加インストールしないと使えなかった時代もありました。しかし、現時点のWindows7以降(7も含む)のバージョンでは、DirectX はWindowsの購入時点で付属しており、Windowsのインストールと一緒にDirectX もインストールされています。

なぜなら、現在の 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 をゲーム専用に追加インストールする必要のある追加機能だと誤解しがちだが、実はのwindows7以降(win7自身も含む)ではゲームとは無関係に既にWindowsのインストール時点で Direct X は Windowsに標準インストールされています。

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


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

そのような機能不足でも、Win32 APIを使って改善するプログラムが作れればよいのですが、しかし、そうとは限りません。GPUなど画像関係ハードウェアの制御などは、Win32APIではサポートされていない場合もあります。
そのような機能不足でも、Win32 APIを使って改善するプログラムが作れればよいのですが、しかし、そうとは限りません。GPUなど画像関係ハードウェアの制御などは、Win32APIではサポートされていない場合もあります。
世間一般のソースが非公開にされているアプリでは、もしかしたら、ゲームソフトでなくてもDirectXを動作させるコードを書いているアプリケーションもあるかもしれません。


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


マイクロソフト社がソース非公開のため、Windows内部でのグラフィック描画機能にWin32APIとDirectXとをどう使いわけているかも非公開であり、詳細は不明です。
マイクロソフト社がソース非公開のため、Windows内部でのグラフィック描画機能にWin32APIとDirectXとをどう使いわけているかも非公開であり、詳細は不明です。
世間では歴史的経緯から、「WindowsのGUI描画はWin32APIをベースにしており、例外としてDirectXでプログラムされたGUIアプリを動作させる時だけDirectXを使ってる」という解釈が通説ですが、しかし、実はそのような保証は無いのです。

もしかしたら、もはやDirectXがWinodws内部のGUI描画でベースのシステムになっている可能性もあります。ひょっとしたら、近年のWindowsでは(GUIのコードの原則はDirectXとして)、Win32APIのコードのほうが例外的に処理されている可能性もあります。
世間では歴史的経緯から、「WindowsのGUI描画はWin32APIをベースにしており、例外としてDirect XでプログラムされたGUIアプリを動作させる時だけDirect Xを使ってる」という解釈が通説ですが、しかし、実はそのような保証は無いのです。
少なくとも明確な事実として、マイクロソフト社は、最新の画像技術のサポートなどは、Win32APIではなくDirectXを通してサポートを提供しています。

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


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

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


=== マルチメディアの扱い方 ===

スクリーンをある時点で固定すると、画像とみなせる。画像ファイルはバイナリファイルである。その証左として、適当な画像を開いてもテキストとして読み取ることはできない。画像の種類ごとにフォーマットと呼ばれる、情報の種類や出現順序が規定されている。C言語でバイナリファイルを入出力する能力が必要になります。よって、かなり乱暴であるが、画像に描画することができれば、スクリーンに描画することもできる。実際には、さらにこのほか、雑多な知識が必要になります。実際は、各OSのAPIやアプリ、外部ライブラリなどで入出力することができるので、自分で実装する必要はない。画像編集ソフトのの核心は、フォーマットに従ったバイナリを出力することにある。フォーマットに従っているということは、画像ファイルに限らず、音声や動画などでも同様。
=== 原理(手っ取り早くない) ===
画像ファイルの原理は、どうなってるかと言うと普通、実は機械語ファイルであり、ビットマップの場合、実は「ビットマップ構造体」といわれるもので、その機械語の並び方の仕様が決まっています。

そのほか、JPEG(ジェイペグ)など国際規格で決まっている画像形式も、実態はJPEG規格の仕様などで機械語の並び方も決められており、JPEG画像ファイルはその機械語ファイルです。


なので、これらの画像形式の仕様を読み解くための知識で、最低限、C言語で機械語ファイル(バイナリファイル)を入出力する能力が必要になります。

また、C言語の「構造体」などの用語を理解する必要もあります。

実際には、さらにこのほか、雑多な知識が必要になります。

予備知識が、かなり膨大だし、実用上はわざわざ機械語の読み書きプログラムを自作するまでもなく、すでにOS提供会社が、そのOS用の画像作成ソフトを提供しているので(ウィンドウズの場合は『ペイント』アプリなど)、普通の用途では、機械語で画像ファイルを作成することは めったに無いです。


いわゆる「お絵かきソフト」とか「画像作成・描画ソフト」のような、画像ファイルそのものを作るソフトの中身は、大まかに上記のような、機械語を出力する仕組みでしょう。

説明のため画像ファイルで説明しましたが、音声ファイルなども同様です(テキストファイル形式でないので)。


普通の人は、『ペイント』とかの一般のお絵かきアプリで画像作成しましょう。

あるいは、もし Linux で使える無料ソフトが使いたいなら GIMP (ギンプ)という無料でオープンソースの有名な画像作成ソフトもあります。


== 関連項目 ==
== 関連項目 ==

2020年10月19日 (月) 11:34時点における版

このページでは、プログラミングにおいて頻出である共通の知識を説明する。

概要

プログラミングはWindows(ウィンドウズ)、macOS(マック)、Linux(リナックス)、どのOSでも、行うことができる。 スマートフォン向けのOS、iPhone(アイ フォーン) や Android(アンドロイド)などで行うこともできる。

※注釈:以下では、電子計算機を指す用語として「コンピュータ」、「コンピューター」が混在している場合があるが、どちらも同じ意味である。

「プログラミング」とは?

プログラム」はコンピュータにしてもらう指示をまとめたものです。「プログラミング」は、「プログラム」を作成することです。私たちはプログラムを作ってコンピュータに実行させることでコンピュータに仕事をしてもらいます。現代のコンピュータは、内部では0と1だけの2進数で動作しています[1]。2進数で表現されていることを特に「バイナリ」と呼びます。それに合わせて、指示は0と1のみで表現される「機械語」で与える必要があります。しかし機械語は直接読み書きすることは困難です。そこで、より私たちの話す言語に近い文法や単語からなる”記号”で指示を記述して、それをあとで2進数に訳して実行させるという方法が生まれました。この「訳する」作業を「コンパイル」と呼びます。

文字入力

プログラミングをするからには、文字の入力ができなくては始まらない。以下は、文字に関する概念を簡単に述べる。

バイナリファイルとテキストファイル

概要: バイナリファイルとテキストファイルは人間都合の呼びわけである。

コンピュータはHDD、SSDなどの記憶媒体にファイルを保存する。「テキストファイル」とは、文字として解釈することを想定されたファイルを指す。対となる概念として、「バイナリファイル」がある。Windowsではテキストファイルには.txtという拡張子を付けることが多い。プログラムを作るとき、拡張子は言語に応じたものを付けて区別する。

テキストエディタ

概要: テキストエディタは怖くない。

文字を入力するときは、専用のアプリを起動する。以下に不完全なOSに付属しているエディターのリストを示す:

  • Windows: メモ帳 (notepad.exe)
  • Linux
    • fedora: gedit

さらに、emacsやvim、Atom、VSCodeもテキストエディタと呼ばれる。エディタによっては、シンタックスハイライトと呼ばれる色分けをする機能や、折りたたみ機能など、特色ある機能を搭載している場合がある。テキストエディタのインストール方法については、ここでは取り扱わないので、各エディタのマニュアルを参照すること。

ワープロソフトは使えない

概要: マイクロソフト社のWord(ワード)のようなワープロソフトでは、テキスト以外に付属するデータがあるため、プログラミングには使えない。

ワープロソフトで保存されるのはバイナリファイルであることが非常に多い。ワープロソフトで文章を保存しても、文章がそのままテキストとして保存されるわけではない。そのファイルの拡張子を「.c」に書き換えてC言語として再解釈しようとしても、コンパイルエラーになってしまうだろう。なぜエラーになるかというと、ワープロソフトには、メタデータと呼ばれるフォントの種類、大きさ、色、位置関係の情報など、文字そのもの以外の情報もふくまれているからだ[2]

入力モード

概要: 大半のプログラミング言語において、ほとんどの記号、数字は、半角英数字で入力しなければならない。表示させたい文章などは、その限りではない。

プログラム中に出現する記号は、ほとんどの場合、半角英数字で入力する必要がある。大抵のOSでは直接入力モードに切り替える必要がある。OSによっては、半角モードと直接入力モードとは、べつのモードの場合がありますので、気をつけましょう。なお、Windows7では、半角英数が直接入力です。

print("おはよう")

というコードがあったとしたら、「print」「(」「"」は直接入力モードで入力します。「おはよう」を全角モードで入力します。そして、ふたつめの「"」「)」は直接入力モードで入力します。つまり、例外的に日本語表示をしたい部分だけを除いて、原則的に直接入力モードで、入力することになります。

拡張子

概要: ファイルの最後の「.」より後ろをw:拡張子と呼ぶ。ファイルの名前にはわかりやすくするために拡張子をつけておく。

拡張子(かくちょうし)はテキストエディタで保存する時つける必要がある。拡張子は、プログラミング言語の種類によって変わるため、それぞれのプログラミング言語についてのマニュアルを参照する。C言語で保存するには、「.c」を末尾につける。sampleという名前のファイルをC言語として保存する場合には、ファイル名をsample.cとする。

コマンドラインと慣れ親しむ

概要: キャラクターインターフェイスのみ用意されている場合は、コマンドラインで諸々の準備を行わなければならない。

  • Windowsの場合: cmdまたはpowershell
  • macOS、Linuxの場合: /bin/sh

真っ黒な画面、白い文字。恐怖心を覚えるかもしれないが、避けては通れない道である。プログラミング言語によっては扱う必要がないかもしれない。パッケージマネージャーによるインストールなどはここでは扱わないので、各OSのマニュアルを参照。

  • コマンドラインから抜ける: exit

実行、意味論の解釈

コンピュータが認識できるのは機械語のみであることは先で述べました。しかしプログラミング言語は文法に沿った言語で書かれています。それらの書かれた文章をソースコードと呼びます。では、プログラミング言語→機械語の変換 (翻訳) はどうするのか。

インタプリタ

  1. ソースコードを実行のたびに(機械語に)翻訳しながらプログラムを実行していくという方法のこと。
  2. ソースコードを翻訳する部分。

スクリプト言語と呼ばれる言語は、おおよそインタプリタ方式を採用している。インタプリタ方式を採用しているプログラミング言語は、JavaScript、Pythonなどがある。手軽に書いてすぐ実行できるというメリットがある反面、プログラムの実行時に毎回解釈をする必要があるのでプログラムの実行速度はコンパイル方式のプログラミング言語に実行速度が劣る場合がある。インタプリタであるプログラム言語ではソースコードを直接実行するので、プログラムのコードを書き換えると、実行結果もそれに応じて変化します。

コンパイル

ソースコードを全部一気に機械語に翻訳してから、機械語のファイルを実行するという方法もある。プログラムのコードを機械語に変換することを、コンパイルと言う。コンパイルするためのソフトウェアのことをコンパイラという。コンパイルが必要な言語をまとめてコンパイル型言語と言うことがある。

コンパイル型言語は

  • C言語
  • C++
  • FORTRAN

などがある。

コンパイル型言語では、コード入力用に用いるファイルと、実行ファイルとは、別のファイルです。そのためソースコードを変更してもコンパイルしなければ変更が反映されません。コンパイル型言語の実行ファイルは、機械語で書かれています。コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。実行ファイルの言語は、OSやハードウェアそれぞれに合わせた機械語になっています[3]。WindowsをターゲットにしたファイルをLinuxにコピーしても動作しない。実行ファイルから元々のソースコードを取り出すこと (デコンパイル) は一般的には厳しいです。機械語にはそのOSに合わせてメモリやCPUがどんな動作をすべきかという指示だけが書かれてあり、けっしてその動作の目的は機械語には書かれていません。機械語に変換された実行ファイルは、配布するプログラムのもともとのコード内容を秘密にしたいときに便利というメリットもあります。プログラムのコードをコンパイルしたファイルを実行ファイルにまとめる前のファイルをオブジェクトファイル言う。ソースコード→オブジェクトファイル→実行ファイルという形。

違いは?

  • ソースコードを書き換えた場合
    • インタプリタ型:実行結果が変化する
    • コンパイル型:コンパイルし直さないと実行結果が変化しない

どちらでもない言語、両方できる言語

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

中間言語を生成するプログラミング言語

ソースコード→classファイル→機械語
ソースコード→classファイル→機械語

プログラミング言語のなかには、インタプリタかコンパイラかの分類に当てはまらない言語もあります。例えば、Javaはソースコードを、Java仮想マシンが解釈できる中間言語 (classファイル) にコンパイルします。そして実行時に、その中間言語を機械語に翻訳するという仕組みです。中間言語ファイルは機械語から独立しているため、どのOSでも使うことができる。かわりにユーザーは、Java中間言語を機械語に翻訳するためのソフトウェア (これを「Java Runtime Environment」、あるいは略してJREと呼ぶ) をインストールします。そして、そのJavaのランタイムは、Windows、macOS、Linux系列といったそれぞれのOSごとで動作するようにメンテナンスされている。ユーザーから見れば、Javaのように中間言語を生成するプログラミング言語は、どのOSにも依存せず動作するので理想的なように見える。しかし、ユーザーから見て統一的なAPIを提供しつつ、統一的なAPIとそれぞれのOSを橋渡しする部分を実装することは非常に手間がかかる。

両方できる言語

また、コンパイルして実行することもインタプリタ実行も両方できる場合がある。Python、Go言語、Haskellは、その例である。

例外

コンパイル型言語を逐次実行、あるいはインタプリタ型の言語をコンパイルして使用する場合

コンパイル型言語であるC言語を逐次実行したり、インタプリタ型のBASIC[4]をコンパイルしたりする場合は分類に当てはまらない。

現状

インターネットとの関係

ウェブページ用プログラミング言語としても 普及しているJavaScriptは、ブラウザ付属のインタプリタとしてウェブブラウザに実装されていることがほとんどだ。インタプリタかコンパイラかどうかは、けっして言語の仕様そのものによるものではなく、実装による違いだ。Pythonのようにインタプリタとして実装されているプログラミング言語に、追加モジュールとしてウェブプログラミング用モジュールを付け加えて(すでにそのようなモジュールが開発されており配布されている)、それでpythonなどでウェブプログラミングを行うという方法もあります。

パーサ

プログラミング言語から機械語に変換するためには、そのソースコードがなにを意味するのか解釈する必要がある。このような、文字列を機械語など別のものに置き換えるアプリケーションのことを、文字列を解析して解釈する機械という意味で、「解釈機」(かいしゃくき、パーサ parser)とか「解析器」(かいせきき)などと言います。情報科学の書籍で「コンパイラ」と行った場合、それは必ずしもC言語などのコンパイル言語のこととはかぎらず、パーサの意味の場合があります。

文法

代入

注釈: a = a + 1が何を指すかご存知だろうか。aが変数、 x = yが変数xに式yの評価結果を代入していることが理解できるのであればこの文章は読み飛ばしても良い。

プログラミングと数学では、=が指す意味が違う。数学ではとすることで、が同一であることを意味するが、プログラミングにおいてa = bは変数aに式bの評価結果を代入する。たとえば、a = a + 1で、aが2とすると、a = 2 + 1となり、2 + 1の評価結果がaに設定される。ほとんどの場合は、2 + 13に評価されて代入される。

変数

なお、上記の説明で、当然のように「変数」という言葉を用いたが、この「変数」という用語も、数学とは扱いかたが微妙に違うので、気をつける必要がある。 変数名の命名規則については、それぞれのプログラミング言語のマニュアルを参照すること。 また、なお、たいていの言語では、大文字、小文字を区別 (case-sensitive) する。 C言語で例を示す: 例1

a = 2;
a = A + 1;

以上のプログラムはエラーになる。aAは区別され、Aが定義されていないためである。 変数aを1増やしたいのであれば、例2のようにする。

例2

a = 2;
a = a + 1;

実行すれば、aの値は3になる。

実行順序

単文は出現順序が先の方から順に実行されることがほとんどである。文を区切るのは改行、あるいは; (セミコロン) を使用することが多い。例2で示したプログラムなら、a = 2;のあとに、a = a + 1;が実行される。

数値

ソースコードで記述する整数リテラル、及び小数リテラルは、特に指定をしないかぎり、10進数である。整数と、(ほとんどの場合、IEEE 754に準拠した) 有限のケタの小数が、普通のプログラム言語では使える。分数や平方根( など)などは、関数として用意されている場合でも、評価結果が近似される。また、小数も精度以下の部分は近似して表される。

もし に近似されたなら、コンピュータ内部では、ではなく、という値として表現されている。上記のように、本来なら数学的には無限のケタの平方根などを有限ケタの小数に近似してしまうため、誤差が発生する。このような、無限小数を有限小数に近似したために誤差の発生する現象のことをケタ落ちという。

GUIプログラミング

Windows/macOS

アプリをウィンドウで表示したり、マウスでクリックするボタンを配置したり、そのようなグラフィカルな表示をするには、どのようにすれば良いのでしょうか?一番簡単な方法は、WindowsやmacOSの提供するAPIを使い、アプリをプログラミングすることになります。デバッグも重要です。Windows上で動作するGUIアプリを制作したいなら、実際にWindowsでプログラムを動作確認し、GUIを表示させてみることが、確実な方法です。例外として、一部のプログラミング言語には、プレビュー機能がついています。その場合も、それぞれのOSの機能を利用しているので、OSごとによってアプリの表示結果が違う場合が有ります。JavaScriptは、HTML経由でGUI表示ができますが、そのHTMLは、それぞれのOSのGUI機能を利用している。

Linux

であれば、Linuxはどうだろうか。結論からすると可能だ。wikibooksのGTKプログラミングGNOMEフレームワークを参照されたい。

Windows

概要 

発展的なことをする場合、Win32 APIDirectXという機能を使う。 Win32 APIとDirectXのうち、初心者がまず先に学ぶべきは Win32 APIです。DirectXのパラダイムは、文法上Win32 APIを踏襲しているので、まず先にWin32 APIを習得する必要があります。 なお、「Win32」の32とは32ビットのことです。お使いのパソコンが64ビットでも、Win32APIの機能を使います。 Windows95の発売された1995年のころの時代が、CPUのビットが当時は最新だった32ビットに切り替わったころの時代であり(それ以前の時代のCPUは16ビットまたは8ビットのCPUが多かった)、その時代にWindowsのGUIプログラミングの文法が整備されたのでWin32 APIと呼んでいるわけです。 なので、64ビットCPUの普及した今でも Win32 APIの文法を使います。 書店だと、もしかしたらゲームプログラミング書のコーナーで、DirectXの書籍を見かけるのにWin32 API の書籍を見かけないような事態も、あるかもしれません。しかし、 Win32 APIの知識が無い状態で、 DirectX の書籍だけを買って読んでも、書籍の内容を理解できないでしょう。

Win32 API

Win32 APIを使うには、初心者には、Visual C++ で「Windowsデスクトップアプリケーション」というのを選ぶしかないでしょう。(もしかしたらC#などでも出来るかもしれませんが、初心者には返って複雑でしょう。)なお、Visual Studio をインストールしただけではVisual C++はインストールされてないので、事前にVisual Studio の設定画面などから Visual C++ をインストールする必要があります。 Windows95の発売されたころにマイクロソフトが開発していたプログラム言語がVisual C++ですので、これからWin32APIを学ぶならVisual C++ を使うのが一番、マニュアルなども入手しやすくて初心者むけでしょう。 一般の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 ランタイムがユーザーに必要になります。(プログラマだけでなく、そのアプリを使う人にもまた、専用のランタイムが必要になる。)

DirectX

DirectX は、主に、Windows用の画像関係のランタイムやライブラリのうち、3D-CGの計算や、GPUなどマルチメディア関係デバイスの制御などの、高度な機能が、まとめられています。 初心者は、当面は DirectX のプログラムを書く必要は、無いでしょう。 ですが、Windowsでアプリを作る際に、知識としてDirectX について、いろいろと知っておく必要があります。 なぜなら、現在の Windows では、実はウィンドウは3D-CGとして処理しています。(アナタが今見ているwebブラウザのウィンドウも、マイクロソフト社の公式の仕様上ではDirectX が起動しており、ウィンドウを 3D-CG として処理して、ディスプレイにウィンドウ表示しているハズです。) ユーザーにはDirectX の名前が表示されてないだけで、実はWindowsの画像処理のいろいろな箇所で、 DirectX は動作しています。 現在のWinodwsの多くの機能は、DirectX をもとにグラフィック描画をしてる部分もあるからです。 .NET Framework で提供されているAPIのうちの画像関係のAPIには、Win32APIの画像APIでは提供されていない高機能なAPIもありますが、おそらく、Net Frameworkの画像関係のAPIは、おそらく背後で DirectX が動作しているものと思われます。 なお、よく、Windows向けのゲームで「DirectXランタイムが必要です」などと説明書などで記載されているので、てっきりDirectX をゲーム専用に追加インストールする必要のある追加機能だと誤解しがちだが、実はのWindows7以降(win7自身も含む)ではゲームとは無関係に既にWindowsのインストール時点で DirectX は Windowsに標準インストールされています。 Windows95くらいの過去のバージョンではDirectX は購入時点ではWindows製品には付属しておらず追加インストールしないと使えなかった時代もありました。しかし、現時点のWindows7以降(7も含む)のバージョンでは、DirectX はWindowsの購入時点で付属しており、Windowsのインストールと一緒にDirectX もインストールされています。 Win 32 API でのプログラミングを行っていくと、何かと機能的に不完全なところがあります。 そのような機能不足でも、Win32 APIを使って改善するプログラムが作れればよいのですが、しかし、そうとは限りません。GPUなど画像関係ハードウェアの制御などは、Win32APIではサポートされていない場合もあります。 世間一般のソースが非公開にされているアプリでは、もしかしたら、ゲームソフトでなくてもDirectXを動作させるコードを書いているアプリケーションもあるかもしれません。 マイクロソフト社がソース非公開のため、Windows内部でのグラフィック描画機能にWin32APIとDirectXとをどう使いわけているかも非公開であり、詳細は不明です。 世間では歴史的経緯から、「WindowsのGUI描画はWin32APIをベースにしており、例外としてDirectXでプログラムされたGUIアプリを動作させる時だけDirectXを使ってる」という解釈が通説ですが、しかし、実はそのような保証は無いのです。 もしかしたら、もはやDirectXがWinodws内部のGUI描画でベースのシステムになっている可能性もあります。ひょっとしたら、近年のWindowsでは(GUIのコードの原則はDirectXとして)、Win32APIのコードのほうが例外的に処理されている可能性もあります。 少なくとも明確な事実として、マイクロソフト社は、最新の画像技術のサポートなどは、Win32APIではなくDirectXを通してサポートを提供しています。 このため、もしかしたら将来的には、マイクロソフト社によるGUI技術のサポートは、Win32APIではなくDirectXを優先する可能性もありえます。

マルチメディアの扱い方 

スクリーンをある時点で固定すると、画像とみなせる。画像ファイルはバイナリファイルである。その証左として、適当な画像を開いてもテキストとして読み取ることはできない。画像の種類ごとにフォーマットと呼ばれる、情報の種類や出現順序が規定されている。C言語でバイナリファイルを入出力する能力が必要になります。よって、かなり乱暴であるが、画像に描画することができれば、スクリーンに描画することもできる。実際には、さらにこのほか、雑多な知識が必要になります。実際は、各OSのAPIやアプリ、外部ライブラリなどで入出力することができるので、自分で実装する必要はない。画像編集ソフトのの核心は、フォーマットに従ったバイナリを出力することにある。フォーマットに従っているということは、画像ファイルに限らず、音声や動画などでも同様。

関連項目

脚注

  1. ^ w:3値論理など、特殊なアーキテクチャを採用しているコンピューターを除く
  2. ^ 実は多くのワープロソフトではテキストファイルを保存する方法が用意されており、それで保存すればプログラミングもできないこともありません。ただしワープロソフトはプログラミングを意図した設計になっていないので、ワープロソフトでやるメリットはほとんどありません。
  3. ^ OSごとに使われるレジスタなどが異なる
  4. ^ 注釈: Quick BASIC というBASIC実行ソフトがあり、これが、コンパイルすることによって実行速度を速めた改良型のBASICでした。