Open4

記事メモシャドーイングについて

りんりん

言語ごとのシャドーイングについて調べたことを備忘録として残す

りんりん

基本的な内容は以下。Go言語について調べていて深ぼった。

q なぜシャドーイングできる言語仕様なのか?
他言語でもシャドーイングは可能
https://en.wikipedia.org/wiki/Variable_shadowing
CoffeeScript やVlang ではシャドーイングを禁止している
imo ただそんな流行ってないってことは禁止してもそれほどメリットはないのかも?
むしろシャドーイングを禁止しているCoffeeScriptでは次のようなIssueがあり、外側の変数を破棄していることがバグの温床になっているとの指摘がある
CoffeeScriptはAltaJsのため、変数の再代入(上書き)になってしまう
https://github.com/jashkenas/coffeescript/issues/238
Vlang はまだ開発途中というか...、安定していないみたい(Goにインスパイアされたらしいから、後発の言語)
https://zenn.dev/zakuro9715/articles/vlang-from-contributor-perspective
ただ、明らかにコンパイル時にshadowing をエラーとして禁止しているので、個人的にはこちらの方が好み
https://docs.vlang.io/variables.html#warnings-and-declaration-errors
個人的結論として、Vlang > Golang, PHPなどその他の多くの言語 > JavaScript の順で変数のシャドーイングの扱いの好みに順位をつけたい

りんりん

シャドーイングについて、許可していないことで上位のスコープで知らないうちに定義されている識別子と名前がかぶってしまってコンパイルエラーはありそう

シャドーイング禁止:適切な命名ができていれば問題なさそう
シャドーイング許可:スコープのサイズを小さくするコーディングができるのであれば、宣言を探すのも苦労しなさそう

どっちのほうがデバッグに時間かかるか次第かな

りんりん

そう考えるとシャドーイング許可のほうがプログラマの脳内メモリを使う必要がないのか

禁止:上位のスコープの定義を脳内メモリに置いておく必要がある
許可:直近のスコープの定義だけ脳内メモリに置いておけばよい

うーん、許可のほうが好みになってきた(上書きは論外)
とはいえまだシャドーイングでバグになるような状況に出くわしたことがないから、想像の域をでないな。もしかしたらVのほうが好きになっているかも。