WirelessWire News The Technology and Ecosystem of the IoT.

by Category

プログラマーは言語を使い分ける

2014.03.24

Updated by Ryo Shimizu on March 24, 2014, 20:27 pm UTC

1001495_10152429389870752_682968497_n.jpg

 私はあらゆる日本人が世界に向かって胸を張れる才能がひとつだけあると思っています。
 それは味覚です。

 日本人ほど多様で研ぎすまされた味覚を持つ民族はいないのではないかと思います。

 ではなぜ、日本人にその能力が伴っているのでしょうか。その秘密は日本語にあると考えています。
 たとえば英語で、味覚を表現する単語をいくつ挙げられるでしょうか。hot, cold, sour,sweet,spicy,smoky,bitter,salty,oily、色々挙げることができますが、50種類はないのではないかと思います。

 ところが日本語には、甘い、辛い、温かい、冷たい、脂っこい、はもちろんのこと、しょっぱい、塩辛い、甘酸っぱい、酸っぱい、甘辛い、香ばしい、などなど、無数の味覚表現があります。

 日本語が持っている豊かな味覚や情緒の表現力こそが、日本人の味覚を研ぎすませ、無限にも思える日本の料理文化、単に和食に限らず、ラーメンや牛丼、トンカツ、カレーライスといった独自の発達を遂げた多様な文化を成立させている遠因ではないかと思うのです。

 使用する言語の語彙や文法によって、別の言語ではかなりまわりくどい表現が必要になったり、正確な意味をなかなか伝えられなかったりします。

 これは外国語を日常的に使う習慣のある人にとっては肌感覚で解っていただけるのではないかと思います。
 
 
 これと同じように、コンピュータプログラミングの世界では、目的にあわせて使用する言語を変えるのです。
 今日はそんなお話をしたいと思います。
 

 英語を勉強する、というのは不思議なものです。
 というのも、先進国の中で日本ほど英語が普及していない国はないからです。
 そして同時に、日本人ほど熱心に英語を勉強しようという人もいないのです。それなのに、なぜか日本人は英語が苦手です。
 かくいう筆者もそうです。

 筆者は英語がそれほど得意ではありません。
 初めて社会人として働いたのは、アメリカの会社のアメリカの本社で、上司もアメリカ人でした。
 その後、シアトルで新しく会社を立ち上げ、上司同僚部下がみんなアメリカ人になりました。アメリカ人の友達も沢山できました。英語で講義やプレゼンをすることも何度もあります。が、それでも英語が得意であるとは思えないのです。

 というのも、自分の言いたいことを全て言えているとは到底思えないからです。
 また、相手の言ってることも100%解ってるとも到底思えません。ところどころ曖昧に聞こえたり、あやふやだったりする部分があり、そういうときは何度も聞き返してしまいます。

 このもどかしさがあるうちは、私が「英語を使いこなせている」と思えることはありませんし、ひょっとするとそんな日は永久に来ないのかもしれません。゜

 「ごめんよ、僕は英語がうまく話せないんだ」

 アメリカ人の友人にこんな弱音を吐くこともあります。
 すると彼らは決まってこう慰めてくれるのです。

 「何を言ってるんだ。僕は日本語を全く喋れないけど、君は英語が少しは喋れてる。友達にもなれるし仕事もできている。何を不満に思うことがあるんだ。少なくとも君は僕より凄いよ。それだけじゃない。プログラミング言語だって沢山使えるじゃないか。多少英語があやしいのは、君の個性だと思った方がいい」

 今回、シリコンバレーではとても重要なビジネスミーティングがありました。
 私はあまり意識せずにその場に向かったのですが、気がつくととても重要なビジネスミーティングだというのに、向かったのは私一人でした。普段なら、英語の得意な社員を連れて行くのですが、ポンと、一人で放り出された格好です。

 しかし、それに気がついたのは、ミーティングが終わった後でした。
 果たしてあれで大丈夫だったのか・・・。

 私は不安を覚えつつも、ミーティングの経過を社員に共有しました。
 すると、アメリカ人のスタッフから

 「先方の役員は大変感心していた。次のステップに進みたいという要請が来ている」

 と言われました。
 そんなことですら、現場に居た私は自分の肌感覚としていまいち持つことが出来ていないにも関わらず、です。

 一時期、英語を本格的に勉強しようかな、と思ったことがありました。
 今でもたまに思います。

 しかしなかなか実行に移していません。
 というのも、それがあまり意味のあることに思えないからです。

 人間の時間は有限であり、その限られた時間を何に使うのかというのはとても重要なことです。
 英語を学ぼうとすると、それは自然言語であり、無数のスラングと無数の歴史的言い回しが詰まっていて、とても一筋縄ではいきません。私はそういうオーガニックな言語を学ぶことが苦手なのです。

 これが不思議なことに、新しいプログラミング言語を学ぶことは、あまり苦になりません。

 いま、プログラミング言語と呼ばれる言葉はいくつあるでしょう。
 主立ったものだけで数えても少なくとも100種類、そしてより細かく目的別に最適化されたDSL(ドメイン特有言語)と呼ばれるものまで含めたら、数万から数十万はくだらないのではないでしょうか。

