Goの実行系から見えてくる魅力
Goのこうした独自性は、その実行系まで考え合わせると意味が見えてくる。
Goの主要な特徴である極めて高速なコンパイルは、近時の言語からするとストイックと思える文法を採用することによって実現されている。この点で、Goは徹底しており、モダンな言語ならば必須の要素と思われる機能がばっさりと切り落とされている。
Goが、Cのポインタ演算機能を外したこと(*2)は違和感なく受け入れられる人であっても、JavaやC++などのオブジェクト指向言語に欠かせない要素と考えられている「クラスの継承」が言語機能から外されたことには驚いたことだろう(ほかにも、Goでは例外処理機能や型を実行時に引数とするジェネリックなどがサポートされていない)。
テスト時に発見されにくいバグの温床となっているポインタ演算は、JavaやC#などでも言語機能として提供されていない。現在でも、ポインタ演算に関するプログラムのミスが、OSやWebブラウザのセキュリティホールを生み出してしまうことがある。こうしたミスは、大手ソフトウェア企業の厳格なテスト体制においても発見できないことがある。
【参考記事】
「IE」に対する最新攻撃の原因、たった1つのタイプミス--MSが認める
http://japan.cnet.com/news/sec/story/0,2000056024,20397505,00.htm
一方で、既存言語に比べ強化されているのが並列処理への対応である。Goでは、「go」という命令を記すだけで処理を並列化できるようになっている。また、Goプログラマ自身が、並列・分散処理におけるメモリ管理という困難なコーディングを行わなくとも済むように、ガベージコレクタを採用されている。シンプルな言語機能とあいまって、Goの実行速度は十分に早いとされる(Cの1〜2割増しを目指しているという)。
これらの点について、以下のように理解しておくと良いのではないかと筆者は思っている。
まず、Goは現在に至るまでCが用いられている分野で、Cに代わって用いられるポテンシャルを有している(今後のマルチコアCPU時代にあっては、Goで記述することによる若干のオーバーヘッドは、容易に並列処理が記述できるなどのメリットが補って余りあるであろう)。
より高度な言語機能を持つC++とは、役割分担を行う関係にあると考えられる(熟練したプログラマを確保できるプロジェクトにおいてはC++が採用され、高速なコンパイルが意味を持つプロジェクトではGoが採用されるなど)。
加えて、今後、Goの実行速度がグーグルの公約どおりCに近いものとなり、かつ言語の動作も十分安定してきた後には、現在JavaやC#で記述されているようなアプリケーションについてもGoで記述されることが起こるだろう。
もちろん、登場したばかりの言語であるGoが、一挙にC/C++、Java/C#といった主要言語と並び立つ存在になることはないだろう。だが、これら既存言語のユーザーも、それぞれの言語がそれぞれの経緯(時代的な制約)から抱えてしまっている複雑さやオーバーヘッドと、Goが縁を切ったことについては興味を抱くかもしれない。
Cのポインタ演算機能を受け継ぎ、多重継承とテンプレートを採用したC++は、複雑さとコンパイル速度が弱点となっている。CPUに依存しない中間言語方式を採用したJavaでは、最適化が進んでいるとはいえ、実行速度面に若干の弱点が残っている(この点は、Javaの対抗馬として登場したC#も同様である)(*3)。
筆者は、Goの魅力は、既存の言語機能を無批判に受け入れなかったところから引き出されているのではと考えている。
ガベージコレクタと必要最小限の言語機能を持つ並列処理対応言語であるGoは、JavaVMや.NETの中間言語(Javaバイトコード/MSIL)に比べることもできるかもしれない。これらの中間言語に比べるとはるかに高級な言語であるGoは、並列処理を記述する基盤言語として用いられつつ、より高級な言語のホスト言語となる可能性がある(RubyやPythonといったスクリプト言語をJavaVMや.NETに移植する試みには、すでに数年の実績がある。これらの移植ノウハウは、Go上でも発揮されるのではなかろうか)。
Goを学ぼう
将来的なことはさておき、シンプルな言語仕様であるということは、いったんその約束事を受け入れてしまえば、学習が容易であることを意味する(筆者は、Pascalをかじっていたためかもしれないが、Go流の書き方をさほど違和感なく受け入れられている)。
今後のプログラミングにおいて、並列処理は重要な課題とされている。Goは、並列処理を容易に記述する方法を学ぶための言語としても価値があると思っている。
この連載では、次回以降、インストール、コンパイル方法、基本的な文法要素からはじめ、goroutineによる並列処理、インターフェイスによる機能拡張など、Goの基本をひととおり押さえていく予定である。さらには、Chromeブラウザ上での実行など、その時々の話題も随時取り上げていく。
2010年代のインターネットを支える基盤言語候補として、名乗りを上げたGoを皆さんも一緒に学んでいこう。
2/2 |
Index | |
Google Go登場の背景 | |
Page1 唐突に登場したGoogle Goにまつわる若干のとまどい |
|
Page2 Goの実行系から見えてくる魅力 Goを学ぼう |
新世代の並列処理言語Google Goをひもとく |
Coding Edgeお勧め記事 |
いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
|
Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
|
貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
|
Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
|
ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|