что статически набрано в RPython? - PullRequest
13 голосов
/ 23 августа 2011

Часто утверждается, что 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

В документации PyPy о RPython сказано: « переменные должны содержать значения не более одного типа ».

Итак, аргументы функции также считаются переменными?Или в каком смысле RPython статически типизирован?Или это на самом деле искажено?

Ответы [ 2 ]

14 голосов
/ 23 августа 2011

Итак, аргументы функций также считаются переменными?

Конечно, они так и делают.Они всегда есть практически на каждом языке.

Или в каком смысле RPython статически типизирован?Или это на самом деле неверно?

Утверждение верно. RPython - это не Python. Что ж, это его подмножество, и его можно запустить как код Python.Но когда вы на самом деле компилируете код RPython, у вас отнимается такая большая динамичность (хотя и только после времени импорта, так что вы все еще можете использовать метаклассы, генерировать код из строк и т. Д., Что в некоторых модулях имело большой эффект), что компилятор (который не компилятор Python, но сильно отличается от традиционных компиляторов; см. соответствующую документацию) действительно может решить, что типы используются статически.Точнее, код, который использует динамичность, обходит анализатор и все остальное, но в какой-то момент приводит к ошибке типа.

Во многих случаях может оказаться, что компилятор может доказать, что аргумент функцииможет быть только определенных типов, но определенно не во всех случаях.

Конечно, нет.Существует много кода, который не является статически типизированным, и довольно много статически типизированного кода, который текущий аннотатор не может быть статически типизированным.Но когда такой код вызывается, это ошибки компиляции, точка.

Есть несколько моментов, которые важно понять:

  • Типы выводятся,не указано явно (ну, по большей части; я думаю, что есть несколько функций, которые нуждаются в утверждениях, чтобы помочь аннотатору).Статическая типизация не означает (как вы, вероятно, подразумеваете в комментарии), что тип должен быть записан (это называется манифестной типизацией), это означает, что каждое выражение (которое включает переменные) имеет один тип, который никогда не изменяется.

  • Весь этот анализ происходит в рамках всей программы!Нельзя вывести (неуниверсальный) тип для функции def add(a, b): return a + b (аргументы могут быть целыми числами, числами с плавающей точкой, строками, списками и т. Д.), Но если функция вызывается с целочисленными аргументами (например, целочисленными литералами или переменными, которыеРанее предполагалось, что они содержат целые числа), определяется, что a и b (и, по типу +, результат add) также являются целыми числами.

  • Не весь код в репозитории PyPy является RPython.Например, существуют генераторы кода (например, в rlib.parsing), которые выполняются во время компиляции и генерируют код RPython, но не являются RPython (кстати, часто с строкой документации "NOT_RPYTHON").Кроме того, большие части стандартной библиотеки написаны на полном Python (в основном взяты прямо из CPython).

Существует много очень интересных материалов о том, как на самом деле работает весь перевод и набор текста.Например, RPython Toolchain описывает процесс перевода в целом, включая вывод типов, а RPython Typer описывает используемые системы типов.

4 голосов
/ 23 августа 2011

Да, он статически набран. В вашем примере ни одна из переменных не меняет тип, который соответствует требованию RPython в этом отношении. RPython формально не определен, и его ограничения постоянно развиваются , но документация все еще является хорошим местом для начала. Немного почитав, лучше всего попытаться перевести некоторый код, и вы поймете, что вы можете и не можете сделать довольно быстро!

...