はじめに
この記事は 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 です。
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:
実行結果
掲載コードは半角カタカナですが、実行結果画像のように MSX のひらがなも通ります。
Turbo Pascal 5.5 (IBM PC)
ソースコードはこんな感じです。
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.
コードページを切り替えないと半角カナが化けてしまいます。
コードページを切り替えると今度は IDE の罫線が化けてしまいますが、理屈上仕方ないですね。
実行結果
Turbo Pascal 5.5 (NEC PC-98)
PC-98 版の Turbo Pascal でも実行してみましょう。
実行結果
Turbo Pascal 5.5 (NEC PC-98 漢字)
PC-98 版は漢字も通ります。以下、Shift_JIS を想定したコードです。
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.
実行結果
コードと文法の解説
コードと文法の解説です。
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 文字列」です。
現在の 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 実装の記事は既に他の方も投稿されているので、比較してみると更に興味深いかと思います。
- Hello World あたたたた 標準 Pascal 編 (Qiita)
- Hello World あたたたた Pascal 編 (Qiita: @nak435)
- Hello World あたたたた Delphi 編 (Qiita: @two_pack)
- Hello World あたたたた Modern Delphi 編 (Qiita: @pik)
See also:









