Nano Hash - криптовалюты, майнинг, программирование

что статически типизировано в RPython?

Часто утверждается, что RPython (подмножество Python ) имеет статический тип. (Например, в Википедии.)

Сначала я задавался вопросом, как они добавят это в Python, и подумал, что они, возможно, добавили требование добавлять операторы, такие как assert isinstance(arg1, ...), в начале каждой функции (но я не мог в это поверить).

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

Например, это реализация string.split в RPython:

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 статически типизирован? Или это действительно искажено?



Ответы:


1

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

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

Или в каком смысле 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 описывает процесс перевода в целом, включая тип вывод, а Typer RPython описывает используемые системы типов.

23.08.2011
  • Ах, этот бит [статически типизированный] для всей программы, я думаю, самый важный здесь. Потому что, как вы тоже пишете, функция def add(a, b): return a + b не является статически типизированной и даже может использоваться для нескольких разных типов. 23.08.2011
  • @Albert: Пожалуйста, также покажите мое редактирование в ответ на ваш комментарий к ответу зикея. Возможно, вы столкнулись со старым и популярным заблуждением, что статическая типизация — это манифестная типизация. 23.08.2011

  • 2

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

    23.08.2011
  • Но не менять тип и статически типизировать — это нечто другое. Я вижу, что в примере переменные не меняют свой тип, но они не являются статически типизированными. 23.08.2011
  • Во время вывода типа перевода вам не нужно явно определять тип переменных. 23.08.2011
  • Этот URL больше не работает. Было бы здорово узнать, каковы фактические ограничения. 25.03.2013
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..