我一直在努力优化自己的时间。编写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;
}
优化的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
我的问题是:您是否知道任何VIM脚本,它允许将原始的pythonized C代码转换为标准C代码?例如,一个是编写C代码但使用pythonized语法,一旦她决定将pythonized块转换为标准C,她就选择这样的块并按下某个键。当然,她不保存这样的python化代码,VIM将其转换为标准C。
答案 0 :(得分: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)
非常简单,只需查看行并检查几个模式并更改缩进以生成标准C代码。 很好地工作,imho读取比分号和括号更好 地点。我不明白为什么你们这些人非常讨厌这个想法。你觉得怎么样?
答案 1 :(得分:7)
Cython旨在编写python扩展,而不是完整的程序。 Pyrex也是如此。
即使它与您的示例完全不同,PyPy可能正是您正在寻找的。它使用Python子集(称为RPython,一种更为静态的python)来为不同的后端生成代码 - 包括C.它不会让你对数据结构进行细粒度的控制,但是试一试
你要求的实际上是一种不同且更容易的C方言 - 虽然它本身可能不是一个坏主意,但世界上已经有很多不同的编程语言,如果它是一个问题,如果每个人都为每个应该写的应用程序发明了一种新的方言。
如果您认为C过于冗长或过低,无法满足您的需求,请尝试以下方法:
你可能会获得很好的可读性,可维护性和速度。
答案 2 :(得分:4)
你有没有想过你实际花费的时间 - 你真的想交易可维护性以节省一些按键吗?
当我编写代码时,我花了大部分时间阅读代码。
也许你只是一个非常缓慢的typer ...; - )
答案 3 :(得分:1)
Cython可以帮到你。使用cython的常用方法是通过将模块的一部分编译为C来加速模块。但是如果你小心的话,完全可以使用cython从pythonlike语法输出纯C文件。
如果您愿意,这也有一个优点,就是让您在Python中编写单元测试。
答案 4 :(得分:1)
看看“Go”....
答案 5 :(得分:1)
如果你想输入更少的C,你不需要语法技巧。
您需要一个更好,更高级别构造的库,这样您实际上可以输入更少的C,而不是更少的字符来创建伪C。
如果你有一个更好的,更高级别的结构库,你可以用简短易读的语法编写正确的面向对象程序。
将此视为逻辑极端,您可以创建可从Python调用的漂亮库包。然后你可以切换到Python,输入less并完成相同的工作量。
答案 6 :(得分:0)
我为各种事情编写了一些Vim脚本。我还必须从头开始编写一个词法分析器,解析器和解释器。这是非常坏主意。
编写一个vim脚本将语法转换为C语法并非易事。有没有写过词法分析器?一个解析器?因为这就是你的Vim脚本。词法分析器/解析器/编译器/解释器。在Vim剧本中,这将是一场噩梦。
需要 long 时间来编写足够的修改后的语法代码来补充编写和测试任何解释器所需的时间(不仅仅是Vim脚本),尽管这可能是一个上限,可以做你正在谈论的那种翻译。
即使您成功创建了语法解释器,除非您在编写之后将文件保存为正常的C语法,否则任何曾经阅读过该代码的人都会想要杀死您。如果你让你的解释器将文件保存在正常的C语言中,那么它就是输出,下次你必须维护/修改文件时,你会直接回到你的C代码概念,花费太多时间来编写。
如果您想要使用Vim脚本进行冒险,您可以随时编写一些Vim脚本或映射/缩写,以使花括号和分号的繁琐减轻痛苦。 那值得做。
答案 7 :(得分:0)
听起来你需要花一些时间来完善C片段,缩写,宏,自动复合的使用。你将通过努力工作和练习获得速度。
与您所建议的最接近的理智类比可能是编写HAML来生成HTML。但这是一种声明性语言,而非命令性语言。
答案 8 :(得分:0)
如果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
我必须警告你,即使开发活跃,它仍处于试验阶段。