Язык программирования object pascal

Язык программирования object pascal

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

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

По мере прогресса в области вычислительной математики акцент в программировании стал смещаться с процедур в сторону организации данных. Оказалось, что эффективная разработка сложных программ нуждается в действенных способах контроля правильности использования данных. Контроль должен осуществляться как на стадии компиляции, так и при прогоне программ, в противном случае, как показала практика, резко возрастают трудности создания крупных программных проектов. Отчетливое осознание этой проблемы привело к созданию Алгола—60, а позже — Паскаля, Модулы—2, Си и множества других языков программирования, имеющих более или менее развитые структуры типов данных.

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

Какими мощными средствами располагает объектно—ориентированное программирование наглядно демонстрирует библиотека Turbo Vision, входящая в комплект поставки Турбо Паскаля.

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

Основные принципы ООП

Объектно—ориентированное программирование основано на китах” — трех важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование, полиморфизм.

Инкапсуляция
Инкапсуляция есть объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы — объектными методами.

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

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

Наследование
Наследование есть свойство объектов порождать своих потомков. Объект — потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.

Принцип наследования решает проблему модификации свойств объекта и придает ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создает одного или нескольких потомков от него, которые “умеют” делать то, что не реализовано в родителе.

Последовательное проведение в жизнь принципа “наследуй и изменяй” хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.

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

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

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

Знакомство с техникой ООП начнем на примере следующей учебной задачи. Требуется разработать программу, которая создает на экране ряд графических изображений (точки, окружность, линия, квадрат) и может перемещать эти изображения по экрану. Для перемещения изображений в программе будут использоваться клавиши управления курсором, клавиши Ноте, End, PgUp, PgDn (для перемещения по диагональным направлениям) и клавиша Tab для выбора перемещаемого объекта. Выход из программы — клавиша Esc.Техническая реализация программы потребует использования средств двух стандартных библиотек — CRT и GRAPH.

Создание объектов

В Турбо Паскале для создания объектов используются три зарезервированных слова: object, constructor, destructor и три стандартные директивы: private, public и virtual.

Зарезервированное слово object используется для описания объекта. Описание объекта должно помещаться в разделе описания типов:

Если объект порождается от какого-либо родителя, имя родителя указывается в круглых скобках сразу за словом object:

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

Для нашей учебной задачи создадим объект—родитель TGraphObject, в рамках которого будут инкапсулированы поля и методы, общие для всех детальных объектов:

В дальнейшем предполагается создать объекты-потомки от TGraphObj, реализующие все специфические свойства точки, линии, окружности и прямоугольника. Каждый из этих графических объектов будет характеризоваться положением на экране (поля Х и У) и цветом (полеColor). С помощью метода Draw он будет способен отображать себя на экране, а с помощью свойств “показать себя” (метод Show) и “спрятать себя” (метод Hide) сможет перемещаться по экрану (метод MoveTo). Учитывая общность свойств графических объектов, мы объявляем абстрактный объект TGraphObj, который не связан с конкретной графической фигурой. Он объединяет в себе все общие поля и методы реальных фигур и будет служить родителем для других объектов.

Директива Private в описании объекта открывает секцию описания скрытых полей и методов. Перечисленные в этой секции элементы объекта “не видны” программисту. В нашем примере он не может произвольно менять координаты реперной точки [X,Y), т.к. это не приведет к перемещению объекта. Для изменения полей Х и Y предусмотрены входящие в состав объекта методы Init и MoveTo. Скрытые поля и методы доступны в рамках той программной единицы (программы или модуля), где описан соответствующий объект.

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

Вариант объявления объекта TGraphObj без использования механизма private..public:

Описания полей ничем не отличаются от описания обычных переменных. Полями могут быть любые структуры данных, в том числе и другие объекты. Используемые в нашем примере поля Х и У содержат координату реперной (характерной) точки графического объекта, а поле Color — его цвет. Реперная точка характеризует текущее положение графической фигуры на экране и, в принципе, может быть любой ее точкой.

Для описания методов в ООП используются традиционные для Паскаля процедуры и функции, а также особый вид процедур — конструкторы и деструкторы. Конструкторы предназначены для создания конкретного экземпляра объекта, ведь объект — это тип данных, т.е. “шаблон”, по которому можно создать сколько угодно рабочих экземпляров данного объектного типа (типа TGraphObj, например).