スクリーンショット 2014-03-23 9.40.36.png

 これほど多くのプログラミング言語が存在することに、まず驚きはしませんか?

 他方で、たとえば英語教育の現場では、「英語さえできれば世界の人と話ができる」と教えられていたりもします。
 極論すれば、最初から英語が自由に喋れたら、敢えて新しく言葉を学ぶ必要はないとも取れます。

 これをプログラミングに置き換えると、ある一つのプログラミング言語さえあれば、他にいかなる言語も必要ない、ということになります。もちろんそんなわけはありません。もしそうだったとしたら、私達がこれほど多くのプログラミング言語に囲まれる必要はないのです。

 今、たとえばスマートフォン向けのアプリを作ろうと思ったら、最低でも2,3種類の言語を組み合わせてプログラミングするのが普通です。

 
 iOS向けならObjective-CとHTMLとJavaScript、場合によってはGLSLというグラフィック用の言語を使います。Androidの場合はObjective-Cの代わりにJavaを使います。

 Webサービスの場合、選択肢はもっと広がります。Perl, PHP, Python, Java・・・筆者はC++を使ってWebサービスを作っていたこともあります。Webサービスを作ろうとしたら、最も簡単と言われる組み合わせであっても、PHPとSQL、HTMLとJavaScriptという四つの言語を使う必要があります。ちょっと凝ったものを作ろうとすれば、XMLも学ぶ必要があるかもしれません。

 これらの言語は、互いに共通点と相違点を持っています。
 例えばどの言語でも足し算は+で、掛け算は*で表現されます。

 しかし文法に近い部分になると殆ど完璧に違います。
 なぜ、こんなにややこしいことをしなければならないのでしょうか。

 それを理解するためには、実際に作ってみるのがもっとも手っ取り早いのですが、ここではそれはしない前提での説明を試みてみます。

 たとえばWebサービスをPHPで作る場合を考えてみましょう。
 PHPは、非常に簡単かつ強力なWebサービス開発専用言語です。

 PHPはWebサービスを開発するためだけに生まれた言語で、それを簡単にするためのあらゆる語彙が用意されています。
 ただし、あまりにも簡単に扱えてしまうため、本職の(ギークな)プログラマからは嫌われている言語でもあります。しかし、実際、世界の半数のWebサービスはPHPで書かれているとも言われています。

 ただし、PHPが実現するのは、あくまでもWebサーバが、どんな情報をどのように扱うか、という全体のコントロールだけです。
 実際にWebブラウザでページを表示するために用いられる言語としてはHTMLを扱わなければなりません。

 
 HTMLは、ハイパーテキストの記述専用に設計された言語で、普段Webページとして接しているものは全てHTMLで記述されています。HTMLは厳密にはプログラミング言語ではなく、あくまでも文章を表現するためのマークアップ言語であり、データ構造の一種です。Webページにちょっとした動きの要素を実現するために、HTML側にプログラミング機能を持たせるために専用設計されたプログラミング言語がJavaScriptです。JavaScriptは主にユーザの入力に対してWebページがどのようなアニメーションを行うかなど、ユーザーインターフェース寄りの処理に使われます。

 他方で、Webサービスの扱うデータは、データベースに保存するのが一般的です。
 このデータベースを扱うためには、通常、SQLという言語を用います。
 SQLは、IBMが開発したデータベース操作言語で、データ構造の定義と、データの検索をするために専用設計された言語です。

 
 ごく簡単なWebサービスであっても、この3ないし4つの言語を組み合わせる必要があります。
 この四つの言語の機能を全てエレガントに統合したような一つの言語をつくる、または一つの言語に集約するような試みは何度も行われて来ていますが、結局、扱う対象が違えば、それに特化した言語で扱うのが最適なのだ、という結論に達し、常に原点回帰をします。

 もちろん、データベースの操作やHTMLの出力を直接、別の言語を用いずにどれかひとつの言語(たとえばPHP)の中だけで完結するような書き方も何度も試みられてきました。

 しかし最終的にはそれは無駄な努力になってしまいます。結局、完全に他の言語の要素を隠蔽したり、他の言語の要素を取込んだりすることは根本的にはできないのです。

 なぜなら、それぞれの言語がそれぞれ専用に設計されている背景にはそれぞれに確固たる理由があるからです。

 最も効率的なのは、結局、これら四つの言語をバラバラに学び、適材適所で組み合わせることです。
 

 そしてそれは、思ったほど大きな負担にはなりません。
 むしろ言語が別れていることでそれぞれの言語はそれぞれの長所を伸ばすことに集中できるのです。

 プログラマーと同じように、実はふつうの人々も知らず知らずのうちに使う「語彙」を切り替えています。

 たとえば、経営の現場で使われる「ROI(投資利益率)」や「PL(損益計算書)」や「BS(貸借対照表)」といった財務関係の用語、これは頭字語(アクロニム)をそのまま持ち込むことで、できるだけ論理的で財務処理に向いた文法に切り替えます。

 また、広告業界で「クリエイティブ」といえば、「制作物」を意味します。本来は「創造的な」という意味の形容詞のはずですが、広告業界では名詞にかわるわけです。また、この業界でADといえば「アート・ディレクター」のことです。テレビ業界のADは使いっ走り(アシスタント・ディレクター)ですが、広告業界では偉い人を指す言葉にかわるわけですね。

 企画の現場で使われる「コンセプト」「コミュニケーション」「インターフェース」「エクスペリエンス」「イシュー」「ニーズ」といった語彙は、たとえば直訳で「概念」「伝達」「境界」「体験」「焦点・関心事」「需要」と言い換えても構わないと思われるかもしれませんが、実は却って伝わりにくくなります。というのも、厳密には「需要」という日本語と「ニーズ」というカタカナ語は似て非なるものだからです。実際、「需要」の英訳は「demand」であり、ニーズとは異なります。

 厳密な言葉の成り立ちは知りませんが、明治以降、開国とともに日本に大量の外来語が入ってきました。その際、かなり多くの単語が直訳され、たとえば「概念(Conceptualism)」や「哲学(Philosophy)」といった日本語がうまれました。

 ある目的にあった語彙に意図的に切り替えることで、頭の使い方を切り替えるというわけです。
 
 これはプログラマーが目的に応じて言語を使い分けていることの説明に少しはなるでしょうか。

 筆者は論理的に物事を考えたい、説明したいと思う時、主に英語で考えるようにしています。
 そんなにすごい英語力は必要ありません。自分が言いたいと思うことを英語の箇条書きにしてみるのです。

 英語にうまくできないものは、自分の中で意味として消化できてない部分として、異質な部分は異質な部分のまま、ダブルクォーテーション付きで箇条書きに残してしまいます。

 これは例えば、2020年の東京オリンピックで滝川クリステルが「おもてなし」をフランス語の「traitement」ではなく、敢えて「O-MO-TE-NA-SHI」と紹介したことに似ています。

 「おもてなし」という概念は、実はそのままラテン語圏の言葉に変換するのは困難な単語のひとつです。それを説明する方法として実に鮮やかなやり方だったのではないかと思います。

 もっと深い論理性が必要だと思った時、私は思い切ってプログラミング言語で考えてみることもあります。
 自分が迷っていることをプログラミング言語の形で表現し、客観的に評価し判断するためです。
 たとえば以下のような感じです。

 money = 100; //貯金
