新しいものを表示
orange さんがブースト
orange さんがブースト

例えば hoge+fuga を piyopiyo番地に書けって命令を実行したとして、
で、そのあとにpiyopiyo番地~のメモリを見て、「ところでここにあるバイナリはなに?><」ってなった時に「さぁ・・・?」ってなるのが型安全じゃなくて、「なんとか型でかんとかって値が置いてあります!」ってわかるのが型安全
って事じゃないの?><;

orange さんがブースト

その文脈での「マシさ」には度合いがあって、動的型付き言語はそのマシさにおいて最底辺に近い、ということをわかってほしいという話

スレッドを表示
orange さんがブースト

あらゆる不都合な動作を「例外が飛びます」とか「終了コード127でプログラムが終了します」とかの “定義済の挙動/状態” へと飛ばしてしまえばそれは “型安全” な言語になるんだけど、それで? という話でしかない。
極論を言えば「未定義動作で必ず abort() する拡張されたC言語」みたいなものがあったらそれは型安全といえるはず。
で、サイレントに狂わなくなるのは確かにだいぶマシではあるが、所詮マシなだけなのよね

スレッドを表示

それはそうだけどJavaは定義上型安全で、学校のテストで「Javaは型安全な環境であるか?」に「違う!><」って書いたら不正解なんでしょ?><;

orange さんがブースト

で、定義済の挙動であることはわかったけど、そもそも実行時に型エラーが出るようなプログラムを実行できてしまうのは本当に嬉しさ十分なんですか? というのが、開発者が向き合うべき本当の問題なのよ

スレッドを表示
orange さんがブースト

たとえば「Javaは型安全です!」というのは「Javaの書き換え可能な配列型は共変なんだけど、型エラーの際には ArrayStoreException が飛ぶという定義済の挙動になるから、プログラム全体としての振る舞いはちゃんと想定されたものになっています!」というのを含意している、ということをまず了解する必要がある。

オレンジ的にも心情的にPerlも古典的BASICも「どこが型安全なんだよ!><;」って思ってるけど、
そう思いながら「Adaがもっと普及するべき!><# 」ってブーブー言いながら調べた時に「型安全って言葉はそういう意味じゃないですよ」になって「そうなの?><; 変なの!><;」になったので、混乱してる><

orange さんがブースト

結局、型安全の話って、いろんなのが入り混じってて整理しきってないよね、いや、整理はされてるんだけど、それをきっちり理解してる人って少ないよねという。
俺も理解しているうちには入らない。

orange さんがブースト

Perlは型安全なのかというと、気持ち悪いの一言に尽きる。PHPはもっと気持ち悪い。結局Rubyで落ち着いている。

orange さんがブースト

よくわからないけど、TaPLの第一章にはPerlも安全に分類されてるし、wikipedia英語版を見るとBASICの型安全はstrongに分類されてる・・・><

orange さんがブースト

手続き型言語だとその辺りのハンドリングがややこしいんだけど (操作的意味論)

スレッドを表示
orange さんがブースト

式単位じゃなくてプログラム全体での話をしているので……

でも、それだと、例えば型Aと型Bで演算した時に、型Bの方の値によって、型Aが返ってきたり、型Bが返ってきたり、型Cが返ってきたりする言語って型安全ではないになる・・・?><(?)

オレンジ的には「そんなの型安全じゃないよ!><」だけど、学問的にはそれも型安全であるってことになってるんじゃないの・・・?><

orange さんがブースト

で、これらを合わせると、「型のつく項が、型を保ったまま、値になるまで行き詰まることなく評価できる (または永久に値にできないまま評価し続ける破目になる)」というのが型システムの安全性 (健全性) という性質である、ということになる

[EDIT: 修正した (mastodon.cardina1.red/@lo48576)]

スレッドを表示
orange さんがブースト

保存: 項 t に型がついて t が項 t' へと評価できるなら、 t' には t と同じ型がつく。

ようは評価してたら急に型が変わったりしないという話

スレッドを表示
orange さんがブースト

進行: 項 t に型がつくなら、 t は値であるか、または別の項へと評価できる。

項ってのは大雑把には「式」みたいな概念だと思っといていいかも

お金が無い(し、英語力がない)ので無料で読める第一章しか読んでない><;

古いものを表示
:realtek:

思考の /dev/null