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

使用Python语法的子集加速编写C程序,python,c,vim,syntax,scripting,Python,C,Vim,Syntax,Scripting,我一直在努力优化我的时间。编写C代码需要花费大量的时间,并且比编写Python程序需要更多的键盘操作 然而,为了加快创建C程序所需的时间,可以将许多事情自动化。我想用smth写我的程序。与Python类似,但具有C语义。这意味着,所有的关键字都是C关键字,但语法是经过优化的 例如,此C代码: #include "dsplib.h" #include "coeffs.h" #define MODULENAME "dsplib" #define NUM_SAMPLES 320 typedef f

我一直在努力优化我的时间。编写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;
} 
#包括“dsplib.h”
#包括“系数h”
#定义MODULENAME“dsplib”
#定义NUM_样本320
typedef float tu Vec;
类型定义结构s_Inter
{
字符*pc_名称;
结构s_Inter*px_Next;
}t_Inter;
typedef结构su DspLibControl
{ 
t_Vec f_Y;
}t_DspLibControl;
void v_DspLibName(void)
{ 
printf(“模块:%s”,模块名);printf(“\n”);
} 
int v_DspLibInitInterControl(t_DspLibControl*px_Con)
{ 
int-y;
px_Con->f_Y=0.0;
对于(int i=0;if_Y=0.0
对于int i=0;i可以帮助您。使用cython的通常方法是通过将部分模块编译为C来加速模块。但是,如果您小心的话,使用cython完全可以从类似Python的语法输出纯C文件


如果您愿意的话,还可以使用Python编写单元测试。Cython设计用于编写Python扩展,而不是完整的程序。Pyrex也是如此

尽管它与您的示例大不相同,但可能正是您想要的。它使用一个Python子集(称为RPython,一种更静态的Python)为不同的后端(包括C)生成代码。它不允许您对数据结构进行细粒度的控制,但可以尝试一下

你想要的是一种不同的、更简单的C语言——虽然这本身可能不是一个坏主意,但世界上已经有很多不同的编程语言,如果每个人都为每个应该编写的应用程序发明了一种新的语言,这将是一个相当大的问题

如果您认为C对于您的需求来说太冗长或太低级,请尝试以下方法:

  • 用python编写程序
  • 对其进行分析,找出哪些部件真正需要速度
  • 在定义良好的模块中隔离这些部件
  • 通过Pyrex或Cython重写这些部分
您可能会获得很好的可读性、可维护性和速度。

看看“Go”


如果你想输入更少的C,你不需要语法技巧

您需要一个更好的、更高级的构造库,这样您实际上可以键入更少的C,而不是更少的字符来创建伪C

如果您有一个更好的、更高层次的结构库,您就可以用一种简单易读的语法正确地编写面向对象的程序


从逻辑上讲,您可以创建可以从Python调用的漂亮的库捆绑包。然后您可以切换到Python,键入更少的代码,并完成相同数量的工作。

您是否已经分析了您实际花费的时间——您真的想用可维护性换取几次击键

当我写代码时,我把大部分时间花在阅读代码上


也许你只是一个非常慢的打字员…;-)

我已经为各种事情编写了一些Vim脚本。我还必须为一个类从头开始编写词法分析器、解析器和解释器。这是一个非常糟糕的主意

  • 编写一个vim脚本将语法转换为C语法不是一件小事。是否编写过词法分析器?解析器?因为这就是您的vim脚本。词法分析器/解析器/编译器/解释器。在vim脚本中,这将是一场噩梦

  • 编写足够多的修改过的语法代码需要很长的时间,以收回编写和测试任何解释器(不仅仅是Vim脚本,尽管这可能是一个上限)所需的时间,而这些解释器将完成您所说的那种翻译

  • 即使您成功地创建了语法解释器,除非您在编写后让解释器以正常的C语法保存文件,否则任何必须阅读该代码的人都会想杀了您。如果您让解释器以正常的C cyntax格式保存文件并输出,那么下次您必须维护/修改该文件时,您将直接回到你的C代码的概念,你需要花太多的时间来编写

  • 如果你想冒险使用Vim脚本,你可以编写一些Vim脚本或映射/缩写,以减少花括号和分号的麻烦。这是值得的


  • 听起来你需要花一些时间来完善C语言的代码片段、缩写、宏和自动完成的用法。通过努力工作和练习,你会提高速度


    与你所建议的最接近的一个类比是,也许编写HAML来生成HTML。但是,这是一个声明性语言而不是命令式的。

    < P>如果C++是OK的,那么与Cython和PyRx不同,它用来将Python的子集转换成C++,并用Pr/G++编译它。意味着你所编码的一切都是Python,但是你不能使用Python的所有模块(实际上你只能使用其中的几个),你不能使用一些过于动态的东西。因为代码被转换成C++,用G++编译,这就足够了。 例如:

    # Actually, in Python, this is one line:
    matrix = [[1, 2, 3], [4, 5, 6]]
    zipped = zip(*matrix)
    # But, Shed Skin has some restrictions for this, so you have:
    matrix = [[1, 2, 3], [4, 5, 6]]
    zipped = zip(matrix[0], matrix[1])
    
    Shed Skin使用类型推断,因此

    x = 4.0 # OK
    x = 5.0 # OK
    x = "foo" # OK in Python, but Shed Skin will not compile this
    

    我必须警告您,即使开发处于活动状态,它仍处于实验阶段。

    我已经编写了一个小的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)
    
    void快速排序(int*lst、int左、int右):
    int i,j,p,tmp
    i=左
    j=对
    p=lst[(i+j)/2]
    而我是p:j--
    
    如果我预测,如果你这么做的话,任何在你之后必须维护代码的人都会对你怀恨在心。所有这些都是为了避免键入大括号和分号?这提醒了我
    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)