このページの本文へ

スペシャルトーク@プログラミング+第28回

どんなふうにプログラミングを学ぶとよいのか?

U-22で経済産業大臣賞など4冠の中学生上原直人(15歳)さんに聞いた

2019年11月14日 09時00分更新

文● 遠藤諭(角川アスキー総合研究所)

  • この記事をはてなブックマークに追加
  • 本文印刷

 10月20日、秋葉原で第40回「U-22プログラミング・コンテスト2019」の最終審査会が行われた。今年の同大会の話題をさらったのがプログラミング言語「Blawn」で、経済産業大臣賞(総合)を受賞した開成中学在学中の3年生上原直人さんだった。Blawnは、可読性、メモリ安全性、実行速度の3つの点で優れており、それだけのものを数週間で書きあげたということも話題になっている。

 中学生が作ったプログラミング言語とはどんなものなのか? Quoraに「プログラミング言語「Blawn」は普及しそうですか?」という質問があり、Rubyの作者であるまつもとゆきひろ氏が答えている。それによると、「Blawnを構成する技術要素のひとつひとつはたいへん光るものがあります」とある。また、「Blawnで採用されたアイディアのうちのいくつかは大変優れたものであり、それが実現可能であることが(才能ある15歳によって)実証されたことだけでも、世界にとって大変価値のあることだと思う」とも書かれている。

 Rubyの作者をしてこう言わしめるって凄いではないか! 業界関係者として、これは嬉しくなるニュースでもあるし興味を持たないわけにはいかないというものだ。上原さんによると、「まだBlawnは全く安定しておらず現時点では実用的なプロダクトに採用する意義は0どころかマイナスですらあります」と控え目に言っているのだが、同時に、前向きに開発を続けていくことで普及できたらいいなと思っているようだ。

 そこで、どんな中学生がそんな言語を作っているのか? 上原直人さん会ってみることにした。2020年の小学校に続いて、2021年には中学校でも新学習指導要領によるプログラミング教育がはじまる。一方、「U-22プログラミング・コンテスト」など先端人材を求める活動や私も関係者である「全国小中学生プログラミング大会」(JJPC)もある。そうしたことへのヒントも隠れされているのではないかと思ってインタビューさせてもらった。

はじめはAIに興味を持った

―― いつからプログラミングを始めたんですか?

「小学校6年生のときに、『HSP』(Hot Soup Processor)という簡単な言語を本当に少しだけやって、でもすぐにやめてしまいました」

―― 小学生のいまどきのコンピューター事情がよくわからないんですけど、小学校6年くらいだとクラスでみんなパソコン使っているんですか?

「パソコンやっている人はぜんぜんいなかったですね」

―― そうなんですか。それで再開するのはいつなんですか?

「中学校1年生になって、学校のコンピューター部のKCLC(開成コンピューターラバーズクラブ)に入りました。KCLCでは、新入生に『C#』を教えることになっていて、難しくてよく分からなかったんですけど、夏休みに『Python』をやってこれならいけるかなと思いました」

―― 授業ではプログラミングをやるんですか?

「うちの学校だと技術の授業でプログラミングは週に1時間ありますが、そんなに本格的な内容ではないですね」

―― Pythonをやることにしたのは、いま人気の言語だから?

「それもありますが、その頃、ディープラーニングが話題になっていました。なんか凄いなと思って『ゼロから作るディープラーニング』 (斎藤康毅著、オライリージャパン)を買って、その流れで『入門Python 3』(Bill Lubanovic著、斎藤康毅監訳、長尾高弘訳、オライリージャパン)という定番本を中心に進めていきました。

―― 『ゼロから~』は、かなり難しい本ですよね?

「そうですね。『入門Python 3』で基本的なところは理解して、行列演算とか、偏微分とかは、数学が得意な同級生に教えてもらいながらやっていった感じですね」

―― 人工知能めざしてPythonというのがいまの時代ですねぇ。

「でも、中学1年生の頃は、設計とかそういう知識が全然なくて、簡単なウェブアプリを作ったりしてたんですけど、機能を追加するたびにどんどんぐちゃぐちゃなプログラムになっていって……。しばらくはこれといったものは作ってなかったんですが、中学2年生の夏に『Kivy』というPythonのGUIフレームワークを使いはじめたんです」

