3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hello World あたたたた Turbo Pascal 編

Last updated at Posted at 2025-12-25

はじめに

この記事は Hello World あたたたた Advent Calendar 2025 の記事です。

この記事では Turbo Pascal でHellow World あたたたた を実装します。

そもそも「Hello World あたたたた」が何かは 1日目の記事 をご覧ください。

実装例

Turbo Pascal 3.0 (機種問わず)

Turbo Pascal 3.0 は対応を謳ってない限り、7bit 文字が想定されています。CP/M-80 版 Turbo Pascal はちょっといじると 8bit 文字が扱えます。以下の画像は MSX-DOS 上の Turbo Pascal です。

image.png

Atatata.pas
program Atatata;
const
  BC: array [0..1] of Char = ('ア', 'タ');
var
  hako: String[255];
  running: Boolean;
  ch: Char;
  i: Integer;
begin
  Randomize;
  hako := '';
  running := True;
  while running do
  begin
    ch := BC[Random(2)];
    Write(ch);
    hako := hako + ch;
    if Length(hako) > 254 then
      hako := Copy(hako, 2, 254);
    if Pos('アタタタタ', hako) > 0 then
    begin
      Writeln;
      Writeln('オマエハモウシンデイル');
      running := False;
    end;
  end;
end.

See also:

実行結果

image.png

掲載コードは半角カタカナですが、実行結果画像のように MSX のひらがなも通ります。

Turbo Pascal 5.5 (IBM PC)

ソースコードはこんな感じです。

Atatata.pas
program Atatata;
const
  BC: array [0..1] of Char = ('ア', 'タ');
var
  hako: String;
  running: Boolean;
  Ch: Char;
  i: Integer;
begin
  Randomize;
  hako := '';
  running := True;
  while running do
  begin
    ch := BC[Random(2)];
    Write(ch);
    hako := hako + ch;
    if Length(hako) > 254 then
      hako := Copy(hako, 2, 254);
    if Pos('アタタタタ', hako) > 0 then
    begin
      Writeln;
      Writeln('オマエハモウシンデイル');
      running := False;
    end;
  end;
end.

コードページを切り替えないと半角カナが化けてしまいます。

image.png

コードページを切り替えると今度は IDE の罫線が化けてしまいますが、理屈上仕方ないですね。

image.png

実行結果

image.png

Turbo Pascal 5.5 (NEC PC-98)

PC-98 版の Turbo Pascal でも実行してみましょう。

image.png

実行結果

image.png

Turbo Pascal 5.5 (NEC PC-98 漢字)

PC-98 版は漢字も通ります。以下、Shift_JIS を想定したコードです。

image.png

Atatata.pas
program Atatata;
const
  BC: array [0..1] of String = ('あ', 'た');
var
  hako, char: String;
  running: Boolean;
  i: Integer;
begin
  Randomize;
  hako := '';
  running := True;
  while running do
  begin
    char := BC[Random(2)];
    Write(char);
    hako := hako + char;
    if Length(hako) > 252 then
      hako := Copy(hako, 3, 252);
    if Pos('あたたたた', hako) > 0 then
    begin
      Writeln;
      Writeln('お前はもう死んでいる');
      running := False;
    end;
  end;
end.

実行結果

image.png

コードと文法の解説

コードと文法の解説です。

program ヘッダ

Turbo Pascal はプログラムヘッダを無視します。Write() / WriteLn() を使うために Output をパラメータとして指定する必要はありません (指定してもエラーにはならない)。

See also:

配列定数と初期化

Turbo Pascal では配列の定数を定義する事が可能です。

const
  BC: array [0..1] of Char = ('ア', 'タ');

Pascal では配列の添字型に任意の順序型が使えるため、今回は 0 と 1 のみを表す部分範囲型 (0..1) を指定しています。

See also:

変数名 char

レギュレーションに

変数 char に...

とありましたが、Turbo Pascal では Char は型名 (定義済みの型識別子) なので、Char 型の変数名 (識別子) として char を使う事はできません。再帰的な型定義は許されていないからです。

var
  char: Char; (* NG *)

ですが、PC-98 版 (漢字) のコードにあるように、String 型の変数に char という名前を付ける事は可能です。

var
  char: String; (* OK *)

乱数生成

Turbo Pascal には Randomize() 手続きと Random() 関数があります。

文字列

Turbo Pascal 3.0 以前の String 型は長さを定義してから使う必要がありますが、Turbo Pascal 4.0 以降の String 型は長さの指定は不要です (最大長 255)。

これらは文字配列の要素 0 に文字列の動的な長さが格納され、要素 1 以降に文字が格納されている、いわゆる「Pascal 文字列」です。

image.png

現在の Delphi では次のように呼ばれています。

記述 呼び
s: string[10]; 短い文字列型 (Short-string types)
s: String; // Turbo Pascal
s: ShortString; // Delphi
ShortString 型 (ShortString types)

短い文字列型は ShortString 型のサブタイプのようなものなので、区別せずにショートストリングと呼ばれる事があります。

Pascal 文字列は文字列長を保持しているため、長さ 0 の文字列があり、空文字列の代入も可能となっています。

  hako := '';

See also:

・Pos()

末尾 5 文字の判定には Pos() 関数を使っています。部分文字列が文字列に含まれる場合、その位置を 1 ベースで返します。含まれない場合には 0 を返します。

See also:

・バッファオーバーフロー

Pascal 文字列の最大長は 255 文字なので、引きが悪いと 255 文字を超えてしまいます。漢字を使うと 127 文字相当になるので、割と簡単に超えそうです。

これを回避するには標準 Pascal 版同様、バッファを超えないように都度トリミングするしかありません。今回は「運悪く 255 文字を超えそうだったらトリミングする」というアルゴリズムになっています。

ちなみに、Delphi 2 以降の String 型は長い文字列型と呼ばれ、最大長は 2^30 (または 2^31) もあるので、確率的に最大長を超える事はないと思われます。

Turbo Pascal ではその最大長を超えて文字列を連結する事はできず、超えた分は単純に無視されてしまいます。エラーにはならないため、トリミングしないと無限ループに陥ります。

Hello World あたたたた Advent Calendar 2025 の記事の中には (理論上) バッファオーバーフローを起こしそうなコードがちらほら見受けられますね。

See also:

Turbo Pascal の概要と歴史

Turbo Pascal は Borland が開発/販売していた爆速 Pascal コンパイラです。

Turbo Pascal の特徴

  • 商用 Pascal のデファクトスタンダード
  • ver 5.5 からオブジェクト指向拡張が導入された
  • 開発者は Anders Hejlsberg。Delphi とか C# とかも。

Turbo Pascal の歴史

ざっくりと。

バージョン
1983 Turbo Pascal 1.0
1984 Turbo Pascal 2.0
1985 Turbo Pascal 3.0
1986 Turbo Pascal for the Mac 1.0
1987 Turbo Pascal for the Mac 1.1
1987 Turbo Pascal 4.0
1988 Turbo Pascal 5.0
1989 Turbo Pascal 5.5
1990 Turbo Pascal 6.0
1991 Turbo Pascal for Windows 1.0
1992 Turbo Pascal for Windows 1.5
1992 Borland Pascal with Object 7.0 /
Turbo Pascal 7.0 for DOS

詳しくは以下の記事を参照してください。

Delphi のコンパイラバージョンは Turbo Pascal 1.0 からの通し番号です。

See also:

おわりに

Pascal / Delphi 実装の記事は既に他の方も投稿されているので、比較してみると更に興味深いかと思います。

See also:

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?