Я постоянно пытаюсь оптимизировать свое время. Написание кода 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;
}
в оптимизированной 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.
Cython предназначен для написания расширений python, а не полноценных программ. То же самое и с Pyrex.
Несмотря на то, что он сильно отличается от вашего примера, PyPy может быть тем, что вы ищете. Он использует подмножество Python (называемое RPython, что-то вроде более статичного питона) для генерации кода для разных бэкэндов, включая C. Он не позволит вам детально контролировать структуры данных, как вы хотите, но попробуйте .
То, что вы просите, на самом деле другой и несколько более простой диалект Си - хотя это может быть неплохой идеей само по себе, в мире уже существует множество различных языков программирования, и это будет серьезной проблемой если бы все придумали новый диалект для каждого приложения, которое должно быть написано.
Если вы думаете, что язык C слишком многословен или слишком низок для ваших нужд,
Have you profiled what you actually spend time on --- you really want to trade maintainability for saving a few keystrokes?
When I write code, I spend most my time reading code.
Perhaps you're just a very slow typer... ;-)
Если вы хотите печатать меньше C, вам не нужны синтаксические уловки.
Вам нужна библиотека лучшего , конструкции более высокого уровня, так что вы фактически набираете меньше C, а не меньше символов для создания псевдо-C.
Если бы у вас была библиотека с более качественными конструкциями более высокого уровня, вы могли бы писать правильно объектно-ориентированные программы за короткие и простые слова. читать синтаксис.
Доводя это до логического предела, вы можете создавать хорошие пакеты библиотек, которые можно вызывать из Python. Затем вы можете переключиться на Python, набрать меньше текста и выполнить тот же объем работы.
Cython может вам помочь. Обычный способ использования cython - ускорить работу модулей за счет того, что часть из них скомпилирована в C. Однако вполне возможно использовать cython для вывода чистых файлов C с синтаксисом, подобным python, если вы будете осторожны.
Это также имеет преимущество в том, что позволяя писать модульные тесты на Python, если хотите.
Похоже, вы должны посвятить некоторое время, чтобы совершенствовать использование сниппетов, сокращения, макросы, autocompletes для C. Вы будете набирать скорость с тяжелой работой и практикой.
Самая близкая разумная аналогия тому, что вы предлагаете, - это, возможно, написание HAML для генерации HTML. Но это для декларативного языка не императивный.
I've written a few Vim scripts for various things. I also had to write a lexical analyzer, parser, and interpreter from scratch for a class. This is a very bad idea.
Writing a vim script to translate you syntax to C syntax is not a trivial thing. Ever written a lexical analyzer? a parser? Because that's what your Vim script would be. A lexical analyzer/parser/compiler/interpreter. Which would be a nightmare to do in Vim script.
It would take a long time to write enough of your modified-syntax code to recoup the time it would take to write and test any interpreter (not just a Vim script one, although that would probably be an upper bound) that would do the kind of translation you're talking about.
Even if you were successful in creating your syntax-interpreter, unless you had it save the file in normal C syntax after you wrote it, anyone who ever had to read that code would want to kill you. And if you had your interpreter save the file in the normal C cyntax it was outputting, next time you had to maintain/modify the file, you'd be straight back to your notion of C code taking too much time for you to write.
If you want to be adventurous with Vim scripting, you could always write some Vim scripts or mappings/abbreviations to make the tedium of curly braces and semicolons a lot less painful. That would be worth doing.
Если 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
я должен предупредить вас, что он находится на экспериментальной стадии, хотя разработка и активна.