最適化は別に関数型のパラダイムとは無関係に適用できるし(C23以前でもSSAベースのdead code eliminationやarray bound check removalなど無数にある)、処理順序の可換性みたいな思考モデルへの影響のほうが有意義だと思う。
バグの典型的なパターンとして副作用の有無がよく語られると言うだけで最適化視点での分類とは文脈が違うと思う。最適化において意味をなさないことでも、他の文脈においては意味をなしうるだろう。
Date.now()はくだらなくないだろ。明確に悪でテストや再利用性を阻害する。 def func(now: Date) = hogehogeと書くだけで純粋になるんだからそうするべき
「関数に副作用がある/ない」をもっと細分化すると
"副作用が「ある」か「ない」という分類はコンパイラーにとっては粗すぎる。" それはそう。文脈を明示して語ろう
C言語のコンパイラだって、グローバル変数、staticで修飾されていない、引数にポインタが使われていないの条件で最適化できるので、最適化と副作用は別の議論では?ないことがわかってれば最適化は楽だけど。
その getTime は TDD やクリーンアーキテクチャや DI で出てくる典型的なアンチパターン。その関数を使う処理のテストが書けないというめちゃくちゃ大きな副作用がある。せめてデフォルト引数で Date.now() を使う様にすべき。
作者がコンパイラ実装者の立場で、と言っていることを尊重しよう
なるほど
そう、黒板に式を書いて結果も黒板に書いて完結する数学と、キーボード入力関数やメモリ共有書き換え関数できるコンピュータは世界が違うし。foo()の結果が3ならfoo()を全部3に文字列置換する最適化はもう黒板数学。
flixだとポリモーフィックエフェクトを採用していて、引数がeffectも持つか否かで処理分岐させて、effectなしなら並列処理、effectありならシーケンシャルみたいなことができる。ユーザーサイドでできる最適化
getTimeは「入力が同じなら返り値も同じ」というのに反する人工的な例として書かれたということが理解できない人がわらわらいる//黒板数学で効率化できる部分があるのだから、黒板数学を議論しようという話
最初に“くだらない議論だ”と、切って捨てている以上、筆者が「くだらない」と思うような異論反論が出てくるのは、筆者も織り込み済みな気はする。逆に言語処理系実装の立場を「くだらない」と言う人がいても良い
コンパイラの最適化の話なんてはてぶの人には理解できるはずがないので、この手の記事は内容は一切読まれることなく、無益なコメントが並んで終わりますよ。案の定getTimeに対するどうでもいいコメントが並んでますね
思ってたよりむしろ純粋だと最適化にいろいろと便利なんだな、ってなった。
“C23では関数の副作用を制限する属性 [[reproducible]] と [[unsequenced]] が追加された。”はえー
Date.nowはくだらない(だめだと分かりきってるので)?
関数の副作用の有無だけなんであんなに取り沙汰すのだろうと思っていたので、分かりみが深い。
副作用ないのは便利になることが多いことは理解しているつもり。表面上の話で出してくる人たちはちょっと……というイメージしか無い。
プログラミングの話題で、人とコミュニケーション取るのは難しいな。なぜくだらないのか、俺はわかったよ。
「関数の副作用の有無」よりも大事なもの | 雑記帳
最適化は別に関数型のパラダイムとは無関係に適用できるし(C23以前でもSSAベースのdead code eliminationやarray bound check removalなど無数にある)、処理順序の可換性みたいな思考モデルへの影響のほうが有意義だと思う。
バグの典型的なパターンとして副作用の有無がよく語られると言うだけで最適化視点での分類とは文脈が違うと思う。最適化において意味をなさないことでも、他の文脈においては意味をなしうるだろう。
Date.now()はくだらなくないだろ。明確に悪でテストや再利用性を阻害する。 def func(now: Date) = hogehogeと書くだけで純粋になるんだからそうするべき
「関数に副作用がある/ない」をもっと細分化すると
"副作用が「ある」か「ない」という分類はコンパイラーにとっては粗すぎる。" それはそう。文脈を明示して語ろう
C言語のコンパイラだって、グローバル変数、staticで修飾されていない、引数にポインタが使われていないの条件で最適化できるので、最適化と副作用は別の議論では?ないことがわかってれば最適化は楽だけど。
その getTime は TDD やクリーンアーキテクチャや DI で出てくる典型的なアンチパターン。その関数を使う処理のテストが書けないというめちゃくちゃ大きな副作用がある。せめてデフォルト引数で Date.now() を使う様にすべき。
作者がコンパイラ実装者の立場で、と言っていることを尊重しよう
なるほど
そう、黒板に式を書いて結果も黒板に書いて完結する数学と、キーボード入力関数やメモリ共有書き換え関数できるコンピュータは世界が違うし。foo()の結果が3ならfoo()を全部3に文字列置換する最適化はもう黒板数学。
flixだとポリモーフィックエフェクトを採用していて、引数がeffectも持つか否かで処理分岐させて、effectなしなら並列処理、effectありならシーケンシャルみたいなことができる。ユーザーサイドでできる最適化
getTimeは「入力が同じなら返り値も同じ」というのに反する人工的な例として書かれたということが理解できない人がわらわらいる//黒板数学で効率化できる部分があるのだから、黒板数学を議論しようという話
最初に“くだらない議論だ”と、切って捨てている以上、筆者が「くだらない」と思うような異論反論が出てくるのは、筆者も織り込み済みな気はする。逆に言語処理系実装の立場を「くだらない」と言う人がいても良い
コンパイラの最適化の話なんてはてぶの人には理解できるはずがないので、この手の記事は内容は一切読まれることなく、無益なコメントが並んで終わりますよ。案の定getTimeに対するどうでもいいコメントが並んでますね
思ってたよりむしろ純粋だと最適化にいろいろと便利なんだな、ってなった。
“C23では関数の副作用を制限する属性 [[reproducible]] と [[unsequenced]] が追加された。”はえー
Date.nowはくだらない(だめだと分かりきってるので)?
関数の副作用の有無だけなんであんなに取り沙汰すのだろうと思っていたので、分かりみが深い。
副作用ないのは便利になることが多いことは理解しているつもり。表面上の話で出してくる人たちはちょっと……というイメージしか無い。
プログラミングの話題で、人とコミュニケーション取るのは難しいな。なぜくだらないのか、俺はわかったよ。