Добавить новость
Январь 2010 Февраль 2010 Март 2010 Апрель 2010 Май 2010
Июнь 2010
Июль 2010 Август 2010 Сентябрь 2010 Октябрь 2010 Ноябрь 2010 Декабрь 2010 Январь 2011 Февраль 2011 Март 2011 Апрель 2011 Май 2011 Июнь 2011 Июль 2011 Август 2011 Сентябрь 2011 Октябрь 2011 Ноябрь 2011 Декабрь 2011 Январь 2012 Февраль 2012 Март 2012 Апрель 2012 Май 2012 Июнь 2012 Июль 2012 Август 2012 Сентябрь 2012 Октябрь 2012 Ноябрь 2012 Декабрь 2012 Январь 2013 Февраль 2013 Март 2013 Апрель 2013 Май 2013 Июнь 2013 Июль 2013 Август 2013 Сентябрь 2013 Октябрь 2013 Ноябрь 2013 Декабрь 2013 Январь 2014 Февраль 2014 Март 2014 Апрель 2014 Май 2014 Июнь 2014 Июль 2014 Август 2014 Сентябрь 2014 Октябрь 2014 Ноябрь 2014 Декабрь 2014 Январь 2015 Февраль 2015 Март 2015 Апрель 2015 Май 2015 Июнь 2015 Июль 2015 Август 2015 Сентябрь 2015 Октябрь 2015 Ноябрь 2015 Декабрь 2015 Январь 2016 Февраль 2016 Март 2016 Апрель 2016 Май 2016 Июнь 2016 Июль 2016 Август 2016 Сентябрь 2016 Октябрь 2016 Ноябрь 2016 Декабрь 2016 Январь 2017 Февраль 2017 Март 2017 Апрель 2017
Май 2017
Июнь 2017
Июль 2017
Август 2017 Сентябрь 2017 Октябрь 2017 Ноябрь 2017 Декабрь 2017 Январь 2018 Февраль 2018 Март 2018 Апрель 2018 Май 2018 Июнь 2018 Июль 2018 Август 2018 Сентябрь 2018 Октябрь 2018 Ноябрь 2018 Декабрь 2018 Январь 2019 Февраль 2019 Март 2019 Апрель 2019 Май 2019 Июнь 2019 Июль 2019 Август 2019 Сентябрь 2019 Октябрь 2019 Ноябрь 2019 Декабрь 2019 Январь 2020 Февраль 2020 Март 2020 Апрель 2020 Май 2020 Июнь 2020 Июль 2020 Август 2020 Сентябрь 2020 Октябрь 2020 Ноябрь 2020 Декабрь 2020 Январь 2021 Февраль 2021 Март 2021 Апрель 2021 Май 2021 Июнь 2021 Июль 2021 Август 2021 Сентябрь 2021 Октябрь 2021 Ноябрь 2021 Декабрь 2021 Январь 2022 Февраль 2022 Март 2022 Апрель 2022 Май 2022 Июнь 2022 Июль 2022 Август 2022 Сентябрь 2022 Октябрь 2022 Ноябрь 2022 Декабрь 2022 Январь 2023 Февраль 2023 Март 2023 Апрель 2023 Май 2023 Июнь 2023 Июль 2023 Август 2023 Сентябрь 2023 Октябрь 2023 Ноябрь 2023 Декабрь 2023 Январь 2024 Февраль 2024 Март 2024 Апрель 2024 Май 2024 Июнь 2024 Июль 2024 Август 2024 Сентябрь 2024 Октябрь 2024 Ноябрь 2024 Декабрь 2024 Январь 2025 Февраль 2025 Март 2025 Апрель 2025 Май 2025 Июнь 2025 Июль 2025 Август 2025 Сентябрь 2025 Октябрь 2025 Ноябрь 2025 Декабрь 2025 Январь 2026 Февраль 2026 Март 2026
1 2 3 4 5 6 7 8 9 10 11 12 13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Интернет |

Программисты зря тратят время: PythoC — это худший способ подружить Python и C

100

