Object Pascal

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск
Object Pascal
Семантика:

императивная

Класс языка:

мультипарадигменный: структурное, объектно-ориентированное, обобщённое[1], процедурное программирование

Тип исполнения:

компилятор

Появился в:

1986 г.

Автор(ы):

Ларри Теслер, Никлаус Вирт

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

статическая, динамическая (array of const, RTTI, Variant), строгая

Основные реализации:

Delphi (x86 and CLI), Oxygene (CLI), Free Pascal (x86, x86-64, PowerPC, ppc64, SPARC and ARM), Virtual Pascal (x86), TMT Pascal (x86), Turbo51 (Intel 8051)

Диалекты:

Apple, Turbo Pascal, objfpc, Delphi, Delphi.NET, Oxygene

Испытал влияние:

Паскаль, Smalltalk

Повлиял на:

C#, Java

Object Pascal — Язык программирования, разработанный в фирме Apple Computer в 1986 году группой Ларри Теслера, который консультировался с Никлаусом Виртом. Произошел от более ранней объектно-ориентированной версии Паскаль[2], называвшейся Clascal, который был доступен на компьютере Apple Lisa.

Содержание

Примеры Hello World! в различных объектных расширениях языка

Object Pascal от Apple

program ObjectPascalExample;
 
   type
      THelloWorld = object
         procedure Put;
      end;
 
   var
      HelloWorld: THelloWorld;
 
   procedure THelloWorld.Put;
   begin
      WriteLn('Hello, World!');
   end;
 
begin
   New(HelloWorld);
   HelloWorld.Put;
   Dispose(HelloWorld);
end.

Turbo Pascal

program ObjectPascalExample;
 
   type
      PHelloWorld = ^THelloWorld;
      THelloWorld = object
         procedure Put;
      end;
 
   var
      HelloWorld: PHelloWorld; { this is a pointer to a THelloWorld }
 
   procedure THelloWorld.Put;
   begin
      WriteLn('Hello, World!');
   end;
 
begin
   New(HelloWorld);
   HelloWorld^.Put;
   Dispose(HelloWorld);
end.

Object Pascal в Delphi и Free Pascal

program ObjectPascalExample;
 
type
  THelloWorld = class
    procedure Put;
  end;
 
procedure THelloWorld.Put;
begin
  Writeln('Hello, World!');
end;
 
var
  HelloWorld: THelloWorld;               { this is an implicit pointer }
 
begin
  HelloWorld := THelloWorld.Create;      { constructor returns a pointer }
  HelloWorld.Put;                        
  HelloWorld.Free;                       { this line dereferences the pointer }
end.

Как видно из примера синтаксис у Object Pascal от Apple и в среде Delphi при работе с объектами совпадает и отличается у Turbo Pascal.

Изменения в Object Pascal от Borland в сравнении с Turbo Pascal

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

  • Фундаментальные (fundamental) типы. Их представление в памяти (число битов и наличие знака) строго фиксируется и выдерживается неизменным во всех последующих реализациях Object Pascal для любых операционных систем и компьютерных платформ.
  • Родовые (generic) типы. Их представление в памяти не фиксируется и будет реализовано оптимальным способом, в зависимости от реализации для конкретной операционной системы и компьютерной платформы.

Интерфейсы

См. Интерфейсы: Delphi

Перегрузка процедур и функций (не ООП)

Введена перегрузка процедур и функций, не являющихся членами объекта или класса. Перегружаются (с помощью ключевого слова overload) отличающиеся типами и числом параметров процедуры и функции :
procedure Calc(I: Integer); overload;
  ...
procedure Calc(S: String; J: Integer); overload;

Динамический массив

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

var MyFlexibleArray: array of Real;
Использование:

var
A, B: array of Integer; begin SetLength(A, 1); {специальная процедура выделения памяти} A[0] := 1; B := A; B[0] := 2; end;

В динамическом массиве тоже возможно задание открытого массива параметров, но тип их должен быть объявлен ранее, например:
type TDynamicCharArray = array of Char;
function Find(A: TDynamicCharArray): Integer;

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

Операторы динамической проверки и приведения типов

В языке Object Pascal фирмы Borland появилась динамическая типизация, а также оператор динамического приведения типов as и оператор is для динамической проверки типов. Также в открытом массиве параметров стала возможна передача параметров различного типа (variant open array parameters).

Вариантный тип

Начиная с Delphi 6, в языке Object Pascal ,был введен вариантный тип данных (Variant), тип которых не известен на этапе компиляции. Вариантные переменные могут принимать различные значения (целые, строковые, булевские, Currency, OLE-строки) а также быть массивами элементов этих же типов, а также массивом значений вариантного типа.

var
  V1, V2, V3, V4, V5: Variant;
  I: Integer;
  D: Double;
  S: string;
begin
  V1 := 1; { значение типа integer }
  V2 := 359.768; { значение типа real }
  V3 := 'Hello world!'; { значение типа string }
...

Параметры типа вариантного открытого массива

Стала возможна передача параметров различного типа. В оригинале он назван как «variant open array parameters». Тип данных определяется динамически в процессе выполнения программы. Так же как и в обычном открытом массиве функция High вызывается для определения числа элементов массива. Для объявления используются ключевые слова array of const. Пример:

function Output(const Args: array of const): string;
var
 I: Integer;
