Это копия, сохраненная 5 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пожалуйста, пользуйтесь 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, с диффами)
- Последний черновик ISO/IEC 9899:202x (C2x): http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.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 помогает читать сложные сишные декларации.
Прошлые треды:
- №69: http://arhivach.net/thread/688454/
- №70: http://arhivach.net/thread/713839/
- №71: http://arhivach.net/thread/727405/ >>2165466 (OP)
Просвятите.
Почему на C пишут для железа чаще чем на C++?
Репозиторий ReactOS на гитхабе написан почти весь на C.
Так удобнее или есть другие причины?
Что в 2022 актуально делать на C?
>Почему на C пишут для железа чаще чем на C++?
Потому что у С++ overhead чуть повыше. (особливо если не очень понимаешь, во что выродится твой код) Потому что exception будут недоступны (их можно отключить ключами компиляции).
Ну и просто потому что так повелось. На самом деле причин против С++ не так много.
Ну и конечно молодые долбоящеры будут пихать везде копирование, вместо ссылок.
>Что в 2022 актуально делать на C?
Линковать с С++ кодом - очевидно же.
>>45495
+ потому что раньше, давным-давно, когда деревья были большими, нв всякие экзотические мелкоконтроллеры не сцществовало С++.
Но эта экзотика продавалась по цене стакана семечек, поэтому корпорации очень любили пихать такие микроконтроллеры в массовый недорого сегмент аппаратуры для сокращения издержек.
30 центов разницы в цене при многомилионных тиражах имеют значение.
Чтобы убедиться, что это так, нужно всего лишь заменить string (с new) на чары в статических буферах. Или забыть расставить магию в виде nothrow.
>ADT
А какой у них overhead в сишечке.
> А какой у них overhead в сишечке.
Воид поинтеры и соответственно дополнительные маллоки, дополнительные дереференсы и дополнительные копирования (нужное подчеркнуть). Не говоря уже об отсутствии возможности у компилятора сгенерировать качественный код под конкретный тип. Да, в Си можно делать шаблоны на дефайнах, но это крайне неудобный способ. Алсо, в сишке можно посмотреть на колбек в qsort и сразу все понять.
> заменить string (с new) на чары в статических буферах
На крестах можно писать свои дешевые реализации под задачу с любым количеством нечитаемой магии.
>соответственно дополнительные маллоки
А в плюсах у тебя типа данные волшебным образом размещаются на стеке, да? А потом происходит возврат из текущей функции и приходит дядя Сегфолт Бахометыч
В плюсах данные можно передавать по значению во всякие алгоритмы/типы, потому что шаблоны.
>Воид поинтеры
Необязательно. Узлы дерева или списка включаешь в свою структуру, потом containerof в помощь.
пошел нахуй!
Так откуда эти данные берутся, из жопы волшебной феи или из operator new, являющегося обёрткой над malloc?
В плюсах у меня есть placement new, и размер я знаю заранее, поэтому могу разместить объект где угодно, хоть на стеке, хоть >>46850 в жопе волшебной феи. Опять же, у нас в Си тоже так можно, но сложнее, поэтому приходится каждый раз переизобретать структуры данных под конкретный проект, если важна производительность.
https://ideone.com/zlQ1k1
Вместо
int upper;
upper = 200;
пиши сразу int upper = 200; Мы не в 89 году слава богу, и так можно. Более того создавать переменные как можно ближе к месту их использования - хороший тон.
adt на си вообще без накладок можно на макросах делать, так в коде freebsd было сделано как то
а так да, все пердолят через указатель на неопределенный тип, потому что и привычней, и отладка работает, и через границы динамически загружаемых модулей удобно ходить
даже добавить нечего, все так
ага, в том числе, есть элегантные обертки того что на стеке размещается, даже есть стандартизированный std::array из коробки
Так можно было и в 78.
>создавать переменные как можно ближе к месту их использования - хороший тон.
Вкусовщина.
> Хуевый тон
Нет не хуевый. В С89 заставляли совать декларации в начало не для того, чтобы ты кушал и нахваливал. Просто технические проблемы тех времен, однопроходные компиляторы, было проще знать размер стекфрейма заранее. К счастью, те времена давно прошли, и смысла в этом ограничении больше нет.
> Если все переменеые обьявить в начале функции
То ты не только при изменении функции, но даже при чтении будешь прыгать туда-сюда, потому что какие-то пидары раскидали связанные по смыслу куски кода в разные места исходника. А еще ты очень часто лишаешься инициализации при объявлении, что делает твой код еще более ущербным. Зато ты можешь продолжать дрочить на технологии семидесятых.
> Высосаное из пальца преимущество
Действительно, вот почему во все языки массово тащат const, а в Си const принято только указателям расставлять - это чтобы анон мог не только оторвать переменную от использующего ее кода, но еще и значение этой переменной где-то в третьем месте задать. Зато как здорово код читается!
> В редакторах можно делить окна
Замечательно. Нам нужен специальный редактор, чтобы дрочить на багофичи семидесятых.
Нахуя тебе переменные перед глазами, если ты не видишь кода который их использует?
>>47323 (Del)
Константы хорошо описывают иммутабельную природу переменной.
> за сим прощаюсь.
Скатертью дорога. Предупреждаю если увижу тебя на работе и твой уебанский код с переменными в начале функции - дам пизды.
Так легче визуально оценить размер фрейма.
const для локальных - это мусор навроде венгерской нотации.
Вместо структурирования кода дебилы блямкают одноразовые переменные с const.
>При компиляции функции для ее параметров выделяются отдельные участки памяти. При этом для параметров типа float формируются в памяти объекты типа double...
Зачем для float'ов выделять двойную, избыточную память?
В чем тогда смысл использовать float'ы?
1. Экономия памяти в куче? Оперативная память и близко давно уже не узкое место, её можно напихать сколько угодно.
2. Некоторые процессоры умеют вычислять только double? Ну так некоторые умеют, некоторые нет, видеокарты только во float'ы умеют.
Поясните.
>Оперативная память и близко давно уже не узкое место, её можно напихать сколько угодно.
Может ты лучше в другой язык пойдешь? Оно тебе с таким подходом не нужно.
>для параметров типа float формируются в памяти объекты типа double
Хуирются. Значения типа float преобразутся в double. В памяти (не на стеке параметров) хранятся как float.
> Некоторые процессоры умеют вычислять только double?
PDP-11 не имел отдельных команд и регистров для float. Каждая программа начиналась с команды, включавшей режим double. Поэтому коньпилятор Ричи все float подвыражения расширял в double, а printf принимал %f как double. В C89 первое убрали, а вот printf никто не стал менять.
Ни в одном языке прогромирования не рекомендуется раскидывать переменные по телу функции. Это плохой тон. Использование можно посмотреть с инструментом view usages, который, кроме блокнота, есть везде.
Хочу подобрать идеальный под мою железку набор GCC-флагов. Как можно затестить производительность с определённым их набором?
Все переменные надо объявлять как можно ближе к месту использования. Об этом уже тысячу раз писали Страуструп, Пайк, Мартин, Макконел.
а не читай дурные учебники по си, которые вводят в заблуждение
расширение типа аргументов происходит в 2х случаях - если объявление функции составлено в старом стиле, и второе для функции с неопределенным числом параметров для аргументов попадающих в многоточие, и все, согласись, сегодня это довольно специфические условия, верно? по сути это нужно знать только для семейства функций printf
если объявление функции составлено в новом стиле, но никакого расширения типа аргументов (в том числе float в double) не происходит
ты какой учебник читаешь? какого то русского автора да?
В двух словах:
Переменные должны объявляться в начале логического блока, в котором они используются, а НЕ в начале функции или программы.
https://habr.com/en/post/59570/
>Ни в одном языке прогромирования не рекомендуется раскидывать переменные по телу функции.
А в кодстайлах рекомендуется.
> Использование можно посмотреть с инструментом view usages, который, кроме блокнота, есть везде.
А можно не заниматься хуйней и семантически разделять блоки кода, объедения данные и их поведение/обработку.
Я не вижу смысла спорить и что-то доказывать. Большие программы делаться на модули, модули на функции, функции на блоки внутри функций. Если бы вам долбаебам сказали бы в 89 году, что все нужно писать в одном файле, так вы бы до сих пор так и делали, рассказывая про инструменты редактора которые позволяют во всем этом говне ориентироваться. У тебя нет понимания о том, что такое ясность и удобство восприятия информации. Ты привык к инструментам и постоянному перескакиванию с vu.
Это ж просто зелёный и жирный, не корми его, он уже из треда вытекает блядь
CFLAGS="-Wl,--hash-style=gnu"
LDFLAGS="-Wl,--hash-style=gnu"
LDFLAGS="--hash-style=gnu"
Wl говорит драйверу компилятора (сс/gcc), какие флаги передать линкеру (первый вариант). У линкера (ld) такого ключа нет, и он нахуй не нужен (второй вариант), поэтому ты просто указываешь напрямую (третий вариант). Если ты компилишь без -c или собираешь cc *.o - можешь выбрать 1 или 3, а если сам вызываешь линкер, то очевидно у тебя есть только 3.
> можешь выбрать 1 или 3
Сам в цифрах запутался. 1 или 2, т.е., -Wl для cc, без -Wl для ld.
слоуфикс
лол, в 89 году раскидывали по разным файликам чтобы компилировалось быстрее, а не из желания че-то там разбить на функциональные модули
перекомпиляция большого проекта занимала несколько часов
на персональных же пека даже компиляция одной единицы трансляции занимала ощутимое время
Почему здесь объекты платформозависимых типов, если по идеи их размер должен быть чётенько определен?
не, сегодня многие пишут основной код в одном файле на тысячи строк кода
многие проекты на гитхабе так организованы, например
А отсутствие неймспейсов тут никакой роли не играет, да?
Ты же ведь в курсе, что привёл ссылку на исходники ядра версии 0.96, которая относится примерно к тысяча девятьсот девяностому году, и что в современных версиях (https://elixir.bootlin.com/linux/v3.1/source/include/linux/ext2_fs.h ) типы с чёткими размерами?
Да это понятно. Меня файловая система интересует, а не ядро.
Хотел заебенить челлендж из ролл-листа, где bootloader (with extended file system), начал было писать под ext2 и тут напоролся на то, что в ext2 куча 32битных объектов, а в i8086 16-битная шина. И стоковая ext как и где скомпилируется, такой и будет. Теперь не понимаю формулировку задачи, и что там требуется.
Да это понятно. Меня файловая система интересует, а не ядро.
Хотел заебенить челлендж из ролл-листа, где bootloader (with extended file system), начал было писать под ext2 и тут напоролся на то, что в ext2 куча 32битных объектов, а в i8086 16-битная шина. И стоковая ext как и где скомпилируется, такой и будет. Теперь не понимаю формулировку задачи, и что там требуется.
На то он и челлендж. Возиться с 32-битными типами на 16-битной машине - это будет то ещё дрочево, да.
> Возиться с 32-битными типами на 16-битной машине
Ну ты такой long x = 12345, и все. Не ассемблер ведь.
Мне вот даже интересно стало, что гцц закомпилит с арифметикой uint32_t и ключом -i8086. Думаю, запилит свою арифметику.
*проверить работоспособность
эмулятор?
Читаю метанит краем глаза, т.к. удобно с телефона читать.
Пишут что он - сжатый конспект книги Брайана Кернигана и Денниса Ритчи. Т.е. вроде должно быть норм.
Что скажете о метаните? Читать? Дропнуть?
А нет, потому что по стандарту long должен уметь минимум -231 ... 231 - 1.
>>50080
Так же, как и 32-битный x86 делает 64, или 8-битный МК делает 16-32 - будут два регистра, четыре регистра, дополнительные инструкции для арифметики (всякие там adc), часто лишние загрузки в память и обратно, если регистров не хватает. Все это может быть сильно медленно, но работать будет.
k&r 280 страниц, причем собственно текст книги без приложени - 140 страници, неужели выросло поколение которому нужен конспект даже таких книг?
тогда это пиздец, замолкаю
ну, или будут функции, если на sdcc и z80 к примеру.
и -1023 ... -1073 выдаёт 0 - да хрен с ним, как он такую экспоненту хранить может? бред какой-то
fman = frexp(ldexp(0.5, -1073), &vexp);
printf("%f %f %i\n", ldexp(0.5, -1073), fman, vexp);
0.000000 0.500000 -1073
что? я не читаю мысли.
понятно, frexp():
If x is a NaN, a NaN is returned, and the value of exp is unspecified.
If x is positive infinity (negative infinity), positive infinity (negative infinity) is returned, and the value of exp is unspecified
но разве тогда ldexp() не должен вернуть просто 0?
If the result underflows, a range error occurs, and zero is returned.
If the result overflows, a range error occurs, and the functions return HUGE_VAL, HUGE_VALF, or HUGE_VALL, respectively, with a sign the same as x.
ldexp(0.5, -1073);
printf("%s\n", strerror(errno));
frexp(ldexp(0.5, -1073), &vexp);
printf("%s\n", strerror(errno));
Success
Success
Допустим я хочу сделать таблицу функций и замапить её на (к примеру) 8-битное значение:
https://pastebin.com/gjpXRxZb
Типа на какой-то машине может быть msb вместо лсб, и всё пойдёт по пизде? Порядок байт тоже влияет (когда например мапится не на один байт, а на два и более) ?
Да, я тупой и просто не могу сообразить
В таком виде абсолютно никаких подводных, кроме небольших накладных расходов на проверку бита по сравнению с массивом отдельных bool или size_t. Номер бита в числе измениться не может, это свойство системы счисления (показатель степени двойки). Он может меняться в битфилде, но у тебя-то не битфилд.
Рихтер (не знаю, что там актуально - Windows Via C++), потом какое-нибудь не очень старое издание Windows Internals (там и кернелмод, но все равно надо), потом MSDN по интересующим темам. Если интересует легаси (а тебя интересует, потому что под винду сейчас на няшной не пишут), то еще сверху что-нибудь про GDI и опять MSDN. Если сокеты, то Ohlund "Network Programming for Microsoft Windows", и да, снова MSDN. Вообще, MSDN вполне норм, там в каждом разделе есть введение и описание чего куда совать с примерами. С вопросами можешь сюда приходить.
>>54673
Благодарю. Рихтер там же аж под семерку писал, если не ошибаюсь? Не устарело? У винды даже битность успела поменяться. А так, MSDN читаю, но это скорее справочник, очень много информации, которую я не очень понимаю, как приминять.
Мне бы найти что-то, что могло бы вкатиться в менеджмент памяти.
А то я смотрю, у винды дохрена своих функций под это
> Рихтер там же аж под семерку писал, если не ошибаюсь? Не устарело?
Появились новые апи, но в целом там все с начала линейки NT тянется. Я поэтому и говорю, что сначала книга, а потом уже и MSDN пугать не будет, там можно прочитать про нововведения.
> что могло бы вкатиться в менеджмент памяти
Сначала надо понять, чего тебе в malloc/calloc/free не хватает.
> у винды дохрена своих функций под это
Есть VirtualAlloc с друзьями, которая выделяет постранично, есть CreateFileMapping, чтобы выделять из свопа или отображать в память содержимое файла, поверх этого всего есть системный менеджер кучи, поверх него работает сишная куча. Плюс есть еще всякое устаревшее говно еще из 16-битной винды и пачки "локальных" функций у шелла, COM и прочего, которые тоже обертки вокруг системной кучи, тебе это все не нужно, если только в документации не написано, что ты должен использовать именно это.
> но это скорее справочник
https://docs.microsoft.com/en-us/windows/win32/memory/virtual-memory-functions ну вот смотри, например - тут по пунктам, как выделить, как узнать состояние и освободить. А чуть раньше описание концепций: https://docs.microsoft.com/en-us/windows/win32/memory/virtual-address-space (см. слева в меню следующие главы). Навигация могла бы быть лучше, но в остальном вполне читаемо.
сам не дочитал, просто я уже и так лисп написал и было любопытно.
node != NULL, хотя там и так видно.
Не ручаюсь за качество скринов, но с компа всё хорошо видно, например.
Такую же няшу купил недавно.
https://doc.qt.io/qtcreator/creator-build-settings.html
Вот, можно только добавить "этап сборки", но потом эти этапы нельзя вызвать по отдельности через менюшку. Как же так?
Си тут при том что код у меня на нем.
Предполагаю, что ты хочешь просто изменить Run или Deploy в настройках проекта. И уже оттуда дергать свою цель. Потому что это уже не сборка.
>А какими IDE тут пользуются? По моему Qt Creator и для Си неплохо подходит.
как скажешь - я в валенках и ушанке. в emacs и autotools. просто сам не знаю на чём сейчас что делают.
Так и было сделано. Проблема не с симейком, при вызове руками эти цели нормально отрабатывают. Хотелось из qt creator все это запускать, а я не туда пытался тыкать, анон выше правильно посоветовал уже.
Хотя все равно как-то не очень. А если мне потребуется запускать еще несколько целей? Там опять только одну конфигурацию деплоя можно сделать. Остается еще "Run", но как-то это не очень хорошо.
Только собрался плотно изучать этот божественный язык и решил качнуть VS 2019 (ибо в VS 2022, при добавлении "Разработка классических С++ приложений" у меня крашится драйвер видимокарты), как его хуй можно скачать с официального сайта. Остался только VS 2022. Мелкософт сам толкает в объятия пиратов штоле?
Пиздуешь на:
https://visualstudio.microsoft.com/ru/downloads/
Мотаешь в самый низ страницы и ищешь строчку "Старые загрузки"
На пике красным тебе выделил, чтобы не потерялся.
Алсо, может не надо тебе в C++, если ты даже ссылку найти не можешь?
Я так понял все сразу, задание сформулирвоано именно так, хотя для каждого в отдельности просто заводим отдельную переменную
Просто берёшь и пишешь.
кто что думает о языке программирования zig?
ну ос - это конечно враньё, потому что на ассемблере всё равно придётся писать. но можешь почитать криса касперски (хз почему у меня такая ассоциация возникла с твоим текстом)
L'\0'
Вот этот господин дело говорит. Так всегда нужно делать.
Но вот, в середине второго курса у нас было ООП. Там давали на выбор С++, С# и жаву. Я попробовал все и остановился на шарпе.
Так вот. Первое время мне было сложно. Я писал код в Си-стиле, а классы использовал просто как модули. Ничего более. Классы были большие. Было много статики.
Но затем я почитал книжек, и начал пытаться разобраться в чужих репках. Помогли, внезапно, репки жавы, потому что показали, как может быть устроен код в ООП стиле. И МНЕ ПОНРАВИЛОСЬ. Следущие 4 года - я писал исключительно в ООП парадигме.
Но вот закончилась учеба в вузе, я магистр, который немного фармил фрилансерством. Нужно было искать работу. И я пошел на завод. На заводе, внезапно, нужно писать на Си.
И я - буквально на текущий момент - пытаюсь изобретать способы, как привнести ООП в Си, не сломав то что там уже накодили. Я это могу сделать. Но я понимаю, что оно-то не нужно. Нужно майндсет перестроить обратно к процедурному и структурному подходу. Но это так сложно, когда ты везде видишь объекты, когда ты привык, что за памятью уже следить не нужно, есть GC, который следит за этим, а тебя только иногда какой-нибудь сокет или дескриптор нужно руками освободить.
Короче. Есть тут те, кто с ООП-языка обратно на Си переходили? Какие есть лайфхаки, чтобы быстрее переключить мозги обратно? Или проще таки сменить работу и писать в ООП-парадигме?
Да, понимаю, что вопрос не совсем по теме треда, но сам язык я знаю, как компуктеры работают - тоже, а вот момент с майндсетом не дает покоя.
Открываешь гитхаб, ищешь nginx. Написан он на няшном. Смотришь и видишь, что все очень даже удобно и красиво. А главное - ПОНЯТНО.
>Есть тут те, кто с ООП-языка обратно на Си переходили?
Нахуя? Ебашь дальше на шарпе/джаве/котлине/скале, нахуй тебе этот нищий завод и си усрался?
Ну, тут железочки дают. Я поработал какое-то время на шарпе в вебе и это так уныло было: гоняешь туда-сюда жсоны. А тут - хоп, лампочка зеленая замигала, устройство начало сбор данных с других устройств, хоп другая лампочка, уже красная мигает, значит какая-то ошибка, подключаешься, смотришь код, ага - флешка сдохла, ты с приложухи послал сигнала - хоп, устройство релешкой щелкнуло. Короче, все не так абстрактно, как в вебе, где ты вроде что-то сделал, а поймешь что ты сделал и кому оно нахуй надо - через год разработки, когда придут менеджеры и фидбек от пользователей принесут.
~60к после всех налогов. Да, когда я работал в вебе - я получал больше. Но опять же, тут - железки и видно результат работы, а там - ну, на сервере мой код крутится, является частью какой-то здоровой системы, хуй знает, будет ли хоть раз за год именно мой код вызван, хуй знает кто пользователь и что ему вообще от системы нужно, потому что на разработку задания давали менеджеры и они все поясняли конкурентным преимуществом или какими-то графиками, дескать вот, фича популярна, давайте у нас будет.
Двачую.
>А тут - хоп, лампочка зеленая замигала, устройство начало сбор данных с других устройств, хоп другая лампочка, уже красная мигает, значит какая-то ошибка, подключаешься, смотришь код, ага - флешка сдохла, ты с приложухи послал сигнала - хоп, устройство релешкой щелкнуло.
Это же пишется на всяких МЭК-языках, типа IL, ST, FB, LD, а не на С. Или у вас там и железки самопальные?
Не понимаю что ты под самопальными подразумеваешь. Комплектующие(платы, микроконтроллеры, диоды и т.д.) заказываются из-за бугра(что-то у китайцев, что-то из США, что-то с европы, в зависимости от требований к устройству и цены). Умные дядьки-инженеры это все в зависимости от требований к устройству компонуют на плате, дизайнеры - делают корпуса если надо. Когда тестовые образцы проходят все испытания - начинается производство. Сейчас весь наш код внутри устройств - на си написан. Судя по репкам, когда-то давно пытались на С++ писать, но что-то не срослось.
А, ну да, сейчас еще кококо импортозамещение, государство хочет заставить переходить на НАШИ комплектующие, но судя по умным дядькам-инженерам - наше железо скорее всего не появится, потому что там цены такие, что пиздец, а качество уровня: ну да, работает, но отстает от зарубежного как по характеристикам, так и по качеству, про сервис - говорить не приходится.
>Умные дядьки-инженеры это все в зависимости от требований к устройству компонуют на плате, дизайнеры - делают корпуса если надо. Когда тестовые образцы проходят все испытания - начинается производство.
Но ведь на выходе получается слабоподдерживаемое говно жи!? Одно дело ПЛК, который может любой переконфигурировать, а другое дело самопальные платы, с залоченной прошивкой и отсутствием исходников. Нахуя вы это делаете?
> Нахуя вы это делаете?
Потому что эти устройства и не должны быть переконфигурированы. Прошивки делаются специально под требования клиента и нормативные акты. Ну и да, я не хотел вдаваться в подробности, но сфера - измерительные приборы. Думаю из этого понятно, что какой-нибудь ЖЭК не хочет, чтобы любой Вася-радиолюбитель и умеющий пользоваться гуглом - залез и сделал себе бесплатную воду, там куча степеней защиты, начиная с поднесения магнита и заканчивая попыткой перепрошивки.
>но сфера - измерительные приборы
> А тут - хоп, лампочка зеленая замигала, устройство начало сбор данных с других устройств, хоп другая лампочка, уже красная мигает, значит какая-то ошибка, подключаешься, смотришь код, ага - флешка сдохла, ты с приложухи послал сигнала - хоп, устройство релешкой щелкнуло
Чота ты запизделся ужо.
Няша, ты когда последний разу какой-нибудь современный счетчик или УСПД видел? Лампочки для индикации состояний там в наличии. Подключились к серверу по GSM - лампочка горит, на дисплее - циферка 1 - установили TCP-соединение; 2 - зарегистрировались на сервере; 3 - работаем в штатном режиме, шлем данные и т.д. Релешки всяких счетчиков - так же: пришел запрос по какому-нибудь modbus или iec101/104 на контролирующую станцию, она передала уже конкретному устройству - у него переключили реле, в квартире отключили свет/воду за неуплату.
Вот ты рофлиш. А там в некоторых экспериментальных и дорогих образцах - линукс(порезанный, но вполне себе линукс), для веба ПХП, фронт на vue каком-нибудь, уже хотят приложения с сей на более современные языки переносить, проблема в памяти, т.к. если тот же .net или жаву запихнуть, то придется памяти больше покупать -> увеличение стоимости конечного устройства. В обычных массовых счетчиках этого конечно нет. Пока. Но будущее примерно такое: ты будешь иметь возможность прямо с компа посмотреть сколько ты там чего выжрал, оплатить сразу с мобилы или прикрутить автооплату.
>Вот ты рофлиш
Я и не рофлю. Действительно удивлен до чего технологии дошли.
Зачем тебе спойлеры, анон?
> Зачем тебе спойлеры, анон?
Ну, типа нерелейтед для треда. Типа тред-то про сишечку, а я про свой завод пишу.
>когда ты привык, что за памятью уже следить не нужно, есть GC, который следит за этим
Я всегда говорил, что сирешётка разжижает мозг. Программист, которому нужен сборщик мусора, вместо кода пишет мусор. Серьёзно, блядь, ты ведь понимаешь, что GC необходим не для того, чтобы ты, долбоёб, мог не думать, а для того, чтобы следить за временем жизни объектов, попавших в замыкания в языках с лексической областью видимости и функциями высшего порядка?
Таблетки принять не забудь.
> In the common language runtime (CLR), the garbage collector (GC) serves as an automatic memory manager. The garbage collector manages the allocation and release of memory for an application. For developers working with managed code, this means that you don't have to write code to perform memory management tasks. Automatic memory management can eliminate common problems, such as forgetting to free an object and causing a memory leak or attempting to access memory for an object that's already been freed.
Ты хочешь сказать, что уже сам через 2-3 месяца изучения мог спокойно на си что-то написать без проблем и с пониманием того, что ты делаешь?
Что ты понимаешь под пониманием того что ты делаешь?
Ну, вот допустим, я пишу хелло ворлд.
#include "stdio.h"
int main(){
printf("Hello world!\n");
return 0;
}
Я знаю что делает каждая из этих строчек. Знаю ли я что я делаю на самом деле? Допустим я слышал про то что код потом будет скомпилирован и слинкован и представляю себе в голове как это будет работать, что входной файл будет разбит на токены, будет построено синтаксическое дерево, оно будет оптимизировано, а затем модуль будет преобразован в ассемблерный код. Относится ли это к хелловорлду как программе и нужно ли было мне это знать? Я не уверен. Но допустим это шаг к тому, чтобы понимать. Дальше. Вот что делает printf()? Ну, я чисто предполагаю, что оно делает какой-то системный вызов в духе write(STD_OUT, msg, sizeof(msg)-1), который прочитает из регистра данные переданные и передаст их в какой-то стандартный вывод. Но понимаю ли я что я сделал? Ну, может быть я знаю, что у операционной системы есть некие потоки для т.н. выводов, ошибок и прочего. Но действительно ли я это понимаю? Наверное же нужно таки понимать, а как опрерационная система таки вывод этот сделает. Я должен знать, что вот есть устройства, в эти устройства я могу послать сигнал, устройства на выходе дадут какой-то ответ. А действительно ли я понимаю как этот ответ получен. Да и нужно же держать в голове, что есть электрончики, транзисторы, сигналы...
Я эту телегу к чему. К тому что понимать что ты делаешь - это очень расплывчатая вещь, которая еще и не делает тебя ближе к результату - законченная программа, которая что-то полезное делает. Допустим ты решаешь сделать текстовую адвенчуру. Все что тебе тут нужно это базовые if-else и printf, scanf и работа с файликами, если не хочешь текст хардкодить. Каким образом та телега приблизила бы тебя к тому чтобы ты сделал законченную текстовую адвенчуру - я лично не понимаю.
Я имел ввиду не то, как оно работает под капотом, а то когда у тебя лапша из кода и нужно понимать что и к чему ты пишешь. Я не думаю что человек изучающий си месяца 3-4 способен сразу к осознанному написанию сложного по. К примеру взять питон макаку какую-то, там же просто пишутся скрипты которые надо «заучить», я не думаю что в си так получится, написать из коробки что-то осмысленное, да ещё чтобы оно и работало
>>63515
Для написания хорошего ПО надо научиться архитектуру придумывать. Я уже лет 5 программирую, но начал задумывать над этим только сейчас. Потому что, если мой проект разрастается хотя бы до уровня комплиятора "непростого" языка программирования, то везде начинают слои абстракции друг в друга переливаться, WET образуется сам по себе и исправить его представляет сложности, один и тот же код приходится переписывать по несколько раз.
Если научить человека, изучающего Си 3-4 месяца создавать хорошую архитектуру, то и ПО он сможет нормально и внятно писать.
>Если научить человека, изучающего Си 3-4 месяца создавать хорошую архитектуру, то и ПО он сможет нормально и внятно писать.
фантазии. и мало того что "нормально и внятно" никогда заранее не понятно, так он ещё и не поймёт как не надо.
Как мне подвязаться к uint8_t указателю? Подскажите, пожалуйста.
void array;
array = malloc(10); // для примера
uint8_t ptr = (uint8_t )array[24 x];
Пробовал как-то так, но ругается на дереференс укаазателя на войд и неправильное исполььзование указателя на войд.
В оригинальном куске кода статический массив, жёстко заданный:
uint8_t array[256];
uint8_t ptr = &array[24 x];
Мне не нравится мой счетчик count который при вводе миллиарда пробелов даст слабину
как бы его убрать....
Няша, ты же понимаешь, что ты шиз? И то что GC впервые начали использовать в лишпе - не значит что
> GC необходим не для того, чтобы ты, долбоёб, мог не думать, а для того, чтобы следить за временем жизни объектов, попавших в замыкания в языках с лексической областью видимости и функциями высшего порядка
Блядь. Горит. Сука. Давай, объясняй тогда, нахуя нужен был GC в жавах первых версий? Хули он там делал? А нахуя он в бейсике? А хули есть реализации GC даже для сей? Нахуя они там? Сука. Объясняй. Раз уж спизданул хуйню - давай, поясняй нахуя? Жду. Блядь, когда ты продемонстрируешь функции высшего порядка в няшных си(да, блядь, свой GC в си имплементировать никто не мешает) и покажешь мне замыкания в бейсике.
Делаешь обычный флаг. IsSpaceFound.
Встречаешь пробел - выставляешь его в true. Когда видишь первый непробельный символ - проверяешь флаг, если там флаг true - вставляешь пробел, сбрасываешь флаг и выставляешь следующий непробельный символ.
> Давай, объясняй тогда, нахуя нужен был GC в жавах первых версий?
Чтобы додикам, которые не осилили C++, ручное управление памятью говна в жопу не заливало.
> А хули есть реализации GC даже для сей?
Чтобы писать на сях рантаймы языков с ФВП и лексическим скоупингом. Посмотри на список применений того же boehm-gc, там с полдюжины разных лиспов.
> А нахуя он в бейсике?
Бля, братан, цитату Дейкстры про обучение студентов бейсиков и умственную неполноценность загугли сам в качестве домашнего задания.
>Блядь. Горит. Сука.
Конечно, чтобы осозновать собственную неполноценность без бурных эмоций, нужна серьёзно развитая психика, тебе до такого далеко.
Эх, Луговского на вас, долбоёбов, не хватает, он бы вас сразу нахуй опустил, это я такой добрый, объяснять ещё что-то пытаюсь, нести светлое знамя прогресса в безграмотные народные массы.
Короче, ты странно условие расписал. Я не совсем понимаю. Судя по коду - ты просто копируешь символы, при этом первый пробел - два раза.
Если тебе нужно было серию пробелов заменить одним, то:
whie(1){
c = getchar();
if(c == ' '){ putchar(c); do{c = getchar(); }while(c == ' ');}
if(c == EOF) break;
putchar(c);
}
на момент чтения мной этого задания bool еще не введен в оборот
Я в упор тогда не понимаю каким образом. Может быть я обдабался.
Смотри, ты встретил пробел. Заходишь в условие. Увеличиваешь счетчик. Проверяешь что счетчик равен 1. Засовываешь пробел в выходной поток если счетчик 1. Выходишь из условия. Засовываешь значение из переменной c - в поток, это второй пробел уже. Затем ты обнуляешь счетчик, что значит что ты если снова встретишь пробел - счетчик снова будет равен 1.
Я в упор не понимаю, как оно у тебя работать должно. Может быть мне нужно поспать.
Ну, тогда раз ты таки беспокоишься о переполнении и при этом типа про bool еще не знаешь - можешь просто int как тот же флаг использовать.
>- Visual Studio Community Edition
Достопочтимый сэр, вы ёбу дались? Вы действительно советуете для хэллоувордов устанавливать и настраивать этого стоголового монстра?
Прохожу вводный курсик на степике так сказатьб. Кто-то может пояснить, что в данном случае не так?
У меня всё работает, а на сайте не проходит. я бы и там в комменты отписал, но автор курсика под этим заданием людям лишь год назад отвечал
Ну и код на пастебин: https://pastebin.com/rccCL2ER
>Ну и код на пастебин: https://pastebin.com/rccCL2ER
Я правда туда забыл main и includы добавить, но тут я думаю и так понятно какие инклюды добавить надо, чтобы работало.
а я был за тебя в этой дискуссии. хотя и не понимаю/понимал зачем gc.
точность 1*10^-3. градусы в 0...1
Да я ноль в сишке. Ну я думал что так-как ноды не хранятся непосредственно в стракте списка то и free не может знать сколько и где памяти освобождать. Ну кроме как рекурсивно пройтись по всем поинтерам.
Алсо, не подскажите с какими флагами надо запускать gcc чтобы он хоть как-то ексепшены показывал. А то сейчас он молча все компилирует, и так же молча при запуске вылетает.
1. free знает размер, потому что он записан по тому же указателю, но до.
2. держи мой скрипт (уже устарел наверно) https://pastebin.com/JSgeTbq7
[05:13:15 satan@system ~/zprof/dev/pro/otr] <(^^)>
$ sh ~/zprof/dev/pro/utils/ccflags/ccflags.sh --with-debug gcc
-std=c89 -Wfatal-errors -g -Werror -fsanitize=address -fsanitize=undefined -fsanitize=bounds -fsanitize=alignment -fsanitize=object-size -fsanitize=bounds-strict -Wduplicated-cond -Wshift-negative-value -fsanitize=signed-integer-overflow -fsanitize=pointer-compare -fsanitize=pointer-subtract
>C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lasan
>C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -lubsan
>collect2.exe: error: ld returned 1 exit status
$ sh ~/zprof/dev/pro/utils/ccflags/ccflags.sh --get-ldflags --with-debug gcc
-fsanitize=address
Да, из-за фсанитайзов крашится. Наверное не поддерживает форточки.
Ну я
>-std=gnu2x -Wpedantic -w -Wfatal-errors -g -Werror -Wduplicated-cond -Wshift-negative-value
вписал, вроде начало ругаться когда пытаюсь стековые поинтеры освобождать.
наверно - не проверял. раньше и линковать не надо было. такая, ещё экспериментальная штука, чтоли. но советую.
ещё новый-модный https://github.com/IntelLabs/control-flag можешь прогнать. он по базе проектов определяет ошибку-около (на самом деле ложных я ещё не видел)
Почему хэллоуворлдишь? Я вот просто установил и просто открыл жоповывернутую хуйню, и она просто работает. Никаких настроек.
Хотя нет, одна настройка всё же была, зайти в прайваси и отключить "фоновый процесс ватсон сбор телеметрии", лол.
Каво нахуй, благодарю. Ты что магистр что ли? Можешь объяснить, что в моём не так было, я и так и эдак условия переделывал, а у тебя вуаля и всё. ну только вместо %d % PRId64, опечатался ты наверное
Ну хотя да, в этом моём
if (!a.valid && !b.valid) { return none_int64; }
___return a.valid ? a : b;
}
можно было придраться, но когда я множество раз менял, обрабатывая все возможные случаи, оно тоже не проходило.
Хочу спросить о разработки на компилируемых языках.
Вот если с питоном ты можешь легко переписать часть большого проекта и быстро это проверить, то в случае, например, с хромом, придется очень долго ждать пока он скомпилируется.
Как происходит разработка таких больших проектов?
> Можешь объяснить, что в моём не так было
Могу.
Строчка
> return a.valid ? a : b;
Ты проверяешь что а - валидно и возвращаешь в этом случае a.
А задача - вернуть минимальное в случае если оба валидны.
Господи, я уже в глаза долблюсь. Спать пора
Эта строчка
> return a.value > b.value ? a : b;
Больше на меньше поменяй
А вообще. Потому и придумали TDD. Пиши для себя тестовый код в котором у тебя будет проверка ожидаемого результата и реального.
В си есть такая штука как assert.h используешь assert() сравниваешь там ожидаемый результат и реальный, выводишь в stderr значения аргументов и сразу видишь где и с какими данными у тебя проблемы. Потом можешь загнать эти данные и в дебагере по шагам пройтись, если сразу не заметишь ошибку.
Как-то так. Да.
Почему первый параметр ("-l"), не передается?
Выполняется "ls -a"
Передаётся. Он становится arg0. Почитай, как конвенциально используется arg0 в контексте вызова программ. Пиши
execlp(" ls", "ls", "-l", "-a", (char *) NULL);
Суть такова: есть несколько приборов, у каждого свой адрес и одинаковый набор параметров.
Хочу разделить приборы по разным портам. Чтобы каждый процесс, опрашивающий порт, использовал одну структуру данных.
Мне поможет двусвязный список или что-нибудь ещё?
процессы - это только через файлы (в плане интерфейса). https://man7.org/linux/man-pages/man7/shm_overview.7.html
(ни разу не пользовался - может напиздел)
треды можно юзать?
>треды можно юзать?
Я не знаю, это закрытая железка (под капотом какая-нибудь RTOS) и закрытое ПО.
Позволено создавать параллельные процессы \ задачи самого примитивного вида.
не может быть что там нет posix threads
Двачую
Нармальна! ООП там для понту больше. Чисто показать как можно наследелование, инкапсуляцию реализовать. И его подход с вынесением в хилеры минимально необходимого интерфейса мне нравится. А так там в основном про многопроцессность/многопоточность в никсах.
Почему эта скотина ругается на закомментированный кусок кода? В симуляторе код нормально исполняется. В железе - вот такая фигня.
С недосыпа проебался в указателе на следующий узел.
Сейчас проснулся, продал глаза - взглянул, а там... Кек.
Всем спасибо. Ложная тревога.
Так сдесь де блок цикла не правильный, нужно или else if или в {} запихнуть.
Так пакт это и есть шлак, там издаться может почти кто угодно, надо очень тщательно фильтровать. Это не орейли тебе.
Ты путаешь конец строки с концом файла
\0 это признак конца сишной строки в памяти(крайне хреновый кстати, из-за которого нельзя \0 использовать в самой строке). В текстовом файле конец строки это \n или \r\n в зависимости от ОС. По крайней мере так разруливают все основные популярные апи дргугих языков, при работе с файлами. Допустим в шарпе, если ты будешь использовать File.ReadLinse("path") - то разделителем этих строк - будет \n или \n\r в зависимости от ОС, а при записи с помощью File.AppendAllLines ("path",strings[]) - в конце каждой строки - добавятся эти символы.
EOF - в сях/плюсах - это просто флаг того что файл/поток закончился и никуда его лепить не нужно. Да, во времена доса - там таки был такой символ, но использовалось это как костыль для своих досовских нужд.
Чтобы сохранить строку в файл ты должен, внезапно, просто записать все символы в файл, предварительно разрулив кодировку.
Открой одинаковые файл и буфер в хекс-редакторе/отладочном вьювере и посмотри как оно устроено.
>крайне хреновый кстати, из-за которого нельзя \0 использовать в самой строке
Зачем тебе его использовать в строке?
В больших проектах плохая, в ~1к строчниках имеет смысл.
Разбить на модули и тестировать их отдельно, иначе только мощное железо.
Зачем тебе в ANSI строке терминальные нули? Для твоей задачи существуют широкие строки.
https://www.opennet.ru/man.shtml?topic=wchar.h
Если объявлен, как struct NAME { ... };, то это структура, а если объявлен, как typedef ... NAME;, то это псевдоним.
Как найти где оно там объявлено
Лол, раст особо не помогает. Конечно он позволяет избежать глупых ошибок при работе с памятью, которые можно допустить по невнимательности, но всего того, что написано в твоем посте он не решает.
Раст - продукт от корпораций для корпораций, чтобы ускорить время и понизить стоимость разработки продукта, заменив высокооплачиваемых спецов на пару индусов. В общем, системное программирование может ожидать такая же участь как и веб с энтерпрайзом. У раста будет своя определенная ниша, но как УБИЙЦА няшной и плюсов он точно не годится.
>этот дэмэджконтрол
Не поверишь, но я прямо сейчас пишу проект на расте и с радостью перешел бы на этот язык будь он готов. А пока что у него даже стандартов нет, весь стандарт - это текущая функциональность компилятора.
>от жирной типовой пасты про вирджина и чэда
А когда было иначе? Традиции нужно соблюдать.
>отсутствие стандарта позволяет вносить новые фичи
Я вот этого никогда не понимал. Накой хуй новые фичи в системном языке? Зачем там нужны лямбды и прочая ересь, которая стоит дополнительных ресурсов процессора? Почему некоторые не могут понять, что все, ГОТОВО и вечно пытаются что-то прилепить скотчем?
>новые фичи
Которые ограничены llvm, который развивается для плюсов, лол. Поэтому у раста по определению не может быть больще функционала чем у плюсов.
Что что? В C будут лямбды?
Если мне нужен C++, я знаю где его взять, как говорится.
(эта цитата про ADA была оригинальная)
>Накой хуй новые фичи в системном языке? Зачем там нужны лямбды и прочая ересь, которая стоит дополнительных ресурсов процессора?
Ну тут уже определение "системный" у каждого своё будет.
>Которые ограничены llvm, который развивается для плюсов, лол.
Ты ещё учишься, да? Или это троллинг тупостью?
>Зачем там нужны лямбды и прочая ересь, которая стоит дополнительных ресурсов процессора?
https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
Сейчас разработчики пинуса и gcc жидко пёрнули со своими вложенными функциями, ренджами в свитчах и ещё полусотней нинужных фич. Ведь можно было всё захуярить на ANSI C и не прибивать яйца к жопаельному компилятору...
Хотя судя по гуглу уже почти пару лет можно ядро пинуса вполне билдится шлангом, так что можно считать их пердёж высохшим, кек.
>Ты ещё учишься, да? Или это троллинг тупостью?
А что не так, лол? Rust - фронтэнд для llvm, который в свою очередь изначально писался и пишется под плюсы. Специально по раст его никто изменять пока что не будет.
Ещё нет.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2892.pdf
Но лямбды судя по пропозалу просто спиздят из плюсов, вообще не о чем говорить даже.
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2895.htm
Мне больше вот это понравилось. Кто-то посмотрел как в Go выживают походу.
>Rust - фронтэнд для llvm
Реально учишься походу.
>который в свою очередь изначально писался и пишется под плюсы
LLVM — промежуточный таргет с кучей бэкэндов и мидлварей до этих бэкэндов, из которых можно собирать что угодно хоть твою жирную гречневую мать. Он by design "language agnostic". Что там конкретно "пишется под плюсы"?
>Специально по раст его никто изменять пока что не будет.
А ты хотел бы лайфтаймы в IR добавить?
>завтра в школу.
Ох, если бы это было правдой, то я бы обрадовался.
Увы, но я уже зрелый мужик, который должен сам себя содержать и обслуживать. Как же я заебался...
Сижу сейчас компилю ядро Linux. Просто так. 20 лет этого не делал, решил вспомнить молодость. Прифигел от размера исходников.
Привет Денис, как дела?
>даже стандартов нет
мне вот это главное не понятно - почему они всё время меняют поведение? делали бы уже, за выдержкой лет, раст 2, 3, 4 - как культурные люди делают.
или, вероятно, это попеннет в голову так проник, и там нет нарушений, а только нарост функционала. правда не понимаю раст, даже стыдно иногда становится, что все говорят про него, а я даже синтакстис не знаю.
отключай сходу в конфиге все драйвера кроме тех что тебу нужно - скорость взлетит в небеса компиляции.
Exuberant ctags. Хотя с clangd тоже должно работать.
>>Rust - фронтэнд для llvm
>Реально учишься походу.
Пажжи, так для ржавого есть другие бэкэнды, кроме llvm?
мимо растохейтер
Ещё один вкатыш не отличает языка от имплементации.
Это оксюморон уровня "С — фронтэнд для LLVM".
Фронтенд для LLVM — это конкретно rustc, как и clang.
>Пажжи, так для ржавого есть другие бэкэнды, кроме llvm?
Есть gccrs, mrustc. Хотя сути не меняет, даже не будь их.
Тг для связи: t.me/iglerrr
Заранее спасибо
Жду, пишите.
Написать программу для копирования входного потока в выходной с заменой знака табуляции на \t, символа возратат строки (бекспейс) на \b , а обратных косых черт на \\
#include <stdio.h>
main () {
printf("Hello scum\t");
system("echo jjjj");
//return 0;
}
Нахуй пошёл.
Некоторые даже под линукслм libc/musl используют для своих програм. Вот и хочу понять для чего.
>libc
Нет, ты не понял. libc - это название для стандартной библиотеки C. glibc, musl и newlib - это её конкретные реализации.
Ну вот на BSD системах используется стандартная реализация, так и называется libc. В линуксе используется уже другая реализация стандартной библиотеки - glibc. Я вот и хочу понять в чем между ними разница.
man system
он форкает процесс и ждёт, пока тот исполнится.
в итоге он сначала сбрасывает буфер echo, а потом main
>Ну вот на BSD системах используется стандартная реализация, так и называется libc
https://ru.wikipedia.org/wiki/Стандартная_библиотека_языка_Си
>Стандартной библиотекой языка Си (также известная как libc, crt) называется часть стандарта ANSI C
Если всё ещё не понял — под libc понимают любую реализацию, соответствующую стандарту. А в BSD просто не стали запариваться с названием для своей.
>А в BSD просто не стали запариваться с названием для своей.
Вот, это и запутало, теперь понятно.
Отвлекись и отдохни, сменив род деятельности. Сходи на рыбалку, в театр, и т.д. После "выжималки" обязательно нужно отдыхать.
Я как начинающий байтоеб хочу знать во что более перспективно вкатываться. Или это не имеет значения?
В стандарт С11 через KnR
У языка есть интерфейсы для этого, с которыми он знает как работать. Тебе надо их реализовать и заработает, очевидно же.
>У языка есть интерфейсы для этого, с которыми он знает как работать.
Очень абстрактно. На практике как это выглядит? Есть https://github.com/uNetworking/uWebSockets веб-сервер с феноменальными показателями производительности (обходит Nginx как стоячего). Каким то образом его используют https://github.com/uNetworking/uWebSockets.js на Node.js. Как используют не знаю, в доке не описано, а в коде я не смог разобраться. Автор не хочет портировать на другие языки. Вот мне стало интересно, можно ли использовать этот сервер например из PHP.
Заебись, через 63 года новый стандарт выходит, с лямбдами и STM
>как можно использовать его из кода на python или другом языке?
В случае интерпретаторов пишутся экстеншены. Это бридж от твоего интерпретатора до нативного кода, который прокидывает вызовы, маппит типы, менеджит память и тд. Короче, делает всю байтоёбскую работу, которой ты не видишь из интерпретатора при написании клиентского кода.
Гуглишь "nodejs/php/python extension c/c++" и читаешь доки. С твоим уровнем бесполезно, начни с байтоёбства попроще.
>>79258
>Очень абстрактно.
Для нативных языков — это все 100% работы, которую для такого надо сделать, ничего абстрактного.
Шутки шутками а пол хуя в желудке, но без всякой иронии это всё ещё один из самых используемых языков на бэке.
Это относится и к Си. Не даром современные программисты стараются вместо C/C++ использовать другие компилируемые языки. Вот ты знаешь C/C++, а можешь написать такой же https://github.com/uNetworking сетевой стек? Если нет, то выброси свои "знания", они бесполезны. Если ты со своим Си не можешь написать ничего, то не гони на PHP и другие языки. Язык нужен чтобы на нем писать софт, решать задачи. Если задачи не решаются, то язык такой никому не нужен. На Си что то писать нормальное могут единицы. Просто потому, что нужны очень глубокие знания платформы и сопутствующего. Если у тебя таких нет, то твои понты не стоят ни гроша.
Полузнакомый-полудруг полупрогер-полупокер посоветовал начать изучение с языка си, сказал что это наиболее оптимальный язык для понимания сути программирования. Посоветовал книги: Дейтел, Пратта, Керниган Ричи
Ну вот я начал с самой тонкой и вскоре понял что чот трудно. Ну открыл книги потолще и вроде стало полегче постепенно эти циклы там переменные форматирование и т.п. мелочи. И дохожу я значится то массивов и вот уже прошло времени где-то с месяц, а я до сих пор туплю на массивах на всех этих элементарных вещах вроде заданий с учебников даже на одномерных массивах. Причем когда подгляжу решение т.е. код. И вчитаюсь в него, то все становится вроде понятным, а как только снова надо решить задачу чуть чуть отличающуюся вернее с дополнительным действием, то сразу возникают трудности с реализацией этой задачи. Я что тупой что ль и программирование не мое? А дальше ведь указатели и ещё какие-то функции из стандартных библиотек на полкниги всякие проверки условий гетчары путчары эндоффайлы строки структуры жонглирование и фристайлинг ими....
Как же годно у пхп-обдристыша пичот, аж пустился в какую-то софистику.
Сейчас бы слушать кого попало. Если ты на дваче или у знакомого программиста спрашиваешь "какую книгу мне прочитать?" Приготовься, что тебе посоветуют лютую хуйню. Проблема не в самом программировании, а в том, как вы обучаетесь.
Ошибка всех нубов в том, что вы с нуля сразу садись штудировать серьёзные фундаментальные книги. По тысяче страниц и более. Зачем? Это как в тренажёрном зале, придти и сразу начать тягать штангу в 300кг. Чтобы сразу сорвать мышцы и уйти, хлопнув дверью сказать "тренажёрка не для меня!"
Если хочешь нормально обучаться - возьми прямо совсем лёгонькую книгу. Какой-нибудь типа "c++ для чайников". И потихонечку-полегонечку почитывай, страниц по 10 в день. Не нужно себя насиловать и пытаться за один день стать супер-профессионалом. Если не заходит - возьми что-нибудь другое! Программирование должно быть чисто в удовольствие, без всякого напряга.
Нагрузку нужно повышать постепенно. И закреплять всё на практике. Самую базу выучил - пишешь код. Ещё чуть-чуть подучил - ещё написал кода. На гитхабе можно чужой проект найти и поковырять его внутренности. Без реальной работы с кодом ты просто не поймёшь теорию.
>Вот ты знаешь C/C++, а можешь написать такой же https://github.com/uNetworking сетевой стек?
Любой каприз за твои деньги.
> Если ты со своим Си не можешь написать ничего
Не проецируй.
>На гитхабе можно чужой проект найти и поковырять его внутренности.
Охуенно пошутил, учитывая уровень проф проектов и уровень вкатывальщика.
>хнык-хнык
Щас бы слушать жалобы, что не получается стать программистом за 21 день. За такой срок ты даже верстке нормально не научишься. Скорее всего за этот месяц ты 99% времени читал и только 1% писал код. Вот и делай выводы. У тебя всего несколько часов практики, а чтобы стать профи нужны тысячи часов.
а libc на bsd только для неё самой? просто glibc не только под линукс, а линукс не цельная система, так что это оправдывает _своё_ название.
вово. я вон например читаю-вспоминаю геометрию, и не ленюсь все задания решать и чертить. иначе нихера не поймёшь.
posix это надмножество стандарта си.
>а libc на bsd только для неё самой?
Конечно, любая libc прибита гвоздями к ядру ОС, для которой она написана.
Как по простому заполнять массив числами, чтобы не писать вот эту залупу каждый раз?
int8 foo[];
foo[0] = 0x11;
foo[1] = 0x22;
foo[2] = 0x33;
foo[3] = 0x44;
func(&foo);
foo[0] = 0x55;
foo[1] = 0x66;
foo[2] = 0x77;
foo[3] = 0x88;
func(&foo);
Думал сделать как-то так:
int32 foo;
foo = 0x11223344;
func(foo);
foo = 0x55667788;
func(foo);
А дальше уже разбор на кусочки foo внутри функции. Но неспортивно, т.к. массив может быть длинее.
Есть ли нормальный способ делать как-то компактнее, без всяких циклов и доп переменных?
Но конечно, рука так и хочет написать:
foo = {11, 22, 33, 44};
Как по простому заполнять массив числами, чтобы не писать вот эту залупу каждый раз?
int8 foo[];
foo[0] = 0x11;
foo[1] = 0x22;
foo[2] = 0x33;
foo[3] = 0x44;
func(&foo);
foo[0] = 0x55;
foo[1] = 0x66;
foo[2] = 0x77;
foo[3] = 0x88;
func(&foo);
Думал сделать как-то так:
int32 foo;
foo = 0x11223344;
func(foo);
foo = 0x55667788;
func(foo);
А дальше уже разбор на кусочки foo внутри функции. Но неспортивно, т.к. массив может быть длинее.
Есть ли нормальный способ делать как-то компактнее, без всяких циклов и доп переменных?
Но конечно, рука так и хочет написать:
foo = {11, 22, 33, 44};
>foo = {11, 22, 33, 44};
Это и есть решение, только помни про byte order
И зачем ты в функцию передаешь указатель на указатель?
>И зачем ты в функцию передаешь указатель на указатель?
Да по ошибке, просто не стал второй раз делать фикс.
А вообще, там на самом деле вообще структура у меня.
А ты уверен, что так можно на C?
UINT8 foo[4];
foo[] = {11, 22, 33, 44};
Только так можно.
UINT8 foo[4] = {11, 22, 33, 44};
Пока что выкрутился такой оберткой, но выглядит как-то погано, не думаю, что это экономно по памяти:
typedef struct {
UINT8 baz[3];
} bar;
bar foo;
foo = (bar){ .baz = {1,2,3} };
foo = (bar){ .baz = {4,5,6} };
>Пока что выкрутился такой оберткой, но выглядит как-то погано, не думаю, что это экономно по памяти:
>
>typedef struct {
>UINT8 baz[3];
>} bar;
>
Выравниваение тут произойдёт и займёт ширину машинного слова. Или 32 бита.
Чтобы отключить выравнивание используй директиву препроцессора
#pragma pack(1)
> А ты уверен, что так можно на C?
Начиная с C99 можно: https://en.cppreference.com/w/c/language/array_initialization
Обычно самоучки чем-то стоящим становятся месяцев через 6. Пригодными для решения реальных задач становятся через год. И лишь через два года они могут создавать большие и надёжные проекты. Разумеется, это усредненные числа, у каждого индивидуально может наступить каждый из моментов раньше или позже в зависимости от выбранных методов обучения, количества свободного времени и сил, способностей и связей с другими.
Обыкновенная физиология. За сильное возбуждение нервной системы неизбежно расплачиваешься утомлением. Если очень интересно, можешь почитать "Гениальность и помешательство" Ломброзо, там этот вопрос часто поднимается.
Какие есть альтернативы protobuf, пригодные для описания различных закодированных или сериализованных структур данных? Чтобы работать с бинарными протоколами различными. Думаю, реализовать для себя нечто подобное, или изучить готовое, если есть.
У вас на работе тоже имеются QA, аналитики, ПМы, менеджеры и прочие социобляди в огромном количестве?
Есть flatbuffers, есть bencode, но проще всего сделать что-то свое. Есть ровно три варианта: срать текстом, срать сырыми структурами (тебе будут говорить, что это плохо, но ты не верь) или срать каким-то подобием TLV (отправляешь tag/type, опционально length и потом value).
Алсо, чем тебе протобуферы не угодили кроме отсутствия официальной поддержки сишки?
у меня дома только мама и тётя.
>чем не угодил
Вот есть уже готовый протокол древний какой-нибудь, описанный в толстом PDF или xls файле. Там по сути структуры, по-разному закодированные строки (то с размером, то null-terminated), числа, enum, массивы и структуры в структурах.
Protobuf, как я понял, для такого не годится, так как он для новых протоколов заточен, и там не настолько всё гибко, чтобы поддерживать легаси. Или я ошибаюсь? Возможно, что-то такое реализовано где-то в Wireshark, там есть поддержка огромного числа протоколов, всё разбирается по полям.
Было, в общем, прикольно бы описывать эти структуры общим каким-то способом, и потом на основе этого генерировать сериализаторы/десериализаторы, или интерпретировать формат и обрабатывать данные на лету, как в sprintf/sscanf.
По поводу сырых структур, там ещё бывает нужно с endianness разобраться, если машины разные.
В какой момент возникло такое понимание? В чём сложности?
Хочу познать как пишут клиент-серверные приложения в телекоме. Что и где читать? Какой язык, Си или Эрланг, или оба? Где вообще лучше такие вопросы задавать?
Прям телеком-телеком уровня коммутаторов? А так плюсы и ява.
>нравятся длинные названия для функция и переменных
>нравится ограничивать длинну строки до 80 символов
>не нравится добавлять много белого пространства
>не нравится 2 пробела для таба, слишком мало
>не нравится 4 пробела для таба, слишком много
>3 пробела это ебланизм
че делать, выглядит уродливо. как как победить аутизм?
4 пробела выглядит лучше, чем 3 или 2. Потому что когда пишешь "if (", то следующая строка начинается там же, где и условие в if, что выглядит ровно и красиво. Используй 4 пробела.
А мне вот не нравится, когда следующая строка начинается там же, где и условие в if.
Царь, ты?
>I have absolutely no idea how to write a programming language
Никто не знал, когда PHP появлялся. Единственная адекватная на эту тему литература, которая была доступна, это книжка с дракончиком. Если тебе нужно создать небольшой язык для работы с формами, тебе не нужно её читать.
>I just kept adding next logical step on the way.
И правильно делал, так реальные программисты решают реальные проблемы.
>I'm still bad at writing parsers.
Парсинг это ничтожная часть рантайма в любом языке программрования.
>The function hashing mechanism was strlen()
Хеш функцию несложно заменить, если нужно. Сокрее всего тебе вообще не нужно будет ничего хешировать на ранней стадии разработки языка программирования. strcmp() линейно ищя нужный айдентифаер в массиве будет работать адекватно.
>I don't care about this crap at all.
Всем адекватным людям тоже на это похуй.
База, кароче говоря. У руби например долгое время вообще не было виртуальной машины и язык работал проходясь по сгенерированным парсером АСТшкам.
Можно как то зарабатывать не устраиваясь никуда и не влезая во фриланс? Просто так писать код не интересно, хочется чтобы это приносило хоть какие то деньги. Можно написать приложение для андроида, но это долгий путь. Нужно сделать хороший интерфейс, нужно продвижение. Писать какие нибудь парсеры? Это нужно искать заказы. Есть способы заработать написав приложение, которое продавать на маркетплейсе или же написав приложение, которое будет как то деньги добывать?
>Потому что когда пишешь "if (", то следующая строка начинается там же, где и условие в if, что выглядит ровно и красиво.
Самый тупой аргумент. Почему именно для if? Существуют же еще for и while, почему тогда не 5 или 7 пробелов?
Создай подобную хуйню, если выстрелит, то можешь больше не работать и сычевать ближайшие лет 5 минимум. https://ru.wikipedia.org/wiki/Yandere_Simulator
Потому что if встречается в C-коде значительно чаще циклов (из-за обработки ошибок). Ну и это, аргумент не был на 100% серьезным, если ты не понял.
>Хочу похвастаться своим git
100 форков крупных проектов без изменений?
>Придётся хуячить статью на Хабре, плюсы в карму зарабатывать.
Слишком толсто.
Никак, к тому же зачем? Если в сторонней библиотеке есть enum, значит его значения используются внутри нее, зачем тебе изменять его возможные значения, если они не будут использоваться внутри нее?
Ну, например, эта либа задает базовый функционал, например, в ней есть базовый набор кубиков для конструктора. Но используя ее, нужно расширить этот функционал, а тип этих кубиков задается в enum, а не строковому названию. Поэтому для расширения требуется как-то впихнуть еще значения в enum, но не трогая код самой либы базовой. Вроде в SDL что-то такое было для добавления своих event и они там тоже в своем enum были, но точно не помню
Так принцип-то не тот: базовая либа она и предназначена для только базового функционала, а пользователи расширяют ее под свои задачи.
А не знаете в плюсах такое тоже отсутствует?
Мне в какую-либо функцию поступает enum, принимающий значения EVENT_HUY, EVENT_PIZDA, EVENT_JOPA, в моей (внутренней) функции, реализуется функционал для каждого значения, скажем через таблицу строк, функций и т. д.. Чтобы какой-то анон с двача, изменил поведение моей функции, ему надо переписать ее, иначе я бы использовал define для принимаемых констант, если бы добавил (хотел добавить) возможность расширение функционала без вмешательства в исходники. Ты же хочешь просто добавить еще какие-то значения, которые моя функция не ожидает, если я использую таблицу (массив) строк, для каких-либо строковых представлений значений (для отладки, вывода и т. д.), то твое расширение функционала - это потенциальная запись/чтение, в какую-то память, что приведет к ошибкам, уязвимостям в конечном (твоем) продукте. Вывод: переписывай исходники или найди документированный способ добавления нового функционала в нужную тебе библиотеку без изменения исходников.
ТУПОЕ РАСШИРЕНИЕ ПЕРЕЧИСЛЕНИЯ НЕ ВЫХОД!
Нету. На это завязана проверка switch, а еще некоторые компиляторы сами выбирает ширину типа для enum.
>нужно всего лишь... хоть раз реализовать ADT на Си
Подскажи как это делать, в каких книгах или мануалах почитать?
Блядь, похаперебёнок, почему ты всё ещё копротивляешься? У тебя был шанс тихо уйти из треда размазывать своё говно по ляшкам, а теперь тебе придётся ещё рот от мочи полоскать.
Пёс, голос!
Чем ты хвалишься, дура? Язык Си не ты создала. Своим есть чем похвалиться? Код хоть есть какой? Какой же ты ребенок. Только дети хвалятся не своим.
ГОВОРИШЬ ЧТО ЯЗЫК ГОВНО
@
СДЕЛАЙ ЛУЧШЕ!
ГОВОРИШЬ ЧТО ФИЛЬМ ГОВНО
@
СНИМИ ЛУЧШЕ!
ГОВОРИШЬ ЧТО ЯЙЦА ПРОТУХЛИ
@
САМ СНЕСИ СВЕЖИЕ!
Очередное подтверждение того что скриптоложество, и пхп в частности, разжижает мозг..
>>85883
Тупой школьник, только дети хвалятся тем чего не добились. Например, что у них папа ко-ко-ко. Только вот они ничего не сделали для того чтобы их отец чего то достиг. Они получили отца которого получили. У кого то отец успешный, а у других алкоголик. Это не значит, что ребенок успешного отца приложил усилия для чего то. Также как хвалиться национальностью или местом рождения. Тупица, ты не заслужил это, не добился, не выбирал, ты просто получил это как есть.
Ты такой же недоразвитый дегенерат. Восхваляешь себя из за Си, который не ты разработал. Ты просто им пользуешься (очень сомневаюсь, что ты написал что то на нем). Ты мог бы похвалиться написанным кодом, но у тебя его нет. Так что закрой рот, щенок.
>>85883
Ты тупее осла. PHP это все лишь инструмент. Почему меня должны волновать твои высеры в сторону PHP? Да, я им пользуюсь. Как и многими другими языками. И что с того? Почему мне должны быть стыдно или что ты там имеешь в виду? Дегрод. Это тебе нужно стыдиться, что ты такое чучело недоразвитое. Отброс.
>100 форков крупных проектов без изменений?
Гы. Ни одного форка. Три проекта на сях. Один из них учебное говно для студентов, который неплохо было бы прибить. Второй - консольная игрушка десятилетней давности. А вот третий... тоже на сях и думаю что вскоре он будет популярен. Не потому что проект крутой, а потому что я "запрыгнул на спину" крупной компании, выводящей новый продкукт. Короче говоря - я подсуетился и сделал к этому продукту консольную утилиту.
>Иди отсюда
Червя-зумера забыл спросить.
>>85935
>о нём неодобрительно высказываются
Переобуваешься, червь. Ты начал оскорблять меня, типа потому что я использую PHP. Тупая дура, школьница.
>своего батю-алкоголика приплёл
Мой отец не пьёт, дегрод ты пустоголовый. Как будто ты не видел, что я не своем отце писал. Хотя, ты же червь безмозглый, поэтому не удивительно.
>Червя-зумера забыл спросить.
>Переобуваешься, червь.
>Тупая дура, школьница.
>дегрод ты пустоголовый
>ты же червь безмозглый
Пхпдев пытается в общение.
>Хочу похвастаться своим git, но не хочу деанониться на двачах.
Боишься, что в школе затроллят?
Я ЧЕРВЬ-ПХПШНИК ХУЖЕ МЕНЯ УЖЕ НЕТ
> в школе
Как что-то плохое. Ну ваще-то первую зряплату за программирования я получил в 1993 году. Внезапно это была программа на Си для отдела кадров. Никаких 1С тогда и в помине не было.
Друг, я ничем не хвалился, я просто на пальцах разложил, почему твой любимый язык программирования - говно. По какой причине ты продолжаешь копротивляться, мне неведомо.
>твой любимый язык программирования
К твоему сведению, мой любимый язык программирования это Лисп. Если порассуждать, то окажется, что Си по сравнению с Лиспом это как Запорожец по сравнению с Ламборджини. Поэтому не стоит плеваться желчью, сам себя обольешь.
Так а чо ж ты за пыху тогда уже полтреда впрягаешься? Не пора ли притушить свою анальную боль и пойти дописывать свой кластер метапарадигм на твоём действительно любимо языке?
Есть компилируемые лиспы. Есть без GC. Язык это прежде всего мощь абстракций, а не оценка затрат. Ну сэкономишь ты жалкие 500 Мб оперативки, ну сэкономишь немного процессора. Это железо можно купить за 300-500 рублей в месяц. Зато ты потратишь в 5-10 раз больше времени на разработку. А еще 100% у тебя будет очень много багов, которые потом еще долго нужно будет фиксить. Вот поэтому Лисп это Ламбо, а Си это Запорожец. Да, Запорожец экономней, но на нем ты быстро не доедешь до цели, также и на Си ты быстро не напишешь проект.
Процитирую резюме Льва Валкина:
Десятки тысяч строк C для TCP и HTTP акселератора на FSM. Больше так не буду.
https://career.habr.com/walkin
Если что, то это топовый программист, давно живущий в силиконовой долине. Он си-хакер. Вот один из его проектов https://github.com/satori-com/tcpkali
Он писал в продакшн на разных языках, в том числе на экзотичесих вроде Эрланга и Окамла. И что же мы видим, он пишет, что написать 10к строк кода на Си это ужас, что больше так делать он не хочет. Поэтому те кто понимают что к чему, выбирают Окамл, Раст, что угодно, но только не Си.
Вывод очевиден. Ты школьник, ничего не смыслящий в программировании, в Си, в лиспах.
>>86453
>Так а чо ж ты за пыху тогда уже полтреда впрягаешься?
Во первых, где? Во вторых, а что не могу? Или ты тут за Си не впрягаешься? Ну тогда и PHP тебя не должен беспокоить.
Ты долбоёб не умеющий в иронию.
Етого ты не заметил?
Обо мне
Специализация и профессиональные навыки:
Unix, Internet, C.
>Етого ты не заметил?
Чего этого?
>Обо мне
?
>Unix, Internet, C.
И ??? А, ты наверное хочешь выкрутиться и сказать, что Валкин не писал ни на каком Окамле и т.п.? Загугли, инфы про него много. Здесь есть все ключевые слова, и Lisp тоже https://www.slideshare.net/j2a/ss-4625844
>Во первых, где?
>>86180
>>85917
>>84729
>>80579
>>79949
>>79634
>>79397
>Во вторых, а что не могу?
Ради б-га, у нас пока свободная страна.
> Или ты тут за Си не впрягаешься?
Нет, я делаю жирнейшие набросы на похапе, а ты уже вторую неделю генерируешь своим горящим пердаком килобайты копипасты. Я так не веселился со времён форса митрополита токийского.
Ваши лиспы тупо обосрутся на перекладывании байтиков между сетевухами 40g. Ну а если выполнятся код должен на нескольких серваках, это не 500р в месяц.
>Ваши лиспы
Лиспы не наши. И Си не твой.
>>87191
>обосрутся на перекладывании байтиков между сетевухами 40g
lol, придумал кейс, который в РФ не существует. В таком случае могу напомнить, что когда в коде для американского спутника нашли баги, а он уже был в космосе, то смогли пофиксить благодаря REPLу. Код был на Лиспе. Кейс тоже редкий, но меткий.
>Ну а если выполнятся код должен на нескольких серваках, это не 500р в месяц.
Чиво? Как раз таки Си из коробки не годится для параллельных и распределенных вычислений.
>Как раз таки Си из коробки не годится для параллельных и распределенных вычислений.
Чиво так?
Вообще-то на Си можно написать абсолюно всё. Только при этом труда придётся положить не мало.
>Чиво? Как раз таки Си из коробки не годится для параллельных и распределенных вычислений.
Тебе ли, пхп-макакену, об этом пиздеть?
Берёшь и запускаешь тыщу инстансов синглтред говна, раз макака и не могёшь в программирование — и всё равно выходит по железу в 500 раз дешевле, кекс.
>Вот поэтому Лисп это Ламбо, а Си это Запорожец.
В твоей воспалённой пхп голове?
>Поэтому те кто понимают что к чему, выбирают Окамл, Раст, что угодно, но только не Си.
Ладно ещё раст, но окамл... У тебя вообще всё ок? Или ты ещё учишься?
Ну там C89/C99/C11/C17..
В вики написано, что C17 поддерживается шлангом от 7 версии, на android сейчас по дефолту все шлангом обычно, получается, что вроде все должны...
или только по 11..
> но не вижу причин использовать выше 11
ну выше 11 только 17 пока, там просто исправления 11 стандарта
В первом случае, у тебя используется подстановка на этапе препроцессора, а во втором на этапе компиляции. В зависимости от компилятора\его параметров, у тебя может быть, или вызов func_1()->func_2(), или сразу подставиться func_2() вместо func_1(), но в первом гарантировано будет сразу вызвана func_2().
Насколько я помню, некоторые компиляторы могут игнорировать inline, с флагами точно.
>Покажи сколько языков за последние 10 лет
Реально либо тупой либо ещё учишься. Язык написанный на языке, проиграно с подливой.
>написано на Си
Примерно у всех, где есть рантайм (и он толще стдлиба) или интерпритируемые/с виртуалкой — всё на си/плюсах.
Python, Ruby, твой ссаный PHP, JVM, JS, тысячи их.
Ты же сам припёрся сюда с вопросом >>79258 как прикрутить сишную либу интепритатору пыхи, который на си, кек.
>языками написанными на Окамле
Компилятор раста (и то только первая версия), хакса и самого окамла? Это по твоему такой дикий вин?
>Раз ты этого не знаешь, и вообще не понимаешь почему пишут на Окамле
А что пишут-то? Полтора компилятора для бутстрапа написали за 20 лет?
>почему Си плохой язык
Для задач уровня пхп-макакенга? Наверно хуёвый.
В нише си альтернатив нет. Раст — альтернатива плюсам, и то не везде.
Поясни уж, почему он такой плохой.
>Про параллельность и распределенность на Си это вообще смех. В Эрланге все есть из коробки.
Пхп-воен, ты же даже не понимаешь о чём вообще пишешь. Нахуя ты продолжаешь себя закапывать? Просто съеби и смой урину с ебала.
> Раст — альтернатива плюсам, и то не везде.
Они же вроде наоборот как си альтернативу показывают, что вот можно отключить стандартную либу раста и пользоваться только стандартной от си для эмбэда?
мимо другой анон
Школьник, на Си никто уже давно языки не пишет. Потому что дерьма наелись. Такие неучи как ты может быть. Так что не гони, что Окамле ничего не пишут. Много чего пишут. Даже веб-приложения, что для Си недостижимо. И сколько бы ты не пытался принизить PHP, от этого ты лучше не становишься. Наоборот, показываешь свою никчемность. Ты же даже такой язык не написал. Вообще сомнения в твоих способностях. Не может человек с таким мышлением быть программистом. Максимум копипастером.
Да такой хуйнёй в целом на любом компилируемом языке можно заниматься хоть на том же окамле, было бы желание. Другое дело, что это будет банально больно делать.
Просто когда у тебя задача именно контролировать буквально каждый пук — что на плюсах, что тем более на расте это делать не так удобно, как на си. А смысла писать на расте там, где придётся обойти все проверки компилятора, мягко говоря, нет нихуя.
Из альтернатив именно си я видел только zig, но он в такой стадии развития, что даже для написания петов надо подождать ещё года полтора-два.
>Ну так по факту
???
Не понял о чем ты. Насчет веба на Окамле, имел ввиду Ocsigen. Он дает фулстек тулзы для написания веб-приложений. И бекенд и фронтент можно писать на Окамле. Крутая вещь.
Спок, скрипткидди, их и на окамле не пишут. Точнее на нём вообще почти нихуя не пишут.
Что рантайм окамла, что виртуалка эрланга — всё на сях. Было и будет.
Так что можешь расслабить своё зумерское очко, и идти играть в фортнайт. Написанный на плюсах.
Что там насчет языка V? Узнал о нем когда он занял первое место в одном из тестов Techempower. Он собственно и сейчас на первом месте в тестах plaintext.
https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=plaintext
https://vlang.io/
Судя по отзывам, автор языка или безумный и обманщик или гений. Комменты разнятся противоположно. Кто что думает?
>Не понял о чем ты. Насчет веба на Окамле, имел ввиду Ocsigen. Он дает фулстек тулзы для написания веб-приложений. И бекенд и фронтент можно писать на Окамле. Крутая вещь.
Чел походу думает, что ему тут доказывают что си — лучший язык для вротенда и пхп-крудов.
Вот вы издеваетесь — а ему ведь реально сложно...
Зумер-инноватор изобрёл RAII.
Лет через 15 мб половину из обещанного и запилит на нормальном уровне.
Посмотри исходники.
Наверно минимизирует количество проходов, задрачивается чтобы ничего динамически не аллоцировать.
Да и синтаксис у языка простой + нет препроцессора и вообще макросов. Тот же D тоже очень быстро собирался, при том, что там заёбистость синтаксиса не сильно ниже плюсов.
А в расте что-то есть, кроме уебанского синтаксиса?
ага, и функция как fn пишется, а так вообще ничего общего
Ты ещё спроси почему на жабе/шарпе писать не пошли.
потому что GC
ты б его блять еще в пеинте открыл. или ты троллишь двач бинарниками не в hex-редакторе?
тяжело наверное жить без ЧЮ
А ты все бинарники в текстовом редакторе открываешь?
Неудобненько, кек.
Когда его обсуждали на лейнчане, то выяснилось, что даже у простого хеллоуворлда память утекает. Может сейчас всё изменилось, конечно
Самое грустное, что асм приятнее. Хуже синтаксис, чем у ссы, трудно вообразить, а так тот же асм. В асм добавь все эти printf в удобном виде, будет та же сишечка без скобок.
http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf
У меня глаза от пика утекли.
Мне интересно, челы делающие такие скрины реально долбоёбы и так юзают терминал, или просто держат специальный профиль для скринов для борд?
Чел... Это не руководство, это какой-то high level обзор работ, лол.
В написании компиляторов в 2к22 есть 2 стула:
1) Короткий (если уж тебя интересует статейный зумерский формат) — по тутору LLVM (покрыта только тема генерации IR, до нормального ассемблера дело там не доходит);
2) Долгий — гуглишь "compiler dragon book" и задрачиваешь. Если надо изучить на уровне "лаба25" и нет интереса глубоко закапываться — у Вирта была какая-то короткая книжка, но то ли поцкали то ли оберон семейство которых ты скорее всего не застал.
Сказали, что русские символы в ней надо хранить в строках char * ввиде ASCII символов.
Посему пара вопросов:
1) Как это будет выглядеть?
2) И как сохранённую строку подсунуть в snprintf, например?
Подскажите, плез, что к чему.
Сообщение - "Мой текст"
sprintf((char*)&foo, "\xCC\xEE\xE9\x20\xF2\xE5\xEA\xF1\xF2");
Дальше - сам.
Эй-эй, не так быстро.
Это кодировка WIN-1251?
https://en.wikipedia.org/wiki/Windows-1251
Чому в эмуляторе не отображается корректно?
https://onlinegdb.com/xVHmh5nIf
>по тутору LLVM
>гуглишь "compiler dragon book" и задрачиваешь
И то и другое понты, что обосновано в этом
http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf труде.
И ещё, почему не работает:
snprintf(tBuf, sizeof(tBuf), "\xd2\xc5\xd1\xd2: %s\t", \xd4\xd3\xd3);
Подозреваю, что %s не то. \xd4 - это же байт.
Какой правильно?
Какой-то араб из американских ебеней, написавший курсовую типа: швой лишп в 100 строк пейпер в 2006 точно не мог ошибаться.
Особенно учитывая что он там про это вообще ничего не пишет.
>>90837
Здесь http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf показана раскрутка компилятора. А то что вы советуете это пустая теория, и без раскрутки. Короче прежде создать хоть что то примитивное надо потратить несколько месяцев. НЕ НУЖНО!
>>90865
>Какой-то араб из американских ебеней
Он профессор вообще то и действующий программист. Если не знаешь ничего, то не лезь со своим никому не нужным мнением. По его принципу многие писали компиляторы. Метод раскрутки придуман конечно не им, но больше инфы с кодом по раскрутке в интернете найти трудно.
>нюфаг не понимает даже куда код сувать
>РЯЯЯ ВЫ НИ ПАНИМАИТИ И ВААБЩЕ НИПРАВЫ ВСЕ ЭТА НИНУЖНА ВОТ РАСКРУТКА СМАТРИТИ РАСКРУЧИВАЕШЬ КАСЯК И ВОТ КОМПИЛЕР РЯЯ
Хорошо, ты выиграл.
Зачем ты вообще лезешь что-то писать, если не хочешь учить теорию и дрочить базу? Чтобы сделать действительно годную вещь, один хуй придется учить много материала и возможно, что не один год. Ты, видимо, просто поиграться хочешь и палочкой потыкать, чтобы потом говорить "А я в ко-ко-компиляторах разбираюсь. Вот даже свой написал".
мимо
>А что нельзя? Еще бы у вас разрешения спрашивать.
Конечно можно, просто не стоит копротивляться, когда тебе теоретическую базу хотят посоветовать. Так и сказал бы, что просто хочешь палкой потыкать и кирпич в виде книги дракона - это оверкилл для твоих целей, тогда пропала бы и почва для бесполезного срача.
>А что нельзя? Еще бы у вас разрешения спрашивать.
Можно конечно. Но книжку хотя бы про си придётся прочитать, код по файлам сам себя не разложит. Ну или поищи статеек с "раскруткой" си, если не воспринимаешь инфу вне привычного тебе тиктокерского формата, кек.
>>91191
Я не против фундаментальных знаний, но есть несколько НО. Вы сами много в этом разбираетесь, что раздаете советы? Книга дракона может и хорошо объясняет как устроены и как строить компиляторы, но она плохо учит это делать на практике. Вот я выяснил, что для понимания как писать компилятор нужно изучать формальные языки, грамматики и методы трансляции. Это такая дисциплина, ей в ВУЗах учат. По ней книги есть. В книге Дракона сомневаюсь, что об этом написано. А потому она плохо годится как в качестве учебника.
>Книга дракона может и хорошо объясняет как устроены и как строить компиляторы, но она плохо учит это делать на практике.
Откуда ты знаешь, если не читал? Вообще советую хотя бы скачать книгу и ознакомиться с содержанием.
Спасибо за подсказку.
Вот функция, которая возвращает лямбду, которая возвращает число 42 https://rust.godbolt.org/z/bMrz3E65r Оверхеда 0.
И вообще в Rust оверхед можно найти только в динамической диспетчеризации. Про всякие Боксы и примитивы синхронизации (Arc, RwLock) говорить не буду, они самоочевидны поскольку неизбежны в любой современной программе. Бокс это когда у тебя память в хипе (аллокация против стека) а на руках ссылка на нее.
https://rust.godbolt.org/z/fx677qs6M статическая диспетчеризация
https://rust.godbolt.org/z/75fKhGj6f динамическая
Хоть и говорят что динамическая диспетчеризация на большой кодовой базе будет генерировать меньше кода. Работать она будет тоже медленее. Но не всегда, это часто зависит от железа и бэкенда - https://github.com/rust-lang/rust/issues/69593
Есть еще способы оптимизации https://crates.io/crates/enum-dispatch
Вот тут еще можно посмотреть https://docs.google.com/presentation/d/1q-c7UAyrUlM-eZyTo1pd8SZ0qwA_wYxmPZVOQkoDmH4/edit#slide=id.p
Есть еще многие приятности вроде https://rust.godbolt.org/z/G3a9GY73r когда в структуре присутствует ссылка (а компилятор гарантирует что она не может быть null благодаря правилам языка), получаются такие оптимизации в байтиках. Работает также на Result, а эти типы повсюду в кодовой базе.
>лямбды
Без них ты не сможешь писать лаконичный код. Если функция в языке не является first-class citizen, то это не язык, а обрубок. Хорошо в Си есть указатели и можно передавать указатель в функцию, это его немного спасает.
>Я вот этого никогда не понимал
Отсутствие некоторых фич делает язык чемоданом без ручки. Нести его становится тяжело (код писать тяжело, много кода требуется). Возьмем к примеру Лисп. В нем почти нет синтаксиса, но благодаря некоторым фичам, его небольшой синстаксис становится убойно выразительным. Лисп считается самым выразительным языком. Особенно хорошо эти свойства проявляются при парсинге сложных данных. Попробуй на Си парсить сложные протоколы. Это очень тяжелый ручной труд. Кода писать нужно тонны. Для Лиспа никаких сложностей нет и кода не нужно много.
>Которые ограничены llvm, который развивается для плюсов, лол. Поэтому у раста по определению не может быть больще функционала чем у плюсов.
Чиво? Раст написан на Расте. Почему в C/C++ тредах все такие напыщенные, но необразованные? Не ты ли писал в мой адрес, что я пхп-макака? Ох, лол.
>> fn -> fn -> fn ->
>Проорал
Ну и глупенький. Слышал про кодировки Чёрча? Вряд ли. Сишники и плюсовики народ дубовый. Таким образом реализуют комбинаторы. Которые используют много где.
Школьник что ли? Если бы ты учился Computer Science, то знал бы. А у тебя похоже образование уровня макаки.
https://en.wikipedia.org/wiki/Combinatory_logic
https://en.wikipedia.org/wiki/Parser_combinator
Отвечал на
>Зачем там нужны лямбды и прочая ересь, которая стоит дополнительных ресурсов процессора?
Можно еще разницу между итератором и циклом взять (это тоже вызовы функций и лямбды)
https://rust.godbolt.org/z/hjfzqvd8E
https://rust.godbolt.org/z/ad9bK73a4
В любом случае Сишная версия выглядит по-компактнее https://godbolt.org/z/a8ad39vMs
C++'ную мне вообще не удалось заставить SIMD использовать https://godbolt.org/z/sG6f7Pndn
ни с STL, ни циклами. Ни в clang ни в GCC
В Rust кстати самые обычные ссылки чуть дешевле чем соответствующие им unique_ptr из С++
https://rust.godbolt.org/z/3dx64crf4
https://cpp.godbolt.org/z/jbv3Gh7G5
Отсюда взято https://youtu.be/rHIkrotSwcc?t=1440
>Лисп считается самым выразительным языком.
Это его также самая знаменитая проблема. Каждый lisp-программист норовит написать свою DSL в которой другие программисты копаться отказываются. (Так я слышал несколько раз)
Все-таки комбинаторы хороши тем что позволяют сократить шаблонный код. И вдвойне приятно когда не требуют ничего взамен https://play.integer32.com/?version=stable&mode=debug&edition=2021&gist=985f8954ee2c443a1233fa302e55632f
Скучный аргумент, ни разу такого на их житхабе не видел. Или в статьях о Rust, или на reddit/r/rust или еще где кроме двача и оппеннета с лором. Это всего лишь инструмент, не обязательно ориентацию менять.
Единственный раз когда происходило что-то странное, это когда мозилла в своем блоге за СЖВ начала топить. Но им тогда много от самих растаманов прилетело, которые не желали чтобы от их имени говорили политики. Мозилла больше в Rust не сольная скрипка.
Вот с++ и ассемблерщики тут не помешают.
Про Ada/SPARK забыл, и D
> Скучный аргумент, ни разу такого на их житхабе не видел.
Ага, как же, только недавно драма была
https://thenewstack.io/rust-mod-team-resigns-in-protest-of-unaccountable-core-team/
Каково это, чувствовать тёплый, пульсирующий CoC в свой влажной тугой попке?
Как же школьнику ни пичот!
>>91460
>Это его также самая знаменитая проблема.
Я знаю. Но это ведь проблема программистов, а не языка. Нужно просто правильно использовать эту мощь. Никто же не говорит, что не нужно использовать огонь, потому что им можно обжечься.
>Нужно просто правильно использовать эту мощь.
Прикол в том, что если что-то есть языке — оно будет юзаться, даже если это какой-то баг говна.
Алсо, под таким предлогом можно сказать что раст не нужен — просто никто не умеет юзать си.
>борщехлебов
На этой доскаих меньше всего в 1с, жс, жава и пхп тредах. Милости просим к шалашу, так сказать.
>Прикол в том, что если что-то есть языке — оно будет юзаться, даже если это какой-то баг говна.
>Алсо, под таким предлогом можно сказать что раст не нужен — просто никто не умеет юзать си.
Это ты уже всё перевернул вверх дном. Логическое противоречие и чистейшая манипуляция. Я сказал Си слабый, а Лисп сильный. Ты сказал, что сила Лиспа приводит к тому, что программисты не могут работать вместе, так как каждый использует эту силу в одного, пишет свое решение и все. Получается много разных решений и ни одного общего.
Это же проблема не из за языка, а из за того, что программисты не хотят объединяться, работать вместе, договариваться. Ведь для создания общего проекта нужно объединиться. Но лисперы не хотят. У них есть мощный инструмент, которым они и в одиночку все решают.
Ты в свою очередь, довел все до абсурда. Сказал, что раз мощью Лиспа не могут пользоваться сообща, то она не нужна. Это как сказать, что раз пробки, то машины не нужны вообще. Пробки то не везде. Кто-то живет за городом. В каких то городах дороги хорошо спроектированы и поэтому пробок нет.
>>91642
>ко-ко-ко, в системном языке не нужон этот ваш Computer Science.
Ух, как нипичот!
Деньги у (((СЖВ))) есть, вот и форсят.
>ситуация как с плюсами, пришлось выкинуть бОльшую часть языка
Нет.
g++ -fno-exceptions -nostdlib mysource.cc -o myprogram
Всё!
> Я знаю. Но это ведь проблема программистов, а не языка. Нужно просто правильно использовать эту мощь. Никто же не говорит, что не нужно использовать огонь, потому что им можно обжечься.
когда у тебя есть миллиард способов сделать что-то одно - то программирование превращается в творчество. Просто со всеми ты не договоришься что надо делать так-то. У каждого свое видение, а еще много кто упрямый как осел.
у меня бля на работе я руби макака если че обколются своими ооп и рубишными "фишечками", такую лютую хуиту понаписывают, на код ревью устал уже спорить с ними, просто апрувлю если работает и тесты не ломает и линтер не ругается. Уже давно понял что дслы, фичи языка - яд и нахуй не надо. чувствую что надо вкатиться в голанг, и менять работу, то нервы не выдержат
>Зачем раст называют системным, если он больше конкурирует с плюсами, а не с няшной? Что плюсы, что раст не очень годятся для целей где используется Си.
Чё? Наркоман?
Что тебе не понятно?
Он просто не понимает что лоулевел там будет такой же как в "няшной", но писать его придется просто потому что он лоулевел и байтоебство. С другой стороны забывает про возможности типов Rust при нулевом оверхеде. Именно в embedded они могут просиять если понимать что делаешь. Вот так можно сделать проверяемый на стадии компиляции ввод-вывод через порты/память https://opensource.com/article/20/1/c-vs-rust-abstractions
комбинируя это с проверяемыми на стадии компиляции стейт-машинами http://cliffle.com/blog/rust-typestate/ (и аффинными типами. Первый пример из той статьи, с закрывающимся файлом) можно смело писать банкомат. Без смс и регистрации.
Ошибки читать не пробовал?
>программирование превращается в творчество.
А потом когда в наследство остается такое "творчество" так и хочется посылать лучи "благодарности" творцу.
Блядь, ещё один в чулочках. Когда вы уже угомонитесь со своим ржавым
>Уже давно понял что дслы, фичи языка - яд и нахуй не надо
Ты просто не умеешь их готовить.
>чувствую что надо вкатиться в голанг
Ага, вот бы не нужно было, когда срать хочешь, вставать с дивана и идти в туалет, вот бы можно было в штаны себе насерить и сидеть двачевать капчу дальше. Так просто, и никакого тебе места для творчества.
Хуйпойму о чём вы тут спорите.
Например, у меня есть три стиля написания - 1) максимально понятно для студентов, 2) просто по канонам, 3) максимально оптимально, десятки приёмов хакерских, но уже через неделю с трудом понимаешь как оно работает.
Стиль выбираю от задачи. И иногда от настроения.
Только не верещите тут, мол, надо студентов сразу учить писать по канонам. В реальной жизни это недостижимо. Они (большинство из них) просто не научатся программировать в таком случае.
Нафиг студентов, туда хакерские приемы и следом творчество.
Код, в первую очередь, пишется для других людей. А уж потом оптимизация (через выбор более подходящих алгоритмов, организации единиц и уж потом хакерских приемов).
>Ты просто не умеешь их готовить.
Я когда хочу срать - действую по простому алгоритму, пришел в толчок, снял штаны, сел на унитаз, посрал, жопу подтерел, смыл, ершиком толчок шлифанул, освежаком попшикал.
а кто-то кто занимается не программированием а творчеством:
1) срать подъезжает на гироскутере со смузи,
2) тащит с собой биде
3) по наставлению Малышевой несет с собой табуретку.
4) идет в толчок, ложится на пол, делает бочку и срет себе на лицо.
5) комбинирует 1-4 пункты в различных вариациях в зависимости >>92415
>от задачи. И иногда от настроения.
И все считают что их подход лучший и все умеют правильно "приготовить" посрать. Где истина? Истинна - конечно же срать так как ты срешь кто бы мог подумать.
>по наставлению Малышевой несет с собой табуретку.
Не знал что беру с собой табуретку по наставлению Малышевой.
Всегда думал что беру с собой табуретку, чтобы ноутбук удобно стоял. Не держать же его в руках, сидя на унитазе.
> беру с собой табуретку, чтобы ноутбук
опасные мувы делаешь, долго сидеть на толчке нельзя, геморрой может появиться.
Омегалул так марсоход на Си то гайсы,а еще Си будет жить пока будут существовать операционные системы(конкретнее ядро),так как ядро является нечто монолитным,а тут ООп то сосет:) мб не прав если что подправьте в качестве примера могу представить linux ось которую юзают везде практически кроме как десктоп конечно
Я не чекал >>79664
Да пиздец жиза все четко рассказал мне тоже советовали сразу лютые пиздецки сложные залупы,и я старался но забил хуй а потом спустя месяц вкатился но по своей методике без книг нахуй как уебан скачал sololearn + видео дударя(ну тупо стартерпак для нуба) таким образом выучив питон с django/flask пофрилансил за копейки ботов для тг создавал А ПОТОМ УЖЕ по собственному желанию перешел на линукс начал изучать Си ядро линукс и алгоритмы со структурой данных и поперло ну кароче kernel hacking
>кароче kernel hacking
О, ты хакер, а можешь мне одноклассницу взломать? Я тебя друзьям порекомендую за это.
да, давай, скидывай ее телефончик. Она ведь не жируха?
>Я тебя друзьям порекомендую за это.
Лучше подругам рекомендуй
Блэт, в шкалке каникулы начались, чтоле?
Это копия, сохраненная 5 августа 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.