サイエンス社の Information & Computing シリーズから Pascal 関連の書籍を読んでみる

# はじめに
サイエンス社から Information & Computing というシリーズで Pascal 関連の書籍が出ています。

# Information & Computing シリーズ
2019/10 時点で Information & Computing シリーズは 119 までナンバリングされており、別巻も 47 までナンバリングされています。

 - [Information & Computing シリーズ (サイエンス社)](https://www.saiensu.co.jp/search/?book_class_id=2&library_id=3)

このうちの Pascal 関連の書籍を読んでみようという趣旨です (別巻は除く)。書籍は時系列になるよう、ナンバー順に読む事にしました。

## #16 TURBO Pascal プログラミング

Turbo Pascal 3.0 を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/763623f2-07f1-fe7d-c132-3b9579984879.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| 16 | [TURBO Pascal プログラミング](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0480-1&y=1987) | 玉井 浩 | [4781904807](https://www.amazon.co.jp/dp/4781904807)  | 1987/8/25 |

### 書評 
第 1 部が基礎編、第 2 部が応用編となっており、Turbo Pascal について学ぶだけなら第 1 部だけ読めばいいかもしれない。第 2 部はアルゴリズムの説明がメインとなる。

Turbo Pascal を前提とした書籍だが、拡張子を *dpr にしたソースファイルを作れば、殆どのコードが Delphi のコンソールアプリケーションでも試せると思う。

```pascal:test.dpr
program Test(Input, Output);
{$APPTYPE CONSOLE}
begin
  // ここにコード記述
end.
```

グラフィック機能については無理だが (本書は NEC PC-9801 版の Turbo Pascal が前提となっている)、**ディスプレイ画面制御手続き**である clrscr() / clreol() / gotoxy() 等については以下の記事にある Crt32 ユニットを **uses** する事で使えるようになる。

```pascal:test.dpr
program Test(Input, Output);
{$APPTYPE CONSOLE}
uses
  Crt32; // <- 追加
begin
  // ここにコード記述
end.
```

 - [Delphi のコンソールアプリケーションで文字色変更と座標指定をしたい！ (Qiita)](https://qiita.com/ht_deko/items/e0a12036de0596c9cbae)

本書中で説明されている `スカラ型` は、**『J&W』** 第 3 版以降または Turbo Pascal 4.0 以降のマニュアルでは **順序型** となっている。ISO や JIS の Pascal 規格にも `スカラ型` という語句は使われていない。本書の参考文献に『J&W (第 3 版)』が挙げられているが、用語は Turbo Pascal のものが優先されているようだ。 

| 概念 | 本書での言い回し | 現在の Pascal |
|:--|:--|:--|
| スカラ型という分類 | スカラ型 | 順序型 |
| スカラ型という型| 列挙型 | 列挙型 |

また、Turbo Pascal と 標準 Pascal の差異について多少説明不足な所があるが、第 2 部のアルゴリズムの実装をこなすには全く必要のない情報なのでこれはこれでいいのかもしれない。逆に言えば標準 Pascal への補足もそれなりにある。

**∽∽∽ 可否無礼句 ∽∽∽**とは何の事だろうと思ったらコーヒーブレイクと読ませるらしい。余談なので堅苦しくない口調で語れている。

ソースコードは **J&W スタイル** で書かれている [^3]。

```pascal
program Test(Output);
var
  i: Integer;
  function sub: Boolean;
  begin
    sub := (i = 0);
  end;
begin
  i := 0;
  if sub then
    begin
      writeln('True!');
    end;
end.
```

個人的な評価: ★★★★☆

:::note
[『TURBO Pascal プログラミング』](https://dl.ndl.go.jp/pid/12630548)は国立国会図書館デジタルコレクションで読む事ができます。書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::

**See also:**

 - [J&W - Pascal についてのポエム (パンセではない) (Qiita)](https://qiita.com/ht_deko/items/aba9e0b6a6e8d003d34e)
 - [Delphi のご先祖を辿る (Qiita)](https://qiita.com/ht_deko/items/b41b0cd45181aec522d4)

## #21 明解 PASCAL

標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/fc72cfa7-46e0-ef38-e28f-fe04862dbef9.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| 21 | [明解 PASCAL<br>国際規格(ISO)準拠](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0510-5&y=1988) | 伊東 正安<br>金谷 範一 | [4781905102](https://www.amazon.co.jp/dp/4781905102)  | 1988/5/10 |

### 書評 
サブタイトル (?) の `国際規格(ISO)準拠` が書いてあるか否かで手に取ってもらえるかどうかが変わってくると思うので、オンライン書店・古書店の方は注意したほうがいいように思う。

(日本語で読める) 標準 Pascal 解説書として重宝すると思う。つまり『J&W (第 3 版)』の代替として使えるのだが、出版された年度からして ISO 7185:1983 対応であり、1990 年の改訂版には対応していない事には注意する必要がある。また、この内容なら演習問題は省いてよかったように思う。

まえがきにある `PC-9801 用 PRO-PASCAL (MS-DOS)` というのは、これが標準 Pascal (水準 0) であるという記述からして Prospero Software 社の MS-DOS 版 **Prospero Pascal** の事だと思う。

当時だと大型計算機を除けば、標準 Pascal を (パソコンで) 動作させるための選択肢は限られていたように思う。MS-DOS 向けの標準 Pascal 実装は世界中に存在するらしいが、今では Windows も 64bit が標準なので、また選択肢が狭まってきている。


ソースコードは基本的に **J&W スタイル** で書かれている。**var** 等の宣言部が字下げされている。

```pascal
program Test(Output);
  var
    i: Integer;
  function sub: Boolean;
  begin
    sub := (i = 0);
  end;
begin
  i := 0;
  if sub then
    begin
      writeln('True!');
    end;
end.
```

個人的な評価: ★★★★☆

**See also:**

 - [Prospero Pascal (Prospero Software) (Internet archive)](https://web.archive.org/web/20050207045305/http://www.prosperosoftware.com/p5iix.html)
 - [割と簡単に ’標準 Pascal' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/41e95154e8da2f901698)

## #34 Pascal 入門
標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f0f00a85-1043-fe42-374b-3ce331462b96.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| 34 | [Pascal 入門](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0552-5&y=1989) | 古郡 廷治 | [4781905528](https://www.amazon.co.jp/dp/4781905528)  | 1989/7/10 |

### 書評 
各出版社から同名タイトルの書籍が出版されているためにググラビリティが低い。また、この書籍は教科書ライクで、例題や練習問題の意味を理解するにはまた別の知識が必要となるものも多い。

本書は `ですます調` で書かれていることもあり、文章的には Information & Computing の中では読みやすい方だと思う。ただ、例題と練習問題とノートとレベルの高い話が入り混じっているため "構成的に" 読みにくい。ペラペラとめくっていると本文なのかノートなのかわからなくなる。

- 例題: --- 例題 ------ (枠で囲まれている)
- 練習問題: ==== 練習問題 =======
- ノート: \--- ノート \------
- レベルの高い話: ∽∽∽ レベルの高い話 ∽∽∽∽∽∽

練習問題は節の最後にあるのだけれど、改ページされていないために、例題と誤認する。

 - ノートと練習問題は節の最後に**改ページして**記述してある。
 - 練習問題は**章末に** (改ページして) まとめて記述してある。

せめてこのいずれかでさえあったならば評価はまた違っていたかもしれない。本書は空行のない Pascal ソースを読んでる気分になるのだ。例えるならこうだ。

```
function Test1_1(Output);
begin
end;
{
function Sample1_1(Output);
begin
end;
}
function Test2_1(Output);
begin
end;
function Test2_2(Output);
begin
end;
{
function Sample2_1(Output);
begin
end;
}
function Test3_1(Output);
begin
end;
...
```

**「解るけど判りづらい」**という表現がしっくりくるかもしれない。実は『#16 TURBO Pascal プログラミング』も同じ体裁なのだけれど、あちらはノートに相当するものがないためそれなりに読みやすい。

若干ではあるが Turbo Pascal について補足があるため、Delphi のコンソールアプリケーションでも練習問題をこなせると思う。

ソースコードは基本的に **J&W スタイル** で書かれている。**program / function / procedure** ヘッダの下で字下げされている (ブロックはすべてインデント)。

```pascal
program Test(Output);
  var
    i: Integer;
    function sub: Boolean;
      begin
        sub := (i = 0);
      end;
  begin
    i := 0;
    if sub then
      begin
        writeln('True!');
      end;
  end.
```

個人的な評価: ★★★☆☆

## #47 Pascal プログラミング 増訂版
標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/61a8b88d-cad6-0f1e-4ab4-79e1d311fc11.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| 47| [Pascal プログラミング 増訂版](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0589-1&y=1990) | 米田 信夫<br>疋田輝雄<br>桜井貴文 | [4781905528](https://www.amazon.co.jp/dp/4781905897)  | 1990/8/25 |

### 書評 
本書の初版は 1979/6/30 に出版されているが Information & Computing シリーズではない。元々は**サイエンスライブラリ 情報電算機シリーズ**の No.38 だったようだ。初版は **Pascal 8000** をベースに書かれており [^1]、コンパイラ指令やコマンドの使い方も載っている。古いには古いが、個人的には初版の方が好みだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2fab47c9-e300-7afc-cad2-d297ac2ba9f4.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| | Pascal プログラミング | 米田 信夫<br>疋田輝雄 | [4781902820](https://www.amazon.co.jp/dp/4781902820)<br>[B000J8G476](https://www.amazon.co.jp/dp/B000J8G476/)  | 1979/6/30 |

さて、本書は ISO 標準 Pascal (1983) に合わせて上記書籍を改訂したものだが、内容については評価が分かれるように思う。

個人的には教科書スタイルの書籍は好きでなく、残念ながら本書もそれである。ただ、演習問題が章末にまとめられているため、読み飛ばすのは難しくない。

例題と演習問題は Pascal に慣れていてもいなくても初見では解けないものも多いように思う。しかしながら実はこの**例題はアルゴリズム集**であり、一度読んだらなかなか二度は読まないであろう教科書スタイルの書籍において、読み返す価値のある不思議な本になっている。巻末の `プログラム索引` からアルゴリズムを探せるのだ (普通の索引は別にある)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b02b9067-0838-8583-b0a5-45b2224ba870.png)

なお、初版はアルゴリズムが半分くらいなので `増訂版` というのは伊達ではない...が、ちょっと詰め込みすぎ。

若干ではあるが、**Berkrey Pascal** や Turbo Pascal についての補足がある。また、巻末の付録には Berkrey Pascal のコマンドが載っている。

余談だが、カリフォルニア大学バークレー校がこの Pascal やエディタ ex (後の vi) 等のソフトウェアを配布するためにまとめたものが後の **BSD (Berkeley Software Distribution)** となった。

ソースコードは基本的に **J&W スタイル** で書かれているが、著者が複数いるためか字下げスタイルにゆらぎがある。

```pascal
program Test(Output);
  var
    i: Integer;
function sub: Boolean;
  begin
    sub := (i = 0);
  end;
begin
  i := 0;
  if sub then
    begin
      writeln('True!');
    end;
end.
```

個人的な評価: ★★★☆☆

:::note
[『Pascal プログラミング (サイエンスライブラリの方)』](https://dl.ndl.go.jp/pid/12631531)は国立国会図書館デジタルコレクションで読む事ができます。書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::

**See also:**

 - [PASCAL入門 : PASCAL8000に沿って (九州大学学術情報リポジトリ)](http://hdl.handle.net/2324/1472538)
 - [バークレー版UNIXの20年 - UNIXが、AT&Tの所有物からオープンソースソフトウェアになるまで - (oreilly.co.jp)](https://www.oreilly.co.jp/BOOK/osp/OpenSource_Web_Version/chapter03/chapter03.html)
 
[^1]: ほぼ標準 Pascal だが、**for in do** に似た **forall in do** や、無限ループ構文 **loop～end** とそれから脱出するための **exit** を備えている。

## #84 Pascalプログラミングの基礎

標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/ba1d156b-75ac-b1a8-e74a-22d008b229ed.png)

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| 84| [Pascalプログラミングの基礎](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0757-4&y=1994) | 真野 芳久 | [4781907571](https://www.amazon.co.jp/dp/4781907571)  | 1994/1/21 |

### 書評 

JIS X 3008:1990 をベースに書かれた教科書スタイルの書籍で、前書きには **「著者が受け持つ情報処理科目の講義資料 (大学 1, 2 年次) を再構成したもの」** とある。

本書には次のような特徴がある。

 - 目次 / コラム目次 / プログラム目次 の 3 つの目次がある。
 - 注釈は脚注。
 - コラムは章末にある。
 - 練習問題は章末にある。
 - 練習問題の解答はない。
 - 21P の "Pascal 言語の概要" が付録 A として付いている。

筆者が多くの Pascal 本を読んで、僕と同じような感想を持ったかのような構成になっている。

前半は特に難しい数学の知識は要らないし、例題には `プログラムの考え方` という解説も付いている。後半にはアルゴリズムもあるが、そこに辿り着くまでに Pascal の文法の説明は一通り終わっている。一冊で Pascal とアルゴリズムを覚えさせるのであれば、この構成とこのボリュームが妥当なんじゃないかと思う。

用語がちょっと堅い (文章自体は読みやすい) のとコードのフォントがプロポーショナルで若干読みにくいのを除けば、とてもいい内容に仕上がっていると思う...それでも僕は教科書スタイルの書籍がキライだけれど。

ソースコードは基本的に **J&W スタイル** で書かれている。**function / procedure** ヘッダの下で字下げされている。


```pascal
program Test(Output);
var
  i: Integer;
function sub: Boolean;
  begin
    sub := (i = 0);
  end;
begin
  i := 0;
  if sub then
    begin
      writeln('True!');
    end;
end.
```

個人的な評価: ★★★★☆


# おわりに
Information & Computing シリーズは全体的に堅い印象がありますね。

大学の教科書 (あるいは参考書) として読まれることを想定されているのか、演習問題があるものが多く、割とげんなりします。読んでる途中で演習問題に遭遇すると **「解らないからこの本を読んでいるのでしょう？」** と言いたくなります。教科書スタイルの本は個人的には評価が低いです。

標準 Pascal なら基本的には **『J&W』** で勉強した方がいいです。独自性を出そうと思って **『アルゴリズム + データ構造 = プログラム』** (以下『A+D=P』)と混ぜたような本は前提となる知識をより多く要求されるので『J&W』よりもかえって難しいです。アルゴリズムはアルゴリズムで別に『A+D=P』で勉強した方がいいように思います。

## 『アルゴリズム + データ構造 = プログラム』について
Pascal 関連書籍を読み漁っていると、例題や演習問題は **『A+D=P』** から引かれたようなのが多く「またコレかい！」とげんなりする事もあるのですが、今となってはコードが Pascal で書かれた『A+D=P』の入手性が良くないんですよねぇ...。

 - [『アルゴリズム + データ構造 = プログラム』 - Wirth 先生の邦訳本を読んでみる (Qiita)](https://qiita.com/ht_deko/items/3086b7cff08928eca7a9#%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0--%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0--%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0-pascal)

ちなみに、『アルゴリズム + データ構造 = プログラム』のソースコードはほぼ **Borland スタイル**で書かれています。**var** などの宣言部が字下げされたりされなかったりします。これはヴィルト先生の初期の本共通で見られ、『J&W』の古い版も結構ゆらぎます。あと何故かインデント幅が 3 で、**end** の後にスペースを入れがちです。

```pascal
program Test(Output);
var
   i: Integer;
function sub: Boolean;
begin
   sub := (i = 0);
end ;
begin
   i := 0;
   if sub then
   begin
      writeln('True!');
   end ;
end .
```

**See also:**

 - [アルゴリズム＋データ構造＝プログラム (復刊ドットコム)](https://www.fukkan.com/fk/VoteDetail?no=8797)
 - [Algorithms + Data Structures = Programs (Wikipedia: En)](https://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures_%3D_Programs)
 - [割と簡単に ’標準 Modula-2 / Oberon-2' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/8e8be01f749915167a91)


[^2]: 第 3 版しか所持していないので、この問題が後の版で修正されているかどうかは知らない。[Pascal for small machines](http://pascal.hansotten.com/niklaus-wirth/pl0/) にある PL/0 は `≠` を `#`、`≤` を `[`、`≥` を `]` でそれぞれ置き換えている。 

## Pascal に関連するその他の Information & Computing シリーズ
タイトルに `Pascal` が含まれないものの、Pascal を扱った書籍は他にもあるようです。

| No | タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:-:|:--|:--|:-:|:-:|
| 1| [計算機科学入門](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0375-0&y=1984) | M.A.アービブ, A.J.クフォーリ, R.N.モル (共著)<br>甘利 俊一, 金谷 健一, 嶋田 晋 (共訳)| [4781903754](https://www.amazon.co.jp/dp/4781903754/)  | 1984/11/1 |
| 18| [プログラミングによる計算可能性理論](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0497-9&y=1987) | A.J.クフォーリ, R.N.モル, M.A.アービブ (共著)<br>甘利 俊一, 金谷 健一, 川端 勉 (共訳)| [4781904971](https://www.amazon.co.jp/dp/4781904971)  | 1987/12/1 |
| 35| [組合せアルゴリズム](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0548-8&y=1989) | 仙波 一郎(著) | [478190548X](https://www.amazon.co.jp/dp/478190548X)  | 1989/6/1 |
| 73| [抽象データ型とアルゴリズム](https://www.saiensu.co.jp/search/?isbn=978-4-7819-0712-3&y=1993) | M.アズムーデ(著)<br>野崎 昭弘(監)<br>仙波 一郎(訳) | [4781907121](https://www.amazon.co.jp/dp/4781907121)  | 1993/10/1 |

### #1 計算機科学入門
Information & Computing シリーズの最初の本。[『A Basis for Theoretical Computer Science』](https://link.springer.com/book/10.1007/978-1-4613-9455-6)の邦訳本。

Pascal 風の疑似言語が所々に出てくる程度なので、Pascal の本として読むと肩透かしを食らう。基本的にはコンピュータ数学の本。

個人的な評価: ★★★☆☆

### #18 プログラミングによる計算可能性理論
[『A Programming Approach to Computability』](https://link.springer.com/book/10.1007/978-1-4612-5749-3)の邦訳本。

恐らく『計算機科学入門』の続刊にあたる書籍。こちらにも Pascal 風の疑似言語が出てくるらしい。

本書を入手していないので、書評は控える。

個人的な評価: ☆☆☆☆☆


### #35 組合せアルゴリズム
部分集合生成、順列生成、組合せ生成、自然数分割、応用からなるアルゴリズム集。それぞれのアルゴリズムを、アルゴリズム解説・フローチャート・プログラム (Pascal) の組として収録してある。

ざっくり言うと **数学の問題を Pascal に落とし込むための本**。Pascal を知っている事が前提となっており、0 章が「基礎」となってはいるけれど、そこに書かれた "基礎" だけで本書のすべてを理解するのは無理だと思う。やはりある程度の数学の知識が必要。

ソースコードは C のような記述になっている。

```pascal
program Test(Output);
var i: Integer;
function sub: Boolean;
begin
  sub := (i = 0);
end;
begin
  i := 0;
  if sub then begin
    writeln('True!');
  end;
end.
```

個人的な評価: ★★★☆☆

### #73 抽象データ型とアルゴリズム

[『Abstract Data Types and Algorithms』](https://link.springer.com/book/10.1007/978-1-349-21151-7) の邦訳本。Splinger Link で原書をチラ見したけれど、『アルゴリズム + データ構造 = プログラム』とか『アルゴリズムとデータ構造』とか『データ構造とアルゴリズム』を持っているのであれば必要性は...といった感想。また、それなりの数学の知識を要求される模様。

本書を入手していないので、書評は控える。

ソースコードは基本的に **J&W スタイル** で書かれている。**function / procedure** ヘッダの下で字下げされている。

```pascal
program Test(Output);
var i: Integer;
function sub: Boolean;
  begin
    sub := (i = 0);
  end;
begin
  i := 0;
  if sub then 
    begin
      writeln('True!');
    end;
end.
```

個人的な評価: ☆☆☆☆☆


## 書評について
書評は **現在での評価** となっています。書籍が出版された時点での評価ではない事にご注意ください。

**See also:**

 - [Pascal の勉強に使えそうな Pascal 処理系 (Qiita)](https://qiita.com/ht_deko/items/6376997a6d74e77c89e3)
 - [割と簡単に ’標準 Pascal' を試してみたい (Qiita)](https://qiita.com/ht_deko/items/41e95154e8da2f901698)
 - [Pascal / Delphi 関連の書籍を読んでみる (まとめ) (Qiita)](https://qiita.com/ht_deko/items/34bbcdea27ce224079e0) 
[^3]: 字下げのスタイルについては[こちらを参照](https://qiita.com/ht_deko/items/50bac0de384d66208944#832--pascal-%E3%81%AE%E5%AD%97%E4%B8%8B%E3%81%92-%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88-%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB)の事。