Файл: Обзор языков программирования высшего уровня.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 24.04.2023

Просмотров: 195

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Пример. Правило записи условного оператора в форме РБНФ:

Имена, выделенные курсивом, представляют синтаксические категории, а имена и символы, выделенные полужирным шрифтом, представляют фактические символы, которые должны появиться в тексте программы. Каждое правило содержит символ «:: =», означающий «представляет собой». Прочие символы используются для краткости записи:

  • [ ] Не обязательный
  • {} Ноль или более повторений
  • | Или

Таким образом, else-оператор в if-операторе не является обязательным.

Правила синтаксиса легче изучить, если они заданы в виде диаграмм (рис. 2.1). Круги или овалы обозначают фактические символы, а прямоугольники — синтаксические категории, которые имеют собственные диаграммы.

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

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

Семантика

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

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

  • Указателем на следующую команду, которая будет выполнена
  • Содержимым памяти программы

Семантика команды задается описанием изменения состояния, вызванного выполнением команды.

Формализация семантики языков программирования дает дополнительное преимущество — появляется возможность выполнить верификацию программы. По сути, выполнение программы можно формализовать с помощью аксиом, которые описывают, как оператор преобразует состояние, удовлетворяющее утверждению (логической формуле) на входе, в состояние, которое удовлетворяет утверждению на выходе. Смысл программы определяется путем построения входных и выходных утверждений для всей программы на основе утверждений для отдельных операторов. Результатом является доказательство того, что если входные данные удовлетворяют утверждению на входе, то выходные данные удовлетворяют утверждению на выходе.


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

Типизация данных

Данные в языках программирования можно классифицировать в зависимости от допустимых операций и целей использования. Такая классификация упрощает понимание программы и выполняемого ею процесса обработки данных и позволяет обнаружить ошибочное использование данных на этапе компиляции. В такой классификации типами данных называют отдельные ее классы.

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

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

Тип данных назначается при объявлении объекта и определяет:

  • Значения, которые может принимать объект данного типа
  • Операции, которые используются для манипуляции над объектами данного типа

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

    • Простые типы данных
      • Целый
      • Вещественный
      • Символьный
      • Логический
      • Перечисляемый
      • Интервальный
    • Структурированные типы данных
      • Функция с конечной областью определения
      • Декартово (прямое) произведение
      • Объединение
      • Множество
    • Ссылочный тип данных

Языки программирования высшего уровня, как правило, имеют набор встроенных простых типов и средства для задания производных типов данных. Также, объектно-ориентированные языки позволяют определять типы класса. Реализация простых типов данных заключается в способе представления значений данного типа в памяти вычислительной машины и в наборе операций, поддерживаемых данным типом.


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

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

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

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

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

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

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


Строгий контроль соответствия типов может исключить скрытые ошибки, которые обычно вызываются опечатками или недоразумениями. Это особенно важно в больших программных проектах, разрабатываемых группами программистов. Под действием социальных факторов очень сложно объединять такое программное обеспечение без постоянной проверки, которой является строгий контроль соответствия типов. Фактически, строгий контроль соответствия типов преобразует ошибки, которые могли бы возникнуть во время выполнения программы, в ошибки, выявляемые при компиляции. Ошибки, проявляющиеся только во время выполнения, часто чрезвычайно трудно найти, они опасны для пользователей и дорого обходятся разработчику программного обеспечения. Цена же ошибки компиляции незначительна: разработчик имеет возможность исправить ее до ввода программного обеспечения в эксплуатацию по назначению.

Примеры языков программирования высшего уровня

Язык программирования C++

C++ — компилируемый, статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования, как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование. Язык имеет богатую стандартную библиотеку, которая включает в себя распространённые контейнеры и алгоритмы, ввод-вывод, регулярные выражения, поддержку многопоточности и другие возможности. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков /страус. В сравнении с его предшественником — языком C, наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

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

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C. Множество программ, которые могут транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.

В C++ доступны следующие встроенные типы. Типы C++ практически полностью повторяют типы данных в C:


  • Символьные: char, wchar_t (char16_t и char32_t, в стандарте C++11).
  • Целочисленные знаковые: signed char, short int, int, long int (и long long, в стандарте C++11).
  • Целочисленные беззнаковые: unsigned char, unsigned short int, unsigned int, unsigned long int(и unsigned long long, в стандарте C++11).
  • С плавающей точкой: float, double, long double.
  • Логический: bool, имеющий значения true или false.

Также, при разработке языка было впервые введено понятие ссылок.

C++ добавляет к C объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм. В стандарте C++ под классом подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union, под структурой подразумевается класс, определённый через ключевое слово struct, и под объединением подразумевается класс, определённый через ключевое слово union.

C++ поддерживает множественное наследование. Базовые классы указываются в заголовке описания класса, возможно, со спецификаторами доступа. Наследование от каждого класса может быть публичным, защищённым или закрытым. По умолчанию базовый класс наследуется как private. В результате наследования класс-потомок получает все поля классов-предков и все их методы. Если один класс-предок наследуется несколько раз (это возможно, если он является предком нескольких базовых классов создаваемого класса), то экземпляры класса-потомка будет включать столько же подэкземпляров данного класса-предка. Чтобы избежать такого эффекта, если он нежелателен, C++ поддерживает концепцию виртуального наследования. На все виртуальные вхождения класса-предка в дерево наследования класса-потомка в потомке создаётся только один подэкземпляр.

Инкапсуляция в C++ реализуется через указание уровня доступа к членам класса: они бывают публичными, защищёнными и приватными. Проверка доступа происходит во время компиляции, попытка обращения к недоступному члену класса вызовет ошибку компиляции.

C++ поддерживает динамический полиморфизм и параметрический полиморфизм.

Параметрический полиморфизм представлен:

  • Аргументами по умолчанию для функций
  • Перегрузка функций

Динамический полиморфизм реализуется с помощью виртуальных методов и иерархии наследования. Полиморфным в C++ является тип имеющий хотя бы один виртуальный метод.

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