Comparison of Pascal and Delphi
Programming language
- 7 min read
- 3 chapters
Related on Lably
Through Modulo
While developing Pascal, Wirth employed a bootstrapping procedure in which each newer version of the Pascal compiler was written and compiled with its predecessor. Thus, the 'P2' compiler was written in the dialect compilable by 'P1', 'P3' in turn was written in 'P2' and so on, all the way till 'P5'. The 'P5' compiler implemented Pascal in its final state as defined by Wirth, and subsequently became standardised as 'ISO 7185 Pascal'.
The Borland dialect, like the popular UCSD Pascal before it, took the 'P4' version of the language as its basis, rather than Wirth's final revision. After much evolution independent of Standard Pascal, the Borland variant became the basis for Delphi. This page goes over the differences between Delphi and Standard Pascal. It does not go into Delphi-specific extensions to the language, which are numerous and still increasing.
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 mod operator whereas Delphi uses a truncated definition.
Nested comments
Standard Pascal requires that the comment delimiters { and the bigram (*, as well as } and *) are synonymous to each other. In Delphi, however, a block comment started by { must be closed with a }. The bigramm *) will only close any comment that started with (*. This scheme allows for nested comments.
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.
Conversion of newline characters
Various computer systems show a wide variety how to indicate a newline. This affects the internal representation of text 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, EOLn becomes true.
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 char values chr(13) (carriage return) plus chr(10) (line feed).
Sign in to keep reading
2 more chapters are free with a Lably account.
Additional or missing features
Following features are present or missing in either language.
Global goto
Standard Pascal permits a goto to any label defined in scope. In Delphi a goto must be within the current routine, i. e. may not leave the begin … end-frame.
<span id="mwATY"></span><span class="k" id="mwATc">program</span><span class="w" id="mwATg"> </span><span class="n" id="mwATk">jumpAround</span><span class="o" id="mwATo">;</span> <span class="w" id="mwATs"> </span><span class="k" id="mwATw">label</span> <span class="w" id="mwAT0"> </span><span class="mi" id="mwAT4">999</span><span class="o" id="mwAT8">;</span> <span class="w" id="mwAUA"> </span><span class="k" id="mwAUE">procedure</span><span class="w" id="mwAUI"> </span><span class="nf" id="mwAUM">foo</span><span class="o" id="mwAUQ">;</span> <span class="w" id="mwAUU"> </span><span class="k" id="mwAUY">begin</span> <span class="hll" id="mwAUc"><span class="w" id="mwAUg"> </span><span class="cm" id="mwAUk">{ This is not permitted in Delphi: }</span> </span><span class="hll" id="mwAUo"><span class="w" id="mwAUs"> </span><span class="k" id="mwAUw">goto</span><span class="w" id="mwAU0"> </span><span class="mi" id="mwAU4">999</span><span class="o" id="mwAU8">;</span> </span><span class="w" id="mwAVA"> </span><span class="k" id="mwAVE">end</span><span class="o" id="mwAVI">;</span> <span class="w" id="mwAVM"> </span><span class="k" id="mwAVQ">begin</span> <span class="w" id="mwAVU"> </span><span class="n" id="mwAVY">foo</span><span class="o" id="mwAVc">;</span> <span class="w" id="mwAVg"> </span><span class="mi" id="mwAVk">999</span><span class="o" id="mwAVo">:</span><span class="w" id="mwAVs"> </span><span class="o" id="mwAVw">;</span> <span class="w" id="mwAV0"> </span><span class="k" id="mwAV4">end</span><span class="o" id="mwAV8">.</span>Buffer variables
Delphi does not support buffer variables and associated standard routines get and put.
<span id="mwAWw"></span><span class="k" id="mwAW0">program</span><span class="w" id="mwAW4"> </span><span class="nb" id="mwAW8">copy</span><span class="p" id="mwAXA">(</span><span class="n" id="mwAXE">input</span><span class="o" id="mwAXI">,</span><span class="w" id="mwAXM"> </span><span class="n" id="mwAXQ">output</span><span class="p" id="mwAXU">)</span><span class="o" id="mwAXY">;</span> <span class="w" id="mwAXc"> </span><span class="k" id="mwAXg">begin</span> <span class="w" id="mwAXk"> </span><span class="k" id="mwAXo">while</span><span class="w" id="mwAXs"> </span><span class="k" id="mwAXw">not</span><span class="w" id="mwAX0"> </span><span class="nb" id="mwAX4">EOF</span><span class="p" id="mwAX8">(</span><span class="n" id="mwAYA">input</span><span class="p" id="mwAYE">)</span><span class="w" id="mwAYI"> </span><span class="k" id="mwAYM">do</span> <span class="w" id="mwAYQ"> </span><span class="k" id="mwAYU">begin</span> <span class="hll" id="mwAYY"><span class="w" id="mwAYc"> </span><span class="cm" id="mwAYg">{ Copy file buffers. Not supported by Delphi }</span> </span><span class="hll" id="mwAYk"><span class="w" id="mwAYo"> </span><span class="n" id="mwAYs">output</span><span class="err" id="mwAYw">↑</span><span class="w" id="mwAY0"> </span><span class="o" id="mwAY4">:=</span><span class="w" id="mwAY8"> </span><span class="n" id="mwAZA">input</span><span class="err" id="mwAZE">↑</span><span class="o" id="mwAZI">;</span> </span><span class="w" id="mwAZM"> </span> <span class="w" id="mwAZQ"> </span><span class="cm" id="mwAZU">{ Input↑ contains a space if a new-line occurred. }</span> <span class="w" id="mwAZY"> </span><span class="k" id="mwAZc">if</span><span class="w" id="mwAZg"> </span><span class="nb" id="mwAZk">EOLn</span><span class="p" id="mwAZo">(</span><span class="n" id="mwAZs">input</span><span class="p" id="mwAZw">)</span><span class="w" id="mwAZ0"> </span><span class="k" id="mwAZ4">then</span> <span class="w" id="mwAZ8"> </span><span class="k" id="mwAaA">begin</span> <span class="w" id="mwAaE"> </span><span class="nb" id="mwAaI">writeLn</span><span class="p" id="mwAaM">(</span><span class="n" id="mwAaQ">output</span><span class="p" id="mwAaU">)</span><span class="o" id="mwAaY">;</span> <span class="w" id="mwAac"> </span><span class="k" id="mwAag">end</span> <span class="w" id="mwAak"> </span><span class="k" id="mwAao">else</span> <span class="w" id="mwAas"> </span><span class="k" id="mwAaw">begin</span> <span class="hll" id="mwAa0"><span class="w" id="mwAa4"> </span><span class="n" id="mwAa8">put</span><span class="p" id="mwAbA">(</span><span class="n" id="mwAbE">output</span><span class="p" id="mwAbI">)</span><span class="o" id="mwAbM">;</span> </span><span class="w" id="mwAbQ"> </span><span class="k" id="mwAbU">end</span><span class="o" id="mwAbY">;</span> <span class="w" id="mwAbc"> </span> <span class="w" id="mwAbg"> </span><span class="cm" id="mwAbk">{ Advance reading cursor. }</span> <span class="hll" id="mwAbo"><span class="w" id="mwAbs"> </span><span class="n" id="mwAbw">get</span><span class="p" id="mwAb0">(</span><span class="n" id="mwAb4">input</span><span class="p" id="mwAb8">)</span><span class="o" id="mwAcA">;</span> </span><span class="w" id="mwAcE"> </span><span class="k" id="mwAcI">end</span><span class="o" id="mwAcM">;</span> <span class="w" id="mwAcQ"> </span><span class="k" id="mwAcU">end</span><span class="o" id="mwAcY">.</span>Discriminated variant record allocation
In Standard Pascal allocating memory for a variant record may indicate a specific variant. This allows implementations to allocate the least really necessary memory. Delphi does not support this.
<span id="mwAdI"></span><span class="k" id="mwAdM">program</span><span class="w" id="mwAdQ"> </span><span class="n" id="mwAdU">variantRecord</span><span class="o" id="mwAdY">;</span> <span class="w" id="mwAdc"> </span><span class="k" id="mwAdg">type</span> <span class="w" id="mwAdk"> </span><span class="n" id="mwAdo">sex</span><span class="w" id="mwAds"> </span><span class="o" id="mwAdw">=</span><span class="w" id="mwAd0"> </span><span class="p" id="mwAd4">(</span><span class="n" id="mwAd8">female</span><span class="o" id="mwAeA">,</span><span class="w" id="mwAeE"> </span><span class="n" id="mwAeI">male</span><span class="p" id="mwAeM">)</span><span class="o" id="mwAeQ">;</span> <span class="w" id="mwAeU"> </span><span class="n" id="mwAeY">clothingMeasures</span><span class="w" id="mwAec"> </span><span class="o" id="mwAeg">=</span><span class="w" id="mwAek"> </span><span class="k" id="mwAeo">record</span> <span class="w" id="mwAes"> </span><span class="n" id="mwAew">girth</span><span class="o" id="mwAe0">:</span><span class="w" id="mwAe4"> </span><span class="kt" id="mwAe8">real</span><span class="o" id="mwAfA">;</span> <span class="w" id="mwAfE"> </span><span class="k" id="mwAfI">case</span><span class="w" id="mwAfM"> </span><span class="n" id="mwAfQ">gender</span><span class="o" id="mwAfU">:</span><span class="w" id="mwAfY"> </span><span class="n" id="mwAfc">sex</span><span class="w" id="mwAfg"> </span><span class="k" id="mwAfk">of</span> <span class="w" id="mwAfo"> </span><span class="n" id="mwAfs">female</span><span class="o" id="mwAfw">:</span><span class="w" id="mwAf0"> </span><span class="p" id="mwAf4">(</span><span class="n" id="mwAf8">underbust</span><span class="o" id="mwAgA">:</span><span class="w" id="mwAgE"> </span><span class="kt" id="mwAgI">real</span><span class="p" id="mwAgM">)</span><span class="o" id="mwAgQ">;</span> <span class="w" id="mwAgU"> </span><span class="n" id="mwAgY">male</span><span class="o" id="mwAgc">:</span><span class="w" id="mwAgg"> </span><span class="p" id="mwAgk">(</span><span class="w" id="mwAgo"> </span><span class="p" id="mwAgs">)</span><span class="o" id="mwAgw">;</span> <span class="w" id="mwAg0"> </span><span class="k" id="mwAg4">end</span><span class="o" id="mwAg8">;</span> <span class="w" id="mwAhA"> </span><span class="k" id="mwAhE">var</span> <span class="w" id="mwAhI"> </span><span class="n" id="mwAhM">size</span><span class="o" id="mwAhQ">:</span><span class="w" id="mwAhU"> </span><span class="n" id="mwAhY">clothingMeasures</span><span class="o" id="mwAhc">;</span> <span class="w" id="mwAhg"> </span><span class="k" id="mwAhk">begin</span> <span class="hll" id="mwAho"><span class="w" id="mwAhs"> </span><span class="cm" id="mwAhw">{ NB: No space allocated for `underbust`. }</span> </span><span class="hll" id="mwAh0"><span class="w" id="mwAh4"> </span><span class="k" id="mwAh8">new</span><span class="p" id="mwAiA">(</span><span class="n" id="mwAiE">size</span><span class="o" id="mwAiI">,</span><span class="w" id="mwAiM"> </span><span class="n" id="mwAiQ">male</span><span class="p" id="mwAiU">)</span><span class="o" id="mwAiY">;</span> </span><span class="w" id="mwAic"> </span><span class="k" id="mwAig">end</span><span class="o" id="mwAik">.</span>Temporary files
In Delphi any file must be backed by a file in the file system. That means any file needs to be associated with a file name with Delphi's assign procedure. In contrast, Standard Pascal is usable without file names. The following will produce a run-time error with Delphi.
<span id="mwAjY"></span><span class="k" id="mwAjc">program</span><span class="w" id="mwAjg"> </span><span class="n" id="mwAjk">temporaryFile</span><span class="p" id="mwAjo">(</span><span class="n" id="mwAjs">output</span><span class="p" id="mwAjw">)</span><span class="o" id="mwAj0">;</span> <span class="w" id="mwAj4"> </span><span class="k" id="mwAj8">var</span> <span class="w" id="mwAkA"> </span><span class="n" id="mwAkE">FD</span><span class="o" id="mwAkI">:</span><span class="w" id="mwAkM"> </span><span class="n" id="mwAkQ">text</span><span class="o" id="mwAkU">;</span> <span class="w" id="mwAkY"> </span><span class="k" id="mwAkc">begin</span> <span class="w" id="mwAkg"> </span><span class="nb" id="mwAkk">rewrite</span><span class="p" id="mwAko">(</span><span class="n" id="mwAks">FD</span><span class="p" id="mwAkw">)</span><span class="o" id="mwAk0">;</span> <span class="w" id="mwAk4"> </span><span class="nb" id="mwAk8">writeLn</span><span class="p" id="mwAlA">(</span><span class="n" id="mwAlE">FD</span><span class="o" id="mwAlI">,</span><span class="w" id="mwAlM"> </span><span class="s" id="mwAlQ">'Hello world!'</span><span class="p" id="mwAlU">)</span><span class="o" id="mwAlY">;</span> <span class="w" id="mwAlc"> </span><span class="k" id="mwAlg">end</span><span class="o" id="mwAlk">.</span>
Packing
Delphi does not implement the standard procedures pack and unpack. Regardless, transferring data between packed and unpacked data types is an easy feat. However, Delphi allows a class, object, or record to be declared as "packed", which minimizes the space they use.
Missing default write width
Delphi does not associate the data type Boolean with a default width if specified as write/writeLn parameters. Delphi demonstrates the behavior as usual for character-strings.
Overloading
Delphi permits overloading routines. In Standard Pascal identifiers must be unique in every block.
<span id="mwAnY"></span><span class="k" id="mwAnc">function</span><span class="w" id="mwAng"> </span><span class="nf" id="mwAnk">f</span><span class="p" id="mwAno">(</span><span class="n" id="mwAns">x</span><span class="o" id="mwAnw">:</span><span class="w" id="mwAn0"> </span><span class="kt" id="mwAn4">integer</span><span class="p" id="mwAn8">)</span><span class="o" id="mwAoA">:</span><span class="w" id="mwAoE"> </span><span class="kt" id="mwAoI">real</span><span class="o" id="mwAoM">;</span> <span class="k" id="mwAoQ">begin</span> <span class="w" id="mwAoU"> </span><span class="bp" id="mwAoY">result</span><span class="w" id="mwAoc"> </span><span class="o" id="mwAog">:=</span><span class="w" id="mwAok"> </span><span class="nb" id="mwAoo">sin</span><span class="p" id="mwAos">(</span><span class="n" id="mwAow">x</span><span class="p" id="mwAo0">)</span><span class="o" id="mwAo4">;</span> <span class="k" id="mwAo8">end</span><span class="o" id="mwApA">;</span> <span class="k" id="mwApE">function</span><span class="w" id="mwApI"> </span><span class="nf" id="mwApM">f</span><span class="p" id="mwApQ">(</span><span class="n" id="mwApU">x</span><span class="o" id="mwApY">:</span><span class="w" id="mwApc"> </span><span class="kt" id="mwApg">real</span><span class="p" id="mwApk">)</span><span class="o" id="mwApo">:</span><span class="w" id="mwAps"> </span><span class="kt" id="mwApw">real</span><span class="o" id="mwAp0">;</span> <span class="k" id="mwAp4">begin</span> <span class="w" id="mwAp8"> </span><span class="bp" id="mwAqA">result</span><span class="w" id="mwAqE"> </span><span class="o" id="mwAqI">:=</span><span class="w" id="mwAqM"> </span><span class="nb" id="mwAqQ">cos</span><span class="p" id="mwAqU">(</span><span class="n" id="mwAqY">x</span><span class="p" id="mwAqc">)</span><span class="o" id="mwAqg">;</span> <span class="k" id="mwAqk">end</span><span class="o" id="mwAqo">;</span> <span class="c1" id="mwAqs">// ─── MAIN ─────────────────────────────────────────────</span> <span class="k" id="mwAqw">begin</span> <span class="w" id="mwAq0"> </span><span class="c1" id="mwAq4">// Note the different data types.</span> <span class="w" id="mwAq8"> </span><span class="nb" id="mwArA">writeLn</span><span class="p" id="mwArE">(</span><span class="n" id="mwArI">f</span><span class="p" id="mwArM">(</span><span class="mi" id="mwArQ">3</span><span class="p" id="mwArU">))</span><span class="o" id="mwArY">;</span> <span class="w" id="mwArc"> </span><span class="nb" id="mwArg">writeLn</span><span class="p" id="mwArk">(</span><span class="n" id="mwAro">f</span><span class="p" id="mwArs">(</span><span class="mf" id="mwArw">3.0</span><span class="p" id="mwAr0">))</span><span class="o" id="mwAr4">;</span> <span class="k" id="mwAr8">end</span><span class="o" id="mwAsA">.</span>
Default parameter values
Delphi permits default parameters.
Peculiar implementation characteristics
Standard write width
In Pascal, if the destination file is a text file, the parameters to write/writeLn have an implementation-defined default total width. In Delphi, for integer values this is simply 1. That means always the least space is occupied. Other compilers have shown default widths of, for example, 20 allowing for a fine tabular look at no cost of extra code.

