パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Pythonコンパイラ「Codon」誕生」記事へのコメント

  • ネイティブなマシン語なら当たり前だよね?
    あとは最適化とかライブラリの出来次第。
    実際には多少遅くとも同等扱いなんでしょ。

    • Re: (スコア:5, すばらしい洞察)

      > ネイティブなマシン語なら当たり前だよね?

      それは良くある勘違いです.当たり前ではありません.

      C/C++のコードに比べるとpythonのコードはコンパイル&最適化が難しいです.
      難しい理由の一つは,pythonは実行するまで変数の型が決まらないためです.これはネイティブなマシン語を吐くだけでは全く解決できない問題です.

      C/C++ふうに言えば,pythonでソースコード中に foo(x) という関数呼び出しがあった場合
      xの型はint型,unsigned int型,float型,std::string型,struct X,class Y,など無限の可能性があります.
      当然実行時には型の候補は有限で,実際の型は

      • by Anonymous Coward

        > 当然実行時には型の候補は有限で,実際の型は実行時には一つになります,ただし実行されるたびに型が変わる場合もあります.

        型推論が重いのは事実だが、アルゴリズム自体は30年前にselfコンパイラで提案されている。

        整数オーバーフロー検出も、実行時プロファイルのAOTコンパイラへのフィードバックと値範囲解析とCPUの投機実行により、オーバーフローしなかったパスの速度低下はかなり~完全に抑えられる。これも20年くらい前からある技術。

        • by Anonymous Coward

          しかしC言語は「整数オーバーフローしたときの動作は未定義です」(=コンパイラーは整数オーバーフローが発生したときのことを一切考えなくていい)というチートを繰り出すからそれでも勝てないんだよな

          • by Anonymous Coward

            「ほとんどの場合はワード長におさまるが、たまにオーバーフローして多倍長整数で計算しなければならない」ような場合ならPythonが有利になります。Cだとオーバーフローの検出ができないので、ソフトウェア的に判断するか、最初から多倍長で計算するしかない。

            • by Anonymous Coward

              ソフトウェア的に判断すると言ってもそれはPythonの言語機能がやっていることと同等以上だからそれをもってPythonが有利と言われても意味不明ですね。むしろPythonは必要がなくてもそのチェックを外せない

              • by Anonymous Coward

                たとえばx86にはオーバーフローフラグがあって、整数演算でセットされるから、次の命令で条件分岐するだけです。PyPyもそうしている。意味不明に思えるのはただの無知。
                加算がオーバーフローしうるなら

                add eax,edx
                jo _handle_overflow_and_switch_to_bignum

                高頻度パスには条件分岐だけ付け加えればよくて、これは投機実行でコストはほぼ0になる。
                ごく単純な仕組みだが、Cは言語レベルではオーバーフローを扱えないので生成不可能なコードになる。

              • by Anonymous Coward on 2023年03月15日 0時59分 (#4426867)


                add eax,edx
                jo _handle_overflow_and_switch_to_bignum
                ... ; use eax

                高頻度パスがこうだとすると、オーバーフローハンドラは「オーバーフローしうる演算」それぞれと一対一で用意しますが、コードサイズは大きくなく、所詮一回しか実行しません(どれかが一つオーバーフローすると、全体をbignumで処理するコードに切り替えます)。
                オーバーフローしたという情報と、それを起こした演算についての知識から、正しい演算結果をbignumで構成することができます。x86なら乗算結果はedx:eaxに入ります(x64も同様)。それからbignum版のルーチンに移行して、戻ってきません。

                配列のインデックスなどはvalue range analysisという古くからある技術で、ワードに収まることがわかる場合がほとんどです。たとえばポインタと加減算するための値なら、決してオーバーフローはしません。これは大域的な解析なのでコンパイルは重くなります。

                親コメント

最初のバージョンは常に打ち捨てられる。

処理中...