spamsink: (lenin)
[personal profile] spamsink
Какие самые частые слова в языке программирования С++?

Пишем скриптик (комментарии добавлены при публикации):
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)

Date: 2015-02-21 12:42 am (UTC)
From: [identity profile] archaicos.livejournal.com
Какой низкий selfesteem у кода. if на if'е. Ещё и труъс. Чуть что, сразу return. Превосходно const'ный результат. :)

Date: 2015-02-21 01:19 am (UTC)
From: [identity profile] malyj-gorgan.livejournal.com
А потому что пишут код не о том: for'ов маловато, goto забыли, сразу видно, херней занимаются, вместо того, чтобы считать серьезные вещи :)

Date: 2015-02-21 01:28 am (UTC)
From: [identity profile] amigofriend.livejournal.com
Тот факт что else гораздо меньше чем if говорит о том что большинство дел приходится делать только в определённых случаях.

Date: 2015-02-21 01:39 am (UTC)
From: [identity profile] fatoff.livejournal.com
А вот NULL, это пережитки тоталитарного несегодняшнего режима!

Date: 2015-02-21 06:46 am (UTC)
From: [identity profile] fatoff.livejournal.com
Это вы мощно тормозите, принимая во внимание достаточно хорошую стабильность gcc по фичам C++ 11.

Date: 2015-02-21 02:04 am (UTC)
ak_47: (default)
From: [personal profile] ak_47
Ну прям виртуоз коммандной строки и акула пайпа. :)

Покажи мне свой частотный анализ и я скажу какой код ты пишешь!

Date: 2015-02-21 02:28 am (UTC)
ak_47: (default)
From: [personal profile] ak_47
Почитал статью. Довольно интересно. Правда, учитывая сколько параметров они закладывают в модель, так и неудивительно что такая хорошая корелляция. На одних только keywords и переменных сильно труднее будет, я думаю.

Язык тоже важен. На какой-нибудь Джаве около 60% кода вообще генерится средой. Что там можно нанализировать вопрос открытый. Вообще, я вижу что machine learning в последние годы стал модный тренд в computer sciences (за другие науки не скажу, не знаю). У нас на работе интерны тоже бросаются на амбразуру с machine learning наперевес. Результаты обычно так себе. Начинаю понимать Шкрёбиуса с его пессимистическим взглядом на современную науку. :)

П.С. Имя у девочки роскошное.

П.П.С Насчёт предметной области согласен. Большинство корпоративного кода это унылый boilerplate, такой же как и middle management и егойные кодеры. Никакой индивидуальности не обнаружишь.
Edited Date: 2015-02-21 02:30 am (UTC)

Date: 2015-02-21 02:30 am (UTC)
From: [identity profile] dvv.livejournal.com
Настораживает количество c_str.

Date: 2015-02-21 10:30 am (UTC)
From: [identity profile] dvv.livejournal.com
Обёрточки же ж, обёрточки… Ну это я так, о своём, о грустном больше.

Date: 2015-02-21 03:31 am (UTC)
From: [identity profile] soloviewoff.livejournal.com
Что за такая популярная переменная mod? "int mod = x % y"? Как-то до фига.

Date: 2015-02-21 06:34 am (UTC)
From: [identity profile] sab123.livejournal.com
Зачем так много this? Он бывает нужен очень редко. Да и почему так много include - тоже непонятно. Куча мелких файлов, каждый с кучей инклюдов?

Date: 2015-02-21 06:48 am (UTC)
From: [identity profile] fatoff.livejournal.com
При разработке гуев this просто самый популярный парень на деревне. Чтобы обозанчить, какой там виджет является родителем и иерархически отвечает за life-cycle нижнего по иерархии.

Date: 2015-02-21 04:40 pm (UTC)
From: [identity profile] sab123.livejournal.com
Передается параметром в туче мест?

