Программирование

Ответить в тред Ответить в тред
C Programming Language #62 /clang/ Аноним # OP 15/09/20 Втр 22:32:30 18076501
C Propaganda.jpg 1965Кб, 2000x2610
2000x2610
Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.

Пожалуйста, пользуйтесь https://ideone.com/ https://wandbox.org/ или https://pastebin.com/ для вставки кода, если он длиной больше нескольких строк или содержит [​i​] или ∗.

Что читать:

- Brian Kernighan, Dennis Ritchie "The C Programming Language": http://www.cypress.com/file/56651/download
- Stephen Prata "C Primer Plus, 6th Edition" (2014): относительно свежая, знает про C89/C99/C11, описывает различия, объемная (около тысячи страниц), годная, с вопросами, упражнениями и ответами. Читать после K&R или до.
- Zed A. Shaw "Learn C the Hard Way" (2015): годное пособие для гуманитариев для гуманитариев!
- Немного примеров хорошего стиля: http://www.oualline.com/books.free/style/index.html
- ООП, например: http://www.cs.rit.edu/~ats/books/ooc.pdf
- Стандарт ISO/IEC 9899:1999 (C99): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf (драфт)
- Стандарт ISO/IEC 9899:2011 (C11): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf (драфт)
- Черновик стандарта ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2479.pdf (февраль 2020, с диффами)

Чем компилировать:

- Очевидный GCC.
- clang: оче годно, батя рекомендует.
- Intel C++ Compiler: оптимизации, тысячи их.
- Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте.
- Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное.
- TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.

Что еще почитать:

http://c-faq.com/
FAQ из comp.lang.c. Древний, но все еще актуален.

Samuel P. Harbison, Guy L. Steele Jr. "C: A Reference Manual, 5th Edition" (2002)
Ебаный пересказ стандартов C89 и C99 (включая стандартную библиотеку). Для не осиливающих стандарт в оригинале. Читать в качестве подготовки к собеседованиям (есть задачник с ответами) и для ознакомления с масштабами пиздеца перед написанием своего парсера/компилера.

Peter Van Der Linden "Expert C Programming. Deep C Secrets" (1994)
"Си: грязные истории". Смехуечки, немного объяснений, чем обусловлены особенности языка, всем известные подводные камни кто там ругал косяки в JS? у нас в сишечке их гораздо больше, просто они лучше спрятаны, немного байтоебли и непонятно откуда взявшаяся глава про старинные плюсы. Читать в качестве сказки на ночь (на пару вечеров хватит).

Richard M. Reese "Understanding and Using C Pointers. Core Techniques for Memory Management" (2013) - почитать, вкатиться в указатели.

Ben Klemens "21st Century C: C Tips from the New School" (2012)

Paul Deitel, Harvey Deitel "C for Programmers with an Introduction to C11" (2013)

Stephen G. Koch@n "Programming in C (3rd Edition или 4th Edition, если найдется)" (2014)

MISRA Ltd. "Guidelines for the Use of the C Language in Critical Systems" (2013)
Набор рекомендаций по написанию надежного кода на C (промышленный стандарт). Читать - однозначно, следовать - вдумчиво и без фанатизма. Также можно посмотреть https://www.securecoding.cert.org/confluence/display/c/SEI+CERT+C+Coding+Standard и http://web.archive.org/web/20190213011655/homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-c-style.pdf

Еще более длинный список: http://www.iso-9899.info/wiki/Books#Learning_C

https://github.com/kozross/awesome-c

Онлайн-утилиты:

- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов).
- http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.

Прошлые треды:

