Могут ли быть в алгоритме или программе другие ошибки нежели синтаксические и семантические

Обновлено: 04.07.2024

Может ли компилятор обнаруживать семантические ошибки или нет? Если нет, когда обнаруживаются ошибки?

Насколько мне известно, семантические ошибки - это те ошибки, которые возникают в результате выражений, в которых используются операторы с неправильным числом / типом операндов.

Вышеприведенное утверждение семантически неверно.

Но, читая C Primer Plus Стивена Прата, я обнаружил следующее утверждение

Компилятор не обнаруживает семантические ошибки, потому что они не нарушают правила C. Компилятор не может угадать ваши истинные намерения. Это оставляет вам возможность находить подобные ошибки. Один из способов - сравнить то, что делает программа, с тем, что вы от нее ожидали.

Кто, если не компилятор, обнаруживает эти ошибки?

Я что-то упускаю?

Слово «семантический» неоднозначно, и вы столкнулись с двумя немного разными значениями в этих разных контекстах.

Первое значение (ваш код) связано с тем, как компилятор интерпретирует код, который вы вводите. Но есть разные степени интерпретации для этого - синтаксис - это один уровень, где интерпретация просто решает, что n1*n2 означает, что вы хотите выполнить умножение. Но здесь есть и более высокий уровень интерпретации - если n1 - целое число, а n2 - плавающая точка, каков результат? Что, если я его закругляю, должен ли он быть округлен, усечен и т. Д.? Это «семантические» вопросы, а не синтаксические, но кто-то где-то решил, что да, компилятор может ответить на них для большинства людей.

Они также решили, что у компилятора есть ограничения на то, что он может (и должен!) Интерпретировать. Например, он может решить, что приведение к int является усечением, а не округлением, но он не может решить, что вы действительно хотите, когда вы пытаетесь умножить массив на число.

(Хотя иногда люди решают, что МОГУТ. В Python, [1] * 3 == [1,1,1] .)

«Семантическая ошибка» - это еще один термин для «логической ошибки», когда вы буквально пишете неправильный код. Например, если вы пишете n3=n1*n2 , когда вы действительно хотите разделить - компилятор не имеет возможности сказать, что ваш алгоритм должен был делить вместо умножения; вы сказали ему размножаться, так оно и есть.

Ошибка, которую вы описали в своем примере, является ошибкой безопасности типа, и компиляторы могут обнаружить ее на этапе проверки типов (если язык строго типизирован)

Есть три основных типа ошибок.

1) Синтаксические ошибки. Это недопустимый код, который компилятор не понимает, например ваш пример умножения строки на целое число в C. Компилятор обнаружит их, потому что он не может их скомпилировать.

2) Семантические ошибки. Это допустимый код, который понимает компилятор, но он не соответствует тому, что задумал программист. Они могут использовать неправильную переменную, неправильную операцию или операции в неправильном порядке. Компилятор не может их обнаружить.

Есть третий класс, который может быть самым дорогим:

3) Ошибки проектирования. Код правильный, без ошибок и делает именно то, что вы задумали. Но ваши намерения ошибочны, например основаны на неправильных предположениях, неправильных моделях или вы использовали неправильные формулы, неправильно поняли клиента и т. д.

Я думаю, что писатель, написавший книгу, по-разному определил «семантику». Для большинства компиляторов есть этап, включающий некоторые семантические проверки.

Семантический анализ - это этап, на котором компилятор добавляет семантическую информацию в дерево синтаксического анализа и строит таблицу символов. На этом этапе выполняются семантические проверки, такие как проверка типа (проверка ошибок типа) или привязка объекта (связывание ссылок на переменные и функции с их определениями) или определенное присвоение (требование инициализации всех локальных переменных перед использованием), отклонение неправильных программ или выдача предупреждения. Для семантического анализа обычно требуется полное дерево синтаксического анализа, а это означает, что эта фаза логически следует за фазой синтаксического анализа и логически предшествует фазе генерации кода, хотя часто можно объединить несколько фаз в один проход по коду в реализации компилятора.

Семантические ошибки - это все те ошибки, когда ваш код делает что-то, чего вы не планировали.

Эти ошибки можно выявить путем тестирования или анализа.

Анализ означает, что вы или инструмент изучаете ваш код и пытаетесь найти проблемы. Это предполагает использование обзоров кода и статических анализаторов.

Тестирование - это когда вы даете своей программе некоторые входные данные, которые, как ожидается, приведут к заданному результату, если программа семантически верна. Итак, если фактический результат не соответствует ожидаемому, программа семантически неверна.

