私はCPythonでインタプリタスタック(この点まで到達するために呼び出されるPython関数のリスト)がCスタック(インタプリタ自身のコードで呼び出されたC関数のリスト)と混在していることを読んだことがあります。もしそうなら、どのように発電機とコルーチンが実装されていますか?実行状態をどのように覚えていますか? CPythonは、各発電機/コルーチンのスタックをOSスタックとの間でコピーしますか?あるいは、CPythonはジェネレータの最上位スタックフレームをヒープ上に保つだけです。ジェネレータはその最上位フレームからしか得られないからです。CPythonでジェネレータとコルーチンがどのように実装されていますか?
答えて
命令は、現在実行中のコンテキストをクロージャとして受け取り、それを自身の生存オブジェクトに変換します。このオブジェクトには__iter__
メソッドがあり、これはこのyield文の後に続きます。
したがって、コールスタックはヒープオブジェクトに変換されます。
Cの「ハードウェア」スタックとPythonスタックを明確にすることは重要です。なぜなら、この質問は両方を混乱させるためです。私の答えはこれを明らかにする。これは私がStackOverflowので詳細を参照したい技術的な答えのようなものである – jsbueno
実行中のPythonプログラム内のPythonのスタックとCスタックが混在しているという誤解を招く可能性があります。
Pythonスタックは、インタープリタによって使用される実際のCスタックより完全に分離されています。 Pythonスタックのデータ構造は、実際には完全なPythonの "フレーム"オブジェクトです(イントロスペクトされ、実行時に変更される属性もあります)。このスタックはPython仮想マシンによって管理されます。Python仮想マシン自体はC言語で動作し、通常のCプログラム、マシンレベルのスタックを持っています。
ジェネレータとイテレータを使用する場合、インタプリタは、ジェネレータとイテレータを使用するときに、それぞれのフレームオブジェクトをPythonプログラムスタック以外の場所に格納し、ジェネレータの実行を再開するときにインタプリタに戻します。この "どこか他の"はジェネレータオブジェクトです。ジェネレータオブジェクトにメソッド "next"または "send"を呼び出すと、これが発生します。
Pythonは、VMのCスタックから完全に分離された「プログラムスタック」を維持していると主張しています。この主張は間違っています。
はリンクをチェックしてください:http://en.wikipedia.org/wiki/Stackless_Python
StacklessのPythonが存在しますが、主流ではありません。理解は、問題が正しいことです。
- 1. コルーチンはsmalltalkでどのように実装されていますか?
- 2. string.findはCPythonでどのように実装されていますか?
- 3. コルーチンとコンティニュエーションとジェネレータ
- 4. Collection.sortがどのように実装されていますか?
- 5. CPython型の実装について
- 6. @privateはどのように実装されていますか?
- 7. BigDecimalはどのように実装されていますか?
- 8. MarshalByRefObjectはどのように実装されていますか?
- 9. \ bはどのように実装されていますか?
- 10. getchar()はどのように実装されていますか?
- 11. フィルタはどのように実装されていますか?
- 12. タスクスケジューリングはどのように実装されていますか?
- 13. HttpSessionはどのように実装されていますか?
- 14. バイトコードレベルでScalaでパターンマッチングがどのように実装されていますか?
- 15. String.concat()がjavascriptでどのように実装されていますか?
- 16. データベーステンプレートライブラリ(C++)でvariant_rowがどのように実装されていますか?
- 17. Surface SDKではジェスチャがどのように実装されていますか?
- 18. Goでインタフェース変数がどのように実装されていますか?
- 19. コードがcPythonまたはJython上で実行されているかどうかを検出できますか?
- 20. Wami Recorderは実際にどのように実装されていますか?
- 21. mutexとlock構造はどのように実装されていますか?
- 22. どのJAXP実装が使用されているか、どのJAXP実装がロードされたかを知るにはどうすればよいですか?
- 23. MPI_SendはどのようにMPI_Characterで実装されていますか? FORTRANで
- 24. 抽象メソッドが実装されているかどうかはどのように判断できますか?
- 25. WindowsでPythonマルチプロセッシングはどのように実装されていますか?
- 26. String.LengthはC#でどのように実装されていますか?
- 27. SQLデータベースエンジン内でデータベーストリガはどのように実装されていますか?
- 28. OSレベルでスリープはどのように実装されていますか?
- 29. Objective Cではカテゴリはどのように実装されていますか?
- 30. pthreadはLinuxカーネル3.2でどのように実装されていますか?
私が誤って発電機やコルーチンの実装方法の説明を含んで共同編集の章でほぼ4年後に自分自身に答え:http://aosabook.org/en/500L/a-web-crawler-with-asyncio -coroutines.html –
すばらしい記事、非常に高密度です。無関係な、しかし... –
はどのように発生器は、このトピックにグイドと書籍の章を書くことに実装されているかについて尋ねてから、4歳未満で、手に入れましたか? :) – max