―― Kivyというのがあるんですね。

「そのフレームワークってオブジェクト指向などを理解していないとちょっと難しいところがあって、やっているうちに感覚的に身についていった感じでした。ドキュメントが日本語のものが少なくて、英語でキーワードで調べたり、翻訳したり、公式ドキュメントを見たり、あとは実際にKivy自体のソースコードを読んで、こうやったらできるかみたいなのを調べたりして、それがかなり開発系の経験になったと思うんです」

―― Pythonはスクリプト言語でもあるんでダラダラとも書けますからね。それが、フレームワークというある種アプリケーションとの間にあるものに触れることでもの凄く手本になったと。なぜ、Kivyを使おうと思ったんですか?

「Pythonそのままでコマンドで使うだけだけと面白くないのと、そうしたフレームワークの中でもKivyが、新しいくモダンで、単純に作られる画面がカッコよかったからというのもあります。それと、Kivyだとモバイル端末、iPhone、Androidにも対応できる。これはいいなと」

―― いいですね。しかし、新しいのであまり情報はなかった。

「公式ドキュメントを日本語に訳してくださっている人たちはいますが」

―― Pythonとかも公式ドキュメントの日本語訳とか凄いありがたいですよね。とはいえ、Kivyを苦労して使ったのがよかったと。Kivyでオブジェクト指向もわかったと。

「そうですね。分かったと言えるかどうかわからないんですけど(笑)。あとは、デザインパターンなどを理解していないと自分の作ったアプリでもわけわかんなくなっちゃうんで、デザインパターンの勉強をしたりしていました」

―― そういうのを毎日やりだしたわけだ。

「Kivyをやりはじめた夏休みはある程度の時間があったので集中してやっていましたね。ただ、時間的にはプログラミングだけやっている感じじゃなかったですね」

―― ほかのこともやっていた?

「音楽が好きで、部活はソフトボール部と最近ですがスキー同好会に入っています」

―― Kivyをとはいえかなりやった。

「Kivyには、その頃問題があって日本語入力IMEの変換候補が表示されなかったんです。他のOSでは対応されていたりされていなかったりだんだんですが、僕はWindowsを使っていたんですがちょっと厳しかった。それを直そうと思って、それにはWindowsのAPIを使う必要がありました。ただ、CとかC++を知らないのでいろんなサイトを調べて貼りつけてエラーが出てみたいなことを繰り返して、なぜ動いたのか分からないけどなんとか形になったというものを、またPythonにつなげて不完全ながら対応できたかなというところまでやりました」

―― それは公開しているんですか?

「Qiitaにも記事にしています」

―― そのときは話題にならなかった?

「とくにならなかったですね」

―― そもそもユーザーが少ない。

「その頃はぜんぜんC、C++の知識がなくてトンチンカンなこと言ってたかもしれないです」

―― ああでもそれやれたのはよかったですね。

「そうですね」

―― それから、いよいよ言語やるわけですよね? 言語をやることになったきっかけは?

「中学3年になって『LLVM』というものを知ったのがあります。LLVMにはkaleidoscopeというチュートリアルがあって言語を簡単に作れるというものです。でも、それは僕がやってないC++で書かれているんですよ。ただ、Pythonにも使える『llvmlite』というものがあって、C++でこういうことかなあとというのを適宜Pythonでなぞっていって、コンパイラの基盤的なことに関する知識は学んだ気がします」

―― なるほど、それを使ってじゃあ言語を作る知識がついた。言語のどんなところに興味を持って作ろうと思ったんですか?

「プログラミングやってて例えば『ハローワールド』だったらPythonだったら“print("Hello world")”とか書けば簡単に文字出力できますが、なぜこういう文字が表示されるのかなぁっていうのは、結構わからない。そこに興味があって、そういう意味では中学2年の夏に『30日でできる! OS自作入門』(川合秀実著、マイナビ出版)という本を買ったりもしていました」

―― えらい分厚い本ですよね?

