2011-08-23 6 views
13

RPython(Pythonのサブセット)が静的に型指定されていることがよくあります。 (WikipediaのEgが。)RPythonには何が静的に型付けされていますか?

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

私はいくつかのRPythonコードを見ましたが、実際には静的に見えるわけではありません。多くの場合、コンパイラは関数の引数が特定の型だけであることを証明できますが、必ずしもすべての場合にそうではないことを証明することができます。

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

RPythonについてPyPyのドキュメントで
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 

は、言われている:「変数は最大1つのタイプの値が含まれている必要があります」。

したがって、関数の引数も変数としてカウントされますか? RPythonはどんな意味で静的に型付けされていますか?またはこれは実際に偽証されていますか?

+1

http://codespeak.net/pypy/dist/pypy/doc/translation.html –

答えて

14

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

もちろんです。彼らはいつもほとんどすべての言語で行っています。

また、RPythonはどのような意味で静的に型指定されていますか?またはこれは実際に偽証されていますか?

ステートメントが正しい。 RPythonはPythonではありません。これはそのサブセットであり、Pythonコードとして実行できます。しかし、実際にRPythonコードをコンパイルすると、非常にダイナミックなものが取り除かれます(インポート時間後であっても、メタクラスを使用したり、文字列からコードを生成できるなど) Pythonコンパイラですが、伝統的なコンパイラとは大きく異なります。関連ドキュメントを参照してください)実際に型が静的に使用されるかどうかを判断できます。より正確に言えば、動的性を使用するコードはパーサとすべてを通過させますが、ある時点で型エラーが発生します。

多くの場合、コンパイラーは、関数の引き数が特定の型だけであることは証明できますが、必ずしもすべてではありません。

もちろんです。静的に型付けされていないコードがたくさんあります。現在の注釈が静的に型指定されていることを証明できない静的型付きのコードもあります。しかし、そのようなコードが付いてくると、それはコンパイルエラーです。

実現するために重要ないくつかのポイントがあります。

  • タイプが明示的に述べていない、推測されているが(まあ、ほとんどの部分は、私は信じているにアサーションを必要とするいくつかの機能があります注釈者を助ける)。静的型付けは(コメントに含めると思われるように)型を書き出さなければならない(マニフェスト型と呼ばれる)わけではありません。つまり、変数を含む各式は決して変更されない単一の型を持ちます。

  • すべての分析はプログラム全体で行われます。 def add(a, b): return a + b(整数、整数、浮動小数点数、文字列、リストなど)の型を推論することはできませんが、関数が整数引数で呼び出された場合(たとえば整数リテラルや以前は整数を含むと推測される)、ab(そして+のタイプによって、addの結果)も整数であると決定される。

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

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

+0

ああ、そのビット* \ [静的に型付けされた\]は全プログラムベースで*私はここで主要な重要なビットと思います。あなたが書いているように、関数 'def add(a、b):return a + b'は静的に型付けされていないので、いくつかの異なる型に対しても使うことができます。 – Albert

+0

@Albert:zeekayさんの解説にコメントしてください。あなたは静的な入力が明白な入力であるという古くからよく知られている誤解を乗り越えた可能性があります。 – delnan

4

はい、静的に入力されています。あなたの例では、どの変数もタイプを変更しません。これは、RPythonの要件を満たしています。 RPython is not formally defined, and it's restrictions are constantly evolvingですが、ドキュメントはまだ開始するのに適しています。少し読んだ後で、できることは、コードを試して翻訳することです。あなたができることとできないことを素早く見つけます!

+0

タイプを変更せず、静的にタイプされていないものは、何か違うものです。この例では、変数の型は変更されませんが、静的に型付けされているわけではありません。 – Albert

+0

変換タイプの推論が行われている間に、変数のタイプを明示的に定義する必要はありません。 – zeekay

+0

そのURLはもう機能していないようです。実際の制限が何であるかを知ることは素晴らしいことです。 – Dexter

関連する問題