desire = 0; //欲望
 buyGadget = function(price){
money -= price;
if(money<0){
console.log("破産");
}else{
console.log("買っちゃった! "+price+"万円のガジェット");
}
}
day = function(){
desire += Math.random()*10; //不確定要素
if(desire>100) buyGadget(Math.random()*10+1); //価格は不確定要素
}
month = function(){
  money += 5; //月のお小遣い
for(i=0;i<30;i++)
day();
}

 これは、毎月5万円のお小遣いの中で、あるガジェットが欲しいという欲望が蓄積されていき、買おうかどうか悩んでいるときの思考パターンです。

 金額がランダムなのは、欲しいと思うガジェットの値段が毎回異なるからです。
 最近はあまり高価なガジェットというものはなく、だいたい10万円以内で買えるのでこんなプログラムになっています。

 こうすると、day関数の中のdesire(欲望)が上がったり下がったりするので、例えばday関数を以下のように修正すると・・・

day = function(){
desire += Math.random()*10; //不確定要素
if(Math.random()*100 < 20){ //週に一、二回、友達と酒を飲む
console.log("友達と酒を飲んだ");
money-=0.5;//お金を少し喪う
desire/=2; //ガジェット欲がおさまる
}
if(desire>100) buyGadget(Math.random()*10+1); //価格は不確定要素
}

 
 酒を飲みに行くことで自分の欲望を押さえることが出来るかもしれません。
 しかし、週二回、酒を飲みに行くと、結局平均すると月に2万円使ってしまって、残りのお小遣いは3万円になってしまいます。

 プログラミング言語に落とし込んでみることで、自分が何に迷っているのかがある程度明確になります。
 もっと日常的には表計算ソフトのシートでこういう計算をしてみて、自分がどこで何を悩んでいるのか、トレードオフ条件になっているのは何か、といったことが自分の中で腑に落ちるので、「じゃあガジェット欲をそらすために家に友達を呼ぼう」など、全く別の解決策が浮かんだりもします。

 目的に応じて使う語彙や言語を変えて行くと思わぬ発見がありますからね。

 

WirelessWire Weekly

おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)

登録はこちら

清水 亮(しみず・りょう)

新潟県長岡市生まれ。プログラマーとして世界を放浪した末、 '17年にソニーCSLとWiL LLC.とともにギリア株式会社を設立し、「ヒトとAIの共生環境」の構築に情熱を捧げる。 '17年より東京大学先端科学技術研究センター客員研究員を兼務。著書として「教養としてのプログラミング入門(中央公論社)」「よくわかる人工知能 (KADOKAWA)」「プログラミングバカ一代(晶文社)」など。

RELATED TAG