(9) 好きなプログラミング言語 < Viivi Blog < Viiviの小部屋 < 入り口 / Entrance
[NOTE]
This article is written ONLY in Japanese.
I hope you can read the contents through one of the surprisingly advanced latest machine translators,
such as Google
and DeepL.
ここに記載した内容は Viivi に関する 非公式で個人的な考えを雑然と思いつくまま書いたものです. Viivi 開発の背景にある経緯や考えかたを知っていただくために設置しています.
Coplien の本 は
C++ で説明されていますが,Java で説明していたならもっとスマートに説明できたはずです.
あるいは自然過ぎて逆にネタがなくて本になるほどの分量がなかったかもしれません.
少なくともgarbage collectionの話はなかったでしょうね!
いずれにせよ,Coplienの本を読み終わった後で Java が発表されたのはちょうど良いタイミングでした.
今ならこんなまわり道を通らなくても良い教科書がたくさんありますから
手短に正しいOOP (Object-Oriented Programming) 手法を身につけられると思います.
(お勧めは
AWK本
[もちろんこれはOOP言語ではありませんが,プログラミングへの入門としてです],
Java Tutorial本,
Java言語本
というコースです.これならC/C++言語のポインタを避けて通れます.)
[2011/01/08追記: Java Tutorial本/言語本は Sun から出ているやつです.
僕は旧版しか読んでいないのですが,
言語本最新版(第4版)の和訳についての問題点を指摘する報告もあるようです.
旧版はわかりやすかったのですが,最新の情報を知らずに書いてしまいました.
いっそのこと英語版をそのまま読むのがいいかもしれません
Java Tutorial 本
(英語版でよければ
The Java Tutorials
から入手可能)
のほうは分量こそ膨れ上がっているようですが,
言語の基幹部分についての説明はわかりやすいままではないかと思います.
Tutorial 本で(そのすべてを理解しようとするのではなく)
基幹部分だけを把握すれば良いと思います.
興味のない言語の枝葉部分は必要になったときに調べれば良いわけで,
使いもしないのに読むだけ無駄ですよね.
そもそも Java 言語系のすべてを理解することなど不可能なのではないでしょうか.
Viivi で使っているのは Java 言語系で定義されているもののうち
せいぜい1割程度です.
]
OOP なら Smalltalk じゃなきゃという原理主義者の方々もいらっしゃるでしょうが,
僕にはちょうど良い OOP 言語として今や Java が
いちばんかゆいところに手が届く道具です.
C で書いても Scheme で書いてもプログラムはプログラムなんでしょうけど,
OOP 言語としての Java で書くプログラムには格別のおもしろさがあります.
最初平坦でまっ暗だったメモリ空間内に,
あるときオブジェクト(インスタンスというべきなのか)がポコっと生まれます.
それは独特の色や形をしていて,その内部には外からは見えない構造をもっています.
それとは全く違う色や形の別のオブジェクトもポコポコと生まれてきて,
それぞれがときには自分だけで,ときには他のオブジェクトと互いに情報を交換しながら
仕事をしていくわけです.
必要になったらそのための新たなオブジェクトが次々に生成され,
仕事を終えたオブジェクトは消滅してメモリ空間から消えていく.
けなげというか,いじらしいというか,
とにかく「こいつら」がかわいくてたまらなくなります.
Java でのコーディングやデバッギングは,一度味わうとやめられない楽しさです
(もちろん,うまくいっているときは,ですけど).
しかしこのOOPのおもしろさというのは飽くまでも二次的なものです.
OOPの真の意義は,従来プログラマが自分でやらなければならなかった作業を
オブジェクトに任せられるところにあると思います.
たとえばこんな小さな Viivi の場合でも
オブジェクト(インスタンス)の金型であるクラスだけで300種類を越えます.
それぞれのクラスの内部にはメンバデータやそれらを扱うメソッドがいくつかずつかは
含まれていますから,もしそれらをすべて個別に扱ったとしたら
千個以上の要素について常に把握していなければならないことになってしまいます.
このような膨大なデータ処理の管理は本来なら僕には絶対に無理なのですが,
OOPのおまじないを使えば「こいつら」に処理を任せることができるようになり,
なんとか全体を把握できるようになります.
この意味で OOP の真価は巨大で複雑なシステム構築において
(それを単純なものとして扱うために)
こそ発揮されるものであると考えています.
そういうわけで,通常巨大で複雑なシステム構築を対象とはしないスクリプト言語には,
OOP 機能を求めません.
スクリプトはだいたい AWK で書きます.
Perl など少し古い世代のスクリプト言語は使ったことはありますが,
結局 AWK だけが残りました.
Perl をやめたのは,多分他の方と同じで,自分のプログラムが保守できなくなったからです.
Python, Ruby などはもう少し早く知っていたら試していたと思います.
しかしこれらを知ったのは既に Java を使うようになってからでした.
AWK+Java (あとどうしようもないときはC.C++でなくてC) で
ほぼすべての作業をカバーできましたので必要性を感じませんでした.
AWK が作者3人の名前の頭文字をとって名づけられたというのは有名な話ですが,
その作者が書いた AWK の教科書「プログラミング言語AWK」は僕の数少ない教科書のひとつです.
日本語版の初版を買ってからずっとプログラミングの教科書として愛読しています.
これ奥が深いですよ.僕は前半しか読んでいませんが,AWK 言語を普通に使うにはそれで充分です.
後半にはなんとアセンブラを AWK で書くという荒技まで紹介されています.
日本語版は絶版と復版とを繰り返しているようですが,
なんとか定番教科書として販売を続けてほしいと思います.
AWK という名前はまあしょうがないですが,
本来なら C インタプリタ と言っても良いのではないかと思います.
よく初心者の方が「これから C 言語をやるぞ」と意気込んでいらっしゃるのを拝見しますが,
なぜ AWK をやらない,と毎回思います.
初心者の方にとって C言語独特のポインタはやはりわかりづらいと思います.
そのポインタには一切触れることなく,いろんな仕事が簡単にできるんですから,
AWK 言語から入らないのは損です.
プログラムの制御構造は C 言語と AWK とで共通するものが多く,
AWK はインタプリタで使いやすいし,
日常的な作業に手軽に使えますから C 言語的な考えかたを習得するのにとてもよい教材になります.
さらに最近流行りの他のスクリプト言語にくらべて仕様が小さく習得しやすいと思います.
bash がはやっていますが,僕は断然 ksh 派です (ただし違いはよくわからない).
ずっと主要プラットフォームだった Sun OS / Solaris が csh 推奨から ksh 推奨になったからです.
(この先 Solaris はどうなってしまうのか…心配している者のひとりです.
なお,Viivi の debug trace output は Solaris 上で見るのが
フォントの関係でトレース線がきれいにつながって表示されるのでいちばん好きです.)
とはいえ,ksh でプログラムとしてのスクリプトを書くことはほとんどありません.
決まりきった処理を続けて書いておいてそれをただ実行させるとか,
forループで対象だけを次々と変えて処理をさせるとか,その程度です.
最近になって必要に迫られて少し勉強してみましたが,深入りするつもりもありません.
なぜなら AWK があるからです!
普通のプログラマが shell script で書くようなものはたいてい AWK で書いてきました.
いくら複雑な制御構造でも AWK なら対処できます.
外部コマンドを使う必要がある場合には
system() で AWK 内部から外部コマンドを呼び出すというアホなことをずっとやってきました.
しかしその必要がある場合も非常にまれでした.
むしろここで強調しておきたいのは,ksh (bashでもできますが) の
「Unix 統合開発環境」における指揮官, interactive shell としての役割です.
$ set -o vi(普通は ~/.kshrc の中だけど) とやっておけば,コマンドラインが vi になります. これにより,Unix の世界すべてを vi の操作体系で扱えるようになって, Unixが真の統合開発環境となるのです! GUI の操作体系に慣れている人は CUI のシステムを見て使いにくそうだと思われるそうですが, 僕らからすると GUI の操作体系を見ると使いにくそうだなーと思ってしまいます. GUI の人が Unix の端末窓を見ると1行だけしか見えないそうですが, 我々にはその上下に何万行もの履歴が見えているのです!(ちょっと言いすぎ) でも感覚として,vi エディタを使っているのと同じなんですよね. 本当は全画面に履歴が出ているんだけど,その上下がマスクされていてたまたま1行だけしか 目には見えていない,ということです. ksh+vi の環境がなければ何もできません.
プリンタ制御言語としても使われているあのポストスクリプトです. 僕は言語として好きです. 気持ちの入った絵を描くときは vi で PostScript を書きます. 関係ないとは言われていますが多分元になった言語 FORTH よりも コマンド体系が整理されていてわかりやすいと思います. 他の言語にはない,stack マシンを動かしている感覚が好きです. そのかわり,必ずコードの右にはコメントとして stack の状態をメモしていきます. コードを見てすぐに頭の中にstackの状態をイメージできるような超人ではありませんから. たいていの場合,PSのコードの部分よりもこのメモの部分がずっと大きくなります.
おっといちばん大事なこれを書き忘れるところでした.
でも好きというよりはもう美しすぎてあこがれでしかない言語です.
Scheme が最も美しいプログラミング言語であるという認識は
僕の中で変わっていません.
Scheme ハッカーのみなさんのようにこれで考えていることが自由に表現できたら
すばらしいだろうなと今も思っています.
関数型プログラミングには独特の考えかたがあるようですが,まだあきらめていません.
がんばって習得します!
…
よく考えてみたら,インタプリタのテスト用のコード以外に Scheme でプログラム書いたことがなかった…
Viiviを公開できてひと息つけたら何かひとつ書いてみます.
(ひと息つけるのだろうか?)
(9) 好きなプログラミング言語 < Viivi Blog < Viiviの小部屋 < 入り口 / Entrance
2010/10/24 開設
Copyright(C) 2003-2022 ilma <ilma@viivi.io> All rights reserved.