Итак, аргументы функций также считаются переменными?
Конечно, они так и делают.Они всегда есть практически на каждом языке.
Или в каком смысле 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 описывает используемые системы типов.