「分厚いです。その本でかなり低レイヤーの部分に触れて。それはCとアセンブリで書いてあるんですけど。Cの言語仕様とか全然知らなくて苦労しました」

―― それをひと通りやってみたんだ。

「その本に書いてあることを写してみただけけみたいな感じだったんですけど、低レイヤーの雰囲気はわかってきました」

―― 結構売れてるらしいですよね。その本でOSとか言語とかそっち系が面白くなってきたと。どんなOS作るんですか?

「『Haribote』という名前のOSなんですけど、本当に原理的なことを学べる本だと思います。ブートローダーや画面描画とか」

―― その上でも言語が走るわけですね。当然。

「はい。C言語が走ります」

―― ひとことで言うと何なんですかOSって?

「僕は、まあんまりOSは詳しくはやってないんですけどすべての基盤というか、あらゆる言語でもアプリでもOSの上で動いていて、ハードウェアとのインターフェースでもあり、実際にOSが機械を制御しているというのがあって、これは面白いなっていう。自分がこうキーボードから打ったりした情報で、機械がメモリ割り当てしたりして、こう動いてというのは面白いなと」

―― OSが、コンピューターという身体を動かしているようなもんですよね。そういう全体のしくみが面白い。ふつう中学生ってそんなふうに考えるのですかね? ちょっと思想的なところがありますね。ツールを使えば、言語は、まあ作れるといえば作れるわけだけどそこがちょっと違いますね。

「僕は、割と興味だったりとか、言語の場合はおっしゃるように思想性というかこういうアイデアが面白いんじゃないかっていうのが、技術そのものよりも先にきています」

そしてBlawnを作りはじめた

―― 私がからんでいる全国小中学生プログラミング大会でも、ここ2年で、プログラムを作る上での思想的なところで評価されるものが出てきているんですよ。昨年のグランプリは三橋優希さんという中学3年生の女子でした。一見、ただのScratchのゲームなんだけど、フォントから音楽からすべて作った。しかし、ポイントはそこじゃなくて遊ぶ人が飽きないようにするゲームシステムなどを含めてすべてユーザーを想定して考えて作っている。むしろ、“作る過程”が評価されたんですね。それから、今年のグランプリは小学2年生の小長井聡介くんが作った渋谷のスクランブル交差点のシミュレーターです。

「ああ、それ見ていました」

 (注:U-22の最終審査会会場のすぐヨコで全国小中学生プログラミング大会参加者のデモ展示が行われていた)

―― 渋谷の交差点がどんなふうに渋滞したりしているかって、自由研究のテーマとしても大変よい内容だと思うんですよ。だけど、彼の場合はそこから一歩進んでシミュレーターを作ってしまった。観察までだと今起きていることしかわかんないんだけれど、プログラムで東西南北の方向ごとの渋滞度を設定してどうなるかを試せるものなんですね。

「それ凄いですね」

―― 自由研究とか科学研究のコンテストって学生科学賞とかいくつかあるんだけど、いまだとこういう方向があると関係者に言いたいですね。プログラミングを、そういう形でもぜひやって欲しい。

「そうですよね」

―― それで、Blawnを作りだしたのはいつなんですか?

「Blawnという名前自体は5月くらいです。はじめは名前だけ決まっていて、特にどうやるかも決まっていませんでした」

―― まあ、言語は名前みたいなところがありますからね?

「本当に名前とVisual Studio Codeの環境だけ書いたファイルみたいなのだけをコミットした、GitHubのリポジトリを作りました。そこに、実際に構文解析器の使い方の練習とか、そういう雑多なものをコミットしてぐちゃぐちゃになっていたんですけど。それを、8月くらいになってからBlawnに関する実装をするようにしたんです」

テンプレート関数について説明してくれている上原さん

―― 「可読性」が評価されているじゃないですか、あのあたりはどうなんですか?

「Pythonを使ってきてC++を見ると、C++は読みづらいなと思ったんです。その理由の1つが型なんです。型に関するシステムがBlawnはかなり特徴的で、関数の引数にも型を書かないし、クラスも、変数も型を書きません。関数に関しては、C++には、テンプレート関数という型を書かない方法があるんですけど、それの存在を知らないときに思いつきました」

