Выстрелить себе в ногу
Материал из Lurkmore
A long time ago, in a galaxy far, far away... События и явления, описанные в этой статье, были давно, и помнит о них разве что пара-другая олдфагов. Но Анонимус не забывает! |
«Выстрелить себе в ногу» — фраза из старой цитаты отца языка C++ Бьярне Строуструпа:
«Си» позволяет очень просто выстрелить себе в ногу. На «Си++» сделать это сложнее, но, когда вам это удается, ногу отрывает полностью. |
Bjarne Stroustrup[1] |
Содержание |
Суть
Конечно, сама фраза гораздо древнее этой цитаты. Суть её заключается в том, что в винрарное ковбойское время чуть более, чем все револьверы не имели предохранителя. Он там был не особо и нужен: в системах с раздельным взводом курка и спуском взведённый курок означает смерть своей пружины, поэтому нормальные люди таскали пушки невзведёнными, в случае чего пользуясь знаменитой револьверной фичей: выжав спуск, взвести курок ладонью другой руки.
Беда в том, что это означало суровую нагрузку на указательный палец и как следствие — задержку при выстреле и резкую потерю меткости. Поэтому самые крутые ковбои, дрочившие на мгновенное-выхватывание-пушки-и-выстрел (как в вестернах, ага) могли ходить со взведёнными револьверами в кобурах. И вот им уже было феерически несложно добиться выстрела, даже не прикасаясь к спусковому крючку — то есть при должном ламерстве вполне реально было прострелить себе ногу, не вынимая револьвер из кобуры, просто по неосторожности. Впрочем, fanning (шлепание ладонью по курку) использовали в основном в кинофильмах, а настоящие юзеры просто заряжали в шестизарядники по пять патронов, оставляя камору под курком пустой; что является лучшим подтверждением актуальности выражения. Позже конструкторы всё-таки придумали револьверы с самовзводом и блокировкой курка, и суть фразы забылась. Зато не забылась сама фраза: она стала распространённой пиндосской идиомой, ближе всего стоящей к русскому выражению «сесть себе на яйца».
Тем не менее, среди тех, кто ещё помнит, фраза стойко ассоциируется именно с цитатой отца-основателя.
Реализация
На искомую тему был написан забавный текст, автор которого теряется в веках (помнит ли ещё кто-нибудь про revelation и euclid?):
ЗАДАЧА: Прострелить себе ногу.
- C: Вы простреливаете себе ногу.
- C++: Вы случайно создаете дюжину копий объекта «вы» и всем им простреливаете ногу. Срочная медицинская помощь оказывается невозможной, так как вы не можете разобраться, где настоящие копии, а где — те, что только указывают на них и говорят: «А вот он я!»
- Java: После импорта java.awt.right.foot.* и java.awt.gun.right.hand.* и написания классов и методов, необходимых для этих классов, вы забываете, что вы, чёрт возьми, хотели сделать.
- C#: Вы пытаетесь прострелить себе ногу, но осознаете, что для этого вам нужен 5 диск MSDN с хелпом и Visual Studio .NET… и в любом случае решетка C# не дает прострелить вам ногу, так как тот код, который вы пишете для Mono, Microsoft уже запатентовала.
- SQL: INSERT INTO нога (ступня) SELECT патроны AS пуля FROM пистолет WHERE курок = 'СПУЩЕН'; COMMIT;
- SQL v2: SELECT @ammo:=bullet FROM gun WHERE trigger = ‘PULLED’; INSERT INTO leg (foot) VALUES (@ammo);
- Delphi: Вы залезаете на форумы и слезно умоляете дать вам компонент для прострела ноги. После компиляции нога опухает, и её масса превышает массу тела.
- JavaScript: Вы прочитали 3 книги, изучили 10 наглядных примеров, разработали потрясающий интерфейс и теперь, кажется, готовы к тому, чтобы выстрелить себе в ногу. Потом в процессе стрельбы обнаруживаете, что пули имеют радиус действия, равный длине ствола, и испаряются прямо на выходе.
- CSS: Переложив пистолет в левую руку, вы понимаете, что держите его не за рукоять, а за дуло. Вы переворачиваете его и понимаете, что теперь он смотрит стволом в сторону вашей головы. Ещё немного изменив стили, вы понимаете, что всё теперь как надо, но только он находится на 15 пикселей левее вашей руки.
- node.JS: Вы начинаете асинхронно стрелять из асинхронных рук в асинхронные ноги, асинхронно не попадаете и запутываетесь в этой каше.
- Objective-C/Cocoa: Вы строите стильный интерфейс, соответствующий всем канонам Apple. Вы два раза копируете и ногу, и пистолет, чтобы они работали под архитектурами как Intel, так и PowerPC. Вы удостоверяетесь, что пистолет можно зарядить с помощью всего одного клика мышкой. Когда всё уже готово, вы понимаете, что при нажатии на спуск пистолет не стреляет. Перебрав весь код вашей программы, вы обнаруживаете, что забыли указать, что графический объект спускового крючка — и есть спусковой крючок.
- Ruby: Ваша нога готова к выстрелу примерно через пять минут, но вы не можете найти места, где можно стрелять.
- PHP: Вы стреляете себе в ногу из пистолета, сделанного из частей 300 других пистолетов.
- ASP.NET: Вы находите пистолет, но он разваливается. Вы его собираете, но он снова разваливается. Вы пытаетесь использовать платформу .GUN, но она разваливается. Вы режете себе ногу.
- Perl: Вы стреляете себе в ногу, и никто не может понять, как вы сделали это. Через шесть месяцев не можете и вы.
- Erlang: Вы описываете поведение стреляющего устройства, создаете десяток устройств от арбалета до КПВТ на его основе, одновременно стреляющее из тысячи разных мест и позволяющее горячую замену пуль прямо во время стрельбы. После поражения ноги она умирает и каскадно уносит с собой все тело. Супервизор отращивает новое тело с непораженной ногой. Вы офигеваете, что после такого залпа нога все еще целая, а также от блевотного Tk-интерфейса appmon, через который просматриваете состояние ноги.
- Фортран: Итеративно вы простреливаете каждый палец ноги, а когда пальцы заканчиваются, загружаете следующую ногу и продолжаете. Когда пули заканчиваются, вы все равно продолжаете попытки прострелить себе ноги, потому что не имеете возможности обрабатывать исключения.
- Modula2: Поняв, что с помощью этого языка ничего толком сделать нельзя, вы простреливаете себе голову.
- Pascal: Компилятор не позволит вам прострелить себе ногу.
- Rust: Компилятор не позволит вам прострелить себе ногу до тех пор, пока вы явно не переставите рычаг предохранителя в функции выстрела в состояние «unsafe».
- Ada: После тщательной сборки пакета «нога», вы пытаетесь одновременно зарядить пистолет, нажать курок, завопить и выстрелить себе в ногу. В ходе попыток обнаруживается, однако, что вас постигла неудача, так как ваша нога оказалась неверного типа.
- Кобол: Наводите ПИСТОЛЕТ COLT 45 на НОГА.СТОПА, ТОГДА помещаете РУКА.КИСТЬ.ПАЛЕЦ на ПИСТОЛЕТ.КРЮЧОК и ПОЖАЛУЙСТА, НАЖИМАЕТЕ. ТОГДА возвращаете ПИСТОЛЕТ в КОБУРУ. ПОЖАЛУЙСТА, ПРОВЕРЬТЕ, нуждаются ли шнурки в повторном связывании.
- LISP: Вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который держит пистолет, с помощью которого вы простреливаете себе отросток, который…
- Forth: Нога себе прострелить вы.
- Prolog: Вы сообщаете вашей программе, что хотите иметь простреленную ногу. Программа разрабатывает способ этого достичь, но синтаксис языка не позволяет объяснить этот способ вам.
- Basic: Вы простреливаете себе ногу из водяного пистолета. В расширенных реализациях языка продолжайте, пока вся нижняя часть тела не промокнет. В реализациях с возможностью делать вставки из ассемблера вы используете ранее созданные типы и уже в ассемблерной части простреливаете ногу дробовиком.
- Visual Basic: Вы прострелите себе ногу. Однако в процессе реализации вы получите столько удовольствия, что подобные мелочи вас не озаботят.
- Visual BASIC.NET: Вы тратите целое состояние на мощнейший, самоочищающийся, самонаводящийся, автоматический пистолет с бесконечным боезапасом и только тогда понимаете, что спуск курка занимает около года (источник).
- HyperTalk: Поместите первую пулю пистолета в ступню левой ноги вас. Сообщите результат.
- Smalltalk: Мой нога стреляй себя.
- Motif: Вы затрачиваете несколько дней на построение UIL — описания вашей ноги, пули, её траектории и замысловатой резьбы по слоновой кости на рукоятке пистолета. Когда вы наконец-то управились и готовы нажать на курок, затвор заклинивает.
- APL: Вы простреливаете себе ногу, затем тратите весь день на то, чтобы представить себе, как это сделать с меньшим количеством символов.
- Снобол: Если вам удастся, прострелите себе левую ногу. Если не удастся, то прострелите себе правую ногу.
- E2: Вы, используя голограммный пистолет, стреляете голограммной пулей в голограммную ногу, но в полёте обнаруживается, что вам для прострела ноги нужен E2Power.
- Unix:
% ls
Foot.c foot.h foot.o toe.c toe.o
% rm * .o
rm: .o no such file or directory
% ls
%
Примерно так: |
---|
|
- Параллельный Euclid: Вы простреливаете себе чью-то чужую ногу.
- Язык управления заданиями IBM/370: Вы посылаете свою ногу в управляющую информационную систему с приложением документа на 400 страниц, точно описывающего, как именно вы хотите быть простреленным. Через три года ваша нога возвращается с глубоким ожогом.
- Paradox: Не только вы можете прострелить себе ногу, но и ваши пользователи.
- Revelation: Вы уверены, что сможете прострелить себе ногу, как только разберетесь, для чего служат эти маленькие хорошенькие пульки.
- Ассемблер: Вы пытаетесь прострелить себе ногу, но обнаруживаете, что прежде вам придется изобрести пистолет, пулю, курок и вашу ногу. После чего вы нажимаете на курок, пистолет издаёт пару писков, после чего выдаёт BSoD.
- Ассемблер v2: Вы пытаетесь прострелить себе ногу, но наступаете ею на грабли.
- Python: Вы пытаетесь выстрелить себе в ногу, но то и дело попадаете промеж пальцев. А всё потому, что Питон настолько гибкий — что из пальцев выскальзывает.
- BrainFuck: Вы палите наугад из безумной смеси пистолета и экскаватора урановыми медведями. В конце концов вам удается попасть в изогнутую по синусоиде «ногу».
- VHDL: Вы аккуратно описываете компоненты «нога», «рука», «пистолет» и «пуля». Любовно их отлаживаете и моделируете по отдельности. После синтеза всей системы обнаруживается, что нога и пистолет активируются на чётных тактах сигнала синхронизации, а рука и пуля на нечётных.
- Whitespace:
- Redcode: Вы стреляете себе в ногу, но у пули на сей счет иные планы. Она постоянно ищет себя, стреляет себе в ногу, удивляется результату…
- ABAP/4: В стандартном пистолете предусмотрена возможность стрелять из-под колена в белку на расстоянии 3 км, но выстрелить в ногу нельзя. После годовой доработки можно стрелять в ногу. На второй минуте использования выясняется, что стрелять нужно было, только если нога левая, а фаза луны четвертая.
- Haskell: Процесс выстрела в ногу сопровождается побочными эффектами, поэтому вы пытаетесь использовать монады для обработки ввода/вывода пистолета, но выясняется, что вы недостаточно умны для этого.
- AJAX: Пистолет с помощью XmlHTTPRequest запрашивает пулю, которая появляется неопределенное время спустя и попадает в птицу.
- ColdFusion: Программа снимает за вас ваши туфли, заряжает ваш пистолет и назначает вам прием к доктору. Вы успешно стреляете себе в ногу, но вам никто не верит.
- XSLT: Вы гуглите весь день, пытаясь узнать, как же выстрелить себе в ногу. Узнав решение, вы не понимаете его синтаксис и берете чужой шаблон. Он не работает.
- Lua: Если разработчик пистолета предусмотрел возможность выстрела в ногу — достаточно вызвать одну функцию. Если нет — хоть убейтесь, но ничего не выйдет.
- Squirrel: Намаявшись с Lua, вы прогрызаете ногу той самой белкой, глаз которой вы отстрелили из пистолета «ABAP».
- Apple Script: Вы простреливаете себе ногу, но перед этим вам придётся сделать автоматическую запись ваших действий в компилятор — прострел собственной ноги, и в итоге вы автоматически простреливаете себе ногу вторично.
- FoxPro: Вы хотите выстрелить себе в ногу, но обнаруживаете, что нога уже прострелена, и вам приходится искать пользователя, который это сделал.
- MUMPS/M: Вы используете переменную glo для ссылки на глобаль с состоянием своего тела set glo = $na(^MYBODY), потом обращаетесь к функции, где производится выстрел в ногу set result = $$shootRightLeg() и сохраняете результат в индекс ноги set @glo@("rightleg") = result. Но в метке shootRightLeg кто-то уже использует переменную с тем же именем для получения данных о пистолете set glo = $na(^GUN), не ньюкнув ее new glo предварительно. В результате вы в полном порядке, а у пистолета прострелена правая нога.
- UART: У вашего пистолета такой короткий ствол, что патрон просто торчит из дула. Вам приходится расковыривать ногу, причём так, чтобы именно выстрел пластмассовой пульки нанёс ноге рану.
- 1C: Нога = Новый Нога; Нога.Прострелить(); либо Пистолет = Новый Пистолет; Пистолет.Прострелить(Вы.Нога);
- Go: Вы создаете пулю и запускаете ее в полет. Тем временем создаете ногу, пистолет, и сообщаете пуле, что она должна лететь от пистолета к ноге. При подлете к ноге пуля исчезает, так как ногу простреливать запрещено.
- Regexp: По очереди выбрав пистолет, руку и ногу, вы производите выстрел, но простреливаете муху на окне, ибо селектор выбрал её ногу вместо вашей.
- GML (Game Maker Language): Вы покупаете Desert Eagle Custom за 2999,99$, пишете instance_create(x,y,obj_bullet) и задаёте на различных форумах вопрос: «пачиму пуля нилитит кнаге7».
- DOS Batch: Вы прицеливаетесь в ногу из пистолета и нажимаете на курок, но вашу ногу лишь обдувает теплым ветерком.
- Машинный язык: Перед тем, как выстрелить в ногу, вам нужно расщепить пистолет на атомы, а затем снова его собрать. После этого вы обнаруживаете, что для пуль требуется специальный оператор, поэтому пистолет не работает.
- PL/I: У вас есть 6,752 различных пистолетов. Пока вы выбираете один, чтобы выстрелить себе в ногу, вы умираете от голода.
Так бы в Windows 8 решалась любимая программистами задача выстрелить себе в ногу: — Вы уверены, что хотите выстрелить себе в ногу? — Да — Windows требуется ваше разрешение для продолжения — Продолжить — Для выполнения этого действия нужно обладать правами администратора — Продолжить! — Windows Smartscreen защитило вашу ногу от неопознанной операции выстрела. Выстрел в ногу может повредить вашу ногу — Стреляй же, мать твою! — Предупреждение системы безопасности. Не удаётся проверить модель пистолета. Пистолеты могут быть полезны, но этот тип пистолета может повредить Вашу ногу. Если вы не доверяете вашему оружейному поставщику не используйте данный пистолет — А-а-а-а!!! Стреляй! Стреляй! Стреляй!!! — У вас нет прав для произведения операции Выстрелить в себе в ногу. Вы не являетесь владельцем вашей ноги. Обратитесь к своему системному администратору — %&?#!!! *посылает пулю в висок* |
Бездна |
C++11
Бьярне продолжает радовать. На официальной страничке, посвященной FAQ по новому стандарту, в разделе наследование конструкторов.
If you so choose, you can still shoot yourself in the foot by inheriting constructors in a derived class in which you define new member variables needing initialization... You might remove the bullet from your foot by using a member-initializer... |
Также данные цитаты были повторены в четвертом издании The C++ Programming Language, опубликованной в мае 2013.
Алсо
- В сериале The IT Crowd директор компании простреливает себе ногу. Прямая, кстати говоря, отсылка к этому тексту.
- Есть доставляющая книга о программировании на С и C++ под названием «Enough rope to shoot yourself in the foot» (на русском).
- В сериале Теория большого взрыва (сезон 5, серия 14) Леонард прямо-таки выстрелил себе в ногу. Всё бы ничего, но вся серия проходила в контексте разработки и отладки ПО, что символизирует
- В Quake 4 при выборе минимальной сложности просят не прострелить себе ногу, намекая на скилл игрока. ЧСХ, прострелить себе ногу в каком-то роде можно — если выстрелить вниз, удерживая заряд бластера, персонаж получит урон.
Применение в политике
- Сергей Лавров: Россия не собирается стрелять себе в ногу и отказываться от сотрудничества с Европой
- Премьер Венгрии: ЕС выстрелил себе в ногу, введя санкции против России
- Немецкий депутат назвала сегодняшнюю политику Европы в отношении России «выстрелом себе в ногу»
См. также
- Fail
- Как поймать льва в пустыне
- Стрела в колене, куда ж без неё.
Примечания
[ + ] Любой программист без словаря поймёт, что такое Выстрелить себе в ногу
|
|||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|