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

出典: フリー教科書『ウィキブックス(Wikibooks)』
削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎変数: {{コラム|静的型付け言語と動的型付け言語}}
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
253 行 253 行
0.1<sub>10</sub> = 0.000110011001100…<sub>2</sub>)。
0.1<sub>10</sub> = 0.000110011001100…<sub>2</sub>)。
{{See also|[[W:桁落ち|桁落ち]]}}
{{See also|[[W:桁落ち|桁落ち]]}}

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

=== GNU/Linux/*BSD ===
であれば、GNU/Linuxはどうだろうか。結論からすると可能だ。wikibooksの[[GTKプログラミング]]や[[GNOMEフレームワーク]]を参照されたい。*BSDについてもデスクトップ環境を用意しているものであれば、表示できる。

=== ChromeBook ===
ブラウザをベースとしたOSなのでHTML/CS/JSで作ることが多い、ただし、ネイティブアプリに関しては、AndroidStudioで制作可能である。AndroidやVulkan等のAPIが利用できる。

=== Windows ===
==== 概要  ====
<!-- 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 ====
Win32 APIを使うには、初心者には、Visual C++ で「Windowsデスクトップアプリケーション」というのを選ぶしかないでしょう。(もしかしたらC#などでも出来るかもしれませんが、初心者にはかえって複雑でしょう。)なお、Visual Studio をインストールしただけではVisual C++はインストールされてないので、事前にVisual Studio の設定画面などから Visual C++ をインストールする必要があります。
Windows95の発売されたころにマイクロソフトが開発していたプログラム言語がVisual C++ですので、これからWin32 APIを学ぶならVisual C++ を使うのが一番、マニュアルなども入手しやすくて初心者むけでしょう。
一般のVisual C++入門書でよく紹介される「CLR」では、よほどトリッキーなことをしないかぎり、機能が限定的であり、高度なアプリを作れません。
どれが「Windowsデスクトップアプリケーション」か選択画面では分かりづらいかもしれませんので、実際にそれっぽいのを選んでみて、選択決定後に表示されるソースファイルの20行目あたりに「int APIENTRY wWinMain(_In_ HINSTANCE hInstance,」というのがあれば、それが Win32 APIの開発環境です。
「wWinMain」は、[[C言語|標準C言語]]でのmain関数に相当します。WinMain 関数 は wWinMain と同じですが、コマンドライン引数は ANSI 文字列として渡され、Unicode バージョンが推奨されます<ref>{{Cite web
|url=https://docs.microsoft.com/ja-jp/windows/win32/learnwin32/winmain--the-application-entry-point
|title=WinMain: アプリケーション エントリ ポイント
|date=2021/09/14
|accessdate=2021/10/21
|publisher=Microsoft
}}</ref>。
Visual Studio で、アプリ作成時にダイアログで質問される、アプリの種類のうち、C#の冒頭のほうにある、.NET Framework 関連の開発環境では、じつは、高度なアプリを作るのには、あまり使えません。
そもそもC#に、Win32 API の開発環境がありません。Visual Studio でC言語系を使う場合、Win32 API を使うには、かならず C++ などの Win32 APIに対応した言語を選ぶ必要があります。
この理由は、おそらく歴史的な経緯により、まず、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及び Server 2008 R2以降(Windows7及び Server 2008 R2自身も含む)ではゲームとは無関係に既にWindowsのインストール時点で DirectX は Windowsに標準インストールされています<ref>{{Cite web
|title=最新版の DirectX をインストールする方法
|url=https://support.microsoft.com/ja-jp/topic/%E6%9C%80%E6%96%B0%E7%89%88%E3%81%AE-directx-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95-d1f5ffa5-dae2-246c-91b1-ee1e973ed8c2
|date=2020-11-17
|acdess=2021-10-16
}}</ref>。
Windows95くらいの過去のバージョンではDirectX は購入時点ではWindows製品には付属しておらず追加インストールしないと使えなかった時代もありました。しかし、現時点のWindows7以降(7も含む)のバージョンでは、DirectX はWindowsの購入時点で付属しており、Windowsのインストールと一緒にDirectX もインストールされています。
Win32 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やアプリ、外部ライブラリなどで入出力することができるので、自分で実装する必要はない。画像編集ソフトの核心は、フォーマットに従ったバイナリを出力することにある。フォーマットに従っているということは、画像ファイルに限らず、音声や動画などでも同様。


=== マック風、Android風のWindowsアプリ ===
世間には、たとえばデパートなどの店舗などにある据付モニターのOSなど業務用の用途において、UIの見た目が一見するとmacOS風やi-OS風、Andorid風のUIであっても、実はWindowsで造られているアプリは多い。よく店舗などの据付モニターにあるタッチパネル式の液晶モニターなどが、一般OSでは見慣れない独自UI画面を用いていたりする場合や、あるいは見た目がいかにもスマートフォン風の画面表示UIだったりする場合があるが、しかし店舗にもよるが実はこれは単にWindows上に日本メーカーの作った独自UIアプリケーションをキオスクモードに構成しているだけという場合もある<ref>{{Cite web
|title=Set up a single-app kiosk on Windows 10/11
|url=https://docs.microsoft.com/en-us/Windows/configuration/kiosk-single-app
|date=2021-09-24
|access=2021-10-16
}}</ref>。その理由に関しては、もしモバイル通信をするならAndroidで表示したほうが安上りかもしれないが、しかし単に据付モニターで画面表示するだけでモバイル通信しないのならばWindowsを用いたほうが技術者を調達しやすいし、また資料などもWinodwsのほうが豊富なのである。このように、UIの見た目に騙されたりしてはいけない。世間には、業務用アプリケーションでは、いかにもWindows以外のスマホ風の画面表示をしているWindowsアプリなども多く存在しているのである。一般の商業店舗レベルでは、決してTRON(トロン)などの組込みOSを使っているわけではないと思われる(ただし、製造業大手などの工場ライン中のモニターなどのUIについては別で、場合によってはTRONまたはその他の組込みOSの場合もある)。


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

2021年12月11日 (土) 10:55時点における版

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

概要

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

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

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

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

文字入力

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

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

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

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

テキストエディタ

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

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

  • Windows: メモ帳 (notepad.exe)
  • macOS: vi, emacs
  • GNU/Linux: nano

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

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

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

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

入力モード

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

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

print("おはよう")

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

拡張子

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

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

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

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

  • Windowsの場合: cmdまたはpowershell
  • macOS場合: /bin/tcsh
  • GNU/Linuxの場合: /bin/bash

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

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

実行、意味論の解釈

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

インタプリタ

  1. ソースコード(あるいはソースコードから変換した中間表現)を読み込み解釈しながら実行するプログラムのこと。
  2. ソースコードを翻訳する部分。

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

コンパイル

ソースコードを予めに機械語に翻訳し、機械語のファイルを実行するという方法もあります。プログラムのコードを機械語に変換することを、コンパイルと言います。コンパイルするためのソフトウェアのことをコンパイラといいます。コンパイルが必要な言語をまとめてコンパイル型言語と言うことがあります。また実行時コンパイラ(JIT; Just-In-Time Compiler)との対比で、事前コンパイラ(AOT;)と呼ばれます。

コンパイル型言語は

などがあります。

コンパイル型言語では、ソースコードが書かれたファイルと、実行ファイルとは、別のファイルです。 そのためソースコードを変更してもコンパイルしなければ変更が反映されません。 コンパイル型言語の実行ファイルは、機械語で書かれています。 コンパイル型言語のプログラムの実行では、機械語で書かれた実行ファイルをそのまま実行するので処理が高速です。 実行ファイルは、それぞれのハードウェアに合わせた機械語になっています[4]。 Windowsをターゲットにした実行ファイルをGNU/Linuxにコピーしても実行できません[5]。 実行ファイルから元々のソースコードを取り出すこと (デコンパイル) は一般に困難です。 機械語にはそのハードウェアたいする命令だけが書かれており、ソースコードは機械語には書かれていません。 機械語に変換された実行ファイルは、配布するプログラムのソースコードを秘密にすることが可能というメリットもあります。 プログラムのコードをコンパイルしたファイルを実行ファイルにまとめる前のファイルをオブジェクトファイル言います。 ソースコード → オブジェクトファイル → 実行ファイルという流れになります。

違いは?

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

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

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

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

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

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

両方できる言語

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

例外

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

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

現状

インターネットとの関係

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

レキシカル・アナライザ

ソースコードは通常の文字列ですが、文字列のママ構文解析を行うことは出来ないので、文字列からトークンを切りだします。 トークンを切り出すプログラムのことをレキシカル・アナライザあるいは構文解析器(こうぶんかいせきき)と呼びます。 トークンとは、プログラミング言語のキーワード・識別子・デリミターなどのこれ以上分解すると意味が変わってしまう構文単位で、自然言語学の語に近い概念です。

パーサ

レキシカル・アナライザの出力は、トークンの1次元配列(トークン列)でこれから直接機械語に変換する事はできません。 そこでトークン列をプログラミング言語の構文の何に当てはまるか解析して内部表現(構文木)に変換します。 このようなプログラムのことを、トークン列をを解析して解釈する機械という意味で、「構文解析器」(こうぶんかいしゃくき、パーサ parser)と言います。

字句解析と構文解析を別々に行うことが可能なプリグラミング言語もありますが、多くのプログラミング言語では(文法に曖昧さがあったり、字句に対し意味論が重複しているなどの理由で)字句解析と構文解析は連携するする必要があります。

文法

代入

注釈: 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になる。

静的型付け言語と動的型付け言語
プログラミング言語は、静的型付け言語と動的型付け言語に大別されます。両者の間で、代入や変数の意味論が異なるので明確に区別する必要があります。
静的型付け言語
具体例
Fortran, COBOL, C言語, C++, Java, Go, Rust
特徴
変数は型を持つ
代入は、変数と結びついた記憶領域への右辺値のコピー
動的型付け言語
具体例
LISP, JavaScript, Python, Ruby
特徴
変数に型はなく、変数に束縛された値(=オブジェクト, =インスタンス)が型を持つ
代入は、変数への値の束縛

BASICのような変数名に型情報を持った言語や、関数型言語の一部のように変数そのものを持たない言語もあります。

プログラミング言語の学習において、その言語のパラダイムにおける型システム・変数システム(オブジェクトシステム)の理解は初学時の重要な要素です。


実行順序

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

数値

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

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

過去の編集で、浮動小数点数による誤差ケタ落ちとしていましたが、桁落ちとは、丸め誤差を含む非常に近い大きさの小数同士で減算を行ったときに、有効数字が減る現象のことを言い有限の仮数部と指数部で表すことによる誤差とは違う概念です。また一般に浮動小数点数は2進数が採用されているので、十進数では有限桁数で表現できても浮動小数点数では循環小数になることがあります(例えば、 0.110 = 0.000110011001100…2)。

関連項目

脚注

  1. ^ フラッシュメモリーのMLC/TLCに代表されるw:多値論理など、特殊なアーキテクチャを採用しているコンピューターを除く
  2. ^ 実は多くのワープロソフトではテキストファイルを保存する方法が用意されており、それで保存すればプログラミングもできないこともありません。ただしワープロソフトはプログラミングを意図した設計になっていないので、ワープロソフトでやるメリットはほとんどありません。
  3. ^ インタープリタは実行時に「どの部分が多く実行されたか?」「分岐命令でどちらに多く分岐したか?」などの実行時統計情報を容易に手に入れることができ、これらに基づき実行時コンパイラ(JIT)による最適化が可能となりる。よって、一概にインタプリタ方式がコンパイル方式より実行速度が劣るとは言えない。
  4. ^ 異なるハードウェアの実行ファイルは、通常は仮想機械環境を使わない限り実行できません。
  5. ^ 同じハードウェアでも異なったOSで相互に実行ファイルが実行できない理由は、いくつかありますが、実行ファイルの形式の違いとOSの提供するシステムコールの違いが主なもので、この2つを克服したWine(GNU/LinuxでWindowsの実行ファイルを実行可能にする環境)やWSL(WindowsでGNU/Linuxの実行ファイルを実行可能にする環境)では異なったOSの実行ファイルの実行を実現しています。
  6. ^ 注釈: Quick BASIC というBASIC実行ソフトがあり、これが、コンパイルすることによって実行速度を速めた改良型のBASICでした。