Один исходный файл для Python и C - PullRequest
1 голос
/ 21 сентября 2019

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

Вот основной прием:

#if 1 /*
    write Python code here
''' */
    write C code here
#endif // '''

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

Например, следующее foo.py:

#if 1 /*
from math import sin, cos, sqrt
''' */
#include <math.h>
#endif // '''

#if 1 /*
def rotation(axis, angle):
    matrix = [0.] * 9
    ''' */
void rotation(double *axis, double angle, double *matrix) {
    double sa, ca, ia, r, x, y, z, xx, yy, zz;
    double cayz, caxz, caxy, iayz, iaxy, iaxz, sax, say, saz;
#endif // '''
    sa = sin(angle);
    ca = cos(angle);
    ia = 1. - ca;
    r = sqrt(axis[0] * axis[0] + axis[1] * axis[1] + axis[2] * axis[2]);
    x = axis[0] / r;
    y = axis[1] / r;
    z = axis[2] / r;
    xx = x * x;
    yy = y * y;
    zz = z * z;
    cayz = ca * (yy + zz);
    caxz = ca * (xx + zz);
    caxy = ca * (xx + yy);
    iayz = ia * y * z;
    iaxz = ia * x * z;
    iaxy = ia * x * y;
    sax = sa * x;
    say = sa * y;
    saz = sa * z;
    matrix[0] = cayz + xx;
    matrix[1] = iaxy - saz;
    matrix[2] = iaxz + say;
    matrix[3] = iaxy + saz;
    matrix[4] = caxz + yy;
    matrix[5] = iayz - sax;
    matrix[6] = iaxz - say;
    matrix[7] = iayz + sax;
    matrix[8] = caxy + zz;
#if 1 /*
    return matrix
''' */
    }
#endif // '''

В Python:

from foo import rotation

print(rotation([1., 2., 3.], 4.))

В C:

#include "foo.py"

int main() {
    double axis[3] = {1., 2., 3.};
    double angle = 4.;
    double matrix[9];
    rotation(axis, angle, matrix);
    printf("[%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf]",
           matrix[0], matrix[1], matrix[2],
           matrix[3], matrix[4], matrix[5],
           matrix[6], matrix[7], matrix[8]);
    return 0;
}

Теперь мне интересно, могу ли я пойти немного дальше, чтобы использовать некоторые более лучшие шаблоны, такие как макросы,определить:

  • глобальные (постоянные) массивы и матрицы
  • простой поток управления, условия и циклы

или некоторые другие улучшения.

1 Ответ

0 голосов
/ 21 сентября 2019

Основная проблема с этим предложением заключается в том, что Python интерпретируется во время компиляции Си.

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

Ваша среда выполнения потребует и интерпретатора Python, и вашего специального инструмента, и код больше не будет переносимым на системубез этой зависимости.

Это сложное решение несуществующей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...