イミュータブル 【immutable】
概要
イミュータブル(immutable)とは、不変の、変更不能な、という意味の英単語。「ミュータブル」(mutable)に「不~」などの意味を持つ接頭辞 “im-”を加えた対義語。IT分野では、コンピュータプログラム中に登場するオブジェクトなどが作成後に状態を変更できないことなどをこのように呼ぶ。プログラムにおけるイミュータブル
プログラミングの分野でイミュータブルとは、プログラム中に登場する変数やコレクション(配列など)、オブジェクトなどが、作成後に状態を変更できないことを言う。逆に、後から変更可能なものはミュータブルであるという。
これは、定数と変数の違いのように、変数の値を後から変更、再代入できないという意味ではなく、プログラムが実行時に確保したメモリ領域の内容が書き換え可能か、不可能かを表している。言語仕様上、変数などがどのように実装されているかの問題で、ソースコードにおける振る舞いだけではどちらなのか判別できない。
例えば、JavaではString型の変数はイミュータブルだが、「String s = "Hello World!";」のように宣言した後、「s = "Goobye World!";」のように代入することができ、代入後の値は "Goobye World!" となっている。
このとき、最初の宣言時にはメモリ上のヒープ領域に "Hello World!" というインスタンスが作成され、変数sはその位置を指し示しているが、代入時には新たに "Goobye World!" というインスタンスが作成され、sはそちらを指すように参照先が変更される。どこからも参照されなくなった "Hello World!" は次のガーベジコレクションによって破棄されてメモリ領域は解放される。
イミュータブルインフラストラクチャ
サーバ環境などのITインフラの構成法の一つで、一度構築した環境には変更を加えず、変更が必要な場合は変更済みの新しい環境を構築し直して入れ替える方式を「イミュータブルインフラストラクチャ」(immutable infrastructure)という。
すでに稼働しているシステムにソフトウェアのセキュリティ更新などを行う場合、従来は一台ずつサーバを停止ないしは切り離して更新作業を行い、システムに復帰させるといった方法で、現用系自体を更新していく方式が一般的だった。
イミュータブルインフラの考え方では、更新を適用したサーバ環境を新たに構築し直してテストなどを行い、現用系と同じように動作することを検証した上で、現用系から一気に切り替えを行う。アプリケーションデータなどは環境そのものからは切り離して保存し、すぐに更新系で利用できるようにしておく。
こうした全体の再構築や切り替えは従来のIT環境では高コストで実現しにくかったが、クラウドサービスの普及で物理的なサーバを多数用意しなくても新旧の切り替え、入れ替えが低コストで実現できるようになり、環境構築や更新もIaC(Infrastructure as Code)ツールなどで自動化、省力化が可能となった。