emacs 入門 //\/ 図Ⅱ indent-for-comment の実彳テ糸吉果 N %doctmentstyle{jarticle) と書き表す約束になっています。ところが普通のテキスト を書くときには " を使っておきながら、 X を書くときだ げ・と ' ' を使えっていうのも指にとっては不自然な話 8 。 そこでものは試し、いつもどおり、 って入力してみましよう ? あれあれちゃんと、 string ってなりましたね X モードでは、ダブルクオートがコ マンド TeX-insert-quote にマッピングされていて、 と ' ' のうち適当なほうを挿入するようになっているので す。ところが、すっかりこれで喜んでいると、日本語独特 の落し穴にはまってしまいます。 たとえば、 X モードで、 私は " 文字列 " をダブルクオートで囲みたい。 という文章を書いてみてください。 私は ' ' 文字列”をダブルクオートで囲みたい。 となっちゃいました。これは求めていた結果とは違います ね。どうしてこうなるかは読者の想像力にお任せすること にしますが、原因究明のヒントは、、スペース〃です。 阨 X やい X に関するおもな編集コマンドの説明は これで終りですが、文章を書くうえでちょっと便利なコマ ンドをいくっか挙げておきましよう。 ' X やい X では、 % 文字の直後から行末まではコメ ントとみなされます。ということは、以前「 C プログラム の書き方」の記事に登場した一連のコメントを扱うコマン ドが使えるかもしれないということです。復習になります が、たとえはコメントの開始位置 ( カラム ) を設定する、 、 1 ー set—comment—column (C-x ; ) コマンドやコメントを挿入する、 8 タイピングに慣れてくると、だんだん頭で考えなくなって介髄反射でキーポー ドを打つようになってきませんか ? そのうち、文やプログラム自体も奩髄 反射で誓くようになってしまって・・・ UNIX MAGAZINE 1991.7 %begin{document } {%dm 明朝体 } {%dg ゴシック体 } *end {document } ー : 止に 3 こ」 Ⅲ 3 にーー . : コマンドなどは期待どおりの働きをしてくれます ( 図 11 ) 。 もう 1 つは、アルファベットの大文字・小文字変換をお こなう一連のコマンド、 1 ) downcase-word 2 ) upcase-word 3 ) downcase¯region 4 ) upcase-region 5 ) capitalize-word です。上から順に 1 ) 次の単語の文字をすべて小文字にする 2 ) 次の単語の文字をすべて大文字にする 3 ) 指定された範囲の文字をすべて小文字にする 4 ) 指定された範囲の文字をすべて大文字にする 5 ) 次の単語の先頭の文字を大文字に、それ以外の文字はす M-x indent-for-comment を実行すると、 (M-c) M-x capitalize-word の状態で、 This is apitalized ord. という働きがあります。たとえは、 べて小文字にする 135
新 is is Capita1ized ロ word. となります。 また、 downcase-word 、 upcase-word 、 capitalized- word は最初に M ーーを指定してからコマンドを実行する とカーソルの直前の単語に対して作用するので、ちょっと CapsLock を押し忘れた、あるいは解除し忘れていたなん emaCS 入門 となります。 This is UPCASE ロ ord. を実行すれば、ちゃんと大文字に変換され、 (M-- M-u) M-X upcase—word の状態で、 1 五 is is upcaseßword. てときに便利です。たとえば、 ます。こんなときには、悠然と、 なんて理不尽なことを言われる可能性だっておおいにあり くれたまえ 9 」 「やつばり前のはうがよかったから、もとに戻しておいて たもんだした挙旬に上司からいきなり、 という修正が山ほど出てきます。もちろん、さんざんすっ 「ちょっとバランスが悪いから、全角文字にしてみようか」 こは半角文字のはうがすっきりするなあ」 「ああ、 X やい X で文章を書いていると、 換の日本語版、ヾ全角・半角変換〃です。 もう 1 つのちょっと便利なコマンドは大文字・小文字変 M—x zenkaku—region M-x zenkaku-paragraph M—X zenkaku—sentence M—x zenkaku—vord M—x k ーて eglon M—x hankaku-paragraph M—x hankaku—sentence M—x ー響 0 て d 136 9 いまどき、こんな言葉遣いをする人なんていないかな。 で一発変換 ! 同しような指の運動をする羽目に陥ってい る仲間にも教えてあげれは、きっと今夜の 1 杯は彼 ( 彼 女 ? ) のおごりです 10 。 マ明 X のためのさまざまなコマンド 文章がひととおり書けたら、いよいよ整形にとりかかり ます。編集コマンドでは X とハ X の違いがありませ んでしたが、整形の際にはそもそもコマンドが違います。 X モードで jlatex コマンドを起動したり、い明 X モー ドで jtex コマンドを起動したり、ということがないように 気をつけてください。 さきほど「普通の IbX の使い方」の節で、 1bX の文章 を書いてからプリントアウトするまでの一般的な手順を 紹介しました。そのなかで、 1 ) 工デイタでファイルを作る はもうすんだので、続けて、 2)jtex(jlatex) コマンドで d ⅵファイルを作る 3 ) プレピューアで出力を確認する 4 ) プリンタで印刷する を Nemacs から実行する方法について紹介しましよう。 まずは整形 X やい阨 X の文章を整形するコマンドには、 TeX—buffer TeX—reg10n の 2 種類があります。名前からも想像できるとおり、 TeX- buffer は指定されたファイルを整形するのに対し、 TeX- region はリージョン整形します。 ちょっと雰囲気を知るために、これらのコマンドを実行 してみましよう。図 12 はい X の文章当 umon. tex ″の 例ですが、 M-x TeX-buffer (C-c c-b) 10 これらのコマンドは、 wnn-egg ・ el(Egg 付属の Lisp ライプラリ ) に定義され ている関数です。使用するときには、 wnn ー egg. el の存在を確認してください。 なお、全角・半角変換の対象になるのはアルファベット、数字、記り・類だけで す。 UNIX MAGAZINE 1991.7
emaCS 入門 となっていますが、これは、 インタラクテイプに処理をおこない、文字列 Trinter name:" を表示後、入力を文字列として受け取り、その 文字列を引数 printer に代入する という特殊な意味を表しています 12 そこで、 TeX-printer-name 関数を実行すると次のよ 説明が前後しますが、 結した ( c 。 ncat ) 文字列が設定されます。 に "lpr -P" と printer 引数の値とー d 〃を連 すると、 4 ~ 5 行目で変数 TeX-dvi-print Printer name : texprt M-x TeX—pr1nter—name うになります。 ー C01 れ 1 れ and (concat (interactive 144 数字、のように 12 " の後ろの 1 文字が人力の種類を指定します。たとえば、 s なら文字列、 n なら まいましたが、この文字列、 ところで、 2 行目の文字列についての説明を飛ばしてし い値が設定されます。 となって、結局は TeX-dvi-print-command 変数に新し (setq TeX—dvi—print—command "lpr —Ptexprt —d't) となります。そして、この値が setq 関数に渡され、 "lpr —Ptexprt —d" の結果は、 (concat 'tlpr 'ttexprt" " —d") を全部つなげてしまう関数で、 ん並べてください。たとえば、 concat 関数は渡された引数 とします。引数カ嗾数あれば、スペースで区切ってどんど ( 関数名引数 ) ように、 Lisp のプログラム中で関数を実行するときには、 などは Lisp 関数を実行することを意味しています。この 図 22 describe-function の実行例 ype —x 1 tO remove p Yindow Set Pr inter name eX-printer-name: "Set Printer e " が正確な関数定義なのでした。 (defun 関数名 ( 引数 ) " ドキュメント " 関数本体 ) とすれば分かるでしよう ( 図 22 ) 。つまり、本当は、 Describe function: TeX—printer—name M-x describe-funct ion は、ドキュメント用の文字列です。効能は・・・ 図 23 は実際に使われている TeX-print 関数です。ます えて、図 23 を見てください。 すこしだけ変更すればなんとかなるにちがいない・・・・と考 ていました。そこで、きっとプリントアウト・コマンドを command にプリントアウトのためのコマンドを設定し バッフアでは shell が起動されていて、 TeX-dvi-print- そこで、お手本を捜すことになりますが、 *TeX-sheII* 話です。 なり Lisp のプログラムを書けっていうのもかなり無理な ましよう。とはいっても、なんの知識もない状態からいき もっと進んで、今度はプレピュー・コマンドを作ってみ は、各行の解説をしておきましよう。 1 行目 2 ~ 3 行目 4 行目 5 行目 関数名は TeX-print で引数はありません。 ドキュメントなので無視。 (interactive) はヾインタラクテイプに処理を 進めるよ〃というおまじない。これもあまり 気にしないでください。 send-string は Lisp 関数で、第 1 引数で表 したプロセスに対して第 2 引数で示した文字 UNIX MAGAZINE 1991.7
連載 / 凵 Language 構文解析表の例 (grammar-and-state-table) リストー リスト 3 結果 [ 6 ] F ー > id [ 4 ] T ー > F [ 6 ] F ー > id [ 3 ] T ー > T * F [ 2 ] E ー > T [ 6 ] F ー > id [ 4 ] T ー > F [ 1 ] E ー > E + T tl: accept. [ 6 ] F ー > id [ 4 ] T ー > F [ 6 ] F ー > id [ 4 ] T ー > F [ 2 ] E ー > T [ 6 ] F ー > id [ 4 ] T ー > F [ 1 ] E ー > E + T [ 3 ] T ー > T * F [ 2 ] E ー > T t2 : accept. リスト 2 入力文字列 ◆ファイル tl の内容 id * id + id $ ◆ファイル t2 の内容 id * ( id + id ) $ E ー > E + T T ー > T * F T ー > F F ー > id ld Of Grammar id s5 $ 浦 E 1 3 T 2 十 0 1 2 3 4 5 6 7 8 9 10 11 ld Of Tab1e s4 ロ 0 LD LD 8 0 3 3 1 2 9 6 1 3 5 1 3 5 てて k 図 4 LR 構文解析コマンドのモデル 人力文字列 リスト 4 Bison のテパッグ用の出力の一部 state 1 . line (rule 2 ) input ー > input shift , and go tO state 22 shift , and go t0 state 2 shift , and go tO state 3 shift, and go tO state 4 shift , and go tO state 5 state 6 go to state 7 go t0 文法規則 line exp れ cti ( 月い喪 goto 表 構文解析表 構文解析部 state 2 けでなく標準入力からもえられます。 LR 構文解析コマンド LR 構文解析コマンドは、あらかしめ文法規則を入力し、 : 受理 a それと一致した文法を出力するようになっています。 r 数字 : 数字で示された構文規則が適用されたことを意 こで、構文解析表は次のような構造になっています。 味し、数字で示された状態へ移る s 数字 : シフトして、現在の状態、、数字〃をブッシュする (action) (goto) 非終端子 1 非終端子 2 ・・・ トークン 2 ・・ 状態番号 n goto には、適用された場合に移るべき状態番号が書かれ ています。 LR 構文解析コマンドは、これらの表を引きなが トークンはひとかたまりの文字列であり、構文解析にお ら入力文字列を参照する仕組みになっているのです ( 図 4 ける要素です。トークンのうち、、 $ 〃は最終入力、、 end of input" を示す特別なトークンで、実際には、、 end of file 〃 実行例 2 に対応するでしよう。非終端子とは、トークンが文法規則 と一致したまとまりを示す名前 ( 式や文のようなもの ) で AWK で作成した構文解析コマンドには、実行時の振る す。リスト 1 の文法規則では、、、 ( 〃や、、 * 〃がトークン まいを見ることができるように dump フラグとデバッグ で、 E ( 式 ) や T ( 項 ) が非終端子に該当します。 用の debug フラグを用意しました。その実行例を末尾のリ action は、、 a 〃か、、 r 数字〃、あるいは、、 s 数字〃で、 スト 7 に示します。 dump や debug のレベルは、 次のような意味があります。 exp ー > NUM . ( ロ 11e 5 ) $default reduce usmg rule 5 (exp) 状態番号 1 action 1 状態番号 2 action 2 108 UNIX MAGAZINE 1991.7
ちょっと長くなってしまいましたね。 printenv コマンド をいろいろな引数で実行してみたら、終了ステータスをち ゃんと返していることが分かったので、このコマンドでも 同しようにしてみました ( 先月号で終了ステータスについ て説明したばかりですし・・・・・ ) 。それから、複数の引数が与 えられた場合は、最初の引数と一致した環境変数について だけ値を返すようになっていますので、こちらのプログラ ムもそうなっています。 さて、プログラムの内容の説明に入りましよう。 9 ~ 10 行目では、変数 len と retval を初期値 0 として宣言して います。これらの変数の初期値はのちのち重要になってく るので、注意しておいてください。 12 行目からの if 文は、引数が与えられた場合の初期設 定です。 13 行目で与えられた引数を buf というバッフアに コピーします。 14 行目で buf の後ろに = という文字を付け加えていま す。これは、あとで envp の内容と比較するときに = まで含 めておかないと、 US という引数に対しても USER などが 一致してしまうためです。その次に、 len に文字列の長さを 設定しています。この長さは、かならす 1 文字以上になり ます。 16 行目では retval ( コマンドの終了ステータスに用い る ) の値を 1 に変えています。これは、引数と一致する環境 変数がなかった場合に 1 を返すからです。この値は、指定 された環境変数がみつかったときに 0 に戻せばよいのです。 さて本体のほうの説明に入りましよう。 while はさきは どのプログラムと同し条件でループしています。その内側 ですが、 len の値が 0 の場合、つまり引数が指定されなかっ たときには前掲のプログラムと同様に envp の値をそのま ま出力しています。 len の値が 0 でなかった場合、つまり引 数が指定されたときには、さきほど buf に格納しておいた 比較用の文字列を envp の値と比較しています。このとき 比較する長さを指定している点に注目してください。 strncmp の結果が 0 の場合 ( 両方の文字列の先頭 len 文 字が等しいとき ) は、環境変数の値だけを出力するためにち ょっと複雑なことをしています。カッコがたくさんありま すが、内側から順番に見ていきましよう。 USER という引 数つきでこのコマンドが起動され、これと一致したとしま す。 buf には、、 USER = 〃、 len には 5 という値が格納され ています。 152 * envp envp が指している文字列。この場合は、、 USER lmage ( * envp) Clen] envp が指している文字列の len 番目の文字。つまり挈 という文字。 C での文字列は 0 から数えはしめます。 & ( ( * envp) [ le 司 ) envp が指している文字列の len 番目の文字のアドレス。 つまりヤという文字が格納されているアドレス。この アドレスを文字列とみると、、、 i 〃という文字から、、 \ 0 〃が 出てくるまで、つまり、、 image" という文字列が得られ ます。 どうでしよう。無事に必要な文字列だけを取りだすこと ができますね。この文字列を出力したところで、終了ステ ータスを 0 とし、プログラムを終了しています。文字列が 一致しなかった場合やすべての環境変数を出力するとき は、次の文字列を指すように envp を進めます。 全部の文字列について検査が終ったら、 retval の値を終 了ステータスとして出力しています。この値はあらかしめ、 すべての環境変数を出力する場合には 0 、特定の環境変数 について出力する場合には 1 となっていたことを思いだし てください。 getenv ライプラリ関数 envp はすべての環境変数をみるのには有効ですが、 1 つだけのときにはそのなかから捜さねばならす、ちょっと めんどうですね。そう考えた人がいたかどうかは分かりま せんが、 UNIX には getenv というライプラリ関数が用意 されています。マニュアルでは、 char *getenv(name) Char *name ; となっています。 getenv という関数に文字列を与えると、その文字列と 一致した名前をもつ環境変数の値が返されます。一致する ものがないときには、 NULL が返されます。この関数を使 ってさきほどのプログラムを書き換えると、次のようにな ります。 UNIX MAGAZINE 1991.7
準拠の 日本語ホク、 ) プト 1 ら一、ら 日、ど bH - sc 日、 p 下 0 あなた叟雰 ) プト 変身し ワークステーションのおと一朝 ・渋谷と神保町で二重にもっていた資源が統合できる こでいう「資源」とはたとえば、 > ディスク >CPU > モテム > システム管理者 などのことてす。 /usr/local に置くコマンドのソースは、渋谷と神 保町にそれそれありました。当然ですが、バイナリ もそれそれがもっていました 4 。これが 1 つになる だけでも、ずいふんディスクが節約できます。 システム管理者もそれそれにいましたし、それそれ が同じことをしないといけないので、ずいぶん無駄 でした。これも、 1 つになることで管理が楽になり そうです。 ・一十算機の移送 渋谷と神保町とのあいだで頻繁に計算機を移動させ ていました。理由は、 > 渋谷と神保町で二重に計算機を買うほどの資金が ない ( もったいない ) > 神保町での仕事のために計算機を借りても、渋谷 に送られてきてしまう ( 逆もありました ) などでした。 計算機を移動するには、梱包しなけれよなりません。 箱に詰めたり、ラベルを貼ったり、内容を確認した りしていると、すぐ 1 日がすぎてしまいます。箱が 残っていれよいいのてすが、ないものもあります。そ うなると、別の箱にむりやり入れて送るか、地下鉄で 自分で抱えて運ぶかしないといけません。 といって、箱を保存しておくのもたいへんで、毎日 「倉庫番ゲーム」をする羽目に陥ってしまいます。 今回は、引越し前の展望のお話でした。次回は、「引 越しミーティング」を開き、実際に引越し作業にとり かかる前に決めておくべきことがらについて検討した 様子を書くことにしましよう。 ( さかした・しゅう ASTEC) ゞそドを。、 物騫は第をみ第、ャ ページ記述言語 RICOH-SCRIPT ※ R ℃ OH—SCRIPT の出力例 【特長】 ■ポストスクリプト出力環境 ポストスクリプトプリンターと同様に使用できます ■高品質グラフィックス 解像度の低いプリンターでも曲線、直線などのグラフィックス をきれいに出力することができます。 ・高品質アウトラインフォント 文字の補正情報を含んだアウトラインフォントの搭載と、独自 の文字補正機能により小さい文字から大きい文字まで高品 質な印字出力が得られます。 ・日本語ポストスクリプト言語仕様に準拠 日本語ポストスクリプト言語仕様に準拠しているため日本語 ポストスクリプトに対応したソフトウェアから利用することがで きます。 ■ UN Ⅸのゆ「インターフェースをサポート ポストスクリプトの出力は UN Ⅸの標準的なプリントコマンドで 使用できますので " R ℃ OH ー SCR 旧 T " を意識することなく、従来 の操作体系で、使用できます ー x - Window プレビューアー機能 ( J2 タイプ ) X—Window Ver. Ⅱに対応していますので、印刷前のプレビュ ーアーとしてべージイメージの確認ができます。 ■対応機種 Sun Microsystems 社 SUN シリーズ SONY 社 NEWS シリーズ 【標準価格】 RICOH -SCRIPT JI 198 , 000 円 R ℃ OH -SCRIPT J2 248 , 000 円 上記価格には消費税、メディア、マニュアルの価格は含まれていません。 ※ SUN は米国 SunMicrosystems 社の登録商標です。 ※ NEWS は SONY 社の登録商標です。 ※ UNIX は UNIX System Laboratories, ⅲ c. カく開発しライセンスしています。 ※ PostScript は米国 Adobe 社の登録商標です。 ※ X ー Window は米国マサチューセッツ工科大学の商標です。 ※ R ℃ OH - SCR 旧 T は「 PostScript リファレンス・マニュア丿レ」に 準拠し、リコーが独自に開発したものです。 株式会社リコー ソフトウェア事業部〒Ⅱ 2 東京都文京区小石川ト同 7 とみん日生春日町ビル TEL03 ( 3 田 5 ) 72 引 FAX03 ( 3 別 8 ) 0348 資料請求 N 。 .00C 4 渋谷と神保町は 9 , 600bps の SLIP で接続されていましたカ、ら、 NFS で共有することはできませんでした 105 UNIX MAGAZINE 1991.7
emaCS 入門 マ Lisp はいかが 今回は、ちょっと Lisp 言語に近寄って遊んでみました。 ( 自分にとって ) 使いやすいエデイタが欲しいと思っている 人は、勇気を出して NemacsLisp を覚えていってくださ 三五自体を知っていても、なかなか Nemacs し % LISP ロⅱロ Lisp は分かりにくい点が多いのですが、とにかくサンプル は豊富。 /usr/local/lib/nemacs/lisp の下や、ニュースで 流れてきた短いシステムを拾って手を加えてみるだけでも かなりいろいろなことができてしまいます。 とくに、梅雨どきでお出かけもままならない地方に住ん でいる方、頭の体操にいかがですか ? ( あらい・みちこ ASTEC) ーする モードまたは TEX モードにする ・今回出てきたコマンドの一覧 モードのコマンド M-x tex—mode M-x p1ain-TeX-mode M-x latex-mode M-x TeX-insert-braces (M-{) M-x TeX-print (C-c C-p) M-x TeX-recenter-output-buffer (C-c C-I) M-x TeX-region (C-c C-r) M-x TeX-buffer (C-c C-b) M-x TeX—insert—quote ( ・ ) M-x TeX-terminate-paragraph ( ) M-x va1idate—TeX—buffer M-x TeX-c10se-LaTeX-b10ck (C-c C-f) M-x up-list (M-}) 146 TeX-zap-file TeX-shell-cd-command TeX-end-of-header TeX-st art-of- header TeX-t railer TeX-directory TeX-show-queue-command TeX-dvi-print-command TeX-command TeX-default- mo de Lisp 変数 M-x TeX-ki11-j0b (C-c C-k) M-x TeX-show-print-queue (C-c C-q) plain モードにする I*TEX モードに カーソル位置にカーリープレースの対を挿入 括弧の対応の検査と空行の挿入を同時におこなう 括弧の対応の検査 \begin{ ・ . } に合わせて \ end { ... } を挿入 右カーリープレースの次へカーソルを移動 TbX 用のダフ・ルクオート ( ( カレントバッフアの整形 指定した範囲の整形 *TeX—she11*p: ッフアのスクロ dvi ファイルの印字 フ。リンタキューの内容の表示 , , ) を挿入 * TeX ー shell * で実行中のジョブの中断 ' I のデフォルトのモード ( 'p1ain-TeX-mode または ' latex-mode) の整形コマンド 'IbX の印字コマンド フ。リンタキュー表示コマンド 一時ファイルを作るディレクトリ UNIX MAGAZINE 1991.7 一時ファイルの名前 一時ファイルを作るディレクトリへ移動するためのコマンド ' I ファイルのヘッダの最後を区別するための区切り文字 ' I しファイルのヘッダの最初を区別するための区切り文字 加する文字列 TeX-region コマンドの実行時に、指定した文章の最後に追
連載 / / Li Language 図ーコンバイラの内部構成 図 3 構文解析部自動生成系 ソースファイ / レ 構文解析部 自動生成系 構文解析表 文法記述 字句解析部 構文解析部 意味解析部 入力文字列 記号表管理部 構文解析表 ・一・構文解析部 最適化部 コード生成部 LR 構文解析 前でもっていることになります。 構文解析部自動生成系 コンパイラ・コンパイラの一種である構文解析部自動生 成系は、解析したい文法を入力として与・えると構文解析部 が出力されるものです。実際に、 yacc や Bison には汎用 の表駆動型の構文解析部 ()R 解析という手法を用いてい ます ) があります。自動生成系では、 BNF に似た文法記述 から表 ( 構文解析表 ) を生成します ( 図 3 参照 ) 。 最適化部は 1 パスだけで終るものもあれば、複数パスにわ たるものもあります。コード生成部では実際の機械語を生 R 構文解析アルゴリズムの実現 成します。 UNIX では一般にアセンプリコードを生成しま すが、再配置可能なバイナリコードを生成するものもあり ます。記号管理部では、入力ソースファイルに関する記号 実行例 1 全般を管理します。 文献 [ 幻 [ 3 ] を参考にして作成した、 LR 構文解析アルゴ コン / ヾイラ・コン / ヾイラ リズム使用のプログラム ( AWK で記述したもの ) を末尾 のリスト 6 に示します。この LR 構文解析コマンドには、 コンパイラの一部を生成するようなプログラムを、、、コン 文法・構文解析表を含むファイルと解析したい入力文字列 パイラ・コンパイラ〃と呼びます。これは、対象となるパ を含むファイルとをえます。 スの処理仕様を入力し、その処理プログラムを生成するも のです ( 図 2 参照 ) 。これには、たとえは次のようなものが たとえば、 あります。 % LR-parser grammar—and-state-table tl t2 のようにして起動します。各ファイルの内容と得られる結 ・字旬解析部生成系 (lex 、 flex) 果をリスト 1 ~ 3 に示します。結果の、、 [ 〃、、 ] 〃で囲まれた ・構文解析部生成系 (yacc 、 Bison) 数字は、 grammar-and-state-table ファイルのなかの何 ・最適イヒ部自動生成系 番目の文法規則が適用されたかを示します。最後に表示さ ・コード生成部自動生成系 れているのは、ファイル名と最終状態 ( 文法に違反していな いか ) です。なおここで使用している構文解析表は、文献 ちなみに GNUC コンパイラ・システムは、視点を変え [ 幻 [ 3 ] から引用したものです。入力文字列は、ファイルだ れば最適化部自動生成系やコード生成部自動生成系を自 オプジェクト ファイ / レ 図 2 コンノヾイラ・コンノヾイラ コン . ペイラ・コン′ミイラ コン′くイラ . ノ、ス パスの仕様 107 UNIX MAGAZINE 1991.7
職 資 給 休 休 勤 交 種 格 与 日 暇 務 通 マニュアルクリエイター ・テクニカルライター 」 R 線市ヶ谷駅徒歩分。 地下鉄半蔵門線半蔵門駅徒歩 3 分、 下記本社、時間 ( 10 : 00 ~ 円 : 00 ) 。 夏季、年末年始、年次有給休暇。 週休 2 日制 ( 土、日、祝 ) 。 社会保険完備、社員旅行 昇給年一回、賞与年 2 回、交通費全額支給、 り優遇。 経験・能力・年齡等を考慮の上、当社規定によ 40 歳位迄。 に興味のある方。多少でも経験のある方。 ケーションなどの知識があり、マニュアル制作 パソコン / ワープロ / OS / 言語 / 通信 / アプリ ・テクニカルライター・技術系編集者・翻訳者 ( フリーランス、契約社員、在宅勤務者も同時募集 ) ・トランスレーター ・テクニカルエテイター 事業内容 : ハイテク関連のマニュアル制作、 翻訳、ソフトウェア開発。 主な取引先 : ・富士通 ・日本電気 ・リコー システムソフト ・アスキー クオリティ株式会社 〒田 2 東京都千代田区一番町 22 ・神田土地建物一番町ビル 4 F Tel. ( 03 ) 5275 ー引幻 Fax. ( 03 ) 5275 ー田 30 資料請求 NoOOE 150 、、 $ ? 変数名〃という部分は、この変数が設定されていれば 真を、設定されていなけれは偽を返します。その前につい ている ! は、条件の否定を返します。したがって if の条件 部は、 STRING という変数に値が設定されていれば偽、そ うでないなら真になります。後者の場合は、その後ろの set コマンドによりシェル変数 STRING の値を設定してい ます。 B シェルではあまり厳密に守られていませんが、通常、 C シェルではシェル変数に小文字を使います。これは、環 境変数に大文字が使われることが多いので、それと区別す るためです。したがって、さきほどのプログラムは次のよ うになります。 % cat str—test # ! /bin/csh if ($?STRING) then set string="$STRING" else set strxng="default string endif echo $string この場合、 string に代入する $STRING をかならす " ( ダブルクオート ) で括ってください。これを忘れると、 STRING のなかに空白が入っていたときにうまくいきま せん。どうなるのかは、自分でテストしてみてください。 C で環境変数を使う C 言語で環境変数の値を使う場合、 main 関数の 3 番目 の引数を利用する方法があります。これまでに main 関数 の引数として、コマンド行で渡された引数の数を示す argc 、渡された引数の配列 argv についてお話ししてきま した。今回は、環境変数の配列 envp を紹介しましよう。 envp には、環境変数とその値のペアが argv と同し形式 で格納されています。 argv の場合には argc に要素の数が 格納されていましたが、 envp にはそのような引数はあり ません。しかし、最後には argv と同様に NULL が入って いるので、この値によって数を調べることができます。 この envp を使って、 printenv コマンドと同様なコマン ド ( 現在設定されている環境変数の値をすべて出力する ) UNIX MAGAZINE 1991.7
地 0 $ & 0 0 ・ル 0 ee 以上のように、セッション・グループの導入により、 プロセスグループとコントロール・ターミナルが無関係 になり、より自然なプログラミングが可能になったよう に思えます。しかし、しつは互換性の面からまったくの 無関係にはなっていないので、現時点ではなにが嬉しい のか明確に擱めない状態となっています。 8 ビットクリーン ASCII コードは 7 ビットのコードですから、 ASCII コードだけを使っているかぎり、 8 ピット目を別の目的 で使用したり、 0 にするようにマスクをかけても支障は ありません。実際、このようなプログラムはかなり多い のです。しかし、国際化ということで多バイト文字など の 8 ビット目も使用するコードを使おうとすると、正常 に動作しないことになります。 こからは 8 ビットクリーンの話ですが、 SunOS 4. 1 . 1 のマニュアルでは「 ( 8 ピットクリーンとは ) OS に 搭載されているコマンドが、 1 バイトのすべてのビット を使用する文字を読み書きでき、処理できること」と説 明されています。つまり、 8 ピット目を保存したままの 処理は保証されるが、それ以上のこと ( たとえば EUC コードが使えること ) はまったく保証されていないので す。このように 、、 8 ピットクリーン〃という言葉は多バ イト文字コードのサポートとは意味が異なるので注意し てください。 SunOS 4.0.3 では、多くのコマンドとライプラリが 8 ビットクリーンになっていたものの、依然として 8 ピ ットクリーンでない ( つまり 8 ビットダーティな ) もの も多く残っていました。 SunOS4.1.1 では、この一部が 改良されました。 表 3 は SunOS 4.1 で 8 ピットクリーンになったコマ ンド、表 4 は依然として 8 ビットダーティなコマンドの 一覧です。マニュアルの 8 ピットクリーンに関連する項 目のうち、ここに挙げたコマンド以外のものをまとめる と次のようになります。 ・カーネル変更 システムコール経由のデータノヾス、 tty 、 pseudo-tty ドライバ、 Type-4 キーポードへの対応などで ASCII コードでないコードをサポートした。 UNIX MAGAZINE 1991.7 表 3 SunOS4 」で 8 ビットクリーンになったコマンド automount col (sysV) dd fmt 1s(sysV) nawk pr (sysV) sendmail stty(sysV) WC cat(sysV) col(ucb) ed fontedit ls(ucb ) 0d(sysV) pr ( ucb) sh textedit cat(ucb) csh iconedit mail od(ucb) PS shelltool umount cmdtool diff file mailtool mount sed stty(ucb) VI 表 4 8 ビットダーティなコマンド lex m4 passwd rusers strings yacc adb catman ctags deroff addbib who lint dis cxref 。 cct rwho refer man CflO dbx keylogin login newgrp rlogin sdb troff whoami awk CPP whois users spell rmail Ⅱ ro 圧 logname keylogout dbxtool す文字列とコメントにおける 8 ビット文字はサポート ・非標準の 8 ビットコードのサポート SunOS 4.1 、 SunOS 4.1.1 では 8 ピットコードセッ トが、 ISO 8859 / 1 (ISO Latin 1 コードセット ) 4 であ ることを仮定している。ほかの 8 ピットコードセット の利用も可能だが、カスタマイズが要求される。現時 点では、 ISO 8859 / 1 以外の 8 ピットコードをサポー トする計画はない。 ・非標準の周辺機器のサポート SunOS 4 . 1 、 SunOS 4 . 1 . 1 では、 ISO 8859 / 1 にも とづかないコードセットを使用する周辺機器はサポー トされていない。しかし、データ入出力の要求ポイント 4 ISO 8859 / 1 というコードは、正確には ISO Draft lnternational Standard 8859 / 1 という 8 ヒ・ツトの文字セットで、 ASCII コードのスーパーセットで す。前半は ASC Ⅱコードとまったく同しで、後半は特殊な文字 ( 鋭音符、短 音符などがついた文字 ) を必要とする欧州向きのコードとなっています。 x を使っている方々はしつはこのコード ( 正確にはフォント ) を使っています。 剌 sfonts で調べてみると、私たちのマシンで使える X のフォント 1.682 個の うち、しつに 401 個が IS08859 / 1 でした。フォントの世界では IS08859 / 1 がすでに深く浸透しているわけです。 19