t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

プログラミング用語はなぜ小難しいのか

プログラミングでは識別子・キーワード・文字列・演算子リテラルといった小難しい言葉が登場する。
意味は調べれば分かるが、なんでわざわざそんな小難しい言葉を使うんだろうか。

演算子は、計算記号って呼んじゃだめ?
文字列は、単語って呼んじゃだめ?
識別子は、名前って呼んじゃだめ?
リテラルは、値って呼んじゃだめ?

とまぁ、目にするたびにモヤっとしつつもプログラミングしているうちになんとなく慣れてしまった方もいるのではないかと思う。

この記事では、そういった小難しい言葉を使う理由に一応の説明をつけ、これらの言葉の正確な意味を掘り下げて紹介してみる。

なぜ小難しい言葉を使うのか

所説あるが~…などとうそぶいても仕方がないので正直に言うけれど、正確な理由は私も知らない。だからこれは巷の説ではなくて、あくまで私個人の考えである。「一応の説明」と言ったのはそういうことなので、あくまで参考にとどめてほしい。

まず考えられるのは、アメリカから入ってきたプログラミングの用語をそのまま和訳した為というもの。
Operator(オペレーター)が演算子、Identifier(アイデンティファイア)が識別子という風に。

それならKeyword(キーワード)を主要語・Literal(リテラル)を直値などと訳すこともできたはずだけれど、これが文章に登場する場合、「主要語」とか「直値」などと書かれているとややこしい。それがプログラミング用語としての「主要語」なのか、一般的な意味での主要な語なのか紛らわしい。

そして結果的に現在の用語に落ち着いているのは、結局プログラミング用語として特定の要素を指す名前として都合がいいからだと思う。

正確さ・厳密さを要求されるプログラミングでは、その解説においても正確さ・厳密さが必要とされる。だから一般用語とは異なる、誤解の余地のない言葉を選定する必要があった。といったところではないかと思う。

それぞれの言葉の意味

実はプログラミング言語によって微妙に指すものが違ってくる。たとえば演算子(+, -, *, / など)はVBAにおいては識別子ではないが、とある言語では演算子も識別子の一種として扱われることがある。
そこで、説明の食い違いを避けるため、この先の解説はVBA言語を前提とする。

識別子(しきべつし)

識別子とは、変数名・プロシージャ名・関数名・オブジェクト名などを指す名前のこと。その名の通り、モノを識別するための道具。個別にいうと「〇〇名」なのに、それらの総称が「名前」ではなく「識別子」なのは、そう言ったほうが厳密性が高まるからだと思う。例えばFor文やIf文にも"For"・"If"という名前がついているが、これらは後述する「キーワード」と呼ばれるものであって、識別子ではない。

とはいえ、プログラマー同士の会話でも普段は単に「名前」と呼ばれることが多く、識別子という単語が登場するのは主に解説書、言語のヘルプ、エラーメッセージなど、厳密性が問題になる場面が多いように思う。文章中に出てくる分には自然だが、普段の会話で得意げに「識別子」を連呼すると、最近覚えたの?(笑)となるので注意。

識別子の「子」はOperatorの-orに相当する接尾辞で、動詞を名詞化する意味がある。「〇〇子」とあれば、〇〇するモノ、〇〇を司るモノ、〇〇するための道具といった理解で合ってると思う。

識別子には英数字、漢字、ひらがな、カタカナ、アンダーバーが使える。
ただし1文字目を数字やアンダーバーで始めることはできない。後述するキーワードと同じ名前を付けることもできない。
また、あまり知られていない(もとい、知らなくてよい)けれど、一部の全角特殊記号も使える。

Sub()= 10= 20=*MsgBoxEnd Sub

同じスコープで、同一の識別子を複数回定義することはできない。
逆に言えば、スコープが異なれば同一の識別子名を付けることができる。

