プログラミング言語 比較鳥瞰図

世界には様々なプログラミング言語があります。 どのようなプログラミング言語を選択するかについて悩まる方も多いですから、参考にそれぞれのプログラミング言語らしいコード片を掲載してみました。

「職業的/生産的に使用されることの多い言語」を選択基準としました。

また、コード片については私がすぐに書けないものについては品質上の理由からOSSやドキュメントからの抜粋とさせていただいております。 今後のアップデートで私が記述したものに変更される可能性があります。

抜粋したものについては元となるプロジェクトを記載しています。

スクリプト言語

Perl5

1987年という古い生まれのスクリプト言語で、特にテキスト処理を得意とします。 現代で普及する強力な正規表現の祖でもあります。

テキストを加工したり、ファイルを操作したりといった日常的な作業はお手の物で、非常に高い生産力が特徴です。

自由度の高さから生まれる生産力は、「自由を読みやすいコードを記述することに使わない限り」読みづらいコードを生産するという欠点にもなり、 Perlで大規模なプログラムを開発したり、コードを保守したりすることに苦痛を伴うことが多々あります。

スクリプト言語としては中庸な実行速度ですが、超高速実行を可能とするSPVMが登場し、限定的ながら科学的なプログラムを高い生産性を持つPerlで記述することが可能になります。

Perlはコマンドラインの-n及び-pオプションによって標準入力を一行ずつ読み込んで処理するSedのような処理を行うことができます。 これを使うことでテキスト加工をより簡単に行うことができます。

次のコードは-nオプションを併用し、YAML形式のデータベースから名前 (ふりがな)形式に変換します。

if (/^\s*name: (.*)/) { $name = $1; }
if (/^\s*nameruby: (.*)/) { print "$name ($1)\n"; }

短いコードであればPerlは書きやすく、余計な要素も少ないため学習に適します。

my $name;
my @now = localtime;
my $thisyear = $now[5] + 1900;
while (<>) {
  print "こんにちは $_\n";
  print "おいくつですか?: "
  while (my $age = <>) {
    if $age =~ /^\d*$/ {
      my $birthyear = $thisyear - $age;
      my $birthnext = $birthyear + 1;
      print "$birthyear もしくは $birthnext 生まれですね\n"
      last;
    } else {
      print "ごまかさないでくださいよぅ\n";
    }
  }
}

Perlの厳しい点として、C言語のポインタとした、変数へのリファレンスを直接に取り扱うという特徴があります。 Cのポインタのようにメモリアドレスではなく、抽象化したものを扱うとはいえ、それによって何かが楽になるわけでもなく、「変数とはなんであるか」を強烈に意識させられる言語でもあります。

Perl6

Perl6は従来のPerlとは全く互換性のない新しい言語です。

正規表現に変えて「ルール」を採用、整理されたクラスベースのオブジェクト指向のほか、現代的な機能が搭載されています。

依然としてテキスト処理が得意ですが、大規模アプリケーション開発にも対応可能な言語として進化しました。 一方、Perl5ほど簡素なプログラムを書くことは難しくなり互換性もないことから依然としてPerl5は併存しています。

use v6;

my $char = 'a';
my $num  = $char.ord;
say $num;
my $char2 = $num.chr;
say $char2;
my $copyright = '©';
say $copyright ~ " : " ~ $copyright.ord ~ " : " ~ $copyright.ord.chr;

$char = 'foo';
# ords returns the codepoints of all char in a string
say $char ~ " : " ~ $char.ords;

(from Perl6 Examples)

Python

世界的には人気の高いスクリプト言語。 オブジェクト指向で、記述量も少なく高い生産性を持ちます。

特徴的なのは英語的かつ厳格な文法です。 文法の制約が非常に厳しく、書き方が固定されています。 これは意図的なものであり、「書き方を強制することで学習量を減らし、読みやすいコードを書かせる」ということです。

単純化されているという意味では確かに楽ですが、PerlやRubyの感覚からすればほんのちょっとした(一見意味のなさそうな)違いでより多く怒られることになるため、 ひどくしんどいという面もあります。

