【第4話】当然のように数字の話をはじめないでください/連載『プログラマ夫と算数嫌いの妻が、プログラミングについて話してみたら』
はじめての方へ:本連載は、プログラミングについての知識がゼロで漠然と苦手意識しかない妻(筆者)が、プログラマ夫にインタビューしながら、なんとかプログラミングと少しでも仲良くなろうとがんばる雑談シリーズです。どうぞ肩の力を抜いて、夫婦の雑談をお楽しみください。
<全5話予定>
序章・目次
第1話:そもそもプログラミングってなんなのさ
第2話:お笑いと育児とプログラミング
第3話:日常生活にひそむプログラミング
第4話:当然のように数字の話をはじめないでください(←今回はここ!)
はじめに言っておくと、今回は大半が「細かすぎる話」になってます(笑)
■プログラマは「翻訳者」って言えるかもしれない
私:わたしさ、プログラマさんって画面に向かって何かを打ち込んでいるイメージしかなくて、「何をしている人」なのかよくわかってなかったんだけど。
これまでの話をまとめると、さっきの自動販売機の例みたいに、「こうしたら、こうする」みたいな段階的な指示を考えて、それを、機械にわかる言語に、翻訳する人、なのかな?
夫:そうだね、、もうちょっと正確にいうと、どんなふうに動作すべきかを考えるのは、違う職種の人だったり、クライアントだったりもする。まあ、業界とか分野で違うんだけど。
私:なるほど。じゃあ「求められる動作を」かな。「求められる動作を、機械にわかるように、翻訳するひと」。
夫:うん、そういうことやね。
私:おー。なんか今、すごいもやが晴れていってる気がする。“翻訳”かー。
夫:そりゃよかった。
私:「求められる動作を、機械にわかるように翻訳する」っていうと、文系としてはすごくわかる気がする(笑)。そうか、機械にわかることばに翻訳かあ!って。なるほどね、おもしろいね。
(このときのわたしは、まだ知らない。これから自分が混乱の渦に巻き込まれてゆくことを……)
■ でも「プログラミング言語」を、機械は直接読めない
夫:あ、あのね、でも……。ちょっと詳細すぎる話だから省いてもいいんだけど。
私:え、なに?
夫:「求められる動作を、プログラマが読める、プログラミング言語に翻訳する」っていうのがプログラマの仕事で、それ自体は実は、機械は読めない。
私:ええ?!読めないの?!?!(笑)
夫:読めないの。そのまんまじゃ(笑)。
私:なんで?!それがよく聞く「コード」とかっていうやつじゃないの?
※コード(ソースコード):
コンピュータプログラミング言語で書かれた、コンピュータプログラムである文字列のこと
夫:そう、CPUはその「コード」をもとに動いているわけじゃなくて。まずはそれを、CPUの動作に変換するための「コンパイラ」っていうプログラムがあって。
私:しーぴーゆー? こんぱいらー?
夫:プログラマは、コンパイラにわかる言語を書いてるの。
私:意味わからん! 図、描いて。
(描いてもらいました。夫直筆)
夫:このCPUっていうのは、コンピューターの脳みそみたいな感じね。プログラマは、プログラミング言語を使って指示を書く。コンパイラは、プログラミング言語を「機械語」に翻訳して、その機械語を、CPUが読んでる。
私:なるほど……。でもなんでその2段階をふむの? 機械語は超複雑ってこと?
夫:機械語をプログラマが書くのはつらいから。
私:そうなんだ。
夫:うん。
私:じゃあわたしたちからみると、それ自体がすでに大変そうな「コード」っていうものは、「プログラミング言語」で。「機械語」っていうのはもうその範疇をこえて、さらにややこしいものなんだ。
夫:そうそう。ややこしいっていうのと、あとCPUのバージョンやメーカーによって、機械語って違うのよ、細かく。だから、それを全部プログラマが覚えるっていうのは無理だし、動かす環境によって、書くことをかえるっていうのは、それもまたつらいわけですよ。
私:ふーん。「機械語」は複雑なうえにいろいろあるから覚えるのは無理だと。じゃあ「プログラミング言語」は「共通語」みたいなもんなの?
夫:そうそうそうそう。
私:へー。(「そう」ってめっちゃ言った……)
■ プログラムとコンパイラとCPUの関係――何言ってるかわからないから図解してください!
私:あとは、さっき出てきたコンパイラっていうのがまだぼんやりしてるんだけど。コンパイラっていうのは、たとえば家電……、冷蔵庫なら冷蔵庫に、そういうのが入ってるの?
夫:いや、冷蔵庫にはコンパイルされた機械語が入ってる。その冷蔵庫のCPUって決まってるから。そいつにだけわかればいいから、コンパイルされたものを入れればいい。
私:はあ? 日本語しゃべってる? じゃあコンパイラっていうのは、どこにいるの?
夫:いや、どこにいるっていうか、CPUのチップみたいに形のあるものじゃなくて、コンパイラは「ソフトウェア」だからね。
私:あ、ソフトなの? 先に言ってよ。もうね、そういう、たぶん夫さんにとっての「前提」になってる部分が抜け落ちてるから、プログラムに必要なものたちの全体像がいまいちつかめないんだよね……。もっかい図を描いて!
夫:要求がよくわからないんだけど。
私:……(これこそがプログラマ的相づちよ……)。なんだろうねえ……あの、新しいことばがたくさん出てきたから、何がどこまでどこにあって、相互にどういう役割をしてとか、その「全体像」がね、未知なんです。
(↓がんばって描いてもらいました。掃除機、意外とうまいな?)
私:ああ!これ見てようやくなんかちょっとわかったぞ。はいはい、プログラミング言語は、機械側は直接は読めない。だからプログラミング言語を、コンパイラってソフトが機械語に翻訳してから、機械に入れる。ふんふん。
夫:だから、さっき言ってた「プログラミング言語は共通語」っていうのはさ。いろんなCPUに対して、翻訳できるコンパイラがあると、プログラミング言語は共通語になる。
私:うーん?
夫:プログラミング言語とCPUの組み合わせによっては、そこを橋渡しするコンパイラが存在しないこともある。っていうのは、共通語だととらえるうえでの注意かな。英語が通じない国があるのと一緒で。
私:ふむ。基本的には英語みたいに、共通語的なポジションなんだけど、なかにはうまく翻訳できないこともあると。
「組み合わせ」ってことは、プログラミング言語っていうのもひとつじゃなくて、いろんな言語があるんだね。そしてCPUっていうのもいろんな種類があるから、その組み合わせによっては間をつなぐ翻訳家がいないこともある、みたいな。
夫:そうそう。
(私:つ、つかれた……)
■「プログラマあるある」を、理解してみたいけど
私:ちょっと疲れてきたから、話題変えよう。なんかSNS見てるとさ、よくプログラマさんの面白話が流れてきたりするじゃないですか。「プログラマあるある」みたいな。ちょっとそれ、興味ある。プログラマさんの生態というか。いま思いつくのある?
(↑このときのわたしはまだ知らない。疲れたから変えたはずの話題のせいで、さらに疲弊してしまうことを……)
夫:「プログラマあるある」ねえ。あー、レシートのおつりの金額が255円とか256円だと「ぴったりだ!」って思うとか、そういう?
私:……。全然わかんないんだけど、一応聞いておこうか(笑)。
夫:プログラマは、255とか256とかを、「ちょうどいい」と感じるんですけど。なんでかっていうと、二進法の8桁で表せる最大の数が255までだから……。
私:待った待った。どっから出てきたよそれ。二進法とか、8桁とか。
夫:あー。じゃあさ、スマホの容量で「32GB」とか「64GB」があったり、コンピューターのハードディスクの容量が「128GB」とか、そういうのあるじゃん?
私:うん。それならよく目にする。
夫:そういう「32GB」とかっていうのはそのコンピューターの「記憶できる総量」なんだけど。で、その記憶できる領域が、二進法の8桁ごとで区切られているの。32も64も128も、2のべき乗(累乗)になってるんだけど。
私:区切られてる……?「何バイト」とかそういうやつ?
夫:そうそう。その二進数8桁が、1バイト。
私:はあ……?よくわかんない。
※質問攻めにしてなんとか理解して図を描きました(わたしが)
私:……いま聞いた話をまとめるとこうだよね(上図)。まず、データの容量とかでよく聞く「32GB(ギガバイト)」とかは、小さく見ると「byte(バイト)」が32ギガ個、連なってできている。
夫:うん。
私:で、その「バイト」は、例えるならトロッコみたいなイメージで、各トロッコの中に、それぞれ256種類(256通り)の荷物が入るよと。
夫:そうそう。「バイト」は、データの読み書きをするときの最小単位なの。データの読み書きっていうのはつまり、トロッコの荷物の乗せ降ろしだったり、入っているもののチェックだったりするんだけど。この「バイト」っていう単位でしか、線路を走れない、っていうイメージ。
私:ふむ。「区切られてる」ってのがなんとなくわかった。データをちゃんとトロッコにのせて区切らないと、処理できないのね。
夫:そうそう。
私:で、「バイト」の中に入るのが、二進法8桁分、っていう荷物だと。
夫:そう。で、二進法で8桁あれば、256通りの数があらわせる。ゼロも含めるとね。だから、255とか256は、プログラマにとってとても馴染みが深い数字なわけですよ。
私:……(翻訳者とかいうから油断してたら、結局、数字ネタが鉄板なんじゃないすか……)。ごめん、ちょっと消耗エネルギー半端ないから、いったんお茶のんで仕切り直すわ。
夫:???
■ 当然のように数字の話をはじめないでください
私:あのさ。いま「256円のおつりピッタリあるある」な話を聞いたことで、すごく、私としては唐突感がすごかったんですが。
夫:ん?
私:だってさ、さっきまではプログラマさんは翻訳者ともいえる、みたいな文系脳にも親しみやすい話だったわけじゃん。
そこからいきなり数字が出てきて、二進法とか出てきたから、「え、なんでそこいきなり計算来た?」ってさ、からだが勝手に拒絶反応を……(笑)。なんというか前提として、プログラミングにおける計算の役割とはっていうか、計算の位置づけを知りたい。
夫:???
私:えーと。たとえば前に話してた、「お金を入れると電気がつく!」とかそういう話はさ、言葉で聞いているときは、なるほどなるほど、って聞いてるんだけど。突然「二進法が」とか「数字が」とか言われると、そこのステップがつながってなくて。何? プログラミング言語っていうのは、数字なの?
夫:なるほどなるほど。言葉で抽象的に話していたことを、プログラミング言語に落とし込むにあたって、そこに計算という言葉はあるのか、あるならどのようにあるのか、なのかな。
私:うん、そういうこと……かなあ?
夫:うーんと。いわゆる算数・数学、算術的な意味での計算っていうのは、扱わないこともある。プログラマは、計算をしない。
私:そうなの?
夫:いや、っていうと大げさなんだけど。プログラミングと計算が結びつきやすいっていうのは、CPUが計算機だからであって。
私:???
夫:……っていうのはわかるかな?
私:わかんないよ! CPUは、計算機なの?
夫:計算機なんですよ。しかも一般的に“計算機”って聞いてイメージする「電卓」よりももっと単純なことしかしない。加減乗除程度のレベルの単純なことしかできなくて、それらの連結で、いろんなことを表現していくわけですよ。
私:うーん。CPUが計算機だってことはわかったけど、でもやっぱりまだいまいちつながらなくて。なんで計算が、例えば自動水栓を開けたり、エレベーターを動かしたりするのか、そこのつながりが。
夫:はいはいはい。たとえば自動水栓の話だと、最終的には「蛇口をひねる」モーターを回す部分が必要なわけじゃん、機械でやるなら。で、そのモーターを回す力は、「電圧」でコントロールするんだけど。
私:ふんふん。
夫:その電圧を、コンピューターで扱うときに、デジタル数字で扱うわけですよ。
私:電圧の大きさを、数字で、出力しなくちゃいけないってこと?
夫:そうそう。でもその「数字」っていうのも、人間が理解しやすい形であって、コンピューター的にはただの、等間隔に区切られた電圧の増減でしかないけど。
私:……(トウカンカクニクギラレタ、デンアツノゾウゲン??)。
夫:わかるかい?
私:わかんない(即答)。例えばわかりやすく言うと「この場合は電圧を3出してください」とかそういう計算結果が出て機械が動く、って話ではないの?
夫:あー、そうそう。ただその、コンピューターにとってはその「3」っていう数字は、べつに3っていう概念にはなってなくてよくて、ただ「その電圧」っていうだけなのよ。
私:はああああ???
(↓つづきます。次は「すっきり」するはずなので、逃げないで笑)
■ そもそもなぜ「二進法」なんてものを使うのか
夫:まあいっか、そこは細かすぎるね。じゃあ、例えば仮にその「3」っていう電圧を表現したいとするじゃない? それをデジタル数字で表現するために、二進法を使うのね。
私:出たよ二進法!なんで当然のようにそれが出てくるのかも聞きたかったんだよ。
夫:二進法はね、「情報が、誤差なく正確に伝わるような伝達のしかた」 を考えた結果で、採用されている伝達方法なの。
私:わかりません!
夫:例えば「3」っていう数字が、電線を通って、向こう側にも「3」っていう形で復元されなければいけないとするじゃない?
私:うん。
夫:で、それをやるときに、一つの電線の電圧を、例えば10分割して、「3/10くらいの大きさ」だったら「3」ね、ってすると、途中でノイズがのったときに、「4」とか「2」とかで相手に読まれてしまうかもしれないじゃん。それを防ぐために、その1個の電圧では、「0」か「1」の2通りしか表さないようにしましょうと。
私:うーん、わかるような、わからないような。
夫:だからさ、「10分割」すると、1/10目盛の精度で読まなきゃいけないんだけど。けど、「2分割」でよければ、「真ん中の目盛より大きいかどうか」だけ読めばいいから。例えば真ん中よりかけ離れた値を送れば、あんまり読み違いが起きない。
私:あーー!なんか、わかったぞ。データを送るときに、誤差を、なくすためなのか!なんていうか、白か黒かはっきりしろってことね? グレーの目盛をなくすというか。こういうことでしょ?(描いてみた)
送信時にノイズが生じるため、目盛が多いと正確な情報がわからなくなる。「0」か「1」かの「2分割」でよければ、「真ん中の目盛より大きいかどうか」だけ読めばいいので、誤差が伝わりにくくなる。
夫:そうそう。2分割以上しておくと、これどこの目盛?ってなるから。
私:へー!そうなの?!コンピューターって。……そんな馬鹿なの?
夫:そんな馬鹿なの。
私:そうなの?(笑)。そうか、白黒はっきりしないとコンピューターはわからないのか……。
夫:わからない。まあそれを、3分割とか4分割にすることもできたんだけど、そうした場合に誤差が大きくて、あんまり使い物にならないってことが、過去に起こっていたんじゃないかなあと。
私:ふーん。だからコンピューターでは、誤差をなくすために二進法が使われているんだね。
夫:うん。で、もちろんプログラマは、「コンピューターの中で二進法を使っている」とか、「それはなぜ二進法なのか」とかは知らなくても、コーディングはできるんですよ。だけど、知っていると、有利なことがあるっていうくらいかな。あとは目にする機会も多いから、自然にそれが「あるあるネタ」になっていく。
私:いや、ようやく追いついたわ。ここまでの前提があってはじめて笑える「あるあるネタ」なわけだよ。前提が前提じゃないから、そのミゾを埋めるのってお互い大変ね(笑)。
■ 次回予告
【第5話】プログラミングは理系のもの、ではない
・「ど文系の算数嫌い」にプログラミングってできる?
・非エンジニアが、プログラマと仕事をするときに知っておいたほうがいいこと
・ 作者へのリスペクトってどの分野でも必要よね
・こんな私にも、プログラミングで何かが作れるの?
いや……、今回は心が折れそうになりましたね(わたしだけ?)。でも、苦手意識を持ちながらここまで読んだあなたはえらい、それだけでスーパーです。敵陣の分野のことをちょっとでも理解できると、なんか自分を褒めたくなりますよね、なりませんか(笑)。完走まで、あと一話……!
−−−−−
Please pay as you wish, ……Thanks :-D !!
もし、読めてよかった、コーヒー1杯くらいおごってやるか、という気分になった方がいらしたら、サポートやシェアなどで応援いただけるとたいへんうれしいです。っていうかみなさん、いつもあたたかい応援をありがとうございます。マラソンでもうしんどい無理、ってときに沿道で手をふったり水投げたりしてくれるひとのあたたかさが、染みてます……。じわ。
※本シリーズはこちらのマガジンにまとめています↓