記事番号がプチキリ番 1271000でめでたいです!

 さて、地味なこの技術系の記事。

 インテル、ついに不揮発性のメインメモリ「Intel persistent memory」発表、実稼働デモ公開。2018年に新型Xeon「Cascade Lake」とともに登場予定

 今まで電源切っても記憶が残るのは、ハードディスクとかSSDで、なのでファイルというものを考え、保存しておきたいものはファイルにしてSSDなどにセーブしていました。

 それが大規模な不揮発性メモリができたから、これからはそれがメモリに変わるんだよという風に感じることと思います。

 が、これはそんな甘っちょろい変化ではありません。

 最近は Google Docs みたいに操作したらその都度セーブしてくれてたりとかが普通になってて、セーブなんて概念が古臭くなりつつあります。

 メモリが不揮発性になることで、内部的にもいわばそれが当たり前になります。究極、いきなり電源切っても、すべて内部状態は残っていて、もう一度電源入れれば何食わぬ顔してさっきのところから始まるわけです。

 なんてすてきなんでしょう。

 が、その世界のプログラムって、今プログラマが日々書いているプログラムの延長線上にないと思います。最初のうちはそうやって書くけど、それでは不揮発メモリを生かせないので、メモリを新しい概念で捉え直す必要があるのです。

 ここからはもう専門用語まぜて書いちゃいますけど、プログラムって起動するとメモリを確保して初期化してって、まっさらから始まります。その後、過去の情報が必要ならセーブしてあったファイルなどから呼び出して、昔の内部状態を再現していくわけです。また今時のセーブしなくてアプリだって、操作ごとになにかをセーブしていることでしょう。そして、プログラムが正常終了しようがクラッシュしようが終わってしまえば無に帰すわけです。

 しかし、そのメモリが不揮発となれば、あるべきプログラミングスタイルは、根本から変わります。

 今のプログラムは、その冒頭でメモリを確保したら、その内容はランダムか、0か、プログラマが指定したなにかの値かとかでした。

 でも、これからは違うんです。プログラムでメモリを確保したら、その中には、前回プログラムを走らせた時の最後の値が入っているという仕様に変更できるのです。

 ですから、プログラミング教本の冒頭には、 Hello world サンプルコードの次に、こんな感じのサンプルコードが紹介されることになるのです(エセc++。実際はコンバイルすらできません)。
int i;
void main() {
  cout << "今まで" << i << "回実行したよ。¥n";
  i++;
}

このソースだと真の初期化、つまり本当に最初に動かした時の動きがわかりませんが、なにかしらこれくらい簡便に、前回起動の情報が残っていることが前提の仕様になります。終わる時にいちいち変数 i の値をどこかに保存したり、開始した時にその保存した値をどこかに取りに行ったりなんて操作がなくても、昔の値がちゃんと入ってプログラムが始まるのです。

 ということは、今まではスレッド立てて、イベントくるのを待ってなんてプログラミングスタイルも変わります。イベントが発生したらプログラムが立ち上がって、処理したら終わっちゃうんです。

 PCの裏ではいろんなサービスがわんさか動いていますから、PCが重くなったら不要なサービスは消そうと言われますが、そんなサービスもすべてなくなるでしょう。リクエストがあるたび、プログラムが立ち上がり処理して終わる。ある意味昔ながらのやり方ですが、今それをすると、プログラムがまっさらから処理ができるようになるまでに大量の初期化が必要で時間がかかるようなものは、落とさずに待機させることで効率化しているのです。

 と、今はあらゆるものがメモリは消えるという大前提で組まれていて、そこが覆ると、まさにちゃぶ台ひっくり返しです。

 つまり、新しいシステムのコンセプトは言うのは簡単ですけど、まともに動かすには、OSも一体になって、プログラミング言語の仕様も根底から組み直していく必要があることでしょう。なにかしら飛躍的なアイデアがないと超えられない実装上の困難もあるかもしれません。

 しかし、メモリが不揮発になるということは、こういったことをしなければ、その真価を発揮することはできません。SSDの置き換えとして、SSDの代わりにメモリの上にファイルを書き込んで保存しましょうでは、メモリが不揮発になったことのインパクトの10分の1も使えていません。

 たとえばアプリはファイルの形でSSDなどにしまわれていますが、これからは不揮発メモリに乗せておけばいいわけで、ということはファイルの形である必要もありません。ファイルでもいいけど、効率悪すぎです。プログラムはそのまま走る形でメモリに蓄えられるでしょう。ファイルには再インストールするためのバックアップだけが残ることになります。

 一方で、この仕組みが確立すれば、プログラミングの生産性は格段に上がります。プログラムを書いているとき、プログラムがクラッシュすると、そのデバッグにとても手間取るのですが、不揮発ならどこでどうやってクラッシュしたかがわかりやすくなるし、そもそもクラッシュしないように踏ん張らせることもやりやすくなりそうです。

 エクセル落ちた〜〜〜、セーブし忘れてた〜〜〜、なんて悲劇がなくなるだけでなく、そもそもエクセルが落ちなくなるのです。

 どんな新しい言語やフレームワークが出てくるのか本当に楽しみです。

 ま、もっとも安直な発想はOSからなにからまるっとXMLデータベースにしてしまうことで、それであっさり解決するのかもしれませんが。


《ワンポイントミライ》(

ミライ: 言うの簡単ですけど、プログラムにバクがあってデータに整合性が取れなくなった時どうすんのとか、同じプログラムが複数走ったらどうすんのとか、ちょっと考えただけでも問題てんこ盛りじゃないですか?

フツクロウ: ホッホッホ。