Content deleted Content added
No edit summary |
Removed PROD: Delphi and Pascal are strongly related languages, so it is no WP:INDISCRIMINATE comparison. As for WP:OR issues: WP:TNT is not policy, while WP:ATD is. |
||
(28 intermediate revisions by 20 users not shown) | |||
Line 1:
{{Short description|Programming language}}
{{ProgLangCompare}}
{{use mdy dates|date=April 2023}}
Devised by [[Niklaus Wirth]] in the late 1960s and early 1970s, [[Pascal (programming language)|Pascal]] is a [[programming language]]. Originally produced by [[Borland]] Software Corporation, [[Embarcadero Delphi]] is composed of an IDE, set of standard libraries, and a Pascal-based language commonly called either [[Object Pascal]], Delphi Pascal, or simply 'Delphi' (Embarcadero's current documentation refers to it as 'the Delphi language (Object Pascal)'<ref>{{Cite web|url=http://docwiki.embarcadero.com/RADStudio/XE2/en/Delphi_Reference|title = Delphi Reference - RAD Studio XE2}}</ref>). Since first released, it has become the most popular commercial Pascal implementation.
== Exclusive features ==
Following features are mutually exclusive.
The Standard Pascal implementation is not accepted by Delphi and vice versa, the Delphi code is not acceptable in Standard Pascal.
=== Modulo with negative dividend ===
Standard Pascal has a Euclidean-like definition of the [[Modulo#In programming languages|<syntaxhighlight lang="pascal" inline>mod</syntaxhighlight> operator]] whereas Delphi uses a truncated definition.
=== Nested comments ===
Standard Pascal requires that the comment delimiters <syntaxhighlight lang="pascal" inline>{</syntaxhighlight> and the bigramm <syntaxhighlight lang="pascal" inline>(*</syntaxhighlight>, as well as <syntaxhighlight lang="pascal" inline>}</syntaxhighlight> and <syntaxhighlight lang="pascal" inline>*)</syntaxhighlight> are synonymous to each other.<ref name="gpc_comments"/>
In Delphi, however, a block comment started by <syntaxhighlight lang="pascal" inline>{</syntaxhighlight> ''must'' be closed with a <syntaxhighlight lang="pascal" inline>}</syntaxhighlight>.<ref name="moore"/>
The bigramm <syntaxhighlight lang="pascal" inline>*)</syntaxhighlight> will only close any comment that started with <syntaxhighlight lang="pascal" inline>(*</syntaxhighlight>.<ref name="moore"/>
This scheme allows for ''nested'' comments at the expense of compiler complexity.
=== Procedural data types ===
The way procedures and functions can be passed as parameters differs:
Delphi requires explicit procedural types to be declared where Standard Pascal does not.<ref name="reagan"/>
{| class="wikitable" style="margin: auto;"
|+ comparison procedural data types
|-
! Standard Pascal !! Delphi
|- style="vertical-align:bottom"
| <syntaxhighlight lang="pascal" highlight="3,4" style="font-size:85%">
program proceduralDataType(output);
{ `printYIntersect` has one procedural parameter: }
procedure printYIntersect(function f(x: real): real);
begin
writeLn(f(0.0));
end;
{ Standard Pascal does not have procedural “pointers.” }
function f(x: real): real;
begin
f := cos(x);
end;
{ ─── MAIN ───────────────────────────────────────────── }
begin
printYIntersect(f);
end.
</syntaxhighlight>
| <syntaxhighlight lang="delphi" highlight="1-4" style="font-size:85%">
type
TFunc = function(x: real): real;
procedure printYIntersect(f: TFunc);
begin
writeLn(f(0.0));
end;
function f(x: real): real;
begin
f := cos(x);
end;
// ─── MAIN ─────────────────────────────────────────────
begin
printYIntersect(@f);
end.
</syntaxhighlight>
|}
=== Conversion of newline characters ===
Various computer systems show a wide variety how to indicate a [[newline]].
This affects the internal representation of <syntaxhighlight lang="pascal" inline>text</syntaxhighlight> files which are composed of a series of “lines”.
In order to relieve the programmer from any associated headaches, Standard Pascal mandates that ''reading'' an “end-of-line character” returns a single space character.
To distinguish such an “end-of-line” space character from a space character that is actually genuine payload of the line, <syntaxhighlight lang="pascal" inline>EOLn</syntaxhighlight> becomes <syntaxhighlight lang="pascal" inline>true</syntaxhighlight>.
Delphi does not show this behavior.
Reading a newline will return whatever character sequence represents a newline on the current host system, for example two <syntaxhighlight lang="delphi" inline>char</syntaxhighlight> values <syntaxhighlight lang="delphi" inline>chr(13)</syntaxhighlight> (carriage return) plus <syntaxhighlight lang="delphi" inline>chr(10)</syntaxhighlight> (line feed).<ref name="moore"/>
== Additional or missing features ==
Following features are present or missing in either language.
=== Global <syntaxhighlight lang="pascal" inline>goto</syntaxhighlight> ===
Standard Pascal permits a <syntaxhighlight lang="pascal" inline>goto</syntaxhighlight> to any <syntaxhighlight lang="pascal" inline>label</syntaxhighlight> defined in scope.
In Delphi a <syntaxhighlight lang="delphi" inline>goto</syntaxhighlight> must be within the current routine, i. e. may not leave the <syntaxhighlight lang="delphi" inline>begin … end</syntaxhighlight>-frame.<ref name="moore"/>
<syntaxhighlight lang="pascal" highlight="6,7">program jumpAround;
label
999;
procedure foo;
begin
{ This is not permitted in Delphi: }
goto 999;
end;
begin
foo;
999: ;
end.</syntaxhighlight>
=== Buffer variables ===
Delphi does not support buffer variables and associated standard routines <syntaxhighlight lang="pascal" inline>get</syntaxhighlight> and <syntaxhighlight lang="pascal" inline>put</syntaxhighlight>.<ref name="moore"/>
<syntaxhighlight lang="pascal" highlight="5,6,15,19">program copy(input, output);
begin
while not EOF(input) do
begin
{ Copy file buffers. Not supported by Delphi }
output↑ := input↑;
{ Input↑ contains a space if a new-line occurred. }
if EOLn(input) then
begin
writeLn(output);
end
else
begin
put(output);
end;
{ Advance reading cursor. }
get(input);
end;
end.</syntaxhighlight>
=== Discriminated variant record allocation ===
In Standard Pascal allocating memory for a variant <syntaxhighlight lang="pascal" inline>record</syntaxhighlight> may indicate a specific variant.
This allows implementations to allocate the least amount of ''really'' necessary memory.
Delphi does not support this.<ref name="moore"/>
<syntaxhighlight lang="pascal" highlight="13,14">program variantRecord;
type
sex = (female, male);
clothingMeasures = record
girth: real;
case gender: sex of
female: (underbust: real);
male: ( );
end;
var
size: clothingMeasures;
begin
{ NB: No space allocated for `underbust`. }
new(size, male);
end.</syntaxhighlight>
=== Temporary files ===
In Delphi any file must be backed by a file in the file system.
That means any <syntaxhighlight lang="delphi" inline>file</syntaxhighlight> needs to be associated with a file name with Delphi's <syntaxhighlight lang="delphi" inline>assign</syntaxhighlight> procedure.
In contrast, Standard Pascal is usable without file names.
The following will produce a run-time error with Delphi.<ref name="moore"/>
<syntaxhighlight lang="pascal">program temporaryFile(output);
var
FD: text;
begin
rewrite(FD);
writeLn(FD, 'Hello world!');
end.</syntaxhighlight>
=== Packing ===
Delphi does not implement the standard procedures <syntaxhighlight lang="pascal" inline>pack</syntaxhighlight> and <syntaxhighlight lang="pascal" inline>unpack</syntaxhighlight>.<ref name="moore"/>
Regardless, transferring data between packed and unpacked data types is an easy feat, although the implementation might not be as efficient as a compiler vendor supplied implementation would be.
=== Missing default <syntaxhighlight lang="pascal" inline>write</syntaxhighlight> width ===
Delphi does not associate the data type <syntaxhighlight lang="pascal" inline>Boolean</syntaxhighlight> with a default width if specified as <syntaxhighlight lang="pascal" inline>write</syntaxhighlight>/<syntaxhighlight lang="pascal" inline>writeLn</syntaxhighlight> parameters.<ref name="moore"/>
Delphi demonstrates the behavior as usual for character-strings.
=== Overloading ===
Delphi permits overloading routines.
In Standard Pascal identifiers must be unique in every block.
<syntaxhighlight lang="delphi">function f(x: integer): real;
begin
result := sin(x);
end;
function f(x: real): real;
begin
result := cos(x);
end;
// ─── MAIN ─────────────────────────────────────────────
begin
// Note the different data types.
writeLn(f(3));
writeLn(f(3.0));
end.</syntaxhighlight>
=== Default parameter values ===
Delphi permits [[default parameter]]s.
== Peculiar implementation characteristics ==
=== Standard <syntaxhighlight lang="pascal" inline>write</syntaxhighlight> width ===
In Pascal, if the destination file is a <syntaxhighlight lang="pascal" inline>text</syntaxhighlight> file, the parameters to <syntaxhighlight lang="pascal" inline>write</syntaxhighlight>/<syntaxhighlight lang="pascal" inline>writeLn</syntaxhighlight> have an implemention-defined default total width.
In Delphi, for <syntaxhighlight lang="delphi" inline>integer</syntaxhighlight> values this is simply <syntaxhighlight lang="delphi" inline>1</syntaxhighlight>.
That means always the least amount of space is occupied.<ref name="moore"/>
Other compilers have shown default widths of, for example, <syntaxhighlight lang="pascal" inline>20</syntaxhighlight> allowing for a fine tabular look at no cost of extra code.
{| class="wikitable" style="margin: auto;"
|+ comparison default <syntaxhighlight lang="pascal" inline>write</syntaxhighlight> width
|-
! colspan="2" | source code fragment
|-
| colspan="2" | <syntaxhighlight lang="pascal">writeLn(1);
writeLn(23456789);</syntaxhighlight>
|-
! colspan="2" | produces in
|-
! Standard Pascal ([[GNU Pascal|GPC]]) !! Delphi
|-
| <syntaxhighlight lang="text"> 1
23456789</syntaxhighlight>
| <syntaxhighlight lang="text">1
23456789</syntaxhighlight>
|}
== References ==
<references>
<ref name="gpc_comments">{{cite web
| title = The GNU Pascal Manual
| first1 = Jan-Jaap
| last1 = van der Heijden
| first2 = Peter
| last2 = Gerwinski
| first3 = Frank
| last3 = Heckenbach
| first4 = Berend
| last4 = deBoer
| first5 = Dominik
| last5 = Freche
| first6 = Eike
| last6 = Lange
| first7 = Peter
| last7 = Lewis
| display-authors = etal
| at = A QuickStart Guide from Borland Pascal to GNU Pascal
| url = https://www.GNU-Pascal.de/gpc/Comments.html#Comments
| access-date = 2023-04-24
}}</ref>
<ref name="reagan">{{cite web
| title = Pascal Standards FAQ
| at = Comparison of Borland Pascal to the Pascal standards
| first = John
| last = Reagan
| date = 1995-04-03
| url = http://Pascal-Central.com/extpascal.html#anchor-6
| archive-url = https://web.archive.org/web/20210928162340/http://pascal-central.com/extpascal.html#anchor-6
| archive-date = 2021-09-28
}}</ref>
<ref name="moore">{{cite web
| title = Standard Pascal FAQ
| at = Q. What are the differences between Borland Delphi and the ISO 7185 standard?
| first = Scott
| last = Moore
| date = 2022-12-02
| url = https://www.MooreCAD.com/standardpascal/pascalfaq.html#Q.%20What%20are%20the%20differences%20between%20Borland%20Del
| access-date = 2023-04-24
}}</ref>
</references>
== Further reading ==
* Kathleen Jansen and [[Niklaus Wirth]]: ''PASCAL - User Manual and Report.'' Springer-Verlag, 1974, 1985, 1991, {{ISBN
* Niklaus Wirth: ''The Programming Language Pascal.'' Acta Informatica, 1, (Jun 1971)
* ISO/IEC 7185: ''Programming Languages - PASCAL.'' [http://www.moorecad.com/standardpascal/]
* Doug Cooper: ''Standard Pascal: User Reference Manual.'' W. W. Norton & Company, 1983, {{ISBN
== External links ==
* [https://www.moorecad.com/standardpascal/ The ISO 7185 Pascal web site]
* [https://www.StandardPascal.org/standards.html Pascal standards documents]
{{Pascal programming language family}}
{{DEFAULTSORT:Pascal and Delphi comparison}}
[[Category:Pascal programming language family]]
[[Category:Borland]]
[[Category:
|