使用Python语法的子集加速编写C程序

psi*_*lia 6 c python syntax vim scripting

我一直在努力优化自己的时间.编写C代码需要花费大量时间,并且需要比编写Python程序更多的键盘触摸.

但是,为了加快创建C程序所需的时间,可以自动化许多事情.我想用smth写我的程序.像Python一样,但有C语义.这意味着,所有关键字都是C关键字,但语法已经过优化.

例如,这个C代码:

#include "dsplib.h"
#include "coeffs.h"

#define MODULENAME "dsplib"
#define NUM_SAMPLES 320

typedef float t_Vec; 
typedef struct s_Inter
{
    char *pc_Name;
    struct s_Inter *px_Next;
}t_Inter; 
typedef struct s_DspLibControl
{ 
    t_Vec f_Y; 
}t_DspLibControl;

void v_DspLibName(void)
{ 
    printf("Module: %s", MODULENAME); printf("\n");
} 

int v_DspLibInitInterControl(t_DspLibControl *px_Con)
{ 
    int y; 
    px_Con->f_Y             = 0.0; 
    for(int i=0;i<10;i++) 
    { 
        y += i * i; 
    } 
    return y;
} 
Run Code Online (Sandbox Code Playgroud)

在优化的pythonized版本中可以看起来像:

include dsplib, coeffs
define MODULENAME="dsplib", NUM_SAMPLES=320

typedef float t_Vec 
typedef struct s_Inter:
        char *pc_Name
        struct s_Inter *px_Next 
t_Inter 
typedef struct s_DspLibControl:
    t_Vec f_Y 
t_DspLibControl 

v_DspLibName(): 
    printf("Module: %s", MODULENAME); printf("\n") 

int v_DspLibInitInterControl(t_DspLibControl *px_Con): 
    int y 
    px_Con->f_Y             = 0.0 
    for int i=0;i<10;i++: 
        y += i * i
    return y
Run Code Online (Sandbox Code Playgroud)

我的问题是:你知道任何VIM脚本,它允许将原始的pythonized C代码转换为标准的C代码吗?例如,一个是编写C代码但使用pythonized语法,一旦她决定将pythonized块转换为标准C,她就选择这样的块并按下某个键.当然,她没有保存这样的pythonized代码,VIM将其转换为标准C.

小智 8

我做了一个小Python脚本,让我在Python语法中使用C,如下所示:

void quicksort(int* lst, int left, int right):
  int i, j, p, tmp 
  i = left
  j = right
  p = lst[(i + j) / 2]
  while i <= j:
    while lst[i] < p: i++
    while lst[j] > p: j--
    if i <= j:
      tmp = lst[i]
      lst[i] = lst[j]
      lst[j] = tmp
      i++
      j--
  if left < j: quicksort(lst, left, j)
  if i < right: quicksort(lst, i, right)
Run Code Online (Sandbox Code Playgroud)

非常简单,只需查看行并检查一些模式并更改缩进以生成标准C代码.效果很好,imho读取比分号和括号更好.我不明白为什么你们这些人非常讨厌这个想法.你怎么看?


Ala*_*oni 7

Cython旨在编写python扩展,而不是完整的程序.Pyrex也是如此.

即使它与你的例子完全不同,PyPy可能就是你正在寻找的东西.它使用Python子集(称为RPython,一种更为静态的python)来为不同的后端生成代码 - 包括C.它不会让你对数据结构进行细粒度的控制,但是试一试.

你要求的是一个不同的,有点简单的C方言 - 虽然它本身可能不是一个坏主意,世界上已经有很多不同的编程语言,如果每个人都发明了一个,这将是一个很大的问题.应该写的每个应用程序的新方言.

如果您认为C过于冗长或过低,无法满足您的需求,请尝试以下方法:

  • 在python中编写你的程序
  • 剖析它并找到真正需要速度的部件
  • 在明确定义的模块中隔离这些部件
  • 通过Pyrex或Cython重写这些部分

而且你可能会获得很好的可读性,可维护性和速度.