21.1. Синтаксис и семантика языков программирования
У каждого языка программирования, как и у любого естественного языка, есть свои синтаксис и семантика.
Синтаксис — совокупность правил некоторого языка, определяющих формирование его элементов. Иначе говоря, это совокупность правил образования семантически значимых последовательностей символов в данном языке. Синтаксис задается с помощью правил, которые описывают понятия некоторого языка. Примерами понятий являются: переменная, выражение, оператор, процедура. Последовательность понятий и их допустимое использование в правилах определяет синтаксически правильные структуры, образующие программы. Именно иерархия объектов, а не то, как они взаимодействуют между собой, определяются через синтаксис. Например, оператор может встречаться только в процедуре, а выражение в операторе, переменная может состоять из имени и необязательных индексов и т.д. Синтаксис не связан с такими явлениями в программе, как «несоответствие типов» или «переменная с данным именем не определена». Этим занимается семантика.
Семантика — правила и условия, определяющие соотношения между элементами языка и их смысловыми значениями, а также интерпретацию содержательного значения синтаксических конструкций языка. Объекты языка программирования не только размещаются в тексте в соответствии с некоторой иерархией, но и дополнительно связаны между собой посредством других понятий, образующих разнообразные ассоциации. Например, переменная, для которой синтаксис определяет допустимое местоположение только в описаниях и некоторых операторах, обладает определенным типом, может использоваться с ограниченным множеством операций, имеет адрес, размер и должна быть описана до того, как будет использоваться в программе.
Текст исходной программы на языке высокого уровня представляет собой обычный тестовый файл. Для его «чтения» и превращения в последовательность машинных команд, прежде всего, выполняется синтаксический анализ текста программы.
Синтаксический анализатор — компонента компилятора, осуществляющая проверку исходных операторов на соответствие синтаксическим правилам и семантике данного языка программирования. Несмотря на название, анализатор занимается проверкой и синтаксиса, и семантики. Он состоит из нескольких блоков, каждый из которых решает свои задачи.
21.2. Структура языков программирования
Языки программирования достаточно сильно отличаются друг от друга по назначению, структуре, семантической сложности, методам реализации. Это накладывает свои специфические особенности на разработку конкретных трансляторов. Структура языка характеризует иерархические отношения между его понятиями, которые описываются синтаксическими правилами. Языки программирования могут сильно отличаться друг от друга по организации отдельных понятий и по отношениям между ними. Например, язык C++ допускает описание переменных в любой точке программы перед первым ее использованием, а в Паскале переменные должны быть определены в специальной области описания. В зависимости от принятого решения, транслятор может анализировать программу за один или несколько проходов, что влияет на скорость трансляции.
Семантика языков программирования изменяется в очень широких пределах. Они отличаются не только по особенностям реализации отдельных операций, но и по парадигмам программирования, определяющим принципиальные различия в методах разработки программ. Специфика реализации операций может касаться как структуры обрабатываемых данных, так и правил обработки одних и тех же типов данных. Даже при выполнении операции сложения двух целых чисел такие языки, как C и Паскаль, могут вести себя по-разному.
Один и тот же язык может быть реализован нескольким способами. Это связано с тем, что теория формальных грамматик допускает различные методы разбора одних и тех же предложений. В соответствии с этим трансляторы разными способами могут получать один и тот же результат (объектную программу) по первоначальному исходному тексту. Существует несколько компиляторов языка Паскаль: Turbo Pascal, MS Pascal, Pascal with Objects, Delphi, Builder. Вместе с тем, все языки программирования обладают рядом общих характеристик и параметров. Эта общность определяет и схожие для всех языков принципы организации трансляторов.
Для любого языка его создателями определяются:
- множество символов, которые можно использовать для записи правильных программ (алфавит);
- множество правильных программ (синтаксис);
- «смысл» каждой правильной программы (семантика).
Рассмотрим пример синтаксического разбора. Пусть в исходном тексте программы встретилась формула a + (b + c) * d. В большинстве языков программирования такая формула определяет иерархию программных объектов, которую можно отобразить в виде дерева (Рис. 21 .79). В кружках представлены символы, используемые в качестве элементарных конструкций, а в прямоугольниках задаются составные понятия, имеющие иерархическую и, возможно, рекурсивную структуру.
Синтаксическая структура, правильная для одного языка, может быть ошибочной для другого. Например, в языке Лисп приведенное выражение не будет распознано. Однако для этого языка корректным будет являться выражение ( * ( + a b c ) d ).
Рис. 21.79. Дерево синтаксического разбора.
Другой характерной особенностью всех языков является их семантика. Она определяет смысл операций языка, корректность операндов. Цепочки, имеющие одинаковую синтаксическую структуру в различных языках программирования, могут различаться по семантике (что, например, наблюдается в C++, Pascal, Basic для приведенного выше фрагмента арифметического выражения). Знание семантики языка позволяет отделить ее от его синтаксиса и использовать для преобразования в другой язык (осуществить генерацию кода). Описание семантики и распознавание ее корректности обычно является самой трудоемкой и объемной частью транслятора, так как необходимо осуществить перебор и анализ множества вариантов допустимых комбинаций операций и операндов.
Синтаксис
Синтаксис в программировании — это набор правил, которые объясняют, как писать код на том или ином языке. Они показывают, как располагать и сочетать друг с другом команды, какие использовать символы, как структурировать записи и так далее.
Ближайший пример — изучение иностранных языков. Например, в школе дети учат английский. Одна из первых задач — понять, как слова сочетаются друг с другом, как из них получаются словосочетания и предложения. То же самое касается русского языка и других. Для языков программирования слово «синтаксис» значит примерно то же самое.
«IT-специалист с нуля» наш лучший курс для старта в IT
Важная особенность: синтаксис ничего не говорит о значении команд или слов. Он определяет только правильность написания. Например, написать функцию с неправильными скобками — это ошибка синтаксиса. А написать функцию, которая работает неверно, — ошибка другого вида. С точки зрения синтаксиса функция может быть верной.
Для чего нужно изучение синтаксиса
Если человек не знает синтаксис языка программирования, он не знает этот язык и не сможет писать на нем программы. Даже если с точки зрения логики код будет верным, при наличии синтаксических ошибок компилятор или интерпретатор не смогут его прочитать. Компьютеры — не люди: человек в состоянии прочесть предложение, написанное с ошибками, а машина — нет.
Поэтому изучение синтаксиса языка — первый шаг при обучении программированию в целом. У разных языков программирования различается синтаксис, поэтому одинаковые программы на них выглядят по-разному. Но если понять принцип, последующие языки будет проще учить.
Попробуйте 9 профессий за 2 месяца и выберите подходящую вам
Примеры правил синтаксиса
- Вид скобок, которые используются при записи той или иной команды.
- Регистрозависимость — есть ли для языка разница между строчными и прописными буквами.
- Необходимость использовать пробелы и переносы строки — или ее отсутствие. Например, в Python это часть синтаксиса, а в JavaScript они не так важны.
- Необходимость или отсутствие необходимости указывать тип переменной при создании.
- Порядок расположения команд и сочетания их друг с другом.
- Символ, которым обозначается комментарий в коде.
Это только несколько примеров. Таких правил намного больше, и для каждого языка они свои. Чем лучше вы знаете синтаксис выбранного языка программирования, тем ниже риск ошибиться при написании кода.
Разница между синтаксисом и семантикой
Есть еще одно похожее понятие, которое тем не менее противоположно синтаксису, — семантика. Семантика говорит о смысле слов и значении команд.
Синтаксис определяет правильность написания, а семантика — смысловую правильность. Можно привести пример из естественных человеческих языков:
- «Я любить Москва это город» — предложение, написанное неправильно с точки зрения синтаксиса. Но его смысл понятен, по крайней мере человеку;
- «Я люблю деревню Санкт-Петербург» — предложение, которое правильно синтаксически. Но семантически оно неверно, ведь Санкт-Петербург — это город, а не деревня. Значение слова совсем другое. Поэтому непонятно: человек ошибся или действительно имел в виду какую-то деревню с таким же названием.
Так и в языках программирования. Синтаксис отвечает за то, поймет ли компьютер, что вы ему сказали. Семантика — за внутреннюю логику написанного, за то, что означают команды.
Курс для новичков «IT-специалист
с нуля» – разберемся, какая профессия вам подходит, и поможем вам ее освоить
Разница между синтаксисом и code style
На ранних этапах изучения важно не запутаться. В языках есть code style — своеобразные «правила хорошего тона» для написания кода. Их придумали разработчики, чтобы лучше разбираться в программах друг друга. Использование code style для компьютера не принципиально: код заработает, даже если «стиль» у него плохой. Хотя мы, конечно, рекомендуем его придерживаться — так вас будут больше ценить другие разработчики.
Синтаксис — совсем другое дело. Им пользоваться обязательно. Иначе код просто останется непонятен компьютеру, тот не сможет его прочесть и исполнить, просто не поймет, что это такое. В отличие от человека, машина не гибкая, и написанное с ошибкой она не распознает.
Что означает «простой синтаксис»
Чтобы разработчикам было легче, современные языки создают с простым синтаксисом — таким, который будет проще запомнить и прочитать. Например, «первая программа» Hello World на языке Python — это всего одна строчка:
Даже по написанию понятно, что она делает: печатает надпись «hello world». Для сравнения: вот код на языке C++, который делает то же самое:
Если вы никогда не имели дела с программированием, то, скорее всего, не поймете, что тут написано. Что такое cout, для чего нужны знаки
Это и есть различия в синтаксисе. Программы на одних языках выглядят и пишутся проще, чем на других. Но синтаксически сложный язык не значит плохой: его просто тяжелее изучить.
Как изучить синтаксис языка
Это первый шаг изучения языка программирования: понять, что собой представляет его синтаксис. Обычно с его основными принципами знакомят на первых же уроках. Со временем, когда вы начинаете изучать более сложные возможности и конструкции, вы узнаёте и их синтаксис.
Если вы боитесь, что не запомните, это не страшно. Синтаксис легко запоминается, если регулярно практиковаться, как и в случае с естественными языками. А если в первое время будет сложно, поначалу можно подглядывать в теоретические материалы. Потом они вам уже не понадобятся.
Еще одна приятная деталь: элементы синтаксиса в разных языках схожи. Поэтому, если вы выучите один язык программирования, учить второй может быть проще, особенно если они похожи друг на друга.
На наших курсах вы узнаете больше о базовых концепциях программирования, познакомитесь с его особенностями и с современными направлениями. Записывайтесь — получите хороший старт в мире современного IT.
Наш лучший курс для старта в IT. За 2 месяца вы пробуете себя в девяти разных профессиях: мобильной и веб-разработке, тестировании, аналитике и даже Data Science — выберите подходящую и сразу освойте ее.