- №59: http://arhivach.ng/thread/597021/
- №60: http://arhivach.ng/thread/610540/
- №61: http://arhivach.ng/thread/610541/ >>1786992 (OP)
dead per dead 15/09/20 Втр 23:32:13 18077132
Первый
Аноним 16/09/20 Срд 00:18:42 18077393
Аноним 16/09/20 Срд 12:53:23 18080524
>>1807739
Попрошу не засорять тред ненужными сообщениями.
Аноним 16/09/20 Срд 13:00:29 18080545
1600250428267.png 238Кб, 1080x1920
1080x1920
Аноним 16/09/20 Срд 13:07:28 18080576
1600250845852.png 347Кб, 1080x1920
1080x1920
Аноним 16/09/20 Срд 19:36:34 18084337
>>1808054
Плюс ещё на уровне стандарта запретить использование скобок в логических выражениях.
16/09/20 Срд 20:13:04 18084608
>>1808054
Шутки шутками, а nullptr и так скорее всего будет в C2x в рамках восстановления совместимости с крестами.
dead per dead 16/09/20 Срд 20:22:39 18084659
>>1808460
Ненужен.
#define NULL ((void звезда)0)
Аноним 17/09/20 Чтв 10:17:43 180878510
>>1808465
nullptr будет корректно проверятся с указателем, а с переменной будет падать на компиляции. Макрос подобной гибкости обеспечить не может.
Аноним 17/09/20 Чтв 12:13:37 180887811
Помогите ньюфагу, операции с плавающей точкой - операции не над целыми числами, или что?
Аноним 17/09/20 Чтв 12:35:46 180889912
>>1808878
Наоборот, над нецелыми. А откуда такой вопрос?
Аноним 17/09/20 Чтв 12:39:14 180890013
>>1808899
Мне нужно реализовать поиск тригонометрических функций без использования операций с плавающей точкой. Хотел просто синусами, косинусами сделать, но похоже нужен какой-то алгоритм.
Аноним 17/09/20 Чтв 12:40:39 180890114
Аноним 17/09/20 Чтв 12:42:02 180890215
>>1808878
Хз что там у тебя за задание, но плавающую точку всегда можно заменить фиксированной, т.е. парой целых, или рациональными числами числитель/знаменатель.
Аноним 17/09/20 Чтв 12:42:16 180890416
>>1808901
Операции sin, cos, tg, ctg чисел.
Аноним 17/09/20 Чтв 12:43:06 180890517
>>1808900
>Мне нужно реализовать поиск тригонометрических функций без использования операций с плавающей точкой.

Значение COS и SIN это нецелое число в диапазоне от -1 до 1.
Как его можно целым числом записать?
Ну в теориии то извратиться можно, но если ты не знаешь что такое IEEE 754, то очевидно что ты не тот человек, который может сегодня извратиться.
Аноним 17/09/20 Чтв 12:45:46 180890718
1448107194128.jpg 110Кб, 600x898
600x898
Аноним 17/09/20 Чтв 12:56:57 180891219
>>1808907
>Умножив на 1000000
Nice. Но это половина решения.
Аноним 17/09/20 Чтв 13:36:46 180894020
Ок, я так понял, что могу реализовать через ряды Тейлора, но вот проблемка, у меня же число пи не целое шоб задать частоту в синусе, мне его получается нужно округлить до 3?
Аноним 17/09/20 Чтв 14:57:11 180901621
>>1808940
А чего бы не взять таблицу Брадиса за основу? Забить её в массив и наслаждаться погрешностью.
Аноним 17/09/20 Чтв 16:38:23 180911122
>>1808940
Ох лол, настоящий инженер
Аноним 17/09/20 Чтв 17:34:38 180918923
>>1808940
Что вообще значит "не используя числа с плавающей запятой"? Где ты результат хранить собираешься? Сформулируй задание как можно точнее.
dead per dead 17/09/20 Чтв 21:13:03 180938324
>>1808900
Используй CORDIC или таблицы с представлением fixed point.
Аноним 17/09/20 Чтв 21:23:01 180939225
Нужна помощь с программированием на C
Постараюсь норм заплатить за это, но уровень знаний нужен неплохой.
Напишите сюда, пожалуйста @twoomer
Аноним 17/09/20 Чтв 22:17:55 180944626
>>1809392
Ты в универе на второй год остался?
Аноним 17/09/20 Чтв 22:20:39 180945227
>>1809392
>Постараюсь норм заплатить за это
Это сколько?
Аноним 17/09/20 Чтв 22:48:10 180949228
>>1809446
ой, ты меня помнишь, эхе.
>>1809452
стукни в телегу, с тебя не убудет
Аноним 18/09/20 Птн 00:44:44 180966829
Аноним 18/09/20 Птн 01:16:32 180968530
Совсем недавно начал изучать C.
Читаю книгу, заглядываю в стандарт, много гуглю, пытаюсь ковырять разные исходники простых утилит.
И, конечно, вместе с этим решаю и пытаюсь решать различные упражнения, практические задания.
Не скажу, что всё идёт как по маслу, но настроен серьёзно, не планирую сдаваться.
На фоне всего этого почти всё время, которое провожу сейчас за компьютером, трачу на такое самообучение в одиночестве.
И как-то ощущается: нехватка живого общения по теме программирования на C и недостаток возможности обсуждать то, что с ним (C-программированием) связано.
Не поймите превратно, я не имею вообще ничего против C-тредов (пару раз успел получить дельные советы тут), но часто на самом деле как-то не хватает именно живого общения по теме. (посмотрел конфы в телеге, xmpp, но путного ничего не нашёл)