ループは至って英語的なイテレータを持ちます。

fruits = ["grape", "plum", "raspberry", "durian"]
for fruit in fruits:
    print fruit

ブロックは始端・終端を示すワードや記号がなく、インデントによって表現します。 つまり、「先頭にいくつスペースがあるか」が同じである行は同一のブロックに属するとみなします。

Pythonは大規模なプロジェクトなどにおいて、速度を犠牲に生産性を追求する選択として用いられます。 JavaやCなどのプロジェクトにおいて開発コストが高く実行速度をそれほど求めない部分などにのみPythonを採用するといったケースもあります。 GUIプログラムもよく作られるのも特徴的です。

def add_entry(self, category, entry, undoing=False):
    self.add_category(category)

    category_iter = self._get_category_iter(category)

    entry_pango = markup.convert_to_pango(entry)
    category_pango = markup.convert_to_pango(category)

    # If category exists add entry to existing category, else add new category
    if category_iter is None:
        category_iter = self.tree_store.append(None, [category_pango])

    # Only add entry if there is one
    if entry_pango:
        self.tree_store.append(category_iter, [entry_pango])

    if not undoing:
        def undo_func():
            self.delete_node(self.find_iter(category, entry), undoing=True)

        def redo_func():
            self.add_entry(category, entry, undoing=True)

        action = undo.Action(undo_func, redo_func)
        self.undo_redo_manager.add_action(action)

    self.tree_view.expand_all()

(From Rednotebook)

Ruby

Rubyはオブジェクト指向スクリプト言語です。 Perl, Pythonよりも後発で、プログラミング言語マニアでもあるまつもとゆきひろ氏が、様々な言語を研究、吟味した上で取り込んでいます。

様々な分野で使用され、職業スキルとしてはWebアプリケーション・フレームワークを使用しての開発(特にRuby on Rails)が最もよく求められます。 Web分野での利用が多い印象ですが、生産性を向上させるプログラムにおいてもよく使用されます。 また、ゲームにおいて使用されることもあります。

言語仕様は自由度が高く、それでいながら自然と可読性の高いコードになるという特徴があります。 科学計算やGUIプログラミングはあまり得意ではありませんが、不可能ではありません。 扱いやすくストレスが少ない、そして余計なことを記述せずに済むため自分のしたいことに集中できるという「楽しいプログラミング言語」がその理念にあります。

開発速度を重視した結果、「非常に遅い実行速度」で有名でしたが、バージョンが上がるごとに何倍というレベルで高速化され、そのような欠点も大幅に改善されました。

class Piano < Instrument
  def initialize(maker, model)
    @maker, @model = maker, model.to_s
  end
end

my_piano = Piano.new(:Steinberg, "IQ16")

また、eRubyという非常に強力なテンプレートエンジンを持つことも特徴です。 例えば次の例では<% ... %>で囲まれたRubyコードにFooという文字列が挟まれています。また、Fooのあとには<%= ... %>という形でRubyコードの置き換えが実行されています。

<% ["A", "B", "C"].each do |i| %>
Foo<%= i %>
<% end %>

結果は次のようになります。

FooA
FooB
FooC

PHP

PHPはもともとはウェブページに動的な要素を追加するために誕生しました。これは、かつて利用されていたSSIと呼ばれるものに近いものです。 言語仕様は小さく、単純な機能しかありませんでした。 ウェブページの中のちょっとした動的要素に対して複雑なロジックを記述できる必要はなかったのです。

しかし、実際にはCGIに代わる新しいウェブアプリケーションのアプローチとしてもてはやされた結果、その理念を離れ一人前のプログラミング言語としての機能が求められました。 つぎはぎとなり、複雑化したにもかかわらず決して使いやすくない機能郡は、まるでPerlが辿った悲劇をなぞるかのようでした。

PHPの人気が落ち着いたPHP6からは徐々に整理され、言語としての品質も改善していますが、依然として互換性のために書きづらさ、使いづらさを残しています。

次のコードはPHPを使って昔ながらのカウンタ機能を実現します。

<body>
  <p>あなたは<?php

$count = file_get_contents('./counter');
$count++;