―― それはどういうものですか?

「渡された引数の型から、関数を生成して、間違いがあればエラーを出せばとくに型を明示して書かなくてもいいんじゃないかということですね。これが、結構、大きくてこれを応用したら型を一切書かなくていいプログラミング言語が作れるんじゃないかというアイデアを思いついて、それを反映させていったんです」

―― そこが起点なんだ。

「これを生かせば、クラスに関しても型名を書かなくても静的型付けをできるんじゃないか? これはもしかしたら画期的じゃないかと勝手に思ったんです」

―― 型って面倒くさいですよね。

「とくに僕はPythonからはいったんで、型が面倒くさいなと思って。でも、なくしちゃうと遅くなったり、Pythonは型がないからダメなんだみたいなこととか言われますよね。型によるバグの減少というのもあったりするので」

―― でも書かないことにした。

「書いてないと分からないという声もあったんだけど、いまのエディターを使っていれば、Blawnはまだないんですけど型は簡単にわかりますし、実際に作業をすることとのトレードオフとして型を書かないほうがいいんじゃないかと思ったんです。本当に本筋のロジックが最大限できるべきだと思っていて」

―― 可読性についてはどういうことなんですか?

「プログラミング言語の可読性に関する研究論文があるんですが、それは『Perl』という言語をもとに3つのバリエーションで比較したものなんです。1つは、Perlの予約語のたとえばifなどを完全にランダムな文字にしたrandomoという言語、次に普通のPerl、さらにPerlの各単語の意味を分かりやすくしたものです。結果は、randomoと普通のPerlでは初心者に学習させたときの違いはあまり見られなかったというんです」

―― Perlは、デタラメな予約語の場合とあまり違いがなかった? それが、ちょっと分かりやすく表現をかえることで違ってきたのですね。

「関数宣言も、Cだと“型名 関数名(型名 引数1, 型名 引数2, ・・・)”というふうにやるわけですけど、これは分かっている人には関数と分かるんですけどパっと見ただけでは分かりにくい。Blawnの場合は“function 関数名(引数1, 型名 引数2, ・・・)”というふうにしぜんに読めるようにしてあります」

―― Blawnに触った人がQiitaに、関数を呼び出すときにどんどん改行しないといけないとか書いてあった気がしますが。

「ああif文のことですかね。ifで条件を書いたあとに1回改行してカッコを書いて、さらに改行しないといけない。これは可読性というよりは、こうしたほうが解析が楽だったので妥協したところだったんだけど。ただ、これもスッキリしてここから先が中身だってことがわかると思うのでそこはあんまり気にしなかったんです」

―― 構文があっていれば、どんなふうに自由に書いてもいいとかそういうことではないんですね? Cで、テレタイプの時代にだらだら流れてくれば、コンピューターの中で整理して解読してあげるよという文化があったと思うんだけど、そこは、インデントが意味を持つPythonが社会的に認められて変わってきてもいいというのがありそうですね。

「C言語とかの構文って、セミコロンとか、カッコとか、その時代のコンピューターの事情があったと思うんですけど、いまはそういったものって解消されているんで引きずらなくてもいいかなと思いました」

―― 実際は、むかしに比べてずっと大きな画面でステートメントで認識してエディターを使ってやってるわけだからね。

「改行すればそこで文が終わりだというのは自然だと思うしセミコロンとかいらないんじゃないかと」

―― 可読性はそのあたりですか? もっとあるんですか?

「いまいったようなこととか、型名を書かなくてすむというのもスッキリして読みやすい。そのあたりですね」

―― 「メモリ安全性」というのもいわれていましたよね。私は、全く理解していないんたけど。それは、誰かに指摘されて発表までにやってきたみたいな話でしたかね?

「それもあるんですけど。たとえば、C++の場合はiというポインタを作ったとして“delete i;”とやったら使えないはずですけど、言語仕様的にはできます。そうすると実行時にメモリのエラーが起きてしまう。言語仕様として危険なメモリ操作が可能になっているからこういうことが起きるんですね。Blawnでは『RAII』(Resource Acquisition Is Initialization)という考え方に従ってスコープによってメモリを管理しています」

