こんにちは、ナイトレイインターン生の保科です。
Wantedlyをご覧の方に、ナイトレイのエンジニアがどのようなことをしているか知っていただきたく、Qiitaに公開している記事をストーリーに載せています。
今回はエンジニア船津さんの記事です。
少しでも私たちに興味を持ってくれた方は下に表示される募集記事もご覧ください↓↓
5/ 4はスター・ウォーズの日
5/ 4はスター・ウォーズの日。
公式ページによると、この日は「映画『スター・ウォーズ』の世界中のファンがスター・ウォーズの文化を祝い、映画を楽しむ日」だそうです。
由来は、作中の有名なセリフ ” May the Force be with you ”(フォースと共にあらんことを。)の “May the Force” と “May the 4th” をかけた語呂合わせから来ています。
スター・ウォーズの英語
まもなく、そんな晴れの日を迎える映画『スター・ウォーズ』シリーズ。実は、英語版でしか分からない、とある 「仕掛け」があることをご存知でしたか?
英語版『スター・ウォーズ』では、英語の訛りによって、人種や出身惑星を区別しているのだそう。例えば、銀河を支配しようと企む「帝国軍」はイギリス英語、対して「反乱軍」にはアメリカ英語を喋らせることで、敵対関係を明確にしています。セキュラ将軍の種族であるトゥワイレックはフランス訛り、共和国の兵士クローントルーパーたちはニュージーランド訛り、そして共和国の敵であり、お金に貪欲なくせに臆病者のニモーディアンは日本語訛り…。
そんな、多様な英語を使い分けている英語版『スター・ウォーズ』ですが、一人だけ、「訛り」では収まりきらない奇妙な英語を喋る人物がいます。それが、かのグランドマスターことマスター・ヨーダ。彼の英語は、補語(C)や目的語(O)を先頭に持ってきた、おかしな文法になっています。例えば、こんな感じ。
- The Greatest Teacher, Failure is. (「失敗こそ、最高の教師じゃぞ。」)
- Not if anything to say about it I have.(パルパティーンの「今日でジェダイは死に絶える」に対して「さてどうかのう。それを決めつけるのはまだ早い」
1つ目は、 “Failure is the greatest teacher” という正規の文法から、主語と目的語を入れ替えています。2つ目は、正しくは、 “Not if I have anything to say about it” と言う強調構文になります(と、隣の席のデンマーク国籍のエンジニアが教えてくれました)。
参考サイト:https://millennium-padawan.com/language
ヨーダ記法(ヨーダ条件式)とは
さて、本題です。
マスター・ヨーダのおかしな英語、実はプログラミング用語になっているのです!その名も「ヨーダ記法」あるいは「ヨーダ条件式」。筆者は、定番のプログラミング入門書「リーダブルコード」を読んでいる中で、この記法に出会いました。
このヨーダ記法は、プログラミングでよくあるミスを防ぐために生まれた記法です。
初学者のころ、最初に勉強するものの一つに「演算子」があります。代表格が「==(イコール2つ)」。「左と右は同じ値ですか?」と、比較する演算子です。しかし、私たちが昔から馴染みのある「等しい」記号は「=(イコール1つ)」。単体の=記号で事足りてしまうと言う感覚が染み付いていることは珍しくないはず…。そんな状態で、「もし、 i が10であれば、~~する。」というif文を書くと、以下のようなミスが発生する可能性があります。
正:
if (i == 10){~~}
誤:
if(i = 10){~~}
「誤」のコードのように、「=(イコール1つ)」の式を書いてしまうと、i に 10を代入してしまいます。通常、if 文の中で変数に値を代入するのは不自然ですが、コンピュータ的に見ると「もし、i に 10を代入することに成功したら、~~する。」と言う条件式としてコンパイルが成功してしまうため、間違いに気づけません。
そこで登場するのが、ヨーダ記法です。
ヨーダ記法で、先ほどの正誤の式を書いてみましょう。
正:
if (10 == i){~~}
誤:
if (10 = i){~~}
「正」の式は、通常通りにコンパイルが成功します。10 と i が等価であることを比較することには、何も問題がないからです。しかし、「誤」の式はエラーがでます。なぜなら、10 に i を代入することは不可能だからです。
このように、条件式で変数と値の位置を入れ替えることによって、思わぬミスを防ぐために生まれたのが、ヨーダ記法です。
今はもう使われない…?
そんな、偉大なジェダイマスターの名を冠したヨーダ記法ですが、実は現在はほとんど使われないそう。理由は大きく2つあります。1つは、「コードの流れが不自然になる」こと。確かに、直感的には、わかりにくいですよね。2つ目は、「コンパイラが警告を出してくれる」こと。そもそも、条件部分で代入できる言語には限りがある(C,C++など)ようですが、これらの言語も、条件式の条件部分で代入すると、警告を出してくれるそう。それなら、わざわざ直感的に読みにくい書き方をせずに、コンパイラの力に任せてコーディングしても、問題なさそうです。
最後に
2024年にエンジニアになった私にとって、プログラミング言語はすでにさまざまな便利機能を備えたもので、他にもたくさんの便利ツールを使えるのが当たり前。エディターは自動でコードフォーマットを手伝ってくれるし、GPTは命令すればほとんど使える正しいコードを書いてくれます。しかし、その技術進化の歴史には、先人たちの様々な苦労や工夫があったことを垣間みれました。時代の先端にいるからこそ、享受できるたくさんの恩恵(便利ツール)のありがたみを知れたので、使いこなせるよう頑張っていきたい所存です。
May the Force be with all engineers!