?

Log in

No account? Create an account

Тезаурус проекта - Общество дровосеков Бердичева по изучению Мишны

Feb. 20th, 2015

03:39 pm - Тезаурус проекта

Previous Entry Share Next Entry

Какие самые частые слова в языке программирования С++?

Пишем скриптик (комментарии добавлены при публикации):

find Code -name '*.cc' -o -name '*.h' | \ находим все файлы с исходным кодом
 xargs cat | \ собираем вместе
  tee allsource | \ сохраняем чтоб было
   sed s/#/@/g | \ не даем работать препроцессору
    cpp | \ теперь он только комментарии удаляет
     sed '/#/d;/^$/d' | \ удаляем вставленные препроцессором номера строк и пустые строки
      sed "s/'\"'/@/g" | sed 's/\\[\\"]/@/g; s/"[^"]*"/ /g' \ ликвидируем всё в двойных кавычках
> nocomments

wordcnt < nocomments | \ частотный словарь алфавитно-цифровых последовательностей
sort -r -n -k 2 | \ сортируем
grep -v '^ *[0-9]' \ выбрасываем числа
> fullcnts

Перловый скриптик wordcnt таков:
while (<>) {
        @words=split(/[\W\s]+/, $_);
        foreach $word (@words) {
                $wordcnt{$word}++;
        }
}
foreach $word (keys(%wordcnt)) {
        printf "%20s %d\n", $word, $wordcnt{$word};
}


В результате на треть миллиона строк живого кода (nocomments) выходит около 38 тысяч разных умных слов. Частотный словарь начинается так:
                  if 27202
               const 21901
              return 20803
                 int 13856
                void 13070
                char 12530
                bool 10847
                this 8959
                 std 8399
                else 8278
                case 7021
                NULL 6896
                   i 6767
               false 6288
                  it 5855
            unsigned 5396
             include 5287
                true 5158
                Expr 5046
                 mod 4678
              string 4480
                name 4358
               break 4043
                 for 3868
               c_str 3804
               class 3742
                size 3670
              public 3633

(i, it и mod - имена переменных, Expr - имя типа, но не того, которого обычно переменная с именем mod)

Comments:

[User Picture]
From:archaicos
Date:February 21st, 2015 12:42 am (UTC)
(Link)
Какой низкий selfesteem у кода. if на if'е. Ещё и труъс. Чуть что, сразу return. Превосходно const'ный результат. :)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 12:56 am (UTC)
(Link)
Проверяй (if), и постоянно (const) возвращайся (return) целым (int), хоть и пустым (void) или обугленным (char).
(Reply) (Parent) (Thread)
[User Picture]
From:malyj_gorgan
Date:February 21st, 2015 01:19 am (UTC)
(Link)
А потому что пишут код не о том: for'ов маловато, goto забыли, сразу видно, херней занимаются, вместо того, чтобы считать серьезные вещи :)
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 01:40 am (UTC)
(Link)
Раз for'ов мало, значит, код занимается штучной работой, а не вал гонит.
(Reply) (Parent) (Thread)
[User Picture]
From:amigofriend
Date:February 21st, 2015 01:28 am (UTC)
(Link)
Тот факт что else гораздо меньше чем if говорит о том что большинство дел приходится делать только в определённых случаях.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 01:40 am (UTC)
(Link)
И дела эти, как водится - сообщения о фатальных ошибках.
(Reply) (Parent) (Thread)
[User Picture]
From:fatoff
Date:February 21st, 2015 01:39 am (UTC)
(Link)
А вот NULL, это пережитки тоталитарного несегодняшнего режима!
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 01:41 am (UTC)
(Link)
Вот ужо перейдем на компилятор, поддерживающий C++11, тут-то нам и будет раздолье.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:ak_47
Date:February 21st, 2015 02:04 am (UTC)
(Link)
Ну прям виртуоз коммандной строки и акула пайпа. :)

Покажи мне свой частотный анализ и я скажу какой код ты пишешь!
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 02:14 am (UTC)
(Link)

Это я по мотивам code stylometry. Как в естественном языке автора можно с хорошей точностью установить по соотношению частот полудюжины самых частотных слов (союзов, предлогов, местоимений), так и в языке программирования должно быть можно.

В статье подход другой; он сложнее, но, по идее работает на более коротких образчиках: из ~630 строк много статистики о служебных словах не вытащить, приходится грамматику использовать. В крупном проекте индивидуальные особенности усредняются, и можно будет посмотреть, зависит ли распределение частот от предметной области, если кто-нибудь еще не поленится проанализировать.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:dvv
Date:February 21st, 2015 02:30 am (UTC)
(Link)
Настораживает количество c_str.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 03:11 am (UTC)
(Link)
Это из-за работы с библиотекой от third party со старинным API. В этом году надеемся от нее избавиться.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:soloviewoff
Date:February 21st, 2015 03:31 am (UTC)
(Link)
Что за такая популярная переменная mod? "int mod = x % y"? Как-то до фига.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 03:44 am (UTC)
(Link)
В некоторых языках некоторые объекты называются модулями. :)
(Reply) (Parent) (Thread)
[User Picture]
From:sab123
Date:February 21st, 2015 06:34 am (UTC)
(Link)
Зачем так много this? Он бывает нужен очень редко. Да и почему так много include - тоже непонятно. Куча мелких файлов, каждый с кучей инклюдов?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 21st, 2015 06:39 am (UTC)
(Link)
В какой-то части проекта у кого-то из какой-то страны была манера писать this явно. Может, так в какой-то книге зачем-то учили. Много include - потому что каждый include-файл явно перечисляет все свои зависимости. Если бы я брал только *.cc файлы, частотность слова include резко бы упала.
(Reply) (Parent) (Thread)
[User Picture]
From:real_big_shish
Date:February 21st, 2015 08:33 am (UTC)
(Link)
если.константа.вернётся.целой..
это же просто стихи!
(Reply) (Thread)
[User Picture]
From:archaicos
Date:February 21st, 2015 11:46 am (UTC)
(Link)
Если константа вернётся целой,
Ничто очернит дуальное эго!
ЗППП - другое дело! Ноль
Я неверный! И анонимный!
Включил правду! Выразил моду!
Нанизал имя! Послушал Кастро!
Класс! Масштаб! Вход свободный!


Edited at 2015-02-21 12:06 pm (UTC)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:janatem
Date:February 21st, 2015 04:06 pm (UTC)
(Link)
Такой скриптик может сломаться, если find найдем слишком много файлов: xargs будет запускать shell с огромной командной строкой (cat и куча имен файлов), а у него есть ограничение.
(Reply) (Thread)
[User Picture]
From:janatem
Date:February 21st, 2015 04:08 pm (UTC)
(Link)
Ну и есть нехорошие люди, которые используют пробелы и другие некошерные символы в именах файлов. Поэтому надо добавить -print0 и -0 к find и xargs соответственно.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:master_a
Date:February 21st, 2015 10:35 pm (UTC)
(Link)
Why so many instances of "const"? In embedded system AFAIK it can help to keep more stuff in plentiful FLASH instead of the RAM, but for a desktop?
(Reply) (Thread)
[User Picture]
From:spamsink
Date:February 22nd, 2015 12:21 am (UTC)
(Link)
To make sure that an object supposed to be immutable within a function immutable stays immutable.
Also, more optimizations are possible when the compiler is allowed to assume that a value pointed to hasn't changed after a function call.
(Reply) (Parent) (Thread)