Ещё есть желание найти собеседников в первую очередь из числа тех, кто тоже серьёзно заинтересован в обучении программированию на C.
Может быть получится как-то иногда помогать друг другу, пробовать вместе разрешить ту или иную особо сложную "задачку", обсуждать что-то по теме.

Всё вышеуказанное побудило создать сегодня дискорд-сервер. Надеюсь, что кто-нибудь откликнется и присоединится.
Создал буквально пару часов назад, поэтому на первых порах сразу после входа будут открыты: голосовой канал и 2 текстовых (general и no-microphone).
Ссылку в форме картинки оставил тут: https://2ch.hk/ch/res/161664.html

Буду особенно рад, если кто-нибудь из опытных олдов-специалистов решит зайти, что иногда делиться своей мудростью и давать советы неофитам вроде меня.
18/09/20 Птн 09:06:37 180976731
>>1809685
Пашол нахуй социоблядок.
Аноним 18/09/20 Птн 09:18:46 180976932
>>1809668
А нет книжки на СИ по написанию своего Хаскеля?
Аноним 18/09/20 Птн 09:47:43 180977733
>>1809769
Тебе никакая книга не поможет, если ты не понимаешь как работает компилятор, транслятор, сборщик мусора и так далее.
Аноним 18/09/20 Птн 09:55:39 180978134
Аноним 18/09/20 Птн 10:04:22 180978635
>>1809781
Трипл хуйни не скажет. Он тебе всё верно написал. Как ты будешь компилировать свой хаскел? Синтаксис уже придумал? Парадигму используемую для программирования? Как это все будет транслироваться в байт код/виртуальную машину/ассемблерное представление? Или это будет транслироваться на кресты?

Не толсти толстый школьник-зумерок.
Аноним 18/09/20 Птн 10:29:42 180979436
>>1809769
>книжки на СИ
Содомит.
Аноним 18/09/20 Птн 10:36:50 180979637
Аноним 18/09/20 Птн 11:02:45 180981138
>>1809786
Чел, ты вообще не выкупаешь. Перечитай на что я отвечал.
Аноним 18/09/20 Птн 11:07:08 180981639
Чота новый тред не очень интересен. Нет задора. Разочаровываете. Обнадёживает лишь то, что он только начался, может быть чего интересного подвезут.

Ладно, для завтравки - кто пользует операцию "запятая" в Си. Уверен что начинающие программеры и не слышали о такой.
Аноним 18/09/20 Птн 11:08:36 180982040
Аноним 18/09/20 Птн 11:24:17 180983441
>>1809816
Да тут и про оператор "стремиться к" не слышали.

#define as ;while

