Разработанный Никлаусом Виртом в конце 1960-х и начале 1970-х годов, Pascal является языком программирования . Первоначально разработанный Borland Software Corporation, Embarcadero Delphi состоит из IDE, набора стандартных библиотек и языка на основе Pascal, обычно называемого Object Pascal , Delphi Pascal или просто «Delphi» (текущая документация Embarcadero называет его «языком Delphi (Object Pascal)» [1] ). С момента первого выпуска он стал самой популярной коммерческой реализацией Pascal.
При разработке Pascal Вирт использовал процедуру самонастройки , при которой каждая новая версия компилятора Pascal писалась и компилировалась с предыдущей. Таким образом, компилятор 'P2' был написан на диалекте, компилируемом 'P1', 'P3' в свою очередь был написан на 'P2' и так далее, вплоть до 'P5'. Компилятор 'P5' реализовал Pascal в его окончательном состоянии, как определено Виртом, и впоследствии был стандартизирован как 'ISO 7185 Pascal'.
Диалект Borland, как и популярный UCSD Pascal до него, взял за основу версию языка 'P4', а не окончательную редакцию Вирта. После значительной эволюции, независимой от Standard Pascal, вариант Borland стал основой для Delphi. На этой странице рассматриваются различия между Delphi и Standard Pascal. Она не затрагивает специфичные для Delphi расширения языка, которые многочисленны и продолжают расти.
Следующие функции являются взаимоисключающими. Реализация Standard Pascal не принимается Delphi и наоборот, код Delphi не принимается в Standard Pascal.
В стандартном языке Pascal определение оператора похоже на евклидово, mod
тогда как в Delphi используется усеченное определение.
Стандартный Pascal требует, чтобы разделители комментариев {
и биграмма , а также и были синонимами друг друга. [2]
Однако в Delphi блочный комментарий, начинающийся с , должен быть закрыт с помощью . [3]
Биграмма закроет только любой комментарий, начинающийся с . [3]
Эта схема допускает вложенные комментарии за счет сложности компилятора.(*
}
*)
{
}
*)
(*
Способ передачи процедур и функций в качестве параметров различается: Delphi требует явного объявления процедурных типов, тогда как в стандартном Pascal этого не требуется. [4]
Стандартный Паскаль | Дельфи |
---|---|
программа procedureDataType ( выход ) ; { `printYIntersect` имеет один процедурный параметр: } procedure printYIntersect ( function f ( x : real ) : real ) ; begin writeLn ( f ( 0.0 )) ; end ; { В стандартном Паскале нет процедурных «указателей». } function f ( x : real ) : real ; begin f := cos ( x ) ; end ; { ─── MAIN ────────────────────────────────────────────────── } begin printYIntersect ( f ) ; end . | тип TFunc = функция ( x : вещественное ) : вещественное ; процедура printYIntersect ( f : TFunc ) ; начало writeLn ( f ( 0.0 ) ) ; конец ; функция f ( x : вещественное ) : вещественное ; начало f := cos ( x ) ; конец ; // ─── ГЛАВНАЯ ────────────────────────────────────────────────────────── начало printYIntersect ( @ f ) ; конец . |
Различные компьютерные системы показывают широкий спектр способов обозначения новой строки . Это влияет на внутреннее представление text
файлов, которые состоят из серии «строк». Чтобы избавить программиста от любой связанной с этим головной боли, стандартный Паскаль предписывает, чтобы чтение «символа конца строки» возвращало один символ пробела. Чтобы отличить такой символ пробела «конца строки» от символа пробела, который на самом деле является подлинной полезной нагрузкой строки, EOLn
становится true
.
Delphi не показывает такого поведения. Чтение новой строки вернет любую последовательность символов, представляющую новую строку в текущей хост-системе, например, два char
значения (возврат каретки) плюс (перевод строки). [3]chr(13)
chr(10)
Следующие функции присутствуют или отсутствуют в обоих языках.
goto
Стандартный Pascal допускает a goto
к любому label
определенному в области видимости. В Delphi a goto
должен быть в пределах текущей процедуры, т. е. не может покидать -frame . [3]begin … end
program jumpAround ; label 999 ; procedure foo ; begin { Это не разрешено в Delphi: } goto 999 ; end ; begin foo ; 999 : ; end .
Delphi не поддерживает буферные переменные и связанные с ними стандартные процедуры get
и put
. [3]
program copy ( input , output ) ; begin while not EOF ( input ) do begin { Копировать файловые буферы. Не поддерживается Delphi} output ↑ := input ↑ ; { Input↑ содержит пробел, если произошел переход на новую строку. } if EOLn ( input ) then begin writeLn ( output ) ; end else begin put ( output ) ; end ; { Переместить курсор чтения. } get ( input ) ; end ; end .
В стандартном Паскале выделение памяти для варианта record
может указывать на конкретный вариант. Это позволяет реализациям выделять наименьшее количество действительно необходимой памяти. Delphi не поддерживает это. [3]
program variationRecord ; type sex = ( female , male ) ; clothesMeasures = record girth : real ; case gender : sex of female : ( underbust : real ) ; male : ( ) ; end ; var size : clothesMeasures ; begin { NB: Для `underbust` не выделено место. } new ( size , male ) ; end .
В Delphi любой файл должен быть подкреплен файлом в файловой системе. Это означает, что любой file
файл должен быть связан с именем файла с assign
процедурой Delphi. Напротив, Standard Pascal можно использовать без имен файлов. Следующий код вызовет ошибку времени выполнения в Delphi. [3]
program temporaryFile ( output ) ; var FD : text ; begin rewrite ( FD ) ; writeLn ( FD , 'Привет, мир!' ) ; end .
Delphi не реализует стандартные процедуры pack
и unpack
. [3]
Несмотря на это, передача данных между упакованными и распакованными типами данных — простая задача, хотя реализация может быть не столь эффективной, как реализация, предоставленная поставщиком компилятора.
write
ширина по умолчаниюDelphi не связывает тип данных Boolean
с шириной по умолчанию, если он указан как write
/ writeLn
параметры. [3]
Delphi демонстрирует поведение, как обычно, для символьных строк.
Delphi допускает перегрузку процедур. В стандартном Pascal идентификаторы должны быть уникальными в каждом блоке.
функция f ( x : целое число ) : вещественное число ; начало результат := sin ( x ) ; конец ; function f ( x : real ) : real ; begin result := cos ( x ) ; end ; // ─── MAIN ──────────────────────────────────────────────────────── begin // Обратите внимание на различные типы данных. writeLn ( f ( 3 )) ; writeLn ( f ( 3.0 )) ; end .
Delphi допускает параметры по умолчанию .
write
ширинаВ Pascal, если файл назначения является файлом text
, параметры в write
/ writeLn
имеют общую ширину по умолчанию, определяемую реализацией. В Delphi для integer
значений это просто 1
. Это означает, что всегда занято наименьшее количество места. [3]
Другие компиляторы показали ширину по умолчанию, например, 20
позволяя получить прекрасный табличный вид без затрат на дополнительный код.
фрагмент исходного кода | |
---|---|
writeLn ( 1 ) ; writeLn ( 23456789 ) ; | |
производит в | |
Стандартный Паскаль ( GPC ) | Дельфи |
1 23456789 | 123456789 |