$fp = fopen('./counter');

if ($fp) {
  if (flock($fp, LOCK_EX)) {
    fwrite($fp,  $count);
    flock($fp, LOCK_UN);
  }
}

echo $count;
  ?>番目の訪問者です。</p>
</body>

しかしこのような目的でPHPが使用されることは現代ではまずありません。 現代ではほとんどの場合、ファイル全体が<?php ... ?>で囲まれたPHPコードが使用されますし、PHPがこのようにHTMLの一部を生成する能力に優れないことから1、PHPのためのHTMLテンプレートエンジンが開発されるなど本末転倒な状況も散見されます。

public static function &getDatabaseConnection()
{
    static $instance;
    if (!isset($instance)) {
        $file = XOOPS_ROOT_PATH.'/class/database/'.XOOPS_DB_TYPE.'database.php';
        require_once $file;
        /* begin DB Layer Trapping patch */
        if (defined("XOOPS_DB_ALTERNATIVE") && class_exists(XOOPS_DB_ALTERNATIVE)) {
            $class = XOOPS_DB_ALTERNATIVE;
        } elseif (!defined('XOOPS_DB_PROXY')) {
            $class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseSafe';
        } else {
            $class = 'Xoops'.ucfirst(XOOPS_DB_TYPE).'DatabaseProxy';
        }
        $instance = new $class();
        $instance->setLogger(XoopsLogger::instance());
        $instance->setPrefix(XOOPS_DB_PREFIX);
        if (!$instance->connect()) {
            trigger_error("Unable to connect to database", E_USER_ERROR);
        }
    }
    return $instance;
}

(from Xoops Cube Legacy)

JavaScript

JavaScriptは主にウェブ環境で使用されているスクリプト言語です。 以前はLiveScriptと呼ばれており、Javaとは(ほとんど)関係がありません。

最大の特徴は処理系がウェブブラウザに内蔵されており、実行するのはそれぞれの閲覧者のウェブブラウザであるということでしょう。 このために実行環境を製作者がコントロールすることができず、「どのような処理系で実行されるかわからないので様々な処理系で動作するコードを書く」という特殊なテクニックが求められます。

また、JavaScript自体によるものではありませんが、このような環境で使用するJavaScriptは、HTMl文書の構造を取り扱うDOMの操作を伴います。 これもまた非常に独特なプログラムとなります。

var elem = document.getElementById("MultiColor")
elem.firstChild.style.color = "#ff9999"

JavaScriptはプロトタイプベースオブジェクト指向言語です。 一般的なクラスベースオブジェクト指向言語が「クラスというオブジェクトの種類があり、オブジェクトという具体的な個がある」という形をとるのに対し、 プロトタイプベースオブジェクト指向言語では「プロトタイプオブジェクトという原型となったオブジェクトがあり、そのオブジェクトで処理できないものはプロトタイプオブジェクトに転送する」というものになります。

JavaScriptはコンパクトな言語仕様ですが、非常にうまくできています。 機能不足があっても破綻はなく、使われ方が大きく変わってたにもかかわらず依然として美しいコーディングが可能です。これは非常に珍しいことです。 この成功は、プロトタイプベースオブジェクト指向言語というシンプルながら小さな言語仕様でもうまく機能する特徴と、言語機能の柔軟な取り扱い、そしてクロージャがあったことにあるでしょう。 名前空間が衝突しやすく大規模ソフトウェア開発に向かないように思われる言語仕様でも大規模なプログラムに対応できるのは優秀なクロージャの存在によるものだと言えます。

また、JavaScriptはイベントドリブンプログラミングを主体とする特徴があります。 これはウェブブラウザの操作がイベントドリブンで行われるからという文化的理由ですが、ノンブロッキングIOを自然に書けるというのはちょっとしたメリットです。

( function() {
  var elem = document.getElementById("EventObj")
  elem.addEventListener("click", function(e) {
    this.value = "CLICKED"
    e.preventDefault
  })
})()

