The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Разработчики из Google предложили разработать свою libc для ..., opennews (??), 26-Июн-19, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


92. "Разработчики из Google предложили разработать свою libc для ..."  –1 +/
Сообщение от Аноним (92), 27-Июн-19, 10:05 
Я изучал стандартную библиотеку языка С:
glibс - это треш, в котором черт ногу сломит (макрос на макросе) - очень сложно разобраться и понять что там происходит. Видимо девиз тех, кто это писал такой: Смотрите как мы можем, смотрите какие мы умные, а вы нет!
musl - они думают, что они лучше glibc, но по факту не так уж и сильно. Более того, это ещё один пример того как НЕ надо писать на языке Си. Ребята очнитесь вы там, вы пишите код для людей, а не ебу** заклинания для компилятора.
bsd libc (в openbsd) - по сути такое же гавно (в плане стиля кода), как и
Ответить | Правка | Наверх | Cообщить модератору

93. "Разработчики из Google предложили разработать свою libc для ..."  –1 +/
Сообщение от Аноним (92), 27-Июн-19, 10:11 
Продолжение:
остальные - не пишите так код!
Р/S IMHO Лично мне куда больше нравится стиль в книге The Standard C Library (реализация ANSI C library)
Ответить | Правка | Наверх | Cообщить модератору

95. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 27-Июн-19, 10:39 
Вот вам пример из исходников:
https://git.musl-libc.org/cgit/musl/tree/src/string/strncat.c
А теперь, кто внимательный, видите здесь, что-то странное (лишнее)?
Ответить | Правка | Наверх | Cообщить модератору

102. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Andrey Mitrofanov_N0 (??), 27-Июн-19, 11:22 
> Вот вам пример из исходников:
> https://git.musl-libc.org/cgit/musl/tree/src/string/strncat.c
> А теперь, кто внимательный, видите здесь, что-то странное (лишнее)?

Из n надь вычесть strlen(s).  И единицу.   И проверить underflow при том.  

Я выиграл?  Не отвечайте.  Я знаю, что проиграл -- "программирование" не моё.

Ответить | Правка | Наверх | Cообщить модератору

108. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от solardiz (ok), 27-Июн-19, 13:03 
Не вижу. Если Вы видите, сообщите, пожалуйста, что именно там "странное (лишнее)".
Ответить | Правка | К родителю #95 | Наверх | Cообщить модератору

109. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 27-Июн-19, 13:41 
Нужно писать так:
*d = 0;
вместо этого:
*d++ = 0;
В данном случае, это никак не отражается на том, как ведёт себя данный код, однако согласитесь что это не есть хорошо!

P\S
Опять же это лишний раз показывает то, что код должен быть написан в первую очередь для людей, так чтобы даже скажем условный студент 1-3 курса смог без труда разобраться.
Например, я бы написал это так:
char *strncat(char *to, const char *from, size_t n)
{
    char *ret;
    ret = to;

    for (; *to != '\0'; ++to)
        /*nothing*/;

    for (; n != 0 && *from != '\0'; --n, ++from, ++to)
        *to = *from;

    *to = '\0';
    return ret;
}
Современные компиляторы (в большинстве случаев) прекрасно справляются с оптимизацией, так что не надо писать заумные вещи и показывать всем какой вы умный (В Си и без этого можно легко выстрелить себе в ногу)

Ответить | Правка | Наверх | Cообщить модератору

111. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от solardiz (ok), 27-Июн-19, 14:13 
Спасибо. Насчет лишнего "++" согласен что нагляднее без него, скажу Rich'у. В остальном по наглядности кода мне не очевидно чья версия лучше.
Ответить | Правка | Наверх | Cообщить модератору

112. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 27-Июн-19, 14:24 
А вы попробуйте посмотреть на это с точки зрения неопытного Си программиста
Ответить | Правка | Наверх | Cообщить модератору

113. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от letsmac (ok), 27-Июн-19, 14:53 
А зачем неопытному Си программисту лезть в ДНК?
Ответить | Правка | Наверх | Cообщить модератору

117. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 27-Июн-19, 17:36 
Наверное затем, чтобы понять как устроено ДНК и тем самым стать более опытным как можно раньше, а не смотреть на всё это сквозь призму черного ящика и делать глупые ошибки.
Ответить | Правка | Наверх | Cообщить модератору

135. "Разработчики из Google предложили разработать свою libc для ..."  +1 +/
Сообщение от Ordu (ok), 29-Июн-19, 17:16 
Чтобы стать более опытным, надо смотреть в реальный код, а не в адаптированный для неопытных. Это так же как с иностранными языками -- читать адаптированные тексты имеет смысл лишь в первые полгода обучения.
Ответить | Правка | Наверх | Cообщить модератору

137. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 30-Июн-19, 10:26 
Никто и не отрицает важность умения читать и понимать то что написали другие люди, и в случае если потребуется, уметь писать в таком же стиле, в рамках проекта игнорируя свои личные предпочтения.

"Реальный код" - это код который написан реальными людьми, так что любой код это реальный код!
Что на счёт "Хорошего кода", то тут у каждого свое представление о том что это значит.

Ответить | Правка | Наверх | Cообщить модератору

138. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Ordu (ok), 30-Июн-19, 10:57 
> "Реальный код" - это код который написан реальными людьми, так что любой
> код это реальный код!

Как ты думаешь, если бы "реальный код" == "любой код", то зачем мне нужно было говорить прилагателное "реальный"? Явно ведь, что я хотел сказать что-то иное, а не то, что тебе хочется, так? Я верю в тебя, и тебе тоже следует поверить в себя: ты можешь понять, что именно я говорил, если подумаешь. Не сдавайся так быстро.

Ответить | Правка | Наверх | Cообщить модератору

140. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 30-Июн-19, 12:37 
Я прекрасно вас понял!

Просто, то что вы назвали адаптированным кодом, прозвучало так, как-будто в реальных проектах так никто не пишет!

Ответить | Правка | Наверх | Cообщить модератору

141. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Ordu (ok), 30-Июн-19, 13:09 
> Я прекрасно вас понял!
> Просто, то что вы назвали адаптированным кодом, прозвучало так, как-будто в реальных
> проектах так никто не пишет!

Пишут. Ещё и не так пишут. Бывает такой кошмар в коде, что сей пример на его фоне будет выглядеть совершенно безобидным.

Ответить | Правка | К родителю #140 | Наверх | Cообщить модератору

116. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (116), 27-Июн-19, 15:27 
>показывать всем какой вы умный

Вот и не показывай.

strlen(d) из оригинала может быть заменен на специфический для платформы очень быстрый набор инструкций, а твой "for (; *to != '\0'; ++to)" (который на самом деле while(*to) to++;) - нет.

и откуда вы лезете с '\0' то? Впрочем, все эти размазывания присвоений на 3 строчки - явно карпарифный стандарт с галеры, где платят за количество строк кода. Можешь устариваться в гуголь, там такое любят.


Ответить | Правка | К родителю #109 | Наверх | Cообщить модератору

118. "Разработчики из Google предложили разработать свою libc для ..."  –1 +/
Сообщение от Аноним (92), 27-Июн-19, 18:14 
А вы забавный:)))

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

Чтоже так тоже можно, но я предпочитаю думать о тех людях кто будет поддерживать код после меня, помня о том что возможно это буду я сам:))

ПС
А на счет '\0', и мой цикл for, ну что тут сказать, могу вам посоветовать почитать книгу:
The Practice of Programming (B.Kernighan and R.Pike)
И все претензии предъявлять этим уважаемым господам:))

Ответить | Правка | Наверх | Cообщить модератору

132. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (132), 29-Июн-19, 11:39 
>strlen(d) из оригинала может быть заменен на специфический для платформы очень быстрый набор инструкций, а твой "for (; *to != '\0'; ++to)" (который на самом деле while(*to) to++;) - нет.

Дайте пример! Хочу увидеть где можно ускорить и без того простейший инкремент.

Ответить | Правка | К родителю #116 | Наверх | Cообщить модератору

