Сравнение Языков Программирования

Материал из eSyr's wiki.

(Различия между версиями)
Перейти к: навигация, поиск
(Управление памятью (ручное или сборщик мусора, выделение памяти для объектов))
(Модульность и раздельная трансляция - Мои 5 копеек: пакеты в Ada)
Строка 108: Строка 108:
обладает информацией об уже оттранслированных единицах и поэтому не
обладает информацией об уже оттранслированных единицах и поэтому не
может проверить корректность межмодульных связей.
может проверить корректность межмодульных связей.
 +
 +
 +
Ada
 +
 +
В языке Ada есть пакеты, и этим он, несмотря на то, что основан на Pascal, совсем на него не похож. Пакеты заимствованы из других языков. Они похожи на классы тем, что являются средством абстракции, позволяющем инкапсулировать сложность внутри пакета, предоставив наружу только интерфейс. Ладно, к сути.
 +
 +
Каждый пакет физически разделён на две части.
 +
-- ''Интерфейс''
 +
'''package''' Points '''is'''
 +
'''type''' Point '''is record'''
 +
x: Integer;
 +
y: Integer;
 +
'''end record''';
 +
zero: '''constant''' Point := (0, 0);
 +
'''procedure''' setToZero(point: '''in out''' Point);
 +
'''function''' dotProduct(point1: in Point; point2: in Point) '''return''' Integer;
 +
'''end''' Points;
 +
 +
-- ''Реализация''
 +
'''package body''' Points '''is'''
 +
'''procedure''' setToZero(point: '''in out''' Point) '''is'''
 +
'''begin'''
 +
point := zero;
 +
'''end''' setToZero;
 +
'''function''' dotProduct(point1: in Point; point2: in Point) '''return''' Integer '''is'''
 +
'''begin'''
 +
return point1.x * point2.x + point1.y * point2.y;
 +
'''end''' setToZero;
 +
'''end''' Points;
 +
Ada имеет средства разграничения доступа. Всё, что следует за спецификатором '''private''', не будет доступно при импорте пакета.
 +
-- ''Интерфейс''
 +
'''package''' Points '''is'''
 +
'''type''' Point '''is private''';
 +