JavaScriptはJavaとは関係がありませんが、Javaが好きな人が関わっていることからJavaっぽいところもあり2、中にはJavaっぽいコーディングを強く求める人もいます。 JavaScript界隈では影響力の強いサイ本3ではモジュールを書くとき、Javaに準じたドメインベースの非常に長い命名規則を採用しなければならないとしています。

var yokohama
if (!yokohama) yokohama = {}
if (!yokohama.mimir) = yokohama.mimir = {}
yokohama.mimir.PureDoc = {}

ただ、サイ本に書かれている書法はJavaScriptなのに強引にクラスベースのように記述しようとしているという点を含めて個人的には適切な書き方ではないと考えています。

Lua

Luaは言語仕様が小さなスクリプト言語です。 日本生まれの言語も結構珍しいのですが、こちらはブラジル生まれ。Luaという名前もポルトガル語です。

Luaの特徴として、Psacal似という現代には非常に珍しい文法に、明確なオブジェクト指向サポートはしない4など現代的なアプローチとは異なり、かなり特色があります。

Luaの公式処理系はバイトコードインタプリタ型の処理系ですが、Perl/Python/Rubyなどと比べて高速です。さらに、LuaJITという処理系はネイティブバイナリにコンパイルし、極めて高速に動作します。

LuaはMITライセンスで配布されていること、言語コアが非常に小さいこと、高速であることといった特徴から様々なソフトウェアの拡張機能としてLuaによるスクリプトをサポートします。 これは、エディタ、ゲーム、グラフィックスソフトウェア、音楽ソフトウェアなど幅広く、ユーザーが開発することも多い「拡張機能」のようなものをLuaで書くことができるようにすることで開発効率を上げ、容易に拡張できるようにしているものです。 従来はPerlやLisp, Pythonなどが使われてきましたが、今やLua一色といっていいほどの人気です。

while $req_drink = order do
  if $req_drink == "Liqueur" then
    if age < 20 then
      provide(liqueur)
    else
      reject_order
    end
  end
end

ちょっとRubyっぽい部分もあるのですが(変数にファニーキャラクターがない、ループのdo...end、条件式のif...then...else...endなど)、Rubyとは異なる部分が少なくなくて、Rubyプログラマにとってはしょっちゅう混乱をきたす言語でもあります。

Elisp

Lispという言語は1958年生まれと、現代で使われているHLL5としては2番目に古く6、「スクリプト言語」「関数型言語」「メタプログラミング」「ガベージコレクタ搭載」「動的型付け」など現代は当たり前になっているような特徴を多数持ち、「オーパーツ」7と言われることすらあります。 長く実用的な速度で動作しなかったLispですが、80年台に入りコンピュータの性能が向上すると俄然注目を集めます。現代のスクリプト言語と比べて著しく低速ということもないため、スクリプト言語の流行に伴って古代言語であるLispもまた有力な選択肢となりました。

その中でELispはEmacsに搭載されているLisp処理系による言語です。 Lispは処理系によって様々な方言があり、文法を含めて根本的に異なるものが多数あります。これはLispが「文法すらもプログラミング可能なメタプログラミング機能を持つ」ためです。

現代で広く使われているLisp方言はCommon LispあるいはSchemeですが、これらのユーザーはかなり少なく、エディタであるEmacs上での機能を実装するためにELispを使うケースが多数です。

Lispは関数型言語ですが、あまり関数型言語としての特性は強くなく、どちらかといえば実用主義的な言語です。方言のひとつであるCLOSなどはオブジェクト指向システムも持ちます。

Lispのプログラムは木構造になっており、カッコの中に空白で区切った要素を並べたものを書きます。 要素のないリスとは()またはnilと表すことができ、リストの要素がリストであってもよいため、Lispのコードは「大量のカッコで囲まれたコード」になります。

(coffee tea (juice (orange apple grape)))

Lispといえばカッコ、カッコ、ひたすらカッコ、ではあります。 そもそもLispの開発者はAI分野の人であるということもあり、人工知能ブームの中でLispが注目を集めてもいるようです。

ただし、AIはかなり実行速度も求められるため、速度が決して速くないLispが本当にAIの世界で主流になっていくのかは疑問ですけれども。