Зарезервированное слово constructor, используемое в заголовке конструктора вместо procedure, предписывает компилятору создать особый код пролога, с помощью которого настраивается так называемая таблица виртуальных методов. Если в объекте нет виртуальных методов, в нем может не быть ни одного конструктора, наоборот, если хотя бы один метод описан как виртуальный (с последующим словом Virtual, см. метод Draw), в состав объекта должен входить хотя бы один конструктор и обращение к конструктору должно предшествовать обращению к любому виртуальному методу.

Типичное действие, реализуемое конструктором, состоит в наполнении объектных полей конкретными значениями. В нашем примере конструктор Init объекта TGraphObj получает все необходимые для полного определения экземпляра данные через параметры обращенияаХ, аУ и aColor.

Процедура Draw предназначена для вычерчивания графического объекта. Эта процедура будет реализовываться в потомках объекта TGraphObj до-разному. Например, для визуализации точки следует вызвать процедуру PutPixel, для вычерчивания линии — процедуру Line и т.д. В объекте TGraphObj процедура Draw определена как виртуальная (“воображаемая”). Абстрактный объект TGraphObj не предназначен для вывода на экран, однако наличие процедуры Draw в этом объекте говорит о том, что любой потомок TGraphObj должен иметь собственный метод Draw, с помощью второго он может показать себя на экране.

При трансляции объекта, содержащего виртуальные методы, создается так называемая таблица виртуальных методов (ТВМ). В этой таблице будут храниться адреса точек входа в каждый виртуальный метод. В нашем примере ТВМ объекта TGraphObj хранит единственный элемент — адрес метода Draw.

Наличие в объекте TGraphObj виртуального метода Draw позволяет легко реализовать три других метода объекта: чтобы показать объект на экране в Методе Show, вызывается Draw с цветом aColor, равным значению поля color, а чтобы спрятать графический объект, в методе Hide вызывается Draw со значением цвета GetBkColor, т.е. с текущим цветом фона.

Рассмотрим реализацию перемещения объекта. Если .потомок TGraphObj Например, TLine) хочет переместить себя на экране, он обращается к родительскому методу MoveTo. В этом методе сначала с помощью Hide объект стирается с экрана, а затем с помощью Showпоказывается в другом месте.

Чтобы описать все свойства объекта, необходимо раскрыть содержимое объектных методов, т.е. описать соответствующие процедуры и функции. Описание методов производится обычным для Паскаля способом в любом месте раздела описаний, но после описания объекта. Например:

Отметим два обстоятельства. Во-первых, при описании методов имя метода дополняется спереди именем объекта, т.е. используется составное имя метода. Это необходимо по той простой причине, что в иерархий родственных объектов любой из методов может быть перекрыт в потомках. Составные имена четко указывают . принадлежность конкретной процедуры. Во-вторых, в любом объектном методе можно использовать инкапсулированные поля объекта почти так, как если бы они были определены в качестве глобальных переменных. Например, в конструкторе fGraph.Init переменные в левых частях операторов присваивания представляют собой объектные поля и не должны заново описываться в процедуре. Более того, описание

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

Обратите внимание: абстрактный объект TGraphObj не предназначен для вывода на экран, поэтому его метод Draw ничего не делает. Однако методы Hide, Show и MoveTo “знают” формат вызова этого метода и реализуют необходимые действия, обращаясь к реальным методам Draw своих будущих потомков через соответствующие ТВМ. Это и есть полиморфизм объектов.

Создание объекта "Точка"

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

В новом объекте TPoint можно использовать любые методы объекта-родителя TGraphObj. Например, вызвать метод MoveTo, чтобы переместить изображение точки на новое место. В этом случае родительский метод TGraphObj. MoveTo будет обращаться к методуTPoint.Draw, чтобы спрятать и затем показать изображение точки. Такой вызов станет доступен после Обращения к конструктору Init объекта TPoint, который нужным образом настроит ТВМ объекта. Если вызвать TPoint.Draw до вызова Init, его ТВМ не будет содержать правильного адреса и программа “зависнет”.

Создание объекта "Линия"

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

