одна и та же сишная функция спокойно отработает на одном, но не заработает на другом без модификаций
Это какая функция? Если не вылезать за пределы glibc, все нормально на любой архитектуре работает. Понятно, что кое-какие вещи приходится с ассемблерными вставками делать, но так и ядро тоже не на 100% на сях писано!
даже 32-битные процессоры
Я уже давно забросил восьмибитки, пишу преимущественно под STM32. И все равно там очень много вещей, которые на ПК делаются совершенно иначе. Скажем, отсутствие MMU приводит к необходимости выкручиваться без malloc'а…
И да, там все равно очень скудно с ресурсами. Вот вчера сидел, думал, что бы мне еще такого к сборищу игрулек (описание - у меня в ЖЖ и в моей теме «паяю») добавить. Продумал алгоритм «арканоида» (ровно страница А4 на него ушла). Сейчас уже 20кБ занято шрифтами и т.п. — для «змейки» и «тетриса». И это с несчастным светодиодным дисплеем 64×32 пикселя! Для арканоида нужно будет под каждый уровень выделять массив в 320 байт для описания уровня + оперативы еще около килобайта (итого свободной остается 15кБ памяти).
Я слышал о библиотеке, которая позволяет собирать мусор. Но она сама достаточно жирная и неповоротливая, поэтому мало кто ее использует.
Так что, смело могу сказать 4.2 на твои вопли! Невозможно «удалить все автоматом»: если уж ты где-то сделал malloc, тебе обязательно нужно будет сделать free! Всякое уродство вроде С++ я априори не рассматриваю.
Я уж молчу о читабельности кода: если ты в одном месте сделал alloc, но нигде нет free, то уже подсознание негодует: где-то явная утечка памяти!
Лакмусовая бумажка используется как индикатор, конечно, никто в школе не уточняет её химический состав
Я не знаю как у вас, а нам преподавали переход окраски именно лакмуса, а не универсального индикатора. В принципе, есть краситель лакмоид, у которого близкий переход, но все же другой, более резкий, да и стоит он ненамного дешевле лакмуса.
Салат оливье изначально рябчики с раками и еще 50 всего, он и у Оливье один раз настоящий получился, да отставание от Франции, но зато в тазике
Испортить салат оливье очень легко, и у многих людей это успешно получается. В основном что попало называют салатом Оливье либо неприхотливые едоки, либо криворукие повара, которые не умеют в Оливье.
Не работает он прекрасно, т.к. тебе придется вручную контролировать выделение памяти. И это — просто жесть! Особенно если нужно большими кусками (по килобайту-два) выделять.
Нафиг не нужно. Частично из-за этого огораживания я против ртосей и никогда их не использую на простых МК.
Единственный вменяемый способ — это объявить в конце функции метку, где будут ряды FREE(x), FREE(y) и т.д, а потом уже return ret (макрос FREE разворачивается в do{if(x){free(x); x = NULL;}while(0))
Девяностые годы уже прошли, их не вернешь. В языках есть RAII, тот же attribute cleanup в gcc/clang, есть другие языки с RAII, вроде крестов или defer golang.
У меня было 5/4 за выпускное сочинение. Было бы и 5/5, но в этом случае нужно было «денежку куда надо занести» ☺
Да, уже почти 23 года прошло с моего выпуска, я стал намного меньше читать русскоязычной худлитературы (да и вообще худлитературы, тупо статьи и даташиты с мануалами), но таки «тотальный диктант» на пятерку пишу.
впрочем еге к заннию языка ортогонален
Вот здесь — да, поддерживаю. ЕГЭ вообще никак не отражает знания человека.
Я слышал о библиотеке, которая позволяет собирать мусор.
Нет тут никакого сборщика мусора, компилятор автоматически расставляет вызовы free/delete. После компиляции код получается такой же, как если бы free/delete писали руками. Никаких накладных расходов и рантаймов.
Невозможно «удалить все автоматом»: если уж ты где-то сделал malloc, тебе обязательно нужно будет сделать free!
Вызовы free компилятор C++ может вставлять автоматом.
Всякое уродство вроде С++ я априори не рассматриваю.
Продолжайте страдать.
Я уж молчу о читабельности кода: если ты в одном месте сделал alloc, но нигде нет free, то уже подсознание негодует: где-то явная утечка памяти!
Надо мыслить в понятиях владения, а не вызовов malloc/free, тогда и утечек не будет. Заодно будет более чистая и понятная архитектура.
В противположность Бёму-Якопини, у которых выходов не было в принципе, и которые создали такую же чисто теоретическую и практически бесполезную модель, как машина Тьюринга, на которой никто вообще не пишет, но на которую все ссылаются. Почти все апелляции по поводу «верните нам goto» были именно на тему выходов из блоков итераций. Выходы сделали — теперь никто не смеет раскрыть рот на тему «верните goto», потому что ниш у него почти не осталось.
А мне эти загоны нафиг не нужны. Если я захочу вдруг операционку, я просто возьму orange pi за 1000 рублей и поставлю туда линукс (могу хоть генту в qemu'вском чруте скомпилять, все равно меньше затрат будет), а на дешевом простом МК реализую то, что не умеет «апельсинка». Дешево и сердито. И без извращений с malloc'ами на микроконтроллере!
Выходы сделали — теперь никто не смеет раскрыть рот на тему «верните goto»
Это в каком языке? В С, к счастью, никто goto не выбрасывал. Я уже говорил, что без goto вообще мало что дельного можно на С написать. Да и на С++ аналогично, наверное, если писать так, чтобы код мог читать человек, а не только компьютер!
В Обероне break/continue тоже нет, только RETURN и EXIT. EXIT – это аналог break и его можно использовать только внутри цикла LOOP END (аналог на Си for (;;) {}).
теперь от этого сочинения зависит максимум треть всей оценки
Вторая четверка у меня была по «этике и психологии семейной жизни». Я с директрисой что-то (уж не помню, что) не поделил. В итоге она вечно на меня «вызверивалась» (а она и вела этот нафиг не нужный предмет)…
Я и впоследствии грызся с преподавателями психологии и философии, называя их предметы «ненужным трëпом».
Я и впоследствии грызся с преподавателями психологии и философии, называя их предметы «ненужным трëпом»
Сферы сами по себе интересные, но, как правило, туда массово лезут любители пустопороженго трепа, которые пишут книги и ведут лекции. Я сам чуть не ушел из инста, когда мне выносили мозги философией, политилогией, и религией — и это всё на технической специальности. Типа, я должен говорить спасибо за то, что хоть всего ленина не заставляют перечитывать, этого поехавшего графомана, но зато заставляют читать других поехавших графоманов.
setjump/longjump придумали для параллельных задач во времена одного процессора, а throw/catch это от безысходности, типа уупс, дерьмо случается, ловите
Исходники можно набивать на карты клавишным автономным перфоратором. И клонировать колоды, такие машины были с конца XIX века.
Складывать колоды в коробку для перфокарт и приносить задание в ВЦ.
Но это не для Бейсика. Бейсик изначально нацелен на онлайн, чтобы неспециалисты могли пользоваться ЭВМ для несложных расчётов, как позднее электронные таблицы. Конечно, позже появились чисто пакетные реализации Бейсика, но зачем они нужны, если уже есть ФОРТРАН?!
Сколько помню, если что-то сложное парсить приходится, какие-нибудь структуры файлов, текст разбирать и всякое такое, то без вложенных циклов и break с continue у меня не обходится. В том числе и выхода на верх через несколько уровней. Исключения тут не в кассу. Не ну можно конечно их нарочно генерировать, но вот это как раз будет говнокодом.
Сколько помню, если что-то сложное парсить приходится, какие-нибудь структуры файлов, текст разбирать и всякое такое, то без вложенных циклов и break с continue у меня не обходится.
В исходниках компилятора Оберона прекрасно обходится. Посмотрите книгу Вирта Построение Компиляторов.
С++ — говно. Читаемость никакая, отладка вообще через одно место. Нет уж, спасибки, не надо мне этих ваших ублюдств! Тем более, как показала практика, одно и то же я на С и человек на С++ делаем с одной скоростью
Ты совершенно забыл про более адекватную сему феномену теорию: С++ — говно, и Си — тоже говно. Это раз. Два: программа на Си, в среднем по палате, содержит намного больше уязвимостей и UB, чем средняя программа на C++. Именно потому, что крестовый кодер будет вынужден потратить кучу времени на то, чтобы доказать компилятору, что хочет сделать именно то, что хочет сделать, а сишный компилятор сделает тебе что угодно — ты потом сам будешь сидеть и разбираться, что же на самом деле происходит.
Ничего не получается: тебе все равно нужно FREE вызывать в конце функции для удаления ненужных маллоков. Так что, чушь ты несешь
Ну, с таким подходом вообще придется на фортране писать…
программа на Си, в среднем по палате, содержит намного больше уязвимостей и UB, чем средняя программа на C++
Зависит исключительно от писаря.
Но лично мне С нравится тем, что позволяет не только выстрелить себе в ногу из дробовика, но и развернуть гранатомет задом наперед и снести себе башню! И это — здорово!!! Не люблю, когда меня ограничивают в свободе выбора.
Атрибут cleanup
Мало того, что отстой, так еще и несовместимо с С99.
одна и та же сишная функция спокойно отработает на одном, но не заработает на другом без модификаций
Это какая функция? Если не вылезать за пределы glibc, все нормально на любой архитектуре работает
Давай разберемся: ты ядро линукса с glibc запускаешь на контроллере с 4 кБ памяти? Нет? Так почему ты их упоминаешь? Программа для линукса не запустится на таком контроллере, и программа с контроллера не запустится на линуксе — вот тебе и вся кроссплатформенность. K&R изначально делали Си для генерации кода для одного и того же кроссплатформенного ассемблера, работавшего на машинах с подобными доступными ресурсами и оборудованием вообще, ассемблером, который умел в структуры данных (сишные struct и массивы), и даже в лисповые макросы! Единственный затык в нем был — это различные размеры машинного слова, вроде 7 или 9 бит, что и пытались обойти K&R своим препроцессором для ассемблера, разные версии которого назывались «BCPL», «B», «C». Причем, этот зоопарк с целочисленными типами индустрия расхлебывала еще лет 25, пока не появился C99 с типами данных фиксированного размера (int16_t, int_least32_t, etc).
STM32. И все равно там очень много вещей, которые на ПК делаются совершенно иначе. Скажем, отсутствие MMU приводит к необходимости выкручиваться без malloc'а
Отсутствие MMU никак не запрещает malloc.
Сейчас уже 20кБ занято шрифтами и т.п. — для «змейки» и «тетриса». И это с несчастным светодиодным дисплеем 64×32 пикселя! Для арканоида нужно будет под каждый уровень выделять массив в 320 байт для описания уровня + оперативы еще около килобайта (итого свободной остается 15кБ памяти)
https://github.com/lz4/lz4 - 2 кБ кода, нулевое использование памяти при декомпрессии. Ты, я так понимаю, не знаком с людьми, которые упаковывают 3D шутаны в win32-бинарник 64 кБ. Естественно, DirectX и системные либы туда не упакованы, но сами игровые ресурсы целиком содержатся в 64 кБ.
Метки нужны были бы в том случае если бы был к примеру RAM-диск с файловой системой тогда можно было бы и редактор кода иметь, но всего этого не было в 1982 году.
Не, с метками переборщил, это с позиции человека когда комп был слабеньким, но уже в современных очертаниях типа оперативной памяти, дисплея, а 57 лет назад это калькулятор с программой на внешнем носителе и время человека копейки по сравнению с железом.