Может ли компилятор обнаруживать семантические ошибки или нет? Если нет, когда обнаруживаются ошибки?
Насколько мне известно, семантические ошибки — это те ошибки, которые возникают в результате выражений, в которых используются операторы с неправильным числом / типом операндов.
n3=n1*n2;//n1 is integer, n2 is a string, n3 is an integer
Вышеприведенное утверждение семантически неверно.
Но, читая C Primer Plus Стивена Прата, я обнаружил следующее утверждение
Компилятор не обнаруживает семантические ошибки, потому что они не нарушают правила C. Компилятор не может угадать ваши истинные намерения. Это оставляет вам возможность находить подобные ошибки. Один из способов — сравнить то, что делает программа, с тем, что вы от нее ожидали.
Кто, если не компилятор, обнаруживает эти ошибки?
Я что-то упускаю?
Gautam Kumar 12 Май 2010 в 09:30
Ваш пример не является семантической ошибкой — это синтаксическая ошибка. Даже если строка * int действительна (это может означать повторение строки n раз), типы несовместимы.
Общая семантика. Ошибка оценки
12 Май 2010 в 09:38
Thomas Padron-McCarthy
12 Май 2010 в 10:49
— Я понимаю (и признаю) вашу точку зрения. Я использовал термин «семантический» в духе цитаты Стивена Прата из ОП.
12 Май 2010 в 12:59
На этот вопрос так много плохих ответов.
29 Ноя 2018 в 08:38
11 ответов
Лучший ответ
Слово «семантический» неоднозначно, и вы столкнулись с двумя немного разными значениями в этих разных контекстах.
Первое значение (ваш код) связано с тем, как компилятор интерпретирует код, который вы вводите. Но есть разные степени интерпретации для этого — синтаксис — это один уровень, где интерпретация просто решает, что n1*n2 означает, что вы хотите выполнить умножение. Но здесь есть и более высокий уровень интерпретации — если n1 — целое число, а n2 — плавающая точка, каков результат? Что, если я его закругляю, должен ли он быть округлен, усечен и т. Д.? Это «семантические» вопросы, а не синтаксические, но кто-то где-то решил, что да, компилятор может ответить на них для большинства людей.
Они также решили, что у компилятора есть ограничения на то, что он может (и должен!) Интерпретировать. Например, он может решить, что приведение к int является усечением, а не округлением, но он не может решить, что вы действительно хотите, когда вы пытаетесь умножить массив на число.
(Хотя иногда люди решают, что МОГУТ. В Python, [1] * 3 == [1,1,1] .)
Второе значение относится к гораздо более широкому диапазону. Если результат этой операции предполагается отправить на периферийное устройство, которое может принимать значения от 0x000 до 0xFFF, и вы умножаете 0x7FF на 0x010, очевидно, вы допустили семантическую ошибку. Разработчики периферийных устройств должны решить, нужно ли и как с этим справиться.
Вы, как программист, также можете решить провести некоторые проверки работоспособности. Но компилятор не знает об этих внешних семантических ограничениях или о том, как их применять (фильтровать вводимые пользователем данные? Возвращать ошибку? Усекать? Переносить?), О чем говорит вторая цитата.
Типовые антишаблоны и «грязные техники». Типовые логико-семантические ошибку в программном коде
detly 12 Май 2010 в 09:54
Я думаю, что писатель, написавший книгу, по-разному определил «семантику». Для большинства компиляторов есть этап, включающий некоторые семантические проверки.
Семантический анализ — это этап, на котором компилятор добавляет семантическую информацию в дерево синтаксического анализа и строит таблицу символов. На этом этапе выполняются семантические проверки, такие как проверка типа (проверка ошибок типа) или привязка объекта (связывание ссылок на переменные и функции с их определениями) или определенное присвоение (требование инициализации всех локальных переменных перед использованием), отклонение неправильных программ или выдача предупреждения. Для семантического анализа обычно требуется полное дерево синтаксического анализа, а это означает, что эта фаза логически следует за фазой синтаксического анализа и логически предшествует фазе генерации кода, хотя часто можно объединить несколько фаз в один проход по коду в реализации компилятора.
monn 12 Май 2010 в 09:41
Семантические ошибки — это все те ошибки, когда ваш код делает что-то, чего вы не планировали.
Эти ошибки можно выявить путем тестирования или анализа.
Анализ означает, что вы или инструмент изучаете ваш код и пытаетесь найти проблемы. Это предполагает использование обзоров кода и статических анализаторов.
Тестирование — это когда вы даете своей программе некоторые входные данные, которые, как ожидается, приведут к заданному результату, если программа семантически верна. Итак, если фактический результат не соответствует ожидаемому, программа семантически неверна.
Проще говоря, именно ВЫ, разработчик или тестировщик, должны улавливать семантические ошибки.
Midhat 12 Май 2010 в 09:37
Эта цитата говорит о таких вещах, как выполнение x
Но что касается семантики языка (не разрешено добавлять строку и целое число), да, это компилятор обрабатывает это.
R Samuel Klatchko 12 Май 2010 в 09:37
Это синтаксическая ошибка, которую компиляторы действительно могут обнаружить и сообщить.
Семантическая ошибка больше похожа на то, что хорошо компилируется (вплоть до самых типов), но это не то, что вы хотите. Семантические ошибки являются частью вашего алгоритма в большей степени, чем ваш фактический синтаксис.
Blindy 12 Май 2010 в 09:38
Кто, если не компилятор, обнаруживает эти ошибки?
Иногда никто: компилятору не нужно вставлять какие-либо проверки времени выполнения, которые могли бы помочь заметить ошибку, когда она происходит, и выполнение просто продолжается.
Иногда среда выполнения: программа обращается к недопустимому адресу из-за ошибки, и процесс находится за пределами адресного пространства, к которому процесс может легально получить доступ.
Вы можете дополнить компилятор статическим анализатором для обнаружения некоторых или всех ошибок в программе, но они также могут иметь ложные срабатывания : они могут выдавать предупреждение для фрагмента кода, который работает без ошибки.
Pascal Cuoq 12 Май 2010 в 09:40
Фактически, умножение строки и целого числа является синтаксической ошибкой, поскольку умножение несовместимых типов (таких как строка и целое число) не определено в C.
Семантическая ошибка — это ошибка, которая возникает, когда ваша программа компилируется, но не выполняет то, что вы хотите.
Michael Mrozek 12 Май 2010 в 09:41
Строковые литералы и строки представлены в памяти в виде чисел (байт / м слов или в высокоуровневом формате — короткие, целые числа). C — это низкоуровневый уровень программирования, на котором все приближено к машинному / ассемблерному уровню. Таким образом, умножение числа на строковый литерал (если это массив, это будет неверно) правильно, потому что этот строковый литерал будет фактически (после компиляции) числом.
DEADlist 12 Май 2010 в 09:47
На самом деле (поскольку в C нет типа string , а есть только char* ) вы можете очень хорошо умножить n1 на n2 . Операция легальна и четко определена, поэтому компилятор не выдаст ошибку.
Логически (семантически) этот оператор не имеет смысла, поэтому, скорее всего, это ошибка кодирования. Чтобы ответить на ваш вопрос: вы несете ответственность за обнаружение и исправление подобных ошибок.
Источник: question-it.com
Что такое семантические ошибки в языке Си и приведите несколько примеров?
1) Синтаксические ошибки. Это неверный код, который компилятор не понимает, например, ваш пример умножения строки на целое число в C. Компилятор обнаружит их, потому что он не может их скомпилировать.
2) Семантические ошибки. Это действительный код, который понимает компилятор, но он не соответствует тому, что вы, программист, намеревались. Это могут быть неправильные переменные, неправильные операции или операции в неправильном порядке. Компилятор не может их обнаружить.
Есть третий класс, который может быть самым дорогим:
3) Ошибки проектирования. Код верен и не содержит ошибок и делает именно то, что вы хотели. Но ваши намерения неверны, например, основаны на неправильных предположениях, неправильных моделях, или вы использовали неправильные формулировки, неправильно поняли клиента или тому подобное.
user1007137 21 окт ’11 в 12:56 2011-10-21 12:56
2011-10-21 12:56
4 ответа
Целый класс семантических ошибок связан с приоритетом:
if( a + b
Или неожиданные задания:
if( a = b ) // do you really want to assign here?
user34088 21 окт ’11 в 13:04 2011-10-21 13:04
2011-10-21 13:04
Простой пример семантической ошибки:
int CalculateArea( int width, int height ) < return width + height; // semantic error — you really should multiply to get the area >
Это допустимый C++, но он не будет вести себя так, как вы собираетесь, если вы используете его для поиска области прямоугольника.
user878491 21 окт ’11 в 13:02 2011-10-21 13:02
2011-10-21 13:02
Это семантическая ошибка:
// add one to x x -= 1;
// add one to x y += 1;
И, более реалистично:
// update all elements of A for (size_t i=1; i
user166749 21 окт ’11 в 13:01 2011-10-21 13:01
2011-10-21 13:01
Семантическая ошибка означает просто «логическая ошибка», когда вы буквально пишете правильный код, но логика, лежащая в его основе, заставляет его делать то, о чем вы не думали, а не то, что хотели.. Например, запись n3=n1*n2, когда на самом деле вы хотели делить — компилятор не может сказать, что вы намеревались делить вместо умножения; Вы сказали, чтобы это умножилось, так оно и есть.
Источник: stackru.com
Семантическая ошибка: понятие, определение, классификация ошибок, правила запоминания и примеры
Лексико-семантические ошибки можно встретить достаточно часто, особенно в разговорной речи или переписке. Такие ошибки встречаются и при переводах с одного языка на другой. Их также называют смысловыми, потому что возникают они от неверного применения слов и словосочетаний в контексте написанного.
Классификация
Понятие «семантические ошибки» (или «лексико-семантические ошибки») охватывает несколько групп смысловых ошибок. Первая группа объединяет неверно подобранное слово в предложении. Вторая связана с употреблением слов в значении, которое им несвойственно (здесь речь идет о неверном подборе из существующих слов-синонимов). Третья группа – ошибки, возникшие из-за лексической несочетаемости фразы. Четвертая группа – неверно подобранные паронимы (слова, схожие по написанию, но с различным лексическим значением).
Неправильно подобранное слово
Такие семантические ошибки часто возникают из-за неточного понимания значения слова. Например, в предложении «За месяц мы потребили сто киловольт электричества» есть неуместное употребление слова «киловольт», т. к. электроэнергия измеряется в киловаттах. Еще один пример такой ошибки: «Покупатели магазина стали невольными зрителями этого происшествия».
При прочтении такого предложения в целом понятно, о чем идет речь, но вместо слова «зрители», которое в современном русском языке по смыслу означает просмотр театрального представления, спортивного состязания или киносеанса, было бы уместнее употребить слово «свидетели», означающее присутствие во время какого-либо события. Чтобы избежать подобных ошибок, лучше не употреблять в разговорной речи и в тексте слова, в значении которых есть сомнения, либо же стоить сверить свои знания со словарем. Очень часто подобные ошибки встречаются в школьных сочинениях, поэтому ученикам особенно важно изучать точные значения различных слов.
Ошибки, связанные с употреблением синонимов
В русском языке существует множество слов-синонимов со схожим значением, но разным лексическим смыслом. Например, трофей и приз, храбрый и смелый, роль и функция. Из-за употребления неверно подобранного слова из подобных синонимов и возникают семантические ошибки.
Примеры таких ошибок: «Спортсмен честно выиграл свой трофей», «Эта идея была очень храброй», «В моей жизни подобное явление сыграло свою функцию». В этих предложениях четко прослеживается, что употреблено неверное слово из пары. В первом примере логично было бы употребить слово «приз», ведь оно имеет значение некой ценности, которую выигрывают, завоевывают в соревновании.
Слово «трофей» тут неуместно: оно обозначает нечто, связанное с завоеванием. Например, охотничий, военный трофей. Во втором примере следовало бы употребить слово «смелый», ведь оно обозначает не только внешнее проявление, но и некое внутреннее свойство человека (смелыми могут быть его мысли или идеи), в то время как слово «храбрый» обычно относят к поведению в конкретной ситуации. В третьем примере нужно было использовать слово «роль» вместо «функция», т. к. слово «роль» означает то, что играют или изображают, в том числе в переносном смысле, а «функция» – то, что выполняется, взаимодействует.
Несочетаемость
Семантические ошибки такого типа возникают из-за неверного сочетания слов в предложении. Часто они появляются в момент быстрого написания какого-либо текста без последующей проверки. Например, ошибка этой группы есть в предложении «Герой попал в несчастье». Конечно же, вместо слова «несчастье» тут было бы уместно употребить слово «беда».
Хотя эти слова являются схожими по значению, но в данном предложении слово «несчастье» с остальной конструкцией не сочетается. Употребить именно это слово возможно, если перестроить остальную часть предложения: «С героем случилось несчастье».
Еще один пример такого типа ошибок: «Более неуверенные в себе люди часто одиноки». В этом предложении правильно было бы употребить такие фразы: «Менее уверенные в себе люди часто одиноки» или «Более робкие люди часто одиноки». Ведь само словосочетание «более неуверенные» лексически неоправданно: первое слово предполагает большую степень качества, а второе – отрицание качества. И хотя общий смысл в подобных предложениях обычно понятен, подобных ошибок следует избегать.
Ошибки из-за неверного подбора паронимов
Эта группа семантических ошибок связана с выбором неверного слова из существующих для обозначения явления или предмета паронимов. Чаще всего паронимы являются однокоренными словами, схожими по значению, но в то же время обозначающими разные понятия. Это, например, такие пары слов, как «высотный-высокий», «дальний-далекий», «логический-логичный», «экономический-экономичный», «короткий-краткий» и т. д. Например, в предложении «У фильма вполне логическая концовка» неверно выбран пароним: вместо слова «логическая» нужно было употребить слово «логичная». Ведь слово «логический» применяется только для обозначения явления, основанного на законах логики, а слово «логичный», кроме этого, означает еще и некую последовательность или закономерность, и как раз это значение по смыслу подходит предложению из примера.
Еще один пример предложения, где есть подобная семантическая ошибка: «Значение этого параметра говорит о хорошей экономичной эффективности». В данном случае речь шла об экономической эффективности, т. е. показателе, связанном с экономикой, а в предложении подобран неверный пароним: «экономичный». Это слово означает выгоду в хозяйственном отношении и по смыслу к данному предложению не подходит.
Семантические ошибки при переводе
Автор, пишущий на родном языке, сталкивается с проблемами появления смысловых ошибок гораздо реже, чем переводчик. Ведь переводчик в процессе своей работы сталкивается с тем, что необходимо четко знать не только грамматику и правила построения предложений для обоих языков, но и понимать, какой смысл у каждого слова именно в том значении, в котором оно употреблено. Очень важно понимать лексическую сочетаемость слов в предложениях, чтобы не допустить семантических ошибок.
В языке, с которого осуществляется перевод, может употребляться много устойчивых выражений, которые при последовательном переводе каждого слова абсолютно теряют смысл. Обычно такие выражения без труда видит опытный переводчик, но начинающий, даже самый грамотный, не всегда сможет их распознать. Поэтому после перевода любой научной статьи или литературного произведения получившийся результат отдается на проверку редактору, который сможет оценить качество перевода и в случае необходимости внести поправки. Конечно, бывает, что срабатывает человеческий фактор, и ошибка остается незамеченной и редактором.
Пример ошибки при переводе
Семантическая ошибка имеет место в переводе И. Кашкина произведения «Владетель Баллантрэ» Р. Стивенсона: «Единственно, чего я добиваюсь, — это оградить себя от клеветы, а дом мой – от вашего вторжения». В этом предложении уместно было бы употребить числительное «единственное» вместо наречия «единственно».
В литературе
Семантические ошибки встречаются и в литературных произведениях. В большинстве случаев это связано с тем, что значения тех или иных слов, а также правила их написания и употребления меняются со временем. Например, в одном из произведений А. С. Пушкина можно встретить следующее словосочетание: «Румянцев повез его на аппробацию Петра».
Из контекста становится понятным, что слово «апробация» в то время имело значение «утверждение, одобрение». Затем это слово изменилось и в написании (стало употребляться с одной «п»), и в значении: стало обозначать утверждение после произведенного испытания. Поэтому сегодня приведенное выше выражение воспринимается как ошибочное.
Еще один пример – словосочетание из романа Б. Полевого «Глубокий тыл»: «Большая половина фабрики». В данном случае ошибочно употреблено слова «половина», означающее равную часть, ½ целого. Половина не может быть большей или меньшей, поэтому такое сочетание слов является ошибкой. Однако подобные выражения можно встретить и в других произведениях, а также в периодической печати.
Источник: fb.ru