В конструкторе TLine.Init для инициации полей X, Y и Color, унаследованных от родительского объекта, вызывается унаследованный конструктор TCraph.Init, для чего используется зарезервированное слово inherited (англ.—унаследованный):

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

Для инициации полей dX и dY вычисляется расстояние в пикселах по горизонтали и вертикали от первого конца прямой, до ее второго конца. Это позволяет в методе TLine.Draw вычислить координаты второго кони по координатам первого и смещениям dX и dY. В результате простое изменение координат реперной точки Х,У в родительском i TGraph Move To перемещает всю фигуру по экрану.

Создание объекта "Круг"

Теперь нетрудно реализовать объект TCircle для создания и перемещения окружности:

Создание объекта "Прямоугольник"

В объекте TRect, с помощью которого создается и перемещается прямоугольник, учтем то обстоятельство, что для задания прямоугольника требуется указать четыре целочисленных параметра, т.е. столько же, сколько для задания линии. Поэтому объект TRect удобнее породить не от TGraphObj, а от TLine, чтобы использовать его конструктор Init:

Чтобы описания графических объектов не мешали созданию основной программы, оформим эти описания в отдельном модуле GraphObj:

В интерфейсной части модуля приводятся лишь объявления объектов, подобно тому как описываются другие типы данных, объявляемые в модуле доступными для внешних программных единиц. Расшифровка объектных методов помещается в исполняемую частьimplementation, как если бы это были описания обычных интерфейсных процедур и функций. При описании методов можно опускать повторное описание в заголовке параметров вызова. Если они все же повторяются, они должны в точности соответствовать ранее объявленным параметрам в описании объекта. Например, заголовок конструктора TGraphObj. Init может быть таким:

Использование объектов

Идею инкапсуляции полей и алгоритмов можно применить не только к графическим объектам, но и ко всей программе в целом. Ничто не мешает нам создать объект — программу и “научить” его трем основным действиям: инициации (Init), выполнению основной работы (Run) и завершению (Done). На этапе инициации экран переводится в графический режим работы и создаются и отображаются графические объекты (100 экземпляров TPoint и по одному экземпляру TLine, TCircle, TRect). На этапе Run осуществляется сканирование клавиатуры и перемещение графических объектов. Наконец, на этапе Done экран переводится в текстовый режим и завершается работа всей программы.

Назовем объект—программу именем TGrapbApp и разместим его в модуле CraphApp (пока не обращайте внимание на точки, скрывающие содержательную часть модуля — позднее будет представлен его полный текст):

В этом случае основная программа будет предельно простой:

В ней мы создаем единственный экземпляр App объекта—программы TGrahpApp и обращаемся к трем его методам.

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

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

Ниже приводится возможный вариант модуля GraphApp для нашей учебной программы:

В реализации объекта TGraphApp используется деструктор Done. Следует иметь в виду, что в отличие от конструктора, осуществляющего настройку ТВМ, деструктор не связан с какими-то специфичными действиями: для компилятора слова destructor и procedure — синонимы. Введение в ООП деструкторов носит, в основном, стилистическую направленность — просто процедуру, разрушающую экземпляр объекта, принято называть деструктором. В реальной практике ООП с деструкторами обычно связывают процедуры, которые не только прекращают работу с объектом, но и освобождают выделенную для него динамическую память.

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

Object Pascal

Paradigms Imperative, structured, object-oriented, functional (Delphi dialect only), component-based, event-driven, generic
Family Wirth Pascal
Designed by Initially Apple Computer with input from Niklaus Wirth, and then by Borland International, led by Anders Hejlsberg [1]
First appeared 1986 ; 34 years ago ( 1986 )
Typing discipline Static and dynamic (dynamic typing through Variants, array of const and RTTI), strong, safe
Platform ARM, x86, PowerPC, ppc64, SPARC, MIPS, CLI, Java, Cocoa
Filename extensions .p , .pp , .pas
Major implementations
Delphi (x86, ARM), Free Pascal (x86, PowerPC, ppc64, SPARC, MIPS, ARM), Oxygene (CLI, Java, Native Cocoa), Smart Mobile Studio (JavaScript)
Dialects
Apple, Turbo Pascal, Free Pascal (using objfpc or delphi mode), Delphi, Delphi.NET, Delphi Web Script, Oxygene
Influenced by
Pascal, Simula, Smalltalk
Influenced
C#, Genie, Java, Nim, C/AL