133. "Разработчики из Google предложили разработать свою libc для ..."  +2 +/
Сообщение от Аноним84701 (ok), 29-Июн-19, 12:49 
>>strlen(d) из оригинала может быть заменен на специфический для платформы очень быстрый набор инструкций, а твой "for (; *to != '\0'; ++to)" (который на самом деле while(*to) to++;) - нет.
> Дайте пример! Хочу увидеть где можно ускорить и без того простейший инкремент.

Например, обрабатывать не байтик за байтиком:
https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/i38...


L(1):   movl (%eax), %ecx       /* get word (= 4 bytes) in question */
  65         movl $0xfefefeff, %edx  /* magic value */
  66         addl %ecx, %edx         /* add the magic value to the word.  We get
  67                                    carry bits reported for each byte which
  68                                    is *not* 0 */
  69         jnc L(3)                /* highest byte is NUL => return pointer */
  70         xorl %ecx, %edx         /* (word+magic)^word */

Или вообще использовать SIMD:

https://www.strchr.com/strcmp_and_strlen_using_sse_4.2


; ==== strlen ====
strlen_sse42:
  ; ecx = string
  mov eax, -16
  mov edx, ecx
  pxor xmm0, xmm0

STRLEN_LOOP:
    add eax, 16
    PcmpIstrI xmm0, dqword[edx + eax], EQUAL_EACH
    jnz STRLEN_LOOP

  add eax, ecx
  ret

glibc
https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/x86...


L(loop):
174
175         addq    $64, %rax
176         cmpq    %rax, %r10
177         je      L(exit_end)
178
179         movdqa  (%rax), %xmm0
180         PMINU   16(%rax), %xmm0
181         PMINU   32(%rax), %xmm0
182         PMINU   48(%rax), %xmm0
183         PCMPEQ  %xmm3, %xmm0
184         pmovmskb        %xmm0, %edx
185         testl   %edx, %edx
186         jne     L(exit)
187         jmp     L(loop)

Ответить | Правка | Наверх | Cообщить модератору

136. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (47), 29-Июн-19, 18:17 
Так или иначе везде циклы, я-то думал, что будет  что-то фантастическое в одну/две операции. Все равно за примеры спасибо.
Ответить | Правка | Наверх | Cообщить модератору

131. "Разработчики из Google предложили разработать свою libc для ..."  +1 +/
Сообщение от Аноним (132), 29-Июн-19, 11:37 
Смешно.

Ваш for (; *to != '\0'; ++to) это strlen в упрощенном виде:
https://git.musl-libc.org/cgit/musl/tree/src/string/strlen.c

С точки зрения компилятора ваш код ничем не отличается от того, что в musl.

Итого, вы придрались к оформлению и к *d++ = 0, где инкремент может выпилить компилятор. Возникает вопрос зачем 100500 раз везде писать "for (; *to != '\0'; ++to)" вместо strlen? Вот это и есть дурной тон программирования. Другой вопрос почему strlen не сделан в виде макроса.

Ответить | Правка | К родителю #109 | Наверх | Cообщить модератору

139. "Разработчики из Google предложили разработать свою libc для ..."  +/
Сообщение от Аноним (92), 30-Июн-19, 12:07 
>>>Ваш for (; *to != '\0'; ++to) это strlen в упрощенном виде:

В этом и весь смысл.
Вы всё равно должны учесть, что всё это рассчитано главный образом на компилятор gcc. (__GNUC__)

>>> С точки зрения компилятора ваш код ничем не отличается от того, что в musl.

Так в том и суть, если нет разницы зачем писать такие "заклинания". Покажите мне хоть одну книгу по языку Си, где так учат писать код.

>>>Итого, вы придрались к оформлению и к *d++ = 0, где инкремент может выпилить компилятор.

Именно такие ситуации, в конечном итоге, и приводят к логическим ошибкам в коде программы.
Игнорировать такое просто недопустимо!!!

>>>Возникает вопрос зачем 100500 раз везде писать "for (; *to != '\0'; ++to)" вместо strlen?

Потому что (в таких случаях):
если всё что вы делаете, так это двигаете указатель (чтобы затем использовать его) --> просто напишите цикл. В других случаях, при других обстоятельствах - я с вами полностью согласен!

>>>Другой вопрос почему strlen не сделан в виде макроса.

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

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру