Ускорение написания программ на C с использованием подмножества синтаксиса Python - PullRequest
6 голосов
/ 16 декабря 2009

Я постоянно пытаюсь оптимизировать свое время. Написание кода на C занимает много времени и требует гораздо больше прикосновений к клавиатуре, чем, например, написание программы на Python.

Однако, чтобы сократить время, необходимое для создания программы на С, можно автоматизировать многие вещи. Я хотел бы написать свои программы, используя что-то. как 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;
} 

в оптимизированной питонизированной версии может выглядеть так:

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, но использует синтаксис pythonized, как только она решает преобразовать блоки pythonized в стандартный C, она выбирает такие блоки и нажимает какую-то клавишу И она, конечно, не сохраняет такой pythonized код, VIM переводит его в стандартный C.

Ответы [ 9 ]

8 голосов
/ 16 августа 2012

Я сделал небольшой скрипт на 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 читает намного лучше, чем точки с запятой и фигурные скобки по всему место. Я не понимаю, почему некоторые из вас так ненавидят эту идею. Что ты думаешь?

7 голосов
/ 16 декабря 2009

Cython предназначен для написания расширений Python, а не полноценных программ. То же самое относится и к Pyrex.

Даже если он сильно отличается от вашего примера, PyPy может быть тем, что вы ищете. Он использует подмножество Python (называемое RPython, своего рода более статичный python) для генерации кода для различных бэкэндов - включая C. Он не позволит вам детально управлять структурами данных, как вы, возможно, захотите, но попробуйте .

То, о чем вы просите, это действительно другой и несколько более простой диалект C - хотя это само по себе не может быть плохой идеей, в мире уже есть множество различных языков программирования, и это было бы весьма проблематично, если бы каждый придумал новый диалект для каждого приложения, которое должно быть написано.

Если вы считаете, что C слишком многословен или слишком низок для ваших нужд, попробуйте такой подход:

  • напишите вашу программу на python
  • профилируйте его и найдите, какие детали действительно нуждаются в скорости
  • изолировать такие части в четко определенных модулях
  • переписать такие части через Pyrex или Cython

и вы, вероятно, получите отличную читабельность, удобство обслуживания и скорость.

4 голосов
/ 16 декабря 2009

Вы указали, на что действительно тратите время - вы действительно хотите торговать ремонтопригодностью, чтобы сэкономить несколько нажатий клавиш?

Когда я пишу код, я трачу большую часть времени на чтение кода.

Возможно, вы просто очень медленный типер ...; -)

1 голос
/ 16 декабря 2009

Если вы хотите печатать меньше C, вам не нужны синтаксические трюки.

Вам нужна библиотека более качественных конструкций более высокого уровня, чтобы вы на самом деле печатали меньше C, а не меньше символов для создания псевдо-C.

Если бы у вас была библиотека более совершенных высокоуровневых конструкций, вы могли бы написать правильно объектно-ориентированные программы с коротким, легким для чтения синтаксисом.

Если довести это до логического предела, вы можете создавать красивые библиотечные пакеты, которые можно вызывать из Python. Затем вы можете переключиться на Python, набрать меньше и выполнить тот же объем работы.

1 голос
/ 16 декабря 2009

Посмотрите на "Go" ....

http://golang.org/

1 голос
/ 16 декабря 2009

Cython может помочь вам. Обычный способ использования Cython - это ускорение модулей путем компиляции части из них в C. Однако, если вы осторожны, вполне возможно использовать Cython для вывода чистых файлов C из Python-подобного синтаксиса.

Это также имеет то преимущество, что позволяет вам писать юнит-тесты на Python, если вы выберете.

0 голосов
/ 27 марта 2010

Если 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

Я должен предупредить вас, что он находится на экспериментальной стадии, хотя разработка активна.

0 голосов
/ 17 декабря 2009

Похоже, вам нужно посвятить некоторое время совершенствованию использования фрагментов кода, сокращений, макросов, автозаполнений для C. Вы наберете скорость благодаря усердной работе и практике.

Ближайшая вменяемая аналогия с тем, что вы предлагаете, - это, возможно, написание HAML для генерации HTML. Но это для декларативного языка, а не императивного.

0 голосов
/ 17 декабря 2009

Я написал несколько скриптов Vim для разных вещей. Мне также пришлось написать лексический анализатор, парсер и интерпретатор с нуля для класса. Это очень плохая идея.

  1. Написание сценария vim для перевода вашего синтаксиса в синтаксис C не является тривиальной вещью. Вы когда-нибудь писали лексический анализатор? парсер? Потому что таков будет ваш сценарий Vim. Лексический анализатор / парсер / компилятор / интерпретатор. Что было бы кошмаром для сценария Vim.

  2. Потребовалось бы длинное время, чтобы написать достаточно вашего измененного синтаксического кода, чтобы возместить время, которое потребуется для написания и проверки любого интерпретатора (не только сценария Vim, хотя это вероятно, будет верхняя граница), который будет перевод, о котором вы говорите.

  3. Даже если вы преуспели в создании синтаксического интерпретатора, если только вы не сохранили файл в обычном синтаксисе C после того, как вы его написали, любой, кому когда-либо приходилось читать этот код, хотел бы вас убить. И если бы ваш интерпретатор сохранил файл в обычном C-синтаксисе, который он выводил, в следующий раз, когда вам понадобится сохранить / изменить файл, вы сразу вернетесь к своему представлению о коде C, занимающему слишком много времени для написания.

  4. Если вы хотите быть в курсе сценариев Vim, вы всегда можете написать несколько сценариев Vim или сопоставлений / сокращений, чтобы сделать скучные фигурные скобки и точки с запятой намного менее болезненными. Это стоило бы сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...