書いて覚えるSwift入門

第37回 型進化論

この記事を読むのに必要な時間:およそ 4 分

型とは何か?

今回は型(type)の話をします。漢字の「型」だけみると,プログラミングに限定しても「モデル」⁠model)だったり「キャスト」⁠cast)だったりどの「型」なのか定まりませんが,本記事における「型」はデータ型(data type)を指します。

型がなければ意味がない

およそどんなプログラミング言語にも登場するこの型という概念ですが,まだプログラムを知らない子供に「型ってなあに」と問われたら読者のみなさんならどう答えますか?

筆者はこう答えます。⁠値(value)の意味(meaning)⁠と。

Software Designの読者であれば100%ご存じのとおり,計算機が扱えるのは0と1からなる二進数の羅列だけです。ここであえて計算機と言ったのは,現代人にとっての「コンピュータ」は計算装置だけではなく,キーボード,マウス,マイクロフォン,タッチパネルといった入力装置,ディスプレイ,スピーカ,プリンタといった出力装置,Ethernet やWi-fi やLTE といった通信装置までまとめたものだから。しかしそういった装置を我々プログラマは直接操作できません。できるのは0 と1の羅列を別の0と1の羅列に変えるだけです。ここで32個の0と1の羅列をご覧いただきましょう。

01100011011011110110010001100101

これが何を意味するか,わかる読者はいらっしゃいますか?

フラグが32個並んでるだけかもしれませんし,整数の1668244581かもしれませんし,アドレス0x636f6465を指すポインタかもしれませんし,単精度浮動小数点の6.74221425242669e+22のことかもしれませんし,ASCII文字列のcodeのことかもしれませんし,色指定のrgba(99,111, 100, 0.39453125)のことかもしれません……。

つまり,わかるわけありませんよね? 型がわからなければ。コンピュータがただの計算機から万能情報処理機になれたのも,型の賜物(たまもの)⁠ただの数値の羅列に文字どおり意味を与えるのが型なのです。

型はイイが型付けはイタい

コンピュータに意味ある仕事をさせるのがプログラマの仕事なのですから,ほとんどのプログラミング言語はvaluetypeを持たせています。しかしそのやり方はプログラミング言語ごとに異なります。筆者の見解では,プログラミング言語による差異が最も顕著なのがこの型の扱いです。

主な言語をざっと見てみると,二進数で10通りのやり方が存在します。型を必ず書かねばならない言語とそうでない言語。Javaは前者の代表的言語です。言わずと知れた⁠Hello,world!⁠を出力するプログラムはこんな感じ。

public class Hello {
    public static void main(String[] args){
        System.out.println("Hello, world!");
    }
}

型を指定しているpublic classも,public static voidも,mainの括弧のなかにあるString[]も省けません。そしてソースコードの名前はHello.javaでなければなりません。そして動かすにはTerminal.appから,

% javac Hello.java
% java Hello

とします。⁠Hello, world!⁠と出てきましたか?

ずいぶん面倒ですが,一度javacしたら次回以降はjava Helloだけで実行できます。Hello.javaをゴミ箱にポイしてもjava Helloで実行できます。lsしてみるとHello.classというファイルができています。これをJavaがインストールされた別のコンピュータにそのままアップロードしたうえでjava Helloと命じるとやはりそのまま動きます。まさにWrite once, run everywhereなわけです。

そして書かなくてもいいプログラミング言語として,JavaScript注1もといECMAScriptが挙げられます。⁠Hello, world!⁠であれば,

console.log("Hello, world!");

とたった1行。動かす方法はいくつもあるのですが,ここではnode.jsを使うとして,

% node hello.js

javajavac相当は不要です。これくらい短いとソースコードすらファイルに落とさずとも,

% node -e 'console.log("Hello, world!");'

で動いてしまいます。紙幅制限ゆえ,ここではJavaとJa……ECMAScriptだけを取り上げますが,

  • ソースコードとは別の実行用ファイルを出力するタイプの言語では型を明記する。CやC++がこれに相当
  • ソースコードを直接実行するタイプの言語では型を省略できる。いわゆるスクリプト言語,Perl,PHP,Python,Rubyがこれに相当

という大まかな傾向には賢明な読者のみなさんはすでにお気づきと思います。

ここで本記事の主題であるSwiftがやっと登場します。Swiftはどっち?

ソースコードはこうです。

print("Hello, world!")

この1行をhello.swiftという名前のテキストファイルにセーブしたら,

% swift hello.swift

で実行できてしまいます。ところが,

% swiftc hello.swift

とするとhelloというファイルが生成されて,

./hello

でやはり実行できてしまいます。ただしJavaとは異なり,このファイルが実行できるのは同じOSのマシンだけで,Linuxで生成したものをmacOSにアップロードしても動きません。

つまりSwiftはスクリプト言語のように型を略記でき,スクリプト言語のように直接ソースファイルを実行できるにもかかわらず,実行ファイルexecutableを生成=コンパイルcompileすることもできるという意味で,両者のユースケース双方をカバーしようというアンビシャスな言語だということです。

注1)
JavaScriptは一般名詞ではなく,Oracle, Inc.の登録商標(USTR #2416017)とのこと。やれやれ……。

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。

コメント

コメントの記入