begin
 Result := ;
 for I := 0 to High(Args) do   with Args[I] do
   case VType of
       vtString:     Result := Result + VString^;
       vtPChar:      Result := Result + VPChar;
       vtInteger:    Result := Result + IntToStr(VInteger);
       vtBoolean:    Result := Result + BoolToStr(VBoolean);
       vtChar:       Result := Result + VChar;
       vtExtended:   Result := Result + FloatToStr(VExtended^);
       vtObject:     Result := Result + VObject.ClassName;
       vtClass:      Result := Result + VClass.ClassName;
       vtVariant:    Result := Result + string(VVariant^);
       vtInt64:      Result := Result + IntToStr(VInt64^);
       vtAnsiString: Result := Result + string(VAnsiString);
       vtCurrency:   Result := Result + CurrToStr(VCurrency^);
   end;
  Result:=Result+ ' ';
end;
...
Output(['test', 777, '@', True, 3.14159, TForm]) {передача окрытого массива параметров}

будет возвращена строка: "test 777 @ T 3.14159 TForm".

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

Различия в объектных моделях

Для введения новой объектной модели введено ключевое слово classTurbo Pascal ключевое слово object).

Введены операторы для проверки и приведения классов is и as динамически в ходе выполнения прграммы. Появились указатели на методы, для чего введено новое использование ключевого слова object:
type
   TMyMethod = procedure (Sender : Object) of object;

Изменения синтаксиса, из-за изменения размещения объектов

В Turbo Pascal можно было работать как с динамическими, так и со статическими экземплярами объектов. В объектной модели Object Pascal программист работает только с динамическими экземплярами классов, выделяемых в heap-области (куче). В связи с этим изменен синтаксис обращения к полям и методам объектов. Ранее для работы с динамическими экземплярами объектов, проинициализированными с использованием обращения к конструктору в сочетании с функцией New, необходимо было использовать обращение "по адресу" ( ^ ). Теперь тип класса стал являться по умолчанию также указателем.
Пример для сравнения:

Объектная модель в Turbo Pascal (выделены участки кода, подвергшиеся изменению)
type
 PMyObject = ^TMyObject;
 TMyObject = object (TObject)
 MyField : PMyType;
 constructor' Init;
end;
...
var
MyObject : PMyObject;
begin
 MyObject:=New(PMyObject,Init);
 MyObject^.MyField:= ...
end;
Новая объектная модель в Object Pascal
type
TMyObject = class (TObject)
  MyField : TMyType;
  constructor Create;
end;
...
var
MyObject : TMyObject;
begin
  MyObject:=TMyObject.Create;
  MyObject.MyField:= ...
end;

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

Появилась возможность ограничивать видимость членов класса (методы, свойства), которые предназначены для использования только в реализации производных классов. Это дает возможность защищать исходный код от модификации пользователями класса. Такие методы содержатся в секции protected (англ. защищённые) в объявлении класса.

Визуальное объектно-ориентированное программирование

Появились понятия свойства (property) и связанные с со свойствами ключевые слова read, write, stored, default (nodefault), index. Свойства визуальных объектов, видимых в интегрированной среде разработки объявляются с помощью нового слова published в качестве секции в объявлении класса, являющегося визуальным объектом.

Перегрузка операторов

Разработчики TMT Pascal (модификация Object Pascal ) первыми ввели полноценную перегрузку операторов, что впоследствии было перенято разработчиками других диалектов языка: Delphi (среда Delphi 2005), Free Pascal и др.
Пример:

{объявление}
type
  TVector = packed record
     A, B, C: Double;
     procedure From(const A, B, C: Double);
     class operator Add(const Left, Right: TVector): TVector;
     class operator Implicit(const v: TVector): TPoint;
  end;
 implementation
...
{реализация}
class operator TVector.Add(const Left, Right: TVector): TVector;
begin
 Result.A := Left.A + Right.A;
 Result.B := Left.B + Right.B;
 Result.C := Left.C + Right.C;
end;
class operator TVector.Implicit(const v: TVector): TPoint; begin Result.A := round(v.A); Result.B := round(v.B); end;
... {использование:} var v1, v2: TVector; begin v1.From(20, 70, 0); v2.From(15, 40, 4); Canvas.Polygon([v1, v2, v1 + v2]); end;

Поддержка различными разработчиками

Начиная с версии среды Delphi 7, фирма Borland стала официально называть язык Object Pascal как Delphi [3].

Язык Object Pascal поддерживается и развивается другими разработчиками. Наиболее серьёзные реализации Object Pascal (помимо Delphi) — это TopSpeed Pascal (версия языка Turbo Pascal), TMT Pascal, Virtual Pascal, PascalABC.NET и Free Pascal.

Примечания

  1. http://hallvards.blogspot.com/2007/08/highlander2-beta-generics-in-delphi-for.html
  2. Буч Г. Объектно-ориентированное проектирование с примерами решения[itbookz.ifolder.ru/7276278]
  3. Delphi Language Overview



cs:Object Pascal

da:Object Pascal en:Object Pascal eo:Objektema Paskalo es:Object Pascal fi:Object Pascal fr:Object Pascal ja:Object Pascal ko:오브젝트 파스칼 ms:Object Pascal nl:Object Pascal pl:Object Pascal pt:Object Pascal (linguagem de programação) ro:Object Pascal sk:Object Pascal sq:Object Pascal sv:Object Pascal tg:Object Pascal th:ภาษาอ็อบเจกต์ปาสกาล tr:Object Pascal uk:Object Pascal zh:Object Pascal

Источник — «http://www.sbup.com/wiki/Object_Pascal»
Личные инструменты

Served in 0.665 secs.