Object Pascal is an extension to the programming language Pascal that provides object-oriented programming features such as classes and methods.

The language was originally developed by Apple Computer as Clascal for the Lisa Workshop development system. As Lisa gave way to Macintosh, Apple collaborated with Niklaus Wirth, the author of Pascal, to develop an officially standardized version of Clascal. This was renamed Object Pascal. Through the mid-1980s, Object Pascal was the primary programming language for early versions of the MacApp application framework. The language lost its place as the primary development language on the Mac in 1991 with the release of the C++-based MacApp 3.0. Official support ended in 1996.

Symantec also developed a compiler for Object Pascal for their THINK Pascal product, which could compile programs much faster than Apple’s own Macintosh Programmer’s Workshop (MPW). Symantec then developed the THINK Class Library (TCL), based on MacApp concepts, which could be called from both Object Pascal as well as THINK C. The THINK suite largely displaced MPW as the primary development platform on the Mac in the late 1980s.

Symantec ported Object Pascal to the PC, and developed a similar object framework on that platform. In contrast to TCL, which eventually migrated to C++, the PC libraries remained primarily based on Pascal.

Borland added support for object oriented programming to Turbo Pascal 5.5, which would eventually become the basis for the Object Pascal dialect used in Delphi. Delphi remained mainstream for business applications on the PC into the early 2000s, and was partially displaced in the 2000s with the introduction of .NET.

Contents

History [ edit ]

Apple Pascal [ edit ]

Pascal became a major language in the programming world in the 1970s, with high-quality implementations on most minicomputer platforms and microcomputers. Among the later was the UCSD Pascal system, which compiled to an intermediate "p-System" code format that could then run on multiple platforms. Apple licensed UCSD and used it as the basis for their Apple Pascal system for the Apple II and Apple III.

Pascal became one of the major languages in the company in this period. With the start of the Apple Lisa project, Pascal was selected as the primary programming language of the platform, although this time as a "true" compiler as opposed to the p-System interpreter.

Clascal [ edit ]

Object Pascal is an extension of the Pascal language that was developed at Apple Computer by a team led by Larry Tesler in consultation with Niklaus Wirth, the inventor of Pascal. It is descended from an earlier object-oriented version of Pascal called Clascal, which was available on the Lisa computer.

Object Pascal was needed in order to support MacApp, an expandable Macintosh application framework that would now be called a class library. Object Pascal extensions, and MacApp itself, were developed by Barry Haynes, Ken Doyle, and Larry Rosenstein, and were tested by Dan Allen. Larry Tesler oversaw the project, which began very early in 1985 and became a product in 1986.

An Object Pascal extension was also implemented in the Think Pascal IDE. The IDE includes the compiler and an editor with syntax highlighting and checking, a powerful debugger and a class library. Many developers preferred Think Pascal over Apple’s implementation of Object Pascal because Think Pascal offered a much faster compile/link/debug cycle, and tight integration of its tools. The last official release was Think Pascal 4.01, in 1992, though Symantec later released an unofficial version 4.5d4 at no charge.

Apple dropped support for Object Pascal when they moved from Motorola 68K chips to IBM’s PowerPC architecture in 1994. MacApp 3.0, for this platform, was re-written in C++.

Borland, Inprise, CodeGear and Embarcadero years [ edit ]

In 1986, Borland introduced similar extensions, also called Object Pascal, to the Turbo Pascal product for the Macintosh, and in 1989 for Turbo Pascal 5.5 for DOS. When Borland refocused from DOS to Windows in 1994, they created a successor to Turbo Pascal, called Delphi and introduced a new set of extensions to create what is now known as the Delphi language.

The development of Delphi started in 1993 and Delphi 1.0 was officially released in the United States on 14 February 1995. While code using the Turbo Pascal object model could still be compiled, Delphi featured a new syntax using the keyword class in preference to object , the Create constructor and a virtual Destroy destructor (and negating having to call the New and Dispose procedures), properties, method pointers, and some other things. These were inspired by the ISO working draft for object-oriented extensions, but many of the differences from Turbo Pascal’s dialect (such as the draft’s requirement that all methods be virtual) were ignored.

