2009-12-16 17 views
6

我不斷嘗試優化我的時間。編寫C代碼需要花費很多時間,並且比編寫Python程序需要更多的鍵盤觸摸。使用Python語法的子集加速編寫C程序

但是,爲了加快創建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,她選擇這些塊並按下一些鍵。而且她不保存這樣的pythonized代碼當然,VIM將其翻譯成標準C.

+23

我預測,如果你這樣做,那麼任何在你之後必須維護該代碼的人都會以激情激情憎恨你。 – andri 2009-12-16 10:50:46

+4

這一切都是爲了避免輸入大括號和分號? – 2009-12-16 10:55:45

+7

這讓我想起了許多那些悲慘的難民Pascal程序員,他們使用包含'#define BEGIN {'和'#define END}'的頭文件開始每個項目。 – caf 2009-12-16 10:55:50

回答

7

Cython旨在編寫python擴展,而不是完整的程序。 Pyrex也是如此。

即使它和你的例子有很大的不同,PyPy可能就是你要找的東西。它使用一個Python子集(稱爲RPython,一種更加靜態的python)爲不同的後端生成代碼 - 包括C,它不會讓你對數據結構進行細化控制,但可以嘗試一下。

你在問什麼是一種真正不同的,更簡單的C語言 - 儘管它本身可能並不是一個壞主意,但世界各地已經有很多不同的編程語言,並且這將是一個相當大的問題如果每個人都爲每個應該寫的應用程序發明一個新的方言。

如果您認爲C是太冗長或過於低級您的需求,嘗試這個辦法:

  • 編寫程序,在python
  • 配置文件,並發現哪些部分真正需要的速度
  • 分離等部分中明確定義的模塊
  • 重寫通過耐熱玻璃或用Cython

這樣的零件,你可能會獲得很好的可讀性,可維護性和速度。

+0

我個人覺得C中很多語法的東西都過時了。不幸的是,幾乎所有的底層系統應用程序都是用C語言編寫的,而且這個應用程序區域沒有其他語言。 – psihodelia 2009-12-16 11:29:16

+0

雖然這可能是真的 - 或不是,根據上下文 - 你的不是最好的解決方案。嘗試將C - 真正的C - 限制在真正需要的上下文中,並使用其他語言將其粘合在一起。 – 2009-12-16 12:03:00

1

Cython可以幫助你。通常使用cython的方法是通過將模塊的一部分編譯爲C來加速模塊。但是,如果您注意,使用cython從pythonlike語法輸出純C文件是完全可能的。

這也有一個好處,就是讓你用Python編寫單元測試,如果你選擇的話。

+0

你的鏈接不工作 – psihodelia 2009-12-16 10:57:54

+0

該網站已關閉atm,請嘗試谷歌緩存:http://74.125.77.132/search?q=cache:EtESDtjoaaMJ:www.cython.org/+cython.org&cd=1&hl=zh-CN&ct= clnk&gl = se – Jonas 2009-12-16 11:41:11

+0

當然如果網站鏈接不起作用,sheesh。也許以後再試一次? – 2009-12-16 11:41:38

1

看一看「轉到」 ....

http://golang.org/

+3

Go的語法並不比C簡單多了,它不是一個VIM腳本 – 2009-12-16 11:16:19

+1

Go基於C語言,並受Python的影響。不,它不是VIM腳本,它是一種命令式編程語言。爲什麼使用一些文本編輯器hackery來設計一個更簡單的語法來設計整個語言時的旁觀約定呢? – 2009-12-16 13:51:48

+0

@PeteKirkham我還沒有嘗試過,但它似乎更具可讀性。單獨的分號和類型名稱使得它至少更接近「足夠」的可讀性級別。 – 2016-11-26 01:24:58

1

如果你想少打字C,你不需要語法技巧。

您需要一個更好,更高級別的構造庫,以便實際輸入更少的C,更少的字符來創建僞C。

如果您有一個更好,更高級別的構造庫,您可以使用簡短易讀的語法編寫正確的面向對象程序。

考慮到邏輯極端,您可以創建可從Python調用的很好的庫包。然後你可以切換到Python,輸入less並獲得相同的工作量。

4

你是否描述過你真正花費的時間---你真的想要交換維護性以節省幾個擊鍵?

當我編寫代碼時,我花了大部分時間讀取的代碼。

也許你只是一個非常慢打字員... ;-)

+0

OP應該調查卡內基梅隆的*個人軟件過程*。其中一個特點是如何量化開發時間,無論是設計,編碼還是測試。在這個級別進行分析是OP需要的。 – 2009-12-17 22:52:42

0

我什麼艾倫弗蘭佐尼說:「你要求的是一個真正的不同,比較容易的C語言」,並同意自你已經準備好使用你提出的這種不同的方言,我可以建議computer language D?它解決了C中的許多問題,同時仍然允許嚴格控制內存和結構。它也連接兼容C.

另一種方法可能是目的C.

這就是說,它應該不會太難寫,從你的語法與C的語法轉換解析器,但我懷疑的其他人也在這裏,有人會討厭你,因爲維護這個計劃的時間到了。 ;-)

0

我已經爲各種事情寫了幾個Vim腳本。我還必須爲一個班級從頭開始編寫一個詞法分析器,解析器和解釋器。這是一個很不好主意

  1. 編寫一個vim腳本將語法轉換爲C語法並不是一件小事。曾經寫過一個詞法分析器?解析器?因爲這就是你的Vim腳本。詞法分析器/解析器/編譯器/解釋器。這對Vim腳本來說是一場噩夢。

  2. 這將需要一個時間寫夠你修改的語法代碼收回的時間,將採取編寫和測試任何解釋器(不只是一個Vim腳本之一,儘管這可能是上綁定),這將做你正在談論的翻譯類型。

  3. 即使您成功創建語法解釋器,除非您在編寫它之後以正常C語法保存該文件,但任何曾經閱讀過該代碼的人都會想要殺死您。如果你的解釋器保存了正常輸出的C cyntax中的文件,下次你不得不維護/修改文件時,你會直接回到C代碼的概念上,這會花費太多時間來編寫。

  4. 如果您想冒險使用Vim腳本,您可以隨時編寫一些Vim腳本或映射/縮略語,以減少花括號和分號的繁瑣操作。 值得去做。

0

聽起來你需要投入一些時間來完善C代碼片段,縮寫,宏,自動補全的使用。你將通過辛勤工作和練習獲得速度。

與你所建議的最接近的類比可能是編寫HAML來生成HTML。但那是一種聲明性語言,而不是一個必要的語言。

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]) 

脫皮使用類型推斷,那麼,

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

我必須提醒你,這是即使發展是積極的實驗階段。

7

我做了一個小的Python腳本,讓我用C在Python語法,就像這樣:

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讀取比分號和括號更好地遍佈 地方。我不明白爲什麼有些人非常討厭這個想法。你怎麼看?

+0

這正是我要找的。 Python腳本是否可用? – 2016-07-30 15:02:04