どうして星の数ほどプログラミング言語があるのか?

今回から、世界中にあるいろいろなプログラミング言語をレビューする連載「世界のプログラミング言語」が始まります。世界中には星の数ほどたくさんのプログラミング言語があるので、それらを一つずつ紹介していきます。しかし、そもそも、なぜ、世の中にはたくさんのプログラミング言語があるのでしょうか。

平均的なプログラマーであれば10個以上の言語を使い分ける?!

質問について答える前に、筆者がいくつのプログラミング言語を使えるのかを紹介しましょう。まず、筆者自身もプログラミング言語を開発しており、日本語プログラミング言語「なでしこ」(https://nadesi.com)を公開しています。これだけで、使える言語+1なのですが、毎年、2-3冊ずつプログラミング言語に関する書籍を執筆しています。それで、書籍で扱ったプログラミング言語には、JavaScript/ActionScript/PHP/Python/ひまわり/なでしこ・・・といろいろです。しかし、よくよく考えてみると、業務で使用したプログラミング言語であれば、C/C++/C#/VB/Delphi/Java/Perl/Ruby・・・と、ちょっと思い出しただけで両手が足りなくなります。そして、趣味や遊びでかじった言語となれば、もっと多くなります。

  • 筆者が最近書いた書籍一覧 - Amazonの一覧より

    筆者が最近書いた書籍一覧 - Amazonの一覧より

それで、一般の方にその話をすると、「いくつもの言語が使えるなんてスゴイ」などと言われることもあるのですが、実は、すごいことでもなんでもありません。一口に「言語」と言っても、「自然言語」と「プログラミング言語」には大きな差があり、プログラミング言語は自然言語ほど難しくないからです。

世界には、日本語だけでなく、英語・中国語・スペイン語・フランス語などの自然言語があります。これらの言語で、日常会話を理解するために必要な単語数は、2000語から3000語ほどと言われています。しかし、プログラミングの言語で使う語彙というのは、それほど多くありません。例えば、最近人気の言語Pythonの予約語は33個、標準の組み込み関数は149個と、それほど多くありません。もちろん、組み込み関数のほかに、別途ライブラリを利用することが多いので、実際にはもっと多くの語彙をマスターしなければなりませんが、それでも、自然言語ほど多様な語彙を覚えなければならない訳ではありません。それに、各プログラミング言語の根底にある考え方に大きな差異があるわけではありません。

しかも、筆者が特別なのではなく、プログラミングを仕事にしている人であれば、複数のプログラミング言語を使いこなせるというのは、ある意味、普通のことでしょう。もし、長年プログラミングをしている人ならば、5個以上の言語を駆使することができることでしょう。

例えば Webプログラマーなら

例えば、昨今の平均的なWebプログラマーであれば、普通に二種類以上のプログラミング言語を組み合わせて、アプリを開発しています。なぜなら、Webサーバー上でプログラムを動かすためには、PHPを使います。そして、Webブラウザ上でプログラムを動かすためには、JavaScriptを利用します。

このほかにも、厳密に言うと、プログラミング言語ではありませんが、一つのWebアプリを作るために、HTMLやCSSなどのマークアップ言語を使う必要があり、PHPからデータベースにアクセスするために、SQLなどのデータベース問い合わせ言語を記述する必要があります。

プログラミング言語は適材適所

このように、Web開発だけを見ても、複数のプログラミング言語を組み合わせて使う必要があります。ですから、用途ごとに用意されているプログラミング言語を、適材適所で選んで使う必要があります。

しかも、プログラマーの仕事というのは、時代と共に変化していくものです。1980年代以前は、メインフレームと呼ばれる大型のサーバー機を対象としてプログラムを作る仕事が多くありました。それが、90年代から2000年代にかけて、Windowsを代表とするパソコン向けのアプリを開発することが多くなりました。そして、2010年代以降は、Webブラウザから利用するWebアプリや、スマートフォン向けのアプリを作る機会が増えています。

また、開発ツールやプログラミング言語は、そのプラットフォームでの、ユーザーが増え、OSが成熟していくほどに多様性が増してきます。今では、業務になくてはならないWindowsのアプリを作るプログラミング言語には、当初、C/C++、Visual Basic、Delphiなどが使われましたが、その後、Javaや.NET(C#など)が登場し、スクリプト言語のRubyやPython、JavaScriptも使われるようになっています。歴史の長いUnix/Linux系のOSでは、より多様性に富んだ開発ツールが提供されています。

それで、結論となるのですが、時代や環境の変化に応じて、コンピューターやOSが変わっていくため、その環境に応じたさまざまなプログラミング言語が必要となるのです。また、環境だけの問題ではなく、開発するプログラムの実行速度や実行形態、開発のし易さ、開発者の好みに応じて、異なるプログラミング言語が提供されてきました。

また、売れていないミュージシャンの中にも、たくさん素晴らしい音楽を作るアーティストがいるように、プログラミング言語の中にも、あまり注目されないながら、キラリと光る素晴らしいプログラミング言語があります。本当は、便利だったのに、時代に恵まれなかったために、凋落したプログラミング言語もあります。本連載では、そうしたメジャーではないもののキラリと光るプログラミング言語も紹介していきたいと思います。

Firefox高速化の立役者「Rust」

第1回目は、Firefox高速化の立役者「Rust」を紹介します。2017年末、Firefox 57が公開されましたが、実行速度が2倍になり人々を驚かせました( レビュー記事 - https://news.mynavi.jp/article/20171116-firefox57/ )。その高速化のニュースで語られていたのが「Rust」というプログラミング言語です。一体、Rustとは何なのだろうと疑問に思った方も多いと思います。そこで、実際にRustをインストールして簡単なプログラムを動かしてみましょう。

Rustとは?

『Rust(読み方: ラスト)』は、Firefoxの開発元であるMozillaが支援するオープンソースのプログラミング言語です。Rustが目指しているのは、速度・安全性・並行性です。そのため、RustのWebサイトには、大きく「Rustは速度、安全性、並行性の3つのゴールにフォーカスしたシステムプログラミング言語です」と掲げられています。

もちろん、Firefoxを開発できることから見ても分かるとおり、既に十分に実用的なプログラミング言語です。また、2010年に発表されて以来、Firefoxの開発を通じて、Rust言語は改良されてきました。サイトには、利用実績も掲載されており、たくさんのプロダクトがRustを利用しています。

RustのWebサイト [URL] https://www.rust-lang.org/ja-JP/

また、有名な技術者コミュニティサイトのStack Overflowによる調査によると、2016年、2017年の「最も愛されているプログラミング言語」で一位を獲得しています。日本では、まだそれほどブレイクしていないのですが、日本語の情報も増えており、じわじわと人気が出そうなプログラミング言語です。

Rustをインストールしてみよう

【Windowsの場合】

WindowsでRustを手軽にインストールするために、インストーラーが提供されています。以下のWebサイトにアクセスして、ダウンロードしてください。Windowsでアクセスすると、インストーラーのダウンロード用リンクが表示されます。また、WindowsでRustを使う場合には、Visual C++ Build ToolsとC++再配布可能パッケージの二つをインストールしておく必要があります。こちら(http://landinghub.visualstudio.com/visual-cpp-build-tools)とこちら(https://www.microsoft.com/ja-JP/download/details.aspx?id=48145)から、無償でダウンロードできますので、インストールしましょう。

Rustのインストールページ [URL] https://www.rust-lang.org/ja-JP/install.html

インストーラーを実行すると、コマンドプロンプトの画面が表示されます。そこで、[1]キーと[Enter]キーを押します。するとRustの最新版がダウンロードされます。

  • Rustのインストーラーを実行したところ

    Rustのインストーラーを実行したところ

【macOSの場合】

macOSで上記のWebサイトにアクセスすると、インストールを行うためのシェルコマンドが表示されます。それは、以下のようなものです。そこで、「ターミナル.app」を起動し、以下のコマンドを入力したら[Enter]キーを押します。するとRustの最新版のダウンロードおよびインストールが行われます。

 curl https://sh.rustup.rs -sSf | sh

Hello, Worldを書いてみよう

どんなプログラミング言語でも、最初に学ぶのは「Hello, World!」と表示するプログラムからです。Rustでは、以下のように書きます。

 fn main() {
     println!("Hello, World!");
 }

上記のプログラムを、テキストエディタに貼り付けて「hello.rs」という名前で保存しましょう。Rustはコンパイル言語なので、ソースコードを一度、実行ファイルにコンパイルして、それを実行ファイルを実行します。実行ファイルに変換するには、以下のようにして、 rustcコマンドを実行します。コマンドを実行するには、WindowsならコマンドプロンプトかPowerShell、macOSならターミナル.appを使います。

 rustc hello.rs

そして、コンパイルが完了したら、以下のコマンドを実行します。

 # Windowsの場合
 .\hello


 # macOS/Linuxの場合
 ./hello

すると、「Hello, World!」と表示されます。プログラムを確認してみましょう。

このプログラムを見ると、Rustについて基本的なことが分かります。まず、Rustでは、メイン関数「main()」を定義します。そして、その関数内に書いたプログラムが実行されます。関数を定義するには「fn 関数名(引数) { ... }」のように記述します。そして、文字列を出力するには、println!()を利用します。println!は、文字列を出力するマクロです。マクロは名前の末尾に「!」をつけることになっています。

FizzBuzz問題を解いてみよう

続いて、FizzBuzz問題を解いてみましょう。FizzBuzz問題は次のようなものです。

1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。 FizzBuzz問題の解法は、いろいろありますので、以下はその解法の一つです。以下のプログラムを「fizzbuzz.rs」という名前で保存しましょう。

 fn main() {
     let maxv = 100; // --- (*1)変数の宣言
     for n in 1 .. (maxv + 1) { // --- (*2)繰り返し構文
         fizzbuzz(n);
     }
 }
 fn fizzbuzz(n:i32) {
     //  条件分岐構文 --- (*3)
     if (n % 3 == 0) && (n % 5 == 0) {
         println!("fizzbuzz");
     } else if n % 3 == 0 {
         println!("fizz");
     } else if n % 5 == 0 {
         println!("buzz");
     } else {
         println!("{}", n.to_string());
     }
 }

このプログラムを実行するためには、以下のようなコマンドを記述します。

 # コンパイル
 rustc fizzbuzz.rs



 # プログラムを実行(Windows)
 .\fizzbuzz



 # プログラムを実行(macOS/Linux)
 ./fizzbuzz
  • FizzBuzz問題のプログラムを実行したところ

    FizzBuzz問題のプログラムを実行したところ

FizzBuzz問題を解くには、条件分岐や繰り返し構文を利用します。そのため、基本的な制御構文を確認できます。プログラムの(*1)の部分では、変数の宣言を行います。(*2)の部分では、回数を指定したfor構文を記述します。(*3)の部分では、条件分岐構文を記述しています。

さて、ここで冷静にこのプログラムを見てみると、Rustがコンパイル言語であることを忘れてしまいそうになります。その大きな理由がRustの型推論の機能です。プログラムの(*1)の部分を見ると、変数定義に「let」を指定します。もし、明示的に型を指定する場合には「let 変数名:変数型」のように定義するのですが、自動的に推論します。

モダンな言語機能を備えるRust

Rustは現代的なプログラミング言語です。先ほど紹介した型推論をはじめ、パターンマッチング、クロージャやタプル、トレイト・ジェネリクスなど、モダンな言語に備わっている便利な機能がたくさん備わっています。

コンパイル言語でありながら、スクリプト言語のような柔軟な記述ができるのが大きなメリットです。他にも、ガベージコレクション(GC)を利用しない安全なメモリ管理の機能や、マルチスレッドを利用してもデータ競合が起きない仕組みなどがあります。

まとめ

以上、今回は、簡単ながら具体的なRustのプログラムを動かして、Rustの雰囲気を確かめてみました。コンパイル言語でありながらも、手軽にプログラムを作ることができることが、分かったのではないでしょうか。

Rustを使えば、システムプログラムを作成できます。システムプログラムの代表例は、OSやデータベース、プログラミング言語など、さまざまなアプリの基盤システムとなるプログラムです。これまで、こうしたシステムプログラムを作るには、もっぱらC/C++言語が使われてきました。しかし、Rustを使えば、C言語の置き換えとなるような用途で使うことができます。そして、何より、Firefoxのような高度なアプリを開発できることが、Rustの実力を証明しています。今後も、Rustの動向を楽しみにしたいと思います。