培風館の Pascal 関連書籍を読んでみる

# はじめに
培風館から何冊か Pascal 関連の書籍が出ています。


## PASCAL 原書第 4 版
標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/edb459ee-39a0-6313-69b1-7ec707394b11.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| 情報処理シリーズ 2<br>PASCAL [^1]| キャスリン・イェンゼン(著)<br>ニクラウス・ヴィルト(著)<br>原田 賢一(訳) | [456300782X](https://www.amazon.co.jp/dp/456300782X)<br>[B000J7YORE](https://www.amazon.co.jp/dp/B000J7YORE/)  | 1981/5/20 |
| 情報処理シリーズ 2<br>PASCAL 原書第 3 版| キャスリン・イェンゼン(著)<br>ニクラウス・ヴィルト(著)<br>アンドリュー・Ｂ・ミケル(編)<br>ジェームス・Ｆ・マイナー(編)<br>原田 賢一(訳) | [4563014621](https://www.amazon.co.jp/dp/4563014621) | 1988/1/20 |
| 情報処理シリーズ 2<br>PASCAL 原書第 4 版| キャスリン・イェンゼン(著)<br>ニクラウス・ヴィルト(著)<br>アンドリュー・Ｂ・ミケル(編)<br>ジェームス・Ｆ・マイナー(編)<br>原田 賢一(訳) | [4563014664](https://www.amazon.co.jp/dp/4563014664) | 1993/10/30 |

### 書評

この書籍の書評は次の記事中で書いた。

 - [『Pascal』 - Wirth 先生の邦訳本を読んでみる(Qiita)](https://qiita.com/ht_deko/items/3086b7cff08928eca7a9#pascal-pascal)
 - [Pascal についてのポエム (パンセではない) (Qiita)](https://qiita.com/ht_deko/items/aba9e0b6a6e8d003d34e)

第 3 版以降は (当然ながら) **J&W スタイル**で書かれている [^2]。何故かインデント幅が 3 で、最後の **end** の後にスペースを入れて **"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 .
```

どうでもいい事だが、紙質のせいか第 4 版よりもページ数の少ない第 3 版のほうが本が厚い。

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

## PASCAL 入門 改訂版
標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/70091099-17d8-6cc2-2f72-6fa59a8107b6.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| 電子計算機のプログラミング 9<br>PASCAL 入門| 土居 範久(著) | [4563013102](https://www.amazon.co.jp/dp/4563013102)  | 1985/10/20 |
| 電子計算機のプログラミング 9<br>PASCAL 入門 改訂版 | 土居 範久(著) | [4563013765](https://www.amazon.co.jp/dp/4563013765)  | 1994/3/30 |

### 書評
版数によって内容が異なる。初版は ISO 7185:1983 に対応しており [^3]、改訂版は JIS X 3008:1990 に対応している。改訂版である本書だけあればいいかと思う。

本書のまえがきによると、用語は **『Pascal の標準化 ― ISO 規格全訳とその解説 (1984)』** に沿っているらしい。同じ培風社から出版されている『J&W』と使われている用語が異なるが、実は Pascal の JIS 規格である **JIS X 3008** も『J&W』と使われている用語が異なる。

本書が読みにくい原因の一つは恐らくこの**用語**だ。JIS X 3008:1990 (ISO 7185:1983) は 1990 年の制定 [^4] なのだけれど、『J&W』や Turbo Pascal のマニュアルがそれより前にあったにもかかわらず、JIS X 3008 は『J&W』の訳や Turbo Pascal の訳を考慮していない。

『J&W』の訳が受け入れやすいのは原文に即した訳だからで、Turbo Pascal の訳が受け入れやすいのは当時一般的だったコンピュータ用語を無理なく使っているからだ。なお、Turbo Pascal の日本語マニュアルは多少言い回しに不自然な点があるものの、とても読みやすく理解しやすいので見つけたら確保しておく事をオススメする。

正確な用語を使おうとすれば規格に頼るしかないが、

 - 元となった規格の解説書『Pascal の標準化 ― ISO 規格全訳とその解説』
 - ISO/IEC 7185 同等の日本語規格 『JIS X 3008』

このいずれかから引くと文章が固くなりがちだ。この傾向は本書に限らず、上記いずれかを参考文献に挙げた Pascal の書籍は総じて文章が硬い。

内容についてだが、第 I 部はタイトルと同じ **"Pascal 入門"** となっている。しかしながら、そもそも本書は Pascal の入門書ではない。用語が難解な上に数学の知識がそれなりに必要で、`”数学をある程度知っている人間が問題を解きながら Pascal を覚える本”`である。Pascal を学びたいのなら別の本にしたほうがいい。それこそ『J&W 第 4 版』でいい。

理解しにくい事は理解できる最小単位までバラバラにして覚えた方がいいし、本質と関係ないものは極力除外した方がいい。

第 II 部は　**"Pascal 文法"** となっており、**JIS X 3008:1990 規格票の代わりに使える**。用語はともかく、文法はコンパクトに纏まっていて要点を調べるのには重宝する。とても素晴らしい出来だと思う。出版時期から考えて改訂版の JIS X 3008:1994 (ISO/IEC 7185:1990) は考慮されておらず、水準 1 の説明も省かれている点には注意が必要。

"Pascal 入門" + "Pascal 文法" という構成は『J&W』と全く同じなのだけれど、少なくとも第 I 部の性格は全くと言っていいほど異なる。**電子計算機のプログラミングシリーズ**には他の言語もあるけれど、どうやら似たような内容のようだ。要は大学の講義用テキストだ。

ソースコードは基本的に **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.
```

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

**See also:**

 - [『Pascal の標準化 ―ISO 規格全訳とその解説―』- 標準 Pascal の規格票と解説書を読んでみる (Qiita)](https://qiita.com/ht_deko/items/091661d6fa3d72700a56#pascal-%E3%81%AE%E6%A8%99%E6%BA%96%E5%8C%96---iso-%E8%A6%8F%E6%A0%BC%E5%85%A8%E8%A8%B3%E3%81%A8%E3%81%9D%E3%81%AE%E8%A7%A3%E8%AA%AC--)
 - [JIS X 3008:1994 プログラム言語 Pascal (JSA)](https://webdesk.jsa.or.jp/books/W11M0090/index/?bunsyo_id=JIS+X+3008%3A1994)
 - [JIS X 3008:1994 プログラム言語 Pascal (kikakurui.com)](https://kikakurui.com/x3/X3008-1994-01.html)


## データ構造とアルゴリズム
標準 Pascal を対象とした書籍です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/be43ca19-3f0a-608c-98dc-7c928e08c8b2.png)

| タイトル | 著者 | ISBN-10<br>(Amazon) |出版年|
|:--|:--|:-:|:-:|
| Data Structures and Algorithms | A.V. エイホ(著)<br>J.D. ウルマン(著)<br>J.E. ホップクロフト(著) | [0201000237](https://www.amazon.co.jp/dp/0201000237/)  | 1983/1/1 |
| 情報処理シリーズ 11<br>データ構造とアルゴリズム| A.V. エイホ(著)<br>J.D. ウルマン(著)<br>J.E. ホップクロフト(著)<br>大野 義夫(訳) | [4563007919](https://www.amazon.co.jp/dp/4563007919)  | 1987/3/10 |

### 書評
Pascal の本というより、アルゴリズムを**疑似言語** で記述したという感じだ。Pascal は前提知識なので、あらかじめ覚えておく必要がある。

本書の**疑似言語**には **Super Pascal** [^5] という名前が付いており、標準 Pascal とは 3 つの点で違いがある。

 1. **ラベル**<br>goto 用のラベルには数字ではなく識別子が使われる。Delphi 等のモダンな Pascal では大抵使える。
 2. **return()** 文<br>手続きにおける return() は手続きから抜ける働きをする [^6]。関数の場合には与えられた引数を関数の結果として返す。Delphi 2009 以降には全く同じ働きをする [Exit() 関数](http://docwiki.embarcadero.com/Libraries/ja/System.Exit) がある。return() 文の主な利用先はループからの脱出だと思われるが、Delphi 等のモダンな Pascal ではその用途に  [Break() 手続き](http://docwiki.embarcadero.com/Libraries/ja/System.Break) や [Continue() 手続き](http://docwiki.embarcadero.com/Libraries/ja/System.Continue) が使える。
 3. **その場での型定義**<br>標準 Pascal では結果型には単純型またはポインタ型の識別子しか使えず、仮引数にもその場で定義した型は使えないが、Super Pascal ではその場で定義した型を結果型や仮引数に使うことができる。つまり、`構造等価`を採用している。

「大文字と小文字を区別する」とも書かれているが、該当するコードがどこに書かれているのか精査できていない。とにかく、Pascal のように見える言語は疑似言語なため、コードをそのまま実行できない可能性には注意しなくてはならない。標準 Pascal で試すよりも最新版の Delphi で試したほうがいくらか楽かもしれない。

内容に関しては数学の知識が必要なため、かなり難解な部類だが比較的読みやすい。Pascal を教える気が全くない点がヴィルト著『アルゴリズム＋データ構造＝プログラム』とは異なる。それでも Pascal 特有の言語仕様についてはちゃんと補足されているため、他言語で読み替える時も問題はないだろう。

アルゴリズムを Pascal で教える事の意味は、**"Pascal は簡単に覚えられる"** という点に尽きると思う。言語仕様がコンパクトなため、Pascal をうろ覚えであっても文法書を脇に置いておけば問題なくアルゴリズムを勉強できるだろう。なにせ日本語で書かれた JIS X 3008:1994 ですら全部で 72P しかないのだから。

本書は例題 (アルゴリズム) そのものを理解できなかったとしても、考え方 (アルゴリズムのためのアルゴリズム) がとても参考になる。これは Wirth 氏の著書に置き換えても同じ事が言えるため、2 冊で Pascal とアルゴリズムを学ぶとなると次の組み合わせが考えられる。

 - **『J&W』+『アルゴリズム＋データ構造＝プログラム (Pascal)』**<br>標準 Pascal に沿っていないのと、若干 Pascal の説明が多い。
 - **『J&W』+『アルゴリズムとデータ構造 (Modula-2 / Oberon)』**<br>英語版は[無償公開](http://www.ethoberon.ethz.ch/WirthPubl/AD.pdf)されている (Oberon 版)。Pascal よりも言語仕様がコンパクトな Modula-2 や Oberon で書かれており、疑似言語としては問題ないが、いかんせん Modula-2 や Oberon の資料が少なく実装もまた少ない。
 - **『J&W』+『データ構造とアルゴリズム (Super Pascal)』**<br>標準 Pascal とは若干の差異があるが読み替えるのは難しくない。Pascal の説明は必要最低限。

本当は『J&W』+『アルゴリズム＋データ構造＝プログラム』+『データ構造とアルゴリズム』の 3 冊で、と言いたいところだが、現在ではどれもこれも入手困難。

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

```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
[『データ構造とアルゴリズム』](https://dl.ndl.go.jp/pid/12626459)は国立国会図書館デジタルコレクションで読む事ができます。書籍の閲覧には国立国会図書館の利用者登録 ([本登録](https://www.ndl.go.jp/jp/registration/individuals_official.html)) が必要です。
:::

**See also:**

 - [『アルゴリズム + データ構造 = プログラム』 - 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)
 - [アルゴリズム＋データ構造＝プログラム (復刊ドットコム)](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)
 - [#12 コンピュータアルゴリズム事典 - 技術評論社の Software Technology シリーズから Pascal 関連の書籍を読んでみる (Qiita)](https://qiita.com/ht_deko/items/06946a72b51f577523bb#12-%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E4%BA%8B%E5%85%B8)
 - [(6.4.4) 構造等価 (Structual Equivalence) と 名前等価 (Name Equivalence) - <6> 構造化型の概要と配列型 (標準 Pascal 範囲内での Delphi 入門) (Qiita)](https://qiita.com/ht_deko/items/eedda6d38b6d0887d4ac#644-%E6%A7%8B%E9%80%A0%E7%AD%89%E4%BE%A1-structual-equivalence-%E3%81%A8-%E5%90%8D%E5%89%8D%E7%AD%89%E4%BE%A1-name-equivalence)

# おわりに
『Pascal 入門 改訂版』は酷評してしまいましたけど、タイトルが『Pascal 入門』でなければもう少し評価は高かったかもしれません。

タイトルに `Pascal` と付く`翻訳でない日本語の書籍`は、何故か『アルゴリズム＋データ構造＝プログラム』の要素を入れたがるようです。いいんですけど、それなら "入門" とかタイトルに入れないでほしいし、一冊で全部やろうとしないで『データ構造とアルゴリズム』みたいにアルゴリズム全振りしたほうがいいんじゃないかと思うのです。プログラミング言語とアルゴリズムの勉強を平行でやるのはナンセンスだと思うし、「この構文を使ったほうが簡潔に書けるけどまだ教えてない」みたいなのがなくていいんじゃないかと思うのです。

そもそも私は教科書スタイルの書籍が好きではないのですが、教科書的な書籍にするにしたって、Pascal は言語仕様がコンパクトなので、ざっくり文法や関数を教えてからでもアルゴリズムは教えられるのではないかと。別に Pascal の仕様を丸暗記する必要はなく、必要であれば言語の部分を読み返しながらアルゴリズム実装を勉強できるようにすればいいだけの話ではないでしょうか？何故混ぜたがるのでしょうか？

**Pascal 生みの親であるヴィルト先生ですら 'できていない' 事をどうしてやれると思うのでしょうか？**

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

**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/e2796788c65c2cda1de5)
 - [Pascal / Delphi 関連の書籍を読んでみる (まとめ) (Qiita)](https://qiita.com/ht_deko/items/34bbcdea27ce224079e0)
 
[^1]: 1981 年出版の『情報処理シリーズ 2 PASCAL』は原書第 2 版を翻訳したもの。
[^2]: 字下げのスタイルについては[こちらを参照](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)の事。
[^3]: 参考文献である『Pascal の標準化 －ISO 規格全訳とその解説－』が参照しているのは BS 6192:1982。
[^4]: 1990 年と言ったら Turbo Pascal 6.0 がリリースされた年である。
[^5]: [同名の実在の実装](https://qiita.com/ht_deko/items/2f8d55f69d30ba622d3b#superpascal-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)もあるが、拡張内容は全く異なる。
[^6]: 正確には手続きの最後の空文に移動する。