Языки программирования Python и C связаны гораздо теснее, чем кажется на первый взгляд. Эталонный интерпретатор Python написан на C, и огромное количество сторонних библиотек для Python — это, по сути, обертки для кода на C. Более того, уже давно существуют способы генерировать код C из Python.

Обычно, когда говорят о генерации C-кода из Python, имеют в виду библиотеки вроде Cython. Они используют аннотированный типами Python-код, чтобы создавать модули расширения на C. Это позволяет значительно ускорить «узкие» места в программах.

Однако недавно появился новый проект под названием PythoC, который предлагает совершенно другой подход. Он тоже использует Python с подсказками типов для программной генерации C-кода, но его основная цель — создание автономных программ. К тому же, у него гораздо больше возможностей для генерации кода на этапе компиляции, чем у Cython.

Видео от DGL.RU

Создатели PythoC описывают свою концепцию фразой: «Исполнение на уровне C, компиляция на движке Python». Проект все еще находится на ранней стадии, но в нем уже достаточно рабочих функций, чтобы на него можно было взглянуть. Правда, первый взгляд вызывает скорее недоумение, чем восторг.

Базовая программа на PythoC

Чтобы понять, как это работает, достаточно посмотреть на простой пример:

from pythoc import compile, i32

@compile
def add(x: i32, y: i32) -> i32:
    return x + y

if __name__ == "__main__":
    print(add(10, 20))

Чтобы указать, какие функции в модуле нужно скомпилировать в C, используется декоратор @compile. При этом необходимо предоставить подсказки типов для результата и каждого параметра. Обратите внимание, что импортировать тип i32 нужно из самого PythoC, а не использовать встроенный в Python int. Это означает, что вы работаете с машинными целыми числами, а не с числами произвольного размера из Python.

Когда вы запустите эту программу, то после небольшой задержки получите на выходе число 30. Задержка возникает потому, что C-код компилируется «на лету» каждый раз, когда вы запускаете программу. В PythoC пока нет механизма для повторного использования скомпилированного кода при вызове из Python, как это делает Cython.

На первый взгляд это кажется серьезным ограничением. Но в этом и заключается вся суть проекта. Вы можете использовать PythoC как систему генерации кода для программ на C, которые работают независимо, а не как C-модули, которые импортируются в Python.

Генерация автономных программ на C

Вот еще одна версия той же программы, но с другим поведением:

from pythoc import compile, i32, ptr, i8
from pythoc.libc.stdio import printf

@compile
def add(x: i32, y: i32) -> i32:
    return x + y

@compile
def main(argc: i32, argv: ptr[ptr[i8]]) -> i32:
    printf("%u\n", add(10, 20))

if __name__ == "__main__":
    from pythoc import compile_to_executable
    compile_to_executable()

Первое, что бросается в глаза, — это блок внизу. Функция compile_to_executable() делает именно то, что обещает ее название. Вызовите ее, и текущий модуль скомпилируется в исполняемый файл с тем же именем. В него войдут все функции, которые помечены декоратором @compile.

Еще одно отличие заключается в том, что функция main() теперь имеет ту же сигнатуру, что и функция main() в программе на C. Это означает, что скомпилированный исполняемый файл будет автоматически использовать ее в качестве точки входа.

Наконец, когда вы запустите эту программу, сгенерированный исполняемый файл (который появится в подкаталоге build) не запустится автоматически. Вам придется запустить его самостоятельно. Цель здесь — создать автономную программу на C, которую нельзя будет отличить от той, что вы написали вручную, но с использованием синтаксиса Python.

Эмуляция возможностей C

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

Вы уже видели, как использовать аннотации типов для указания примитивных типов данных. Аналогично можно использовать аннотацию ptr[T], чтобы описать указатель, и array[T, N] для N-мерных массивов типа T. Вы можете создавать структуры, объединения и перечисления, если будете декорировать классы Python. Все обычные операторы и операции управления потоком (кроме goto) будут работать. Для switch/case просто используйте match/case, хотя сквозные case (fall-through) недоступны.

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

Генерация кода во время компиляции

В отличие от Cython, PythoC позволяет генерировать разный C-код или даже возвращаться к Python-коду в зависимости от того, что происходит во время компиляции. У PythoC есть возможности, которых не хватает Cython.