あまり知られていない(もとい、知らなくてよい)けれど、VBAの関数はVBAモジュールに存在するただの識別子なので、同じ名前で標準モジュール等に再定義することができる。本家を呼び出すにはモジュール名のVBAを付けて、「VBA.関数」の形で呼ぶ。

Function Now()
    Now = Format(VBA.Now, "ggge年m月d日(aaa曜日)")
End Function

Sub Main()
    MsgBox Now    '再定義されたNowが呼び出される。
    MsgBox VBA.Now '本家VBAのNowが呼び出される。
End Sub

まあそういうことは、しないように。

キーワード

キーワードはFor・If・Subなど、VBAの文法の根幹をなす重要な命令群で、VBエディタで濃い青で表示されるものだ。
VBの解説書ではキーワードという語が用いられるが、一般用語としても広まっているのでプログラマーが口にする場合は「予約語」というケースが多い。名前の通りめ、束されているので、識別子と違って再定義したりできない。

文字列(もじれつ)

VBAで文字列は、その名前のとおり、文字が並んだもの。VBAでコード中に文字列を書く場合は、ダブルクォーテーションで囲む。
"こんにちは"も文字列だし、"-----"も文字列だ。1 + 1 は計算式であるが、"1 + 1"は文字列になる。
これらを総称して何と呼ぼうか。単語でも文でもない。つまり文字列としか呼びようがない。

文字と文字列を区別する言語では、文字はシングルクォーテーション、文字列はダブルクォーテーションで囲むルールが多い。
文字列型を持たないC言語では文字型の配列で文字列を現した。

VBAの文字列も実はByte型の配列と互換性があり、内部では文字の配列として管理されていると思われる。つまり文字の配列だから文字列という解釈もできる。

演算子(えんざんし)

そもそも演算という言葉が難しい。日常的には計算という。
計算の「計」は小計・合計の計と同じで、答えを求めることを主眼に置いた言い方。
演算の「演」は演じるの演で、計算の過程そのものに主眼を置いた言い方。

1 + 1 + 1を計算すると、まず1 + 1を演算して2、2 + 1を演算して3、よって計算結果は3という使い分けだろうか。

論理演算子のAndやOr、文字列を結合する&も演算子に含まれる。

演算子の大半は二項演算子といって、(1 + 1)のように演算子の左右に値をとるタイプであるが、論理演算子のNotは1つしか項を取らない単項演算子である。
三項演算子を持つ言語もあるが、VBAには無い。無いけれど一応以下に解説しておく。

例えばCheckBox1がチェックされていたら"Yes"、そうでなければ"No"を表示させたい場合を例に挙げると、三項演算子「?:」を使ってこのように書く。まぁVBAには無いので、書けないけど。

MsgBox CheckBox1.Checked ? "Yes" : "No"

代わりにVBAでは同等の機能が関数として用意されている。別言語から来た方はこれを三項演算子と呼ぶ方がいるけれど、VBAの場合これは演算子ではなく、ただの関数なので間違い。

MsgBox IIf(CheckBox1.Checked, "Yes", "No")

ちなみにC言語等で「?:」を指して三項演算子と呼ぶのは、たまたま三つの項を取る演算子が「?:」しか存在しないためであり、本来「?:」の固有名詞としては条件演算子という呼称が正しい。

リテラル

リテラルはプログラミングコード中に直接現れる値のこと。
たとえばa = 100と書いたときの100、msg = "Hello"と書いたときの"Hello"がリテラル
MsgBox a、MsgBox msgなど、変数として扱われるものはリテラルではない。

VBAリテラルは、数値・文字列・日付や時刻・論理値(TrueとFalse)がある。
数値リテラルと論理値リテラルは特に何も囲わずそのまま記述される。1や5.5、True、Falseなど。
文字列リテラルはダブルクォーテーションで囲まれる。"Hello"など。

日付や時刻はナンバーサインで囲まれる。
これはあまり知られてないので念のため解説すると、以下のような形式である。
#月/日/年#、#時:分:秒 AM・PM#
例) #2/26/2018#、#2:10:00 AM#

以上

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。