Как писать расширения Python на чистом ассемблере и будет ли это эффективно?

У меня средние любительские навыки в Python и я новичок в asm и не знаю C-языка.

Я знаю, что C-расширения python должны следовать определенному интерфейсу, чтобы работать нормально.

Возможно ли написать расширение python на чистом Assembly с правильным интерфейсом и полной функциональностью? Второй вопрос: будет ли это достаточно эффективно, если все сделать правильно?

Во время поиска в Google я не нашел ни примеров кода, ни статей, ни решений по этому вопросу.

И это НЕ вопрос о запуске asm-кода из Python, так что это не дублирование тем на SO.


person Крайст    schedule 27.01.2013    source источник
comment
Конечно, это возможно; просто создайте тот же машинный код, который компилятор C создал бы для структур Python. Но зачем проходить через эту боль?   -  person Martijn Pieters    schedule 27.01.2013
comment
@MartijnPieters, я думал, что правильный интерфейс можно реализовать из asm кода без промежуточных шагов. Я ответил ниже, зачем проходить через эту боль. Это не любопытство - это что-то о возможности.   -  person Крайст    schedule 27.01.2013
comment
О, ребята. Может быть, это проще, чем писать расширения - сделать простые DLL в asm с некоторыми полезными функциями и вместо них использовать ctypes из Python?   -  person Крайст    schedule 27.01.2013


Ответы (3)


Как это сделать:

Я не знаю, сможете ли вы сделать это «чисто» на ассемблере, но: если вы создадите «прокси-класс» (назовем его так) в C, который вызывает затем напишите ассемблер с использованием соглашения C, а затем, просто скомпилировав код ассемблера:

nasm -felf64 -g -F dwarf assembly_function.asm

а затем, используя файл setup.py, содержащий:

from distutils.core import setup, Extension
setup(name='assembly_include_name', version='1.0', ext_modules=[Extension('assembly_include_name', ['c_assembly_proxy.c'],extra_objects=["assembly_function.o"])])

вы сможете делать то, что хотели. Обратите внимание, что вы должны добавить параметр "extra_objects" в конструктор расширения, чтобы указать Python связать ассемблерный код, иначе произойдет сбой с сообщением о том, что он не может найти имя функции.

Зачем вам это делать:

Если вы хотите использовать инструкции SSE (SSE2, SSE3...) независимо от оптимизации, которую может сделать компилятор.

API расширения: https://docs.python.org/2/extending/extending.html< /а>

Ссылка на disutils.core: https://docs.python.org/2/distutils/apiref.html?highlight=distutils.core#module-distutils.core

person Esteban Rey    schedule 26.05.2015
comment
Компиляторы генерируют и оптимизируют код, используя инструкции SSE. - person Ross Ridge; 26.05.2015
comment
Действительно, даже если я не использую инструкции SSE? Я имею в виду, может ли компилятор определить, использовать инструкции SSE или нет? Не могли бы вы привести пример? было бы интересно. - person Esteban Rey; 26.05.2015
comment
да. Довольно тривиальный пример — это то, как большинство компиляторов могут использовать скалярные инструкции SSE для выполнения базовых математических операций с плавающей запятой. Более сложный пример — автоматическая векторизация циклов. Вот пример последнего, когда конкретная версия Visual C++ неправильно сгенерировала инструкцию SSE 4.1: stackoverflow.com/questions/25494681/ - person Ross Ridge; 26.05.2015

Теоретически это возможно.

На практике это крайне непрактично.

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

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

person NlightNFotis    schedule 27.01.2013
comment
Я полностью согласен с тобой. Когда у меня появилось время, чтобы получить некоторые навыки работы с другим языком программирования, я выбрал asm только потому, что он близок к аппаратному обеспечению. И у меня есть один проект, который будет выполнять множество вычислений чисел с плавающей запятой, вычислять синусы и косинусы и т. Д., Чтобы выполнить некоторую обработку изображений. Более того, он будет работать на Django в Интернете. Я думал, что asm может помочь мне с уменьшением нагрузки на процессор на хостинге или сервере. - person Крайст; 27.01.2013
comment
Итак, вы думаете, что я должен забыть о asm и вместо этого начать изучать C для большей практической эффективности? - person Крайст; 27.01.2013
comment
В значительной степени да, C сделает 99% того, что может и будет делать asm. - person NlightNFotis; 27.01.2013
comment
Здорово! Есть ли лучшие учебники для изучения C после Python? - person Крайст; 27.01.2013
comment
Если вы говорите об онлайн-учебниках, вы можете ознакомиться с основами C на cprogramming.com и немного дополнительные прикладные знания см. на странице c.learncodethehardway.org/book. - person NlightNFotis; 27.01.2013
comment
C также скомпилирован в машинный код, он будет так же близок к аппаратному обеспечению, как и сборка, которую вы пишете. Но современные компиляторы C превзойдут вас в написании эффективного машинного кода. Если вы еще даже не научились программировать на C, у вас, откровенно говоря, нет ни малейшей надежды превзойти компилятор. - person Martijn Pieters; 27.01.2013
comment
@MartijnPieters Я полагаю, вы хотели написать, если вы еще не научились программировать на ASM в этой последней части! - person NlightNFotis; 27.01.2013
comment
@NlightNFotis: нет, я забыл там even. Если ОП еще не выучил C, то я думаю, мы можем с уверенностью предположить, что их навыки ASM также не будут впечатляющими. :-) В голландском языке есть поговорка: Он слышал звон колоколов, но не знает, где найти хлопушку; Боюсь, здесь это применимо. - person Martijn Pieters; 27.01.2013
comment
Спасибо вам, ребята. Я уверен, что ваша помощь спасла мой день) ** Gone to learn C - person Крайст; 27.01.2013
comment
@MartijnPieters Извините за назойливость, но я хотел узнать ваше мнение о ресурсах, на которые я указал ему для обучения c. - person NlightNFotis; 27.01.2013
comment
@NlightNFotis: Извините, я не собираюсь туда лезть; мы понятия не имеем, например, о том, какой уровень компетенции у ОП в программировании вообще. Лично я уже слишком давно не могу судить о каком-либо учебном ресурсе C. :-) - person Martijn Pieters; 27.01.2013
comment
У меня школьный уровень математики, 3 года любительского программирования на Python (доморощенные скрипты) и чтение ряда книг по программированию и железу (Structured Computer Organization Таненбаума, SICP Массачусетского технологического института, Discrete Mathematics Хаггарти) - все на начальном этапе в момент. - person Крайст; 27.01.2013

Вы можете написать свой asm как встроенный asm внутри вашего расширения c, что касается эффективности...

Заварочный чайник.

Эффективность измеряется не выбором языка, а тем, насколько хорошо он реализован и насколько хорошо спроектирован.

person Jakob Bowyer    schedule 27.01.2013
comment
Многие операции с плавающей запятой имеют два негативных эффекта в Python: низкая скорость и потеря точности. Ладно, из всех ответов я выучил базовое решение: выучи C - и получишь больше свободы с Python и другими =) Простите, а что такое Teapot в контексте вашего ответа? - person Крайст; 27.01.2013
comment
Я думаю, вы недооцениваете операции fp в Python; они все еще реализованы в C в любом случае. Используйте numpy для интенсивных операций, если вам действительно нужно обработать много преобразований fp. - person Martijn Pieters; 27.01.2013
comment
@MartijnPieters, извините, я забыл о numpy. Спасибо, что напомнили об этом) - person Крайст; 27.01.2013