что такое слово баг
Что такое слово баг
В программировании баг (англ. bug — первичные значения: клоп, любое насекомое, вирус) — жаргонное слово, обычно обозначающее ошибку в программе или системе, которая выдает неожиданный или неправильный результат. Большинство багов возникают из-за ошибок, допущенных разработчиками программы в её исходном коде, либо в её дизайне. Также некоторые баги возникают из-за некорректной работы компилятора, вырабатывающего некорректный код. Программу, которая содержит большое число багов и/или баги, серьёзно ограничивающие её работоспособность, называют нестабильной или, на жаргонном языке, «глючной», «глюкнутой», «забагованной», «бажной», «баг(а)нутой» (англ. unstable, buggy ).
Термин «баг» обычно употребляется в отношении ошибок, проявляющих себя на стадии работы программы, в отличие, например, от ошибок проектирования или синтаксических ошибок. Отчет, содержащий информацию о баге также называют отчетом об ошибке или отчетом о проблеме (англ. bug report ). Отчет о критической проблеме (англ. crash ), вызывающей аварийное завершение программы, называют крэш-репортом (англ. crash report ).
«Баги» локализуются и устраняются в процессе тестирования и отладки программы.
Багом также называют определённый вид маркера на индикаторах.
Содержание
Этимология
Широко распространена легенда, что 9 сентября 1945 года учёные Гарвардского университета, тестировавшие вычислительную машину Mark II Aiken Relay Calculator, нашли мотылька, застрявшего между контактами электромеханического реле, и Грейс Хоппер произнесла этот термин. Извлечённое насекомое было вклеено скотчем в технический дневник, с сопроводительной надписью: «First actual case of bug being found» (рус. «первый реальный случай, когда был найден жук» ). Считается, что этот забавный факт положил начало использованию слова «debugging» в значении «отладка программы», однако, скорее всего, фраза является каламбуром.
В действительности этот случай произошёл 9 сентября 1947, а не 1945, года. Слово «bug» в современном значении употреблялось задолго до этого персоналом телеграфных и телефонных компаний в отношении неполадок с электрооборудованием и радиотехникой. Во время Второй мировой войны словом «bugs» назывались проблемы с радарной электроникой. В 1878 году Томас Эдисон писал:
Это повторялось снова и снова со всеми моими изобретениями. Первым шагом была интуиция, за ней следовала вспышка, затем возникали препятствия — и они исчезали, потом возникали Баги — так называются маленькие недочеты и трудности — и необходимы месяцы постоянного поиска, исследований и тяжелого труда до успеха или неудачи. [1]
It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise—this thing gives out and [it is] then that «Bugs»—as such little faults and difficulties are called—show themselves and months of intense watching, study and labor are requisite before commercial success or failure is certainly reached.
Поиск и исправление ошибок
Для отладки программы (англ. debugging ) разработчиками ПО используются специальные программы-отладчики (англ. debugger ). Например, в операционной системе Windows можно использовать программу WinDbg из пакета Microsoft Debugging Tools for Windows. Для GNU/Linux и ряда других UNIX-подобных операционных систем существует отладчик GDB (GNU Debugger).
Отчёты об ошибках
Основная масса багов обычно отлаживается на этапе компиляции и тестирования программы. Однако некоторая часть ошибок всё же попадает в релиз и проявляется на компьютерах конечных пользователей в процессе эксплуатации ПО. Для повышения качества программного обеспечения пользуются специальными программами, цель которых — отловить ошибку в целевом приложении, собрать необходимую информацию об её симптомах и отправить отчёт по интернету к разработчикам данного ПО.
Типы багов: этимология и энтомология
1. Немного этимологии и энтомологии
Давайте посмотрим попристальней на такое знакомое и (до боли?) родное слово БАГ. Происходит оно от английского слова Bug, означающего «насекомое». Есть еще много сторонних значений, в частности английское выражение «to go bugs» — сойти с ума, что легко кореллируется со вполне русским «тараканы в голове завелись». Также вспоминаются и «жучки на линии» (тоже, кстати, по-английски – bugs). И опять мы пришли к насекомым.
Еще в 1878 году, Томас Альва Эдисон (да-да, тот самый!) в письмах к своему соратнику Пускасу писал: «It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise — this thing gives out and [it is] then that ‘Bugs’ — as such little faults and difficulties are called — show themselves and months of intense watching, study and labor are requisite before commercial success or failure is certainly reached». Тем же словом, инженеры называли и сбои радарной электроники во время второй Мировой Войны. Конечно, более распространена история о том, что в 1946 году разработка компьютера Марк-2 (Mark-II) были приостановлена из-за сбоя его функционирования, вызванного попаданием мотылька между контактов. Трупик мотылька был извлечен и приклеен к отчету липкой лентой с комментарием «First actual case of bug being found.» («Первый реальный случай нахождения жучка»). Как нетрудно догадаться, примерно оттуда же «растут уши» и слова «дебаггер» (debugger) – буквально «избавитель от жучков».
2. Виды багов.
Простейший (не как инфузория-туфелька, а самый простой для понимания, модно сказать «классический») баг – это несоответствие между ожидаемым результатом (ОР) и фактическим результатом (ФР). Разберем это на примере:
Действия | Ожидаемый результат | Фактический результат |
---|---|---|
Ввести в ячейку выражение «=2+2*2» (без кавычек) и нажать ENTER | 6 | 8 БАГ. |
(это, кстати, реальный баг старого Microsoft Excel – он не учитывал приоритета математических операций, по которому умножение имеет высший приоритет по сравнению со сложением)
Все просто. Ждем одно – получаем другое. Баг.
Я не буду перечислять все подвиды бага классического – от опечаток в данных и опечаток в коде до бесконечных циклов, от использования оператора присвоения вместо оператора проверки равенства до использования неинициализированной переменной, от состояния гонки (race condition) в мультипоточных приложения до переполнения буфера, и так далее, и тому подобное – все это достаточно обыденные и ясные явления. Обратимся к малознакомой экзотике.
2.1. Гейзенбаг (Heisenbug)
Баг, названный в честь Гейзенбергского Принципа неопределенности – концепции квантовой физики. Простым (хоть слово «просто» здесь и не очень применимо) примером подобного бага будет являться ошибка, проявляющаяся, когда программа запускается на исполнение в рабочей среде, но исчезающая, когда программу запускают в дебаггере.
2.2. Борбаг (Bohrbug)
Тип бага, названный так в честь атомной модели Бора. В противоположность Гейзенбагу, он проявляется постоянно при одном и том же стечении обстоятельств. Вопрос в том, что весь набор обстоятельств бывет невозможно (или очень трудно) отследить.
2.3. Мандельбаг (Mandelbug)
Назван в честь Бенуа Мандельброта, внесшего огромный вклад в теорию фракталов. Мандельбагами называют ошибки, чьи причины настолько сложны и неясны, что фактически кажутся хаотичными и не поддающимися описаниями. (ключевое слово «кажутся»). Подобное, может быть вызвано, например, медленной реакцией системы – то есть ошибка уже произошла, но об этом вы узнаете только через некоторое время, что сильно затруднит локализацию причин.
2.4. Шрединбаг (Schroedinbug)
Шрединбаг назван в честь известного парадокса с кошкой Шредингера (или эта несчастная животина – кот?). Он заключается в том, что кто-нибудь читает код программы (работающей уже некоторое время) и восклицает «Да этого не может быть! Она просто не может функционировать!», после чего программа прекращает свое функционирование пока данная ошибка не будет исправлена. Будучи, казалось бы, абсолютно фантастической, данная ошибка попадается в реальности – спросите знакомых ветеранов- разработчиков, они подтвердят. Хотя, конечно, последующий анализ, как правило, позволяет отнести ошибку к разделам 2.1, 2.2 или 2.3, это удается не всегда.
2.5. Фазы луны
На самом деле такой ошибки не существует – это популярная отговорка тех, кто не хочет (не имеет желания и/или времени) разбираться в сложных причинах возникновения ошибки. Тем не менее, в истории существует пара примеров, когда ошибки возникали буквально из-за фаз луны. Я не буду приводить здесь эти истории, надеясь, что никому из нас не придется работать со столь сложными устройствами. Тем не менее, в любом случае, хотелось бы предостеречь всех от неосторожных умозаключений и попросить быть более внимательными, настойчивыми и скрупулезными в своей работе.
2.6. Статистический (более известный как количественный) баг
Баг возникающий при произведении программой большого количества каких-либо действий. Примером данной ошибки может служить запуск программы, которая должна равномерно расположить на плоскости некоторое количество точек. Если, например, при большом количестве точек программа не только неправильно располагает их, но и норовит расположить все на одной стороне плоскости (при этом до определенного количества точек работая прекрасно) – вуаля, количественный баг.
2.7. Демонстрационный эффект.
Ну и конечно, известный всем, «эффект первого показа», не раз случавшийся и с вашим покорным слугой. Как только приходит пора показать, например, прекрасно функционировавший на тестовом стенде юнит, обязательно происходит что-то ужасное. Причны, как правило, тривиальны – пропуск «незначительных» тест-кейсов, невнимательность к деталям и неучтенные юз-кейсы. Опять же – будьте внимательней.
На этом я закончу краткий обзор багов, буду рад Вашим замечаниям и предложениям.
Значение слова «баг»
Термин «баг» обычно употребляется в отношении ошибок, проявляющих себя на стадии работы программы, в отличие, например, от ошибок проектирования или синтаксических ошибок. Отчет, содержащий информацию о баге также называют отчетом об ошибке или отчетом о проблеме (англ. bug report). Отчет о критической проблеме (англ. crash), вызывающей аварийное завершение программы, называют крэш-репортом (англ. crash report).
«Баги» локализуются и устраняются в процессе тестирования и отладки программы.
1. комп. жарг. ошибка в компьютерной программе ◆ В программе найден баг. ◆ Это не баг, это фича
2. комп. жарг. запись в багтрекере ◆ Пометил баг 419594 как WONTFIX. Если у кого есть какие-нибудь возражения/предложения, то рекомендую писать на странице обсуждения бага… «Форум Mozilla Россия», 2008 г.
Баг I
1. мужское имя ◆ Моего друга зовут Баг.
Делаем Карту слов лучше вместе
Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!
Спасибо! Я стал чуточку лучше понимать мир эмоций.
Вопрос: лесозаготовительный — это что-то нейтральное, положительное или отрицательное?
Мельница мифов: откуда взялись буки и баги?
Весьма распространенным заблуждением считается история о том, что будто бы слово «баг» в значении «ошибка компьютерной программы» появилась в 40-х годах прошлого столетия после того, как бабочка, попав в механизм одного из первых компьютеров, вызвала сбой в его работе. Но это не так — данное слово в подобном значении использовалось еще в XIX веке.
Что означает слово «баг»?
Не знаю, как у вас, а лично у меня всегда возникал вопрос — какая ассоциативная связь между насекомым и программной ошибкой? Я задавал его многим моим друзьям, которые занимались программированием, и практически все они рассказывали мне такую историю. Оказывается, один раз насекомое действительно устроило сбой работы компьютера. Впрочем, давайте обо всем по порядку.
Давным давно, 9 сентября 1945 года ученых Гарвардского университета вызвали для того, чтобы определить причину сбоя в работе вычислительной машины Mark II Aiken Relay Calculator, который произошел накануне. Покопавшись в этой громадной куче приборов, соединенных проводами, они обнаружили бабочку, застрявшую между контактами электромеханического реле. Стало ясно, что именно она и явилась причиной сбоя. Одна из сотрудниц университета Грейс Хоппер так сформулировала результат исследований: «неполадку вызвал баг». После чего извлеченное насекомое было вклеено скотчем в технический дневник, с соответствующей сопроводительной надписью. Которую, по словам моих знакомых, до сих пор можно увидеть в этом журнале, хранящемся в университетском научном музее.
Я думаю, эту историю слышали многие и даже посчитали ее правдивой. Но на самом деле все было не совсем так, как описывается в канонической версии.
Из чего следует то, что о существовании «мерзкого жука», устраивающего помехи, техники и ученые знали и раньше, просто никак не могли его найти. Но тогда получается, что слово «баг» в значении «ошибка, сбой» появилось на свет не в 1947 году?
Баги во второй мировой войне
Действительно, это так. Если посмотреть документы, относящиеся к периоду Второй мировой войны, то вы найдете использование этого слова в соответствующем значении чуть ли не в каждом втором отчете американских и английских радистов. Тогда «багами» называли самые разные помехи, возникающие при радиосвязи
Так что фраза о том, что «связь установить не удалось из-за багов на данной частоте» была вполне обычной.
Кто первым употребил слово «баг» в нынешнем значении слова?
Однако, как выяснилось, на самом деле данный термин куда старше XX столетия. Его можно встретить, например, в дневниках Томаса Эдисона. Так, в 1878 году он писал о том, что:
«Это повторялось снова и снова со всеми моими изобретениями. Первым шагом была интуиция, за ней следовала вспышка, затем возникали препятствия — и они исчезали, потом возникали Баги — так называются маленькие недочеты и трудности — и необходимы месяцы постоянного поиска, исследований и тяжелого труда до успеха или неудачи».
А в 1889 году во многих газетах появились сообщения о трудностях, которые испытывал Эдисон, тестируя свой новый фонограф. По словам самого изобретателя, он: «не спал две ночи подряд, пытаясь обнаружить баг». Далее в тексте говорилось о том, что этим багом было постоянное шуршание, возникающее через некоторое время после включения прибора. Любопытно, что именно тогда данный термин впервые попал в Оксфордский словарь английского языка, причем в качестве примера употребления приводилась та самая выдержка из газетной статьи. А в 1943 году это значение слова «баг» было приведено в словаре Вебстера, и опять-таки со ссылкой на Эдисона.
Впрочем, вряд ли данный смысл в слово «баг» вложил сам изобретатель. Согласно другим свидетельствам, его в то время вовсю использовали служащие различных телеграфных компаний. Поэтому точно сказать, когда же оно было введено в оборот, и кто конкретно это сделал, увы, не представляется возможным. Впрочем, не исключено, что таковых «новаторов» было несколько.
Почему насекомое стало «багом» или помехой?
Но почему же в качестве термина, обозначающего помеху, было приведено именно слово, обозначающее насекомого? Какая связь между нашими шестиногими соседями и ошибками в работе оборудования? Может быть, они, подобно гарвардской бабочке, влезали в приборы и ломали их? Не исключено, что где-то так и было, но в таком случае этот термин не был бы впервые распространен телеграфистами — ведь работе их устройств никакие реальные жуки помешать не могут.
Есть также версия, что данное слово было использовано потому, что первыми багами были звуки, напоминающие скрип и шорох, какой легко могут производить насекомые. Однако вряд ли дело в этом —
могут не только они. За что же им выпала «особенная честь»? Скорее всего, реальные насекомые здесь вообще не причем.
Слово «баг» произошло от детского страшилища
Просто в староанглийском языке у слова «баг» было еще одно значение, которое сейчас мало кто помнит.
Этим словом обозначалась некая категория сверхъестественных существ (фэйри), которые, в отличие от милых фей и дружелюбных эльфов, не очень-то жаловала людей. А если быть совсем точными, детей. Согласно легендам, баг — «детское» страшилище, которым иногда даже в наше время англичанки и американки пугают своих непослушных отпрысков (не исключено, что русское народное страшилище «бука», которую время от времени призывают на помощь наши мамы и бабушки, является лингвистической сестрой этих монстров). Внешний облик багов может быть различным.
Несмотря на свой угрожающий облик, особого вреда они детям не приносят. Баги совсем не агрессивны, и, кроме того, у них нет ни острых зубов, ни длинных когтей. Они лишь могут напугать ребенка, — например, скорчив страшную уродливую рожу, растопырив лапы и подняв шерсть на загривке. Или устроив шум, писк и шорох в темном углу, мешая сорванцу заснуть. То есть можно с уверенностью сказать, что багам свойственно создавать помехи посредством шороха, скрипа и писка.
Судя по всему, и телеграфисты, и Эдисон, и многие другие, вводя в оборот новый термин, имели в виду именно этих сказочных багов. Поскольку все они когда-то были детьми и слышали про них от своих мам, бабушек и нянь. Так что, скорее всего, именно таким образом детская страшилка переквалифицировалась в электронную помеху. А позже — и в ошибку в программы…
Добавьте «Правду.Ру» в свои источники в Яндекс.Новости или News.Google, либо Яндекс.Дзен
Быстрые новости в Telegram-канале Правды.Ру. Не забудьте подписаться, чтоб быть в курсе событий.
Что такое баги, ворнинги и исключения в программировании
Разбираемся, какие бывают типы ошибок в программировании и как с ними справляться.
Многим известно слово баг (англ. bug — жук), которым называют ошибки в программах. Однако баг — это не совсем ошибка, а скорее неожиданный результат работы. Также есть и другие термины: ворнинг, исключение, утечка.
В этой статье мы на примере C++ разберём, что же значат все эти слова и как эти проблемы влияют на эффективность программы.
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Ошибки в программировании
Словом «ошибка» (англ. error) можно описать любую проблему, но чаще всего под ним подразумевают синтаксическую ошибку — некорректно написанный код, который даже не скомпилируется:
Компилятор тут же скажет, что в коде ошибка и скорее всего не хватает запятой или точки с запятой.
Также существуют ворнинги (англ. warning — предупреждение). Они не являются ошибками, поэтому программа всё равно будет собрана. Вот пример:
Предупреждения не являются чем-то критичным, но могут иметь негативные последствия. Например, ваша программа будет использовать больше памяти, чем должна. Так как C++ нужен в том числе и для разработки высоконагруженных систем, этого допускать нельзя.
После восклицательного знака в треугольнике — количество предупреждений
Третий вид ошибок — ошибки сегментации (англ. segmentation fault, сокр. segfault, жарг. сегфолт). Они возникают, если программа пытается записать что-то в ячейку, недоступную для записи. Например:
Вот результат работы такого кода:
Баги в программах
Мы выяснили, что баг — это не совсем ошибка, а скорее неожиданное поведение программы или результат такого поведения. Баги могут быть чем-то забавным или неприятным. Например, как в играх:
Но они могут привести и к более серьёзным последствиям. Если неправильно спроектировать работу многопоточного приложения, то потоки будут постоянно опережать друг друга. Например, сообщение об ошибке из одного потока может опоздать на миллисекунду, из-за чего второй поток подумает, что никакой ошибки не было, и продолжит работу.
Если ваш код приводит в действие какое-нибудь потенциально опасное устройство, то ценой такой ошибки может быть чья-нибудь жизнь. Такое случилось с кодом для аппарата лучевой терапии Therac-25 — как минимум два человека умерло и ещё больше пострадали из-за превышения дозы радиации.
Исключения в программах
Также во время работы программы могут возникать ситуации, которые мешают корректной работе программы. Например, если вы просите пользователя ввести число, а он вводит строку.
Конвертировать введённое значение не всегда возможно, поэтому функция, которая занимается преобразованием, «выбрасывает» исключение (англ. exception). Это специальное сообщение говорит о том, что что-то идёт не так.
Если разработчик не описывает логику работы программы при вы выбрасывании исключения, то программа аварийно закрывается. Подробнее мы рассказали об этом в статье про ввод и конвертацию в C++.
Одно из самых известных исключений — переполнение стека (англ. stack overflow). В честь него даже назвали сайт, на котором программисты ищут помощь в решении своих проблем.
Компилятор C++ при этом может выдать ошибку сегментации, а не сообщение о переполнении стека:
Вот аналогичный код на языке C#:
Однако сообщение в этот раз более конкретное:
В обоих случаях программа завершается, потому что не может дальше корректно работать.
Похожая ситуация — переполнение буфера (англ. buffer overflow). Она происходит, когда записываемое значение больше выделенной области в памяти.
Обратите внимание, что мы получили предупреждение об арифметическом переполнении (англ. integer overflow):
Тем не менее программа скомпилировалась. Если же такая ситуация возникнет во время вычислений, то мы можем не получить предупреждения.
Арифметическое переполнение стало причиной одной из самых дорогих аварий, произошедших из-за ошибки в коде. В 1996 году ракета-носитель «Ариан-5» взорвалась на 40-й секунде полёта — потери оценивают в 360–500 миллионов долларов.
Как избежать всех этих ошибок
К сожалению, вручную всё это заметить и исправить не получится. Однако существуют различные инструменты и технологии, которые могут помочь.
Один из таких инструментов — отладчик. Он помогает контролировать ход работы программы, чтобы отслеживать разные показатели.
Второй, более эффективный метод — unit-тесты. Они представляют из себя набор описанных ситуаций для каждого компонента программы с указанием ожидаемого поведения.
Например, у вас есть функция sum (int a, int b), которая возвращает сумму двух чисел. Вы можете написать unit-тесты, чтобы проверять следующие ситуации:
Если какой-то из этих тестов не пройден, вы узнаете об этом и сможете всё исправить. Это намного быстрее, чем проверять всё вручную.
Заключение
Ошибок существует слишком много. При этом самые опасные тяжелее обнаружить, что только усугубляет ситуацию.
Если вы хотите научиться писать качественный код и находить в нём ошибки, вы можете записаться на наш курс по разработке на C++.