(defun my-split-window-function ()
  (interactive)
  (split-window-vertically)
  (set-window-buffer (next-window) (other-buffer)))

(global-set-key "\C-x2" 'my-split-window-function)

(from Wikipedia)

コンパイル言語

C

C言語は登場は古く、現状広く実用されている言語として最速の言語です。 より低級なFORTRANを事実上置き換え、現在のシステムプログラミングの要となっています。

Cは現代の基準で考えると非常に低級な言語で、ハードウェア的な事情に近い部分を触ることになります。 プログラミングのコストは高く、また移植性も高くありません。異なるプラットフォームへの移植を考えるならば使用するライブラリや処理系の選択は慎重に行わなくてはいけません。

また、現代的なプログラミング言語が重大なバグになる「本来意図しないはずの書き方」を制限しているのに対し、Cはそれを制限しません。これによって些細なミスで簡単に重大な脆弱性を含むプログラムを作り出すことができてしまいます。

メモリの確保や解放もプログラマの手によって行い、管理しなくてはいけません。 考えなければならない要素は格段に多くなります。

それではC言語の魅力はどこにあるのでしょうか? 答えは第一に速度、そして低層に関する記述が容易に可能なことです。 OSの基本的なライブラリはC言語のものであることが多く、OSに直接関係のあるプログラムを書く上ではC言語がもっとも有力な選択肢です。

C言語向けの強力なライブラリに助けられるものの、クロージャがないなど抽象化を高めたプログラミングには困難を伴う要素が多数あります。人間よりもコンピュータ、と言うこともできますが、それよりも「開発よりも実行」の言語であると言えます。

OSやハードウェア関連、ロボットなどのプログラミングに関心があるのであればCが良いでしょう。

#include <stdio.h>

int vernalEquinox(int y);
int autumnalEquinox(int y);
void setVernalEquinoxTable(char table[2][25]);
void setAutumnalEquinoxTable(char table[][25]);
void printEquinoxTable(char (*table)[25]);

int main(int argc, char *argv[])
{
        char equinox[2][25];
        setVernalEquinoxTable(equinox);
        setAutumnalEquinoxTable(equinox);
        printEquinoxTable(equinox);
        return 0;
}

C言語は仕様と処理系が別々に存在し、かつ各処理系は単に仕様に従っているわけではなく様々な拡張を施し、多数のライブラリと共に配布しています。 そのため、基本的にC言語のソースコードはプラットフォーム依存+処理系依存の傾向があります。 この点も学習においては困難性を伴い、さらに開発時も頭痛の種になることでしょう。

(from c-lang.org)

C++

C++はCにオブジェクト指向言語のSimulaを混ぜた言語です。 C++はC言語と互換の記述も可能で、「よりよいC」として扱うこともできます。C言語のソースコードを拡張してC++のソースコードにすることだってできるのです。

C++は実はあまり人気のない言語です。 理由は明らかではありませんが、多くは語られないものの、実力のあるCプログラマがC++を邪悪なものとみなすことすらあります。 言語仕様の変更、APIの変更、非互換の変更やメモリ管理がCよりもさらに難しい、といった点が主な理由であるようには思えます。

また、アプリケーション開発という点でみればJavaなど後発の言語のほうがより効率的に適切に開発することができるために、C++で開発するメリットに乏しく、C++の高速性を求めるとC++の難しさが顔を出す、ということでしょう。

しかし、大規模なプロジェクトにも数多く採用されています。 主要なGUIツールキットであるQtはC++で書かれており、インターフェイスもC++です。 また、Chromium/Google ChromeもC++です。

MainWindow::MainWindow()
    : textEdit(new QPlainTextEdit)
{
    setCentralWidget(textEdit);

    createActions();
    createStatusBar();

    readSettings();

    connect(textEdit->document(), &QTextDocument::contentsChanged,
            this, &MainWindow::documentWasModified);

#ifndef QT_NO_SESSIONMANAGER
    QGuiApplication::setFallbackSessionManagementEnabled(false);
    connect(qApp, &QGuiApplication::commitDataRequest,
            this, &MainWindow::commitData);
#endif

    setCurrentFile(QString());
    setUnifiedTitleAndToolBarOnMac(true);
}

(from Qt Documentation)

Java

IT業界と言えばJava、という状況があります。

ウェブアプリケーションの分野でかなり大きなシェアを占め、IT業界で大きな勢力となっているウェブ開発企業でのJava率が高いことと、AndroidがJavaをベースにしたアプリケーション環境であることからIT業界2大分野でJavaが使われる状況を反映したものでしょう。

Javaはオブジェクト指向言語で、C++などと比べて楽にかける開発効率の良い言語です。 メモリ管理を自分でしなくて良いガベージコレクタを搭載し、C++などから乗り換えて開発が楽になったという人も少なくありません。

Javaはコンパイル時に機械語コードではなく、Javaバイトコードに変換します。 JavaバイトコードはJavaVMというプログラム上で動作します。このためマシンごとの差はJavaVM側で埋めることができ、コンパイル済みのJavaバイトコードを配布すればWindowsでもMacでもUnixでも動作させることができます8。 このためにJavaは低速な言語の代表格でしたが、現在はJITコンパイラという機能も搭載したこともあり、C/C++に次ぐ高速性を誇ります。

さらに、JavaディストーションにGUIツールキットが含まれ、容易にOSに依存しないGUIアプリケーションを記述することができます。

一方、バージョンごとの非互換性や、それに伴ってJavaのバージョンを上げられないアプリケーションなど、問題点も多数あります。 また、Javaは文化的理由も含めて名前が非常に長い傾向があり、ソースコードにおける文字のタイプ量が膨大になりがち、さらに名前だけでなく文法も含めて「冗長でめんどくさい」という問題があります。これは、嫌われる大きな理由のひとつです。

package com.techub.exeute;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;


public class Main{

    public static void main(String[] args) {

        JFrame frame = new JFrame("FrameDemo");
        frame.setMinimumSize(new Dimension(800, 400));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JLabel myLabel = new JLabel("Hello World !!!", SwingConstants.CENTER);
        myLabel.setFont(new Font("Serif", Font.BOLD, 22));
        myLabel.setBackground(Color.blue);
        myLabel.setOpaque(true);
        myLabel.setPreferredSize(new Dimension(100, 80));

        frame.getContentPane().add(myLabel, BorderLayout.NORTH);
        frame.pack();

        frame.setVisible(true);
    }
}

C#

C#は一言で言えば「Microsoft版Java」です。

Microsoftが当時のSun microsystemsに対抗して同様のコンセプトで登場させたC#ですが、Microsoft製ということもあり必然的に「Windowsのもの」となつてしまい、結果Javaにとって最大のウリであった「どのようなプラットフォームでも動く」という点を捨ててしまいました。

C#という言語は、言語仕様と処理系ディストリビューション及びランタイムライブラリである.NETという名称と深く関わりがあります。

Microsoft自身はC#の仕様をオープンにしていましたが、積極的に支援することもありませんでした。 紆余曲折あり、現在はMicrosoftが積極的に.NET CoreをLinux上で利用することを支援していますが、現在もC#で書かれたアプリケーションはWindowsのネイティブライブラリであるWin32 APIなどを使用するものが圧倒的に多く、C#アプリケーションの大部分はWindowsでしか動作しません。

このため、現実的にはC#は「CやC++よりも楽にWindowsアプリを作れる言語」となっています。

private void insertText_Click(object sender, EventArgs e)
{
    this.displayText.Text += "Hello World!";
}

(From MSDN)

Swift

SwiftはAppleがMac OS/iOSのアプリケーションのネイティブ言語として提供するものです。

Appleは従来はObjective-Cという言語を採用してきました。 これは、CにSmalltalkを混ぜたものですが、非常にできの悪い言語として酷評されてきたものです。 これに耐えかねたAppleは独自の言語をデザインし、提供することに決めました。これがSwiftです。

SwiftはあくまでAppleアプリケーションのための言語です。 あなたが書いたプログラムが、わずかでも他のプラットフォーム(たとえばWindows, Linux, Android e.t.c.)で動作する可能性を期待するのであればSwiftを選択すべきではありません。 逆にあなたがAppleに身も心も捧げる覚悟であるならばSwift以外を選択する理由はないでしょう。

ただし、あなたがこのような逆風に逆らう覚悟があるならば別の見方もできます。 Swiftは新しい言語だけにすっきりと書きやすい言語でもあります。 実用にはほど遠いレベルでの話ですが、Swiftで書かれたコードをLinuxで動作させることもできます。サンプルコードすら動きませんが。

var explicitDouble:Double = 70 // 70.0

var implicitInteger = 70    // Int
var implicitDouble = 70.0   // Double

let theAnswer = 42

let リンゴの数 = 3
let みかんの数 = 5

let リンゴ説明 = "私は\(リンゴの数)個のリンゴを持っている。"  // "私は3個のリンゴを持っている。"
let 果物説明 = "私は\(リンゴの数 + みかんの数)個の果物を持っている。" //"私は8個の果物を持っている。"

let people = ["Anna": 67, "Bety": 8, "Jack": 33, "Sam": 25]

for (name, age) in people {
    print("\(name) is \(age) years old.")
}

func sayHello(personName: String) -> String {
    let greeting = "こんにちは、" + personName + "さん"
    return greeting
}
print(sayHello("サーバー"))

(From Wikipedia)

Go

GoはGoogleが開発するプログラミング言語です。 Swiftのようにアプリケーション開発言語として提供しているわけではなく、Googleがアプリケーションを開発する上でPythonよりも高速でCよりも容易な言語として使用しているものです。

現在はLinux, Mac OS X, Windows, Android, iOSのクロスプラットフォームとなっています。

Goの大きな特徴として「並列処理が得意」ということがあります。 今の時代、CPUは複数のコアを持っていますが、これを活用する並列実行は実行される順番を確定することができなくなるため難しい処理になります。 GoにはGoroutineという並列処理機能があり、これに基づいた処理を記述するのが基本となっています。

言語仕様を小さくまとめようとした影響もあるでしょうが、Pascal, Ada, Limbo, CSPなど影響を受けた言語が少々変わっていて、そのために文法や語彙などもちょっと特殊です。

Goを仕事で使用するというケースは少ないでしょうが、趣味やOSSでの利用は増えています。

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    for i := 0; i < 5; i++ {
        time.Sleep(100 * time.Millisecond)
        fmt.Println(s)
    }
}

