Тред, посвященный прародителю всех С-подобных языков и по совместительству единственному идеальному и всесторонне годному средству программирования как на системном, так и на прикладном уровне.
- Очевидный GCC. - clang: оче годно, батя рекомендует. - Intel C++ Compiler: оптимизации, тысячи их. - Visual Studio Community Edition: внезапно этим стало можно пользоваться, особенно с тулсетом clang/C2. Поддержка C11 на уровне "есть все, что тебе понадобится в реальном проекте плюс кривая библиотека". Анализатор кода в комплекте. - Pelles C (шиндоуз онли): поучиться, вкатиться в C11 (стандарт полностью реализован, имеются в том числе threads.h и прочие stdatomic.h), но количество багов в оптимизаторе и редкие апдейты напрочь отбивают желание собирать этим что-то сколько-нибудь серьезное. - TCC: очень маленький компилятор с багами и поддержкой C99. С ключом -run умеет компилировать код в память и запускать его, что позволяет писать скрипты прямо на сишечке.
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)
- https://godbolt.org/ - Compiler Explorer позволяет посмотреть выхлоп компиляторов для введенного куска кода (больше полусотни разных версий компиляторов). - http://cdecl.org/ - С Gibberish ↔ English помогает читать сложные сишные декларации.
>>1786992 (OP) Ну и где там маньки, которые в 59 треде рассказывали, что главное "ко-ко-ко стандарт" и приоритет арифметических операций не нужно указывать скобками? Сосите, вот правило MISRA C, доказывающее, что вы не правы.
>>1787002 Ты опять выходишь на связь? Давай повторю еще раз для дебила: MISRA C - это такие рекомендации, как писать код для хуйни, которая может ебнуть. Или убить кого-то. Весь остальной код пишут, руководствуясь принципами здравого смысла, с которым, как мы уже выяснили, у тебя проблема.
Так вот в этом нормальном коде принято оборачивать в скобки только неоднозначные случаи (классическое & vs. << и прочие), условие в тернарном операторе, все переменные в макросах, ну и, конечно, те выражения, в которых нужно изменить приоритет операторов. Причем в первых двух случаях порядок вычисления все равно гарантируется стандартом, просто его мало кто помнит, да и читать удобнее.
>>1787010 >MISRA C - это такие рекомендации, как писать код для хуйни, которая может ебнуть. Или убить кого-то. Ага, а если пишешь, код не для медицинских приборов, промышленности, или автомобиля, то можешь говнокодить, как хочешь. Мы тебя поняли, маня. >остальной код пишут, руководствуясь принципами здравого смысла >в этом нормальном коде Вот есть свод правил MISRA C, а где можно почитать "принципы здравого смысла" и критерии "нормального кода"? Нигде, потому что это только твои маняфантазии. >Так вот в этом нормальном коде принято оборачивать в скобки только неоднозначные случаи (классическое & vs. << и прочие), условие в тернарном операторе, все переменные в макросах, ну и, конечно, те выражения, в которых нужно изменить приоритет операторов. Это сугубо твоё личное, ничем не подкрепленное, мнение. В MISRA C сказано не использовать приоритет операторов. Я думаю, что те, кто разрабатывали правила MISRA C разбираются в программировании получше маньки с Двача.
>>1787021 >Какие подводные? В том, что зумерки с этого итт треда, дрочащие на стандарт будут тебя хейтить, ведь надо наизусть знать стандарт, знать приоритеты операций и никогда не использовать скобки. По мнению зумерков (залетевших сюда с хабра) для хайпового и модного кода в коде вообще нигде не должно быть скобок, а иначе ты "не в теме", "не знаешь стандарт", "не сечешь фишку". Ведь им важнее выебнуться знанием стандарта друг перед другом, чем писать понятный и надежный код.
>>1787025 > можешь говнокодить, как хочешь Я этого не говорил.
> где можно почитать "принципы здравого смысла" и критерии "нормального кода" В стайлгайде софта, который ты пишешь. Внезапно, да?
> В MISRA C сказано не использовать приоритет операторов А еще там сказано ни в коем случае не использовать маллок. Не используй маллок и библиотеки, использующие маллок, иначе у тебя будет говнокод, по твоим же словам.
>>1787028 > как вкатиться правильно и на каком этапе изучения Читать стандарт полностью не нужно, это для разработчиков компиляторов. А вот конкретные неясные моменты смотреть стоит сразу, если не написано в учебнике (у Праты, например, на большинство твоих вопросов уже будут ответы).
>>1787042 Мизру не наворачивай. Это мем, который в индустрии не используют. К ней референсится полтора независимых аудитора во в трёх странах мира. И то только на очень специфических проектах. Отсутствие стандартизации в индустрии собственно и является причиной по которой она не взлетела.
>>1787021 Если твои мат.операции выполняются с плавающей точкой, то группировать их желательно по соображениям точности или возможности параллельного вычисления, а не логически.
Кех недели две назад спрашивал, как (и надо ли) расставить скобки в битвайзах и логике, а тут уже разборы стандартов пошли. Люблю ваш тред за это. Алсо если ебнет, то компиль виноват, что стандарт не поддерживает?
>>1787021 >Оборачиваю все мат. операции в скобки по логическим блокам чисто для удобочитаемости.
А не лучше отделить пробелами или оттабулировать, чем засирать всё скобками?
Раз уж тут разговор за стандарты пошёл то расскажите нужны ли мне другие стандарты кроме актуального если язык я учу исключительно для того, чтобы самостоятельно пилить всякую лоу/хай левельную фигню без устройства на работу? Мб есть какие нюансы в работе мк что они требуют старых стандартов или ещё что?
>>1787620 Да, в целом в эмбедщине много С, ибо компиляторы С есть на все возможные платформы, даже самые экзотические. Ну и сам язык суперкомпактный и считай, что ты вообще чуть ли не на кроссплатформенном Ассемблере пишешь.
Почему ты это так говоришь, будто программирование мкк - это что-то плохое? Как по мне, куда интереснее, чем веб-макакерство.
>>1787193 > в индустрии не используют Используют, как дополнительный источник предупреждений. Точно так же, как и с остальными предупреждениями вменяемое правят, невменяемое давят.
>>1787440 > если ебнет, то компиль виноват, что стандарт не поддерживает Ни разу не видел настолько сломанных компиляторов. Приоритеты же к грамматике прибиты, и чтобы облажаться, надо специально, вручную написать неправильный парсер.
>>1787708 > Если что, я ищу просто реализацию IEEE 754 на Си softfloat загугли, тысячи их. Эмуляторы времен доса тоже гуглятся, но они не на Си. В линуксе /arch/x86/math-emu еще.
>>1787685 >Почему ты это так говоришь, будто программирование мкк - это что-то плохое? Как по мне, куда интереснее, чем веб-макакерство. Собсно, в этом и была суть моего поста: зачем в 2к20 учить Си? Только чтобы прогать микрики за еду, и всё?
Сам подумай, что лучше: 1) прогать мк в неотапливаемой (зимой) и некондиционируемой (летом) комнате за 30-40к всю жизнь без перспектив; 2) стать веб-макакой, прогать в комфортабельном офисе с кофемашиной и печеньками за 60к, при этом есть перспективы карьерного роста в мидла, синьора и потом трактора.
Если тебе так уж интересна электроника и мк, то будучи веб макакой это может быть твоим хобби. Но выбирать это профессией с целью зарабатывания денег - большая ошибка.
>>1787483 >>1787708 Объясните, а зачем нужен этот стандарт? Просто в Си итак уже есть числа с плавающей запятой и компиляторы умеют в действия над ними.
>>1788035 Ты просто живешь в другом измерении, к твоему сожалению. В парашке беда с лоу-лвльщиной, да. Забугром эмбедщина - элитная айти специальность, где и офисы заебись, и з.п. на уровне. Или ты хочешь сказать, что в конторах, которые производяя железо, типа Quallcom, Mellanox, Marvell, Nvidia, Xilinx, Tesla и т.п. и в которых больше половины софтвер инжиров являются хардкорными байтослесарями, душные и ободранные офисы?:) Хочешь работать в лоу-лвльщине и получать достойную зарплату - заводи трактор и учи ин.яз. В противном случае, жри говно js на веб-макакерской работе и живи в манямирке, типа ты ОЙТИ ИЛИТА(нет)
>>1788035 >кофемашиной и печеньками за 60к, при этом есть перспективы карьерного роста в мидла, синьора. Ты сначала этого уровня добейся будучи 1 из тысячной армии ежедневных вкатышей-индусов, потом уже о тракторе мечтай. Будешь как миленький сидеть и до конца жизни хуярить лендинги о мазях для увеличения члена.
Так разница как раз в том, что 60к для веб-макаки - это днищеуровень свежеустроенного джуна-вкатуна, который еще и хрюша на ставку в словесной дуели наебала.
В то время как для байтослесаря 60к - это уровень сеньера/ведущего программиста и для 60к нужно лет 5 кабанчиком горбатится, пока предыдущие диды-ведущие на пенсию не свалят.
>>1788171 Я 5 лет проработал в embedded разработке заграницей. В индустрии уже лет 25. Рай для железячников это Юго-Восточная Азия. Если хорошо разбираешься, то чего сразу Европа или США - попорбуй Южную Корею. Отличная страна. Только субботы часто рабочие и рабочий день с 9:00 до 21:00. В остальном - рай.
>>1788487 Ещё раз задам вопрос - нахуя кому-то брать тебя на 60к если индус сделает всё за 20? Что такого охуенного ты можешь предложить рынку чего не может предложить рспшка после курсов кокодемии? Может ты можешь выдавать 2 сайта в сутки? Или просто работать 24/7? И ты хочешь что-то доказать насчёт эмбедеда и лоулевела которые на западе испытывают острую потребность в грамотных кодерах коих нет. Причём настолько, что любой человек с опытом 3+ лет на этом самом эмбедеде может спокойно ехать в какую-нибудь Германию или Францию на 4-5к рейхсмарок ежемесячно, да тебя ещё и работодатель оближет помогая устроиться по началу и потом снимать/купить жильё.
Спасибо!!!! Первый же результат поиска показался мне примемлем - https://github.com/ucb-bar/berkeley-softfloat-3 Возможно где-то есть и поинтереснее, но это этот вполне норм. На досуге поиграюсь. Ещё раз спасибо.
Забавно что на этот вопрос в теме про микроконтроллеры в разделе "Радиотехника" никто толком не ответил.
>>1788563 Это был самый лучший опыт в жизни. Самое интересное время. Это было интересно. Это была работа с железом, которое в продаже повилось только через несколько лет. Это был доступ к самой интересной закрытой документации и железа от ведущих производителей железа. Это была молодость и беззааботность.
>>1788576 >Конкуренции нет >js мощный язык >Самая востребованная сфера >ЗП от нуля и до бесконечности >Вкачусь за 3 месяца >Через 2 года стану синьором а на 3 укачу в Калифорнию
А меня сейчас корёжит 64-бита. Вот, заюзал gcc-8 на 64-битном Альт Линукс, в он не может в ключ -m32, пришлось портировать свою софтинку на 64-бита. А тут засада - MSVC sizeof(long) = 4, gcc sizeof(long) = 8. И привет #ifdefы
Не, я конечно заборю эту проблему, не в первый раз такое. Но забадывает поддержка нескольких платформ/компиляторов.
>>1788658 В моём случае это не выход. У меня слишком специфичная задача, где руками по памяти приходится лазить и моделировать некоторые структуры. Опять же руками. Именно что в рантайме моделировать. Отсюда и сложность переноса.
Эм, так как раз stdint и был для таких задач сделан, что бы конкретные многобайтные типы там где нужно конкретные байтики конкретных форматов шевелить и гладить конкретные регистры с конкретным лейаутом..
Блин, я интерпретатор пишу. Мне аргументы для printf приходится ручкаим формировать. А к разным sizeof ещё добавляется calling conversion. MSVC и gcc аргмуенты функций на 64-х битах по-разному передают.
И это одна из немногих засад при портировании с 32-х бит на 64-бит.
Причем, что характерно - именно для конкретных плат-радиоконструкторов на STM32 с конкретной разводкой, на голом МК его не применить, произвольную плату не развести, новое устройство не сделать.
>>1788806 >>1788812 >>1788804 >мк Ты сука внатуре дебил, и не знаешь, что такое embedded language. Это язык, который можно встроить в свою систему, чтобы юзер мог дергать ее за сиськи на нем, а не хуитка для байтослесарей с двухкилобайтным сортиром вместо железа, лолка. А ембеддед в моем посте - это железячники во всех их проявлениях. Ваще разные две хуйни, я не ебу, к чему ты свои embedded languages приволок, аутист. >не влезет А openwrt влезет тогда? Или это не ембеддед-система, довн? Акстися, на всяких роутерах, которые тоже ващет ембеддед, уже давно десятки мегабайт оперативы.
>>1789033 > Как теперь вкатиться на работу расскажите? Зависит от того, что хочешь делать. Но чтобы понимать, как выглядит мир за пределами стандартной либы, имеет смысл полистать какое-нибудь APUE, что-то нибудь вводное про сети (сокеты, libevent), про микроконтроллеры опять же.
>>1786992 (OP) Аноны, молю дайте мне ссылку на то как работают адреса в отличии от обычного обращения к переменной.
Ну я вот читал книгу по си там про адреса и там написано типа что адрес увеличивают скорость обращения к переменной или что-то такое, но конкретно не написано как это происходит и почему.
ОБЕЪЯСНИТЕ МОЛЮ ПОЧЕМУ ОБРАЩЕНИЕ ПО АДРЕСУ БЫСТРЕЕ ЧЕМ СТАНДАРТНОЕ ОБРАЩЕНИЕ К ПЕРЕМЕННОЙ
>>1789434 > указатели работают быстрее Тебе уже сказали, что бред.
> то есть ∗p = 7 быстрее чем p = 7 и я хочу знать почему? ∗p = 7 это mov регистр,[адрес p]; mov [регистр],7 p = 7 это mov [адрес p],7 Очевидно, что две инструкции, да еще с зависимостью по данным никак не могут быть быстрее одной.
>>1789341 >и там написано типа что адрес увеличивают скорость обращения к переменной или что-то такое Скорее всего, такой же грамотей, как ты, писал. Не читайте советской макулатуры, уебки. И вообще на русском
Слушай, у ВСЕХ компиляторов есть ключ, позволяющий формировать ассемблерный листинг. Более того, все компиляторы переводят код Си програмы в ассемблер, а уже ассемблер делает из него объектный файл, который линкуется с другими объектниками и библиотеками в исполняемый файл.
К чему я тебе это рассказываю? Напиши оба варианта присвоения и посмотри чего нагенерировал компилятор. Поверь, лучше один раз увидеть своими глазами, чем 100 раз услышать.
>>1789749 > все компиляторы переводят код Си програмы в ассемблер Это, мягко говоря, не совсем правда. Далеко ходить не надо, у того же tcc парсер прямо по ходу разбора сразу генерирует машинный код, безо всяких промежуточных представлений. У шланга есть промежуточные представления, но он не обязательно пишет .s. У Visual C++ кодогенератор делает листинг только по запросу, а самому ему ассемблер в хуй не вперся. Плюс к этому всему добавляем сборку для LTO/LTCG, когда даже в объектники пишется промежуточное представление.
Поэтому правильнее сказать, что большинство компиляторов может сгенерировать тебе ассемблерный листинг, если попросишь.
>>1789777 За всю свою многолетнюю практику ни разу не видел компилятор, у которого нет ключа для генерации ассемблера.
Тот же tcc... Хмм... А ведь вроде не умеет - https://man.cx/tcc(1) В упор не вижу ключа -s и Гугл говорит:
>> 2. How to generate assembly program in tcc. >You don't. >The i386 and ARM targets use a function o() to write the opcodes as they appear in the binary. Use objdump -d if you need assembly output.
Ну да, выходит не все компиляторы умеют. Ну тогда objdump -S mycode.o | less в помощь.
Чем этот ваш эмбеддед отличается от моей ежедневной ебли с плюсами? Что вы делаете, прокидываете слои абстракции на железо? Если я довольно прям ёпта нормально так подробно представляю, во что и как именно превращается мой плюсовый код, комфортно ли будет щупать ваши железки? сишечка тоже нравится, очень милая и простая, только иногда сильно не хватает приятного сахарка из плюсов... но я полагаю, если руки не из жопы, g++ тоже можно смело тащить в ембеддед
>>1790357 Бля, плюсы != ООП, вот совсем. Я вообще редко классы какие-то прям в стиле java наматываю, в основном функции, структуры и легкие RAII оберточные классы.
>>1790342 Не всегда. Иногда байтослесари получают совсем голую железку, тогда надо писать HAL. Чаще всего уже существующий HAL крайне хуевый с не менее хуевой документацией - хоть свой пиши с нуля. Чаще требуется накатить ядро Линукса через Yocto. Если надо работать с кастомной железкой - скорее всего надо писать драйвер на нее, благо подсистемы в ядре Линукса значительно сокращают гемор и не надо совсем уж там битами жонглировать хотя порой таки надо
Сишечка популярнее плюсов в эмбедщине по большей части потому, что компилятор на С существует под все, даже самые экзотические платформы. А если нет - написать компилятор С гораздо, ГОРАЗДО легче и быстрее, чем компилятор плюсов. Ну и порой есть resource constraints довольно чумовые, даже в 2к20 году, где даже плюсы достаточно жирные (можно офк писать С-лайк код, но тогда зачем изначально пикать плюсы?) и меньше подходят. Ну и если в железке крутится ядро Линукса, что происходит в 90% случаев, то писать кастомные драйвера на периферийные устройства надо на С, ибо API да и вообще все ядро Линукса написано на С. А еще С - это грубо говоря кроссплатформенный ассемблер, ни больше, ни меньше, засим этот ЯП бессмертен в определенных нишах.
>>1790371 Вот насчёт компиляторов на разных платформах да, действительно. Худо-бедно рабочий компилятор с89 я и в одно рыло заделаю, но про плюсы даже не заикнусь просто пизда. Плюсы ради шаблонов в основном хочется. Можно такой-то кавайный compile-time полиморфизм накидывать. Перегрузка аргументов в функциях, неймспейсы, nested struct/enum-ы, блямбды ёпту, да много мелочей, к которым привык и не хочешь терять. А на сишечке всё ручками делать. Хотя, когда железки теребишь, абстракции куда ближе к железкам, и таких потребностей, наверное, не возникает. А ядро линупсовое лёгкое само по себе? Ну типа, сколько памяти занимает? Или его кастрировать при случае чего можно?
>>1790360 >Бля, плюсы != ООП, вот совсем Чигобля? >Я вообще редко классы какие-то прям в стиле java наматываю Ну так и задумайся, на хуй тебе кресты если ты против ее парадигмы
>>1790386 Кресты мультипарадигменные, братишка. Как хочешь, так и делаешь. Нахуй тебе плюсы, если ты джавку там разводишь? Фабрики бля, хуябрики. Вот джаву и бери.
>>1790390 >мультипарадигменные Нет, это было нахлобучивание ООП над Си. Если ты там вместо cout пишешь printf ну или пишешь в процедурном стиле, то пора подумать. А Java это заебись.
>>1790383 Голое ядро в рантайме занимает мало места само по себе + из-за того, что это попенсорц, можно играться с конфигами ядра и собрать кастомное ядро под самые разные нужды. На абсолютное большинство железок заходит на ура. Лично я собирал без особой анальной акробатики ядро, которое в рантайме занимало 5 мегабайт (без кэшированной памяти офк, хотя Линукс гибкий и позволяет играться со многими параметрами).
>>1790394 printf я не пишу, но в с++20 его завезли как std::format, поэтому ещё успею. Ты там себе навыдумывал стилей, концепций, каких-то ебать их в рот парадигм, но всё это по отдельности друг от друга дрянь страшная. Код пишется под каждую задачу по-своему, так, как оказывается удобнее. Если ты от этой свободы отказываешься в пользу сомнительных заявлений о том, что надо кодить каким-то определённым образом, хули я могу сказать, земля тебе пухом. Java заебись, ничего против её не имею. Просто она не подходит под мои задачи, и всё тут. И java-style тоже идёт в разрез с тем, что мне нужно.
>>1790397 Если ты про <<>>, то гцц у меня рожает арифметический сдвиг. Да и логический сдвиг не нужен так как >хочу гонять битики по байтику (или двум) влево-вправо и биты не должны проёбываться. Вообще странно, что компиляторы не позволяют ротировать биты, сейчас гуглю и нигде внятного объяснения этому нет, потому ставлю на зависимость от архитектуры.
>>1790405 >арифметический сдвиг Подозреваю, что ты несешь хуйню. Арифметическим бывает только сдвиг вправо (сдвиг влево не бывает арифметическим, так как нет такого ABI, где бы LSB биты при сдвиге влево заполнялись единицами, а не нулями).
Биты не должны проебываться при rol/ror, при логических сдвигах они еще как проебываются. В языке С (да и в других известных мне языках тоже) нет нативного API для rol/ror. Напиши свой, это очень просто.
На бумаги есть арифметический сдвиг влево, только вот между ним и обычным логическим сдвигом влево нет никакой разницы (как заполнялись LSB биты нулями, так и заполняются). А вот в случае со сдвигом вправо все по-другому. При арифметическом сдвиге вправо MSB бит 1, а не 0, как при обычном логическом сдвиге вправо.
На бумаге есть арифметический сдвиг влево, только вот между ним и обычным логическим сдвигом влево нет никакой разницы (как заполнялись LSB биты нулями, так и заполняются). Так что хз зачем есть отдельная команда (sal в х86), если разницы по сути, вроде как, нет.
А вот в случае со сдвигом вправо все по-другому. При арифметическом сдвиге вправо MSB бит 1, а не 0, как при обычном логическом сдвиге вправо.
>>1790415 > Так что хз зачем есть отдельная команда (sal в х86) > если разницы по сути, вроде как, нет Нет ни разницы, ни инструкции. Опкод SAL тот же, что и у SHL.
Вообще-то это устоявшийся миф о том, что на С++ нельзя писать для встраиваемых систем. Такую железку, под которую нет С++ компилятора, нужно ещё поискать. С уверенностью можно сказать что если на железке запускается Линуск, то и С++ скорее всего для неё есть.
Это была предистория. А практика говорит что для встраиваемых устройств можно легко писать на С++. Но есть две засады.
Первая засада - забудь об исключениях. Если твоя версия STL не работает с отключенными исключениями, то от её шаблонов придётся отказаться. Искать версию STL, которая в нарушение стандарта может работать без исключений. Или писать шаблоны самому. При этом классы и другие фишки языка поддерживаются.
Вторая засада это заголовочные файлы. На самом деле на С++ в ебмеддем мало кто пишет и скорее всего заколовочные файлы заточены под Си. В таком случае придётся их скопировать к себе и дописать к прототипам функций
> extern "C"
Тогда линкер их увидит. Иначе будет искать С++ функции, а у них хитрый манглинг.
Ну и ещё нюанс со статически обхявленными классами. Конструкторы для них вызывать некому в общем случае. Но это решается самописной crt.0
Линукс далеко не идеал, хоть он и везде. В половине железок так уж точно он.
>>1790513 И небольшое уточнение - значительная часть встраваемых железок имеет Линукс на борту. В этом случае вышесказанное не совсем верно. В этом случе всё будет работать так же, как и на персональном копмьютере. Само. По умолчанию.
Исключения нужно отключать ключами компиляции если пишешь код не для user space или для на железки без ОС. Да, даже для такого железа и для таких конфигураций можно писать на С++. Проверено.
>>1790513 > А практика говорит что для встраиваемых устройств можно легко писать на С++ На Си пишут не потому, что C++ не подходит. Нет, С++ подходит, но если ты видишь код на Си, ты точно уверен, что там не будет всех этих исключений, шаблонов, классов и пятистраничных сообщений компилятора. А когда ты видишь код на C++, ты внутренне сжимаешься, потому что там гарантированно окажется "моя охуенная зеро кост абстракция вокруг регистров железки, которая оптимизирует установку битов". Ну а чего, язык же позволяет, и похуй, что это нечитаемое и неподдерживаемое нагромождение шаблонов, которое способно посрамить даже перл.
>>1790794 Насчёт шаблонов согласен. Они иногда раскрываются в такое, что отладить представляется сложным. Особенно когда дебажишь по UART или JTAG в терминале.
Но классы-то тебе чем не угодили? По сути это те же структуры, в в области видимости которых дополнительно определены функции (методы классов).
И в целом это обычные функции, но которым неявно передаётся один дополнительный параметр - указатель на структуру, в котором определена эта функция. А в коде функции он будет называться this.
Остаются конструктор и деструктор - те же самые правила, что и других функций-методов, но конструктор, если определён, вызывается автоматически при аллокации этой структуры (класса). А деструктор вызывается при удалении структуры или при потере облести видимости.
Скажу сразу - вопрос ни в коем случае не для холивара. Скажите мне не проебался ли я убив 3 недели на базовый СИ перед вкатом в плюсы? В каких вообще областях чистый СИ просто незаменим?
>>1790750 >И небольшое уточнение - значительная часть встраваемых железок имеет Линукс на борту.
Значительная часть встраиваемых систем оперативки-то не имеет, строится на редких "индастриальных" МК вроде TriCore, или из вышедших из моды вышедших пичков, а из штатных средств вывода инфы - в лучшем случае или мигающие светодиоды статуса или невмирающие 8-сегментные газоразрядные цифры или, когда дораха-бохато, кастомный ЛСД с запеченным в ЛСД графикой аля "электроника". И хуй туда кто поставит оверхедную железяку ради удобства - себестоимость стиралки за 15к для бомжей тут же улетает за пределы рентабельности.
При хорошем стечении обстоятельств, когда говнодевайс планируется в категорию дораха-бохато - может добрые инженеры дадут экранчик 12864.
Это всё ширпотребские быдлодевайсы, клоторые потом идут в некие магазины и там или азия или котлетки в еще невмершем НПО.
Линух и жирные анально-огороженные соцки - это в основном мультимедийщина и прочая сетевухщина и прочие большие сложные ёбы, туда где не требуется реалтайм.
Там где ответственность и реалтайм и всякие монтависты по требованиям уже идут нахуй и берется QNX.
А вот чего я реально не понимаю, почему поцреотические аналогвнеты вместо того что бы прекрасно подходящие для эмбеда железяки не пустить в дело - делать на них убийц симатиков от сименса и прочие томографы с рентгенами, от чего бы им был почет уважуха и реально полезное импортозамещение, пропиздевшись влезли в десктоп, где закономерно обосрались.
Тот же байкал охуенен - чистый проц без ненужной анально огороженной периферии вроде видеокарт и кусков 3G-модемов, и с полной документацией.
Но нет эти мудаки его на десктоп потянули, с пнем 3 конкурировать, мля.
>>1790948 >делать на них убийц симатиков от сименса и прочие томографы с рентгенами Возьми и сделай или ты думаешь после либирашьего пануванья все так легко?
>>1790978 Так вот я и спрашиваю - нужно ли си перед плюсами вообще и где оно и только оно юзается? И когда будет уже "пора"? Какой ёба-проект нужно сделать чтобы стать готовым, а, Иллидан?
Ты хотел сказать после позднесовкового пануванья, когда выяснилось что на открытом рыночке совковая хай-тек продукция или просто нахуй никому не нужна или является фактическим контрафактом? А уж после того как китайцы поднялись на том же контрафакте, но уже за миску риса, совковые пизженые с запада микросхемы были обречены.
Успей совок в свою культурную революцию и нарожай бы в 60х-70х достаточно населения что бы конкурировать хотя бы с клятыми пиндосами, и плавно вруби НЭП -может быть всё так печально бы и не закончилось.
А либерашьи лдиберахи - все совковая комса, так-то.
И да, это были лучшие представители интеллигенции из тех что смог совок к моменту развала.
>>1790985 Школьный питон уровня масивчики, сортировочка пузырьком и джейсончики. 4 недели назад бухал как чёрт а сейчас поступил на софтварную хуемразь(инженера) и решил вкатываться заранее чтобы доминировать над всеми на курсе.
>>1790983 >хай-тек продукция На хуй никому не нужная. Хотя для малолетнего либирахена дибилятор верх развития цивилизации. А все великии достижения в России были при СССР и плановой экономике, копетолиздм только и может, что отсасывать, пендохи это показали не раз начиная с 30х.
>>1791008 >А все великии достижения в России были при СССР и плановой экономике
Космос и атом. Всё.
Всё остальное - лихорадочно то пиздили-, то догонялииперегоняли, то аналоговнетили.
И да, дибилятор верхушка айсберга, тело - это те самые упомянутые мной ПЛК, станки с ЧПУ, 3д печать, цифровое управление производственными процессами, вот это все.
Тело - это производственная линия и производственные стандарты, благодаря которым упомянутый дебилятор собирается потоково в любой сраной дыре вроде того же тайваня времен 80х, а не как совковый зустц - качеству которого переход на микросхемы не помог , а вот количество выжраной петровичем и его сменщиком вкусной водовки - влияло.
И их коллег из армении, от которых кондеры приехали.
>>1791019 >Космос и атом Это и есть технологии, а твое обоссаное хайтек и ит на хуй человечеству не нужно. Это у фантастов кудахтеры ассоциируются с прогрессом, а на деле от всеобщей ит дибилизации только деградация и упадок.
>>1791018 >Где-то читал что Си - это просто удобная обёртка асма. Вот именно. Исходя из этого и надо учить ассемблер, чтобы понять для чего нужен Си. А зная Си уже не так трудно выучить С++.
Я не думаю что востребованы программисты на С++, которые не понимают что сгенерировал им компилятор. Возможно в каких-то редких предметных областях. Иначе тогда лучше сразу в C# вкатываться и не задумываться о многих вещах.
>>1791035 > у меня с 1 курса в расписании стоит С++ Тебя выучат синтаксису, расскажут про особенности, научат пользоваться STL (вероятно научат). Но это не значит что ты станешь С++ программистом. Не, ну этого достаточно чтоби писать helloworlds. Или если ты алгоритмист крутой, то тут уже пофиг на чём ты пишешь - алгоротмисты это уже другое. Ценность таких специалистов именно в создаваемых ими алгоритмах, а кодировать почти любой может.
>>1791044 Я и понимаю, что универ мне многого не даст. Это ещё одна причина по которой решил вкатываться заранее и самостоятельно. А теперь вот говорят разворачивайся и хватай асмр. Думаю короче.
>>1791035 >И сколько этот ассемблер х86 придётся учить чтобы понимать как всё работает?
Да там достаточно просто понять. А мнемоник не так много, чтобы их выучить. На x86 Компилятор использует чуть больше половины. А может быть даже и меньше. Вот их и надо понимать. А всё остальные инструкции можно в справочник посмотреть, если вдруг понадобятся.
Что скажете про эту книгу? https://nostarch.com/Effective_C По аннотации и содержанию вроде весьма годная. Си мне интересно подучить на уровне читать и понимать готовые исходники.
>>1791500 Содержание стандартное, выложенная на сайте глава выглядит неплохо, но зайдет ли - хуй знает, прочитай и расскажи нам. Лично я из описания указателей у автора не понял бы ровным счетом нихуя.
Ананасы, чем заниматься после Праты? Сейчас начинаю последнюю главу а типо куда дальше? Стандарты читать? Архитектуру компа и ОСей учить? Или хотя бы глазами пробежаться по самым часто используемым либам? Или сразу можно начинать проекты делать постепенно усложняя задачу?
>>1792068 Знать Сишечку недостаточно. Без знаний языка ассемблера (похуй какой архитектуры на первых порах, но так как ты прогаешь на ноуте/пека, то х86-64) знания Си наполовину обесцениваются. Также, в 2к20 году, высирая код на Си, у тебя должен быть полный security awareness, иначе ты будешь писать дырявый код а-ля gets(yaeblan_overflow_me), за что тебя вполне законно могут выебать в жопу. ОС интерналс тоже обязательно грызть, попробуй начать с Танненбаума.
На Си всегда байтоёбили, сам язык очень простой, но он требует знаний в смежных темах (асм и основы ОС как минимум) в виду областей его применения. Не забывай, анон, что на Си пишут прошивки, драйвера, ОСи, низкоуровневые библиотеки и йоба-числодробилки.
>>1792084 hacking - the art of exploitation -- начни хотя бы с этого, другие книги по этой тематике тебе вынесут нахуй мозг и ты их вряд ли осилишь, по крайней мере на первых порах.
Быстрый парсинг http запросов на сях
Аноним29/08/20 Суб 20:31:12№1792091153
Вечер добрый. Как можно сделать быстрый (желательно 100kRPS +) , http/1.1 conditionally compliant парсер, чтобы это было ещё и не больно, на чистых сях? Как можно сделать конечный автомат, чтобы он работал быстро, но не выглядел убого в коде?
Чего приуныли? Я вот интерпретатор Си пилю >>1785454 → Намедни научил его массивам. В первом приближении это выглядит как-то так. На github пока не выливал - не готово для публичного показа.
>>1793641 Делаешь массив/список/дерево структур, описывающих имена, типы переменных и их расположение в памяти. Делаешь функции получения и задания значений в зависимости от типа и свойств переменных (количество бит, есть ли знак и тп). При любой нетривиальной задаче дерево должно создаваться автоматом на основе конфиг файла, чтобы не править код при смене протокола, а создание конфига из тз автоматизировать насколько возможно.
>>1793652 емнип, core dump. Делаешь дамп памяти с помощью `gcore <pid>` (поставляется вместе с gdb) Потом, если нужно, делаешь `readelf --segments <полученный после gcore файлик>`, и теперь ты знаешь, где в файлике лежит адрес памяти по указателю. Если у тебя не POSIX -- выйдите отсюда пожалуйста
>>1794045 В руках его не держал, я сишник крестовик, имею дело с гигантскими авиационными протоколами для can aerospace и arinc 429 и знаю о чем говорю. На питоне скриптики для кодогенерациии иногда пишу, тут ты прав
Привет всем, Си-господа. Вопрос к линуксоидам - как Линукс понимает какие драйвера нужно загружать при буте системы? Вот у меня есть произвольная сетевая карта, произвольная встроенная видеокарта, тачпад, клава и т.д. Допустим, я накатываю дистр для нубасов типа Убунту или Манжаро. После установки - хуяк, все работает, есть вай-фай, работает клава ну и прочая периферия. Как Линукс определяет во время установки системы как модули ядра надо загружать, чтобы все девайсы работали? Заранее спасибо.
Скипаю большую часть заданий Праты т.к. всё кажется однотипным бесполезным не имеющим практической ценности говном, но при этом общий алгоритм как задание нужно реализовывать в голове простраиваю. Это Даннинг — Крюгер или я прав?
>>1795061 >Дьявол в деталях. Не спорю, но если у меня задание вида прочитай файл и подсчитай количество указанных символов в нём то уже совсем детсад уровня совмести код из задания 6 параграфов назад с кодом 3 задания назад. >>1795061 >Не будешь писать код - не научишься ни писать код, ни отлаживать его. Вот я и хочу поскорее проспидранить книгу и сразу взяться за какой-нибудь серьёзный проект с гуглением и энергетиками.
>>1795070 Потому что как база он охуенен и что гуглить если не знаешь чего гуглить? Проблема для меня в том, что после раздела упражнений с массивами и указателями у меня устойчивое ощущение того, что я занимаюсь хуетой.
>>1795068 > подсчитай количество указанных символов в нём Задание со звездочкой: открой файл с каким-нибудь фильмом и посчитай в нем количество '\x1a' на винде. С двумя звездочками: то же, но файл на флешке, и флешку во время работы программы ты выдернешь.
Надо проверить >следующий символ после найденного, является ли он разделителем
Символ - "
Допустим, получим с помощью strstr в какой части строки нашли совпадение. С помощью известной длины + 1 символ можно переместиться по строке, наверняка.
>>1795351 Не самая красивая логика с feof(). Она сейчас работает, но если бы у тебя не было условия в строке 30 (если бы ты считал все символы, а не только конкретный), то EOF тоже посчитался бы. Алсо, тут лучше подошел бы fread(), потому что у этого кода примерно 4 вызова функций на символ (лок/чтение/анлок у fgetc(), плюс feof()), а fread() размазал бы эти вызовы на один буфер из несколько кб данных, тем самым чтение ускорилось бы весьма существенно.
>>1788035 Кстати, я пока занимаюсь этим как увлечением. Хотя рассматриваю сделать это основным делом (я уже в сфере 3.5 года вчерашний штудэнт, работать попиздовал еще в универе если че, епта).
Просто реальность такова, что не одними деньгами, анонче. Есть ещё то, что у тебя в мозгу и душе.
>>1795947 Там две ошибки. Во первых, sizeof(char) это один байт. Ты выделяешь один байт и пишешь в него строку. Во вторых, sizeof(temp) вернёт тебе 4 или 8 - в зависимости от того, 32 или 64 бита приложене.
Используй хотя бы strlen(bar) чтобы посчитать размер строки.
>>1796053 >Используй хотя бы strlen(bar) чтобы посчитать размер строки. И не забудь прибавить к нему единицу, чтобы для терминального '\0' было место. А так твоя программа не только неправильно работает, но разрушает память.
Вопрос от начинающего программиста: хочу сделать карту со связанными локациями, какой класс лучше использовать?
Подробнее: есть карта с локациями типа CHAR, каждая локация связана с несколькими соседними, в результате образуя сеть связей между этими точками. При этом сама связь может иметь одно из 4х свойств: автодорога, поезд, пароход, авиа. Например: локация Берлин (точка Б) связана с Лондоном (Л) по морскому пути, с Парижем (П) железнодорожным, с Веной (В) автомобильным, а с Москвой (М) авиасообщением. Вот такая карта должна получиться к примеру. Важно, что связь не каждый с каждым на карте, а только сосед с соседом и поэтому чтобы добраться из точки А в точку С нужно преодолеть ряд других точек.
И вот я не знаю как подступиться к этой задаче. Использовать какие-то связанные списки? Но как тогда лучше их организовать? Возможно в будущем к этой карте добавится несколько новых локаций, но вообще их список конечен и не превышает 40-50. Или может быть использовать какую-то табличную структуру данных, но как там хранить связи между точками и свойство связи?
Опыт в создании приложений небольшой, но имеется, поэтому основы я знаю, а вот со связанными списками особого опыта нет, кроме совсем уж простых приложений. Данная карта важна, т.к. на основе неё дальше всё и будет строиться и вот с "дальше" у меня проблем нет. А вот с картой есть :)
Если у кого есть какие идеи или опыт создания подобных карт, то буду очень рад услышать совет.
>>1796757 Сделай структуру и назови её route_t Внутри структуры определи два указателя на локации и поле, определяющее тип транспорта. Такой структурой ты опишешь любой маршрут. А если чего нехватает, то добавишь в эту структуру. Например, время в пути, цена билета и т.д.
Сделай структуру локации Внутри структуры имя локации, количество активных маршрутов и массив из, например, 10 указателей на структуры маршрутов. Можно в локации даже не хранить количество маршрутов, а считать количество ненулевых указателей в массиве.
Но можно и через списки. В этом случае массив указателей на маршруты заменяешь списком, голова которого определена в структуре локации.
Возможно на картинке пример скомпилится сразу - не проверял его.
в стандарте есть, что первый элемент структуры начинается с её 0 смещения (если кастануть в char+/void+). так что можно лепить заголовки разным структурам. но что насчёт второго элемента? если это, например массив разной длины (у разных структур разный, с описанием в заголовке) + разносортные данные после. можно ли полагаться на то, что они по одному адресу будут? или про это ничего не сказано.
>>1797585 я вот тоже раньше думал, типа, вим-емакс - это сложно или старо-ограничено; сидел на кодблоксе.
я со смехом плюю себе в лицо. хотел бы я вам посоветовать сходу переходить на _нормальные_ _редакторы_, но кажется, нужно поиметь опыт чтобы понять разницу.
Если я правильно понимаю, то где-то выше в исходнике была создана структура location , что при этом создало новый тип под названием "struct location". Далее получается так, что структура route состоит из 3 элементов: первые 2 элемента - это указатели from и to (оба являются указателями на тип struct location), 3 элемент - это enum.
>>1798043 Всё правильно. А если добавить в каждую структуру указатель на next, то получится однсвязный список. А если добавить ещё указатель на prev, то получится двусвязный список.
>>1796789 >>1796893 Спасибо за идеи и прототип кода! У самого тоже появилась похожая идея со структурой, у которой внутри будет список указателей на другие структуры.
Буду пробовать все идеи и о результатах потом напишу :)
Пока не соглашусь с этим (но мне надо будет снова прочитать соответствующую инфу). Если я правильно помню, то typdef не создаёт новых типов. typedef лишь позволяет создать, скажем так "ярлык", чтобы использовать именно его, а не писать каждый раз словосочетание "struct location", "struct route".
Анон, в чем разница между прошивкой и драйвером? Типа, драйвер юзает API ядра операционки для взаимодействия с девайсом, а прошивка работает на голом железе и хранится в ROM или флэш памяти, да? Или есть еще принципиальные различия?
>>1798545 Драйвер может быть частью прошивки. Например, когда ты перешиваешь смартфон на Андроиде, то прошивка включает в себя всё - я идро, и драйвера, и сам Андроид, и приложения.
>>1798503 typedef создаёт новый тип данных. Впрочем компилятору неважно что внутри будет. Для него метка будет означать какой-то объявленный тип и на этом все. Ты можешь сделать typedef struct huy huy_type; И структуру определить где-то в другом месте. В принципе компилятор будет знать о таком типе и ты сможешь его использовать без объявленной структуры, но что оно внутри за вундервафля - без определения не узнаешь. Короче говоря ты можешь юзать ярлык без определения оригинала, что в принципе можно считать за самодостаточность такого нового созданного типа.
Аноны, посоветуйте материала по указателям. Иногда путаюсь а мои функции в один момент то хавают простой указатель то требуют разыменовывать, из-за этого постоянно путаюсь.
>>1798808 Первые два способа всегда были эквивалентны. а++ мог быть эффективнее, но современные кунпеляторы умеют преобразовывать одно в другое по своим соображениям.
Уверен абсолютно, что ты не прав в этом. Я прочитал 3 абзац "Semantics" главы 6.7.8 ISO/IEC 9899-2011 и 9899-2018; вот цитата оттуда A typedef declaration does not introduce a new type, only a synonym for the type so specifed.
>>1798917 Да, так и есть. Удобно устанавливать синонимы, привожу как пример, на структурные типы, дабы не писать "struct $(name)", а например "$(name)_t". Выглядит компактнее, лаконичнее (?), "современно и молодёжно".
Допо>>1799043 Лаконичность помечена со знаком вопроса, т.к это острый вопрос. Решайте сами, как будете писать. Я высказался, как думаю на текущий момент.
>>1798808 x = *ptr; ptr++; самое эффективное, даже с современными умными компиляторами. Из-за алиасинга остальные варианты могут потребовать вычисления адреса каждый раз, тогда как с инкрементом указателя никаких подводных не может быть в принципе.
>>1799253 Ну как сказать... Создатель ныне самого популярного ядра ОС. Защита от долбоебов: рофл про 3% на десктопе неактуален, ибо Линукс есть везде - в эмбедщине, роботах, интернете вещей, серверах, роутерах, телефонах (ведроид), спутниках и т.п., оверолл больше компьютеров в мире крутятся на Линуксе, нежели на какой-либо другой ОС. Ну и создатель гита, которым пользуются 90% девелоперов по всему миру. Ни разу не авторитет, да.
Ну не знаю. Мне он как человек не нравится. Да и закапавыался я с головой в код ядра Linux. И в Windows DDK тоже закапывался. Нет в ядре Linux (почти нет) таких мест, коорыми можно восхищаться. Между тем, внимательное изучение заголовочных файлов из DDK сразу даёт понять разницу в качестве ядер NT и Linux.
Насчёт git - ну да, удобно. И возможностей поболе чем у svn, но это как бы не извиняет Торвальдса, за его скверный характер. [
Кстати, в чём красота, то там работа с драйверами "слоями", ты можешь, например, написать драйвер, который вклинится между ядром и другим доайвером и заставить работать этот драйвер в качестве фильтра. Ну вот например ты можешь реализовать сквозное шифрование между драйвером устройства и ядром.
>>1799305 Не согласен, в ядре Линукса есть много красивых решений. Умудрились даже высрать ООП дизайн в языке без ООП, не притягивая блоатед плюсы. Та же реализация макроса container_of - чистый и красивый хакинг. И такого много, на самом деле. За 4 года разработки драйверов на Линукс, мне пришлось прочесть достаточно кода в ядре.
>>1799305 У него прекрасный, замечательный характер. Нет ничего постыдного в том чтобы показывать фак нвидии или хуесосить тех кто шлет в ядро говнокод.
>>1799459 Пикрил В целом, это ищется в гугле за наносекунду, поэтому мог бы и сам, но ладно.
Примечательно, что довольно большая часть ядра Линукса - это не ANSI Си, а разномастные хаки, в т.ч. основанные на расширениях компилятора GCC, выжимающие максимум производительности.
>>1799442 >Нет ничего постыдного в том чтобы показывать фак нвидии
> Показывать средний палец компании, которая единственная производит норм видюхи с норм драйверами, втч под линух, где у единственных всё из коробки без бубнов, и благоговеть от лизонькиных-писенькиных красных поделий с кривыми, шо проприетарными, шо швабодными, шо под линукс, шо под шиндошс дровами и единственное достоинство которых - греть ЧСВ амудебилов вроде сралкаша и кулича, ммммммм.
>>1799496 >Примечательно, что довольно большая часть ядра Линукса - это не ANSI Си, а разномастные хаки, в т.ч. основанные на расширениях компилятора GCC, выжимающие максимум производительности.
Ну то есть, самый главный проект байтолюбства ногострельным языком, которым оправдывают байтолюбство ногострельными байтоязыками закономерно пишется с ебанием стандарта языка в рот и в жопу, порождая ежемесячно кучу веселых CVE.
И местные байтолюбы считают это чем-то хорошим, даже великолепным?
>>1799544 Ты не напишешь МАКСИМАЛЬНО ЭФФЕКТИВНУЮ операционную систему на языке без UB. Даже высеры раста вынуждены абузить unsafe (чекай сорц redox), и то это будет медленнее так или иначе. Почему так - на дваче не объяснить, пройди курс теории вычислений в нормальном, не СНГшном, ВУЗе, и ты поймешь о чем я говорю.
>>1799552 В принципе, С++ можно. Дело не столько в языке, сколько в дизайне системы и используемых алгоритмах. Так-то С++ обратно совместим с Си. Особливо если во всю пользовать extern "C" . Нюансы конечно есть, но их не так много.
>>1799552 Паскаль легко может быть использован. Но это не совсем правильно. Правильно реализовать ядро в виде множества сервисов, которые обмениваются между собой сообщениями. И тогда для написания ядра ОС сгодится любой язык программирования. Даже скриптовый.
>>1799647 обратная совместимость с си это самое некрасивое и костыльное место всего дизайна крестов как языка. Разве что совсем дурак будет этим заниматься
>>1799437 > Та же реализация макроса container_of - чистый и красивый хакин Это та же самая, которая в винде CONTAINING_RECORD, и которую изобрели примерно вместе с сишкой задолго до линусов?
Нормальная ли это практика юзать функцию которая возвращает значение но не назначать его никуда? Или лучше юзать какую-нибудь мусорную переменную/другую функцию?
>>1799866 >Но чистые сообщения не работают, драйвера приходится монолитить. Это распространённое заблуждение. Но я не буду тебя переубеждать. Сегодня точно не буду.
>>1799705 Paint.net так работает, помню как его хаяли за то, что его пихали как пример что на .net можно писать быстрые приложения, обрабатывающие массивы из миллионов пикселей в секунду, а на практике там такое жульничество.
>>1798917 Однохуйственно. Ты создаёшь новую запись в таблице символов при компиляции этим. Что синоним, что линк - запись появилась, компилятор работает как с новым типом, хоть и указывающим на другой составной тип. Удачи читать стандарты которые не работают ИРЛ.
>>1800805 Подмечу, что можно сделать lockless очередь. Но тогда часть перфа потеряется в другом месте. Хотя и не так сильно. Apple использует микроядро, и вроде не бегут с него. Впрочем, драйвера у них работают внутри отдельного сервиса в котором очередей нет.
>>1800841 В гугле хватает multiple producer, single consumer lockless очередей. Проблема ещё в валидации сообщений. Кинул неясный сервис другому сообщение, а оно и поставило раком всю систему. Рано или поздно выйдет, что система только тем и занимается что валидирует сообщения, да и дергает атомарные инструкции,которые инвалидируют весьма часто L1 кэш в seq_cst, в то время как монолитное ядро лишь локается на спинлоках/мьютексах/rcu, и просто работает.
>>1800860 А, ну да, там же еще CAS в железе нужен. > As an example, this code almost certainly needs a "memory" clobber. Not to ensure the correct functioning of cmpxchg16b, but because the goal is probably to sync threads, which means you want all registers flushed before notifying the other thread. Лол, вся суть, пихать мемори барьер, к инструкции которая и так дохуя тактов жрет, вот тебе и лок фри.
>>1800805 >Сообщения - это циклический буффер, в который пользователи могут писать и читать. А значит, те же блокировки.
В принципе вот тут и закопан корень заблуждений. Я говоро о синхронных сообщениях, когдв блокируется передатчик сообщения, если не готова принимающаю сторона, и наоборот - приёмник сообщений блокируются пока кто-то не пошёл ему сообщение.
>>1801029 >Ахуенно, а теперь расскажи как будет работать твоя "блокировка" когда двое посылают сообщение одному и тому же. Если приёмник не готов, блокируются оба передатчика. Иначе сообшение посылает тот, у кого выше приоритет, второй посылающий блокируется средствами микроядра.
>>1801524 Опять троллим тупостью? Как можно человеку только осилившему прату советовать читать опенсорс говно вроде пинукса? Мало того что он нихуя не поймет, ты ему еще и советуешь вдохновляться дырявым стилем ленивых хуесосов вроде самого пинуса
>>1801608 Вопрос "что кодить" просто вымораживает. Не знаешь что писать - бери любую задачу со списками, затем с бинарным деревом, затем с небинарным деревом. Затем приходи сюда, отчитывайся и получишь новое задание. А пока не сделаешь - не приходи.
>>1801822 >Там самое интересное байтоебство с битфилдами Вкусовщина. Приятней когда игра интеллектуальная, с элементами случайности, какой нибудь Бридж или Преф.
>>1802255 >uint32_t up_right_bb = 0 | ((bb & RANK_1357) >> 4 | ((bb & RANK_2468) >> 5 Чё за хуйня со скобками? И потом ты ещё говоришь, что это не говнокод?
>>1802307 > Я тебе написал что такое байтоёбство Где? Не вижу. > Битборд это вообще одна из элементарнейших дата структур уже лет 20 как реализуемых на любом из яп И что? Твое байтоебство тоже.
>>1802330 Анон, прости, что доебываю тебя, но! Микруха - это сленговое название любой микросхемы, а то что ты имеешь ввиду, имеет называние "микроконтррллер". Или, сокращённо, МК.
Правда, чтобы разработать ядро на JavaScript необходимо соблюсти ряд определенных условий касаемо разработчиков такого ядра: 1. Необходимо приобрести цистерну клубничного смузи 2. Нужен гироскутер, а ещё лучше - моноколесо 3. Необходимо соблюдать определенный внешний вид разработчиков: штаны с подворотами, жиденькая бородка 4. Разработчики такого ядра обязательно должны быть прогрессивными: говорить 2к20 вместо 2020, говорить о харассменте, гендерной несправедливости, интерсекциональной трансфобии (!это самое главное), обязательно должны быть ярыми поборниками за экологию и фанатами Греты Тунберг, должны ненавидеть мужланов и маскулинность, должны быть ярыми участниками куколд-движения
>>1802403 >4. Разработчики такого ядра обязательно должны быть прогрессивными: говорить 2к20 вместо 2020, говорить о харассменте, гендерной несправедливости, интерсекциональной трансфобии (!это самое главное), обязательно должны быть ярыми поборниками за экологию и фанатами Греты Тунберг, должны ненавидеть мужланов и маскулинность, должны быть ярыми участниками куколд-движения Ты говоришь так, словно байтоебов и кразноглазиков данная проблема не коснулась. На что там заменят слово "слейв" в линупше? ЧЕРНЫЕ ЖИЗНИ ВАЖНЫ!!!!! Кого пидорнули с должности президента фсф за то, что спизданул про дела Эпштейна чьто-то в духе "Наверняка эти шлюхи сами с удовольствием шли сосать миллиардеру" КАРАУЛ ВИКТИМБЛЭЙМИНГ!!!
>>1803110 Автор этого кода перестраховался и не очень уверен в приоритетах операций. Если редактор подсвечивает парные скобки, то стерпеть такое можно.
>>1803142 > Автор этого кода перестраховался Это не путаница со скобками. Автор этого кода хочет, чтобы любая макака смогла с первого раза правильно прочитать код. А приоритеты сдвиги vs. побитовые знает любой, кто с байтоеблей сталкивался.
Ещё могу добавить необходимость в 100 новых библиотек для написания ядра. Обязательно чтобы каждый был основан на любых других библиотеках из npm. И все ставилось через десяток менеджеров пакетов, которые между собой не совместимы.
>>1803142 Я честно не пойму с чем ты споришь. Вот я открыл другую либу, для STM32. Так и выглядит байтоебство (и так же выглядела копипаста с шахматными битбордами).
>>1803256 Боже, какой же ты еблан. Естественно в коде не бывает непарных скобок, он даже не скомпилируется. Очевидно же что это ошибка копипаста примера.
>>1787010 >MISRA C - это такие рекомендации, как писать код для хуйни, которая может ебнуть Удивительно, что такой код вообще пишут на C. У него же репутация языка, где выстрелить в ногу - раз плюнуть. Вроде Ada создавалась для подобных целей. Хотя впрочем, кое-какие важные вещи и на ассемблере пишут. Но проверяют 100 раз, конечно.
>>1803354 С одной стороны да, делает код чуть попроще для понимания. С другой стороны если ты пишешь на Си в ООП стиле, как например сделан проект gtk, то кажется ты свихнулся, тихо страдаешь по крестам и лучше уже выбрать их.
>>1803281 От логических ошибок тебя никакой язык не застрахует. Нужен опытный программист. И тот же самый опытный программист обычно уже миллион раз обжегся на сишке, и более-менее умеет качественно на ней писать.
>>1799416 Поясните, почему Ubuntu/Debian может "повиснуть" и никак не реагировать на клавиатуру (все эти SysRq и проч.), в то время как Windows тоже может "повиснуть", но всегда реагирует на Ctrl+Arl+Del. Это как-то связано с алгоритмом планирования процессов? Какой алгоритм используется в Windows?
>>1804088 Я хз про линух, но винда уже с 95 а может и раньше драйвера запускает по сути на виртуальных машинах, чтобы железо не могло вешать систему и была истинная многозадачность. Но bsod опять же все равно происходил.
Поясните, почему многие проекты сидят на gcc 4..8, если gcc 4..8 забагованы? Причина перехода на последние версии: как минимум баг-фиксы в кодогенерации.
>>1804088 >в то время как Windows тоже может "повиснуть", У меня не виснет.
> но всегда реагирует на Ctrl+Arl+Del. Любоей нажатие на клавишу генерирует прерывание. Обработчик прерывания читает из порт контроллера байт, или несколько байт, в зависимости от нажатой клавишы. Это байты называются scam-codes. Драйвер клаивиатуры передаёт эти сканкоды ядру, где в зависимости от локали эти коды транслируются в ascii или unicode символы. Можно читать напрямую сканкоды и смотреть какая клавиша нажата.
При этом доайвер (клавиатуры или ядро) анализирует последовательность нажатых клавиш. Когда он обнаруживает Ctrl + Alt Del, то посылает сигнал перезагрузки.
Старые ядра всегда ловили Ctrl+Alt+Del. Новые не ловят? Причин может быть много. Самая банальная - по какой-то причине прерывания от клавиатура запрещены. В этом случае на клавиатуру реагировать никак не будет. Другая причина... ну возможно косячит systemd. Это даже более вероятная причиина. Slackware упирается с переходом на systemd. Возможно она не подвержена этому багу.
>>1804106 Легаси, сертификация, поддержка старых ОС без свежих пакетов. Многие баги обходятся тонкими фиксами, отключением оптимизаций для отдельных участков кода и т.д.
А баги есть везде, через N лет текущую версию можно будет назвать старой и забагованной до неюзабельности.
>>1804096 >первый релиз в 2011 году >последний релиз 8 ноября 2012 года Говорилось про юзабельные RTOS, а не шизоидные говновысеры, толком не подходящие под такие задачи.
> As a microkernel-based OS, QNX is based on the idea of running most of the operating system kernel in the form of a number of small tasks, named Resource Managers. ...
Это была QNX. Давай посмотрим что крутится на насовских марсоходах. Охуевай от прочитанного:
И наконец, то что ещё не летало, но в перспективе сожрёт и QNX и VxWorks, не говоря уже об остальном - https://www.l4ka.org/65.php
Слушай, не в обиду, но может быть российские спутники долго не живут вовсе не от проблем с радстойкостью железа, а от того что ты и подобные тебе суперциклами злоупотребляете?
>>1803148 угу встречал и в литературе 2 противоположных мнения одни считают что нужно намеренно писать проще, в данном случае, расставить необязательные скобочки другие считаю, и их мнение мне ближе, что человек который будет сопровождать данный код, будет обладать достаточной квалификацией и будет знать тонкости приоритета операций в языке и эти скобки расставлять не надо
Может кто-нибудь объяснить, почему выводит 0, а не 4? Хотел понизить тип числа. Я правильно понимаю, что можно переводить типы только в одну сторону(из типов с меньшим количествов байт в большее?) или же есть способы перевода на тип поменьше без потери данных(а если я знаю ответ и хочу перевести в тип с памятью поменьше?)
>>1804489 Не работает эта команда. Ошибка при компиляции
Бтв, как это все называется? Как работают форматы lf, d идругие? Они сами по себе не переведут инт в дабл, если указать для целого вещественный lf в принфте? И как называется, когда переводят числа из одного типа в другой. А то мне из-за этой вещи мне бывает очень сложно искать ошибку в моем коде.
>>1804496 > А то мне из-за этой вещи мне бывает очень сложно искать ошибку в моем коде. Чтобы не искать ошибки, нужно включать больше ворнингов: > printf("%d\n", 1.0); > cc -Wformat file.c > warning: format '%d' expects argument of type 'int', but argument 2 has type 'double' > Не работает эта команда Алсо, нужно читать, что тебе пишут на скриншоте (вторая строка). Сначала учимся читать, потом пишем код. Не наоборот.
Аноны, писал все время на крестах, но сейчас необходимо на С. У меня вопрос, как мне сложить несколько чисел в одну строку или просто написать сложную формулу. А-ля 1+2*3-4.
>>1804335 Ты кинул статью со спутниками, на которой почти все работают на монолитной VxWorks. Каким боком микроядро? И не надо мне тут рассказывать за микроядро в VxWorks - его добавили как отдельный профиль сборки для mmu-less архитектур в 2014, и единственная его микроядерность - размер в 20 кбайт, и на этом всё
>>1804644 Да я просто обчитался гитлаба GHC (конкретно их рантайма) и захотел себе сделать так же. В питоне, расте, кстати, тоже строки по дефолту юникод32. Компилятор в байт-код у меня поддерживает utf[8, 16, 32] Но он на хаскеле, лол, а вот в самой виртуалке строки онли ютф8, хочется сделать нормальный юникод32, чтобы не париться совсем.
Ну или подкиньте, что можно почитать, вдруг я не так понимаю все это дело и лезу еще тут, есть у меня ощущение, что знаний не хватает...
>>1805013 >И не надо мне тут рассказывать за микроядро в VxWorks Конечно я не буду тебе за него рассказывать, потому что в мире есть только одно божественное микроядро и оно поддерживает спецификацию L4.X2. Все остальные ядра это бледные тени L4.X2.
>>1805220 Что? Нет. Строки и в расте и в третьем питоне по дефолту енкодятся в UTF-8, и только в питоныче интерпретатор за тебя в большинстве случаев подставит нужную кодировку в процессе трансляции.
>>1805220 > В питоне, ... кстати, тоже строки по дефолту юникод32 [sys.getsizeof("x" * i) for i in range(10)] [49, 50, 51, 52, 53, 54, 55, 56, 57, 58] Еще охуительные истории будут?
> юникод32, чтобы не париться совсем Эмодзи видел? А в них несколько code-points в каждом. Русские буквы с ударением, любые другие комбинирующиеся символы... не получится не париться, смирись.
Бляяяядь, как же говна наелся с этими эмодзи. Посоветуйте чё почитать вообще про кодировки. Знаком ток с аски. Опционально про рендеринг текста тоже было бы интересно (после того как эмодзи поебали отображение текста в моем терминале)
Подскажите IDE для Си. Скачал CLion и столкнулся со следующими проблемами: 1. По умолчанию открывающая фигурная скобка ставится на той же строке, на которой описывается название функции и ее параметры. Мне нужно, чтобы открывающая скобка ставилась с новой строки в случае с функциями, но -- на той же строке в случае с циклами. 2. Мне нужно, чтобы я выбрал стандарт языка, создал файлик, написал код, скомпилил его, запустил. Потом создал бы новый файлик, написал бы в нем новый код, скомпилил бы, запустил. Звучит несложно, да? Однако в CLion под каждый такой отдельный файлик мне нужно создавать новый проект. Соответственно, для каждого упражнения из K&R я вынужден создавать New Project. Выходит громоздко.
Вы можете предложить мне писать в каком-нибудь vim или emacs и просто собирать компилятором из консоли -- неплохой вариант. Но я хочу но я хочу IDE с подсветкой, дополнениями, авторазметкой кода и т.п.
>>1806906 Visual Studio тебе нужно. А если из консоли, то пользуй редактор Midnight Commander. Автодополнения не будет, но подсветку он обеспечит. Да и vi c emacs умеют в подсветку. emacs я не знаю, но vi для редактирования кода годится только если ты по модему по межгороду на 2400 baud логинишься из Москвы в Норильск. Тогда у vi конкупентов нет, в любом другом случае он годится лишь для правки конфигов.
>>1806914 Но в VS же даже нельзя выбрать Сишный стандарт, насколько помню. Там вообще все собирается плюсовым компилятором. А еще писать желательно на никсах, ибо я когда первый раз с винды на линукс пересел, то охреневал от buffered streams -- оказывается, не просто так \n добавлять нужно в любом выводе. Да и в VS разве можно не создавать новый проект под каждый файлик?
>>1806919 >Там вообще все собирается плюсовым компилятором. расширение .c - компилятор Си, расширени .cpp или .cc - компилятор С++
> А еще писать желательно на никсах, ибо я когда первый раз с винды на линукс пересел, то охреневал от buffered streams -- оказывается, не просто так \n добавлять нужно в любом выводе. Ну так опыт тебе. А писать желательно платформонезависимо, насколько это возможно.
> Да и в VS разве можно не создавать новый проект под каждый файлик? Ты можешь хоть все демки/уроки в один проект поместить и пометить их неактивными. И выбирать одну активную.
Аноны, помогите записать массив чисел в не форматированный бинарный файл с 16-битными отсчетами. Я не пойму, как его сделать бинарным и не форматированным.
>>1806964 ты наивный, если полагаешь что я буду за тебя делать задание или хотя бы пройду по ссылке. Научить могу, делай сам.
У тебя никаких вопросов не возникло? Какова размерность массива? Числа со знаком или без?
Ну-ка, объяви массив на 10 элементов 16 битных беззнаковых чисел. Если не сможешь, то ты зря сюда пришёл. Тут злые взрослые дяди, которые тебе плохого наговорят.
>>1806906 >Мне нужно, чтобы открывающая скобка ставилась с новой строки в случае с функциями, но -- на той же строке в случае с циклами. Должно просто настраиваться в настроках Code Style (Braces Placement) >я выбрал стандарт языка, создал файлик, написал код, скомпилил его, запустил Основная билд система у CLion это CMake же. Для простых как у тебя случаев тебе в нём нужна просто одна команда add_executable.
>>1786992 (OP) /pr Реквестирую курс по с/с++, где объясняется оформление исполняемого файла и добавление встроенный или директорных ресурсов (Иконки, вав-вайлы и т.д.). Желательно с пояснением синтаксиса и роли библиотек. Можно в виде статьи. . Сейчас освоило синтаксис, функции и системные команды. Хочу попробовать создавать оформленные простые микро-програмы (Наподобие интервального таймера). Но я даже не знаю как добавить иконку и собственный сигнал (Использую \a)
>>1806921 Попробую >>1806928 >расширение .c - компилятор Си, расширени .cpp или .cc - компилятор С++ Да, про это подзабыл. А что насчет стандарта языка? Хотелось бы иметь возможность выбирать между C90, C99 и C11 >А писать желательно платформонезависимо, насколько это возможно. В реалиях Си, по-моему, это почти невозможно. Ибо так или иначе тот или другой кусок кода будет дергать то, что связано с ОС в половине случаев. >>1807059 >Должно просто настраиваться в настроках Code Style (Braces Placement) О, помогло, спасибо. >Основная билд система у CLion это CMake же. Для простых как у тебя случаев тебе в нём нужна просто одна команда add_executable Можно поподробнее? Где именно мне прописывать cmake'овские команды? >>1807156 Согласно K&R стилю открывающая фигурная скобка тела функции должна быть с новой строки. А в случае с циклами она должна ставится на той же строчке
Подскажите пожалуйста, в каком порядке и что именно на каждом из этапов делает компилятор (например, gcc) при вычислении вот такого логического выражения: i < j || ++j < k
>>1807221 Вот реально лень проверять. Просто когда опыт программирования в десятки лет, то такие конструкции подсознательно избегаегт, даже не задумываясь.
printf("%d\n", i < j || ++j < k); printf("%d %d %d\n", i, j, k); }
то последний printf покажет, что j равно 4. И непонятно, почему префиксный инкремент (который во всём выражении имеет высший приоритет и должен за счёт своей "префиксности" моментально увеличить j на 1) не выполняется.
>>1807242 Потому что order of evaluation независим от order of precedence https://en.cppreference.com/w/c/language/eval_order В операторе x() || y() если x() истина, то все выражение истина и вызова y() не будет вообще. Аналогично x() && y() если x() ложь, то все выражение всегда ложь.
Пойду больше по теме покурю, спасибо. А то делаю виртуалку для фп языка на вроде эрланга, но с норм типами (раскурил систему типов хаскеля для этих целей и чутка упростил, шоб в императивном языке норм смотрелось) пока получается лютое говно и я хз, как типизировать рассылку сообщений между процессами, разучил как делать shenandoah gc (получилось баганное кривое подобие, правда, но это дело наживное), в итоге у меня CMS и Shenandoah только, хочу еще G1 прикрутить. Собственно, не хочется делать строки как в хаскеле и нативном эрланге, где они тупо на линкед листах, ну и массивы заодно завез, думаю вот, как обойтись без частного случая для строк, но что-то как-то лучше их все же вытащить в отдельный случай для экономии проца и оперативы.
>>1807183 >Можно поподробнее? Где именно мне прописывать cmake'овские команды? При создании проекта у тебя появляется файл CMakeLists.txt, который описывает всё, что билдит твой проект. Там и добавляй новые исполняемые файлы. Посмотри https://cliutils.gitlab.io/modern-cmake/chapters/basics.html , в особенности раздел Dive In. Только у тебя, естественно, будет LANGUAGES C. Для задания стандарта Си используй https://cmake.org/cmake/help/latest/prop_tgt/C_STANDARD.html Вообще хорошо бы простой Make понять прежде чем лезть в весь ужас CMake. Но в CLion с мейком всё очень плохо, и если ты уж в него впираешься, то выбора нет.
>>1788067 >Забугром эмбедщина >Quallcom, Mellanox, Marvell, Nvidia, Xilinx, Tesla Речь идет про рядового анона, либо без во, либо закончившего говновуз, которые забугром нафиг не кому не нужны даже с 10 годами опыта. Поэтому если выбирать из работы в России: прогать микрики, как даун, или стать веб-разработчиком, очевидно выгоднее выбрать второе. Можно как завести трактор в ДС, так и перейти на удаленку, фриланс, когда прогером мкк будешь всю жизнь сосать за 30-40к максимум при работе оффлайн 5/2.
>>1788546 >Причём настолько, что любой человек с опытом 3+ лет на этом самом эмбедеде может спокойно ехать в какую-нибудь Германию или Францию на 4-5к рейхсмарок ежемесячно, Но реальность такова, что типичный байтоеб из НИИ, не закончивший топ вуз в дс, будет пахать за 20к-30к и ни в какую германию и францию не уедет, потому что он там нафиг не нужен. В то время как веб-разработчик даже в рахе может получать эквивалент 2-3 рейхсмарок через пару лет работы и работать на в разваливающемся заводе или нии, а в крутом офисе с печеньками и кондиционером со свободным графиком.
>>1795877 > не одними деньгами, анонче. Есть ещё то, что у тебя в мозгу и душе. Угу, пока норм прогеры уже и квартиру в новостройке/жилье купят, машину, и семью заведут, ты будешь ездить на работу на жигулях микросхемы паять и жить с мамкой, зато для ДУШУ работаешь, лол.
>>1810956 >либо закончившего говновуз, которые забугром нафиг не кому не нужны даже с 10 годами опыта Дальше пост можно не читать, т.к. выдает теоретика сразу. Ты не знаешь, какие дипломы за бугром нужны, а какие нет (хинт: почти все со словом "государственный").
>>1810968 Да, собственно, анон, я сейчас микросхемы паяю в свободное время работаю-то я андроидщиком. А когда заведешь семью - хуй ты поковыряешь МК в свободное время, ибо хуй тебе а не свободное время. И хуй ты потратишь свои кровные на свое увлечение.
Но вообще, если следовать твоей логике, что так, что так ты будешь в говне, ебать: либо с деньгами, квартирами, машинами, женой, но без свободы и поэтому тебе нахуй эти все КВОРТ5РЫ, МОШЫНЫ не будут нужны, депрессия сожрет твой мосск, либо без денег, но зато будешь заниматься своим любимым делом.
Энивей... Не хочу заводить серьезные отношения до 33, нахуй мне это нужно, только ограничивает твою свободу, анон
>>1810997 >Ты не знаешь, какие дипломы за бугром нужны Хуйня эти твои дипломы. Они работодателю не нужны, они нужны государственной службе, которая решает, выдавать тебе рабочую визу, или нет.
Работодатель же пока будет оформлять тебе документы, отправит тебе техзадание, т.е. работать на него ты начинаешь ещё до покупки билетов. Могут ли наебать? Х.з. могут наверное, но переоцинивать свои способности, мол "нахаляву" работать чтобы прислали приглашение, а приглашение не пришло - украли твой труд. Это значит что ты курсовую писал какому-то студенту, а не устраивался на работу.
Вышесказанное справедливо по отношения перектачиков из периферии.