Проще говоря, именно ВЫ, разработчик или тестировщик, должны улавливать семантические ошибки.

Эта цитата говорит о таких вещах, как выполнение x <= 1 там, где вам действительно следовало бы сделать x < 1 .

Но что касается семантики языка (не разрешено добавлять строку и целое число), да, это компилятор обрабатывает это.

Это синтаксическая ошибка, которую компиляторы действительно могут обнаружить и сообщить.

Семантическая ошибка больше похожа на то, что хорошо компилируется (вплоть до самых типов), но это не то, что вы хотите. Семантические ошибки являются частью вашего алгоритма в большей степени, чем ваш фактический синтаксис.

Кто, если не компилятор, обнаруживает эти ошибки?

Иногда никто: компилятору не нужно вставлять какие-либо проверки времени выполнения, которые могли бы помочь заметить ошибку, когда она происходит, и выполнение просто продолжается.

Иногда среда выполнения: программа обращается к недопустимому адресу из-за ошибки, и процесс находится за пределами адресного пространства, к которому процесс может легально получить доступ.

Вы можете дополнить компилятор статическим анализатором для обнаружения некоторых или всех ошибок в программе, но они также могут иметь ложные срабатывания : они могут выдавать предупреждение для фрагмента кода, который работает без ошибки.

Фактически, умножение строки и целого числа является синтаксической ошибкой, поскольку умножение несовместимых типов (таких как строка и целое число) не определено в C.

Семантическая ошибка - это ошибка, которая возникает, когда ваша программа компилируется, но не выполняет то, что вы хотите.

Строковые литералы и строки представлены в памяти в виде чисел (байт / м слов или в высокоуровневом формате - короткие, целые числа). C - это низкоуровневый уровень программирования, на котором все приближено к машинному / ассемблерному уровню. Таким образом, умножение числа на строковый литерал (если это массив, это будет неверно) правильно, потому что этот строковый литерал будет фактически (после компиляции) числом.

На самом деле (поскольку в C нет типа string , а есть только char* ) вы можете очень хорошо умножить n1 на n2 . Операция легальна и четко определена, поэтому компилятор не выдаст ошибку.

Логически (семантически) этот оператор не имеет смысла, поэтому, скорее всего, это ошибка кодирования. Чтобы ответить на ваш вопрос: вы несете ответственность за обнаружение и исправление подобных ошибок.

Некоторое время назад ряд компаний провел исследование оценки стоимости ошибок, возникающих на разных этапах создания программ. Каждая фирма действовала независимо, тем не менее результаты получены примерно одинаковые: если стоимость усилий, необходимых для обнаружения и устранения ошибок на стадии написания кода, принять за единицу, то стоимость выявления и устранения ошибки на стадии выработки требований будет в 5–10 раз меньше, а стоимость обнаружения и устранения ошибки на стадии сопровождения – в 20 раз больше.

Откуда берется такая высокая стоимость ошибки (рис. 1.6)? Ко времени обнаружения ошибки в требованиях группа разработчиков уже могла потратить время и усилия на создание проекта по этим ошибочным требованиям. В результате проект, вероятно, придется отбросить или пересмотреть.

Истинная природа ошибки может быть замаскирована; при проведении тестирования и проверок на данной стадии все думают, что имеют дело с ошибками проектирования, и значительное время и усилия могут быть потрачены впустую.

В зависимости от того, где и когда при работе над проектом разработки программного приложения был обнаружен дефект, цена его может разниться в 50–100 раз.


Рис. 1.6. Оценка стоимости ошибок на разных этапах создания программного обеспечения

Причина состоит в том, что для его исправления придется затратить средства на некоторые (или все) ниже перечисленные действия:

· Замена заказа – сообщить клиентам и операторам о необходимости заменить дефектную версию исправленной.

·Внесение исправлений – выявить и устранить все неточности, вызванные неправильным функционированием ошибочно специфицированной системы, что может потребовать выплаты определенных сумм возмущенным клиентам, повторного выполнения определенных вычислительных задач на ЭВМ и т.п.

·Списание той части работы (кода, части проектов и т.п.), которая выполнялась с наилучшими побуждениями, но оказалась ненужной, когда обнаружилось, что все это создавалось на основе неверных требований.

·Отзыв дефектных версий встроенного программного обеспечения и соответствующих руководств. Если принять во внимание, что программное обеспечение сегодня встраивается в различные изделия – от наручных часов и микроволновых печей до автомобилей – такая замена может коснуться как этих изделий, так и встроенного в них программного обеспечения.

