List of Null-Safety - text.Baldanders.info
tag:text.Baldanders.info,2016-11-13:/tags
2016-11-13T05:20:11+09:00
帰ってきた「しっぽのさきっちょ」
https://text.baldanders.info/images/avatar.jpg
https://text.baldanders.info/images/avatar.jpg
「null 安全」について
tag:text.Baldanders.info,2016-11-13:/remark/2016/11/null-safety/
2016-11-12T20:20:11+00:00
2019-08-17T23:18:19+00:00
nullable 参照と non-null 参照の区別は,コードに「意図」を記述することを言語仕様レベルで規定するものである。
Spiegel
https://baldanders.info/profile/
<figure>
<blockquote>
<q>公理によって与えられる暗黙の制約。この制約が集合の要素同士をしっかり結びつける。単純にしばるのではない、相互に秩序ある関係を結ぶ。言い換えれば――公理によって与えられる制約が構造を生み出しているのだ</q>
</blockquote>
<figcaption><div><q><a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00I8AT1CM/baldandersinf-22/">数学ガール/フェルマーの最終定理</a></q>より</div></figcaption>
</figure>
<ul>
<li><a href="http://qiita.com/koher/items/e4835bd429b88809ab33">null安全でない言語は、もはやレガシー言語だ - Qiita</a></li>
<li><a href="http://qiita.com/omochimetaru/items/ee29d4c6eb0d78f02b15">null安全を誤解している人達へのメッセージ - Qiita</a></li>
</ul>
<p>「null 安全(null safety)」についての上の記事はなかなか興味深かった。
特に「<a href="http://qiita.com/omochimetaru/items/ee29d4c6eb0d78f02b15">null安全を誤解している人達へのメッセージ</a>」は事実上の FAQ になっているので是非読んでみてほしい。</p>
<p>以下は個人的なメモ。</p>
<p>「null 参照(null reference)」とは「参照が無効である」ことを示すものだ。
「null 参照」は昔から悩ましい問題である<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>。
どんなプログラムであれ「null 参照」が存在するのであれば,それを異常系としてハンドリングしなければならない。
しかし大抵の場合,「null 参照」をセットする場所と評価する場所は異なっていて,特にライブラリやフレームワークの中で「null 参照」をセットしている場合は評価されることなくスルーしてしまうことも多い。</p>
<p>オブジェクト指向以前,たとえばアセンブラや C 言語の時代では値と参照は明確に区別されているわけではなく,「それ」を値と見なすのか「参照(addressing/pointer)」と見なすのかは完全にプログラマの責任だった。
それからオブジェクト指向プログラミングが産業分野でも台頭してきたのだが,このパラダイムシフトの過程で「参照(reference)」が言語仕様レベルで意味を持つものとなった。</p>
<p>更に「null 安全」な言語では nullable (null かもしれない)参照と non-null (null を許容しない)参照を明確に区別し未評価の nullable 参照をエラーと見なす。
これは言語仕様の根幹<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> に関わるパラダイムシフトのひとつである。</p>
<p>もちろん設計<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> などで「null 参照」に起因するバグや脆弱性を回避することは重要である。
「null 参照」をいかにハンドリングするのかは相変わらずプログラマの責任なのだから。
機械がやってくれるのは nullable 参照をそのままアドホックに使いまわさないようコンパイルエラーを出すところまでだ。(ただし,そのコードがコンパイルエラーになるのなら少なくとも製品として世に出ることはない)</p>
<p>私はアセンブラや C 言語(それも K&R バージョン)が全盛のころからの(今やロートル)エンジニアだが,こうして見ていくと人と機械の責務分担が時代ごとに変わっていくのを感じる。</p>
<p>私は将来のプログラミング言語においてはコードに「意図」を記述できるようになっていくと期待している。
nullable 参照と non-null 参照の区別は,コードに「意図」を記述することを言語仕様レベルで規定するものと言える。
これまでもコンパイラヒントとしての annotation のような機能はあったが,そういったものとは質的に異なっている。</p>
<p>コードに「意図」を記述できるようになれば,それ自体が設計書になる。
最近の私は「プログラマも要求定義(開発)から参加すべき」と思っている。
参加してがんがんコードを書けばいい。
百万ページの設計書より「動くコード」のほうが価値が高い。</p>
<p>これまでもそうだったように,コードの「正しさ」を機械の側で担保してくれるならプログラマはもっと違うことに脳みそを振り分けられる。
テストを書かずに済むならそれに越したことはない。
まぁ,最終的に AI がコードを書くようになればプログラマという職業がなくなる(もしくは意味が変わる)かもだけど(笑)</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://tbd.kaitoy.xyz/2015/07/26/why-null-is-bad/">なぜNullはダメか | To Be Decided</a></li>
<li><a href="http://qiita.com/kmry2045/items/0d412a6461de70719ec4">Null安全な言語をめぐるエトセトラ その1 3種の「現場」 - Qiita</a></li>
<li><a href="http://qiita.com/takasek/items/119218a2bae2f75062c0">null安全はいいぞ。だって、型安全はいいぞ。 - Qiita</a></li>
<li><a href="http://qiita.com/koher/items/04025f0e4bba738f188c">「null安全」という訳語の背景 - Qiita</a></li>
<li><a href="https://qiita.com/omochimetaru/items/c30f7a021fb9b8f0fa92">Swiftのエラーハンドリングはなぜ最先端なのか - Qiita</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>「null 参照」による損失を10億ドルと見積もっている人もいる。(「<a href="https://en.wikipedia.org/wiki/Tony_Hoare">Tony Hoare - Wikipedia</a>」参照) <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>たとえば nullable 参照と non-null 参照を区別するのであればおそらく静的な型付けが要求されるだろうし,型を円滑にドライブするには型推論も必要かもしれない。 <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:3">
<p>たとえば安直に null をセットするのではなく null 状態を扱える適切な value object を使う(デフォルトの動作が決まっているなら null object pattern を構成する)など。そういえば <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>ではある型の値が nil でもその型に紐付く関数を参照渡しで呼び出すことができ, nil を正しくハンドリングするのは型で定義された関数側の責務となっている(「<a href="https://text.baldanders.info/golang/function-and-pointer/">関数とポインタ</a>」参照)。そういう意味でも <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>は value object を構成するのに都合がいい。なお <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>は「null 安全」ではない,残念ながら。 <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>
Kotlin に関する覚え書き
tag:text.Baldanders.info,2016-11-08:/remark/2016/11/kotlin/
2016-11-08T12:02:26+00:00
2019-07-01T13:48:09+00:00
今回は試して遊ぶ余裕がないので本当にただのメモ。
Spiegel
https://baldanders.info/profile/
<p>今回は試して遊ぶ余裕がないので本当にただのメモ。</p>
<p><a href="https://kotlinlang.org/" title="Kotlin Programming Language">Kotlin</a> は IntelliJ IDEA で有名な <a href="http://www.jetbrains.com/" title="JetBrains: Development Tools for Professionals and Teams">JetBrains</a> 社が中心となって開発が行われているオブジェクト指向のプログラミング言語だ。
研究用とかではなく明確に産業利用を目的に作られている。</p>
<p>JavaVM で動作可能なバイトコードを吐くそうで, Android アプリの開発などでもすでに実績があるようだ。
また JavaScript のコードも吐けるらしい。</p>
<p><a href="https://kotlinlang.org/" title="Kotlin Programming Language">Kotlin</a> の特徴の一つは「null 安全(null safety)」であることのようだ。
「null 安全」とは実行時にいわゆる「ぬるぽ(null pointer error or exception)<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>」が発生しない言語仕様になっていることで, <a href="https://kotlinlang.org/" title="Kotlin Programming Language">Kotlin</a> の場合はコンパイル時にチェックされる。</p>
<p>アプリケーションが「ぬるぽ」で落ちるならまだマシなほうで,最悪の場合は重大な脆弱性問題を引き起こす場合もあるため,「null 安全」という考え方は近年とくに注目されている。
そのため今どき流行りの言語では「null 安全」が取り入れられつつあるらしい<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>。</p>
<p>更に <a href="https://kotlinlang.org/" title="Kotlin Programming Language">Kotlin</a> は Java からの置き換えを目論み,かつ言語仕様を拡張させている点も特徴である(Scala や Groovy 由来の機能や糖衣構文もある)。
少なくとも <a href="https://kotlinlang.org/" title="Kotlin Programming Language">Kotlin</a> では関数を第一級オブジェクト(first-class object)として扱うことができるのは大きい。
個人的には <a href="https://text.baldanders.info/remark/2016/07/java/" title="Java はやめておけ">Java は終わってる</a>と思ってるので,こういうのは大歓迎である。</p>
<h2>ブックマーク</h2>
<ul>
<li><a href="https://sites.google.com/site/tarokotlin/">プログラミング言語Kotlin 解説</a></li>
<li><a href="http://qiita.com/noppefoxwolf/items/b2d93f946f158c7b5852">Kotlinを1ヶ月使ってみた - Qiita</a></li>
<li><a href="http://blog.satotaichi.info/first-thoughts-of-kotlin/">Kotlinに対する雑感</a></li>
<li><a href="http://qiita.com/koher/items/e4835bd429b88809ab33">null安全でない言語は、もはやレガシー言語だ - Qiita</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>null の英語での発音は「ナル」に近いのだが,どういうわけか日本の IT 界隈ではドイツ語っぽく「ヌル」と呼ぶ人が圧倒的多数のようだ。私もそうだし職場の半径100m以内で「ナル」と呼ぶ人はいない。まぁ私は TTC (Telecommunication Technology Committee) を「てってーしー」と呼んでいた世代だからな(笑) (参考:<a href="http://qiita.com/ryounagaoka/items/290885ee3291b393fe1f">IT業界で横行する恥ずかしい英語発音 - Qiita</a>:コメントの議論が面白いので是非) <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
<li id="fn:2">
<p>ちなみに <a href="https://golang.org/" title="The Go Programming Language">Go 言語</a>は全く「null 安全」ではない。「ぬるぽ」を緩和するような仕組みはないこともないが,コンパイラレベルで保証しているわけではない。(参考: <a href="http://postd.cc/why-go-is-not-good/">Go言語がダメな理由 | プログラミング | POSTD</a>) <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>
</ol>
</div>