Всего найдено: 75
Здравствуйте!
Вопрос по теме диплома. Не знаю, как правильно ее написать.Тема такая:
Разработка модуля ремуксинга видеопотока RTMP для целей
адаптивного вещания по модели Over-The-Top на embedded-устройства.Вот ссылка на то, что такое Over-The-Top (это технология) http://ru.wikipedia.org/wiki/OTT Вопрос как правильно написать название? Нужны ли кавычки?
Такой же вопрос про RTMP http://ru.wikipedia.org/wiki/Real_Time_Messaging_Protocol
Может у Вас есть еще какие-нибудь замечания?Большое спасибо!
Ответ справочной службы русского языка
Написанные латиницей названия в русском тексте в кавычки обычно не заключаются. Кавычки не нужны. Не вполне понятно, зачем Вы используете дефисы в английском слове.
Добрый день.
В одном интернет источнике встретил в статье такую цитату:
«Кстати, в русском языке от существительного карьера образовано лишь одно прилагательное — карьеристский. Его-то значение вполне понятно. Что же касается прилагательного карьерный, то оно образовано от существительного карьер (а карьер — это и открытая земляная разработка, и аллюр лошади)…»Из чего можно сделать вывод, что понятия «карьерный рост», «карьерная лестница» и «карьерные устремления» не совсем корректны.
Сам я работаю в сфере персонала и хочу узнать ваше отношение к возможности образования прилагательного «карьерный» от «карьера». Или нужно использовать «карьеристкий»?
Ответ справочной службы русского языка
Прилагательное карьерный, образованное от существительного карьера, зафиксировано в словарях (например, в «Большом толковом словаре» С. А. Кузнецова).
Здравствуйте. Очень нужен ответ по согласованию 2 определений с существительным, а именно: текущий и капитальный ремонт или текущий и капитальный ремонты. На примерах, которые даются в справочных изданиях — все понятно. Но мне не понятно, как писать именно это сочетание. Связаны ли здесь предметы или явления внутренне, или подчеркивается наличие нескольких предметов?
Ответ справочной службы русского языка
Лучше: текущий и капитальный ремонт.
Здравствуйте! Меня интересует знак препинания в данном предложении.
Такие важные для исследования процессов освящения власти понятия, как ментальность, харизма, особенности мировосприятия, структура мышления, коллективное сознание (?) возникли именно в этот период и заложили основы для дальнейшего углубления в проблему восприятия и интерпретации власти в средние века.
Спасибо.
Ответ справочной службы русского языка
После слова сознание следует поставить запятую. Сочетание исследования процессов освящения власти не вполне понятно.
Здравствуйте!
В Интернете везде по-разному, а из примеров на вашем сайте не вполне понятно: склоняется ли название департамента Франции Кот-д’Ор? Понятно, что со словом департамент не склоняется, а если отдельно? Из Кот-д’Ор? или из Кот-д’Ора? Заранее спасибо.
Евгения
Ответ справочной службы русского языка
Это склоняемое слово, правильно: из Кот-д’Ора.
Это могут быть несколько ритмичных движений даже в сидячем положении, но и они способны поднять настроение, тонус мышц и настроить организм на свой лад.
Нужно ли разделить слово «даже» запятыми с двух сторон?
Ответ справочной службы русского языка
Дополнительные запятые не требуются. Сочетание настроить организм на свой лад в данном случае не вполне понятно.
В этом случае НЕ пишется слитно или раздельно: «не понятного в этой фразе нет ничего» ??????????????
Ответ справочной службы русского языка
Верно слитное написание.
Просто не понятно,каким принципом вы руководствуетесь,когда отвечаете на вопросы. Выборочно?:(((
Пишу статью про белорусского писателя Якуба Коласа (фамилия на бе. языке).Среди коллег разгорелся спор:некоторые утверждают,что на русском следует писать КолОс (так как псевдоним от слова «колос»).Но в Большой советской энциклопедии написано КолАс (на русском).Как же быть?
И еще:число жертв взрыва достигло 67 человек.Надо ли писать слово «человек»?
Ответ справочной службы русского языка
Правильно: Колас.
Слово «человек» избыточно.
Насколько корректным является словосочетание «информационное благосостояние»?
Ответ справочной службы русского языка
Не вполне понятно, что имеется в виду.
Уважаемая, Грамота! Льщу себя надеждой, что вы снизойдёте и ответите мне хотя бы на один вопрос!
Вопрос в следующем: можно ли использовать такое сочетание
быстрая последовательность. Мне режет глаз.
Спасибо.
Ответ справочной службы русского языка
Не вполне понятно, в каком значении можно было бы использовать это сочетание.
Как в данном случае пишется не, слитно или раздельно?
Название статьи не понятно многим читателям.
Ответ справочной службы русского языка
Предпочтительно слитное написание.
Подскажите, а в чём принципиальное различие слов «брачащиеся» и «брачующиеся»? И ещё: к какому стилю относится слово «брачащиеся» (из справки не понятно, указано только, что «брачующиеся» принадлежит к официальному стилю)… Спасибо за Вашу работу.
Ответ справочной службы русского языка
Стилистической разницы между этими словами нет: и брачащиеся, и брачующиеся принадлежат к официальному стилю и вряд ли употребимы в живой речи. При этом брачащиеся – старый вариант, прежде единственно верный (хотя его недавно и обозвали – другого слова не подберешь – «нововведением» в языке), брачующиеся – новый, фиксируемый словарями только с начала 1990-х. Подробно об истории этих слов см. в статье «Сплетенье линий, лепет пятен, мельканье брачущихся пар».
Здравствуйте!
Как правильно: «просто непонятно» или «просто не понятно«?
Ответ справочной службы русского языка
Возможны варианты написания.
Уважаемая справка, пять раз отсылала вопрос про «ничего не понятно» . Ответа нет. может на этот раз повезет.
Он мне говорит:» Позвоню». НУ позвонишь (, — : ???) тогда и рещать буду!
и еще:
Ну давай, я им позвоню (???)что и как, габеру тебя тогда.пропущенно слово спрошу иди узнаю.
Подскажите по знакам пунктуации, пожалуйста
Ответ справочной службы русского языка
Допустимо: Позвонишь — тогда и решать буду. Позвоню, что и как…
В каком случае «не понятно» пишется раздельно, а в каком — слитно? Например: «Почему он так поступил, пока не[ ]понятно».
Ответ справочной службы русского языка
Слово «непонятно», употребленное в роли сказуемого, может писаться и слитно, и раздельно с частицей НЕ. Раздельное написание уместно при интонационно-логическом подчеркивании отрицания.
Современное общение почти полностью происходит через интернет: по сотне раз в день мы пишем другим людям сообщения по любому поводу. И, к сожалению, далеко не всегда это происходит в соответствии с правилами русского языка. Причём часто неправильно пишем даже самые привычные и знакомые слова. И непонятно, в каком месте мы можем совершить ошибку. Вот, к примеру, вот это слово – не понятно или непонятно: как правильно пишется? Нужен здесь пробел или оно пишется слитно? А, может, вообще через дефис? Разбираемся.
Употребление слова непонятно
Прежде всего нужно задать правильный вопрос, чтобы определиться с частью речи. Непонятно отвечает на вопрос «как?», следовательно, это наречие, образованное от прилагательного «непонятный».
Более того, это наречие предикативное, то есть такое, которое может употребляться в качестве самостоятельного члена безличного предложения – сказуемого: «непонятно (сказуемое), что имеется в виду».
В русском языке есть правило, которое гласит, что наречия с окончанием «о» пишутся с частицей «не» слитно. Однако только в случаях, если это наречие можно заменить синонимичным ему, но пишущимся без «не». Например:
- непонятно – запутанно, сумбурно, туманно.
Еще один момент, на который стоит обратить внимание при написании изучаемого нами слова: какое это предложение – утвердительное или отрицательное. Оно пишется слитно именно во фразах с утверждением. За исключением сложноподчинённых предложений с союзом «а», о которых мы скажем ниже.
Примеры предложений
- В этом деле было непонятно всё: и мотив, и методы преступления.
- — Мне только непонятно, зачем вы все сюда пришли, — возмутился отец большого семейства.
- Мать кроила мне свадебное платье и ругалась, что как-то всё непонятно написано.
- — Почему это непонятно? Мне, например, очень даже понятно! – заявила Татьяна своему младшему брату Мишке.
- Погода стояла такая пасмурная, что было непонятно, наступил уже вечер или ещё нет.
«Чем любишь заниматься в свободное время?» — что можно ответить на вопрос девушке: варианты
Девушка спрашивает: «Чем любишь заниматься в свободное время?»
Существует большое количество ситуаций, когда парню требуется ответить на вопрос от девушки «Чем любишь заниматься в свободное время» оригинально и креативно. Большинство представителей сильного пола прямолинейны. Поэтому на данный вопрос они могут ответить «ничего» или признаться в том, что валяют дурака.
Однако это не совсем правильно. Ведь в случае банального ответа девушке может стать скучно. Следовательно, стоит проявить смекалку. Если представительница прекрасного пола нравится, ответы просты. Вот варианты, что можно ответить на такой вопрос девушке:
- Разговариваю с самой лучшей девушкой на свете
- Думаю о том, как пригласить тебя на свидание
- Вспоминаю нашу вчерашнюю встречу
- Смотрю твой любимый фильм. Хочешь присоединиться?
- Сравниваю твое фото с фото Анджелины Джоли, и она существенно проигрывает
Вот еще несколько интересных вариантов:
Варианты ответов на вопрос: «Чем любишь заниматься в свободное время?»
Список можно продолжать бесконечно. Главное, чтобы ответ был позитивным и остроумным. Ведь девушкам очень нравятся незаурядные мужчины с чувством юмора. Однако не следует переходить на слишком агрессивные и обидные шутки. Даже если звонит та, к кому существует сильная антипатия, лучше держать себя «в узде». Ведь мужчина должен быть тактичен по отношению ко всем женщинам.
Употребление слов не понятно
Хотя чаще всего непонятно пишется слитно, на письме всё же встречаются оба варианта. Слитное или раздельное написание всегда зависит от контекста.
Во-первых, – и это самое простое – «не» пишется отдельно, когда встречается в сложноподчинённом предложении с противительным союзом «а». То есть тогда, когда нужно противопоставление: «не понятно, а ясно».
Во-вторых, когда есть зависимые слова: отрицательные наречия и местоимения, начинающиеся с «ни»: «нисколько», «никому», «никогда» и другие.
В-третьих, когда перед непонятно стоят такие слова с отрицательной частицей «не», как «отнюдь не…», «далеко не…», «совершенно не…»:
- Мне далеко не понятно.
- Ей отнюдь не понятно.
- Ему совершенно не понятно.
При этом нужно отдельно о и «совсем», которые могут иметь двоякое толкование. Это, можно сказать, слова-ловушки, которые в зависимости от смысла предложения могут иметь противоположный смысл: либо «абсолютно да», либо «отнюдь нет». И, соответственно, НЕ_ПОНЯТНО может быть написано как слитно, так и раздельно. Сравним:
- То, что ты сейчас сделал, мне совсем непонятно! – абсолютно, полностью непонятно.
- А что сейчас делать, мне и вовсе не понятно! – отнюдь, никоим образом не понятно.
Часто смысл предложения зависит от авторского замысла и на это нужно обращать особое внимание.
Примеры предложений
- В этом деле вообще никому ничего не понятно, — сообщил участковый стоящим возле него зевакам.
- С твоим объяснением мне стало не понятно, а наоборот, как-то всё запуталось.
- Символы на средневековой каменной стене были изображены не понятно и толково, а вычурно и загадочно.
- Надо говорить не «понятно», а «ясно»!
- — Мне нисколько не понятно, — выдохнул Павел и перевёл дух.
Войти на сайт
Мы изучили эффективные советы американского бизнес-гуру Дэна Вальдшмидта о том, как стать выдающимся человеком, и выбрала те из них, что правда приводят к успеху. На самом деле все мы знаем, как стать успешными. Для этого нужно всего лишь не ныть и много, очень много работать. Но это короткий путь к победе, а есть еще и длинный, такой, например, какой прошел Дэн Вальдшмидт — американский бизнес-коуч, маркетолог и автор книги «Будь лучшей версией себя». Прежде чем стать гуру самоспасения, Вальдшмидт прошел через типичный кризис 30-летия (только, как вундеркинд, раньше, в 25 лет).
У него были отличная работа, красавица жена и умница сын, деньги и модное спортивное хобби, но окружающая реальность стала незаметно расплываться: Дэн чувствовал себя уставшим, жизнь казалась бессмысленной и вставать утром с постели становилось все сложнее. Жена, поглядев на мужа-развалину, увлеклась другим человеком.
Алкоголь не помогал забыться. Взрослый мужчина запирался в своем кабинете и рыдал перед каждым совещанием.
Он был на грани суицида, когда до него вдруг дошло, что, как говорил Остап Бендер, спасение утопающих — дело рук самих утопающих (не знаем, читал ли бизнес-гуру эту великую книгу, но надеемся, да).
Дэн взял себя в руки и вытащил на поверхность жизни за миг до того, как окончательно уйти на дно. «Газета.Ru» предлагает познакомиться с самыми яркими его прозрениями и рекомендациями — и помнить, что, даже если вы не станете сверхуспешным человеком, вы всегда можете написать хорошую книгу о том, как все-таки стали.
Прилагайте экстремальные усилия
1. Старайтесь никого ни в чем не винить. Недалекие люди осознают свою никчемность, поэтому они так раздражительны и рвутся указывать на чужие ошибки. Они стараются вызвать у других чувство неполноценности в надежде отвлечь внимание от собственной удручающей посредственности. Никогда никого ни в чем не вините. Это плохая привычка.
2. Не тратьте силы на то, что не важно. Далеко не все нужно делать, забыв про сон. Если вы наемный работник, то обязаны ходить на работу определенное количество часов. Вы не можете это изменить. Зато можете сократить время на просмотр телевизора, встречи и все остальное, что мешает вам достичь своих целей. Замените развлечения действиями, которые продвигают вас вперед.
3. Не позволяйте себе терзаться сомнениями. Вы живете ради того, чтобы достигать успехов. Перестаньте сравнивать текущие проблемы с последними 18 неудачами. Все они разные. Да и вы изменились. Запомните: вся ваша жизнь была тренировочной площадкой для того, чтобы вы поймали удачу за хвост прямо сейчас. Почему вы должны в этом сомневаться? Прекратите ныть и начните бороться.
4. Спросите себя: «Что я могу сделать лучше в следующий раз?» И сделайте это в следующий раз. Если в течение 10–20 лет непрестанно работать над собой, вы точно станете лучше. Еще один важный шаг на пути к свершениям — не сделать какую-нибудь глупость. Так что учитесь на своих ошибках и используйте эти уроки.
5. Активно проводите время, занимаясь тем, что заряжает вас энтузиазмом (например, займитесь наконец спортом!). Жить мгновением — значит жить на пределе возможностей. Психологическая подготовка во многом обусловлена физической. Так что сразитесь с кем-нибудь на ринге или займитесь бегом, если борьба кажется вам чересчур жестоким видом спорта. Физические нагрузки значительно улучшают психологический настрой.
6. Попросите прощения у себя и окружающих за плохое отношение. Сделайте это один-два раза, и вы очень быстро избавитесь от хандры. Начав искренне просить прощения за негативное влияние на окружающих, вы научитесь не ныть, а побеждать.
Раздвиньте границы своих возможностей
7. Определите, какие страхи сковывают ваши действия. Чтобы расширить пределы своих возможностей, нужно сначала осознать, с чем имеешь дело, что пугает вас, что вы боитесь признавать. Успех приходит тогда, когда вы смотрите своим страхам прямо в лицо и признаете свои слабости.
8. Заставляйте себя прилагать дополнительные усилия, даже если это кажется невозможным. Вы можете думать, что отдаетесь делу на все 100%, но вряд ли это так. Откровенно говоря, так не бывает. Это чистые выдумки. Приложить дополнительное усилие — значит совершить еще одно необходимое действие. Это боль, которую вы готовы терпеть, пока не получите то, что хотите.
9. Не беспокойтесь о том, что подумают другие. Прислушиваться к чужому мнению — вот первая причина поражения. Вы готовы пожертвовать своим будущим в угоду глупому критику?
Нелепо быть так сильно озабоченными тем, что о нас подумают люди. Почему бы не перестать притворяться великолепным, а просто взять и стать им?
10. Сознательно выбирайте сложные ситуации, которые вполне могут обернуться неудачей. Любой может стать победителем, когда победа дается легко. Это не вызов. Однако именно так поступает большинство из нас: мы побеждаем, если не требуется прилагать много усилий. Если же вы хотите раздвинуть границы своих возможностей, вам нужно смириться с вероятностью неудачи. И многим рискнуть.
11. Ставьте все под сомнение. Если вы оказались в каких-то обстоятельствах, это еще не значит, что именно так все и должно быть. Это говорит лишь о том, как обстоит дело сейчас. Раздвинуть границы возможностей — значит увидеть ситуацию такой, какова она есть, и подвергнуть ее сомнению. Бросить вызов реальности. Поверить в то, что ваша воля сильнее обстоятельств.
Завершите гонку
12. Приготовьтесь к долгому пути. Поддерживайте себя в хорошей психологической, физической и финансовой форме. Вносите вклад в свою мечту, думая о долгосрочных последствиях своих действий. Не делайте того, что не пройдет проверку временем.
13. Вы можете падать по пути, но всегда поднимайтесь. Не отчаивайтесь из-за неудач. Вы можете пострадать, такое случается. Но чем чаще вы падаете, тем быстрее нужно подниматься. Каким бы ни был ущерб, вы выживете. Даже в самых неблагоприятных, немыслимых обстоятельствах.
14. Важно не то, каким будет следующий шаг; важно идти вперед. Если вы действуете правильно, просто делайте следующий шаг. Перестать делать что-то правильное раньше, чем ваши действия дадут результат, все равно что допустить ошибку.
15. Все, кто участвует в гонке, устали так же, как и вы. Если вы все еще продолжаете бороться, оглянитесь вокруг: люди испытывают такие же чувства. Им ничуть не проще. Да и вам не сложнее, чем им. Просто осознайте боль и решите, что жажда успеха сильнее, чем желание избежать боли.
Планируйте свой успех
16. Планируйте работать даже больше, чем можно себе представить. Вам не обязательно переезжать в Кению, чтобы потеть под жарким солнцем, готовясь побить мировой рекорд, но, возможно, вам придется провести десяток бессонных ночей, пока дойдете до финиша. Свой путь нужно планировать. Успех и размеренная жизнь несовместимы. Чтобы стать успешным, нужны экстремальные усилия, а не обычная 40-часовая рабочая неделя. Нужно планировать работать больше, чем можно себе представить, а затем удваивать усилия.
17. План должен быть не просто нацеленным на победу, он должен быть дерзким. Нужно не просто работать, надеясь на успех, а планировать победить. Это не имеет отношения к случайному успеху или везению.
Большинство из нас живет защищаясь: работает ровно столько, сколько нужно, чтобы оплачивать счета и ездить в отпуск каждый год.
Мы беремся за работу, которая повышает нашу способность выжить, но при этом лишает шансов жить по-настоящему. Мыслите масштабно. Меняйте мир.Суровая дисциплина начинается с плана.
18. Планируйте работать не в центре внимания. Вы не можете планировать победу, если стараетесь обратить на себя внимание. Этот трудный, но очень важный урок нужно усвоить, если вы собираетесь достичь выдающегося успеха. Выглядеть впечатляюще и производить впечатление не одно и то же. Вы можете потратить впустую годы, создавая видимость успешности. Это очень отвлекает от цели. Просто будьте великолепны — и люди вас заметят. Обещаем.
19. Планируйте потерпеть одно-два поражения на пути к победе. Так происходит чаще всего. Если у вас все получилось с первого раза, задайте себе вопрос, достаточно ли амбициозной была ваша цель.
Вы должны быть готовы к тому, что первые несколько, а то и десятки попыток окончатся неудачей.
Извлеките ценные уроки из поражения и планируйте, как действовать дальше, до победного конца.
Проявляйте благодарность
20. Ищите позитивные стороны в каждой ситуации. Трудно быть благодарным, видя только невзгоды и огорчения. Заставьте себя находить счастливые моменты в жизни — приятные, прекрасные и вдохновляющие. Ваш мозг переключится на режим благодарности и начнет замечать все хорошее, что происходит вокруг. Что вы ищете, то и находите. Представьте, как легко быть благодарным, когда вокруг все замечательно.
21. Записывайте все и перечитывайте. Записывать великолепные события — очень эффективный метод развития щедрости. Вы словно документируете свой опыт. А что может мотивировать лучше, чем напоминание о радости предыдущих побед? Записывая все положительные моменты жизни, вы создаете преграду между своими страхами и реальностью. Здесь, на бумаге, все написано черным по белому.
22. Перестаньте суетиться; притормозите. В суматохе дней большинство из нас так беспокоятся и раздражаются, что редко приостанавливаются, чтобы увидеть вещи такими, какие они есть, чтобы понять, как все хорошо на самом деле.
Начните останавливаться. Медитируя, выполняя упражнения или просто читая в одиночестве, успокойте свой ум и дайте проявиться красоте жизни.
23. Чаще говорите «спасибо». Практика благодарности — эффективный способ разжечь в себе творческую искру. Говоря «спасибо», вы оказываете на свое психологическое состояние благотворное воздействие. Просто произнесите это слово, и у вас улучшится настроение. Приучите себя благодарить и делайте это почаще. Этот «легкий наркотик» открывает путь к великим свершениям.
24. Смейтесь над собой. Одна из причин нашей неблагодарности заключается в том, что мы воспринимаем жизнь слишком серьезно. Иногда достаточно посмеяться над обстоятельствами, чтобы открыть перед собой необычайные перспективы и новые пути достижения успеха. Вы можете злиться сколько угодно, но, осознав абсурдность происходящего, сумеете увидеть новые возможности и воспользоваться ими.
Любите больше
25. Будьте уязвимы. Ставьте себя в положение, в котором возможно испытать душевную боль. Это непростой, но один из лучших способов, который позволяет возможностям найти вас. Если вы по-настоящему заботитесь о других и они чувствуют вашу отзывчивость, они протянут вам руку помощи и захотят помочь вам добиться успеха.
26. Будьте честны. Если вы причиняете боль окружающим, обижаете их, проще простого спрятаться от правды. Но так вы только солжете себе. А ложь и любовь в одном образе жизни несовместимы.
Чтобы научиться любить, вы должны быть предельно честны сами с собой в отношении своих ограничений и потенциала роста.
27. Будьте целеустремленны. Сознательно планируйте оказывать воздействие на жизнь других людей. Всеми силами старайтесь быть щедрым и рассудительным. Не ждите, пока кто-то споткнется и упадет, чтобы броситься ему на помощь. Смотрите вокруг и активно подбадривайте тех, кто, может быть, страдает молча.
Автор телеграм-канала «Экологиня» Елизавета Юсуповская рассказала, почему три года вела блог анонимно, а сейчас решила стать публичным спикером. Как меняется эко-повестка в медиа и как поддерживать интерес аудитории
— «Экологиня» с момента своего создания был анонимным телеграм-каналом, имя Елизаветы Юсуповской никогда не фигурировало. Сейчас фокус смещается в сторону публичности. С чем это связано?
— Я три года веду канал как анонимный автор, и у меня всегда была четкая позиция: не хочу становиться блогером и публичным лицом, чтобы контент в канале напрямую ассоциировался со мной. Сейчас я поняла, что проекту нужно дать рост и расширить тематику. В ближайшее время начну публиковать от имени Лизы, а не от анонимного собирательного — Экологини, рассказывать больше про свою жизнь, брать интервью у людей, которые меня интересуют, участвовать в мероприятиях, читать лекции.
— То есть в планах больше уйти в блогерство?
— Телеграм-канал — это тоже блог, не важно, кто за ним стоит. Там всегда было мое личное я, всегда высказывалось мое мнение. Но еще в первые годы, когда я начинала вести канал, многие мои коллеги по цеху, авторы других каналов, мне говорили, что экология — это такая тема, где очень важно лицо.
Чтобы вовлечь людей, зажечь их, принести какую-то гуманистическую идею, нужно показывать пример. И люди в первую очередь из симпатии к автору берут с него пример.
А я все-таки долгое время вела блог анонимно, несмотря на то, что там фигурировали моя позиция, личные местоимения и прочее, это больше был новостной паблик без моего личного присутствия. А сейчас я говорю: «Привет, я Лиза, я люблю экологию, но я не идеальный человек. Я иногда пью кофе из пластикового стаканчика, не могу читать книги в электронном формате, а значит ради моего удовольствия вырубаются деревья».
— Почему тогда решились на деанонимизацию?
— Раньше я этого боялась, потому была некая концепция, что человек, который стоит за темой, должен быть идеальным образцом для подражания. Потому что если у тебя есть аудитория, ты несешь перед ней ответственность. И помимо людей, которые с тобой согласны, есть еще люди, которые с тобой не согласны. И за каждый пластиковый стаканчик будут писать тебе ехидный комментарий. Мне не хотелось сталкиваться с негативной реакцией в свою сторону, потому что я видела, как многих эко-блогеров в инстаграме она морально дестабилизирует.
А сейчас я решила, что это может быть плюсом, потому что лично мне приятнее смотреть на живых людей, которые ошибаются, делают что-то не так, чего-то не знают. С них проще брать пример, они ближе мне как ролевые модели, потому что они живые.
Сейчас тема экологии в повестке. Это можно видеть по количеству магазинов, брендов, рекламных компаний. И у людей возникает усталость от постоянного экологического инфошума о том, что планете осталось недолго, мы утопаем в мусоре. Появляется тревожность и выгорание, потому что человек думает: я так стараюсь, сортирую мусор, а мне все равно отовсюду говорят, что мы умрем. Это классно, если человек взял многоразовый стаканчик и сортирует мусор, но это также нормально, если он в один день выбросит свою бутылку просто в общий бак или купит себе не экологичную толстовку, и она его порадует.
Экологичные привычки Лизы Юсуповской:
- Я варю варенье. Мне нравится готовить еду, делать закрутки, засушивать инжир. У меня, как у бабушки в квартире, есть гирлянды с травами и фруктами и банки в холодильнике.
- Я не люблю секонд-хенды. Эта привычка у меня не прижилась, поскольку в секонд-хенде сложно найти одежду по размеру, но есть большой соблазн купить, потому что это дешево. А потом ты это не носишь. Я сторонник того, чтобы влюбиться в какую-то вещь, купить ее и не искать потом альтернатив. Я за локальное потребление, поддерживаю российских дизайнеров, предпочитаю хендмейд или «Авито», если мне нужно что-то из масс маркета.
- Люблю делать очищающие жидкости для дома, потому что сода и уксус — наши лучшие друзья.
- Раздаю книги друзьям или отдаю в буккроссинг. Если я читаю книгу в путешествии, я оставляю ее там, подписываю, отмечаю страницы, которые мне полюбились, и отправляю ее в великое путешествие.
- С одеждой у меня есть ритуал — отправление ее в мир «Авито». Раз в несколько месяцев я перебираю свой гардероб и смотрю, что я не ношу, на что положили глаз подруги и уже не жалко отдать им, что можно продать, а что — обрезать, перешить и начать заново наслаждаться этой вещью.
- Так же с упаковкой. Можно отложить ее до Нового года и упаковывать в нее подарки. Забавно, когда отложил оберточную бумагу, подарил в ней что-то друзьям, а на следующий год в этой же обертке или пакете тебе возвращается обратно подарок. Даже упаковка может жить 5–7 циклов до того, как будет сдана на переработку.
— Как появилась идея вести эко-блог?
— Все просто, я — книжный редактор. Работать с текстом, писать, выражать мысль через текст для меня всегда было одним из самых интересных занятий. В какой-то момент появились первые эко-блогеры, и меня захватила эта тема на эстетике. Мне понравилось смотреть на макароны в баночках. Что можно не покупать пакетированный чай, а собирать какие-то листики летом и засушивать. Что можно носить с собой такой классный аксессуар как многоразовая чашка и гораздо более атмосферно пить кофе. А потом я постепенно перешла к идейности, когда узнала про Тихоокеанское мусорное пятно, вымирание китов и косаток от человеческого промысла.
Я подумала, что можно совместить два в одном: оттачивать свое писательское мастерство и нести идею в мир, что экология — это здорово и весело. Я начинала со своих друзей, ввязывалась в перепалки на тему того, как одна стеклянная или металлическая трубочка может повлиять на мировую экологию. Когда поняла, что людям это интересно, что они тоже заряжаются этой темой, поставила себе задачу — просто писать для себя, регулярно копаться в теме, находить что-то новое и освещать это событие. На канал начали подписываться люди. Мне стало интересно, я начала развивать это дело и взяла несколько рекламных публикаций в соседних блогах. И все настолько хорошо пошло, давало такое удовольствие, люди с таким воодушевлением это воспринимают, что меня затянуло очень надолго.
Меня всегда подстегивала мысль, что блог растет, там становится больше людей. Если кому-то уже стало скучно и он перегорел, то появляется новый человек, который впервые вообще слышит, что биоразлагаемый пластик на самом деле никак не разлагается, и приходит от этого в ужас. И я вспоминаю, как сама пришла в ужас, когда впервые это услышала.
Когда мне интересно, я могу зарядить аудиторию. Посмотрите, там еще не все изведано. Есть не только zero waste и сортировка, а еще киты, пираты и Джастин Бибер с пластиковыми стаканчиками.
— В чем заключается мастерство ведения эко-блога, как находить новые темы?
— Информацию я стараюсь брать отовсюду. Читаю про экологию все, что мне встречается в интернете, на улицах, в сплетнях друзей. Стараюсь это верифицировать. Если мне интересно — я об этом напишу. Смотрю российские и зарубежные СМИ. Я правда считаю, что надо иногда освещать меры господдержки, потому что существует миф, что Германия, Швеция — очень экологичные страны, у них уже все налажено, государство для них все сделало, и поэтому они живут припеваючи и сортируют. А у нас ничего такого не происходит, мы бедные и будем ждать когда до нас это доберется. А ждать ничего не нужно, потому что уже многое делается.Я — не эколог, я — интересующийся человек, и глубоко лезть в научную тему не могу. Я доверяю это дело профессионалам и выкорчевываю из того, что они пишут, самое интересное. Смотрю, может эта тема еще кем-то освещалась, а может есть альтернативное мнение или уже вышло опровержение.
Иногда в Instagram что-то попадается. Мне очень нравится находить мемы с модернизированными демотиваторами. «А вы знали, что китайцы вырубают наш лес?». Я начинаю проверять, потому в таких мемах по большей части либо неправдивая информация, либо она как-то однобоко подана. Там есть к чему прицепиться. И иногда занимаюсь разоблачением таких картинок. Да, китайцы вырубают наш лес, но это только одна сторона ситуации, русские тоже прекрасно вырубают лес.
— Значит, фактчекинг и юмор очень важны для блога. Какие еще приемы можно использовать, чтобы вызвать интерес широкой аудитории?
— Новости о животных — вот это всегда хорошо. Теории заговоров. И если получится сделать какое-то разоблачение, то это вообще просто потрясающе. Такое всегда интересно тем, кто с экологией даже особо не соприкасается.
Сейчас главное не сосредотачиваться на том, что экология — это только реформы, сортировка, вторичное потребление и грязный воздух. Если брать самое широкое понятие экологии в принципе — симбиоз природы и человека — то можно найти гораздо больше интересных тем.
От одной сортировки очень быстро устаешь. Все об этом пишут, очень много инструкций, очень много повторяющейся информации. И тут хочется иногда что-то уникальное находить, а потом уже привязывать это к экологии с той точки зрения, что вот он мир, в котором мы живем, посмотрите какой он классный. И если вы хотите ему чем-то помочь, то вот вам корзинка для сортировки.
Мы же не только ради чистого воздуха, чистой воды и отсутствия мусора живем. Вот эти вещи у большей части населения эмоций не вызывают. Исследования показывают, что проблемы воздуха и вырубки лесов больше волнуют жителей Сибири, потому что там много промышленных предприятий, и там люди видят из окна, как этот лес вырубается. Для них это страшно, и они понимают суть этой проблемы.
А жителю Москвы кажется, что в принципе чисто и воздух нормальный, в какой-то момент становится непонятно, а что с экологией не так.
А если рассказать про историю с косатками или про экологическую катастрофу на Камчатке, то ты видишь, сколько в мире всего прекрасного, ты можешь получить к этому доступ, а у тебя могут это отнять. И тогда сортировка приобретает какой-то смысл. Мне нравится формулировка «сохранить планету», потому что она даже самому маленькому действию придает глобальный смысл. И мы все становимся такими немножко героями. Потому что классно, когда мы делаем маленькое дело во имя большой цели. И большую цель нужно людям регулярно показывать.
— Гринвошинг и спекуляция на экологических темах присутствует и у эко-блогеров. Можно ли с этим как-то бороться?
— Гринвошинг — очень сложная тема. Потому сейчас гринвошингом можно назвать практически все, но в экологии нет черного и белого. Например, электромобили. В какой-то момент все начали говорить, что это — идеальная альтернатива обычному автомобилю. Да, электромобиль лучше для экологии, потому что не загрязняет ту улицу, по которой едет. Но он будет загрязнять природу в том месте, где стоит электростанция, производящая для него батареи. И он будет еще больше загрязнять окружающую среду, когда умрет и его надо будет как-то утилизировать, потому что это практически невозможно сделать. Получается, что человек, который топит за электромобили, в какой-то мере занимается гринвошингом. Можно ли его в этом обвинить? И да, и нет, смотря какая у него цель.
А каждый раз к любой информации делать сноску бессмысленно, потому что цель — призвать к действию. Если ты сразу будешь его обесценивать, то и побуждение к этому действию будет слабее.
В экологии очень много переворачивания фактов и всяких нагнетающих фраз: «планета умирает», «экологическая катастрофа», «климатический кризис». Это все полуправда. Но это делается для того, чтобы как-то обозначить цель и критичность проблемы.
К гринвошингу я отношусь плохо, когда там нет вот этой полуправды. Но я прекрасно понимаю, как работает маркетинг и экологическая пропаганда, где-то это действительно нужно. Не убедить человека, не сгустив краски. Все периодически пользуются этим приемом. Но тут надо самому человеку некий скепсис воспитывать в себе и экологическую образованность, чтобы разобраться в полутонах сгущения красок.
— Есть ли в блоге «Экологиня» внутренняя цензура?
— Внутренней цензуры у меня нет. Я не так много пишу про секс. Я понимаю, что разная аудитория подписана на канал, и кого-то можно этой темой отпугнуть. Если я пишу о жестоком отношении к животным или об охоте, я предупреждаю от этом, либо стараюсь подобрать более нейтральные изображения. Я стараюсь не уходить в радикальную историю. Я считаю, что это продуктивно, но для меньшего количества людей. А мне бы хотелось показать, что экология доступна всем. Я не высказываюсь по поводу религии и политики в общем, если там не экологической составляющей. Я могу про это поговорить в жизни. А в эко-блоге хочу говорить про экологию.
— Со временем в любом, даже самом интересном проекте может случиться выгорание. Что придает сил не останавливаться и развивать блог?
— Были моменты, когда было тяжело. Я даже просила аудиторию написать пару приятных слов, что им это важно и интересно. Это такой лайфхак, чтобы зарядиться и понять, что ты все правильно делаешь.
«Глобальное потепление — это выгорание миллениалов». Это моя любимая шутка про выгорание.
Мне очень нравится, когда читатели скидывают фотографии: посмотрите, я убрал двор, или почистил пляж, или цветочки посадил рядом с домом. Телеграм-канал — не очень двусторонняя площадка, скорее односторонняя. Поэтому когда человек добирается до того, чтобы мне написать, это вдвойне приятно. Очень классно, знакомясь с человеком, узнать, что он подписан на «Экологиню». Бывало так, что на работе я прохожу мимо стола, а человек канал листает. Это дополнительный стимул, чтобы заниматься моим делом.
— Сколько времени занимает этот проект?
— Где-то час в день, разрозненно по дню — 15 минут тут, 10 минут там. Я уже привыкла, это моя ежедневная рутина.
— Получается зарабатывать на канале?
— Сейчас я начала немного зарабатывать. Это не такие большие деньги. Но это всегда приятно, когда ко мне обращаются бренды, которыми я пользуюсь сама, им доверяю и обращаюсь к ним без какого-либо запроса. Деньги в какой-то мере являются физическим доказательством того, что у тебя все получается, это тоже мотивация.
— Переход к публичности означает, что проекту нужно будет уделять больше времени?
— Я хочу участвовать в мероприятиях и делать проекты с брендами, с компаниями, с блогерами. Мне интересно читать лекции. Сейчас меня позвали прочитать лекцию для школьников про экологические катастрофы. Это, естественно, будет занимать больше времени, но это придает динамики и вырывает из рутины. Когда ты можешь не только тексты писать, а еще где-то очно присутствовать, репортаж сделать, интервью взять. Это саморазвитие и выход за рамки комфорта, потому что к публичности я не привыкла, но надо расти.
Когда что писать
Если руководитель уезжает в командировку, на его место назначают врио — это временно исполняющий обязанности. Назначают заместителя на время и в других ситуациях, когда начальник в отпуске или на длительном больничном.
Когда должность вакантна и идет поиск кандидата, лицо, которое выполняет функции руководителя, называют исполняющим обязанности. Посмотрите в примере, как пишется должность исполняющий обязанности, — и.о., а затем сама должность.
Сокращение используют и в том случае, если должность выборная и речь идет об испытательном сроке для одного из кандидатов.
Исполняющий обязанности — лицо, назначенное выполнять функции до тех пор, пока на должность не назначат основного работника, а временно исполняющий обязанности — замещающее основного сотрудника лицо.
Особое мнение
Павел Сафоненков
Заместитель председателя президиума Коллегии адвокатов «Союз московских адвокатов», к.ю.н.
С юридической точки зрения, «и. о.» и «врио» синонимами не являются. «И. о.» говорит об исполнении дополнительных обязанностей работником по должности, являющейся вакантной, до назначения на эту должность нового работника. Работник совмещает свою основную должность и ту, которая является вакантной. «Врио» добавляется к названию должности в случае замещения и исполнения должностных обязанностей временно отсутствующего работника до его выхода. При этом, как показывает практика, работник либо временно переводится на новую работу, либо совмещает ее с предыдущей.
Надо заметить, что для определения размера доплат при временном заместительстве до настоящего времени применяется Разъяснение Госкомтруда СССР, ВЦСПС от 29.12.1965 № 30/39 (ред. от 11.12.1986, с изм. от 11.03.2003) «О порядке оплаты временного заместительства», в соответствии с п. 1 которого, замещающему работнику выплачивается разница между его фактическим окладом и окладом замещаемого работника. Определением ВС РФ № КАС 03-25 от 11.03.2003 отменено ограничение в оплате труда специалистов, замещающих отсутствующего руководителя, как противоречащее ТК РФ. Правовые положения, относящиеся к этим вопросам, отчасти содержатся в ст. 151 и 74, 72.1, 60.2 ТК РФ.
Но следует признать, что должного правового регулирования данных вопросов нет, и по этой причине до сих пор возникают и теоретические дискуссии, и сложности в правоприменительной практике.
Как расшифровать и правильно использовать акроним «врио»
Акроним, или более привычно — аббревиатура, расшифровывается как Вр(еменно) И(сполняющий) О(бязанности). Слово «врио» не склоняется, относится к существительным общего рода, потому сокращение «временно исполняющий обязанности» — врио — используют для обозначения должностей, которые занимает как мужчина, так и женщина.
Но при этом акроним согласуется с другими частями речи как мужского, так и женского рода. Правильно говорить «новый врио», если речь идет о мужчине, и «новая врио» — если о женщине.
Еще один момент: если с акронима начинается предложение, первая буква — заглавная, как этого требуют правила русского языка. Если сокращение используют в середине предложения, то все буквы прописные.
Что означает «и.о.» директора (начальника)
Сокращение «и.о.» появилось от слов И(сполняющий) О(бязанности). Отличается от «врио» всего двумя первыми буквами. Но с правовой позиции разница огромная, и если не знать, как сокращать исполняющий обязанности директора, появится ошибка.
Как и акроним «врио», сокращение применяют как к мужчине, так и к женщине, а в зависимости от места нахождения в предложении первая буква либо маленькая, либо большая.
На что еще важно обратить внимание: как писать в документах «исполняющий обязанности директора» и «временно исполняющий обязанности». Если используют аббревиатуру «врио», то никаких точек между буквами или после последней буквы не ставят. Если вписывают «и.о.», после каждой буквы — точка. Объяснить, почему акронимы пишутся по-разному, сложно: филологи говорят, что это устойчивые выражения.
Акронимы в делопроизводстве
Когда используют сокращения
Когда разобрали основные правила, как правильно пишется «врио начальника» и «и.о. руководителя», отметим, что оба сокращения уместны в документах и публицистике. В разговорной речи их используют редко, и филологи рекомендуют использовать выражения полностью.
Что касается правил, как пишется «врио» в документах или «и.о.», то такие «приставки» делают исключительно перед должностью лица в родительном падеже, затем следует фамилия руководителя. Никаких других вариантов не допускается.
Как правильно их писать
Покажем несколько примеров, как правильно пишется «и.о. директора» или «врио начальника», и ответим на каверзные вопросы:
- Как правильно использовать во множественном числе? Есть два варианта:
- и.о. директора (разные исполняющие обязанности директора одной организации);
- и.о. директоров (разных организаций).
- «Исполняющий обязанности» с большой или маленькой буквы? В случае сокращения все буквы маленькие.
- Если сокращение стоит в начале предложения, необходимо писать «и.о.» или «И.о.»? В начале предложения, по правилам русского языка, ставится заглавная буква. Это правило действует и в этом случае, пишем с большой.
- И.о. сказал или сказала? Как и в случае с врио, это зависит от пола того, кто занимает должность и что-то сказал.
Обязательно ли использовать сокращения в делопроизводстве
Необязательно, но желательно. Но только перед должностью, название которой стоит в родительном падеже. И только строчными буквами. Это экономит место и более выигрышно смотрится при оформлении писем и другой документации. Сравните оба варианта.
Язык Си — один из наиболее влиятельных языков программирования за всю историю. Он стал незаменимым инструментом разработки операционных систем, сместив с этого пьедестала языки ассемблера. Изучение Си обязательно для любого уважающего себя программиста. Этот язык любим за свою внешнюю простоту и ненавидим за беспощадность к ошибкам. Благодаря ему у нас есть ядро Linux и тысячи уязвимостей в нём же в придачу. Попробуем понять, что же такое этот противоречивый язык Си — благословение или проклятие?
История языка Си берёт свое начало в недрах американской компании Bell Labs и тесно связана с судьбой операционной системы UNIX. Ее создатели, Кен Томпсон и Деннис Ритчи, разрабатывали свой проект для компьютеров PDP-11, и первые два года их основным инструментом был язык ассемблера. Трудоёмкость написания машинного кода вынуждала искать ему замену, которой в конечном итоге и стал язык Си. С его помощью было полностью переписано ядро операционной системы и большая часть утилит. Язык Си позволял создавать эффективные низкоуровневые программы на PDP-11, практически не используя при этом язык ассемблера.
Со временем встал вопрос портирования UNIX на новые аппаратные платформы. Использование языка Си значительно упростило эту задачу. Ведь если бы в разработке применялся только язык ассемблера, то тогда операционную систему пришлось бы переписывать под каждую компьютерную архитектуру. С другой стороны, исходники UNIX все еще содержали немало кода, созданного специально для компьютера PDP-11. Да и сам язык Си далеко не всегда точно отражал особенности и детали той или иной аппаратной платформы. Последнее еще больше затрудняло процесс переноса и лишало язык одного из его главных достоинств — прозрачной и понятной генерации машинного кода. Чем больше компьютерных архитектур захватывал Си, тем менее очевидной становились его связь с низким уровнем.
В процессе миграции UNIX на новые аппаратные платформы обнаружилась ещё одна проблема. Портированные программы на языке Си исполнялись медленнее, нежели можно было от них ожидать. Чем сильнее отличалась целевая компьютерная архитектура от PDP-11, тем менее эффективным был получаемый код. Чтобы скомпенсировать этот недостаток, разработчики компиляторов всё чаще стали применять неявные оптимизации. И хотя такое решение и улучшало производительность самих программ, Си всё больше отдалялся от низкого уровня. Теперь приходилось не только понимать, как именно определялись конструкции языка для каждой из компьютерных архитектур, но также и то, как они оптимизировались. Разумеется, любой компилятор самостоятельно решал, как именно транслировать исходный код для каждой аппаратной платформы. В итоге написать на языке Си низкоуровневую программу, независящую от используемого компилятора, стало практически невозможно.
Необходимо было понять, как эффективно реализовать высокоуровневые конструкции языка Си, сохранив при этом его низкоуровневые свойства. Попыткой решить эту проблему стала публикация в 1989 году первого стандарта языка. Его принято называть «ANSI C» или «C89», и именно на него мы будем ссылаться в дальнейшем. Создатели стандарта решили окончательно разорвать связь Си с архитектурой PDP-11 и сделать язык полностью высокоуровневым. Была введена так называемая «абстрактная машина» — воображаемый исполнитель кода на языке Си (раздел 2.1.2.3, «Program execution»):
Семантические описания в этом Стандарте описывают поведение абстрактной машины, в которой вопросы оптимизации не имеют значения.
Это означает, что оптимизации компилятора не будут влиять на работу программы, пока её исходный текст согласуется со стандартом. Абстрактная машина должна была решить две проблемы одновременно. Во-первых, следование стандарту давало возможность создавать легко переносимые программы на языке Си. Во-вторых, абстрактная машина могла предоставить компиляторам свободу для оптимизаций. Вот только возникает вполне резонный вопрос — а чем тогда язык Си отличается от любого другого компилируемого языка высокого уровня? Ответ кроется в тексте стандарта. Чтобы всё-таки дать теоретическую возможность программистам писать низкоуровневые процедуры, а значит непереносимые, было введено ещё одно понятие — неопределённое поведение (undefined behavior, раздел 1.6, «DEFINITIONS OF TERMS»):
Неопределённое поведение — поведение при использовании непереносимой или ошибочной программной конструкции, ошибочных данных или объектов с неопределёнными значениями, для которых стандарт не накладывает никаких требований. Возможное неопределённое поведение варьируется от полного игнорирования ситуации с непредсказуемыми результатами, поведения во время трансляции или выполнении программы задокументированным образом, характерным для среды (с выдачей диагностического сообщения или без него), до прекращения трансляции или выполнения (с выдачей диагностического сообщения).
Проще говоря, неопределённое поведение — это специально оставленные дыры в описании абстрактной машины языка Си. Они позволяют компиляторам самим решать, как поступать с теми или иными конструкциями языка, о поведении которых текст стандарта намеренно умалчивает. В том числе они могут быть восприняты как недопустимые в тексте программы. Давайте подробнее разберем неопределённое поведение на конкретном примере.
Возьмём следующий фрагмент кода на языке Си:
int x = 1;
x = x << sizeof(int) * 8;
Попробуем предположить, какой результат у нас получится. Допустим, мы скомпилировали этот код для процессоров архитектуры ARM. Инструкция битового сдвига в рамках этой аппаратной платформы определена так, что итоговым значением переменной «x» должен быть «0». С другой стороны, мы можем транслировать нашу программу в машинный код архитектуры x86. И уже там битовый сдвиг реализован таким образом, что значение «x» не изменится и останется равным «1». Мы могли бы сделать вывод, что результат работы данного фрагмента кода зависит от того, для какой аппаратной платформы мы его скомпилировали. Но на самом деле это не так.
В действительности данный фрагмент кода может быть обработан компилятором любым возможным и невозможным образом. Причина в следующем: согласно тексту стандарта языка Си битовый сдвиг на величину, большую или равную размеру выражения в битах, является неопределённым поведением. Получается, нет никакой гарантии, что этот кусок кода вообще будет работать. В действительности, даже в рамках одной архитектуры один и тот же компилятор может сгенерировать совершенно разные исполняемые файлы. Приведём примеры компиляции и запуска программы с печатью значения переменной «x». В обоих случаях мы используем компилятор gcc версии 10.2.1 для целевой архитектуры x86-64.
$ cat test.c
#include <stdio.h>
int main()
{
int x = 1;
x = x << sizeof(int) * 8;
printf("%dn", x);
return 0;
}
$ gcc test.c -o test
$ ./test
1
$ gcc -O test.c -o test
$ ./test
0
Флаг «-O» разрешает компилятору gcc использовать оптимизации исходного кода. То, какие именно механизмы оптимизации могут быть применены, а также какие флаги за них отвечают, зависит от конкретного компилятора. В общем случае невозможно узнать, каким образом будет обработано неопределённое поведение в программе при трансляции исходного кода. Поэтому единственный способ написания переносимых программ на языке Си — это полное избегание неопределённого поведения при разработке.
Рассмотрим чуть более сложный пример. Ещё одной разновидностью неопределённого поведения является разыменование нулевого указателя. Его тривиальным вариантом будет следующий фрагмент кода:
* (char *) 0;
Разумеется, никто в здравом уме не станет писать что-то подобное в своей программе. Однако совсем необязательно делать разыменование нулевого указателя явным образом, чтобы вызвать неопределённое поведение. В цикле статей «What Every C Programmer Should Know About Undefined Behavior» на сайте blog.llvm.org приводится фрагмент кода, подтверждающий это:
void contains_null_check(int *p)
{
int dead = *p;
if(p == 0)
return;
*p = 4;
}
Пример может показаться надуманным, но он позволяет немного лучше понять работу компилятора языка Си. Последний использует различные механизмы оптимизации, но здесь нам интересны лишь два. Один из них удаляет лишний, «мертвый» код, а второй вычёркивает бесполезные проверки на нулевой указатель. Если к вышеописанному фрагменту кода будет применён первый механизм оптимизации, то он преобразует функцию следующим образом:
void contains_null_check(int *p)
{
if(p == 0)
return;
*p = 4;
}
Затем второй механизм не обнаружит лишних проверок на нулевой указатель, и исходный код функции примет свой итоговый вид. Однако в действительности порядок оптимизаций может быть и другим. К примеру, компилятор вправе первым делом исключить лишние проверки на нулевой указатель, и тогда функция будет преобразована уже следующим образом:
void contains_null_check(int *p)
{
int dead = *p;
if(0)
return;
*p = 4;
}
Так как мы разыменовываем указатель до его проверки, то компилятор спокойно решает, что сам указатель никогда не будет нулевым. Благодаря этому сравнение «p == 0» заменяется на выражение, всегда возвращающее ложь. Затем компилятор запускает первый механизм оптимизации и убирает «мертвый» код:
void contains_null_check(int *p)
{
*p = 4;
}
Важно подчеркнуть, что обе этих оптимизации являются верными. Удаление проверки может стать неожиданным подарком недостаточно внимательному программисту от разработчиков компилятора. Такой код способен создать уязвимость для программ, работающих без защиты памяти, т.е. ядер операционных систем или прошивок микроконтроллеров. Безусловно, данный пример содержит ошибку, однако главная проблема не в ней, а в том, как компилятор её обрабатывает.
Предположим, вы случайно допустили в своей программе неопределённое поведение. В лучшем случае вы сразу же обнаружите ошибку и исправите её. В не столь удачном — сделаете это не сразу. Однако гораздо вероятнее ситуация, что компилятор не станет использовать вашу оплошность себе на пользу. В таком случае неопределённое поведение останется в исходном коде программы до тех пор, пока не объявится в самый неподходящий момент. А такой момент может наступить при смене: целевой компьютерной архитектуры, компилятора или даже его версии, флагов оптимизации или вообще каких угодно флагов. Проще говоря, неопределенное поведение — это бомба замедленного действия. Когда она рванет — непонятно, но можно только догадываться, сколько интересных сюрпризов хранят в себе исходные коды тысяч программ.
Оптимизации компилятора могут затрагивать также и функции стандартной библиотеки языка Си, в том числе, к примеру, memset. Она широко и печально известна за обилие ошибок, которые допускают программисты при её вызове. Заголовок функции выглядит следующим образом:
void *memset(void *ptr, int value, size_t num);
memset записывает «num» байтов со значением «value» по адресу «ptr». Несмотря на то, что параметр «value» имеет тип int, в действительности используется лишь его младший байт. Функция активно применяется для обнуления больших массивов данных, однако компилятор и сам частенько любит вставить её вызов туда, где это нужно и не очень. Так, любопытный случай обсуждался 15 апреля 2018 года на форуме osdev.org. Пользователь под ником ScropTheOSAdventurer создал тему, в которой рассказал о процессе разработки собственной учебной операционной системы. На свою беду он разрешил компилятору оптимизировать исходный код проекта, в результате чего последний перестал работать. В процессе отладки программист обнаружил ошибку в следующем фрагменте кода:
void *memset(void *ptr, int value, size_t num)
{
unsigned char *ptr_byte = (unsigned char *) ptr;
for(size_t i = 0; i < num; ptr_byte[i] = (unsigned char) value, i++);
return ptr;
}
Для своей операционной системы разработчик решил использовать собственную реализацию функции memset. Но он не учёл, что в процессе трансляции компилятор gcc обнаружит в этом коде весьма заманчивую возможность для оптимизации. Фактически функция была в итоге преобразована к следующему виду:
void *memset(void *ptr, int value, size_t num)
{
return memset(ptr, value, num);
}
Вполне вероятно, что среди разработчиков компилятора gcc были непревзойденные мастера софистики. В любом случае способности компилятора к оптимизациям явно превосходят все доступные человеческому разуму пределы.
Приведем еще один пример с функцией memset. Компилятор способен не только создавать её вызовы на пустом месте, но и выкидывать их из исходного кода по собственному желанию. Так, в криптографических программах зачастую бывает полезно стирать все данные из памяти после того, как они перестают быть нужными. Обычно такое поведение является избыточным, однако представим себе следующую ситуацию. Ваша программа работает с базой данных пользователей, хранящей их имена и пароли, и вы описали примерно такую функцию:
int check_password(const char *pwd)
{
char real_pwd[32];
get_password(real_pwd);
return !strcmp(pwd, real_pwd);
}
Есть лишь одна проблема — после вызова check_password в стеке останется строка с настоящим паролем пользователя. Если в вашей программе есть хотя бы одна уязвимость, позволяющая читать данные из памяти, то существует реальная вероятность украсть пароль из стека. Примером подобной уязвимости стал печально известный баг «Heartbleed». Чтобы снизить возможные риски, проще всего очистить содержащий пароль фрагмент стека:
int check_password(const char *pwd)
{
int result;
char real_pwd[32];
get_password(real_pwd);
result = !strcmp(pwd, real_pwd);
memset(real_pwd, 0, sizeof(real_pwd));
return result;
}
Казалось бы, решение найдено, однако не все так просто. Искушённый в вопросах оптимизации компилятор может решить, что вызов memset здесь лишний, и спокойно удалит его из тела функции. Действительно, для работы самой программы это действие абсолютно бесполезно. Что ещё хуже, компилятор может сгенерировать код, в котором пароль окажется в одном из регистров процессора. В таком случае получить его, используя уязвимость в программе, может оказаться еще проще. И у вас даже не получится заставить компилятор очистить содержимое регистра. Более подробно о данной проблеме можно прочитать по ссылке.
Одной из наиболее коварных разновидностей неопределённого поведения является strict aliasing. Термин может быть переведён как «строгое наложение», однако традиционного названия на русском языке у него не существует. По этой причине мы будем использовать оригинальный английский термин. Текст стандарта дает такое описание для strict aliasing (раздел 3.3, «EXPRESSIONS»):
Значение объекта должно быть доступно только с помощью lvalue-выражения одного из следующих типов:
— объявленный тип объекта,
— квалифицированная версия объявленного типа объекта,
— знаковый или беззнаковый тип, соответствующий объявленному типу объекта,
— знаковый или беззнаковый тип, соответствующий квалифицированной версии объявленного типа объекта,
— тип массива, структуры или объединения, который включает в себя один из вышеупомянутых типов среди своих членов (включая, рекурсивно, член внутренней структуры, массива или объединения),
— символьный тип.
Проще всего strict aliasing проиллюстрировать на конкретном примере:
int x = 42;
float *p = &x;
*p = 13;
Чтобы вызвать неопределенное поведение, достаточно обратиться к какой-либо переменной по типу, несовместимому с объявленным. Это ограничение можно обойти, применив символьный тип (char), на который не распространяются правила strict aliasing:
int x = 42;
char *p = &x;
*p = 13;
Вот только расчленение переменной на символы может оказаться трудоемкой задачей. Придется учитывать размер данных, а также используемый порядок байтов. Избежать неопределённого поведения можно также с помощью объединений (union):
union u { int a; short b };
union u x;
x.a = 42;
x.b = 13;
Впрочем и этот метод не лишён недостатков — объединение должно содержать члены со всеми возможными типами, которые будут использованы программой. Все это серьёзно осложняет применение «type punning» или так называемого каламбура типизации — намеренного нарушения системы типов. Эта техника необходима для более гибкого низкоуровневого управления памятью машины.
Чтобы проиллюстрировать пользу каламбура типизации, разберем небольшой пример. Допустим, вы прочитали содержимое файла с изображением в память программы. И теперь вам требуется написать функцию, которая возвращает цвет пикселя по указанным координатам. Для простоты будем считать, что размер типа int совпадает с размером пикселя, как и порядок байтов у обоих:
int get_pixel(const char *buf, int width, int x, int y)
{
buf += get_header_size(buf);
return ((const int *) buf)[y * width + x];
}
При вызове функции ей передается адрес области данных с содержимым файла, включая его заголовок, ширину изображения, а также координаты пикселя, цвет которого следует вернуть. Вместо типа int мы могли бы выбрать любой другой с известным нам размером. Но все это неважно, потому что функция get_pixel абсолютно неверна с точки зрения стандарта, так как нарушает правила strict aliasing. Чтобы использовать каламбур типизации, придется переписать весь код, связанный с используемым буфером, в том числе и тот, который ответственен за чтение файла.
Существует огромное количество примеров программ, не удовлетворяющих правилам strict aliasing. В их число входит знаменитая функция вычисления быстрого обратного квадратного корня из игры Quake 3:
float FastInvSqrt(float x)
{
float xhalf = 0.5f * x;
int i = *(int *) &x;
i = 0x5f3759df - (i >> 1); /* What the fuck? */
x = *(float *) &i;
x = x * (1.5f - (xhalf * x * x));
return x;
}
Этот код позволял вычислить обратный квадратный корень числа с плавающей точкой в несколько раз быстрее, чем с использованием арифметического сопроцессора. Впрочем, и этот шедевр черной магии не проходит проверку стандартом — похоже, что создатель культовых игр Джон Кармак совсем не разбирается в языке Си.
Остается один вопрос — зачем вообще нужен этот strict aliasing? Все дело в том, что он позволяет создателям компиляторов применять крайне агрессивные оптимизации исходного кода. Правила strict aliasing распространяются на обращения к любой памяти, в том числе и динамической. Так комитет стандартизации отметил, что следующий фрагмент кода (источник):
void f(int *x, double *y)
{
*x = 0;
*y = 3.14;
*x = *x + 2;
}
может быть преобразован таким образом:
void f(int *x, double *y)
{
*x = 0;
*y = 3.14;
*x = 2;
}
Согласно правилам strict aliasing указатель y не может содержать адрес того же участка памяти, что и указатель x. Именно этот факт и позволяет заменить выражение «*x = *x + 2» на «*x = 2». Активное использование компиляторами подобных оптимизаций сломало огромное количество старого кода. Так, в письме от 12 июля 1998 года один из разработчиков компилятора gcc Jeff Law, отвечая на вопросы по strict aliasing и связанными с ним ошибками, пишет (источник):
> Существует очень много кода, который нарушает правила strict aliasing. Одним из таких примеров является «переносимая» универсальная функция контрольной суммы IP, которая содержится в исходных кодах BSD для работы с сетями.
ИМХО, такого кода становится все меньше и меньше — современные компиляторы уже какое-то время используют strict aliasing в анализе, в результате чего люди были вынуждены исправлять свой код. Безусловно, это не относится к Linux и некоторым другим свободным проектам, так как они используют только gcc.
> Если мы начнем говорить о том, что такой код неверный, то нам лучше было бы иметь какой-то план на случай, если люди начнут спрашивать, почему их код, который работал много лет, теперь сломался.
Укажите им на стандарт языка Си
Правила strict aliasing для компилятора gcc можно разрешить, используя флаг «-fstrict-aliasing», и запретить флагом «-fno-strict-aliasing». Последний рекомендуется применять, если вы не уверены, нарушаете ли вы текст стандарта — скорее всего, нарушаете. Говоря об упомянутом в письме ядре Linux, его автор Линус Торвальдс также дал свою оценку strict aliasing в частности и работе комитета в целом. Так, критикуя желание одного из разработчиков операционной системы лишний раз перестраховаться от нарушения стандарта, Линус написал такое письмо (источник):
Честно говоря, все это кажется мне сомнительным.
И я не о самих изменениях — с этим я могу смириться. Но вот обоснование этих самых изменений — абсолютная и полная чушь, причем весьма опасная.
Дело в том, что использование объединений для реализации каламбура типизации — это обычный и СТАНДАРТНЫЙ для этого способ. В действительности он является документированным для gcc, и используется в том случае, если вы, будучи не слишком умным (оригинал: «f*cking moron»), применили «-fstrict aliasing», и теперь вам необходимо избавиться от всего того ущерба, который навязывает этот мусорный стандарт.
Энди, что послужило причиной для всего этого идиотизма? И не надо говорить мне, что текст стандарта «недостаточно ясный». Текст стандарта, совершенно ясно, является дерьмовой чушью (см. выше о правилах strict aliasing), и в таких случаях его нужно игнорировать. Для этого необходимо использовать средства компилятора, чтобы избежать ущерба. Аналогично нужно поступать и в ситуациях, где нет полной ясности.
Это то, почему мы используем «-fwrapv», «-fno-strict-aliasing» и другие флаги.
Я уже говорил об этом раньше и повторю еще раз: когда текст стандарта противоречит реальности — он является обычным куском туалетной бумаги. Он не имеет абсолютно никакой важности. В действительности, вместо него я лучше возьму рулон настоящей туалетной бумаги — так хотя бы я не испачкаю свою задницу чернилами (оригинал: «won’t have splinters and ink up my arse»).
Видимо, Линус Торвальдс плохо изучил язык Си — настоящему программисту на Си такое в голову бы не пришло.
Впрочем, одним лишь strict aliasing стандарт не полон. Чтобы вызвать неопределённое поведение, необязательно даже разыменовывать указатель:
void f(int *p, int *q)
{
free(p);
if(p == q) /* Undefined behaviour! */
do_something();
}
Использование значения указателя после того, как память по нему была освобождена, запрещено текстом стандарта (раздел 4.10.3, «Memory managment functions»):
Значение указателя, ссылающегося на освобожденную память, не определено.
Программисту важно понимать, что указатели в Си не являются низкоуровневыми. Стандарт постарался полностью искоренить какую-либо связь языка с реальным миром. Даже сравнение указателей, ссылающихся на разные объекты, объявлено неопределённым поведением (раздел 3.3.8, «Relational operators»):
При сравнении двух указателей результат зависит от относительного расположения в адресном пространстве объектов, на которые они указывают. Если указанные объекты не являются членами одной и той же структуры, массива или объединения, то результат не определён.
Вот небольшой фрагмент кода, демонстрирующий некорректное с точки зрения стандарта сравнение:
int *p = malloc(64 * sizeof(int));
int *q = malloc(64 * sizeof(int));
if(p < q) /* Undefined behaviour! */
do_something();
Однако наиболее интересным примером здесь будет служить исходный код следующей программы:
#include <stdio.h>
int main()
{
int x;
int y;
int *p = &x + 1;
int *q = &y;
printf("%p %p %dn", (void *) p, (void *) q, p == q);
return 0;
}
Если транслировать приведенный выше текст компилятором gcc, передав ему флаг «-O», то полученный исполняемый файл при запуске выдаст примерно следующую строку:
0x1badc0de 0x1badc0de 0
Остается большой тайной, по какой причине два указателя, содержащие одинаковые значения, оказались не равны. Возможно, ранее уже отмеченные нами разработчики компилятора gcc не менее искусны в трактовке текстов стандарта, чем в вопросах софистики. Проникнуться утончённой герменевтикой можно в обсуждении этого вопроса на официальном сайте организации GNU.
Большая часть примеров, связанных с работой указателей, была взята с сайта kristerw.blogspot.com. На нём вы сможете найти больше информации о текстах стандарта языка Си, а также загадочных оптимизациях компиляторов.
Может показаться, что в случае выключенных оптимизаций все вышеописанные проблемы обойдут вас стороной. Просто не передавайте компилятору флаг «-O», и вы получите тот результат, на который рассчитываете. Но на самом деле это не так. В январе 2007-ого года на сайте gcc.gnu.org пользователь под ником felix-gcc выложил исходный код следующей программы:
#include <assert.h>
int foo(int a) {
assert(a + 100 > a);
printf("%d %dn",a + 100, a);
return a;
}
int main() {
foo(100);
foo(0x7fffffff);
}
Функция foo проверяет на переполнение сумму поданного знакового числа и константы «100». Как известно, на подавляющем большинстве компьютерных архитектур отрицательные числа задаются в виде дополнительного кода. В случае переполнения такое число меняет знак на противоположный, благодаря чему проверка «a + 100 > a» возвращает ложь. В теле функции main felix-gcc дважды вызывает foo. Сначала он подает на вход число, которое не приведёт к переполнению. Затем, исходя из того, что размер типа данных int равен четырем байтам, felix-gcc вызывает foo с наибольшим положительным числом данного типа. Логично предположить, что в таком случае сравнение вернёт ложь, и assert прервёт работу программы. Однако вот какой вывод получил felix-gcc после запуска исполняемого файла:
200 100
-2147483549 2147483647
Фактически gcc решил удалить проверку на переполнение, и это при том, что никаких флагов компилятору передано не было. И что еще интереснее, ранние версии gcc при тех же условиях не убирали проверку, в результате чего получаемая программа вела себя иначе. На резонную просьбу felix-gcc исправить неожиданный баг компилятора ответил пользователь под ником Andrew Pinski. Будучи разработчиком gcc, Andrew Pinski заметил, что данное поведение не является ошибочным. Более того, он сам оказался автором изменения в коде компилятора, которое и создало столь странный результат. Далее приводится фрагмент диалога felix-gcc и Andrew Pinski. Комментарии излишни:
Andrew Pinski
Переполнение знакового числа — это неопределённое поведение в тексте стандарта языка Си, используйте беззнаковый тип или флаг «-fwrapv».felix-gcc
Вы должно быть шутите?
Различные проблемы безопасности вызваны переполнениями чисел, и вы просто так говорите мне, что в gcc 4.1 я больше не могу тестировать их для знаковых типов? Вы явно чего-то не понимаете. ДОЛЖЕН быть способ обойти эту проблему. Существующее программное обеспечение использует знаковые числа, и я не могу просто поменять тип на беззнаковый — мне все равно нужно проверить переполнение! Не похоже, что я мог бы использовать какой-нибудь обходной путь для этого. Что вы хотите от меня — чтобы я привел тип к беззнаковому, сдвинул вправо на один, затем сложил или что вообще?!
ПОЖАЛУЙСТА, ОТМЕНИТЕ ЭТО ИЗМЕНЕНИЕ. Оно создаст СЕРЬЁЗНЫЕ ПРОБЛЕМЫ БЕЗОПАСНОСТИ во ВСЕВОЗМОЖНЫХ ПРОГРАММАХ. Меня не волнует, что ваши стандартизаторы говорят о том, что gcc исправен. ВСЕ ЭТО ПРИВЕДЁТ К ТОМУ, ЧТО ЛЮДЕЙ ВЗЛОМАЮТ. Я обнаружил эту проблему, так как одна из проверок безопасности, которая предотвращает взлом, провалилась.
ЭТО НЕ ШУТКА. ИСПРАВЬТЕ ЭТО! СЕЙЧАС ЖЕ!Andrew Pinski
Я не шучу, стандарт языка Си прямо говорит, что переполнение знакового числа — это неопределённое поведение.felix-gcc
Так, послушайте, Эндрю, вы что, действительно думаете, что эта проблема исчезнет, если вы продолжите закрывать баги достаточно быстро? Проверка, которую я написал, покрывала все возможные ситуации. Не требуется даже уточнения того, что за тип используется — указатель, беззнаковое или знаковое число. Ну, указатели вы тоже сломали, но ваши изменения были исправлены. Парень, который сделал это тогда, должен появиться здесь, нам нужен кто-то с трезвой головой и видением ситуации как у него.
Давайте посмотрим правде в глаза — вы облажались по полной (оригинал: «fucked up this royally»), и теперь вы пытаетесь прикрыть все ошибки как можно скорее, чтобы никто не заметил, сколько ущерба вы нанесли. Вы, сэр, непрофессиональны и позорите команду разработчиков gcc. Эта ошибка останется открытой до тех пор, пока вы не вернёте все обратно или не сделаете упомянутый вами флаг по умолчанию. Пока вы будете ломать программы, чьи авторы по глупости включили оптимизации, мне всё равно. Но я не позволю вам делать моё окружение менее безопасным только потому, что ваш непрофессионализм не позволяет вам разобраться с оптимизациями после того, как было показано, что они наносят больше вреда, чем пользы. Сколько еще доказательств вам необходимо предоставить? Боже мой, да autoconf считает, что ваши «оптимизации» нужно отключать повсеместно. Вы вообще замечаете взрывы вокруг самих себя?Andrew Pinski
http://c-faq.com/misc/sd26.html
Это всё, на что я собираюсь ссылаться с этого момента. Этот код ясно говорит вам, как необходимо распознавать переполнение до того, как оно произойдет. Опять же, ваш код сломан и не соответствует стандарту.
felix-gcc
МОЙ КОД НЕ СЛОМАН.
Попытки обесценить проблему или оскорбить меня ничего не решат.Andrew Pinski
Вы написали ошибку, поэтому я и решил, что ваш код сломан.felix-gcc
Итак, скажите мне, какая часть моей аргументации вам непонятна? Я мог бы использовать слова попроще, чтобы вы смогли меня понять на этот раз.
Ребята, ваша задача — это не просто реализовать стандарт Си. Вы также обязаны не нарушать работу программ, которые зависят от вас. А от вас зависит МНОГО программ. Когда вы нарушили точность вычислений с плавающей точкой, то вы сделали это доступным с помощью флага (-ffast-math). Когда вы добавили strict aliasing, вы так же сделали эту функцию доступной через флаг (-fstrict-aliasing). Если я правильно помню, вы тогда тоже цитировали текст стандарта, пока люди с более адекватным пониманием мира вас не остановили. И я собираюсь оставить эту ошибку открытой до тех пор, пока не повторится та же история.Andrew Pinski
Я думаю, нам не следовало делать это необязательным, но меня не было в тот момент, когда было принято это решение. Также помните, что у нас был релиз, когда strict aliasing был включен, но затем нам пришлось его отключить по умолчанию. За это время люди исправляли свои программы, пока оптимизация была активна. И мы уже сделали оптимизацию знакового переполнения опциональной с помощью «-fwrapv». Я не понимаю, к чему вы приводите свои аргументы.felix-gcc
Вы не можете просто так потенциально сломать кучу свободного ПО лишь потому, что изменили свое мнение по поводу того, какую свободу вам дает стандарт.
Повзрослейте или уйдите, позволив более ответственным людям заниматься вашими делами.Andrew Pinski
Подождите, но эта оптимизация была еще с 1994-ого года, и если какой-либо код, начиная с этого момента, использовал знаковое переполнение, то авторы этих программ сами напросились.felix-gcc
Знаете ли вы, что ракета Ариан-5 взорвалась (и могла убить людей!) из-за ошибки переполнения? Что если люди погибнут из-за того, что вы решили, что стандарт позволяет вам выкидывать проверки безопасности, написанные людьми?Andrew Pinski
Я уже показал вам, как проверять знаковое переполнение до того, как оно произойдет, а не после. Вы можете научить других специалистов по безопасности тому, как писать этот код.felix-gcc
Еще раз: НЕ ИМЕЕТ ЗНАЧЕНИЯ ТО, ЧТО ГОВОРИТ СТАНДАРТ. Вы сломали программы, и люди пострадали от этого. Теперь верните все обратно. Меньшее, что вы можете, это сделать «-fwrapv» по умолчанию. Вам все еще придётся заставить его работать правильно (я слышал, что он неверно работает в определенных ситуациях), но это уже другая история.Andrew Pinski
Он будет по умолчанию в тех языках, где определено именно такое поведение. Я дал вам способ написания проверок переполнения, и если вам не нравится то, что говорит стандарт языка Си, то это не моя вина.
Запомните: компилятор gcc также является оптимизирующим компилятором, и если вам нужны оптимизации, то вы должны следовать правилам того языка, на котором вы пишете, вместо создания неверных программ, что и происходит с Си и Си++ в целом.felix-gcc
В ранних версиях компилятора такое поведение происходило только в случае включённых оптимизаций. Если немножко присмотреться, то окажется, что все ваши аргументы ничего не стоят.
Потому как gcc 4.1 выкидывает этот код уже без включённых оптимизаций. Вот и все ваши аргументы.
Пожалуйста, сделайте «-fwrapv» по умолчанию, и я заткнусь.Andrew Pinski
Попробуйте проверить время исполнения программы с «-fwrapv» и без него. Вы увидите, что без него код работает быстрее.
Пытаясь уйти в обсуждение оптимизаций компилятора, Andrew Pinski решил тем самым оправдать свою позицию. В процессе он, однако, упомянул куда более «интересную» аргументацию:
Тот факт, что человек написал проверку переполнения неверным образом, не является основанием для наказания людей, которые на самом деле сделали это правильно, используя способ, описанный в документации. Это моя позиция — вы пытаетесь наказать людей, которые написали свои проверки так, как это предполагает стандарт языка Си.
А в самом конце обсуждения Andew Pinski заявил следующее:
Я бы принял вашу идею о включении «-fwrapv» по умолчанию, если бы не существовало способа для проверки переполнения до того, как оно случилось, но он есть. Да, мы сломаем код, который был написан, исходя из предположения о том, что знаковое переполнение возможно. Но я думаю, что это та цена, которую мы можем принять.
В заключение хочется привести еще одну цитату Линуса Торвальдса:
Разработчики gcc больше заинтересованы в попытках выяснить, что еще им позволяет делать стандарт, чем в том, как заставить вещи действительно работать.
И в этом, похоже, заключена главная проблема языка Си. Но подобное не могло произойти на пустом месте — в конечном итоге мы сами позволили этому случиться. Язык Си уже очень давно перестал выполнять возложенные на него функции и превратился в уродливую пародию на самого себя. Но мы этого не заметили, потому что смирились с тем, что наши программы не работают. Мы, как программисты, настолько привыкли к ошибкам, что они стали неотъемлемой частью нашей жизни. Зачастую на отладку и тестирование программ уходит больше времени, чем на проектирование и написание самого кода. И ведь это немудрено — людям свойственно ошибаться. Большую часть багов и уязвимостей программисты вносят случайно, совершенно не задумываясь, и мы ничего не можем с этим сделать. Однако неизбежность ошибок не оправдывает их существование. Задача программиста в том, чтобы писать код, который работает. Даже если это неочевидно, трудно и невозможно, мы не имеем права делать ошибки. Потому что иначе все бессмысленно, и мы перестаем понимать, что можно делать, а что нельзя, что красиво, а что уродливо. В погоне за эффективностью разработчики компиляторов забыли о том, для чего на самом деле нужен язык Си. Он инструмент программиста, а плохим инструментом нельзя написать хорошую программу. Эта история — показательный пример того, что не всякая деятельность плодотворна, и не каждое изменение ведет к лучшему результату. Стараниями комитета стандартизации и разработчиков компиляторов мы в конечном итоге потеряли язык Си. Как инструмент разработки он стал абсолютно бесполезен и даже вреден, и мы обязаны признать это. В противном случае наши программы никогда не будут работать. Пренебрежительное отношение к ошибкам должно уйти в прошлое, а вместе с ним должен умереть и язык Си.
P.S. Если вы все ещё верите, что язык Си можно спасти, ознакомьтесь по ссылке со следующей выдержкой за авторством одного из двух редакторов текста стандарта языка Си:
Мы позволим компилятору лгать вам. Мы будем лгать вашему коду. И когда дела пойдут плохо — ошибка, «обосратушки», утечка памяти — мы торжественно покачаем головами.
Авторы выражают благодарность Андрею Викторовичу Столярову за его критику и комментарии, благодаря которым эта статья приобрела настоящий вид, и без которых, быть может, её и вовсе не было бы.
Соавтор статьи: @aversey
Изначальная публикация: cmustdie.com