·Выплаты по гарантийным обязательствам.

· Ответственность за изделие – если клиент через суд требует возмещение убытка, причиненного некачественным программным продуктом.

· Затраты на обслуживание – представитель компании должен посетить клиента, чтобы установить новую версию программного обеспечения.

Рассмотрим ошибки, возникающие на этапе кодирования (программирования). Программная ошибка (табл. 1.3) – это любая ошибка, содержащаяся в программе. Наличие ошибки в программе очевидно, когда программа либо не компилируется, либо работает неправильно. Различают синтаксические и семантические ошибки. Они выявляются при трансляции и тестировании программы и устраняются в процессе отладки программы.

Виды программных ошибок

Виды программных ошибок

Способы их обнаружения

Статический контроль и диагностика компиляторами и компоновщиком

Ошибки выполнения, выявляемые автоматически:

а) переполнение, защита памяти;

б) несоответствие типов;

run-time системы программирования;

операционной системой – по превышению лимита времени

Программане соответствует спецификации

Спецификация не соответствует требованиям

Синтаксическая ошибка – ошибка в программе, связанная с нарушением синтаксиса языка программирования. К таким ошибкам относятся нарушения грамматических правил: неправильное написание констант, переменных, выражений, операторов, процедур и других синтаксических конструкций.

Семантическая ошибка в программе, не связанная с нарушением синтаксиса языка программирования. К таким ошибкам относятся: неправильное описание алгоритма решения задачи, неверное определение типа или значения переменных, несогласованность исходных данных с алгоритмом, неверное использование правильных синтаксических конструкций языка.

В программном обеспечении распространены ошибки. Их легко сделать, а найти сложно. В этой главе мы рассмотрим темы, связанные с поиском и устранением ошибок в наших программах на C++, включая изучение того, как использовать интегрированный отладчик, который является частью нашей IDE.

Хотя инструменты и методы отладки не входят в стандарт C++, умение находить и устранять ошибки в программах, которые вы пишете, является чрезвычайно важной частью успешной работы программиста. Поэтому мы уделим немного времени рассмотрению этих тем, чтобы по мере усложнения программ, которые вы пишете, ваша способность диагностировать и устранять проблемы развивалась с той же скоростью.

Если у вас есть опыт отладки программ на другом компилируемом языке программирования, многое из этого будет вам знакомо.

Синтаксические и семантические ошибки

Программирование может быть сложной задачей, и C++ – довольно необычный язык. Сложите эти две вещи вместе и получите множество способов сделать ошибку. Ошибки обычно делятся на две категории: синтаксические ошибки и семантические ошибки (логические ошибки).

Синтаксическая ошибка возникает, когда вы пишете инструкцию, недопустимую в соответствии с грамматикой языка C++. Сюда входят такие ошибки, как отсутствие точек с запятой, использование необъявленных переменных, несоответствие круглых или фигурных скобок и т.д. Например, следующая программа содержит довольно много синтаксических ошибок:

К счастью, компилятор обычно перехватывает синтаксические ошибки и генерирует предупреждения или ошибки, поэтому вы легко обнаружите и устраните проблему. Затем просто снова попробуйте скомпилировать программу, пока не избавитесь от всех ошибок.

После того, как ваша программа скомпилировалась правильно, может быть непросто добиться от нее желаемого результата. Семантическая ошибка возникает, когда оператор синтаксически правильный, но не выполняет то, что задумал программист.

Иногда это приводит к сбою программы, например, в случае деления на ноль:

Современные компиляторы стали лучше обнаруживать определенные типы распространенных семантических ошибок (например, использование неинициализированной переменной). Однако в большинстве случаев компилятор не сможет отловить большинство из этих типов проблем, потому что компилятор предназначен для обеспечения соблюдения грамматики, а не намерений.

В приведенных выше примерах ошибки довольно легко обнаружить. Но в большинстве нетривиальных программ, взглянув на код, семантические ошибки найти нелегко. Здесь могут пригодиться методы отладки.

Какую ошибку называют синтаксической, а какую - семантической?

Какие из этих видов ошибок относятся к программе, а какие - к алгоритмам?

Могут ли быть в алгоритме или программе другие ошибки, нежели синтаксические и семантические?

Если да, то как бы вы их назвали?


Синтаксическаяошибка - нарушениеформальногоописанияязыкапрограммирования, т.

Е. напримернепоставиливконцестроки ; илиоператорifнаписаличерездвеf, чашевсегоявляютсяопечаткамивтексепрограммы