func main() {
    go say("world")
    say("hello")
}

(From golang チュートリアル)

Haskell

関数型言語で現在人気があるのがHaskellです。 一時期はOCamlの人気が高かったのですが、現在はHaskell全盛のようです。

関数型言語は数学的に「式によって定義され証明される」ということを基本としたコードになります。 変数の破壊的変更がなく、副作用がない、といった特徴もありますが、私自身が数学が苦手で関数型言語に長けていないのであまり上手に説明することができませんし、そもそも私はHaskellのコードを書くことができません。

副作用がないために並列実行のハードルが低く、そのため並列実行を行うコードを書きやすいという特徴があります。 これが決して新しくないHaskellが現在注目を浴びている理由でしょう。

数学的なプログラムや科学計算の分野でよく使用されています。 ライブラリも充実しており、馴染める人にとっては強力な言語となるようです。

import Network.HTTP.Conduit
import Control.Monad.IO.Class (liftIO)

main = withManager $ \manager -> do
    request <- parseUrl "http://www.winsoft.sk"
    liftIO $ print request
    response <- httpLbs request manager
    liftIO $ print response

(From School of Haskell)

COBOL

COBOLも1959年誕生と、また古いプログラミング言語です。 そして、古くから忌み嫌われていた言語でもあります。

COBOLが登場したのはまだコンピュータといえば専用の部屋を埋め尽くす巨大なメインフレームの時代。そのメインフレーム用のプログラミング言語として登場しました。