―― そういう問題はC++のコンパイラがチェックしてくれないんですかね? そのdeleteを許しつつ安全性を確保する方法もありそうですが。

「Rustという言語がこれを回避しているんですけど、変数の所有権とか、難しい部分があったり、個人的には可読性が低いなと思うんですね」

―― 「可読性」、「メモリ安全性」、「実行速度」、その3つが言われていたと思うんだけど、速い理由というのはあるんですか?

「言語が遅くなる理由としては、Pythonなら動的型付け、つまり、実行時に型を判断して、しかもインタープリタなので逐次文法を解釈して実行するので遅いというのがありますよね。Javaは、速いんですけど、初期のJavaなどはバーチャルマシンで動いているので遅かった。Blawnは、直接ネイティブなマシン語にコンパイルされるので、その点でふつうに速かったり、余計なランタイムとか一切使っていない直接的な表現なので遅くなる要因がないというのがあると思います」

―― なるほど、それを夏の数週間で作ったというのが凄いと言われているんですね。

「一次審査の段階では完成度は低かったと自分では思っていて、これで通るのかなあという思っていたんだけど通っちゃった感じでした」

―― たしかに評価されたのは考え方のようでしたね。開発期間の話は最終審査会の質疑応答で出てきたのでしたね。

「完成度というよりはアイデアを評価いただいたのだと思います」

―― Blawnってすごい正統な言語じゃないじゃないですか。ものすごく特徴的な文法を持っているとか、特殊なパラダイムのもとに作られているわけじゃない。CやJavaやPythonなどと同じように真正面なところですよね。

「その意味ではユニークじゃなくて、初心者として本当に僕がPythonを使ったあとからC++を使ってみたときに思ったような『これはこうしたら』と感じたものを反映していった結果なんです」

―― Pythonのライブラリを作るのに使われるのもよいですね。

「そうですね。『cridge』というU-22の最終審査会当日に発表したツールがあって、それを使うとC言語の関数を基本的になんでも呼び出せるのでそれをうまく使うことでいけると思います。それが吐き出すブリッジファイルを利用して呼び出します」

BlawnからC言語のプログラムを呼び出し、ウィンドウを作成しているようす

―― 今後は、どのようにしていく計画なんですか?

「話題になったおかげもあって、いろんなバグが分かっています」

―― whileの中でifがあるといけないみたいなバグがあるとか?

「報告いただいているバグは、基本的にはすぐに直せると判断しているんですけど。あとは言語仕様をある程度固めて、標準ライブラリを整備しようと思っています」

―― どんなライブラリですか?

「これはすぐにはできないんですけど、GUIのフレームワークというかライブラリを作りたいですね」

―― Kivyみいたな。

「これもC言語の呼び出しツールが先にできているんで、それを利用すれば各OSに提供されているAPIを使って提供できるんじゃないかなと思っています。最終審査会の発表でもお見せしたOpenGLというライブラリをBlawnから呼び出しているようすがあったと思うんですが」

―― マルチプラットフォームというのも大変だと思うんだけど。

「いまLinuxしか対応してないのですが、OS依存の機能をそんなに使っているわけではないので、WindowsやMacには簡単に移植はできるかなと思ってます。まずは、Linux版が安定してきてから、まあこれだったら他のOSにリソース割いてもいいなって思えるようになってからですね。それも、来年度のはじめあたりにできるか?」

―― それでバージョン1とか?

「まあその段階でも周辺ツールとか全然も充実していないと思っているんで、バージョン0.01はもっとあとになるかもしれないです。あとは、『コルーチン』を実装したいと思っています。コルーチンを簡単に説明するのは難しいのですが、ざっくりいうと、いったん処理を中断した後、続きから処理を再開できるといったものです。ただ、これはちょっと難しい作業になると思っています」

―― どんなユーザーに使ってほしいですか?

「普通のシステム開発とか、メモリ安全性っていうのは結構重要だと思うので使ってもらえたらなと思います。ただ、いまの時点ではぜんぜん完成度が高くなくてベータ版ですらないんですよ。バージョン番号0.01すらついていない段階なのですね。賞に選んでいただいたんですけど、本当はそんなことを言える段階にはないわけですけど」