The Delphi language has continued to evolve over the years to support constructs such as dynamic arrays, generics and anonymous methods. The old object syntax introduced by Apple ("Old-Style Object Types") is still supported. [2]

Versions [ edit ]

  • Borland used the name Object Pascal for the programming language in the first versions of Delphi, but later renamed it to the Delphi programming language. However, compilers that claim to be compatible with Object Pascal are often trying to be compatible with Delphi source code. [citation needed] Because Delphi is trademarked, compatible compilers continued using the name Object Pascal.
  • Embarcadero Technologies, which purchased Delphi in 2008, [3] sells the DelphiIDE that compiles the Delphi dialect of Object Pascal to Windows and macOS, iOS, Android and Web.
  • .NET support existed from Delphi 8 through Delphi 2005, Delphi 2006 and Delphi 2007, which now has been replaced by another language, Oxygene (see below), which is not fully backward-compatible.
  • The Oxygene programming language developed by RemObjects Software targets the Common Language Infrastructure, the Java (software platform) Runtime Environment and Apple’s Cocoa frameworks for iOS and macOS.
  • The open sourceFree Pascal project allows the language to be compiled for a wide range of operating systems—including Linux (32-bit and 64-bit), FreeBSD, Classic Mac OS/macOS, Solaris, Win32, Win64 and Windows CE—as well as for several different hardware architectures. The first version of Free Pascal for the iPhoneSDK 2.x was announced on January 17, 2009. [4] Now there is support for the ARMISA also.
  • The Smart Pascal programming language [5] targets JavaScript/ECMAScript and is used in Smart Mobile Studio, written by Jon Lennart Aasenden and published by Optimale Systemer (2012). The language greatly simplifies HTML5 development through OOP and RAD (rapid application development) approaches. Smart Pascal integrates tightly with established technologies such as node.js, Embarcadero DataSnap and Remobjects SDK to deliver high-performance client/server web applications. The language allows for easy creation of visual components and re-usable libraries. The Smart Pascal dialect stems from the DWScript language- extended to better integrate with the JavaScript environment and libraries, such as "asm" sections which are plain JavaScript but have access to Pascal symbols, or "external" classes which map directly to prototypal JavaScript classes. Smart Pascal introduces true inheritance, classes, partial classes, interfaces, a virtual method table and many other advanced constructs which are not a part of JavaScript by default.
  • MIDletPascal is aimed at the Java byte-code platform. Note that Free Pascal targets the JVM as well, with a much richer set of features.
  • The Morfik Pascal programming language developed by Morfik targets Ajax-enabled Web applications. The Morfik compiler is incorporated into the company’s AppsBuilder IDE and allows Object Pascal code to be used in implementing code that will execute both in the browser and on the server. It uses the Free Pascal compiler to generate native binaries from Object Pascal.
  • The open source GNU Pascal compiler is available as a front-end to the GNUcompiler collection, which implements the ISO 7185 Pascal standard, and "most" of the ISO 10206 Extended Pascal standard.
  • Also, a free compiler, Turbo51, is available for producing code for Intel 8051 chips.
  • WDSibyl is an open source Delphi-like IDE and compiler available for Microsoft Windows and OS/2, and is a commercial Borland Pascal compatible environment released by a company called Speedsoft that was later developed into a Delphi like RAD environment called Sybil and then open sourced under the GPL when that company closed down. Wolfgang Draxler (WD) now maintains the software. (The compiler used seems to be located in a DLL and is not open-source).

Compilers [ edit ]

