Theoretical Science Group

Theoretical Science Group
理論科学グループ
部報 198 号
— 新入生歓迎号 —
目
次
新入生自己紹介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
C++ 言語入門 第 1 回 . . . . . . . . . . . . . . . . . . . . . . . . . . . .〔わたる〕 14
初心者のための 8086 講座 . . . . . . . . . . . . . . . . . . . . . . . . . . . 〔高野〕 34
文字コードの話 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 〔早坂くりす〕 43
TSG 用語の基礎知識 Ver. 1.0 . . . . . . . . . . . . . . . . . . . . . . . . 〔ZERO〕 55
新入生自己紹介
新入生自己紹介
坂本 崇裕
坂東大五郎
丹下 吉雄
西元
宮崎 大輔
菅原 豊
丸山 勲
時田 忠昭
鶴見 雅弘
馬本 英樹
小林 徹也
保原 麗
黒川 秀樹
長野 誠
岡崎哲也
内仲 俊輔
寺園 泰
TSG 部報 No. 199
1
新入生自己紹介
¶
³
坂本 崇裕
µ
・名前
坂本 崇裕
・ハンドルネーム
すーゆー 日本語が使えるとき
´
TYM 日本語が使えないとき
・保有機種
PC-9821Xa13/K12
MT-8617ES
BJC-400J
MC288XL II
PC-9801-118/PC-9821C3-B02
■ 自己紹介など
パソコンは中学 2 年から友人に勧められて使い始めました。その時のマシンは PC–
9801DA21) でした。そして、友人達 10 人ほどの間で「My くろフロッP」なるパソコン
サークルを結成し、初心者から上級者までが集まり、自主的に開発したプログラムの公
開や意見交換が行われていました。現在、受験期間ということで休止していたこのサー
クルを「My くろフロッP・R」としてその活動を再開しようかどうか検討中です。
それとは別に学校のパソコン同好会 (NPCA)(現「電腦科學研究部」) に高校 1 年から
入部し、その活動を見てるだけ∼(副会長だろが) でした。また、去年から、
「INFINITY-
SERVE」(078-435-2263) なる BBS をこのクラブで開局&運営しています。現在では神
戸では有数のあやしげな CG のたまり場となってしまいました。いつまで続くか分から
ない BBS ですが、興味のある方はアクセスしてみてください。
そ∼ゆ∼わけで、どんなわけで∼ (^_^;)
現在の私は、あまりパソコンそのものに関する活動はあまりしておらず、パソコンを
使って何かをする (LaTEX でレポートを書く 等など) 程度です。つまり、「作る」立場か
ら「使う」立場に変わってしまったわけです。昔は、C/C++, 86ASM, QuickBASIC な
んかを使えていたような気がしますが、今はどこまでできるやら>謎<です。
あっ、そうそう。通信に関しては始めてまだ 1ヶ月も経っていない筋金入りの初心者
です。また、今まで MS 系の OS に毒されてきたので、ECC の UNIX では戸惑うこと
ばかりです。そこいらあたりのどこぞのところを教えてくださるとうれしいです。理科
1 類 19 組 (ドイツ語) にいますので、声をかけてください。
ZOB Station BBS
zob19155
すーゆー
いぬ。BBS
INU00090
すーゆー
INFINITY-SERVE
INF00028
すーゆー
ECC
g640770
Takahiro SAKAMOTO
1) 改造するにはもってこいのマシンです
2
TSG 部報 No. 199
新入生自己紹介
¶
³
坂東大五郎
µ
クラス:
´
1 年 SI-20
名前:
坂東大五郎
ハンドル:
別にないですけど…まあ、[b] や [ばんだい] という
ところでしょうか?
ホームページ:
http://www.komaba.ecc.u-tokyo.ac.jp/~g640834
パソコン:
COMPAQ PRESARIO CDTV と
TOSHIBA DynaBook V386
(いまだに 486DX2 66MHz です。しかも最近買ったばかり)
どうも、坂東といいます。高校の時結構 C (LSIC-86 試食版) にはまっていました。何
をしていたかって? 主にゲームなんか作ってみようかなーなんておもってたけど、完成
したのは多分ありませんでしょう。あと、ソフトは少し、実用的そうなものを作れたか
な?ってときもありましたが、おそらく私の DynaBook でしか動かなかったりするかも
知れません。
そういえば、いぬ。BBS にアクセスしたこともあります。ゲストでですが……。
¶
³
丹下 吉雄
µ
名前
丹下 吉雄
クラス
理I 4組
保有機
GATEWAY2000 P5-133 プロフェッショナル
´
(SPEC: Pentium133MHz 16MB-EDO 1GB-HD
256KB-PBSRAM)
出身
三重県四日市市。暁高校卒。
TSG 部報 No. 199
3
新入生自己紹介
¶
³
西元
µ
名前
西
所属
理 2 12 組 ドイツ語
機種
Macintosh SE, IBM XT/AT 互換機 :最近ぜんぜん使ってないっす
´
元 (にし はじむ)
名前が 2 文字ですが、純粋な日本人です。2 年生です。合気道気錬会というサークル
に入ってます。2 年になり、プログラミングをやりたくて、TSG に入ろうとおもったの
であります。プログラミングは、ほぼ素人です。(一応火 5 の数理情報一般で、LISP と
か Scheme をかじっています。) そこで、今はいざプログラミングするときにスムーズ
にできるように、タッチタイプの練習に励んでいるのでした。よろしく!
¶
³
宮崎 大輔
µ
名前:
´
宮崎 大輔
パソコン通信はやってません
機種 等: 小学校の頃、PC ー 6001 を使っていた
その後、PC ー 9801UV21 をかってもらい、また、小学校でも 98 をつかって、ロゴラ
イターでプログラムをつくってたその後、大学に入って FM ー V DESK ー POWER SP
というのを買ってもらうまで 98 のベーシックを使ってた
¶
³
菅原 豊
µ
名前
菅原 豊
使用機種
本体 PC-9821Xa10/C12
ディスプレイ MF-8617E
プリンタ BJ-10V select
拡張ボード WaveMaster
4
TSG 部報 No. 199
´
新入生自己紹介
僕がパソコンを始めたのは、中学 2 年のころです。はじめて使ったのは、三菱の MUL-
TI16 (知っている人いるかな?) です。これで ASM86 を学びました。
その後 PC-9801NS/E を買い、BASIC やアセンブリ言語でプログラミングをしました。
アセンブリ言語では円周率を 131065 桁求めたりしました。NS/E で Windows3.1 もや
りました。しかし、スピードが笑っちゃう程遅いのですぐに HD から削除しました。そ
して現在、Xa10 で快適に Windows をやっているという次第です。高校 3 年生の夏休み
に勉強をおろそかにして NS/E でゲームばかりやっていたところ、あたかも天罰である
かのように落雷があり、それによって NS/E の動作がおかしくなりました。使用中に突
然リセットされるようになったのです。もちろん、恐ろしくて使えませんでした。現在
は前述したように Xa10 を使っています。今年は C 言語やインターネットをやりたいと
思っています。インターネットは家でやると有料なので学校でやろうと思います。それ
から、今持っているアセンブラが N88BASIC モニタだけなので、まともなやつを自作し
ようと思います。
¶
³
丸山 勲
µ
名前:
丸山 勲
ハンドルネーム:
まる
言語:
BASIC、C くらい
´
italk で知った Trr にはまっています。でも、まったく点が伸びません。(190 で頭打ち)
目指せ!業界標準!
TSG 部報 No. 199
5
新入生自己紹介
¶
³
時田 忠昭
µ
名 前:
時田 忠昭
ハンドルネーム:
なし
科 類, クラス:
理科二類 13 組
出 身 高 校:
山口県立 下関西高校
保 有 機 種:
パソコン / なし
´
ポケコン / SHARP PC-E650
一 言:
パソコン初心者です。
どうぞよろしく。
¶
³
鶴見 雅弘
µ
6
名前
鶴見 雅弘
ハンドル名
未定
パソコン
なし (買う予定)
言語
BASIC をちょっとだけ
コメント
よろしくお願いします
TSG 部報 No. 199
´
新入生自己紹介
¶
³
馬本 英樹
µ
´
本名
馬本 英樹
ハンドル
ひでき (←経験は薄い…)
科類・組
理科 1 類 28 組 (フランス語)
所有機種
PC-9801FA2 , FAMILY BASIC , FAMILY BASIC V3 ,
FAMILY COMPUTER, FAMILY COMPUTER DISK
SYSTEM, SUPERFAMICON, GAME BOY,
SEGASATURN
パソコン歴
約 4 年 (しかしプログラムは殆んどやってない…)
使用言語 (熟練度順)
日本語 > BASIC > 英語 》 フランス語
ゲーム歴
約 13 年。
語るにはここではスペースが足りないので、割愛。
これからの目標
BASIC 以外の言語を最低一つは習得する。
あとブラインドタッチをマスターする。
¶
µ
³
小林 徹也
´
C が習いたくてはいりました。ほかにもサークルに入っているので分科会以外はあま
りこないかもしれませんがよろしく。
TSG 部報 No. 199
7
新入生自己紹介
¶
³
保原 麗
µ
氏名
保原 麗
性別
男
学年
1
課類
理科 1 類
組
18
生年月日
昭和 52 年 10 月 19 日
年齢
18 歳
使用電算機
NEC P9801DX/U2
IBM Aptiva Music Vision(2407-RYD)
出身高校
東京学芸大学附属高校
特技
睡眠不足と南京玉簾
使用言語
母語は日本語
第 1 外国語 BASIC
2 機械語
3 英語
4 C++
5 ドイツ語
6 Pascal
第 5、第 6 外国語については現在勉強中
趣味
8
TSG 部報 No. 199
秘密
´
新入生自己紹介
¶
³
黒川 秀樹
µ
名前
´
黒川秀樹 [くろかわ ひでき] (湯川秀樹と一字違い)
生年月日
1977 年 9 月 23 日 (秋分の日)
所属先
東京大学 教養学部 理科一類 4 組 E 一年
持
っているパソコンと周辺機器
PC9801DA
ハードディスク 240Mb
3 倍速 CPU アクセラレイター
モデム 28800bps [2 月 23 日 (入試一日目!) に購入]
(ただしすべて今年大学受験をする弟に譲ってきたので、
新しく買う予定)
自己紹介と言っても特に何も浮かばないので、僕とパソコンのつき合いについて書こ
うと思います。まず僕が初めてパソコンに触れたのは小学 4 年の時、うちで売られてい
た MSX で遊んだ時だと思います。その MSX と言うのが、ファミコンのようなカセット
を差してやるか、テープレコーダーに記憶したやつをやるかと言うような代物で、子ど
も心にパソコンとはファミコンよりも下だと思ったような記憶があります。
その次はしばらく飛んで中学 1 年の時になります。友人 (自転車で行きが 30 分、帰り
が 5 分の山奥に家がある) がパソコンで「続・ダンジョンマスター」をやっていたので
す。フォンという低く不気味な音 (今思えばパソコンの起動音) とともに現れる画面、動
きながら迫り来る敵、難解な (ひねくれた) 謎、そのすべてに魅せられて、「パソコンを
買いたい。パソコンを買ってゲームがしたい。」と言う強烈な願望が生まれました。
さて、そこからが大変です。いくらパソコンが欲しいと親にねだっても 30 万以上もす
るものをそうやすやすと買ってくれるはずもありません。そこでゲームをしたいと言う
本当の理由は隠し勉強に使うからと言いくるめて、テストで一番をとったらと言う比較
的簡単な条件にまで持っていき、まるでだますようにして (実際だましている) 買っても
らいました。しかし勉強に使うと言っている手前、親が来ると BASIC をつかって、線
を引いたり、円を動かしたりして誤魔化していました。(ちなみに最初に手に入れたゲー
ムは「アルシャーク」、買ったのは「同級生」)
その後ゲームをしているのが誤魔化せなくなると、ひらきなおってゲームばかりする
ようになり、中学のうちはゲーム (主にエロゲー) づけの毎日でした。
高校にはいると、全寮制と言うこともありゲームから遠ざかっていたのですが、
「同級
生 2」が発売された時には、寮にパソコンを持ち込みロッカーの中に隠し、朝の 3 時に
起きてやると言う荒技をしていました。(いやー、あのころは若かった)
それでも高 3 の 2 学期になると、CONFIG.SYS いぢりにはまり、3 学期になるとそろ
そろプログラムが組めないとヤバイかなと思うようになり、今に至るわけです。
TSG 部報 No. 199
9
新入生自己紹介
というわけで、僕は現在プログラムのことはほとんど分かりません。ただし、ただ今
C++を勉強中ですので、これからの成長を楽しみにしていて下さい。
¶
³
長野 誠
µ
´
事故衝壊!
名前
長野 誠
クラス
理科一類 1 年 11 組 (ドイ語)
出身校
神奈川県立多摩高校
機種
PC-9801FA (買い替え間近か?!の噂)
BJ-10v
プレイステーション; 鉄拳やったことありません。
スーファミ
言語
昔 BASIC をやったような記憶がある (かなり使えた)
今再びプログラミングに取り組む時が来たのだ・
・
・。
パソコン歴
8 年 (MSX は良かった。)
たしなみ
マージャン
悩み事
果たして 98 がいいのか、それとも DOS/V がいいのか・
・
・。
高校時代ずっとパソコンから遠ざかっていましたが、ようやくやる気も戻ってきたの
で、飽きないうちにある程度のプログラムが組めるぐらいの所まで行きたいと思ってい
ます。いろいろと教えて下さいね。でもまず買い替えが先だ。98 かデスクパワーかアプ
ティバか・
・
・。
終り。(6_6"!
¶
³
岡崎哲也
µ
氏名
岡崎哲也
科類
文科 2 類 12 組
持っている機種
スーファミ、メガドラ、サターンなど
(ゲームばっかりですいません)
10
TSG 部報 No. 199
´
新入生自己紹介
ゲーム歴は長いのですが、パソコンに関してはまったくの初心者なのでアドバイスを
よろしくお願いします。もちろん自宅にもコンピューターと呼べる様な物はなく、今度
行なわれる秋葉原ツアーなるものに参加して勉強していきたいと思います。
実はパソコンに関する思い出は意外と古く、小学生のころ授業で使ったアップルが最
初のものだったりします。ちなみに機種については、その後中学の時導入されたものが
アップル II Gs と呼ばれていた事ぐらいしか分かりません。
一方のゲームは覚えている限り、という感じで幼稚園の頃にはもう 100 円玉を持って
ゲーセンに走っていました。今では対戦格闘やシミュレーションが好きで、ZERO2 など
はそこそこの線いってると思うのですが。他ではタクティクス オウガやファイヤーエム
ブレムあたりでしょうか。TSG にいる間はゲーマーとしてではなく、TSGer として活動
していきたいと思っているので、安心してください (この文章が矛盾したものでないと
いいな。)
¶
µ
³
内仲 俊輔
´
名前: 内仲 俊輔
所属: 文科 2 類 4 組 (中国語)
出身校: 開成 血液型:O
趣味: えーと、趣味は何といってもギャンブル一般。中でも、麻雀と競馬をこよなく
愛してます。ちなみに、ホースメンという競馬サークルにも所属してます。興味のある 1
年の人は、(もちろん 2 年の方も) 顔を出してみて下さい。さて、コンピュータ関係では、
ゲーム以外のことは全くわかりません。はっきりいって、このメールを書くのにも手間
取ってるくらいです。1 から学ぼうと思っているので、みなさんよろしくお願いします。
いっぽう、ゲームのほうは、長年 RPG ばっかりやってます。ハードはファミコンとスー
ファミしかありませんが、馬で儲けたら、64 とプレステをかうよていです。えー、すき
なメーカーはチュンソフトで、サウンドノベルも好きですが、風来のシレンが BEST だ
と思います。でも本当は昔から任天堂一筋!任天堂万歳!!! (おしまい)
TSG 部報 No. 199
11
新入生自己紹介
¶
³
寺園 泰
µ
名前
寺園 泰 (てらぞの やすし)
所属
理科一類 2 年 13 組
自宅の機械
AT 互換,AMD5x86/160MHz,16MB-DRAM,340MB-HDD,
その他オプション等
環境はよく変わる。取り敢えず HDD 増設して PC UNIX でも
入れたい。
その他
12
は、コンパの時にでも。
TSG 部報 No. 199
´
新入生自己紹介
おことわり: pdf による一般公開に当たり、html 版と同様に個人情報を削除しました。
そのため、新入生自己紹介は冊子版とページ割が異なっております。御了承下さい。
追記: 2009 年 4 月、著者の要請により 1 名分の紹介を削除しました。
1 ページ減ってしまったから埋め種です :>
TSG 部報 No. 199
13
C++ 言語入門 第 1 回
C++ 言語入門 第 1 回
C / C++ 言語分科会
わたる
¶
³
1
µ
プログラミング言語とは何か
´
よく知られているように、コンピュータは 0 と 1 しかわかりません。コンピュータに
何かを認識させるためには、0 と 1 の組み合わせによって表現しなければならないので
す。0 と 1 の組み合わせがあれば 2 進数が使えますね。この 2 進数の値をさらに様々な
情報に対応させて、コンピュータは物事を把握します。例えば A と言う文字は 1000001
(10 進数で 65)に対応付けられています。
また、コンピュータに何か仕事をさせたいときは、その手順を教えてやらねばなりま
せん。この手順というのがプログラムなのです。その内容もまた 0 と 1 の組み合わせで
表現します。Intel 社製の有名な CPU『Pentium』の場合を例にとりましょう。『ax』と
いう名前の変数(正しくはレジスタ)に 0 を代入せよと命令したい場合、10 進数で 184、
0、0 に相当する 2 進数3個で表現します。2 進数によるこのような表現をマシン語(ま
たは機械語)と言います。マシン語がとてつもなくめんどうなことは、これ以上説明す
るまでもなくわかりますね。1)
そこで、まずはもっと人間にわかりやすい言葉でコンピュータに対する命令を記述し、
それをマシン語に翻訳するという2段階の方法が考案されました。人間にわかりやすい
言葉というのがプログラミング言語なのです。翻訳作業はあらかじめ用意されたマシン
語のプログラムにより、コンピュータがします。だから人間の手間が増えることはあり
ません。
¶
³
2
どうして C / C++ 言語を使うのか
µ
´
プログラミング言語にはたくさんの種類があります。BASIC、Fortran、Cobol、Prolog、
Lisp、Pascal、Smalltalk、Java、そして C、C++ などです。これらにはそれぞれ一長
1) CPU
14
とはまさにこのマシン語を理解する IC のことです。
TSG 部報 No. 199
C++ 言語入門 第 1 回
一短があるのですが、文句無く最初に学ぶべき言語は C であり、続けて C++ も勉強す
るべきなのです。2) C / C++ の魅力的な特徴をいくらか挙げておきます。
• C / C++ は学びやすい。
• C / C++ を知っている人がたくさんいる。
• C / C++ を扱った書籍は山ほどある。
• C / C++ で書いたプログラムはコンピュータが速く実行できる。
• C / C++ のプログラムは簡潔である。
• C / C++ のコンパイラ (マシン語に翻訳するプログラム) は無料で手にはいる。
• C / C++ で作れないプログラムはない。
¶
µ
³
3
はじめに
´
この分科会は C と C++ をマスターすることが目標ではありません。あくまで入門講
座です。説明の容易さと理解のしやすさにより、 C++ を C よりも先に勉強することに
します。それから、市販の解説書のように、C や C++ の機能を項目別に系統立てて解
説したりはしません。文法や仕組みの説明は、例題プログラムが理解できる程度で小出
しにします。途中で欲求不満になってしまった人は、生協などで解説書を買って読んで
下さい。
この分科会では情報処理棟の UNIX の使用を前提とします。他の環境だと以下の内容
は必ずしもそのまま通用しません。MS-DOS や Windows でのことについて知りたい人
は直接尋ねて下さい。また Mule や ls、ファイルやディレクトリの使い方や意味はここ
には書きません。わからない場合は質問するか、情報処理の教科書などで調べて下さい。
その他、どんな些細なことでも気軽に尋ねて下さい。
「この文字の打ち込み方がわから
ない」と言うようなことでも結構です。
『わからないことはすぐに質問する』が上達への
早道なのです。
2) 某ゲイツ氏は BASIC が初心者には最適だと主張していますが、彼が BASIC を作ったからそう言ってい
るだけでしょう。
TSG 部報 No. 199
15
C++ 言語入門 第 1 回
¶
µ
³
4
もっとも簡単なプログラム
´
とにかく手始めに、画面へ hello, world と表示するプログラムを作ってみましょう。
詳しい解説は後回しにします。Mule などのエディタで以下の内容をそっくり写したファ
イルを作り、hello.cc というファイルネームで保存して下さい。
#include <iostream.h>
main()
{
cout << "hello, world";
cout << endl;
}
hello.cc の内容は後で解説します。ファイルを作ったら、kterm に以下のように入力
して下さい。
g540879@xss01> gcc hello.cc -lg++(ここでリターンキーを押す。)
g540879@xss01> の部分は入力しないで下さい。もうあらかじめ画面にあるはずです。
数字の部分が少し違うかもしれませんが、気にすることはありません。
(この部分はあな
たの ID と使っているコンピュータの名前なので、人や座っている席によって違うので
す。)リターンキーを押して、少しだけ時間がたってから再び g540879@xss01> と画面
に現れたら成功です。もし error など他の何かが表示されたら、近くにいる TSG の人
に言って下さい。たぶん hello.cc の中に写し間違いがあったのでしょう。
次に ls でディレクトリの中身を確認します。
g540879@xss01> ls
a.out
hello.cc
a.out という新しいファイルが勝手に作られているのに気が付きましたか。a.out は
hello.cc をもとに作られたマシン語のファイルです。実行可能ファイル executable
file と言います。マシン語なのでコンピュータは理解し実行することができます。やら
せてみましょう。
g540879@xss01> a.out
hello, world
hello, world と表示させることができました。
¶
µ
³
5
hello.cc の解説
´
hello, world を表示するまでの過程でしたことを、順を追って説明します。
まず hello.cc というファイルを作りました。.cc の部分が、このファイルが C++ 言
語のプログラムであることを表しています。このようなファイルをふつうソースコード
16
TSG 部報 No. 199
C++ 言語入門 第 1 回
source code と言います。そして gcc はソースコードをマシン語に翻訳してくれるプ
ログラムです。翻訳作業のことをコンパイルと言います。gcc は GNU C & C++
Compiler の略で、GNU というある思想を持った人々が作っており、無料で使うこと
ができます。GNU がどんな内容の思想なのかは、別の機会に説明しましょう。-lg++
は C++ を使うことを表しています。単なる C のときは不要です。
では次に hello.cc の中身を解説します。説明しやすいように各行に番号をつけてみ
ました。
1:
2:
3:
4:
5:
6:
#include <iostream.h>
main()
{
cout << "hello, world";
cout << endl;
}
一般に C++ のソースコードは、関数の定義 function definition と実行すべき処理
の順序を記した文 statement からなっています。すべての C++ のプログラムは main
という名前の関数定義を含んでいなければなりません。コンピュータがある C++ のプ
ログラムを実行しようとするとき、まず関数 main に書かれた計算を処理するからです。
数学では、関数とは入力と出力を一意的に結びつけるものを意味しますが、 C++ の
関数は違います。入力や出力は無い場合もありますし、なんらかの副作用があったりも
するのです。そのため、多くのプログラミング言語では C++ の関数に相当するものを
手続き procedure と呼んでいます。しかし C++ では伝統的に関数と言われています
ので、皆さんもそのように呼んで下さい。
さて、関数 main は次の形式で定義します。
main()
{
文;
文;
...
}
main の後のカッコ () は、main が関数であることを示しています。それに続いて関
数の具体的内容を中カッコ { } で囲んで記述します。実際に実行する文はセミコロン ;
で区切りって下さい。
hello.cc の場合の main() の定義を見てみましょう。
4:
cout << "hello, world";
cout は 標準出力 に繋がっている ストリーム stream です。標準出力とはようする
に画面のことで、後々詳しく説明します。ストリームとは、簡単に言うと、出力演算子
output operator << で様々なものを流し込むことができるものです。流し込んだ先が
ファイルになっているストリームもあります。hello.cc の場合は "hello, world" を
流し込んでいますね。C++ では、一続きになっている複数の文字を扱うときはダブル
コーテーション " で囲むことになっています。これを文字列 string と言います。
ストリームには以下のようにして、連続的にものを流し込むことができます。
TSG 部報 No. 199
17
C++ 言語入門 第 1 回
1:
2:
3:
4:
5:
#include <iostream.h>
main()
{
cout << "hello, world" << endl;
}
では endl は何なのでしょうか。ちょっと実験して見ればすぐわかります。以下のよう
にソースを変更してみて下さい。
1:
2:
3:
4:
5:
6:
#include <iostream.h>
main()
{
cout << "hello, world"
<< "Hello, TSGers!";
}
4 行目にセミコロン ; が無いことに注意して下さい。練習ですからこのソースコード
もコンパイルして実行してみましょう。やってみるとわかりますが、無様にも 2 つの文
字列がくっついて表示されてしまいます。
g540879@xss01> a.out
hello, worldHello, TSGers!
以下のように修正すればきれいに表示されます。
1:
2:
3:
4:
5:
6:
#include <iostream.h>
main()
{
cout << "hello, world"
<< endl
<< "Hello, TSGers!" << endl;
}
4 行目で hello, world と Hello, TSGers! の間に endl を入れました。
g540879@xss01> a.out
hello, world
Hello, TSGers!
endl は行の終わりを意味し、改行する機能があるのです。
ところで 1 行目の解説がまだでした。これです。
1: #include <iostream.h>
# で始まる文は、実は文 statement ではありません。プリプロセッサ命令です。これ
の解説はやっかいなのでずっと後回しにしますが、#include <iostream.h> の意味は
簡単です。iostream.h というファイルを読み込みなさいという意味です。iostream.h
は /usr/include というディレクトリにあります。
実は、iostream.h には cout の定義が書かれています。この定義があるから main()
の中で cout が使えるのです。cout を使ったプログラムを作るには必ずこの行が必要で
す。気になる人は Mule に iostream.h を表示させてみて下さい。しかし cout だけで
なく、他の定義がたくさん書かれていますからやめておいたほうが無難でしょう。
以上で hello.cc の解説はお終いです。
18
TSG 部報 No. 199
C++ 言語入門 第 1 回
ちょっと道草
5.1
せっかく作った実行可能ファイルがいつも a.out という名前にされては不便ですね。
UNIX を少し知っている人なら mv で a.out の名前を変更する手を思いつくかもしれま
せんが、もっとよい方法があります。
g540879@xss01> gcc -o hello hello.cc -lg++
とすれば a.out でなく hello というファイルネームになります。
ちょっと道草
5.2
ソースコードの見やすさについてです。C++ は空白や改行を自由に取ることができ
ます。例えば以下のソースコードからは全く同じ実行可能ファイルが生成されます。
1:
2:
3:
4:
5:
6:
#include <iostream.h>
main()
{
cout << "hello, world" << endl;
cout << "Hello, TSGers!" << endl;
}
1: #include <iostream.h>
2: main(){cout<<"hello, world"<<endl<<"Hello, TSGers!"<<endl;}
1: #include <iostream.h>
2: main(){
3: cout << "hello, world" <<endl;
4:
5:
cout<<"Hello, TSGers!" <<endl;
6:
}
正式なレイアウトは存在しませんが、なるべくわかりやすいスタイルにしましょう。
¶
µ
³
6
変数とは
´
C++ における変数 variable とは、コンピュータのメモリ上の小さな領域に名前を付
けたものです。
メモリとは、ON と OFF の2通りの状態を取れる電気的なスイッチの集まりで、コン
ピュータはここに様々な情報を蓄えることができます。このスイッチ一つのことを 1 ビッ
トと言い、1 ビットが 8 個集まったものを 1 バイトと呼びます。最近のコンピュータは
すべてメモリを 1 バイト単位で管理しています。ゲームでよく遊ぶ人は、255 や 65535
という数字を見かけたことがあるはずです。これは 1 バイトのメモリが 2 の 8 乗で 256
通り、つまり 0 から 255 の数字を記憶できることに由来しているのです。2 バイトなら
ば 2 の 16 乗で 65536 通り、0 から 65535 までの数字になりますね。
TSG 部報 No. 199
19
C++ 言語入門 第 1 回
情報処理棟で使われているコンピュータはメモリを 67,108,864 バイト搭載しています。
また最近はパソコンでも 16,777,216 バイト程度のメモリはあります。これほど膨大な数
になると、「xxxx 番目のメモリにあの情報を記憶して…」というやり方では不便すぎま
すね。そこで、メモリの小領域に名前を付けて使いやすくするわけです。
変数にはデータ型 data type があり、それによってメモリ上の小領域の大きさと、記
憶されている情報の解釈の仕方が決まります。しばらくは最も基本的なデータ型である
int 型に話を絞って進めましょう。
int 型の変数は整数を記憶することができ、駒場の情報処理棟の環境では 4 バイトの
大きさがあります。つまり正負の符号を表す 1 ビットと絶対値を表す 31 ビットからな
り、−2, 147, 483, 468 から +2, 147, 483, 647 までの値を取ることができます。
¶
µ
³
7
変数を宣言する
´
C++ で変数を使いたいときは、まずそのことを宣言 declare しなければなりません。
これによってコンパイラが変数用のメモリを確保し、そのデータ型を知ることができま
す。変数の宣言は『データ型 変数の名前;』の書式で行います。宣言する場所は、その
変数が使われる前の部分ならどこでも可能です。
main()
{
int x;
int y;
int z;
…
変数の名前はアルファベットと数字、アンダーバー underbar _ で構成します。また、
同じ型の変数宣言はコンマで区切ってまとめることができます。
main()
{
int width, height, number_of_members;
...
変数に値を代入するには代入演算子 = を使います。次のソースコードを見て下さい。
#include <iostream.h>
main()
{
int width, height, area;
width = 3;
height = 5;
area = width * height;
cout << "The area is " << area << endl;
}
20
TSG 部報 No. 199
C++ 言語入門 第 1 回
アステリスク asterisk * は掛け算の意味です。実行すると The area is 15 と表示
されます。
¶
³
8
µ
変数の初期化
´
まず以下のソースを見て下さい。
#include <iostream.h>
main()
{
int width, height, area;
area = width * height;
cout << "The area is " << area << endl;
}
変数 width と height に値を全く代入していません。このような変数の値は不定です。
0 になっていることがよくありますが、そうなると保証されているわけではありません。
不定な値から算出された area も当然不定となります。結果として画面に何が表示され
るかもわからなくなってしまいます。このようなプログラムは欠陥品です。
しかし、変数に値を代入し忘れたためバグ(プログラムの欠陥。虫食いの意味。)が発
生してしまうことはよくあるのです。このような事態を回避するため、変数の宣言と同
時に値を代入してしまうことができます。
#include <iostream.h>
main()
{
int width = 3, height = 5;
int area = width * height;
cout << "The area is " << area << endl;
}
これを変数の初期化と言います。
¶
µ
³
9
いろいろなデータ型
´
int 型以外にも次に示すようなデータ型があります。
TSG 部報 No. 199
21
C++ 言語入門 第 1 回
データ型
バイト数
扱える数値
char
1
ごく小さい整数と、文字や記号 (−128 ∼ +127)
short
2
小さい整数 (−32, 768 ∼ +32, 767)
long
4
大きな整数 (−2, 147, 483, 648 ∼ +2, 147, 483, 647)
int
—
そのコンピュータが最も得意とする大きさの整数
情報処理棟ではlong と同じ
float
4
精度の低い実数 (3.4 × 10−38 ∼ 3.4 × 1038 )
double
8
精度の高い実数 (1.7 × 10−308 ∼ 3.4 × 1.7308 )
long double
10
精度の非常に高い実数 (1.1 × 10−4932 ∼ 1.1 × 104932 )
一般に、実数の計算は整数のそれより時間がかかります。不必要に実数型を使わない
ようにしましょう。変数宣言の仕方はどれも int 型と同じです。
#include <iostream.h>
main()
{
float pi = 3.14, r = 1.4;
float area = pi * r * r;
cout << "The area is " << area << endl;
}
ちょっと道草
9.1
各データ型が何バイトのメモリを要するのかは、sizeof 演算子でわかります。以下の
ソースをコンパイルして見て下さい。
#include <iostream.h>
main()
{
cout << "Data Type
<< "char
<< "short
<< "long
<< "int
<< "float
<< "double
<< "long double
}
bytes"<< endl
" << sizeof(char) << endl
" << sizeof(short) << endl
" << sizeof(long) << endl
" << sizeof(int) << endl
" << sizeof(float) << endl
" << sizeof(double) << endl
" << sizeof(long double) << endl;
¶
µ
³
10
計算式を書く
加算、減算、乗算、除算の演算子はそれぞれ +、-、*、/ です。
22
TSG 部報 No. 199
´
C++ 言語入門 第 1 回
これらのうち除算には少々気を付ける必要があります。次のプログラムを実行してみ
ましょう。
#include <iostream.h>
main()
{
cout << "5 / 3 = " << 5 / 3 << endl;
}
結果は 1 と表示されます。整数同士の除算では小数点以下の部分は切り捨てられ、商
しか得られません。モジュロ演算子 modulus operator % によって剰余を知ることが
できます。実数型同士ならば正しい答えが得られます。
#include <iostream.h>
main()
{
cout << "5 / 3 = " << 5 / 3 << " ... " << 5 % 3 << endl;
cout << "5 / 3 = " << 5.0 / 3.0 << endl;
}
実行結果
5 / 3 = 1 ... 2
5 / 3 = 1.66667
似たような問題に変数の型変換があります。次のソースを見て下さい。
#include <iostream.h>
1: main()
2: {
3:
short s;
4:
float f;
5:
f = 1.9;
6:
s = f;
7:
cout << s << endl;
8:
f = 100000.0;
9:
s = f;
10:
cout << s << endl;
11: }
実行結果
1
-31072
6 行目や 9 行目のように整数型変数に対して実数型変数を代入すると、自動的に型変
換が行われて小数点以下が切り捨てられた値が代入されます。しかし 8 行目を見て下さ
い。f の値が short 型の最大値 +32767 を越えていますね。この様な場合、s にはでた
らめな値が代入されてしまうのです。
10.1
ちょっと道草
C++ には、数学にはない演算記号や代入記号があります。
TSG 部報 No. 199
23
C++ 言語入門 第 1 回
a++
変数 a の値を 1 増やす。
a--
変数 a の値を 1 減らす。
a += b
a = b = c
a = (b = c)
変数 a に変数 b の値を足す。
変数 a と変数 b に変数 c の値を代入する。
同上。
a = b++
変数 a に変数 b の値を代入してから、b の値を 1 増やす。
a = ++b
b の値を 1 増やしてから、変数 a に変数 b の値を代入する。
¶
µ
³
11
関数を定義する
´
平面上の 2 点の距離を求めるプログラムを作ってみましょう。例として点 (1, 2) と点
(3, 4) を選ぶとします。C++ で平方根を求めるには、math.h の中であらかじめ用意さ
れている関数 sqrt() を使います。math.h の中にはいろいろな数学関数の定義が書かれ
ています。
#include <iostream.h>
#include <math.h>
main()
{
double distance = sqrt( (1 - 3)*(1 - 3) + (2 - 4)*(2 - 4) );
cout << distance;
}
異なるたくさんの 2 点間の距離を求めたいのであれば、距離を求める関数 distance()
を作った方がよいでしょう。
#include <iostream.h>
#include <math.h>
main()
{
cout << distance(1, 2, 3, 4);
cout << distance(5.1, 6.2, 7.3, 8.4);
}
C++ の関数は複数の引数を取ることができ、コンマで区切ります。このプログラム
は関数 distance() がまだ定義されていないので動きません。次のように定義してみま
しょう。
1:double distance(double x1, double y1, double x2, double y2)
2:{
3: double result;
4: result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
5: return result;
6:}
24
TSG 部報 No. 199
C++ 言語入門 第 1 回
1 行目 double distance() の部分は、この関数の結果の値、つまり戻り値が double
型であることを決めています。5 行目の return result でこの関数の戻り値を定めてい
ます。この場合、当然 result は double 型の変数でなければなりません。
1 行目 double distance() のカッコ () の中は引数のデータ型と名前を書くところ
で、double x1, double y1, double x2, double y2 となっています。関数に渡され
た引数はここに記された変数に代入されて、関数内部のプログラムは自由に扱えます。
変数の宣言と似ていますが、double x1,y1,x2,y2 の様に省略して書くことはできませ
ん。この関数定義を組み込んだソースを見てみましょう。
#include <iostream.h>
#include <math.h>
double distance(double x1, double y1, double x2, double y2)
{
double result;
result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
return result;
}
main()
{
cout << distance(1, 2, 3, 4);
cout << distance(5.1, 6.2, 7.3, 8.4);
}
コンパイラはソースを前の方から解釈していきますから、関数 distance() の定義は、
この関数が実際に使われるところより前に書く必要があります。
11.1
ちょっと道草
上の例で、関数 distance() を作ったことにどのような意義があったのか考えてみま
しょう。
1 つ目の意義は、プログラムのデバック debug(欠陥を修正する作業のこと)が容易にな
ったことです。もし仮に、距離を計算する公式を間違えていたとします。関数 distance()
を使ってあれば、定義の部分だけを修正すれば大丈夫ですね。しかし distance() を使っ
ていなければ、ソースの距離を計算している部分をすべて直さなければなりません。状
況によっては大変手間取る作業になるでしょう。修正を忘れる箇所が発生するかもしれ
ません。
2 つ目は、ソースが再利用しやすくなったことです。今後、距離の計算を必要とする
プログラムを作る必要があった場合は、関数 distance() の定義の行をコピーすればよ
いのです。
3 つ目は、ソースが読みやすくなり、同時に書きやすくなったことです。distance()
のおかげで main() のおおまかな処理の流れが把握しやすくなりました。また、関数
distance() の定義の部分は誰か別の人に作ってもらいえば、分担作業にできます。プ
ログラマーはより高度な作業に専念できるようになったのです。
TSG 部報 No. 199
25
C++ 言語入門 第 1 回
関数を定義することにはたくさんの得があることがわかりましたか。関数の定義のよ
うに、ソースの中で繰り返される特定の作業をひとつにまとめあげることを手続き抽象
と言います。その作業の詳細な内容を隠蔽し、抽象化しているわけです。
¶
³
12
µ
キーボードからの入力
´
cin は標準入力(後述)に繋がったストリームです。入力演算子 >> を用いれば、キー
ボードにタイプされるものを変数に代入することができます。
#include <iostream.h>
main()
{
cout << "直方体の寸法を整数で入力して下さい。" << endl;
int width, length, height;
cin >> width >> length >> height;
cout << "体積は " << width * length * height << end;
}
入力するときは各整数を空白や改行で区切ることができます。なお cout と同様、cin
を使いたいときも#include <iostream.h> が必要です。
ところで標準出力や標準入力の意味をまだ説明していませんでした。これらは C++
の用語と言うよりも UNIX や MS-DOS の言葉なのです。この 2 つは通常は画面とキー
ボードのことなのですが、次のようにしてプログラムの実行時にそれらを変えることが
できます。
xss01> hello >output
この場合 output というファイルが作られて、そこに hello, world と書き込まれま
す。標準出力が output というファイルになったのです。<input などとして、ファイ
ルを標準入力にすることもできます。このような標準入出力の変更をリダイレクション
redirection と言います。
12.1
ちょっと道草
C++ のソースには 2 つの方法によってコメントを含めることができます。1 つめは 2
つのスラッシュ // によるもので、その記号の直後から行の終わりまでの間に自由な注
釈を書くことができます。2 つめの方法では、コメントにしたい部分を /* と */ で囲み
ます。
#include <iostream.h>
//この行は無視されます。
main()
{
26
TSG 部報 No. 199
C++ 言語入門 第 1 回
/*
この辺も全部、
コメントになります。
*/
//変数の宣言
double pi = 3.14159,
r = 1.41;
//円周の計算
cout << 2 * pi * r << endl;
/* 面積の計算 */
cout << pi * r * r << endl;
/*
* こんなのや
*/
/*--------------------こんなのもあります
---------------------*/
/************************
* いろいろ工夫しましょう
*/
}
¶
µ
³
13
変数の有効範囲
´
入力された 2 点間の距離を求めるプログラムを作ってみましょう。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
#include <iostream.h>
#include <math.h>
double distance(double x1, double y1, double x2, double y2)
{
double result;
result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
return result;
}
main()
{
double x1,y1, x2,y2;
cout << "距離を求めたい 2 点の座標を入力して下さい。" << endl;
cout << "第 1 点の x 座標は?";
cin >> x1;
cout << "第 1 点の y 座標は?";
cin >> y1;
cout << "第 2 点の x 座標は?";
cin >> x2;
cout << "第 2 点の y 座標は?";
cin >> y2;
TSG 部報 No. 199
27
C++ 言語入門 第 1 回
23:
24:
cout << "距離は" << distance(x1,y1, x2,y2) << endl;
25:
cout << "2 点の座標は (" << x1 << "," << y1 << ") と ("
26
<< x2 << "," << y2 << ")" << endl;
27: }
distance() を呼び出した後で、2 点の座標を表示していることに注意して下さい。で
はもし、distance() の中、7 行目と 8 行目の間に
x1 = 0; y1 = 0; x2 = 0; y2 = 0;
という行を追加したらどうなるのでしょう。座標の値は全て 0 と表示されてしまうの
でしょうか。結論から言うと、そんなことにはなりません。
ある関数が実行されるとき、その引数は新しくメモリを確保して作られた変数にコピー
され、使用されます。つまり関数 distance() の中の変数 x1,y1,x2,y2 は main() の
中のものとは全く別物なのです。それらは名前こそ同じですが、異なる場所にあるメモ
リを使用していて、他方の値が変更されても残りの一方は影響を受けません。
関数の内側で宣言された変数は、その関数の中でのみ使えます。つまり変数には 有効
範囲 scope があるということです。この様な変数を 局所変数 local variable と言い
ます。自動変数 automatic variable と言う呼び方もあります。有効範囲さえ異なれば
同じ名前の変数を何個でも作ることができます。
関数の外側で宣言された変数は、プログラム中のどこでも、あらゆる関数の中で使え
ます。この様な変数を 大域変数 global variable と言います。例として distance() の
変数 result を大域変数に変えてみたソースを示しましょう。なお、この変更は手続き
抽象の精神に反しており、ほめられるものではありません。
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
28
#include <iostream.h>
#include <math.h>
double result;
void distance(double x1, double y1, double x2, double y2)
{
result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
return;
}
main()
{
double x1,y1, x2,y2;
cout << "距離を求めたい 2 点の座標を入力して下さい。" << endl;
cout << "第 1 点の x 座標は?";
cin >> x1;
cout << "第 1 点の y 座標は?";
cin >> y1;
cout << "第 2 点の x 座標は?";
cin >> x2;
cout << "第 2 点の y 座標は?";
cin >> y2;
distance(x1,y1, x2,y2);
cout << "距離は" << result << endl;
TSG 部報 No. 199
C++ 言語入門 第 1 回
25:
cout << "2 点の座標は (" << x1 << "," << y1 << ") と ("
26
<< x2 << "," << y2 << ")" << endl;
27: }
4 行目の変数 result の宣言はどの関数定義の内側でもありません。ですから大域変
数となり、7 行目や 24 行目のように自由な場所で使うことができます。
ところで distance() は戻り値が必要なくなってしまいました。この様な場合は関数
のデータ型を void と書きます。
¶
µ
³
14
変数の存在時間
´
変数の持つ性質には、有効範囲の他にもう一つ 存在時間 extent という概念がありま
す。次はこれを説明しましょう。
例えばプログラムの中で distance() が何回実行されたか数えたいとして、以下のよ
うに関数定義を変更したとしましょう。
1: double distance(double x1, double y1, double x2, double y2)
2: {
3: int counter = 0;
4: counter++;
5: cout << "distance() called " << counter << "time(s)" << endl;
6:
7: double result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
8: return result;
9: }
しかしこの定義では毎回 distance() called 1 time(s) と表示されてしまいます。
C++ はコンピュータのメモリを節約するために、変数に使うメモリを必要なときだけ
確保するからです。
distance() の内部で起こることを順を追って説明しましょう。まず distance() が
他の関数から呼び出されて初めて、変数 counter のためのメモリは確保されます。この
時 counter は 3 行目の宣言に従って値 0 に初期化されます。4 行目によって counter
は値が 1 増え、5 行目で 1 と表示されます。続く距離の計算の部分は省略します。8 行
目の return のところで、変数 counter と result のメモリは解放されてしまいます。
つまり変数 counter はコンピュータの上から消滅してしまうのです。こうすることに
よって counter が使っていたメモリを他の関数の変数が再利用できるからです。再び
distance() が実行されるときは counter のメモリは新しく確保されて、値 0 が代入さ
れてしまい、またも 1 と表示されることになります。
counter のようにメモリの確保・解放・再確保が繰り返される変数は、動的存在時間
dynamic extent を持つと言います。これに対して静的存在時間 static extent を持
TSG 部報 No. 199
29
C++ 言語入門 第 1 回
つ変数があります。プログラムの実行全体を通して、その変数のメモリは一度だけ確保
され、プログラムが終了するまでメモリは解放されることはありません。例えば大域変
数はすべて静的存在です。
しかし counter をもし大域変数にすると、counter の値を distance() 以外の関数
からも変更できるようになってしまいます。これは手続き抽象の精神に反します。そこ
で C++ には局所変数に静的存在時間を持たせる手段として、変数宣言のときに static
を付ける方法があります。
1: double distance(double x1, double y1, double x2, double y2)
2: {
3: static int counter = 0;
4: counter++;
5: cout << "distance() called " << counter << "time(s)" << endl;
6:
7: double result = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
8: return result;
9: }
これで distance() の実行回数が正しくカウントされるようになりました。
¶
µ
³
15
条件分岐を書く
´
プログラムは実行時の状況によってその処理を変えることができます。C++ では、処
理を変える条件の記述に ブール式 Boolean expression を使います。ブール式とは 真
true か 偽 false のどちらかの値を持つ式のことです。便宜上の理由から、偽を表す値
には整数の 0 が、真を表す値には 0 以外の整数が対応しています。
実際に条件分岐をするには if 文を使います。
if( 条件式 ){
真の時の処理
}
else{
偽の時の処理
}
分岐後の処理が文一つで表せる場合は {} で囲む必要はありません。また、else{} 以
下は省略できます。具体的な例を見てみましょう。
#include <iostream.h>
main()
{
int temperature;
cout << "気温を入力して下さい。";
cin >> temperature;
if(temperature > 25) cout << "あついー" << endl;
else if(temperature < 10) cout << "さむいー" << endl;
30
TSG 部報 No. 199
C++ 言語入門 第 1 回
else cout << "ふつう" << end;
}
このプログラムは、入力された気温が 25 ℃以上ならば「あついー」、10 ℃以下なら
「さむいー」、その間ならば「ふつう」と表示します。else の後に if を組み合わせて複
雑な分岐をすることができるのです。ブール式に使うことのできる、2 個の数の間の関
係を表す記号をまとめておきましょう。
a == b
a と b は等しい(代入演算子 = と間違えないように!)
a != b
a と b は等しくない
a > b
a は b より大きい
a < b
a は b より小さい
a >= b
a は b 以上
a <= b
a は b 以下
== を = と間違えるミスは、初心者のみならず熟練したプログラマでもよくやります。
例えば次のような文を書いたとしましょう。
if(temperature = 100) cout << "うそ!" << endl;
このソースは C++ の文法的にはまったく正しいのでコンパイラはエラーを出しません。
temperature = 100 という文自体が 100 という値を持ちます。つまり (temperature
= 100) == 100 ということです。(x = y = 0 という文は x と y に 0 を代入する意味
であることを思い出して下さい。)0 以外の整数はブール式の真なので、temperature =
100 は常に成立する条件式と解釈されてしまうのです。
15.1
ちょっと道草
C++ ではブール式の真偽値を 0 以外の整数と 0 で表すと言うことは、前にも書きま
した。この性質を利用してこんなふうにプログラムを作れます。
#include <iostream.h>
main()
{
int number;
cout << "0 以外の整数を入力して下さい。";
cin >> number;
if(number) cout << "どうも。" << endl;
else cout << "0 以外だってば。" << end;
}
if(number) の様な手法はよく使いますので覚えておきましょう。
TSG 部報 No. 199
31
C++ 言語入門 第 1 回
¶
µ
³
16
繰り返し文 while を書く
´
コンピュータにある作業を繰り返させる方法の一つに while 文があります。
while( 条件式 ){
繰り返したい処理
}
コンピュータはまず条件式を評価します。真であれば { } の間にある文を一回だけ実
行し、再び条件式を評価します。後はこれの繰り返しです。条件式が始めから偽であれ
ば { } の中は一度も実行されません。もし条件式が永久に真のままであれば、 { } の
中は無限に繰り返されます。
ある整数 a の n 乗を求める関数 power(a,n) を作ってみましょう。
#include <iostream.h>
int power(int a, int n)
{
int result = 1; // 0 で初期化してはいけない!
while(n != 0){
result = result * a;
n--;
}
return result;
}
main()
{
int a,n;
cout << "a の値を入力して下さい。";
cin >> a;
cout << "n の値を入力して下さい。";
cin >> n;
cout << "a の n 乗は" << power(a,n) << "です。" << endl;
}
while(n != 0) を while(n) と書くこともできます。しかし意図している条件を明確
にするために、n != 0 とする方がよいでしょう。
¶
µ
³
17
繰り返し文 for を書く
´
while だけでどのような繰り返しも記述できますが、処理が複雑になるとソースがわ
かりにくくなってしまいます。そこで繰り返しを記述するもう一つの方法として for 文
があります。
32
TSG 部報 No. 199
C++ 言語入門 第 1 回
for( 開始文; 条件式; 継続文;){
繰り返したい処理
}
コンピュータはまず開始文を実行します。次に条件式を評価し、真であれば { } の中
の処理を一回実行します。さらに継続文を実行し、また条件式を評価します。後はこの
繰り返しです。for はプログラムの構造を明確にすることができるのです。
for を使って整数 1 から n までの和を求める関数 sum(n) を作ってみましょう。
#include <iostream.h>
int sum(int n)
{
int result = 0;
for(int i = 1; i <= n; i++) result += i;
return result;
}
main()
{
int n;
cout << "n の値を入力して下さい。";
cin >> n;
cout << "1 から n までの和は" << sum(n) << "です。" << endl;
}
for の開始文が int i = 1; になっています。開始文にはプログラム中で使える文を
そのまま置けますので、ここでは変数宣言をしているのです。この変数の有効範囲は for
の後の { } の中だけです。ただしこの例では繰り返したい処理が一つの文で書けたので
{ } を省略しました。
for(; 条件式 ;){} と書けば while( 条件式 ){} と全く同様な機能が得られます。
しかしこのような記述はソースが理解しにくくなるだけです。while と for をうまく使
い分けましょう。
17.1
ちょっと道草
少し前で a の n 乗を求める関数 power() を作りました。しかしこの関数では構造上の
理由から実数乗の値を求めることはできません。実数乗を求められるようにしたい場合
は、math.h の中で定義されている数学関数 log() と exp() を組み合わせて作ります。
To be continued. . .
TSG 部報 No. 199
33
初心者のための 8086 講座
初心者のための 8086 講座
第2回
高野
どうも高野です。
95 でこの原稿のデータをぶっ飛ばされてしまいました。(T_T)
やはり 8MB で 95 なんぞを使ったのが悪かったらしい。
貧乏人は損じゃのう.
.
.
.
¶
µ
³
どのようにデータが格納されているのか?
´
前回パソコンはメモリにデータを格納するとき 2 進法で記憶させていると書きました
が、そのことについて、もう少し詳しく説明してみたいと思います。2 進法とは 0 と 1 に
よってすべての数を表現することです。パソコンではこの 1 と 0 を電気が有るか無いか
で判断しているのです。たとえば■を 1、□を 0 とした場合、
データ アドレス
□□■□■■□□ 01H
□■■■□□□■ 02H
■■□■□■■□ 03H
□□■□■□□□ 04H
■□□■■■□□ 05H
□□□■□□□■ 06H
上の表を参考にしてみると、アドレスが 04H のデータは 00101000 です。このように
8 ビットを一つの単位としてとらえ、これを 1 バイトと呼ぶわけです。
¶
µ
³
アセンブラ言語
´
前回マシン語は 16 進法で表すことが一般だと書きましたが、よっぽどコンピュータに
精通している人でない限り内容を理解することは不可能です。
(いにしえのプログラマで
34
TSG 部報 No. 199
初心者のための 8086 講座
Z80 のマシン語をすべて 16 進法で暗記していた人が存在したらしい. . . )そこで、人間
がマシン語を扱う場合には、マシン語と一対一に対応したアセンブリ言語というモノを
使います。たとえばマシン語で B01A とはアセンブリ言語で示すと「MOV AL,1A」で表
されます。マシン語には 1 つ 1 つ記号が割り当てられており、その記号のことをニーモ
ニックと呼びます。
(たとえば今さっき例に挙げた MOV など)ニーモニックからマシン
語に変換する作業のことをアセンブルといいます。この逆の作業を逆アセンブルまたは
ディスアセンブルといいます。
¶
³
データ転送命令
µ
´
データ転送命令とは 8 ビットまたは 16 ビット単位で CPU を通してデータのやりとり
をする命令のことです。データ転送命令でもっともよく使われるのは MOV です。
MOV <受け取る側>,
<送り出す側>
(レジスタ、メモリ) (レジスタ、メモリ、数値)
MOV は右側で指定したデータを左側のデータ格納場所に移動させる、すなわち「転
送」する命令です。データの移動する向きは「右から左」です。送り出す側はデータが
転送された後にも、はじめのデータが残ります。
メモリからレジスタにデータを転送するときのことを「ロード」
レジスタからメモリにデータを転送することを「ストア」
と、言います。
例をあげて説明していきましょう。
16H をいう数値を AL レジスタに転送したいとき
MOV AL,16H
オフセットアドレス(オフセットアドレスの解説は前号を見て下さい)
「0541H」に AL
レジスタの内容をストアしたいとき
MOV [0541H],AL
ここで注意してもらいたいのは受け取る側に [] がついているところです。これをつ
けることで数値とアドレスを分別しているのです。だからこの場合「MOV 0541H,AL」は
意味をなさなくなり、また「MOV AL,16H」と「MOV AL,[16H]」とでは全く意味が違う
と言うことです。後者はオフセットアドレスが 0016H のメモリのデータを AL に転送す
るという意味です。
TSG 部報 No. 199
35
初心者のための 8086 講座
次は 1 ワード、つまり一度に 16 ビット取り扱う場合です。1 ワードの 1A56H という
データを AX レジスタに転送するには
MOV AX, 1A56H
となります。1 バイトの時と同じです。1AH は AH に入り、56H は AL に入ります。
逆にレジスタからメモリにストアする場合も 1 バイトの時と変わらないのですが、デー
タの格納のされ方に注意する必要があります。というのも、8086 系 CPU の特徴として
「メモリ上のデータは実際のデータの上位バイトと下位バイトとが入れ替わる」のです。
詳しく説明すると
MOV [0123H],AX
という命令を CPU に与えたとします。このとき AX のデータは 16 ビットですから、
オフセットアドレスが 0123H と 0124H のメモリに格納される訳です。このとき AH(上
位バイト)は 0124H に AL(下位バイト)は 0123H に格納されます。
AX レジスタから BX レジスタの値をオフセットアドレスとしてメモリへストアしたい
とき
MOV [BX],AX
ここでは [] を使うことで、BX に直接 AX から転送するのではなく、BX レジスタの
指し示した(ポインティングした)メモリへ AX の内容を転送します。この考え方は実
は C 言語でいうところのポインタそのものなのです。(ポインタについては部長の記事
を参照して下さい1) )これの応用として、
MOV [BX + 5],AX
とすることで、BX から 5 番目のメモリに AX のデータを転送することもできます。
さて以上で大体 MOV 命令の特徴がわかっていただけたでしょうか?MOV 命令はマ
シン語のプログラムを組む上でもっともよく使う命令なので、しっかり理解して下さい。
ところでデータの格納場所はご存じの通りレジスタとメモリの 2 種類があります。レ
ジスタにも前号で書いたように特殊なモノもあり、なかでもセグメントレジスタは操作
が制限されています。例えば、CS(コードセグメント)は MOV 命令を使って直接書き
込むことはできません。よってセグメントレジスタは他のレジスタと区別して扱います。
データ転送は「セグメントレジスタ、その他のレジスタ、メモリ」という 3 つのデー
タ格納場所とデータそのものを様々に組み合わせて行うことができます。たとえば、
MOV AL,0AAH
MOV [0123H],AL
は一つの命令に書き直すことが可能で、
MOV [0123H],0AAH
と数値を直接メモリに書き込むことができます。
しかし、
1) 編注:おーい、部長のポインタの説明は次回以降だぞー
36
TSG 部報 No. 199
初心者のための 8086 講座
MOV AL,[0123H]
MOV [3210H],AL
を
MOV [3210H],[0123H]
と書き直すことはできません。
このようにデータを転送できる組み合わせが決まっています。この組み合わせのこと
をアドレッシングモードといいます。
• レジスタ (AX,BX,CX,DX,SI,DI,BP,SP)
• データ (10H,1234H 等)
• セグメントレジスタ (CS,DS,ES,SS)
• メモリ ([01234h] [45ACH] 等)
とするとき
• レジスタ ←→ レジスタ
• データ −→ レジスタ
• データ −→ メモリ
• セグメントレジスタ ←→ レジスタ
• レジスタ ←→ メモリ
• セグメントレジスタ ←→ メモリ
以上の様な組み合わせが可能です。
(ただし CS レジスタに値を転送することはできま
せん)
レジスタを使ったアドレス指定を先に少しだけ説明しましたがここでもう少し詳しく
説明します。たとえば MOV AX,[BX+5] とした以外にも MOV AX,[BX+SI+5] と書くこと
もできます。ここでの「5」の値のことをディスプレーメントといいます。ここでもアド
レッシングモードの時と同じく、レジスタとディスプレーメントの組み合わせに制限が
あります。
レジスタとディスプレーメントの組み合わせ
• (BX,BP) + ディスプレーメント
例: [BP+1]
TSG 部報 No. 199
37
初心者のための 8086 講座
• (SI,DI) + ディスプレーメント
例: [SI+6]
• (BX,BP) + (SI,DI) + ディスプレーメ
例: [BX+DI+4], [BP+SI+6], [BX+DI+7]
ちなみにディスプレーメントで指定できる値は 1 バイトまたは 1 ワードです。
¶
µ
³
算術演算命令
´
前号で説明したように CPU にはデータの各種演算をやる機能が用意されています。こ
の各種演算はレジスタやメモリの中で行われるのでは無くて、実際には ALU (Arithmetic
and Logic Unit) と呼ばれている演算部で行われます。演算の対象となるレジスタやメモ
リからデータをこの ALU に転送して、結果をメモリやレジスタに転送するのです。その
時演算の結果だけではなく、その結果が 0 であったか負の数であったか等の状態を CPU
内のフラグレジスタにセットします。ここでは 8086 のもつ算術演算命令の説明をしま
す。算術演算命令もデータ転送命令と同様にアドレッシングモードが決まっています。
加算減算命令
はじめに足し算をしてみましょう。足し算の命令は
ADD <足したい数>, <足したい数>
です。計算結果は左側に入りますので、左側には必ずレジスタかメモリを指定してや
らなくてはなりません。
(以後レジスタと言ったらセグメントレジスタ以外のモノを指す
ことにします。)例えば AL レジスタに 1 バイトのデータ 2AH を加算する場合
ADD AL,2AH
と書きます。AL に最初 11H が入っていた場合、この命令の後には AL には 3BH が
入っていることになります。
次に引き算ですが、これも簡単で
SUB <引かれる数>, <引く数>
です。AL レジスタからオフセットアドレスが 1234H に格納されているデータで減算
するとき、
SUB AL,[1234H]
です。この場合も計算結果が AL レジスタに格納されることは言うまでもありません。
38
TSG 部報 No. 199
初心者のための 8086 講座
次はインクリメントとデクリメントです。この二つの言葉はあまり聞かれない言葉で
すが、インクリメントとはレジスタを +1、デクリメントとはレジスタを −1 することを
言います。ここでなぜこんな命令が必要なのか疑問に思う方がいるかもしれません。単
純に ADD 命令を使えばいいような気もします。しかし、マシン語のプログラミングで
は +1 や −1 を頻繁に行います。そこで、ADD 命令よりも高速な(つまりクロック数が
少ない)この命令を使います。これによって実行効率を高めるわけです。インクリメン
トの命令は
INC <数を一つ増やしたいレジスタ>
とします。
INC AL
は
ADD AL,1
と同じ意味です。同様にしてデクリメントの命令は
DEC <数を一つ減らしたいレジスタ>
と書きます。
それでは復習として少しマシン語で書いたプログラムを書いてみましょう
MOV
MOV
INC
MOV
DEC
ADD
SUB
BL,34H ;BL レジスタに 1 バイトデータ 34 をロード
AL,BL ;AL レジスタに BL レジスタに転送
AL ;AL をインクリメント
[A123H],AL ;AL レジスタのデータをストア
BL ;BL をデクリメント
AL,BL ;AL と BL を足す
AL,BL ;AL から BL を引く
なんかあまり意味のないプログラムですね (^_^;
2 つのデータを比較する命令をコンペア命令、比較命令といいます。具体的に何をや
るかというと、引き算をやるのですが、引き算の結果そのものをメモリやレジスタ上に
は残しません。じゃあいったいなんのための命令かわかりません。そこでこの算術演算
命令の項のはじめで述べたことを思い出して下さい。ALU で計算された時に一緒にその
演算結果の状態をフラグレジスタに保存されると言うことを書きました。そうです、こ
の比較命令はこのフラグレジスタに状態を保存する命令なのです。
ここで詳しくフラグレジスタの説明をしておきましょう。フラグレジスタとは読んで
字の如く「旗」レジスタなのですが、このレジスタにはビットごとに意味を持っていて、
個々のビットごとつまりフラグごとに単独に動作します。そのため他のレジスタのよう
に 16 ビットのレジスタとしてプログラムから自由に操作することができません。フラ
グを 1 にすることを「セット」するといい、0 にすることを「リセット」または「クリ
ア」と言います。フラグレジスタのビットごと(フラグごと)の持つ意味を下の表に書
きます。
TSG 部報 No. 199
39
初心者のための 8086 講座
フラグレジスタ
■ ■ ■ ■ OF DF IF TF SF ZF ■ AF ■ PF ■ CF
OF
オーバーフローフラグ
符号付き演算で桁あふれが生じたときに
セットさせる。
DF
ディレクションフラグ
ストリング操作命令においてポインタの
IF
インタラプトイネーブ
セットすると外部割込を受け付けなくな
増減方向を示す。
る。
TF
トラップフラグ
シングルステップモードで実行するとき
のフラグ
SF
サインフラグ
演算結果の符号を表す。負ならばセット
される。
ZF
ゼロフラグ
演算結果がゼロであればセットされる
AF
補助キャリーフラグ
BCD 演算で使用されるキャリーフラグ
PF
パリティーフラグ
演算の結果、1 となるビット数が偶数の
時セットされ、奇数の時クリアされる
CF
キャリーフラグ
演算の結果、桁上がりが生じた場合にセッ
トされる
一つのフラグ 1 ビットです。■は何も役割を割り当てられていないことを示しています。
「ストリング命令」とか「シングルステップモード」とか聞き慣れない言葉が出てき
ますがここではあまり気にしないで下さい。
フラグレジスタはこのように命令ごとに影響を受けるフラグが決まっています。もち
ろんフラグに何も影響を与えない命令も存在します。
さて話を比較命令に移して考えて見ましょう。比較命令は
CMP <比較されるデータ>, <比較するデータ>
比較されるデータから比較するデータを減算しその結果は保存されませんが、フラグ
レジスタには保存されます。比較命令の場合は SF,ZF,PF が変化します。この比較命令
は単独では使用されず、
「条件分岐命令」と組み合わせて使用されます。具体的な使用法
は「条件分岐命令」のところで解説します。
乗除算命令
乗除算命令は他の演算とは異なり使用できるレジスタが決まっています。使用できる
レジスタは AX レジスタまたは AL レジスタです。DX レジスタも使われることもあり
ます。
かけ算の命令は
40
TSG 部報 No. 199
初心者のための 8086 講座
MUL <掛ける数>
掛ける数が 8 ビットの時は AL とかけ算をし、その結果を AX に転送されます。掛け
る数が 16 ビットの時は AX とかけ算をし、結果を上位ビットを DX に、下位ビットを
AX に転送します。たとえば
MUL BX
とかけば AX とかけ算をし、その結果を DX と AX に転送するわけです。
わり算の命令は
DIV <割る数>
割る数が 8 ビットの場合は AX レジスタをわり算し、商を AL レジスタに、余りを AH
レジスタに転送します。割る数が 16 ビットの時は DX を上位 16 ビットにし AX を下位
16 ビットとして、割られる数を 32 ビットにしわり算をします。その後、商を AX レジ
スタに、余りを DX レジスタに転送します。MUL,DIV ともに割る数にはレジスタ、数
値、メモリのオフセットアドレスを指定してやることができます。
¶
µ
³
PTR 演算子
´
さて上で見たように乗除算の命令では指定するデータの大きさによって、命令の意味
が異なってくることがわかりました。直接値やレジスタの場合は 8 ビットか 16 ビットか
はっきりしているので問題はないのですが、メモリを対象としオフセットアドレスを指
定した場合 1 バイトなのか 1 ワードなのかはっきりしません。そのことは明確にするた
めにアセンブラ言語では「PTR 演算子」なるモノを利用します。
BYTE PTR [オフセットアドレス]
WORD PTR [オフセットアドレス]
前者はバイト単位のデータをメモリから読み出し、後者はワード単位(つまり 2 バイ
ト)でデータを読み出します。例えば
INC [0123H]
ではだめで
INC BYTE PTR [0123H]
または
INC WORD PTR [0123H]
としなければなりません。
またデータ転送命令等の場合も同様です。
MOV [0FFFH], 3AH
これは一見あっているようですが、実はエラーが出るのです。
TSG 部報 No. 199
41
初心者のための 8086 講座
MOV BYTE PTR [0125H],3AH
または
MOV WORD PTR [0125H],3AH
としなければなりません。前者は納得行きますが、後者はなにかおかしな気もします。
しかし、[0126H] には「00H」がはいるのです。
42
TSG 部報 No. 199
文字コードの話
文字コードの話
短期集中連載 第 1 回
早坂くりす
¶
³
はじめに
µ
´
ASCII だけで用が足りるアメリカと違って、私たちは日本語を扱わなくてはならないた
め、より深く文字コードの問題と関わらざるをえません。それでも、MS-DOS/Windows
や Mac を使う限りでは、ASCII とシフト JIS(たまに JIS) を知っていれば済みますが、
UNIX やインターネットを使い始めると、JIS・EUC・シフト JIS とさまざまな日本語コー
ドに頭を悩ませることになります。さらに最近は Unicode も登場し、Windows95/NT の
内部コードとして実際に使われ始めています。
その他にも、文字コードに関してはいろいろ疑問があることと思います。
• 日米で円記号とバックスラッシュが違うのはなぜか?
• JIS コードのエスケープシーケンスはどれが正しいの?
• EUC の半角カタカナはなぜ 2 バイト?
• 非日本語端末で表示されるへんなアルファベットの正体は?
こういった問題に対処するには、文字コードに関する体系的な理解が必要となります。
なお、この連載では、とっつきにくさを避けるため、最初のうちは未定義の用語や必
ずしも厳密でない説明を用いることがありますので、正しい理解のためには必ず最後ま
で読んでください。(^_^)
¶
µ
³
1
日本語のコード体系
´
この章では、もっとも身近な日本語のコード体系について概観します。
昔 (1970 年代まで) は各メーカーごとにさまざまなコード体系が使われていましたが、
1978 年に JIS 漢字が制定されてからは、これに基づいたコード体系が完全に主流となり
ました。
TSG 部報 No. 199
43
文字コードの話
1.1
JIS コード
インターネットで日本語のメールやネットニュースに使われているコード体系です。
制御コード
0x00∼0x1F、0x7F
ASCII 文字
0x20∼0x7E
カタカナ
0x21∼0x5F (7 ビット) / 0xA1∼0xDF (8 ビット)
漢字
0x2121∼0x7E7E
(第 1 バイト・第 2 バイトとも 0x21∼0x7E)
補助漢字
0x2121∼0x7E7E
(第 1 バイト・第 2 バイトとも 0x21∼0x7E)
ASCII とカタカナを基本とし、漢字が追加されています。ASCII と漢字のコード範囲
が重複するため、以下のようなエスケープシーケンスによって切り替えます。
漢字の開始
ESC $ @ または ESC $ B
ASCII の開始
ESC ( B または ESC ( J
補助漢字を含めることも可能であり、補助漢字の開始のシーケンスは ESC $ ( D とな
ります。
また、7 ビットの環境では、カタカナもこれらと重複するため、制御コードまたはエ
スケープシーケンスで切り替えます。
カタカナの開始
SO (0x0E) または ESC ( I
ASCII の開始
SI (0x0F) または ESC ( B または ESC ( J
このようにカタカナも 7 ビットで表現するものを俗に 7 ビット JIS と呼び、これに対
してカタカナを 8 ビットで表現するものを俗に 8 ビット JIS と呼びます。
JIS コードの利点の一つは、7 ビットの通信路でも伝送できることです。未だに 7 ビッ
トの伝送路が少なくないインターネットの世界で使われている理由もここにあります。
しかし、エスケープシーケンスの存在が厄介ですので、コンピュータ内部のデータ処理
ではあまり使われません。
なお、98 の N88 日本語 BASIC や、PC-PR 系プリンタなどでも同様のコードが使わ
れていますが、エスケープシーケンスが “ESC K” と “ESC H” という独自のものになっ
ています。これは通称 NEC JIS と呼びます。
1.2
シフト JIS (MS 漢字コード)
パソコンでおなじみのコード体系です。一部の UNIX(NEWS-OS、HP-UX など) でも
採用されています。その起源は、日本最初の 16 ビットパソコンである三菱 Multi16 にさ
かのぼります。Multi16 に CP/M-86 の日本語対応版を搭載するにあたって、処理の容易
なコードとしてマイクロソフトなど数社が策定したのがシフト JIS です。
44
TSG 部報 No. 199
文字コードの話
制御コード
0x00∼0x1F、0x7F
ASCII 文字
0x20∼0x7E
カタカナ
0xA1∼0xDF
漢字
0x8140∼0x9FFC、0xE040∼0xFCFC
(第 1 バイト: 0x81∼0x9F、0xE0∼0xFC
第 2 バイト: 0x40∼0x7E、0x80∼0xFC)
8 ビットパソコンで広く使われていた ASCII とカタカナをそのまま継承し、なおかつ
JIS コードのようなエスケープシーケンスを使わずに漢字を混在させるために、所定の
計算式によって JIS 漢字コードを変換しています。
漢字の第 1 バイトは ASCII やカタカナと重複しないように配置されており、第 1 バイ
トを見ただけで文字種がわかるようになっています。漢字の第 2 バイトについても、区
切り文字として使われることの多い ASCII の 0x20∼0x3F や、制御コードである 0x7F
と重複しないようになっています。また、画面上では ASCII やカタカナと漢字の幅の比
率は 1:2 であることが多いですが、文字コードのバイト数もこれと同じく 1:2 になって
います。このような特長のため、特別にシフト JIS に対応していないシステム上でもな
んとか日本語を通せる場合が少なくありません。
欠点としては、コード空間に余裕が少なく拡張性に乏しい (例えば、補助漢字を入れ
るスペースがない) こと、第 2 バイトに含まれる 0x40∼0x7E のコード (特に、ASCII の
バックスラッシュ \ にあたる 0x5C) が問題となる場合があること、MSB が落ちたとき
の復元が困難なこと、などがあげられます。
1.3
日本語 EUC
UNIX の日本語環境でよく使われるコード体系です。EUC は Extended UNIX Code
の略で、UNIX の多言語対応の一環として制定されました。EUC には日本語 EUC の他
に中国語 EUC、韓国語 EUC などもあります。日本語 EUC のことを UJIS (Unixized
JIS) とも呼びます。
制御コード
0x00∼0x1F、0x7F
ASCII 文字
0x20∼0x7E
漢字
0xA1A1∼0xFEFE
(第 1 バイト・第 2 バイトとも 0xA1∼0xFE)
カタカナ
0x8EA1∼0x8EDF
補助漢字
0x8FA1A1∼0x8FFEFE
(第 2 バイト・第 3 バイトとも 0xA1∼0xFE)
JIS やシフト JIS との大きな相違点は、カタカナが冷遇されていることです。JIS 漢字
コードの各バイトの MSB を 1 にすることにより漢字を導入したため、これと重複する
TSG 部報 No. 199
45
文字コードの話
カタカナは補助的な扱いとなり、0x8E のプレフィクス付きの 2 バイトコードになって
います。また、0x8F のプレフィクスにより補助漢字も表現でき、これは 3 バイトになり
ます。
特長としては、エスケープシーケンスがない、第 1 バイトを見ただけで文字種がわか
る、漢字の第 2 バイトが ASCII と重複しない、ASCII と漢字のバイト数の比率が文字の
幅と一致する、などシフト JIS と類似した点に加えて、JIS とのコード変換が容易なこ
とがあげられます。
ただし、バイト数はカタカナや補助漢字まで考慮すると複雑となります。事実、EUC
を採用したシステムでも、補助漢字までサポートしている例は非常に少なく、カタカナ
のサポートもつい最近まではなおざりにされてきました。日本のインターネット上では、
今に至るまでカタカナの使用がタブーとされていますが、これは、EUC を採用しながら
カタカナをサポートしていないシステムが多かったためでもあります。
他の欠点としては、シフト JIS よりマシとはいえ拡張性に限界があること、結果的に
シフト JIS と似て非なるものとなってしまい日本語コードの混乱を助長してしまったこ
と、などです。
¶
³
2
µ
ASCII と 1 バイト文字コード
´
この章は、ASCII と、それをベースにした 1 バイト文字コードについて、詳しく見て
いきます。
2.1
ASCII (American Standard Code for Information Interchange)
おなじみ ASCII は 7 ビットの文字コードであり、その構成は次のようになっています。
0x00∼0x1F
制御文字 (control characters)
0x20
空白 (SP)
0x21∼0x7E
図形文字 (graphic characters)
0x7F
制御文字DEL (delete)
制御文字とはいわゆるコントロールコードのことです。図形文字というと●とか▲と
か ♥ とか罫線とかを思い浮かべるかもしれませんが、そうではなくて、アルファベット・
数字・記号などの「目に見える形をもった」普通の文字のことです。空白は制御文字と
も図形文字ともみなすことができます。個々の制御文字や図形文字の詳細については割
愛しますが、図形文字で特に注意を要するのは次のコードです。
46
TSG 部報 No. 199
文字コードの話
0x5C
バックスラッシュ「\」 (≠円記号)
0x7C
縦棒「|」 (≠破線)
0x7E
チルダ「~」 (≠オーバーライン)
ASCII はあくまで 7 ビットですので、0x80∼0xFF は含まれません。パソコンのマニュ
アルなどを見ると、0x80∼0xFF にカタカナやら何やらが入ったものを「ASCII コード
表」と称していることが多いですが、これはまちがいです。
余談ですが、制御文字の中でDEL だけ 0x7F なんていうところに飛ばされているのは
なぜでしょうか? これは、データ入力媒体として紙テープを使っていたころの名残だと
いわれています。紙テープでは、所定の位置に穴を空けてあるかどうかによって 2 進数
の 1/0 を区別します (SunOS の ppt(6) を参照)。1 文字は 7 ビットですから、7 つの位
置の穴の有無で 1 文字を表します。で、もし穴を空けるときにまちがってしまった場合、
穴をふさぐのは面倒ですので、そのまちがいを含む 7 ビット分全部の穴を空けて「この
字はまちがいだから削除ね」ということにしていました。つまり、
「削除」→「全ビット
1」→「0x7F」というわけです。
2.2
ISO 646
ISO (International Standardization Organization、国際標準化機構) では、国際的な
工業規格を策定しています。コンピュータに関係のある標準化団体はいくつかあります
が、ISO はその代表的なものの一つです。フロッピーディスク、CD-ROM、MO ディス
クなども ISO の規格になっており、機種を超えて互換を保てるようになっています。
文字コードに関しても ISO 規格は中心的役割を担っています。まずは ISO 646 という
規格の登場です。これは、もともとアメリカ/英語用の規格である ASCII を、他の国/言語
用に一部変更できるようにしたものです。サンプルとして IRV (International Reference
Version) というものを用意しておき、これを各国が自国の規格として採用するとき、そ
の中の一部のコードに関しては違う文字を割り当ててもよい、というふうになっていま
す。実際には IRV は ASCII と同じものです (数年前までは違っていた)。
IRV のうち、文字の割り当てを変更することが認められているコードは次の 12 個で
す。参考として、IRV(ASCII) で割り当てられている文字を併記します。
0x23
#
0x5C
\
0x7B
{
0x24
$
0x5D
[
0x7B
|
0x40
@
0x5E
^
0x7B
}
0x5B
[
0x60
‘
0x7B
~
ISO 646 のアメリカ版すなわち ASCII では、これらの文字はそのままですが、ISO
646 の各国版を見てみると、これらのコードに割り当てられている文字がそれぞれ違っ
ています。例えば、ヨーロッパの多くの言語では、アクセント記号付きの文字が必要な
TSG 部報 No. 199
47
文字コードの話
ので、それらをここに割り当てています。また、これだけでは足りない場合は、制御文
字 BS(backspace) を使い、合成文字として表現することを認めています。例えば、â 表
現する場合は、^ BS a となります。
_
ISO 646 の日本版は、IRV の 0x5C を円記号 (Y
=) に、0x7E をオーバーライン ( ) に
したものです。これは JIS X 0201 という JIS 規格になっており、JIS ローマ文字集合
(JIS Roman) と呼ばれています。国産のコンピュータはたいていこれを採用しているた
め、0x5C が円記号に、0x7E がオーバーラインになっているというわけです。ただし、
NEC の PC シリーズとその互換機に関しては、0x7E は IRV と同じチルダになってお
り、0x7C は IRV とも JIS X 0201 とも違う「破線」になっています。この結果、PC シ
リーズの 0x21∼0x7E の図形文字集合は、ISO 646 のどの版とも一致しない独自のもの
になっています (ついでに言うと、古いマシンでは 0x60 が空白になっている)。
ところで、シリアルプリンタを持っている人は、マニュアルのディップスイッチの項を
見てください。「各国文字の選択」という設定で、日本・アメリカ・イギリス・ドイツ・
スウェーデンなどの選択肢があると思います。これはまさしく ISO 646 の各国版を切り
替えていることに他なりません。
ISO 646 のこのような仕組みは、コンピュータのメモリや通信路が限られていた時代
に、7 ビットという狭いコード空間でなんとかやりくりするためのものだったわけです
が、当然の結果として、同じコードでも各国版によって表現する文字が違ってしまうと
いう問題があります。JIS X 0201 におけるバックスラッシュと円記号の違いはみなさん
もご存じの通りです。
しかし、日本ではその程度ですからまだ我慢できますが、上記のコードにアクセント
記号付きアルファベットなどを割り当ててしまった国ではそれどころではありません。
特に C や UNIX では上記の記号を多用しますが、これらがすべて「ü」やら「é」やらに
なってしまっているのです。これではとても C や UNIX を使ってはいられません (この
問題に熱心なのはデンマークで、これらの記号を使わずに C を記述するための代用記法
トライグラフを提唱しています)。
最近は、ASCII をもとにした ISO 8859-1 (後述) などの 8 ビットコードを使えるシス
テムが一般化したため、7 ビットでしかも一国でしか通用しない ISO 646 各国版にこだ
わる必要もなくなってきました。そのため、ISO 646 各国版は (日本を除いて) 流行らな
くなりつつあり、ASCII をそのまま使うケースが多くなっています。
2.3
8 ビットコード
ラテンアルファベットを使うヨーロッパ諸語 (英独仏など) は、ISO 646 でもなんとか
表現できます。しかし、ロシア語・ギリシア語・日本語などの、文字体系が全く異なる
言語は表現できません。かといって、アメリカ/英語/ASCII がコンピュータ界を支配し
ている現状を考えると、ISO 646 を排除して独自のコードを使うのは現実的ではありま
48
TSG 部報 No. 199
文字コードの話
せん。したがって、ISO 646(または ASCII) を 8 ビットに拡張し、0x80∼0xFF に文字
を追加しようという考えが生まれます。
その一つが、これもおなじみ JIS カタカナです。前述の JIS X 0201 では、ISO 646 の
日本版を定めると共に、これを 8 ビットに拡張し、0xA1∼0xDF にカタカナを入れまし
た。つまり、JIS X 0201 の左半分 (0x00∼0x7F) は ISO 646 日本版で、右半分 (0x80∼
0xFF) は日本独自規格のカタカナというわけです。当時はまだコンピュータで漢字を扱
うのが容易でなかったため、この規格は広く受け入れられました。
一方、欧米のコンピュータでも、ASCII を 8 ビットに拡張して、そこにアクセント記
号付きアルファベットや罫線を入れるようになりました。
パソコンの世界では、IBM PC の普及にともなって PC のコードが有力になりました。
DOS のマニュアルにあるコードページ 437、Windows における OEM コードセットとい
うコードです。これの右半分には、アクセント記号つきラテンアルファベット・罫線・各
種記号が入っています。しかし、言語によってはこれでも不十分なので、EGA や VGA
では右半分が PCG (死語 :-) ) になっており、ここのフォントを入れ換えることができ
るようになっています。こうして、IBM PC のコードにはコードページと呼ばれるいくつ
もの変種ができました。これらも DOS のマニュアルに載っています。なお、Macintosh
は IBM PC とはまた違った拡張コードを持っています。
コードページ
名称 (言語)
文字種
437
IBM PC 基本
ラテン文字
850
多言語 (西欧諸語)
ラテン文字
852
スラブ (東欧) 語
ラテン文字
857
トルコ語
ラテン文字
860
ポルトガル語
ラテン文字
861
アイスランド語
ラテン文字
863
カナダフランス語
ラテン文字
865
北欧語
ラテン文字
869
ギリシア語
ギリシア文字
932
日本語
カタカナ (JIS X 0201)
また、ISO でも ASCII をベースとした 8 ビットコードの規格をいくつか制定しまし
た。その中でも有力なものが、ISO 8859 という規格です。これも IBM PC 同様、ASCII
を左半分に持ついくつもの変種 (現在 10 個) からなっています。
TSG 部報 No. 199
49
文字コードの話
図 1: JIS X 0201 のコード配列
50
TSG 部報 No. 199
文字コードの話
ISO 8859-1 (Latin-1)
ラテン文字
西欧諸語
ISO 8859-2 (Latin-2)
ラテン文字
東欧諸語
ISO 8859-3 (Latin-3)
ラテン文字
エスペラントなど
ISO 8859-4 (Latin-4)
ラテン文字
ISO 8859-5
キリル文字
ロシア語など
ISO 8859-6
アラビア文字
アラビア語
ISO 8859-7
ギリシア文字
ギリシア語
ISO 8859-8
ヘブライ文字
ヘブライ語
ISO 8859-9 (Latin-5)
ラテン文字
トルコ語など
ISO 8859-10 (Latin-6)
ラテン文字
北欧語など
このうち ISO 8859-1、通称 Latin-1 が広く使われています。ワークステーションのコ
ンソール画面や xterm などで 8 ビットコードを表示させると出てくるのが、この Latin-1
です。また、Windows も「ANSI キャラクタセット」という名前で Latin-1 を正式採用
しました。それ以外の ISO 8859 シリーズは、一応国際規格ではありますが、それぞれ
の言語のコミュニティの外ではあまり目にすることはありません。
IBM の各コードページや ISO 8859 のそれぞれは、ISO 646 よりもずっと多くの文字
を含んでいますので、適用範囲も広く、一つのコード表を複数の国・言語で共通に使う
ことが可能です。たとえば、Latin-1 だけで英語・ドイツ語・フランス語など西欧の主要
言語をカバーすることができます。
しかしまた、ラテン文字のコード表がいくつもあることに気がつくでしょう。これは、
アクセント記号付きラテン文字の種類が多すぎて、一つのコード表に入り切れなかった
結果です。また、ギリシア文字のようなまったく異なる文字を入れる余地もないので、こ
れまた別のコード表になっています。どうしても混在させたければコード表を切り替え
るしかありません。この問題は、8 ビットというコード空間が本質的に狭すぎるのが原
因であり、複数の国や言語で共通に使えるとはいっても、その範囲は自ずから限られて
しまいます。
とくに 8859 の場合、当初の目標では、646 各国版のようなわずらわしさを避けるため
に、コード空間を広げた代わりに合成文字を廃止して 8 ビット固定長にしたのですが、
結局は似て非なるコード表がいくつもできてしまい、言語によって切り替えて使わなく
てはならないという、646 とたいして変わらない状況に陥ってしまいました。
なお、ISO の 8 ビットコード (8859 に限らず) は、次のような構成になっています。
0x00∼0x1F
制御文字の領域
0x20∼0x7E
ASCII 図形文字
0x7F
制御文字 DEL
0x80∼0x9F
制御文字の領域
0xA0∼0xFF
追加の図形文字
TSG 部報 No. 199
51
文字コードの話
図 2: Latin 1 のコード配列
52
TSG 部報 No. 199
文字コードの話
図 3: ヘブライ文字 ISO 8859-8 のコード配列
TSG 部報 No. 199
53
文字コードの話
つまり、右半分にも左半分同様に制御文字の領域があるということです。これについ
ては ISO 2022 の解説に譲ります。
今後の章目次
第 3 章: JIS 漢字コードと符号化法
3.1 JIS X 0208
3.2 JIS X 0212
3.3 符号化文字集合 (coded character set)
3.4 エンコーディング法 (encoding method, encoding scheme)
第 4 章: ISO-2022
4.1 ISO 2022 の考え方
4.2 7 単位系の指示と呼び出し
4.3 ISO 2022 で使える文字集合
4.4 呼び出し:ロッキングシフトとシングルシフト
4.5 8 単位系の指示と呼び出し
4.6 ISO 2022 の制御機能
4.7 ISO 2022 の運用
第 5 章: ISO 2022 の実例
5.1 EUC
5.2 JIS エンコーディング (JUNET コード、ISO-2022-JP)
5.3 シフト JIS
5.4 ISO 8859、JIS X 0201 など
5.5 C1 制御文字
第 6 章: 中国語・韓国語の文字コード
6.1 GB 2312
6.2 Big-5 と CNS 11643
6.3 KS C 5601
6.4 組合せ型ハングルコード
第 7 章: ISO 10646 と Unicode
7.1 ISO 10646 成立の経緯
7.2 UCS の構造と特徴
7.3 UTF
54
TSG 部報 No. 199
TSG 用語の基礎知識 Ver. 1.0
TSG 用語の基礎知識 Ver. 1.0
ZERO
[47 項目収録]
あいとうくん [相藤君] (人名) italk 上に存在する人工無能。彼の主食は italk のログである。このため、一昔前に
流行った人工無能 (相藤君は人工無能なのだが) の如く、italk を利用している人間
の生き写し (笑) となる。最近相藤君の言動が「あやしい」と思ったあなた、責任
の一端はあなたにもあるのです。
相藤君のお友達には中継君や伝言君がいる。[→ italk]
あつい [熱い] (形容詞) 1. 何かに燃えている様子を指す。その燃えているものがあやしければあやしいほ
ど体感温度は高くなる (笑) TSG 内では「○インスイーパー」や「せらだ○」が有
名。また、G や T の「ぷよ○よ」の熱さは、TSG の風物詩となっている。[→ そ
れぞれの項目を参照]
2. 夏の学館 305 の状態。もはや「暑い」を通り越している。昨年、基金によって
扇風機が導入されたのだが……
いぬ。びーびーえす [いぬ。BBS] (固有名詞) 自宅で通信をしている TSGer ならほとんどの人物が入っている (と思われる) BBS。
但し、TSGer オンリーのネットというわけではないので注意。しかし、その構成
人員の偏り (^^; から TSG に関する連絡はここを通して行われることが多く (ほ
かに news や情報棟メールでも行われるが)、特に長期休暇中やテスト中などに重
宝するので、通信ができる環境が整っているのなら入った方が良い。
どういうネットかはゲストログインして自分の目で確かめること。
インターネット (名詞) 1. 概念の良くわからない物 (笑) この辺の話はいぬ。BBS の過去ログ参照のこと。
2. サークルオリの際副○長や一部コン○委員が「インターネットに興味のある方、
始めたい方、きれいなホームページを作りたい方」と宣伝を行い隣のアマチュア○
線部に「そんなメジャーなものまで使うなんて卑怯だ」と言わしめたが、TSG の
部室からは現在インターネットへの接続は行えない (爆)
TSG 部報 No. 199
55
TSG 用語の基礎知識 Ver. 1.0
但し、詳しい人はたくさんいるので (例えば誰とはいわないが編○長とか) 聞きま
くればちゃんと使えるようになる。大体、ああいう物は危険でない範囲 (重要!) で
自分で積極的にいじって覚える物だ (と筆者は思うのだが、うまく行かないよね)。
うらのらいぶらりあん [裏のライブラリアン] (固有名詞) こういう役職が存在するわけではなく、便宜上こう呼んでいる。実体は、単に部室
の Trade MO のバックアップをとっている人間のことである。但し、勝手に整理
を行っているので余り役には立たないらしいが (爆)、万が一の時には何かの役に
は立つかもしれない。
裏のライブラリアンには、もう一つ別の仕事があるとされているが、明らかにはさ
れていない (謎) [→ 影のライブラリアン・ライブラリアン]
うらわれっず [浦和レッズ] (固有名詞) 言わずと知れた浦和がホームタウンのサッカーチーム。何でこんな所に出るのかわ
からないって? それは、部室でレッズをバカにすると大変なことが起こるからなの
だ (やや嘘) G は駒沢の年間チケットを買うほどのレッズ狂なのだ。さわらぬ神に
祟りなし。
しかしながら、大宮市民のくせにグランパスファンの H にとってはレッズはただ
のお得意さま (笑) であり、部室のサッカーゲームでレッズをいぢめては G としば
しば抗争を起こしている。そのうち恐ろしいことが起こるのではないかと部員は
戦々恐々としている……はずはない (笑) [→ ライブラリアン]
エ○ァる (五段動詞) テレビ東京で毎週水曜日に放映していた TV アニメ「新世紀エヴァ○ゲリオン」を
見ること (嘘)
TSG には○ヴァにはまっている方がたくさんいらっしゃるので興味のある人は話
を聞いてみると良い。ヱ○スビールの売り上げが伸びただとか TV 放映版と LD で
はどこが違うだとか、興味深い話が聞けるだろう。
昨年の駒場祭では上映会も行われた。今年もきっと行われるのであろう (^^;
おちものぶんかかい [落ちモノ分科会] (固有名詞) 落ちモノに人生哲学を見いだした人々の集団。「ぷよぷ○」に始まり、「○ずる玉」
へも触手を伸ばす。何故か落ちモノではない「せらだ○」にはまっている人間も
多い。
最近は活動が下火であるが、
「進め!対戦ぱずる○ま」だとか「○きメモのぱず○だ
ま」が導入されるとまた火がつくのではないかと筆者は見ているのだが……(後者
56
TSG 部報 No. 199
TSG 用語の基礎知識 Ver. 1.0
の場合は落ちモノ分科会とは別の方に延焼しそうだが (笑)) [→ ぱ○るだま、ぷよ
○よ]
おやぢ [親父] (固有名詞) 言わずと知れた「○拳」の三島平○のこと。TSG にはいわゆるひとつの「親父使
い」が多く、即死コンボが飛び交い、非力キャラ使いの H にとっては地獄のよう
な毎日である。[→ 鉄○]
かいけい [会計] (名詞) その名の通り、TSG を巡るお金の動きを全て把握しなければならないお仕事 (但
し、コンパなどの特別なものは除く)。人格・信用共に備わっていなければ任せら
れないお仕事である (ちょっと大げさかな?)。今年の会計の人は別のサークルでも
偉い人なので (今年の 2 年の役職者にはこういう人物が結構いる) 滅多に部室に現
れないが、お金を立て替えている人は会ったときには必ず領収書を添えて請求する
こと。領収書がない場合は、勿論自腹である (^^;
かげのらいぶらりあん [影のライブラリアン] (固有名詞) これも正式な役職ではなく、便宜上の名称。本来正ライブラリアン (^^; の仕事で
ある部室のコンピューターの管理を担っている。しかし、FM-TOWNS は専門外
であるらしい (笑) 影のライブラリアンの力は非常に強大で、何人たりとも逆らう
ことは許されない (笑) [→ 裏のライブラリアン・ライブラリアン]
けーきがしゅしょく [「ケーキが主食」] (格言?) ……私の口からは多くは語れません……(笑)
ケーキパーティー (固有名詞) 名前の通りひたすらケーキばかりを食べる悪魔のようなパーティー。筆者は残念な
がら (?) 参加はしていないが、それはそれは恐ろしいものらしい。
また、このイベントはわざわざセンターの日に合わせて行われる。まじめにテスト
を受けている人々がいる一方でこんなことをしている悪い人々も世の中にはいると
いうことを覚えておきましょう (嘘)
ゲーセン (名詞) コンパ委員のとある人物曰く「我々のラグランジュ・ポイント」(どういう意味か
は、物理授業をまじめに聞けばわかる)。(註:筆者は習っていないが)
コンパ (名詞) TSG 部報 No. 199
57
TSG 用語の基礎知識 Ver. 1.0
TSG のコンパの基本は「食」である。食べ放題でもない限り、食べ物の皿がやっ
てくると欠食児童 (失礼!) のような勢いでさらに箸がつっこまれ、ものの数秒で皿
の中身が消滅してしまう。そう、そこはもう戦場なのだ (笑)
反対に、酒類の強制は一切ない (無論、上記のような状態なのだから「食え! 」と
いうようなことは食べ放題でもない限り絶対にあり得ないし、食べ放題でもまずな
いはず)。
こんぱいいん [コンパ委員] (名詞) コンパの段取りや旅行の段取りを行う人々。一応、それなりに偉いらしい。今年度
は 4 名が名を連ねる。今年のコンパ委員はイコール PS 人間であり、一部方面から
行く末を心配する声があがっている (嘘) 早くも合宿の行く先を決めかねている彼
らに明日はあるのか?(笑)
さる [猿] (名詞) 一般的にも「∼猿」とつけられて「∼しまくり人間」の意を表すが、TSG に於い
ては何もつけない場合は「italk 猿」を指す。どういう意味かは押して知るべし。誰
が猿で誰がボスザルかは、italk にしょっちゅう入ってみればわかるので知りたい人
はやってみると良い。しかし、これをやった人も既に猿の仲間入りを果たしたこと
になってしまうのだが...(笑) 詳しくは、オリパンフの Zepher さんの記事を参照の
こと。[→ 廃人・ヲ]
しょむ [庶務] (名詞) いろいろな仕事をするなくてはならない人々。見かけても決して石を投げたりし
てはいけない。昨年度から導入された比較的新しい役職。今年度から 2 名に増員。
仕事の中身は庶務の人々に弟子入りして聞くのが早い。今年の庶務の人々は……な
んというか……その……非常に言いにくいのだが……ええっと……う∼む……ま、
そういうわけだ! (^^;
「すべてのまいんはわたしのもの」 [「すべてのマインは私のもの」] (格言) あの TSG 最大の汚点の 1 つに数えられている (嘘)「駒場祭マインス○ーパージャッ
ク事件」の首謀者の口から後に発せられた言葉。確かにひどいが、誰もが納得する
内容であるという (笑) [→ マイン○イーパー、TSG 部報 No.195]
せら○ま (固有名詞) コンパイルが出したパズルゲーム。一般受けはしていないようだが、TSG 内では
熱い戦いが繰り広げられていた時期もあった... 一部の人間によって (笑) [→ せ○
だま団]
58
TSG 部報 No. 199
TSG 用語の基礎知識 Ver. 1.0
ぜ○だまだん [せ○だま団] (固有名詞) コンパイルの「○らだま」の Time Attack に燃える人々の集団。彼らの戦いは既
にコンマ 01 秒の世界に突入。F1 も真っ青な戦いを繰り広げている。目標はコンパ
イルの社内タイムで、そのためにはいかなる努力も惜しまない。特に首領格の T
などは、「音源ドライバを組み込まないと割り込みが無くてその分速い∼」などと
宣い、O は「非公認タイム」としてそれを否定している。もはや「せらだま廃」の
世界である。構成人員は 4 名で、一時期は 305 の 98 系 2 機が両方とも占領されて
いた。
目下の所、ライバルは鉄拳分科会である (嘘)。首領が「○ずるだま」に走り最近の
活動は下火であるが、熱さでは TSG 一との呼び声も高い (爆)。
追加情報:首領が発した「飽きた」の一言に避難が集中! しかも、鉄拳分科会に移
籍を画策中であることも判明し、非難の声が高まっている。危うし、T(爆) [→ せ
ら○ま、ラ○ナーズ・ハイ]
てぃーえすじー [TSG] (固有名詞) 「理論科学グループ」の略称であるという説と「テニス・スキー・ゲーム」の略称
であるという説と「鉄拳最強グループ」の略称であるという説があるが真偽のほど
は明らかにされていない。筆者は、「東大スーパー娯楽集団」とか「とにかく趣味
の人のグループ」の略ではないかと思うのだが...(嘘です!) 真相が知りたくば毎日
部室に来ることだ。[→ 理論科学グループ]
てっけ○ [鉄○] (固有名詞) ナムコの出した傑作 3D 格闘ゲーム。多くの猿を造り出し、分科会も設立されてい
る。部室の PS の前では今日も熱い戦いが繰り広げられている。発売日前日に 2 の
導入も予定され、さらなる猿 (廃) を生むのではないかと懸念されていたが、実際
に導入され、新なる猿を大量生産している。
間違っても「研」の字を入れてはいけない (爆) [→ 親父、鉄○ 2]
てっけ○ 2 [鉄○ 2] (固有名詞) 当たり前であるが前出の鉄○の続編。技も増え空中コンボがでやすくなり、「一瞬
のミスが命とりになる世界」に突入している。
発売日前日に K によって 305 にもたらされた (世に言う鉄○ 2 伝来 (嘘))。この時
より 305 は修羅場と化し、人間がいれば TV には鉄○ 2 が、というほとんどゲー
ムセンターの様相を呈している。しかも、そこらのゲーセンよりもレベルが高い
(笑) [→ 親父、鉄○]
てふ [TEX] (固有名詞) TSG 部報 No. 199
59
TSG 用語の基礎知識 Ver. 1.0
理科生の基本 (らしいが筆者は使えない)。これをまちがっても TEX だの tex だの
と表記してはいけない。また、てっくすだのてえっくすだのと呼んではいけない。
怒り狂った編集長からきっと君の所へ「恐怖の原稿依頼すぺしゃる」が飛ぶはずだ
(大嘘) とにかく編集長が怒ってつっこむので、皆さん気をつけるように (笑)
にんてんどう 64 [任天堂 64] (固有名詞) ファミコン及びスーパーファミコンで名を馳せた任天堂が、他社の次世代ゲーム機
に対抗すべく世に送り出すことを画策している機体。何でも、次世代ゲーム機出現
前には 90 ち込んでいる (いつぞやの某新聞より) らしい。
しかし、TSG での評判は至って悪く、筆者もあれは買う気がしないので細かいこ
とは良く知らないのだがあの発売延期の連続はやはりいろいろな問題があるのだ
ろう。どうでもいいが、あの悪趣味なコントローラーは何とかしろ! [→ プレイス
テーション、メガドライブ]
はいじん [廃人] (名詞) 別に「○したのジョー」の様に真っ白な灰になっているわけではない。猿と同義語
で、
「∼ヲ」もしくはそのように思われる人間に対して「∼廃」とつけて呼称する。
メガ○ラ廃、鉄○廃など。[→ 猿、ヲ]
ぱ○るだま (固有名詞) コナミの出した落ちものパズルゲーム。部室に PS のソフトが置いてあるが、○イ
ンビー版に中毒者多数。中には「と○メモだから」という理由でゲーセンでぱず○
だまの○きメモ版に投資している人間さえいる。部室では通常版・ツイ○ビー版を
問わずその音声が「毒電波」として一般人からは忌避される。最近では「進め!対
戦ぱずる○ま」も発売され、部室導入を懸念する声が各方面からあがっている。落
ちもの分科会の 2 本柱のうちの 1 本。[→ 落ちモノ分科会、ぷよ○よ]
ふくぶちょう [副部長] (名詞) 部長の次に偉いらしい人。部長の補佐を行うのが主な役目。今年の副部長は他の
サークル (どことはいわないがサークルオリの時に隣にいたサークル (笑)) とかけ
持ちをしていたため、2 日目に手伝えとの圧力を受けまくっていたが、彼は副部長
の責任を果たすべく、TSG の領地にとどまり続け……くつろいでいた (爆) しか
し、○長が副部長の貸し出しに同意し、さらに某コン○委員が「1 時間 1000 円で
貸す」と発言していたのは見逃せないところであろう。
ふくへんしゅうちょう [副編集長] (名詞) 編集長のお手伝いをする人。今年の副編集長は「背表紙折りの達人」なので非常に
重要な戦力である。でも、結局部報の製本は学館でみんなでやるんだよなあ……
60
TSG 部報 No. 199
TSG 用語の基礎知識 Ver. 1.0
ぶし [部誌] (名詞) 部室に放置してあるノートのこと。現在は No.78 であるが、それ以前のものはあ
まり残っておらず、膨大な量のノートがどこに消えたかは TSG の七不思議のひと
つに数えられている (嘘)
冗談はさておき、このノートは伝言板の役目を果たす。貸し出しノートは別にある
ので部室のものを借りるときにはそれに記入すればよい。但し、私物が置いてある
こともあるので注意すること。
しかし、部誌の真の役割は……そう、マウスパッドなのだ (爆) 部誌が見あたらな
いときはマウスのそばを捜索してみると発見率が高まる (笑)
ぶちょう [部長] (名詞) 「神聖ニシテ不可侵」である TSG の最高権力者。皇帝。帝王。覇者。王。司法・
立法・行政の三権を独占し、彼に逆らうものには死が待っている……わけがないで
しょ(爆)
部長はいろいろな会議に参加する。いろいろな書類を書く。いろいろなことを仕切
る。とにかく偉いのである。間違っても足を向けて寝てはならない (謎)
今年の部長は……説明会と新歓コンパの挨拶でわかったでしょ?(笑)
ぶほう [部報] (名詞) 人々が書いた原稿を編集長が真心を込めて編集し、出版するもの。大体 2ヶ月に 1
回くらいは出ているはずである。発行ペースをあげて欲しければ、原稿を書けば良
いのでわかりやすい (笑)
製本には大変な手間がかかるので、編集長が「部報の製本があるよ」と言ったらみ
んな万難を排して駆けつけなければならない。
ぷよ○よ (固有名詞) 言わずと知れた超有名落ちものパズルゲームでコンパイルの代表作 (TSG に限って
言えばそうではないのだが (爆))。TSG の人々の中にはとてつもなく強い人物が多
数存在する。これらの人々と対戦すると、はっきり言って世界観が変わる。○ずる
だまと併せて落ちもの分科会の双璧なので、興味のある人は落ちもの分科会を覗い
てみると良い。[→ 落ちモノ分科会、ぱ○るだま]
プレイステーション (固有名詞) SONY の出したいわゆる次世代ゲーム機。略称プレステ。
部室にあるゲーム機の中ではもっとも高い性能を誇るこの機体は、昨年の 2 年生
の設立した「基金」によって導入され、その後様々なソフトの導入により多くの
TSG 部報 No. 199
61
TSG 用語の基礎知識 Ver. 1.0
廃人を生み出してきた。鉄拳、鉄拳 2、ぱずるだま、リッジレーサー、RR レヴォ
リューションなど、多くの名作 (迷作?) を世に送り出してきた。
年末には FF VII の発売も予定され、一層の普及が見込まれる機体である。[→ 任
天堂 64、メガドライブ、その他のソフトの項目]
ぶんかかい [分科会] (名詞) 一緒に□△を勉強しましょう、という場合に TSG では□△分科会なる物が設立さ
れる。一般に、教師がいて講義が行われる形を取るが (そんな堅苦しいものではな
いが)、一部には「ただ□△をやるだけ」という無法地帯な分科会も存在する。ど
んな分科会があるかはオリパンフ参照のこと。昔はフラ語分科会やマラソン分科
会、スケボー分科会などもあったらしい。また、地下活動している分科会 (単に公
式でないだけ(^^; ) もあるので、興味があったら覗いてみるのもと良いだろう。戻
れなくなっても責任はとらないが (^^; [→ 未公認分科会]
へいあんきょうえいりあん [平安京エイリアン] (固有名詞) TSG の偉大な先輩がつくった、その昔ゲーセンで大ヒットしたゲーム。3 05 の娯
楽を司る TV・PS・MD の礎として、今もなお 305 で TSGer たちを温かく見守っ
ている (嘘)
305 に有るものは動作するらしい。筆者は動いているところを見たことはあるが、
やり方は知らない。
昨年、X 版を現 3 年の GANA 氏が移植し、駒場祭で展示を行った。
へんしゅうちょう [編集長] (名詞) 部報を編集する人。そのまんま (笑)。今年の編集長は TEX 廃 (^^; であるが、そ
のおかげで今年もきれいな部報が拝めるのだから感謝の気持ちを忘れてはいけな
い。部報をつくるのは大変なので皆さんいろいろ手伝いましょう。
マイン○イーパー (固有名詞) Windows に付いてくるおまけのソフト。おまけの筈なのだが……一部の人々の間
ではこれは「アクションパズルゲーム」として通っており、それこそコンマ 1 秒
の世界でタイムをあらそっていた。圧巻は駒場祭で、TSG が展示に使った全ての
Windows インストールマシーンのタイムは T 氏と G によって書き換えられ、「旗
無し上等」「ワンボタン常識」というもはや人外魔境の世界に突入していた。
この時、かの有名な格言「すべてのマインは私のもの」が生まれた。[→ 「すべて
のマインは私のもの」]
まど [窓] (固有名詞) 62
TSG 部報 No. 199
TSG 用語の基礎知識 Ver. 1.0
1. Windows の略称。一般人の前でこう呼ぶと敬遠されかねないので注意 (^^;
ソフ○ップの出している「○ OS」などでは、断じてない!
2. 今年度コンパ委員窓明の名字 (嘘)
みこうにんぶんかかい [未公認分科会] (名詞) 設立が計画された分科会のうち、日の目を見ることができなかったもの。日の目を
見られなかった理由は様々だが、主に人数の不足・周りの反対によるようだ。ゲー
ム系分科会は一時期こうなる運命だった。今年もなにやら企んでいる人物がいるよ
うだが……(笑) [→ 分科会]
メガドライブ (固有名詞) 部室にあるもう 1 つのゲーム機 (パソコンもゲーム御法度の Xa/C10 以外はほぼ
ゲーム機なのだが (笑))。通称メガドラ。そのソフトのあやしさには各方面で定評
がある (笑) (^^;
部室のメガドラはつい最近まではぷよぷよ専用機であったが、根津研からのソフト
の大量流入の結果、今では「VR」
「ソダン」
「バトルマニア」(それぞれが何を指す
のかは部室で確かめよう) などの濃いゲームが蠢いている (笑)
ぷよぷよ専用機次代には TV の横にガムテープで固定され縦置きされるという非
道い待遇であったが、それは横置きになった今も変わらず、電源が足りなくてコン
セントを抜かれるのも、コントローラーを落とされるのも、あまつさえそれを踏
みつけられるのも、みんなメガドラなのである (笑) [→ 任天堂 64、プレイステー
ション]
ライブラリアン (名詞) 部室のコンピューターの管理及びホームページの管理を行うお仕事。はっきり言っ
て大変である (笑) 今年のライブラリアンは一言で言えば「職人 (笑)」なのである
が、裏や影のライブラリアンの台頭が著しく (笑)、最近は「バ○ーンファイト」に
その生命をかけている (嘘) また、コンパ委員の某とレッズのことで血の抗争を繰
り広げている (大嘘) [→ 裏のライブラリアン、浦和レッズ、影のライブラリアン]
ラ○ナーズ・ハイ (固有名詞) これまたコンパイルの出したとんでもないゲーム。とんでもないことを平気でやる
辺りがコンパイルなのであるが、どこをどう考えても 300km/h オーバーで移動し
ている人間がジャンプして水面に着地して無事なわけないし、そもそもコース脇の
柵にぶつかっても無傷 (やっぱり 300km/h オーバーで) なのは「コンパイルに常識
は通用しない」と再認識させられる。
TSG 部報 No. 199
63
TSG 用語の基礎知識 Ver. 1.0
しかし、こんなゲームにはまる人間もいるのである。「せ○だま団」の一部がシフ
トして、今日もまた熱い戦いを繰り広げる。そんなわけで別名「ラン廃」と呼ばれ
るこのゲームは、今日も新たな廃人を作り出そうとしている (嘘) [→ せ○だま団]
りろんかがくぐるーぷ [理論科学グループ] (固有名詞) 東京大学駒場キャンパス学生会館 305 に部室を持つインカレのスタンスをとって
いるサークルのこと。本郷キャンパス付近にも「根津中央研究所」を持つ。東大内
のコンピューターサークルの 2 極のうちの 1 極。英訳すると「Theoretical Science
Group」で「TSG」になる。
とにかく理論科学なのであるが、いまや理論科学はコンピューター抜きには語れな
い (本当か?)。だからコンピューターである。
しかし、どんな組織にも変わり種はいるもので、TSG には理論科学的に鉄○を研
究する人間やぱ○るだまを研究する人間もいるらしい。
ヲ (名詞) 言わずと知れた (^^; ヲタク (^^; のこと (^^; [→ 猿、廃人]
∗
筆者註:伏せ字が多くて見にくくて済みません (^^;
この用語集は筆者の独断と偏見に基づいて書かれています。これを読んでいるあなた、
真実は自分の目で確かめましょう。事実無根の記述はないとは思いますが、万一あった
場合はお知らせ下さい。
また、あくまで「TSG 用語」ですので第 3 者に対して用いて通用しなくとも、または
それが原因で人間関係に支障を来しても筆者の関知するところではありません。
2 年生以上の人は読んでも余り面白くないかも知れませんね (^^; あくまで新入部員
の人向けということで (^^;
written by ZERO
64
TSG 部報 No. 199
編集後記
眠い(笑)
今年は自己紹介文が全体に短くなってしまいましたね。
原稿が 6 本も落ちてしまいました (^^;; にも関わらずなんか分厚い。集まっ
ていたら本当に 100 ページいったかもしれない。去年は確か 80 ページだっ
たんだよね。(過去最高記録)
次はついに 200 号です。投稿お待ちしてます。
オリの舞台裏に関する記事は、この分厚さと関連記事が落ちたことのため次
号にまわします。折角書いてもらったのにすまん>みやもと
理論科学グループ 部報 199 号
1996 年 5 月 18 日 発行
1998 年 7 月 25 日 pdf 版用修正 2 版
2009 年 4 月 15 日 pdf 版用修正 3 版
発行者
金子 済
編集者
大岩 寛
発行所
理論科学グループ
〒 153 東京都目黒区駒場 3–8–1
東京大学教養学部内学生会館 305
Telephone: 03–5454–4343
(C) Theoretical Science Group, University of Tokyo, 1996.
All rights are reserved.
Printed in Japan.
理論科学グループ部報 第 199 号
— 新入生歓迎号 —
1996 年 5 月 18 日
T HEORET ICAL
SCIEN CE
GROUP