―― とはいえ目標としては?

「実用的に考えて採用されうるようなものにしていきたいと思っています。技術的に面白いみたいな感じではなくて、この言語を採用するメリットがあるなという判断で使われうるようなものにしていきたいです」

―― この言語を育てていくことを、当面の数年間やっていく感じですかね? あとは部活があるという話でした。

「そうですね」

 はるか昔にプログラマを引退した私なので、正直、いまの知識ではBlawnをきちんと評価できるわけではない。なので、あまり技術的なところを突っ込んで聞けなかった点は、ご了承いただきたい。Blawnの言語自体については、彼のGitHubをはじめネットワーク上でやりとりされているので、そちらをご覧いただきたい。

 それでも、やはりBlawnを開発することになった経緯の話は面白かった。Pythonという比較的新しい言語に触れ -> 日本語環境に不備があるKivyと格闘 -> 自作OS本を読み込む -> LLVMはC++が苦手なのでPythonと照らし合わせながら使う。要するに、あまりきれいなカリキュラムをこなしたというような話ではないのだが、プログラムが書けるようになる過程というのはむしろこういうことなのだ。

 冒頭で触れたQuoraの質問に対する答えで、まつもとゆきひろ氏は、言語にはコミュティが必須の要素であることや、その普及にはとても時間がかかると書かれている。インタビューをしている間に、私は、ほとんど彼の年齢を忘れてしまっていたのだが、さいわい彼はまだ15歳の中学生である。いま我々がその誕生を目撃したBlawnや、彼のこれからの仕事が発展していくことを願うというものだ。

 なお、インタビューでは聞きそびれたのだが、Blawnという言語名は「Blue Lawn(青い芝)」からもじったもので、となりの芝が青く見えるほど、いままでの言語の不満を解消できるような言語にしたいという気持ちを込めたものだそうだ。


 U-22プログラミング・コンテストは1980年から経済産業省主催で開催され、2014年からは民間企業によって構成される実行委員会主催で開催継続している作品提出型のプログラミングコンテストです。40年目を迎えた同コンテスト2019の結果に関しては「U-22プログラミング・コンテスト2019 最終審査結果発表」をご覧のこと。

 上原直人さんによる「Blawn」は、経済産業大臣賞<総合>のほか、スポンサー企業賞で「Boys and Girls, be ambitious!賞」(提供:株式会社デジタルガレージ)、「サイボウズ賞」、「Best Viewers賞」の4冠。公式サイトによる概要では、以下のように書かれている。

 「静的型付けコンパイル型言語Blawn。既存の言語の仕様や文化に囚われず、実効速度などの性能の高さもふくめた「人間にとっての扱いやすさ」を最重要視し開発。字句解析器にflex、構文解析器にbison、バックエンドにLLVMを利用。1パースで構文解析が済むように実装し、コンパイル速度の改善を図っている。また、全ての関数及びクラスがジェネリックで、これによって記述の簡潔さと認知負荷の低さ、さらには静的解析による実行速度の速さを担保している」

 なお、10月20日(日)の最終審査会では、2020年から始まる小学校におけるプログラミング教育必修化を視野に、一般社団法人コンピュータソフトウェア協会(CSAJ)プログラミング教育委員会、全国小中学生プログラミング大会(JJPC)と共に、Programmer’s Day~参加費無料のプログラミング1日体験~も併催された。

 Programmer's Dayでは、小学生を対象としたワークショップや、プログラミング教育に関するパネルディスカッション、さらにJJPC入選作品最終選考なども行われ、これからプログラミングを学ぼうとする子供たちから、22歳以下のトップエンジニアが一同に会するイベントとなった。

■関連リンク

 ・U-22プログラミング・コンテスト2019

 ・U-22プログラミング・コンテスト 10歳が経済産業大臣賞に輝く

 ・直音の里 / Blawn

 ・第4回全国小中学生プログラミングコンテスト

カテゴリートップへ

この特集の記事
ピックアップ