Если вы изучаете язык, вы, вероятно, слышали слово «синтаксис» и постоянно сталкиваетесь с ним. (Чертова синтаксическая ошибка).
Несколько ночей назад я подумал про себя: я никогда серьезно не следил за парадигмами и методами программирования, и сегодня я начал учиться на самых маленьких темах, которые я всегда слышу (даже если я уже помню). Я создал этот репозиторий. Путь обучения, который я выбрал, характерен (в файле LEARNING_LIST.md). давайте пройдем, в отличие от естественных языков, с помощью которых мы передаем наши мысли и чувства, языки программирования можно рассматривать как искусственные языки, определенные мужчинами и женщинами изначально для целей общения с компьютерами, но, что не менее важно, для передачи алгоритмов между людьми. .
Например, определения языка состоят из трёх компонентов:
Синтаксис: синтаксис языка программирования — это набор правил, определяющих комбинации символов, которые считаются правильно структурированными программами на этом языке. Синтаксис языка определяет его поверхностную форму. Текстовые языки программирования основаны на последовательностях символов. Лексическая грамматика текстового языка определяет, как символы должны быть разбиты на лексемы. Синтаксис относится к способам объединения символов для создания правильно построенных предложений (или программ) на языке. Синтаксис определяет формальные отношения между составляющими языка, тем самым обеспечивая структурное описание различных выражений, составляющих допустимые строки в языке. Синтаксис имеет дело исключительно с формой и структурой символов в языке без какого-либо рассмотрения их значения. Синтаксис - это концепция, которая касается только того, действительно ли предложение соответствует грамматике языка.
Семантика: Семантика определяет, имеет ли предложение действительное значение. Семантика раскрывает значение синтаксически допустимых строк в языке. Для естественных языков это означает соотнесение предложений и фраз с объектами, мыслями и чувствами нашего опыта. Для языков программирования семантика описывает поведение, которому следует компьютер при выполнении программы на этом языке. Мы могли бы раскрыть это поведение, описывая взаимосвязь между вводом и выводом программы или пошагово объясняя, как программа будет выполняться на реальной или абстрактной машине. Семантика – это общий термин для изучения значения. В информатике предмет семантики языков программирования направлен на придание программам точного математического значения.
В естественных языках предложение может быть грамматически правильным, но семантически бессмысленным. Например, предложение:
"Человек купил бесконечность в магазине."
Это грамматически правильно, но не имеет смысла в реальном мире. Аналогично, в языках программирования утверждение может быть синтаксически правильным, но семантически неверным, поскольку оно нарушает правила языка или его предполагаемое значение.
На уровне низкоуровневой семантики программирования нас интересует, имеет ли оператор, имеющий правильный синтаксис, смысл в соответствии с системой типов языка или другими правилами. Даже если синтаксис может быть допустимым, семантическое значение операции может быть неверным. Система типов в статически типизированных языках, таких как Java, помогает обеспечить соблюдение этих правил до выполнения, но динамически типизированные языки, такие как JavaScript, не всегда обеспечивают соблюдение этих правил до выполнения.
В JavaScript, который является слабо типизированным, у вас может не быть защиты, обеспечиваемой более строгой системой типов, и язык допускает определенные операции, которые не имеют семантически значимого смысла. Рассмотрим следующий код JavaScript:
let name = "Alice"; name = 42; // No error, but semantically this doesn't make sense.
Здесь синтаксис совершенно корректен, и JavaScript допускает присваивание, но семантически это странно. Вы пытаетесь присвоить число (42) переменной, которая предположительно предназначена для хранения строки (имени). В JavaScript нет проверки типов, которая могла бы помешать вам совершить эту ошибку, но это семантическая ошибка низкого уровня, поскольку она не соответствует намерениям разработчика.
Если мы это реализуем. Оно выполнено. без ошибок!
В более строгих языках, таких как TypeScript или Java, это немедленно вызовет ошибку типа во время компиляции.
TypeScript, расширенная версия JavaScript, вводит проверку типов для предотвращения этих низкоуровневых семантических проблем:
let name: string = "Alice"; name = 42; // Error: Type 'number' is not assignable to type 'string'.
В TypeScript компилятор обнаруживает семантическую ошибку, поскольку 42 — это число, которое нельзя присвоить переменной, объявленной как строка. Такое соблюдение типов защищает разработчика от непреднамеренных ошибок.
Чтобы избежать этих низкоуровневых семантических проблем, в JavaScript разработчики часто используют проверки во время выполнения:
let name = "Alice"; if (typeof name !== "string") { throw new Error("Expected a string!"); }
Несмотря на то, что JavaScript не обеспечивает принудительное использование типов, добавление проверок вручную может помочь избежать ошибок, когда неправильные типы приводят к проблемам в программе.
На более высоком уровне семантика связана с тем, чего должна достичь ваша программа. Дело не только в том, имеет ли программа правильный синтаксис или правильно ли выровнены типы — дело в том, ведет ли программа так, как задумал разработчик, или решает ли проблема, для решения которой она была разработана.
Например, предположим, что вы создаете простую систему торговли акциями. Семантика высокого уровня вашего кода направлена на то, чтобы система торговала акциями правильно и с правильной бизнес-логикой. Даже если код не выдает ошибок типа или синтаксиса, он все равно может не соответствовать предполагаемой функциональности.
Давайте рассмотрим пример высокоуровневой семантики JavaScript, используя упрощенный сценарий торговли акциями:
let openTrade = { symbol: "EURUSD", direction: "buy", profit: 100 }; function closeTrade(trade) { if (trade.profit >= 50) { console.log(`Closing trade for ${trade.symbol} with profit of ${trade.profit}`); } else { console.log(`Trade for ${trade.symbol} is not ready to close.`); } } // Check if a trade is open for EURUSD and close it if the profit target is reached. closeTrade(openTrade);
Синтаксис правильный, программа работает без ошибок. Однако представьте, что теперь мы допустили ошибку на более высоком уровне, например случайное открытие двух сделок по одному и тому же символу, что нарушает бизнес-правила системы.
let openTrades = [ { symbol: "EURUSD", direction: "buy", profit: 100 }, { symbol: "EURUSD", direction: "sell", profit: 20 } ]; // Check all trades and close any that hit their profit target. openTrades.forEach(trade => closeTrade(trade));
Здесь обе сделки обрабатываются независимо, но в итоге система получает две сделки по одному и тому же символу: одну в направлении покупки и одну в направлении продажи. Это нарушает бизнес-правило высокого уровня, согласно которому в любой момент времени у нас должна быть только одна открытая сделка на каждый символ.
Хотя код выполняется без ошибок синтаксиса или типа, он семантически неверен на высоком уровне. Системная логика должна была гарантировать, что одновременно может быть активна только одна сделка на каждый символ. Эта ошибка, скорее всего, приведет к непредвиденным последствиям в реальной торговой системе, например к финансовым потерям.
Чтобы исправить эту семантическую проблему высокого уровня, вам необходимо настроить логику, чтобы гарантировать, что для определенного символа открыта только одна сделка:
let openTrades = [ { symbol: "EURUSD", direction: "buy", profit: 100 } ]; function openNewTrade(newTrade) { // Ensure no other trades are open for the same symbol. const existingTrade = openTrades.find(trade => trade.symbol === newTrade.symbol); if (!existingTrade) { openTrades.push(newTrade); console.log(`Opened new trade for ${newTrade.symbol}`); } else { console.log(`Cannot open a new trade for ${newTrade.symbol}, trade already exists.`); } } openNewTrade({ symbol: "EURUSD", direction: "sell", profit: 0 });
Здесь логика гарантирует, что новая сделка не может быть открыта, если уже существует активная сделка по тому же символу. Это семантическое исправление высокого уровня, поскольку оно касается основной бизнес-логики, которой должна следовать программа, а не проблемы синтаксиса или типа.
Это была лишь основная информация о каждом. Для получения дополнительной информации вы можете прочитать эти статьи:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3