do printf("n is %d\n", n) as ( n --> 0);
Аноним 18/09/20 Птн 11:52:37 180985442
>>1809834
А вот тут уже у меня глаза на лоб полезли. Ты точно не троллишь?
Если что, пишу на Си с 1993 года.
Аноним 18/09/20 Птн 12:10:31 180986443
1526280974918.png 49Кб, 1194x502
1194x502
Аноним 18/09/20 Птн 12:18:13 180986644
>>1809767

Как-то ты грубо написал (без необходимости в этом). И сажа совсем неуместна.
Будь добрее что ли.
Аноним 18/09/20 Птн 12:27:24 180987445
>>1809864
В какой версии стандарта появилось?
Аноним 18/09/20 Птн 12:28:48 180987546
Аноним 18/09/20 Птн 12:36:26 180988347
>>1809874
Стандартошизик на месте, я спокоен.
Главно что в компиляторах работает.
Аноним 18/09/20 Птн 12:39:36 180988648
>>1809883
Нельзя быть таким ебанутым, как ты. Кроссплатформенное приложение писал хоть раз? Наверняка же нет.
Аноним 18/09/20 Птн 12:41:20 180988849
>>1809886
Откуда у Си кроссплатформенность, лул? Это же не джава.
Аноним 18/09/20 Птн 12:43:14 180988950
Аноним 18/09/20 Птн 12:46:56 180989451
>>1809874
Вообще это древняя фишка, видел чуть ли не в исходниках линукса.
Аноним 18/09/20 Птн 12:50:57 180989752
>>1809888
Вот когда ядро ОС на Java напишут, тогда приходи. Java без виртуальной машины не работает. Виртуальная машина Java работает поверх ОС.

Sun Microsystems как раз и сдох? когда решил заебощить Java CPU/
Аноним 18/09/20 Птн 13:49:46 180991553
>>1809889
Швабропетух, уходи
Аноним 18/09/20 Птн 13:54:37 180991954
Аноним 18/09/20 Птн 14:08:47 180993255
>>1809897
При чем тут ядро ОС.? У меня есть обычные программы на Java и я этим калом пользуют только сдерживая рвоту от безысходности отсутствия альтернатив. Если бы весь софт был на Java я бы просто повесился или отказался от использования компьютеров, потому что моя психика дороже.
Аноним 18/09/20 Птн 14:11:26 180993556
>>1809932
>У меня есть обычные программы на Java
Зачем так жить? Ну C# ещё как-то можно понять и простить, но Java?
Аноним 18/09/20 Птн 14:45:19 180994957
>>1808460
Я бы ещё от ссылочек, как в плюсах, не отказался бы.
Аноним 18/09/20 Птн 15:18:20 180997058
>>1809949
Ненужны, это как var в паскале, который внезапно оказывается указателем, хотя таковым не выглядит.
Аноним 18/09/20 Птн 16:29:18 181002459
>>1809919
pub fn
Не, ну это пиздец конечно
Аноним 18/09/20 Птн 16:52:57 181004760
>>1809970
Ссылка является частным случаем указателя. Когда передаешь объект в параметр функции, то передаешь его по ссылке. Использование ссылок в этом случае отменяет проверку на валидность указателя. Почему? Т.к ссылка указывает на существующий объект. Будешь брать ссылку из голого nullptr - получишь ошибку на этапе компиляции.
Аноним 18/09/20 Птн 16:54:12 181004961
int main(void){
char *str = "Hi!";
return 0;
}

сохраняю, например, в файле hi.c
Затем в терминале выполняю команду: gcc -nostdlib -o hi hi.c
В ответ, конечно, получаю предупреждение /usr/bin/ld: warning: cannot find entry symbol _start; ...