Семантическаяошибка - ошибка связаннаясвыполнениемалгоритма, иногдасемантическиеошибкиназываютлогическими, какпримерможнопривестипопыткуобращениякнеописаннойпеременнойилиошибкевформулах.

Типовсемантическихошибокоченьмногоивычислительные, типаделенияна0, преобразованиятипов, когдавпеременнуютипаintпихаютстрокуит.

Ошибкинеявляющиесясинтаксическимиисемантическимимогуттак - жевстречаться, напримерпользовательпробуетзаписатьданныеназащищенныйдискиполучаетошибку, новиноватавэтомнепрограммаапользователь, введшийнекорректныеданные.


Какие программы называются прикладными?

Какие программы называются прикладными?


Vanyablizard 20 сент. 2018 г., 04:26:31 | 5 - 9 классы

К какому виду ппо относится профессиональные программы?

К какому виду ппо относится профессиональные программы.


КАКИЕ ПРОГРАММЫ НАЗЫВАЮТ ПРИКЛАДНЫМИ?

КАКИЕ ПРОГРАММЫ НАЗЫВАЮТ ПРИКЛАДНЫМИ.


Запиши алгоритм запуска программы Paint?

Запиши алгоритм запуска программы Paint.


Missperderina 14 авг. 2018 г., 18:18:11 | 5 - 9 классы

Сходство и отличие между программой и алгоритмом?

Сходство и отличие между программой и алгоритмом.


Katyushulica 11 февр. 2018 г., 00:34:41 | 10 - 11 классы

Что означает это в паскале, при запуске программы(что за ошибка?

Что означает это в паскале, при запуске программы(что за ошибка?


Что такое алгоритм?

Что такое алгоритм?

Зачем люди составляют и исполняют алгоритм.

Какими разными способами можно описать способ решения задач?

Как называют наглядную модель процесса решения задач?

Какой алгоритм можно назвать линейным?


Andreycocom 9 февр. 2018 г., 13:08:16 | 5 - 9 классы

Как вы думаете справедливо ли утверждение ''синтаксический контроль транслятором текста программы предназначен для проверки соблюдения свойства понятности алгоритма''?

Как вы думаете справедливо ли утверждение ''синтаксический контроль транслятором текста программы предназначен для проверки соблюдения свойства понятности алгоритма''?


MarikaMarinka 22 окт. 2018 г., 14:38:53 | 5 - 9 классы

Переменная A целочисленная?

Переменная A целочисленная.

При каких значениях A программа выдаст ошибку о несоответствии типов?


Алгоритм называется вспомогательным, если а) он предполагает выбор действий б) повторяет действия до выполнения какого – либо условия ; в) решает часть задачи и вызывается из основной программы?

Алгоритм называется вспомогательным, если а) он предполагает выбор действий б) повторяет действия до выполнения какого – либо условия ; в) решает часть задачи и вызывается из основной программы.


V = k * i k = 200 * 150 = 30000 16 = 2 ^ i ; i = 4 бита ; V = 4 * 30000 = 120000 бит = 15000 байт.



Схема метро (метрополитен), топографическая карта (участок местности) ; план эвакуации (здание). P. S. В скобках указаны объекты, информационными моделями которых являются данные схемы.


Средняя линия равна сумме оснований, деленной на 2 Т. Е. .


4. 5. В столбец A ввести 2 начальных значения (в моем примере - 15 и 13 ; в задании - 103 и 101), остальные значения получить протяжной на нужное количество ячеек. В ячейку B1 ввести формулу = 1 / A1, в ячейку B2 - формулу = 1 / (A2 + B1). Остальн..


11114444Бит = 0. 00129389Гигабайт.


> dir D : / d / D Вывод списка в нескольких столбцах с сортировкой по столбцам. Колво столбцов определяется автоматически от кол - ва папок и файлов. Нужно где - то 25 штук для 3 столбцов, и чтоб хватило ширины окна.


1101(2) = 1 * 2 ^ 3 + 1 * 2 ^ 2 + 1 * 2 ^ 0 = 8 + 4 + 1 = 13(10) 462(8) = 4 * 8 ^ 2 + 6 * 8 ^ 1 + 2 * 8 ^ 0 = 4 * 64 + 6 * 8 + 2 = 256 + 48 + 2 = 306(10) F05(16) = 15 * 16 ^ 2 + 5 * 16 ^ 0 = 15 * 256 + 5 = 3845(10).

Читайте также: