Pascalは、1960 年代後半から 1970 年代初頭にかけてNiklaus Wirthによって考案されたプログラミング言語です。元々はBorland Software Corporationによって開発されたDelphiは、IDE、標準ライブラリのセット、および一般的にObject Pascal、Delphi Pascal、または単に「Delphi」と呼ばれる Pascal ベースの言語で構成されています ( Embarcadero の現在のドキュメントでは「Delphi 言語 (Object Pascal)」[ 1 ]と表記されています)。リリース以来、最も人気のある商用 Pascal 実装となっています。
パスカルの開発において、ヴィルトはブートストラップ方式を採用し、パスカルコンパイラの各新バージョンは、その前バージョンを用いて記述およびコンパイルされた。つまり、「P2」コンパイラは「P1」でコンパイル可能な方言で記述され、「P3」は「P2」で記述され、以下同様に「P5」まで記述された。「P5」コンパイラは、ヴィルトが定義した最終的なパスカルを実装し、その後「ISO 7185 Pascal」として標準化された。
Borland方言は、かつて人気を博したUCSD Pascalと同様に、Wirthによる最終改訂版ではなく、「P4」バージョンをベースとしていました。Standard Pascalとは独立して多くの進化を遂げた後、Borland版はDelphiのベースとなりました。このページでは、DelphiとStandard Pascalの違いについて説明します。Delphi固有の拡張機能については触れません。拡張機能は数多く存在し、現在も増え続けています。
以下の機能は相互に排他的です。Standard Pascalの実装はDelphiでは受け入れられず、またその逆も同様で、DelphiのコードはStandard Pascalでは受け入れられません。
標準のPascalでは演算子はユークリッド幾何学に似た定義を持つmodが、Delphiでは切り詰められた定義が用いられる。
標準の Pascal では、コメント区切り文字{とバイグラム、および と は同義である必要があります。[ 2 ] ただし、Delphi では、 で開始されたブロック コメントはで閉じなければなりません。[ 3 ] バイグラム は、 で開始されたコメントのみを閉じます。[ 3 ]この方式では、ネストされたコメント が可能です。(*}*){}*)(*
手続きや関数をパラメータとして渡す方法は異なります。Delphiでは明示的な手続き型を宣言する必要がありますが、Standard Pascalでは必要ありません。[ 4 ]
さまざまなコンピュータシステムでは、改行を示す方法が大きく異なります。これはtext、一連の「行」で構成されるファイルの内部表現に影響を与えます。プログラマが関連する問題を回避できるように、Standard Pascalでは、「行末文字」を読み取ると単一のスペース文字が返されるように規定されています。このような「行末」のスペース文字を、実際に行のペイロードであるスペース文字と区別するために、EOLnとなりますtrue。
Delphi ではこのような動作は見られません。改行を読み取ると、現在のホスト システムで改行を表す文字シーケンスが返されます。たとえば、2 つのchar値(キャリッジ リターン) と(ライン フィード) です。[ 3 ]chr(13)chr(10)
以下の機能は、どちらの言語にも存在するか、あるいは存在しないかを示しています。
goto標準の Pascalでは、スコープ内で定義された任意gotoの関数にアクセスできますlabel。Delphi では、関数はgoto現在のルーチン内に存在しなければならず、つまり、フレームから出ることはできません。[ 3 ]begin … end
program jumpAround ; label 999 ; procedure foo ; begin { これは Delphi では許可されていません: } goto 999 ; end ; begin foo ; 999 : ; end .Delphi はバッファ変数と関連する標準ルーチンをサポートしていませんget。[ 3 ]put
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 .Standard Pascal では、バリアントのメモリ割り当ては特定のバリアントを示す場合があります。これにより、実装は実際にrecord必要な最小限のメモリを割り当てることができます。Delphi はこれをサポートしていません。[ 3 ]
program variantRecord ; type sex = ( female , male ) ; clothingMeasures = record girth : real ; case gender : sex of female : ( underbust : real ) ; male : ( ) ; end ; var size : clothingMeasures ; begin { NB: `underbust` にはスペースが割り当てられていません。 } new ( size , male ) ; end .Delphiでは、どのファイルもファイルシステム内のファイルと関連付けられている必要があります。つまり、fileDelphiのassignプロシージャでは、どのファイルもファイル名と関連付けられている必要があります。一方、Standard Pascalはファイル名なしで使用できます。以下のコードはDelphiで実行時エラーになります。[ 3 ]
program temporaryFile ( output ) ; var FD : text ; begin rewrite ( FD ) ; writeLn ( FD , 'Hello world!' ) ; end .Delphi は標準の手順を実装していません。pack[ 3 ]と はいえ、パックされたデータ型とパックされていないデータ型の間でデータを転送するのは簡単なことです。ただし、Delphi ではクラス、オブジェクト、またはレコードを「パック済み」として宣言することができ、それによって使用するスペースが最小限に抑えられます。unpack
write幅がありませんDelphi は/パラメータとして指定されている場合、データ型をBooleanデフォルトの幅に関連付けません。[ 3 ] Delphi は、文字文字列の場合と同様に動作を示します。writewriteLn
Delphiではルーチンのオーバーロードが可能です。Standard Pascalでは、識別子は各ブロック内で一意でなければなりません。
function f ( x : integer ) : real ; begin result := sin ( x ) ; end ;function f ( x : real ) : real ; begin result := cos ( x ) ; end ; // ─── MAIN ───────────────────────────────────────────── begin // 異なるデータ型に注意してください。writeLn ( f ( 3 )) ; writeLn ( f ( 3.0 )) ; end .Delphi ではデフォルト パラメータが使用可能です。
write幅Pascal では、出力ファイルがファイルの場合、 / のtextパラメータには実装定義のデフォルトの合計幅があります。Delphi では、値の場合、これは単に です。つまり、常に最小限のスペースが占有されます。[ 3 ] 他のコンパイラでは、たとえば、デフォルトの幅が示されており、余分なコードなしで細かい表形式の表示が可能になります。writewriteLninteger120