Вот пример из документации PythoC:

from pythoc import compile, struct, i32, f64

def make_point(T):
    @struct(suffix=T)
    class Point:
        x: T
        y: T
    
    @compile(suffix=T)
    def add_points(p1: Point, p2: Point) -> Point:
        result: Point = Point()
        result.x = p1.x + p2.x
        result.y = p1.y + p2.y
        return result
        
    return Point, add_points

Point_i32, add_i32 = make_point(i32)
Point_f64, add_f64 = make_point(f64)

Функция make_point(T) принимает аннотацию типа (i32, f64) и генерирует во время компиляции специализированные по типу версии класса Point и функции add_points. Параметр suffix для @compile означает «изменить имя сгенерированного объекта так, чтобы в имени использовался тип». Так, например, Point становится Point_i32 и Point_f64, что в C является одним из способов различать несколько версий одной и той же функции с разной сигнатурой.

Функции безопасности памяти

Ошибки, которые могут возникнуть из-за ручного управления памятью в C, удручающе знакомы любому, кто использует этот язык. В Cython есть функции безопасности памяти для решения этой проблемы, но PythoC предлагает уникальные функции на основе типов.

Одна из них называется «линейные типы». Импорт linear позволяет вам сгенерировать «доказательство», обычно для сопровождения выделения памяти, которое должно быть «потреблено», когда та же память освобождается. Если у вас нет соответствующего consume(prf) для каждого prf=linear(), компилятор PythoC выдаст ошибку во время компиляции. Это позволяет автоматизировать большую часть ручной проверки и централизовать ее на этапе компиляции, а не во время выполнения.

Другая функция безопасности на основе типов — это «типы уточнений» (refinement types). Идея здесь в том, что вы можете определить функцию для выполнения определенного вида проверки — например, на нулевой указатель — с булевым результатом. Затем вы можете использовать функцию refine() для передачи значения в эту функцию и получения обратно типа, специфичного для этой функции. Это позволяет компилятору убедиться, что тип должен быть обработан каким-то образом перед возвратом, и позволяет обрабатывать общие проверки в одном месте вашего кода.

Возможные будущие направления

PythoC все еще очень молод, поэтому его будущее развитие относительно открыто. Одна из возможностей заключается в том, что он мог бы более тесно интегрироваться с Python во время выполнения. Например, декоратор @cached мог бы компилировать модули один раз, заранее, а затем повторно использовать скомпилированные модули, когда их вызывают из Python, вместо того чтобы перекомпилировать их при каждом запуске.

Конечно, это также потребует интеграции с существующей системой сборки модулей Python. Хотя такой уровень интеграции может и не входить в цели проекта, он сделал бы PythoC более полезным для тех, кто интегрирует C и Python.

Пока же проект выглядит скорее как интересный эксперимент, чем как реальный рабочий инструмент. Попытка писать на C, используя синтаксис Python, — это странное решение для проблемы, которую большинство разработчиков уже давно решили с помощью Cython или просто написав нужные модули на чистом C.

Ваш любимый Python для ИИ — большая ошибка. Пора переходить на JavaScript

Сообщение Программисты зря тратят время: PythoC — это худший способ подружить Python и C появились сначала на DGL.RU - Цифровой мир: новости, тесты, обзоры телефонов, планшетов, ноутбуков.

Ria.city

Читайте также

Интернет |

В МЭИ создали мобильную гидроэлектростанцию для быстрых рек без плотин

Происшествия |

В Курске суд рассматривает дело об убийстве брата-инвалида с особой жестокостью

Авто |

Официальное представительство АвтоВАЗа в Германии объявило о банкротстве

Новости России
Moscow.media

News24.pro и Life24.pro — таблоиды популярных новостей за 24 часа, сформированных по темам с ежеминутным обновлением. Все самостоятельные публикации на наших ресурсах бесплатны для авторов Ньюс24.про и Ньюс-Лайф.ру.

Разместить свою новость локально в любом городе по любой тематике (и даже, на любом языке мира) можно ежесекундно с мгновенной публикацией самостоятельно — здесь.