Есть ли инструмент для проверки краткости программы на языке C?

Например, я хочу проверить, может ли следующий код быть более кратким или нет:

for(i = 0; i < map->size; i++){
    if(0 < map->bucket[i].n){
        p = map->bucket[i].list;
        while(p){
            h = hash(p->key) % n;
            if(bucket[h].list){
                new_p = bucket[h].list;
                while(new_p->next)new_p = new_p->next;
                new_p->next = p;
                next = p->next;
                p->next = NULL;
                p = p->next;
            }
            else{
                bucket[h].list = p;
                bucket[h].n++;
                next = p->next;
                p->next = NULL;
                p = p->next;
            }   
        }
    }
}

Есть ли инструмент для такой задачи?

Это было бы большим подспорьем для меня.


person Je Rog    schedule 31.08.2011    source источник
comment
Если вы выберете более короткие имена переменных, они будут более краткими?   -  person sth    schedule 31.08.2011
comment
Вот ваш инструмент: codereview.stackexchange.com   -  person Mike Kwan    schedule 31.08.2011
comment
R u sr tht bng cncs s a gd thng? Извините, вы уверены, что быть кратким — это хорошо?   -  person Keith Thompson    schedule 31.08.2011
comment
Предупреждение: здесь должен быть запутанный C   -  person Chowlett    schedule 31.08.2011
comment
@Mike Kwan: ​​Наверняка вы имеете в виду codegolf.stackexchange.com   -  person Dietrich Epp    schedule 31.08.2011
comment
Я имею в виду лаконичность в логике, а не в названии.   -  person Je Rog    schedule 31.08.2011


Ответы (3)


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

Существует слайсер с открытым исходным кодом для программ C здесь.

Для того, чтобы сделать программы более краткими, возможно, ограничение сохранения только инструкций исходной программы в том виде, в каком они есть, слишком сильное. Вы также можете разрешить некоторые преобразования, кроме «сохранения» или «удаления». Фреймворк, частью которого является упомянутый выше слайсер, также обеспечивает такое преобразование. Например:

int main(int c, char **v)
{
  int x = 2;
  int y = x + c;
  return y; 
}

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

int main(int c, char **v)
{
  int x = 2;
  int y = 2 + c;
  return y; 
}

Затем слайсер может во втором проходе удалить бесполезную переменную x:

int main(int c, char **v)
{
  int y = 2 + c;
  return y; 
}
person Pascal Cuoq    schedule 31.08.2011
comment
+1, приятно знать такой инструмент~ - person Je Rog; 31.08.2011

Ответ квалифицированный "нет",

  • Нет, потому что невозможно написать программу, которая всегда будет отвечать, можно ли сделать код более лаконичным или нет. Если бы такая программа могла существовать, вы могли бы использовать ее для создания логического парадокса (именно поэтому мы знаем, что она не может существовать).

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

  • Да, потому что вы можете использовать статический анализ для поиска мертвого кода.

Люди проводят огромное количество исследований, чтобы сделать программы меньше и быстрее автоматически, используя статический анализ, но почти все эти исследования применяются для создания лучших оптимизаторов для компиляторов. Оптимизаторы могут производить практически нечитаемый вывод, поэтому мы используем их не для создания исходного кода, а только для объектного кода.

Держите исходный код чистым и читабельным. Компилятор позаботится об остальном в 99% случаев.

person Dietrich Epp    schedule 31.08.2011
comment
Логически более лаконичный код сделает код более читабельным. - person Je Rog; 31.08.2011
comment
@Je Rog: #!/usr/local/bin/perl -s do 'bigint.pl';($_,$n)=@ARGV;s/^.(..)*$/0$&/; ($k=unpack('B*',pack('H*',$_)))=~ s/^0*//;$x=0;$z=$n=~s/./$ x=&badd(&bmul($x,16),hex$&)/ge;while(read(STDIN,$_,$w=((2*$d-1+$z)&~1)/2) ){$r=1;$_=substr($_.\0x$w,$c=0,$w);s/.|\n/$c=&badd(&bmul ($c,256),ord $&)/ge;$_=$k;s/./$r=&bmod(&bmul($r,$r),$x),$&?$r=&bmod(&bmul($r,$c ) ,$x):0,/ge;($r,$t)=&bdiv($r,256),$_=pack(C,$t).$_ while$w--+1-2*$ д;печать} - person Dietrich Epp; 31.08.2011
comment
Пожалуйста, разместите его в хорошем формате в первую очередь. Мой вопрос не в формате или красивом коде, а в логической лаконичности, которая должна заботить всех c-программистов. - person Je Rog; 31.08.2011
comment
@Dietrich: Неужели невозможно написать программу, которая всегда ответит, можно ли сделать код более кратким или нет? Мне кажется, что так и должно быть, но я не вижу доказательства (диагонализации) прямо сейчас. - person DaveFar; 04.09.2011
comment
@DaveBall: Вы можете использовать такую ​​программу для решения проблемы с остановкой. - person Dietrich Epp; 04.09.2011
comment
Это была моя первая мысль, но я ее не вижу: вы можете решить, будет ли программа никогда не завершаться, уменьшив ее до самой краткой, которая просто выполняет бесконечный цикл. Но этого недостаточно для программ с параметрами, не так ли? - person DaveFar; 04.09.2011
comment
@DaveBall: Вы продвигаете это доказательство в неправильном направлении. Начните с произвольной машины Тьюринга i и произвольного ввода x, а затем покажите, как можно использовать оптимизатор, чтобы определить, останавливается ли i на вводе x. Поскольку это невозможно, вы знаете, что оптимизатора не существует. - person Dietrich Epp; 04.09.2011

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

person Daniel    schedule 31.08.2011