Object Pascal

Object Pascal (Об'єктний Паскаль) - мова програмування, розроблений у фірмі Apple Computer в 1986 групою Ларрі Теслера, який консультувався з Ніклаус Віртом. Стався від більш ранньої об'єктно-орієнтованої версії Паскаль [2], що називалася Clascal, який був доступний на комп'ютері Apple Lisa.


1. Приклади Hello World! в різних об'єктних розширеннях мови

1.1. 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  . 

1.2. Turbo Pascal

Delphi і Freepascal також підтримують цей варіант синтаксису. У Delphi для забезпечення зворотної сумісності, для Freepascal - це синтаксис за замовчуванням

 program  ObjectPascalExample  ;  type  PHelloWorld  =  ^  THelloWorld  ;  THelloWorld  =  object  procedure  Put  ;  end  ;  var  HelloWorld  :  PHelloWorld  ;  {Це покажчик на THelloWorld}  procedure  THelloWorld  .  Put  ;  begin  WriteLn  (  'Hello, World!'  )  ;  end  ;  begin  New  (  HelloWorld  )  ;  HelloWorld  ^  .  Put  ;  Dispose  (  HelloWorld  )  ;  end  . 

1.3. Object Pascal в Delphi та Free Pascal

У Free Pascal цей варіант синтаксису доступний в режимах ObjFpc і Delphi [3]

 program  ObjectPascalExample  ;  type  THelloWorld  =  class  {Визначення класу}  procedure  Put  ;  end  ;  procedure  THelloWorld  .  Put  ;  {Опис процедури методу Put класу THelloWorld}  begin  Writeln  (  'Hello, World!'  )  ;  end  ;  var  HelloWorld  :  THelloWorld  ;  {Визначення змінної-покажчика на екземпляр класу}  begin  HelloWorld  :  =  THelloWorld  .  Create  ;  {Конструктор повертає значення покажчика на екземпляр класу}  HelloWorld  .  Put  ;  HelloWorld  .  Free  ;  {Деструктор знищує екземпляр класу і звільняє область пам'яті}  end  . 

2. Зміни в Object Pascal від Borland в порівнянні з Turbo Pascal

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

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

2.1. Інтерфейси

См. Інтерфейси: Delphi

2.2. Перевантаження процедур і функцій (не ООП)

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

2.3. Динамічний масив

Введений для усунення рутинних операцій виділення та повернення пам'яті в 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;


2.4. Динамічна типізація

2.4.1. Оператори динамічної перевірки та приведення типів

У мові Object Pascal фірми Borland з'явилася динамічна типізація, а також оператор динамічного приведення типів as і оператор is для динамічної перевірки типів. Також у відкритому масиві параметрів стала можлива передача параметрів різного типу (variant open array parameters).

2.4.2. Варіантний тип

У мові Object Pascal був введений варіантний тип даних (Variant), тип яких не відомий на етапі компіляції і може змінюватися на етапі виконання програми. Однак цей тип даних поглинає більше пам'яті в порівнянні з відповідними змінними та операції над даними типу Variant виконуються повільніше. Більш того, неприпустимі операції над даними цього типу найчастіше призводять до помилок на етапі виконання програми, в той час як подібні помилки над даними іншого типу були б виявлені ще на етапі компіляції.

Варіантні змінні можуть приймати різні значення (цілі, рядкові, Булевського, Currency, OLE-рядки), бути масивами елементів цих же типів і масивом значень варіантного типу, а також містити COM і CORBA об'єкти, чиї методи і властивості можуть бути доступні за допомогою цього типу . Однак Variant не може містити:

  • дані структурних типів;
  • покажчики;
  • Int64 (починаючи з Delphi 6 - може).

Variant можна змішувати (у виразах і операторах) з іншими варіантами, числовими, рядковими і Булевського даними. При цьому компілятор автоматично виконує перетворення типу. Варіанти, які містять рядки, не можуть, однак, індексуватися (V [i] не допустимо).

 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} ... 

2.4.3. Параметри типу варіантного відкритого масиву

Стала можлива передача параметрів різного типу. В оригіналі він названий як "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".

Як видно, має свою внутрішню структуру, звернення до якої дає можливість визначити тип даних. У рядку виклику функції створюється масив, за допомогою конструктора відкритого масиву, який використовує квадратні дужки.


2.5. Відмінності в об'єктних моделях

Для введення нової об'єктної моделі введено ключове слово classTurbo Pascal ключове слово object).

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

2.5.1. Зміни синтаксису, через зміни розміщення об'єктів

В 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 (захищені) в оголошенні класу.


2.5.2. Візуальне об'єктно-орієнтоване програмування

З'явилися поняття властивості (property) і пов'язані з з властивостями ключові слова read, write, stored, default (nodefault), index. Властивості візуальних об'єктів, видимих ​​в інтегрованому середовищі розробки оголошуються за допомогою нового слова published в якості секції в оголошенні класу, який є візуальним об'єктом.

2.6. Узагальнення

 type generic TList  = class {оголошення} Items: array of T; procedure Add (Value: T); end; Implementation {реалізація} procedure TList.Add (Value: T); begin SetLength (Items, Length (Items) + 1); Items [Length (Items) - 1]: = Value; end; 

Загальний клас може бути просто спеціалізований для конкретного типу з використанням ключового слова specialize:

 Type TIntegerList = specialize TList ; TPointerList = specialize TList ; TStringList = specialize TList ; 

2.7. Перевантаження операторів

Розробники 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 (vA); Result.B: = round (vB); end;
... {Використання:} var v1, v2: TVector; begin v1.From (20, 70, 0); v2.From (15, 40, 4); Canvas.Polygon ([v1, v2, v1 + v2]); end ;

3. Підтримка різними розробниками

Починаючи з версії середовища Delphi 7, фірма Borland стала офіційно називати мову Object Pascal як Delphi [4].

Мова Object Pascal підтримується і розвивається іншими розробниками. Найбільш серйозні реалізації Object Pascal (крім Delphi) - це кросплатформний TopSpeed ​​Pascal (версія мови Turbo Pascal [5]) багатомовними середовища TopSpeed ​​, TMT Pascal, Virtual Pascal, PascalABC.NET, Free Pascal, GNU Pascal. На Object Pascal заснований мову програмування Oxygene.


Примітки

  1. Hallvard's Blog: Highlander2 Beta: Generics in Delphi for. NET - hallvards.blogspot.com/2007/08/highlander2-beta-generics-in-delphi-for.html
  2. Буч Г. Об'єктно-орієнтоване проектування з прикладами рішення [itbookz.ifolder.ru/7276278]
  3. Michal Van Canneyt Chapter 6: Classes - www.freepascal.org/docs-html/ref/refch6.html # x66-760006 (Англ.) . Free Pascal: Reference guide. (Грудень 2011). Читальний - www.webcitation.org/659qF0xXI з першоджерела 2 лютого 2012.
  4. Delphi Language Overview -
  5. TopSpeed-компілятори: не дожили до тріумфу - www.nf-team.org/drmad/stuff/t.htm


Перегляд цього шаблону Pascal
Діалекти

Clascal Concurrent Pascal Delphi Pascal Object Pascal Oxygene SuperPascal

Компілятори
Комерційні

C / AL Delphi Delphi Prism ( Oxygene) FrameworkPascal HP Pascal IP Pascal PocketStudio Prospero Pascal

Безкоштовні

ACK Free Pascal GNU Pascal MIDletPascal Pic Micro Pascal Turbo51 Vector Pascal [1] - www.dcs.gla.ac.uk/ ~ wpc/reports/compilers/compilerindex/x25.html

Непідтримувані

JRT Microsoft Pascal Object Pascal (Apple) Pascal / MT + THINK Pascal Turbo Pascal UCSD Pascal Virtual Pascal

IDE
Персони
Перегляд цього шаблону Основні мови програмування ( порівняння IDE історія хронологія)
Використовувані
в розробці
Академічні
IEC 61131-3
Інші
Езотеричні
Візуальні