Object Pascal compilers are available for a wide range of operating systems and architectures.

  • Delphi is probably the best known compiler. It is the successor of the highly successful Borland Pascal and Turbo Pascal product line. It targets Windows 9x, the Windows NT family, .NET Framework (Delphi 8, Delphi 2005–Delphi 2007), macOS (Delphi XE2 and later), iOS (Delphi XE2 and later, generating native binaries in XE4 and later), Android (Delphi XE5 and later, generating native binaries in XE5 and later). Support for .NET finally became a separate product known as Oxygene (see below).
  • Free Pascal Compiler (FPC) is an open-source Object Pascal compiler that supports many Pascal dialects, including those of Turbo Pascal 7 and Delphi, among others. Currently, FPC can generate code for IA-32, x86-64, PowerPC, SPARC, and ARM processors, and for various operating systems, including Microsoft Windows, Linux, FreeBSD, Classic Mac OS, and macOS (with an Xcode integration kit). Several separate projects exist to facilitate rapid application development with FPC, the most prominent one being the Lazarus IDE.
  • GNU Pascal (A separately distributed part of the GNU Compiler Collection) While not formally aimed at the Delphi dialect of Pascal, it does contain a Borland Pascal compatibility mode, and is very slowly incorporating a few Delphi language features. It is unsuitable for recompiling large bodies of Delphi code directly, but is noteworthy as having prolific support for operating systems and hardware architectures.
  • Oxygene (formerly known as Chrome) is an Object Pascal compiler from RemObjects Software that integrates into Microsoft Visual Studio. It is also available as free command-line compiler that runs native on CLI. It is three compilers in one, each targeting a different platform: Echoes for .NET Framework, Mono, WinRT and Windows Phone 8, Cooper for JDK and Android, and Nougat for iOS and macOS.
  • MIDletPascal is a mobile application development tool that generates Java ME bytecode.
  • PocketStudio is a Pascal-based IDE for Palm OS.
  • Smart Mobile Studio is a compiler that transforms Pascal source code to JavaScript (Source-to-source compiler)
  • Ultibo.org is a free pascal variant which compiles to bare bones Raspberry Pi.

Legacy products [ edit ]

  • Borland Kylix was a Linux variant of Delphi which only targets Intel 32-bit Linux using the Qt library. It does not work out of the box with most modern Linux distributions.
  • Virtual Pascal was a free 32-bit Turbo Pascal- and Delphi-compatible compiler aimed mainly at OS/2 and Microsoft Windows, although it also developed a DOS+ Extender and an experimental Linux cross-compiler. The compiler’s development stopped at about the level of Delphi 2. In 2007, with its official website ceasing to operate, Virtual Pascal was discontinued from being further developed.

Interpreters [ edit ]

Pascal Script (formerly known as InnerFuse) and DWScript (Delphi Web Script) are open-source Object Pascal interpreters/scripting engines written in Delphi. They support subsets of Object Pascal. DWScript can also compile Object Pascal code into JavaScript code (Smart Pascal), and supports just-in-time compilation. Modern Pascal provides 3 different interpreters: a CLI (Command Line Interface), Apache Module (Celerity) and CodeRunner (node.js like solution capable to handle different scripts per port), besides the ability to compile and protect your script’s source.

Sample "Hello World" programs [ edit ]

Apple’s Object Pascal [ edit ]

Turbo Pascal’s Object Pascal [ edit ]

Still supported in Delphi and Free Pascal. FPC also packages its own substitutes for the libraries/units. Delphi doesn’t. The Free Pascal 1.0 series and the FPC textmode IDE are the largest open codebases in this dialect. Free Pascal 2.0 was rewritten in a more Delphi-like dialect, and the textmode IDE and related frameworks (Free Vision) are the only parts in the TP version of Object Pascal.

Stack based allocation [ edit ]

Heap based allocation [ edit ]

As you can see, this works based on pointer copy unless there is a specific allocation for a deeper copy.

Delphi and Free Pascal’s Object Pascal [ edit ]

Note that the object construct is still available in Delphi and Free Pascal.

Modern Pascal’s Object Pascal [ edit ]

Oxygene Object Pascal [ edit ]

DWScript’s Object Pascal (a.k.a. Smart Pascal) [ edit ]

Note that the method implementation can also be made in a distinct location as in other Object Pascal dialects.

Development [ edit ]

Many features have been introduced continuously to Object Pascal with extensions to Delphi and extensions to FreePascal. In reaction to criticism, Free Pascal has adopted generics with the same syntax as Delphi, provided Delphi compatibility mode is selected, and both Delphi (partially) and Free Pascal (more extensive) support operator overloading. Delphi has also introduced many other features since version 7 [6] including generics. Whereas FreePascal tries to be compatible to Delphi in Delphi compatibility mode, it also traditionally introduced many new features to the language that are not always available in Delphi.

