プログラミング/共通知識

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

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

概要[編集]

プログラミングは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ファイル→機械語

プログラミング言語のなかには、インタプリタかコンパイラかの分類に当てはまらない言語もあります。例えば、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でした。