Date: 2015-02-21 05:33 pm (UTC)
From: [identity profile] fatoff.livejournal.com
В Qt есть базовый класс QObject, как гордый праотэц большинства библиотечных классов. Если вы создаёте новый объект, то можете передать ему this от текущего, и более не заботиться о явном освобождении ресурсов того объекта.

auto* pObj = new QMyObject(this); // this is also QObject

Естественно QMyObject::QMyObject(QObject* parent = 0) : QObject(parent) {blah();}

А конструктор QObject вызывает что-то вроде if(parent) parent->addToChildList(this);
Edited Date: 2015-02-21 05:36 pm (UTC)

Date: 2015-02-22 02:44 am (UTC)
From: [identity profile] sab123.livejournal.com
Ну, значит логично, передается параметром. Из других полезных применений - идиома для методов, которые можно вызывать с нулевым объектом:

if (this == NULL) return DEFAULT_VALUE;

Date: 2015-02-21 10:32 am (UTC)
From: [identity profile] dvv.livejournal.com
C this часто гораздо лучше читается. Или даже всегда лучше читается.

Date: 2015-02-21 04:39 pm (UTC)
From: [identity profile] sab123.livejournal.com
Для этого есть гораздо более лучшие стили. Наверное самый лучший - это заканчивать имена полей в классах на "_". И делается сразу видно, где что, и коротко.

Date: 2015-02-21 04:48 pm (UTC)
From: [identity profile] dvv.livejournal.com
Ужас какой. Не говоря уже о том, что бывают и методы, и наследование. А коротко хочется — нет ничего короче APL. Ну или ещё какой смешной обфускации — Лёня про это лучше всех знает.

Date: 2015-02-22 02:40 am (UTC)
From: [identity profile] sab123.livejournal.com
Вызывать методы через this - истинно ужас. А коротко - да, это важно для читаемости.

Date: 2015-02-21 08:33 am (UTC)
From: [identity profile] real-big-shish.livejournal.com
если.константа.вернётся.целой..
это же просто стихи!

Date: 2015-02-21 11:46 am (UTC)
From: [identity profile] archaicos.livejournal.com
Если константа вернётся целой,
Ничто очернит дуальное эго!
ЗППП - другое дело! Ноль
Я неверный! И анонимный!
Включил правду! Выразил моду!
Нанизал имя! Послушал Кастро!
Класс! Масштаб! Вход свободный!
Edited Date: 2015-02-21 12:06 pm (UTC)

Date: 2015-02-22 09:01 am (UTC)
From: [identity profile] archaicos.livejournal.com
Ага, не ведая цитат.

Date: 2015-02-21 04:06 pm (UTC)
From: [identity profile] janatem.livejournal.com
Такой скриптик может сломаться, если find найдем слишком много файлов: xargs будет запускать shell с огромной командной строкой (cat и куча имен файлов), а у него есть ограничение.

Date: 2015-02-21 04:08 pm (UTC)
From: [identity profile] janatem.livejournal.com
Ну и есть нехорошие люди, которые используют пробелы и другие некошерные символы в именах файлов. Поэтому надо добавить -print0 и -0 к find и xargs соответственно.

Date: 2015-02-21 05:03 pm (UTC)
From: [identity profile] janatem.livejournal.com
Хм, а как он это делает? Просто вызов exec() уже не имеет ограничений? Я, кажется, вспомнил свою ситуацию: написал в тех же терминах что-то вроде cat `find ...`, и баш сломался, а xargs, действительно, помог.

Date: 2015-02-21 05:16 pm (UTC)
From: [identity profile] janatem.livejournal.com
Да, но что делать, если из потока лезет больше? Порезать на части и несколько раз запускать указанную команду? Но тогда семантика изменится.

Date: 2015-02-21 10:35 pm (UTC)
From: [identity profile] master-a.livejournal.com
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?

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 7th, 2026 06:18 pm
Powered by Dreamwidth Studios