Начнем рассмотрение темы с того, каким образом следует вносить комментарии в программу на языке Object Pascal. Этот язык поддерживает три типа комментариев — с использованием фигурных скобок, пар скобка–звездочка и двойной наклонной чер ты (в стиле C++). Ниже приведены три примера комментариев Object Pascal:

(* Комментарий с использованием пары скобка+звездочка *)

// Комментарий с использованием двойной наклонной черты

Поведение первых двух типов комментариев идентично. Object Pascal считает комментарием все, что находится между символом (или парой символов) начала ком ментария и символом завершения комментария, включая символы перехода на новую строку. Комментарий в виде двойной косой черты продолжается только до конца строки.

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

< < Недопустимо >>Дополнительные возможности процедур и функций

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

Скобки при вызове функций

Хотя добавление скобок при вызове функции или процедуры без параметров не является новинкой, но про такую возможность знают далеко не все. В Object Pascal считаются корректными оба варианта вызова:

Это, конечно, возможность не из тех, которые сильно удивляют. Однако програм мисты, вынужденные делить свое рабочее время между разными языками (например Delphi, C и Java), оценят ее по достоинству, ибо им не придется задумываться о разли чии синтаксиса вызова функций в различных языках.

В Delphi 4 была реализована концепция перегрузки функций (overloading), которая позволяет иметь несколько различных функций или процедур с одинаковым именем, но разными списками параметров. Такие процедуры и функции должны быть описа ны с применением директивы overload:

procedure Hello(I: Integer); overload; procedure Hello(S: String); overload; procedure Hello(D: Double); overload;

Заметим, что правила перегрузки методов класса, сформулированные в соответст вующей главе книги, несколько отличаются от правил перегрузки обычных процедур и функций. Хотя предоставления возможности перегрузки функций программисты требовали с момента выхода в свет Delphi 1, тем не менее это не самая безопасная возможность языка. Наряду с уже имевшейся возможностью использования в разных модулях функций с одним и тем же именем, применение перегруженных функций может стать неиссякаемым источником трудноуловимых ошибок в программе. По этому сто раз подумайте, прежде чем использовать перегрузку. Помните золотое пра вило: “Можно потреблять, но не злоупотреблять!”.

Значения параметров по умолчанию

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

procedure HasDefVal(S: string; I: Integer = 0);

Процедура HasDefVal() может быть вызвана двумя способами. В первом случае —

как обычно, с указанием обоих параметров:

Во втором случае можно задать только значение параметра S, а для параметра I

использовать значение, установленное по умолчанию:

HasDefVal(‘hello’); // Для I используется значение по умолчанию

При использовании значений параметров по умолчанию следует помнить о не

скольких приведенных ниже правилах.

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

• Значения по умолчанию могут присваиваться только параметрам обычных ти

пов, указателям или множествам.

• Значение по умолчанию может передаваться только по значению либо с моди фикатором const. Оно не может быть ссылкой или нетипизированным пара метром.

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

function AddInts(I1, I2: Integer): Integer;

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

function AddInts(I1, I2: Integer; I3: Integer = 0);

Result := I1 + I2 + I3;

У начинающих программистов бытует мнение: “Если мне понадобится еще одна переменная — я опишу ее прямо здесь, посреди кода, в том месте, где она понадоби лась”. Для таких языков, как Java, C или Visual Basic, — это вполне допустимо. Но в языке Object Pascal все переменные обязательно должны быть описаны в соответст вующем разделе var, расположенном в начале процедуры, функции или программы. Предположим, на C++ код функции выглядит так:

Аналогичная функция на Object Pascal должна выглядеть следующим образом:

Ссылка на основную публикацию
Шампанское шато тамань брют отзывы
Производитель: ООО «Кубань-Вино» Сбор винограда: 2016 Происхождение: Краснодарский край, Россия Сорт винограда: Шардоне, Рислинг и иные белые На отзыве у...
Что означает ошибка 110
Ошибка 110 в Android происходит главным образом при обновлении или установке приложений из Google Play. Случается это из-за несовместимости ОС:...
Что означает ошибка 963
Ошибки в Google Play дело достаточно частое, это не удивительно, ведь Плей маркет – это один из крупнейших магазинов приложений....
Шапка для твиттера 1500х500
Please complete the security check to access www.canva.com Why do I have to complete a CAPTCHA? Completing the CAPTCHA proves...