Далее сравнительный обзор языков C++, Java и C# приводится c опорой на Object Pascal.
2.7.1. Что общего у этих четырёх языков?
Хотя это разные языки – существенные различия наблюдаются на уровнях _ лексики, синтаксиса и семантики – они, несомненно, могут быть отнесены к одному типу, который характеризуется общей “архитектоникой” – составом и иерархическим соподчинением языковых компонентов.
Лексику во всех этих языках образуют: зарезервированные слова и специальные знаки, литералы и идентификаторы (имена). Синтаксис оперирует с термами (литералами и идентификаторами), выражениями, простыми и составными предложениями (statement).
Главное содержание (смысл) программы – это определение некоторого пространства, в котором при конкретном выполнении программы размещаются значения обрабатываемых при этом выполнении данных, а также определение преобразования этих значений, и, в некоторых случаях, самого пространства. Это преобразование обычно разделяется на относительно самостоятельные компоненты, которые сопоставляются с предложениями особого типа, так называемыми, операторами или “инструкциями” и трактуются как их содержание (смысл). Последовательности таких предложений-операторов явно задают (с точностью до количества прохождений через них) последовательность “передачи управления” между ними, иными словами, последовательность шагов преобразований, выполняемых программой. Для всех четырёх рассматриваемых языков последовательность передачи управления задаётся явно: последовательностью расположения операторов в программе и специальными операторами перехода, что позволяет отнести все четыре рассматриваемых языка к языкам “операторного” типа.
Кроме предложений операторного типа в рассматриваемых языках имеются предложения типа объявления/определения, а также предложения и конструкции специального типа, в частности: блоки, конструкции для организации обработки особых случаев (“исключений”), организации областей видимости имён.
Во всех именах имеется глобальное пространство имён, которое может охватывать несколько модулей-файлов, но в разных языках оно организовано по-разному.
2.7.2. Что общего у языков C++, Java и C#, что отличает их от Object Pascal?
На уровне лексики: case-sensitivity (лексемы, различающиеся регистром букв – разные лексемы).
Тип “строка” представлен только 0-терминированной строкой и специальными классами.
Имеется тип void, используемый, в частности, для объявления безтипового указателя.
Операции:
&& вместо AND
|| вместо OR
! вместо NOT
== вместо =
!= вместо <>
& для побитового И
| для побитового ИЛИ
^ для побитового НЕТ
Есть операции сдвига битов << и >>
Операторы (инструкции):
Оператор присваивания = вместо :=, оператор присваивания возвращает значение (присвоенное).
Границы блока {}, а не begin и end.
Конструкция условного перехода (ветвления):
if (условие) простой оператор или блок [else простой оператор или блок]
for (инициатор, условие, шаг) простой оператор или блок
где инициатор и шаг – последовательность операторов.
while (условие) простой оператор или блок
do простой оператор или блок while (условие)
switch (выражение){
сase значение: последовательность операторов
case значение: последовательность операторов
…
case значение: последовательность операторов
[ default простой оператор или блок] }
Аналоги этим конструкциям в языке Pascal очевидны. Однако switch существенно отличается от case языка Pascal тем, что если выражение имеет одно из значений, предусмотренных в case, то вслед за последовательностью операторов этого выбранного case выполняются последовательности всех нижележащих case.
Кроме того, имеется конструкция “запятая”, отсутствующая в языке Pascal:
(условие)?оператор присваивания, … ,оператор присваивания
: оператор присваивания, … ,оператор присваивания;
Синтаксис объявления:
спецификатор тип имя [= выражение]
Порядок имени и типа составляет нарочитое формальное отличие от языка Pascal. Принципиальное отличие состоит в том, что в языке Pascal объявления сосредоточены в определённых позициях текста программы, отмеченных специальными зарезервированными словами: type, var, const в разделах implementation модулей, между заголовком функции или процедуры и begin и т.п.
Это, во-первых, придаёт тексту на языке Pascal “формулярный” вид и, во-вторых скрывает действие, связанное с объявлением: выделение области памяти, соответствующее форматирование. Эти действия оторваны от операторной части программы и происходят в обязательном порядке как бы предосмотра до выполнения операторов.
В языках C++, Java и C# объявление простого типа располагается среди операторов и действенно, если только через него “пройдёт управление”.
Константа – частный случай переменной: переменная со спецификатором const.
Важную роль играет спецификатор static. Кроме классов, он может быть использован в функциях.
Новый экземпляр типа может быть создан динамически с помощью оператора new, в частном случае:
переменная = new
Однако в различных языках для такого создания требуются дополнительные спецификации.
Определение функции:
спецификатор тип имя([список формальных параметров])тело функции
Тело функции представляет собой блок.
Определение без тела, то есть заголовок функции образует её объявление. Объявления обеспечивают использование функции в нескольких различных частях (модулях) программы при наличии одного определения.
Тип в заголовке функции – это тип возвращаемого ею значения. Это значение представлено в теле функции встроенной переменной return. Если значение не возвращается, то есть функция является процедурой, как в языке Pascal, то должен быть указан тип void.
Круглые скобки после имени служат формальным признаком функции при её объявлении (определении) и вызове. Список параметров может быть пустым.
функция main вызывается при запуске программы. Аргументы этой функции передаются операционной системой из командной строки.
Все рассматриваемые языки содержат типы class и interface, однако синтаксис объявления варьирует от одного языка к другому.
Конструктор получает имя класса.
Обращение к вызывающему объекту (self в языке Pascal) обеспечивается встроенным словом this.
Пространство имён структурировано, могут быть определены подпространства.
2.7.3. Особенности языка C++.
Среди типов нет типа struct.
Определение типа с помощью оператора typedef.
Кроме указателей есть тип “ссылка”. В функциях он используется для передачи значения по ссылке.
Оператор new вырабатывает указатель, например;
int ^n = new int
или
int ^n = new int(0) с инициализатором.
Имеется возможность заранее выделять место и в нём размещать объект.
Для уничтожения объекта в случае его динамического создания предназначен оператор delete.
Автоматические объекты могут создаваться со спецификатором register.
В объявлении функции могут отсутствовать имена формальных параметров (только типы).
При объявлении и определении функций можно задавать значения по умолчанию. Они подставляются вместо отсутствующих последних фактических параметров.
В объявлении функции может быть задан список формальных параметров с переменное количество элементов:
(…) или (параметр, …) или (параметр …).
В целом, можно заметить, что в C++ процедурно-ориентированное программирование испытало далеко идущее развитие. В частности, имеются шаблоны-функции (функции, в которых тип является свободным параметром, который может быть установлен при их использовании) и обобщённые функции (generic).
Определение класса:
[спецификатор] class имя класса [: спецификатор-видимости имя-класса, …, спецификатор-видимости имя-класса ][{тело класса}] [переменные];
Объявление – это определение без тела. Объявление позволяет пользоваться именем в ограниченных целях – для определения указателей.
Для C++ характерно множественное наследование.
Возможно вложение классов.
Нестатические поля нельзя инициировать в теле класса.
В классе отсутствуют свойства как член класса.
Методы могут быть встроенными и невстроенными. Невстроенные связываются с классом через ::, то есть
имя-класса :: имя-функции
Экземпляр класса может быть создан динамически оператором new, а также обычным указанием имени класса при имени переменной.(инициализация осуществляется конструктором по умолчанию).
Деструктор именуется ~имя-класса
Обращение к члену класса осуществляется через “точку”, если база – объект (переменная,типа класс), и через -> (“стрелку”), если база – указатель на объект.
Виртуализация метода обеспечивается спецификатором virtual.
Обращение к членам классов вверх по иерархии наследования обеспечивается оператором using.
Имеются шаблоны классов (тип – свободный параметр).
Глобальное поле видимости обеспечивается оператором #include, проставляемыми в начале модуля. Предусмотрены специальный тип файлов – заголовочный (расширение h).
Пространство имён задаётся или продолжается оператором
namespace имя-пространства { пространство }
Объект в пространстве имён квалифицируется именем пространства через ::.
Глобальное пространство не имеет имени. Можно определить безымянное локальное пространство имён.
Using задаёт имя пространства по умолчанию до конца текущего пространства имён.
2.7.4. Особенности языка Java.
Компиляция осуществляется в специальный промежуточный байт-код,исполняемый аппаратурно-независимой Java-машиной, которая создаёт для программы “контекст времени выполнения”.