Но почему после этого исполняемый файл hi всё равно весит примерно 13 килобайт?
Аноним 18/09/20 Птн 16:57:51 181005662
Аноним 18/09/20 Птн 17:08:46 181006563
>>1810049
Вангую отладочные символы внутри. Можно strip'ом воспользоваться.
Строки поубирает. Можешь попробовать флагами gcc убрать отладочные символы опцией -g0, но вряд ли оно прям все вырежет
Аноним 18/09/20 Птн 17:08:51 181006664
>>1810049
А чего ты хочешь добиться?
Аноним 18/09/20 Птн 17:15:47 181008265
>>1810065

strip и g0 не помогают.

>>1810066
Для начала того, чтобы линкер не подрубал посторонние библиотеки, если уж я использую опцию nostdlib.
Аноним 18/09/20 Птн 17:30:47 181011466
>>1810082
У strip есть ключи. Можно хорошо порезать.

Выше же ссылка на ключи objdump. Это 100% ответ на твой вопрос.
Аноним 18/09/20 Птн 17:32:04 181011767
>>1810082
>nostdlib

попробуй ещё nostdinc - в инклудах докуя чего может прицепится.
Аноним 18/09/20 Птн 17:37:42 181012468
>>1810082
Если так интересно, можешь ознакомиться со статьей: https://habr.com/ru/post/88101/
Мне всё-таки интересно, куда тебе размер уменьшать-то?
Может другой компилятор попробовать стоит или поиграться с оптимизацией (только что в этом коде оптимизировать..., нужно рассматривать примеры побольше)? То смотри и поменьше размера добъёшься.
dead per dead 18/09/20 Птн 17:40:48 181012769
>>1810047
При наличии ссылок по коду х=1 трудно определить, меняется тут аргумент или параметр за пределами функции.
Аноним 18/09/20 Птн 17:49:42 181013870
>>1810124
глянул на статью, вот цитата оттуда:
"...Использоваться будут только явно переданные линкеру файлы».

jesstess@kid-charlemagne:~/c$ gcc -nostdlib -o hello hello.c
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8

Всего лишь предупреждение, все равно попробуем:

jesstess@kid-charlemagne:~/c$ wc -c hello
1329 hello

Выглядит неплохо! Мы уменьшили размер до значительно более вменяемого (аж на целый порядок!)…"

Тут >>1810049 абсолютно идентичная команда выполняется "gcc -nostdlib -o hi hi.c" Но размер исполняемого файла не уменьшается, как это происходит в статье.
Аноним 18/09/20 Птн 17:59:42 181014771
>>1810056
>>1810114

Плохо знаком с objdump, но судя по тому, что именно он выводит, причина тяжеловесности исполнительного файла вроде в ld-linux-x86-64.so.2
Аноним 18/09/20 Птн 18:07:21 181015872
>>1810147
Поиграйся ключами - получишь массу информации. Он даже дизассемблирует.
Аноним 18/09/20 Птн 18:37:35 181017773
>>1810127
Обсуждалась не передача обычных типов, а конкретно объектов. С теми же самыми структурами в Си приходится работать? - Приходится. Производится проверка на передаваемый указатель на структуру: эквивалентен ли полученный указатель NULL-у? Понятное дело, что такого рода проверка нужна для избежания ошибки сегментирования. При ссылке не пришлось бы этого делать, код стал бы занимать меньше места (ещё +1 в пользу ссылки).

Ранее упоминалось, что ссылка - частный случай указателя. Значит при изменении значения внутри функции передаваемой по ссылке переменной, значение вне функции будет также меняться.
Аноним 18/09/20 Птн 18:40:06 181017974
>>1810049
Куски ELF выравниваются на страницу, чтобы его удобней мапить в память. Заголовок будет минимум страница. Дальнейшее зависит от кунпелятора и архитектуры.
clang -m32 даст файл чуть больше страницы.
Аноним 18/09/20 Птн 19:05:30 181019475
>>1807650 (OP)
Няши, напомните, каков сейчас максимальный сегмент данных в исполняемом файле? Указатель 64?
Настройки X
Ответить в тред X
15000
Макс объем: 40Mб, макс кол-во файлов: 4
Кликни/брось файл/ctrl-v
Стикеры X
Избранное / Топ тредов