Перевести алгоритмический C на Python

Я хотел бы перевести код C в код Python или байт-код. Рассматриваемый код C - это то, что я бы назвал чисто алгоритмическим: независимость от платформы, без ввода-вывода, только алгоритмы и структуры данных в памяти.

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

Какие конкретные подходы, инструменты и техники вы можете порекомендовать?


Примечание. Расширение Python C или ctypes - не вариант, потому что среда изолирована.

Другое примечание: похоже, есть Компилятор байт-кода C в Java, они даже скомпилировали libjpeg на Java. Байт-код Java + ВМ слишком отличается от байт-кода + ВМ CPython?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
5 297
9

Ответы 9

Почему бы не сохранить код C и создание модуля Python C, которые можно импортировать в работающую среду Python?

Расширение Python C не подходит, потому что среда изолирована. Я обновил вопрос, чтобы отразить это.

Constantin 25.09.2008 14:11

Во-первых, я бы подумал о том, чтобы обернуть существующую библиотеку C добротой Pythonic, чтобы предоставить API в виде модуля python. Я бы посмотрел на swig, ctypes, pyrex и все остальное, что есть сейчас. Сама библиотека C останется там без изменений. Сохраняет работу.

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

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

Преобразование с более ограниченных, более укрощенных языков, таких как IDL (языки данных, которые любят использовать ученые, а не другие IDL), сложно и требует ручных и умственных усилий. C? Забудьте об этом до тех пор, пока люди с НЛО не предоставят нам свои модные программные инструменты, которые на тысячу лет опережают наши достижения!

«Макромагия» не является принципиальной проблемой, она устраняется одним проходом препроцессора.

Constantin 25.09.2008 14:14

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

Намного, намного лучший подход в целом действительно состоит в том, чтобы сохранить C как C и обернуть его в модуль расширения Python (используя SWIG, Pyrex, Cython или написать обертку вручную) или вызвать библиотеку C напрямую, используя ctypes. Все преимущества (и недостатки) C для того, что уже C или вы добавляете позже, и все удобства (и недостатки) Python для любого кода на Python.

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

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

Самый быстрый способ (с точки зрения усилий программиста, а не эффективности), вероятно, будет включать использование существующего компилятора для компиляции C в нечто простое (например, LLVM) и либо:

  • интерпретировать это в Python (непомерное снижение производительности)
  • переведите это на Python (огромная потеря производительности)
  • перевести это в байт-код Python (большая потеря производительности)

Возможен прямой перевод C на Python (и, вероятно, он дает более быстрый код, чем вышеприведенные подходы), но вы, по сути, напишете бэкэнд компилятора C, что является огромной задачей.

Изменить, запоздалое: возможно, еще более быстрый и грязный способ сделать это - взять дерево синтаксического анализа для кода C, преобразовать его в структуру данных Python и интерпретировать его в Python.

Я думал о LLVM, но не думал о его интерпретации. Хорошая точка зрения.

Constantin 25.09.2008 14:32

Что ж, может быть проще интерпретировать дерево синтаксического анализа C непосредственно в Python - добавлено это в правке.

Rafał Dowgird 25.09.2008 14:54

Вы всегда можете скомпилировать код C и загрузить библиотеки, используя ctypes в python.

Это не я проголосовал за вас, но я могу понять почему - обратите внимание на вопрос. Целевая среда изолирована и принимает только чистые модули Python.

Constantin 26.09.2008 00:56

Я бы лично использовал инструмент для извлечения схемы uml из кода C, а затем использовал его для генерации кода Python.

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

Думаю, это был бы более безопасный и в то же время наиболее эффективный способ.

Какой инструмент вы бы использовали и какую диаграмму UML создали бы? Диаграмма статических классов? : -S

Constantin 26.09.2008 00:58

POWER AMC сделает эту работу, но стоит довольно дорого. И да, я не думаю, что другие диаграммы статических классов могут быть отрисованы достаточно эффективно с помощью автоматического процесса. Поэтому вам придется перевести логику класса с C на Python. Но все равно делать все с нуля намного проще.

e-satis 26.09.2008 16:01

Написать интерпретатор C на чистом Python? ;-)

Эй, Томас, это случайно не твой следующий проект? :)

Constantin 24.04.2009 14:35

Если бы мне пришлось написать такого зверя, я бы, конечно, использовал Python. Но мне не нужно ...

theller 24.04.2009 16:00

используйте indent (1) и ctopy (1) ... для дополнительной скорости проверки кредита на pypy ... для бонусного кредита используйте pyastra для генерации кода сборки.

Независимо от языка вам всегда придется жертвовать хранением выходных данных различных конструкций и функций между пространством времени выполнения (CPU) или пространством памяти (RAM).

Проверьте отличную языковую перестрелку, если вы хотите понять, о чем я говорю, в любом случае это слишком большой научный снобизм ...

Вот пример, хотите использовать математику с плавающей запятой без использования чисел с плавающей запятой?

x * 1,000,000 = a
y * 1,000,000 = b
a {function} b = result
result / 1,000,000 = z

Не увязните, станьте примитивным, используйте математику пещерного человека, если нужно.

Другие вопросы по теме