zero: '''constant''' Point; -- ''Тут тоже неявный private.'''
 +
'''procedure''' setToZero(point: '''in out''' Point);
 +
'''function''' dotProduct(point1: '''in''' Point; point2: '''in''' Point) '''return''' Integer;
 +
'''private'''
 +
'''type''' Point '''is record'''
 +
x: Integer;
 +
y: Integer;
 +
'''end record''';
 +
zero: '''constant''' Point := (0, 0);
 +
'''end''' Points;
 +
Вне пакета можно будет объявить переменные типа «Point», но все действия будут ограничены присваиваниями, сравнениями на равенство и проверками принадлежности (''нужно описать подробнее''). Поэтому в пакет надо бы добавить «конструктор», если, конечно, предполагается возможная инициализация этих структур вне пакета. Если стандартная реализация этих операций не устраивает, можно использовать '''limited private''', который в остальном ничем от '''private''' не отличается, но этих операций не позволяет.
 +
 +
Реализация может также иметь часть-инициализацию. Это всё, что после '''begin'''.
 +
'''package body''' Points '''is'''
 +
'''procedure''' setToZero(point: '''in out''' Point) '''is'''
 +
'''begin'''
 +
point := zero;
 +
'''end''' setToZero;
 +
'''function''' dotProduct(point1: in Point; point2: in Point) '''return''' Integer '''is'''
 +
'''begin'''
 +
return point1.x * point2.x + point1.y * point2.y;
 +
'''end''' setToZero;
 +
'''begin'''
 +
Ada.Text_IO.Put_Line("Package ready!");
 +
'''end''' Points;
 +
Пакеты можно расширять. Взять и определить пакет ''Points.RandomDistributions'', в нём можно пользоваться всем, что объявлено в пакете-родителе. Пакет можно сделать недоступным вне своей иерархии.
 +
'''private package''' Points.internalThing '''is'''
 +
''<...>''
 +
При подключении потомка родитель-пакет подключается автоматически.
 +
 +
О подключениях. Подключить пакет можно с помощью конструкции '''with'''.
 +
'''with''' Points.RandomDistributions;
 +
После этого можно будет пользоваться ввсем, что в пакете лежит, через точечную нотацию. Если же вызовов слишком много, то можно влить содержимое пакета в текущую область видимости с помощью '''use''' (только после подключения!).
 +
'''use''' Points.RandomDistributions;
 +
В случае конфликтов имён придётся-таки предварять каждое обращение именем пакета.
== Исключительные ситуации и обработка ошибок ==
== Исключительные ситуации и обработка ошибок ==

Версия 19:53, 12 января 2013

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

ЯП из курса: C, C++, Java, C#, Pascal, Delphi, Оберон-2, Модула-2, Ада (83 и 95 стандарты)

Полезные ссылки:

Сравнение ЯП в википедии

Энциклопедия языков программирования

Немножно рекламное сравнения большинства языков

План (краткий, взят из методички Головина, подробный см. в самой методичке):

Содержание

Базисные типы данных в языках программирования: простые и составные типы данных, операции над ними

ADA

Integer
Размер не фиксирован.
Character 
Как я понял, существует несколько разновидностей (зависит от размера) и является особым перечислимым типом (Enumeration)
String
Массив Character фиксированной длины. Так же есть стандартные пакеты, реализующие строки квазистатической и динамической длины.
Floating point
Эти типы обычно определяются вручную в виде конструкции, где Num_Digits указывает минимальную погрешность:
digits Num_Digits
Fixed Point
Эти типы также обычно определяются вручную в виде конструкции, где Delta означает погрешность:
delta Delta range Low .. High

Массивы. Длина массива - статический или динамический атрибут.

Управление памятью

Классы памяти:

Статическая Всё что связано со словом «статический» размещается в блоке статической памяти. Время жизни – от начала программы либо момента первого входа в блок, и до конца программы.

Квазистатическая Квазистатическая память связана с понятием блока: переменные связана с этим блоком (от момента объявления, точнее, прохода code flow через объявление, до выхода из блока). Размещаются в стеке.

Динамическая Время жизни зависит от процедур (ручное управление памятью) или от сборщика мусора.

Указатели

Ада, C, C++, C#, Delphi, Оберон

Указатели языка Ада 83 ссылаются только на объекты из динамической памяти. Указатель языка Си++ может ссылаться на любой объект данных (динамический, локальный, статический), что может приводить к труднообнаружимым ошибкам.

Также в языке Ада отсутствует адресная арифметика (арифметические операции над указателями), что также уменьшает вероятность появления ошибки работы с памятью.

В языке Оберон указатель может быть объявлен только на массив или запись.

В Java явных указателей нет.

Операторный базис языков программирования. Управление последовательностью вычислений

Процедурные абстракции

Перегрузка операций

Ада 83, Ада 95, Си++, Java, Delphi, C#

Понятие «перегрузка» означает, что одному имени в одной области видимости может соответствовать несколько определений. В современных языках программирования перегружаться могут только имена подпрограмм, но не типов, переменных, модулей. Пример на языке Си++:

   class X {
   public:
       void f();
       void f (int)
   };
               
   X a;
   a.f(); // первая функция
   a.f(0); // вторая функция

Отличие перегрузки от замещения состоит во-первых, в том, что перегрузка обрабатывается статически (на этапе трансляции), в во-вторых, при замещении речь идет о разных областях видимости: базовый класс с объявлением виртуального метода (объемлющая область видимости) и производный класс с замещающим методом (вложенная область видимости).

Определение новых типов данных. Логические модули. Классы

ADA

В Аде вообще типы принято определять вручную, пользуясь конструкциями type и subtype. Например:

type Short is range -128 .. +128 
type Index is range 0 .. 256 
type My_String is array ( Index range <> ) of Character -- My_String - это массив, индексируемый типом Index в неизвестных пока границах, состоящий из Character
subtype String_10 is My_String ( 0 .. 10 ); -- Подтип типа My_String, состоящий из 11 элементов.
type Money is delta 1/100 range 0.0 ... 10000.0

Инкапсуляция и абстрактные типы данных

Модульность и раздельная трансляция

Раздельная трансляция

C, C++

Раздельная трансляция означает то, что программа разбивается на части — физические модули или единицы компиляции. Каждая единица может или обязана транслироваться отдельно от остальных. Независимая раздельная трансляция означает то, что транслятор не обладает информацией об уже оттранслированных единицах и поэтому не может проверить корректность межмодульных связей.


Ada

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

Каждый пакет физически разделён на две части.

-- Интерфейс
package Points is
   type Point is record
       x: Integer;
       y: Integer;
   end record;
   zero: constant Point := (0, 0);
   procedure setToZero(point: in out Point);
   function dotProduct(point1: in Point; point2: in Point) return Integer;
end Points;
-- Реализация
package body Points is
   procedure setToZero(point: in out Point) is
       begin
       point := zero;
       end setToZero;
   function dotProduct(point1: in Point; point2: in Point) return Integer is
       begin
       return point1.x * point2.x + point1.y * point2.y;
       end setToZero;
end Points;

Ada имеет средства разграничения доступа. Всё, что следует за спецификатором private, не будет доступно при импорте пакета.

-- Интерфейс
package Points is
   type Point is private;
   zero: constant' Point; -- Тут тоже неявный private.
   procedure setToZero(point: in out Point);
   function dotProduct(point1: in Point; point2: in Point) return Integer;
private
   type Point is record
       x: Integer;
       y: Integer;
   end record;
   zero: constant Point := (0, 0);
end Points;

Вне пакета можно будет объявить переменные типа «Point», но все действия будут ограничены присваиваниями, сравнениями на равенство и проверками принадлежности (нужно описать подробнее). Поэтому в пакет надо бы добавить «конструктор», если, конечно, предполагается возможная инициализация этих структур вне пакета. Если стандартная реализация этих операций не устраивает, можно использовать limited private, который в остальном ничем от private не отличается, но этих операций не позволяет.

Реализация может также иметь часть-инициализацию. Это всё, что после begin.

package body Points is
    procedure setToZero(point: in out Point) is
        begin
        point := zero;
        end setToZero;
    function dotProduct(point1: in Point; point2: in Point) return Integer is
        begin
        return point1.x * point2.x + point1.y * point2.y;
        end setToZero;
begin
    Ada.Text_IO.Put_Line("Package ready!");
end Points;

Пакеты можно расширять. Взять и определить пакет Points.RandomDistributions, в нём можно пользоваться всем, что объявлено в пакете-родителе. Пакет можно сделать недоступным вне своей иерархии.

private package Points.internalThing is
    <...>

При подключении потомка родитель-пакет подключается автоматически.

О подключениях. Подключить пакет можно с помощью конструкции with.

with Points.RandomDistributions;

После этого можно будет пользоваться ввсем, что в пакете лежит, через точечную нотацию. Если же вызовов слишком много, то можно влить содержимое пакета в текущую область видимости с помощью use (только после подключения!).

use Points.RandomDistributions;

В случае конфликтов имён придётся-таки предварять каждое обращение именем пакета.

Исключительные ситуации и обработка ошибок

Исключения и блоки try {} catch {} finally {}. Семантика возобновления и семантика завершения.

Семантика возобновления: после обработки исключения управление может вернуться непосредственно в точку, где возникло исключение (варианты: на следующий оператор или на любой оператор из того же блока). Пример языка c семантикой возобновления: Visual Basic.

Семантика завершения: после возникновения исключения блок, в котором оно возникло, обязательно завершается. Обработка исключения происходит в блоках, вызвавших блок с исключением. Пример языка с семантикой завершения: Си++.

Наследование типов и классов

Динамический полиморфизм

Абстрактные классы и интерфейсы

Абстрактный тип данных (АТД) — это тип с полностью инкапсулированной структурой. Использовать объекты АТД возможно только при помощи явно определенных в интерфейсе типа операций. Абстрактный класс (АК) — это класс, содержащий хотя бы один абстрактный метод.

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

Множественное наследование

Динамическая идентификация типа

Понятие о родовых объектах. Обобщенное программирование

ADA

Note to C++ programmers: generic units are similar to C++ templates. Ada Programming

Объявляем шаблон:

generic
 type Element_T is private;  -- Generic formal type parameter
procedure Swap (X, Y : in out Element_T);

Для его использования необходимо создать объект нужного типа:

procedure Swap_Integers is new Swap (Integer);

Возможна перегрузка:

procedure Instance_Swap is new Swap (Float);
procedure Instance_Swap is new Swap (Day_T);

Итоговая таблица

Если в таблице указан знак вопроса, то либо этого языка не было в списке языков в задании, либо информация отсутствует.

C C++ C# Java Pascal Delphi Оберон Оберон-2 Modula-2 Ada83 Ada95
есть оператор перехода «goto метка» есть есть есть нет есть есть нет нет нет есть есть
есть try-finally нет нет есть нет??? ? есть нет нет нет есть есть
есть понятие динамического связывания подпрограмм (методов класса) ? есть есть есть ? есть нет есть нет нет есть
Личные инструменты
Разделы