14

RPython(Pythonのサブセット)は静的に型付けされているとよく言われます。(例:ウィキペディア。)

最初は、Pythonにそれをどのように追加するのか疑問に思いassert isinstance(arg1, ...)、各関数の先頭などにステートメントを追加する要件を追加したのではないかと思いました(しかし、私はそれを本当に信じられませんでした)。

次に、いくつかのRPythonコードを調べましたが、静的に型指定されているようには見えません。多くの場合、コンパイラーは、関数の引数が特定のタイプのみである可能性があることを証明できる可能性がありますが、すべての場合に確実にそうであるとは限りません。

たとえば、これは:のRPython実装ですstring.split

def split(value, by, maxsplit=-1):
    bylen = len(by)
    if bylen == 0:
        raise ValueError("empty separator")

    res = []
    start = 0
    while maxsplit != 0:
        next = value.find(by, start)
        if next < 0:
            break
        res.append(value[start:next])
        start = next + bylen
        maxsplit -= 1   # NB. if it's already < 0, it stays < 0

    res.append(value[start:len(value)])
    return res

RPythonに関するPyPyのドキュメントでは、「変数には最大で1つのタイプの値を含める必要があります」と書かれています。

では、関数の引数も変数としてカウントされますか?または、RPythonはどのような意味で静的に型付けされていますか?それとも、これは実際に誤解されていますか?

4

2 に答える 2

15

では、関数の引数も変数としてカウントされますか?

もちろんそうです。彼らは常にほとんどすべての言語で行います。

または、RPythonはどのような意味で静的に型付けされていますか?それとも、これは実際に誤解されていますか?

ステートメントは正しいです。RPythonはPythonではありません。まあ、それはそのサブセットであり、Pythonコードとして実行することができます。しかし、実際にRPythonコードをコンパイルすると、非常に多くの動的性が失われます(ただし、インポート後のみなので、メタクラスを使用したり、文字列からコードを生成したりできます。一部のモジュールでは非常に効果的です)。これはPythonコンパイラではありませんが、従来のコンパイラとは大きく異なります。関連するドキュメントを参照してください)実際に型が静的に使用されることを決定できます。より正確には、動的性を使用するコードは、パーサーとすべてを通過しますが、ある時点で型エラーが発生します。

多くの場合、コンパイラーは、関数の引数が特定のタイプのみである可能性があることを証明できる可能性がありますが、すべての場合に確実にそうであるとは限りません。

もちろん違います。静的に型付けされていないコードはたくさんあり、静的に型付けされているコードの中には、現在のアノテーターが静的に型付けされていることを証明できないものもあります。しかし、そのようなコードが発見された場合、それはコンパイルエラー、期間です。

実現することが重要ないくつかのポイントがあります:

  • タイプは推測され、明示的には述べられていません(まあ、ほとんどの場合、アノテーターを支援するためにアサーションを必要とする関数がいくつかあると思います)。静的型付けは(コメントで暗示しているように)型を書き出す必要があることを意味するのではなく(マニフェスト型付けと呼ばれます)、各式(変数を含む)が決して変更されない単一の型を持っていることを意味します。

  • その分析はすべて、プログラム全体で行われます。関数の(非ジェネリック)型を推測することはできませんdef add(a, b): return a + b(引数はint、float、strings、listsなど)が、関数が整数引数(たとえば、以前に推測された整数リテラルまたは変数)で呼び出された場合整数を含む)、aおよびb(および、のタイプによって+、の結果add)も整数であると判断されます。

  • PyPyリポジトリ内のすべてのコードがRPythonであるとは限りません。たとえば、rlib.parsingコンパイル時に実行されてRPythonコードを生成するコードジェネレーター(たとえば、)がありますが、RPythonではありません(ちなみに、多くの場合、"NOT_RPYTHON"docstringを使用します)。また、標準ライブラリの大部分は完全なPythonで記述されています(ほとんどの場合、CPythonから直接取得されます)。

翻訳とタイピング全体が実際にどのように機能するかについては、非常に興味深い資料がたくさんあります。たとえば、RPython Toolchainは、型推論を含む一般的な変換プロセスを記述し、RPython Typerは、使用される型システムを記述します。

于 2011-08-23T14:06:55.547 に答える
4

はい、静的に型付けされています。あなたの例では、どの変数もタイプを変更しません。これは、その点でRPythonの要件を満たしています。RPythonは正式に定義されておらず、その制限は絶えず進化していますが、ドキュメントはそれでも開始するのに適した場所です。少し読んだ後、いくつかのコードを試して翻訳するのが最善の方法です。これで、できることとできないことをすぐに理解できます。

于 2011-08-23T14:03:30.020 に答える