COBOLはいくつかある、「英語風の見た目を持つプログラミング言語」です。 このようなアプローチはEnglish9をはじめPascalやSQLなどずっと繰り返されてきたものでもあります。 これは、「英語に近いものならばエンジニアでない人でもプログラムが書けるはずだ」という間違った考えによって生み出され10、それを重大な過ちと知りながら繰り返し続けています。

COBOLは80年代には既にその冗長さと不自由さ、「帳票を元にして考える」という苦痛から嫌悪の対象となっていました。「コボル」や「コボラー」という言葉は、嫌悪や軽蔑、侮蔑や嘲りを込めて発音される場合も多々あります。

「データを右から左に移すような処理では最速かつ最も簡単」がCOBOLの定番フレーズ。実際、COBOLの処理は帳票を想定した構造になっており、帳票の取り扱いには長けていますが、あらゆるデータ処理において帳票を想定した構造にしなくてはいけないという欠点があります。

現在使用されている場所はほとんど銀行のシステム(勘定系と呼ばれるもの)です。 これは、COBOLが帳票をベースにしていることと、勘定系システムの多くはメインフレームで動作していることと関係があります。

COBOLerは決して少なくはありませんが、その多くは高齢で、若いCOBOLerは非常に希少です。 金融分野ではCOBOLが依然として使われている状況から、「若いCOBOLerの確保」は重要な課題であり、若い人にとっては「COBOLを十分なレベルで習得すればきっと仕事につながる」という希望を持つことができます。

