SSブログ

言語仕様とメモリモデル [プログラマー現役続行]

『Effective Java 第3版』の第11章「並行性」(あるいは、第2版の第10章「並行性」)を内容を理解するためには、Javaのメモリモデル(memory model)を理解する必要があります。『Effective Java 第3版』の翻訳原稿による補講でも「メモリモデルとは何か」という質問がありました。

マルチコアやマルチプロセッサを前提としてマルチスレッドプログラミングを言語仕様として提供する言語では、メモリモデルは言語仕様の一部とも言えます。Javaであれば、『The Java Language Specification』の17.4節の「Memory Model」、あるいは、『プログラミング言語Java第4版』の14.10節 「メモリモデル:同期とvolatile」に書かれています。それぞれ、22ページと5ページを費やして解説しています。

今日、マルチコアやマルチプロセッサを前提とした言語は、Javaだけではありません。たとえば、Go言語ではゴルーチン(goroutine)に関してのメモリモデルが、言語仕様であるThe Go Programming Language Specificationとは独立したThe Go Memory Modelとして定義されています。私自身は、C++でのプログラミングから離れてから久しいのですが、C++でもマルチスレッドプログラミングのサポートに伴いメモリモデルが定義されています。
※ 『プログラミング言語Go』では、「メモリモデル」という表現は使っていませんが、「happens before」関係に関しては、「8.4.1 バッファなしチャネル」、「9.1 競合状態」、「9.4 メモリの同期」で述べられています。

以前の記事「マルチスレッドプログラミングにおける重要な4要件」で述べた一番目の要件「きちんとしたレビュー」では、「マルチコアやマルチスレッドプログラミングのきちんとした経験および知識を持つ人が設計やコードをレビューしていること」と述べてします。ここでの「知識」には当然「メモリモデル」も含まれます。

JaSST Tokyo 2018の招待講演では、デジタル複合機のコントローラソフトウェア開発を4回行った経験に基づいて話をしたのですが、振り返ってみると、そのような開発に従事したからこそ、マルチスレッドプログラミングでの開発を経験できたと言えます。それらの開発は、C++もしくはGoによる開発でしたが、マルチスレッドプログラミングに関わる様々な問題(もしくは、ゴルーチンにとチャネルによる様々な問題)に直面し、デバッグを経験することで多くの知識と経験を得ることができました。

株式会社メルペイでbackend engineerとして働き始めて3か月が経過しましたが、(私のバックエンドの開発経験がまだ少ないからかもしれませんが)ウェブシステムでのバックエンド開発では、上記の一番目の要件を満足できるような開発経験を積むのは困難なのかなと感じ始めています。Go言語で開発していますが、メモリモデルを理解しないといけないようなプログラミングはほとんどしないので・・・私が今から経験する必要はないのですが、今の若い人達はいつ経験して知識を得るのだろうかと。

コメント(0) 

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント