この記事は、シンボル からの続編です。
この記事は、絵でわかる プログラムとは何か(6)~シンボル~ の一記事です。
この記事のポイント
- シンボルではなく、そのまま書かれているテキストデータをリテラルと言う。
- リテラルには、数値をそのまま使う数値リテラルや、””で挟んで使う文字列リテラルなどがある。
- 数値リテラルは、マジックナンバーになりやすいので、シンボル化が推奨される。
- 「値」を表現する字句列を、式と言う。
- 「処理」の単位を表す字句列を、ステートメントと言う。
- 複数のステートメントを束ねたものをブロックと言う。
リテラル(literal)
literal は「文字どおり」という意味です。ソースコード中に、シンボルではなくそのまま書かれてデータとして扱われるテキストデータをリテラルと言います。
アセンブリ言語などの低級言語で使われた即値(immediate)の、高級言語版とも言えます。
プログラミングでは、リテラルの冗長を避けるため、シンボルが多用されます。そしてシンボルがまた別のシンボルを指し、さらにそのシンボルもまた別のシンボルを指し…と、シンボルの連鎖が続いていく場合もあります。その場合でも、シンボルをたどって行き着く終点には、リテラルが必要です。
文字列リテラル
文字列リテラルでは、識別子と区別するために、リテラルの先頭と最後に、
シングルクォーテーション(’)・・・引用符とも言う
または、
ダブルクォーテーション(”)・・・二重引用符とも言う
を使ってくくるやり方が、多くのプログラミング言語で使われています。
クォーテーション(quotation)とは、「引用」という意味です。日本語で使うカギかっこ「」のようなイメージです。
文字列リテラルの具体例
- “Hello!”
- ‘string’
- ‘日本語も使えます。’
複数行文字列リテラル
HTMLの「<pre>整形済みテキスト</pre>」、JavaScriptの「`(バッククォート)テンプレート文字列`」、C#の「@”逐語的文字列リテラル”」など、複数行を記述通りに表示するリテラルが、多くの言語に用意されています。
数値リテラル
数値リテラルは、単純に数値を記述するだけです。
通常は10進数ですが、何進数かを明示する場合には、数値の先頭に 0b, 0x などを付けます。
進数 | 先頭 | 例:「百」の表記 |
---|---|---|
2進数(Binary) | 0b | 0b1100100 |
10進数(Decimal) | 0d | 0d100 |
16進数(heXadecimal) | 0x | 0x64 |
マジックナンバーは避ける
プログラミングでは、数値リテラルの多用は、マジックナンバーと言って、あまり推奨されません。
マジックナンバー(magic number)は、直訳すると「魔法の数字」なので、とても便利そうに聞こえますが、プログラミングでは「今はなぜかうまくいっているけど、得体のしれない、下手に触れない数字」というニュアンスの言葉です。
何度も同じ数値を使う場合、あるいは何を表す数値かがわかりにくい場合は、リテラルよりシンボルの使用が推奨されます。シンボルであれば、何を表す数値かを明確にできるからです。
例えば、86400 、8760 と数値リテラルで書かれていても、それぞれ何を表しているのかわかりませんが、dayToSecond とシンボルで書かれていたら、1日の秒数だとわかりますし、 yearToHour とシンボルで書かれていたら、1年の時間数だとわかります。
その他のリテラル
この他にも、数値リテラル、配列リテラル、関数リテラル、オブジェクトリテラルなど、各データ型に対応したリテラルがあり、各言語処理系で書式が決められています。
式(expression)
リテラルはさらに、リテラルの中にリテラルとリテラル以外のものを含む場合もあります。
逆に言えば、単独のリテラル以外にも、
- 同種の複数のリテラル ・・・ 例:”abc” と “ABC”
- 種類の異なるリテラル ・・・ 例:”abc” と 123
- シンボル ・・・ 例:a
- リテラル以外のもの ・・・ 例:+, ? ※ 演算子や記号は単なるデータではなく命令として扱われる
が連なって一つのグループを作り、それがリテラルになる場合もあるということです。
単純なシンボル以外のデータは、みなリテラルであるとも言えます。
ただしリテラルという言葉は、最終的に一つのデータとして扱われる単位を指しますので、リテラルの中にリテラルがあるという表現は、あまり適切ではありません。
この場合の正しい表現としては、リテラルではなく式(expression)になります。
式は「値」を表現する字句列
expression という英語は元々「表現」という意味です。
式は、何らかの値を表現する字句(token)列を意味します。
値を意味するので、数学やExcelの数式(formula)と違って、通常、= (代入演算子) は含めません。
式の例
式(expression) | 値(value) |
---|---|
1 + 2 | 3 |
“abc” + “ABC” | abcABC |
a – b | a – b の演算結果 |
a * 2 | a × 2 の演算結果 |
a == b | aとbの中身が同じならTRUE、違えばFALSE (== は左辺と右辺が等しいかを比較する演算子で、代入演算子 = とは別物) |
1 < 2 | TRUE |
a <1 & 2 <a | FALSE (& はその前後の式が両方ともTRUEかをチェックする演算子) |
ステートメント(statement)
ソースコード内の一処理(action)を表す一文のことをステートメント(statement)と言います。
statement は日本語訳で「文」と訳されることもありますが、正しくとらえにくいからか、プログラミング用語としては「ステートメント」とカタカナで言われることが多くなっています。
むしろ「式」も、「エクスプレッション」とカタカナでプログラミング用語であることを明示した方が良いと思いますが、こちらはなぜか「エクスプレッション」という語はほとんど使われておらず、「式」という言い方が一般的です。
多くの言語では、日本語の句点「。」や、英語のピリオド「.」のように、文末記号「 ; 」で区切られた範囲を1つのステートメントとみなします。他には、改行で区切られた範囲を1つのステートメントとみなす言語などもあります。
当然ですが、ステートメントの一部に式が使われることも、よくあります。
ただし式単体では、必ずしも処理が完結していないため、ステートメントになるとは限りません。
確かに “a – b” という式でプロセッサでの処理の一部は意味しますが、「その値(アウトプット)をどうする」というところまで書いて初めてステートメントとしての処理は完結するのです。
“c =” で値を c に代入する、print 命令で画面に表示するなど「その値(アウトプット)をどうする」まで書いた形がステートメントになります。
反対に、ステートメントは、式になり得ます。
ステートメントの処理結果(成功/失敗)を値として取れたり、ステートメント冒頭に return キーワードを付けることで処理後の値を取れたりするからです。
後述するブロックを使って、複数ステートメントを一つの式にまとめることも頻繁に行われます。
ステートメントは「処理」の字句列
1ステートメントで1つの「処理(action)」を表すという考え方は、マシンコードが、処理の指示であるオペコードと、その処理の対象であるオペランドを、1セット(1ステートメント)としているところから始まります。
アセンブリ言語でも、ニーモニックとオペランドの1セット(1ステートメント)で一行ずつになるように改行しています。
高級プログラミング言語も、マシンコードやアセンブリ言語に翻訳しやすくすることを意識して、基本的に一つの「処理単位」を、1ステートメントで表します。
実際には、高級プログラミング言語の1ステートメントは、しばしばマシンコードでの複数ステートメントに対応します。
また、宣言は、処理ではないため、ステートメントに含めないとする考え方もあります。
ステートメントの例
ステートメント(statement) | 処理(action) |
---|---|
c = a + b ; | c に a + b を代入 |
print(c) ; | c を印字 |
open(file, R) ; | file を R モードでオープン |
ブロック
プログラミングでは、複数のステートメントをひとまとめにしたい場合に、ブロックとしてまとめます。
多くの場合、{} やキーワードでくくられた中身、あるいは同じインデントレベルの範囲が、ひとまとまりのブロックになります。
特に、関数リテラルやオブジェクトリテラルなどの式では、記述に複数行が必要なことが多く、ブロックが使われます。
また、if 文や、for 文などの制御構文でも、ブロックが使われます。制御構文は、その構文全体で1つのステートメントとしてとらえられます。制御構文のように、ステートメントの中に、ブロックで束ねられた複数ステートメントがある場合を、複合ステートメント(compound statement)とも言います。
compound statement は、複文、複合文などと訳されることもありますが、元々は、入れ子になった文を表す「重文」に近い意味です。
この記事のまとめ
シンボルではなく、そのまま書かれているテキストデータをリテラルと言います。
リテラルには、数値をそのまま使う数値リテラルや、””でくくって使う文字列リテラルなどがあります。
数値リテラルは、マジックナンバーになりやすいので、シンボル化が推奨されます。
「値」を表現する字句列を、式と言います。
「処理」単位を表す字句列を、ステートメントと言います。
複数のステートメントを束ねたものをブロックと言います。
次は、データ構造 に進みましょう。
この記事は、絵でわかる プログラムとは何か(6)~シンボル~ の一記事です。
コンピューターのしくみ全体を理解したい場合は、以下の2コースがお勧めです。
日本全国 オンラインレッスン にも対応しています。
知りたいことだけ単発で聞きたい場合は、 オンラインサポート をご利用ください。