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

9
我是一名不断优化时间的助手。编写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代码。


23
如果你这样做,我预测那些需要维护这段代码的人会对你怀有强烈的仇恨之情。 - andri
4
这一切是为了避免输入花括号和分号吗? - Paolo Tedesco
7
这让我想起了那些悲惨的难民Pascal程序员,他们会在每个项目中都使用一个包含#define BEGIN {#define END }的头文件。 - caf
1
我通常花更多的时间思考而不是打字,所以这样的东西对我来说是浪费的 :) - Wernsey
5
我对这个问题的负面反应感到非常惊讶。这与 CoffeeScript 有何根本区别?或者更恰当地说,与 zencoding 有何不同?我认为相同的思想也适用于 C,尽管我建议采用一种类似于 zencoding 的方法。输入一种紧凑的伪语言,自动展开为完整的、正确缩进的 C 版本。 - djs
显示剩余2条评论
9个回答

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代码。 这种方法效果很好,且在我看来比到处都是分号和花括号要易读得多。我不明白为什么有些人那么讨厌这个想法。你怎么认为?


这正是我正在寻找的。Python 脚本是否可用? - étale-cohomology

8
Cython旨在编写Python扩展,而不是完整的程序。Pyrex也是如此。
尽管它与您的示例非常不同,但PyPy可能是您要寻找的东西。它使用Python子集(称为RPython,一种更静态的Python)生成代码到不同的后端 - 包括C。它可能不能像您想要的那样对数据结构进行精细控制,但请尝试一下。
您所要求的实际上是一种不同且有些更容易的C方言 - 尽管本身可能不是一个坏主意,但世界各地已经有了大量不同的编程语言,如果每个应用程序都发明一个新的方言将会是一个相当大的问题。
如果您认为C过于冗长或过于底层,请尝试以下方法:
- 用Python编写程序 - 对其进行分析并找出真正需要速度的部分 - 在定义良好的模块中隔离这些部分 - 通过Pyrex或Cython重新编写这些部分
这样,您可能会获得良好的可读性、可维护性和速度。

我个人觉得C语言中很多语法已经过时了。不幸的是,几乎所有低级系统应用程序都是用C编写的,这个应用领域没有替代语言。 - psihodelia
虽然这可能是正确的 - 或者不是,取决于上下文 - 但你的解决方案并不是最好的。尝试将真正需要的C语言限制在特定的上下文中,并使用其他语言来“粘合”它。 - Alan Franzoni

4
你是否有评估过你实际花费时间的任务——你真的想为了节省几个按键而牺牲可维护性吗?
当我编写代码时,我大部分时间都在阅读代码。
也许你只是一个非常缓慢的打字者...;-)

OP应该调查卡内基梅隆大学的“个人软件过程”。其中一个属性是如何量化您的开发时间,无论是设计、编码还是测试。在这个层面上进行分析是OP所需要的。 - Thomas Matthews

2
如果你想少编写C语言,那么你不需要使用语法技巧。你需要一个更好的、更高级别的构建库,这样你才能真正减少输入C语言的次数,而不是减少字符以创建伪C语言。
如果你有一个更好的、更高级别的构建库,你可以用简短、易读的语法编写适当的面向对象程序。
将其推向极致,你可以创建可从Python调用的优秀库包。然后你就可以切换到Python,少打字并完成同样数量的工作。

1
如果C++适合您,与Cython和Pyrex不同,Shed Skin用于将Python的子集转换为C++并使用make/g++编译它。 "Python的子集"意味着您编写的所有内容仍然是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

我必须警告你,尽管开发活跃,但它仍处于实验阶段。


1

Cython可以帮助你。通常使用Cython的方式是通过将部分模块编译为C来加速。但是,如果你小心谨慎,完全可以使用Cython从类似Python的语法中输出纯C文件。

这样做的好处之一是让你选择用Python编写单元测试。


当然,如果网站宕机了,链接就不会起作用。唉,也许稍后再试一次? - John La Rooy

1

3
Go的语法并不比C简单多少,也不是VIM脚本。 - Pete Kirkham
1
Go语言基于C语言,受到Python语言的影响。它不是VIM脚本,而是一种命令式编程语言。当一个整个语言都被设计成更简单的语法时,为什么要使用一些文本编辑器技巧来规避常规呢? - AJ.
@PeteKirkham 我没有尝试过Go,但它似乎更易读。仅凭分号的删除和类型名称的结尾,至少使其更接近“适当”的可读性水平。 - Mikhail V

1

我写过一些针对不同事项的 Vim 脚本。我还不得不为一门课程从零开始编写词法分析器、解析器和解释器。这是一个非常糟糕的想法。

  1. 编写一个vim脚本将您的语法转换为C语法并不是一件简单的事情。你曾经写过词法分析器吗?解析器?因为这就是你的Vim脚本所要做的事情。一个词法分析器/解析器/编译器/解释器。在Vim脚本中完成这个任务会是一场噩梦。

  2. 编写足够多的修改后的语法代码需要很长时间,才能收回编写和测试任何解释器所需的时间(不仅仅是Vim脚本,尽管它可能是一个上限),以执行您所说的翻译。

  3. 即使您成功创建了您的语法解释器,除非您让它在您编写完后将文件保存为普通的C语法,否则任何需要阅读该代码的人都会想杀了你。如果您让解释器将文件保存在它输出的普通C语法中,下次您需要维护/修改该文件时,您将直接回到C代码需要花费太多时间的观念。

  4. 如果您想在Vim脚本中冒险,您可以编写一些Vim脚本或映射/缩写,使大括号和分号的繁琐变得不那么痛苦。这是值得做的。


0

听起来你需要花些时间完善使用C语言的片段、缩写、宏和自动完成功能。通过努力和实践,你将获得更快的速度。

你所建议的最接近的理智类比可能是编写HAML以生成HTML。但那是针对声明性语言而不是命令式语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接