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

9 投票
9 回答
2389 浏览
提问于 2025-04-15 17:05

我一直在努力优化我的时间。写C语言代码需要花费很多时间,而且比起写Python程序来说,敲键盘的次数要多得多。

不过,为了加快写C程序的速度,我们可以自动化很多事情。我希望能用类似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;
} 

在优化后的Python风格版本中可以看成:

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

我的问题是:你知道有没有VIM脚本,可以把原本用Python风格写的C代码转换成标准的C代码吗?比如说,有人写C代码时使用了Python风格的语法,一旦她决定要把这些Python风格的代码块转换成标准C代码,她只需要选择这些代码块,然后按一个键。她当然不需要保存这些Python风格的代码,VIM就会把它们转换成标准的C代码。

9 个回答

4

你有没有仔细想过自己花时间在什么地方——你真的想为了省几个按键的时间而牺牲代码的可维护性吗?

当我写代码的时候,我大部分时间是在阅读代码。

也许你只是一个打字速度非常慢的人... ;-)

10

我写了一个小的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)

这个脚本非常简单,它会逐行检查一些特定的格式,然后调整缩进,最终生成标准的C代码。效果很好,我觉得这样看起来比到处都是分号和大括号要好很多。我不明白为什么有些人对这个主意这么反感。你们觉得怎么样?

8

Cython 是用来写 Python 扩展的,不是用来写完整程序的。Pyrex 也是这样。

虽然和你的例子有点不同,但 PyPy 可能是你想要的。它使用一种叫 RPython 的 Python 子集(这是一种更静态的 Python)来生成代码,可以支持不同的后端,包括 C。虽然它可能无法让你对数据结构进行非常细致的控制,但可以试试看。

你所需要的其实是一种不同且相对简单的 C 语言方言——虽然这本身并不是个坏主意,但世界上已经有很多不同的编程语言了,如果每个人都为每个应用发明一种新的方言,那就会很麻烦。

如果你觉得 C 语言太啰嗦或者太底层,试试这个方法:

  • 先用 Python 写你的程序
  • 分析一下,找出哪些部分真的需要加速
  • 把这些部分放在明确的模块里
  • 用 Pyrex 或 Cython 重写这些部分

这样你可能会得到很好的可读性、可维护性和速度。

撰写回答