ただし、苦痛で忌み嫌われているものであり、かつ将来性に乏しいものであることは考慮する必要があるでしょう。 次はFizzBuzzプログラム11です。

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. FIZZBUZZ.
000300 DATA DIVISION.
000400 WORKING-STORAGE SECTION.
000500 01 I                                PIC 9(3).
000600 01 HENSHU-IKI                       PIC X(4).
000700 01 HENSHU-NUM REDEFINES HENSHU-IKI  PIC BZZ9.
000800 01 DUMMY-IKI                        PIC X(1).
000900 PROCEDURE DIVISION.
001000     PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
001100       EVALUATE FUNCTION MOD(I 3) = ZERO
001200           ALSO FUNCTION MOD(I 5) = ZERO
001300       WHEN TRUE  ALSO TRUE
001400         DISPLAY 'FIZZBUZZ'
001500       WHEN TRUE  ALSO FALSE
001600         DISPLAY 'FIZZ'
001700       WHEN FALSE ALSO TRUE
001800         DISPLAY 'BUZZ'
001900       WHEN OTHER
002000         MOVE I TO HENSHU-NUM
002100         UNSTRING
002200           HENSHU-IKI DELIMITED BY ALL SPACE
002300           INTO DUMMY-IKI HENSHU-IKI
002400         END-UNSTRING
002500         DISPLAY HENSHU-IKI
002600       END-EVALUATE
002700     END-PERFORM.
002800     STOP RUN.

  1. PHPはPHPのループの中にHTML要素を挟んでHTML要素を繰り返し出力するような(eRubyのような)ことはできません。↩︎

  2. 例えば小文字ではじめるキャメルケース(addEventListener)とか↩︎

  3. Rhino Book. オライリーから刊行されている “JavaScript” のことです。↩︎

  4. なんとなくオブジェクト指向っぽいことはできます。昔のPHPやPerlのようですね。↩︎

  5. 高水準プログラミング言語。機械寄りではないプログラミング言語。↩︎

  6. 最古はFortranですが、Fortranを「広汎に使われている」と言っていいのかどうかは疑問です。↩︎

  7. その時代には明らかにそぐわないもの。その時代の技術や知識や文化からは逸脱して時代を未来方向に錯誤してしまっているもの。↩︎

  8. ただし、それは理想世界のお話で、実際はうまくいかないことが多々あります。↩︎

  9. Pick Operating Systemで使用されていたSQLの亜種です。↩︎

  10. 実際はプログラミングの難しさはロジックを組み立てることであって、文法を綴ることではありません。日本語が使えるからといって優れた小説が書けるわけではないのと同じです。↩︎

  11. 1から順にカウントしていき、3で割り切れる場合はFizz, 5で割り切れる場合はBuzz, 15で割り切れる場合はFizzBuzzと言います。↩︎