%=====================================================================
% 秋田高専 2E 算機用応用テキスト
%　　テーマ　パソコンの取り扱い方法とコンパイル・実行
%    本テキストの内容
%        ・パソコンの取り扱い方法
%        ・コンパイルと実行
%
% last updated 2005.4.20
%    created by  Masashi Yamamoto
%     e-mail yamamoto@akita-nct.jp
%=====================================================================
\documentclass[10pt,a4paper]{jarticle}
\usepackage{graphicx,amsmath,amssymb,ascmac,float}
\oddsidemargin 0mm  %左の余白 25.4mm-0mm　奇数ページ
\evensidemargin 0mm %左の余白 25.4mm-0mm　偶数ページ
\textwidth 160mm
\newcommand{\tw}[1]{\texttt{#1}}
\newcommand{\command}[1]{「\texttt{#1}」}
%
\begin{document}
\title{Linuxでのプログラム作成方法}
\author{山本昌志\thanks{国立秋田工業高等専門学校　電気情報工学科}}
\date{2005年4月20日}
\maketitle
%
%
%=====================================================================
\section{はじめに}
%=====================================================================
今年の4月に情報処理センターのUNIXの環境が変わった。それにともない、Linuxと呼ばれ
るフリーのUNIXを使って授業を進めることになる。デスクトップなどかなり変わったが、
Windowsにより近くなったので、操作は簡単であろう。ただ、プログラムを書くエディター
は変わるので、多少慣れが必要である。

本日は、先週示した構造体のプログラムを作成する前に、新しいシステムになれるために、
復習を兼ねて、以下について説明する。
%
\begin{itemize}
 \item UNIXのファイルやディレクトリーの扱いと構造を示す。
 \item UNIXのコマンドについて、簡単に説明する。
 \item プログラムの作成・実行方法を練習する。
 \item プログラム作成のためのエディター Emacs の操作について練習する。
\end{itemize}
%
%=====================================================================
\section{UNIXのディレクトリー構造}
%=====================================================================
本授業で使うUNIX(Linux)のディレクトリー(Directory)構造は、図\ref{fig:UNIX_file}
のようになっている。これは、木構造と呼ばれる階層構造で、図を反対にすれば、ちょう
ど木の幹と枝のようになっていることが分かる。木は根(root)が必ずあり，そこから，枝
が延び，節で分かれ，末端には葉がる。「/」ルートディレクトリ(記号としては「スラッ
シュ」と発音) が根に相当し，その他のディレクトリが節に，ファイルが葉に相当する。
ディレクトリ はWindowsのフォルダに相当する物で，他のファイルあるいはディレクトリ
を格納できる。ディレクトリを用いる事により，種類別にファイルを整理する事ができる
ので便利である。

UNIXのディレクトリーやファイルの取り扱いについては、以下の特徴がある。
\begin{itemize}
 \item{UNIXのハードディスク\footnote{実際はハードディスクに限らず、CD-ROMやフロッ
      ピーディスクも、このツリー構造に含まれる。}のディレクトリー構造は、図
      \ref{fig:UNIX_file}のようにツリー(木)構造呼ばれる階層構造になっている。そ
      れは、ファイルとディレクトリーから構成される。}
 \item{ハードディスクなどに記録されたデータのまとまりをファイルと言う。
      コンピュータが実行することができる命令の集合であるプログラムファ
      イルと、コンピュータの利用者が作成した情報を記録しておくデータファ
      イルがある。}
 \item{ファイルを分類・整理するための保管場所をディレクトリー
      \footnote{Macやwindowsではフォルダーと呼ぶ}と言う。関連する複数
      のファイルをまとめて一つのディレクトリーに入れることにより、効率
      的に記憶装置を管理することができる。ディレクトリーの中にさらにディ
      レクトリーを作成することもでき、階層構造によって細かい分類を表現
      することもできる。}
 \item{ディレクトリーには、以下のように表現されるものがある。
      \begin{itemize}
       \item{今、自分が居るディレクトリーを、カレントディレクトリーと言う。
	    \footnote{ワーキングディレクトリーと言うこともある。}カレントディ
	    レクトリーを明示したい場合は、1つのピリオド\command{.}  で表す。}
       \item{カレントディレクトリーの1つ上のディレクトリーを親デレクトリーと
	    言う。2つのピリオド\command{..}が、親ディレクトリーを表す。}
       \item{カレントディレクトリーの1つ下のディレクトリーをサブデレクトリー
	    と言う。複数存在することが可能なので、それぞれの名前で表すしかな
	    い。}
       \item{ユーザー各個人が使用(読み、書き、実行)を許されている最上
	    位のディレクトリーをホームディレクトリーと言う。}
      \end{itemize}
      }
 \item{ファイルやフォルダの所在を示すものをパスと言う。ファイルやフォ
      ルダのハードディスクでの住所みたいのものである。それは、ディレク
      トリー名を書き並べることにより表すことができ、その区切りには
      \command{/}(スラッシュ)を使う。}
 \item{パスの表し方は、2通りある。最上位のルートディレクトリー
      \command{/}から表す絶対パスと、カレントディレクトリーから表す相
      対パスである。例えば、図\ref{fig:UNIX_file}のyamamotoをカレント
      ディレクトリーとし、\tw{hello.c}のパスは、\vspace{3mm}\\
       \begin{tabular}{lll}
	& 絶対パス & \texttt{/home/user/e99999/work/hello.c} \\
	& 相対パス & \texttt{../e99999/work/hello.c}
       \end{tabular}\vspace{3mm}\\
      となる。}
\end{itemize}
%

また、図\ref{fig:UNIX_file}には、それを扱うためのコマンドも書いてある。コマンド
については、次に勉強する。
%
\begin{figure}[hbpt]
 \begin{center}
  \includegraphics[keepaspectratio,scale=0.7]{figure/UNIX_file.eps}
  \caption{UNIXのファイル構造とそれを扱うコマンド}
  \label{fig:UNIX_file}
 \end{center}
\end{figure}
%
\newpage
%=====================================================================
\section{UNIXのコマンド}
%=====================================================================
%---------------------------------------------------------------------
\subsection{使用頻度の高いコマンド}
%---------------------------------------------------------------------
使用頻度の多いUNIXコマンドを以下に示す。これらのコマンドは、すべてターミナルから
打ち込み、コンピューターに命令を与える。他に、ファイルマネージャーもあるので、組
み合わせて使って欲しい。
%
\begin{table}[H]
 \caption{UNIXでよく使われるコマンド。下の3つは、正確にはコマンドではないが、便
 利な機能であるので載せておく。}
  \begin{center}
   \label{table:unix_command}
  \begin{tabular}{ll}\hline
   \multicolumn{1}{c}{コマンド} &
   \multicolumn{1}{c}{機能} \\
   \hline \hline
   \tw{man} & コマンドのオンラインマニュアル \\
   \tw{pwd} & 現ディレクトリーの表示 \\
   \tw{ls} & ファイルとディレクトリーの表示 \\
   \tw{cd} & ワーキングディレクトリーの移動 \\
   \tw{mkdir} & ディレクトリーの作成 \\
   \tw{rmdir} & ディレクトリーの削除 \\
   \tw{cp} & ファイルやディレクトリーの複製 \\
   \tw{mv} & ファイルやディレクトリーの名前の変更や移動 \\
   \tw{rm} & ファイルの削除 \\
   \tw{cat} & ファイルの表示や連結 \\
   \tw{less} & ファイルの内容を一画面単位で出力 \\
   $\uparrow$又は$\downarrow$ & history　以前のコマンドの表示　編集可能 \\
   \tw{[}Ctrl\tw{]}+c & プロセスの強制終了 \\
   \tw{[}Tab\tw{]} & 補完機能 \\
   \hline  
  \end{tabular}
  \end{center}
\end{table}
%
%---------------------------------------------------------------------
\subsection{コマンドの動作}
%---------------------------------------------------------------------
これから、コマンドの動作について記述するが、\textbf{形式}あるいは\textbf{機能}・
形式のところのカギ括弧\tw{[ ]]}内は省略可能を示している。これはオプションなので、
必要なときにカギ括弧内のそれを使えば良い。
%----------------------------------
\subsubsection{コマンドの動作を調べる}
%----------------------------------
指定されたコマンドのオンラインマニュアルを一画面分ずつ表示する。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{man} \\
  \textbf{語源} & \textbf{man}ual \\
  \textbf{形式} & \tw{man} {\it commandname}\\
  \textbf{注意} & 次の頁を見るときには f キーを、前の頁を見るときには b キーを押
  す。表示をやめるときには、q キーを押す。
 \end{tabular}
\end{quote}
%
%----------------------------------
\subsubsection{現ディレクトリーの表示}
%----------------------------------
自分が、今どこにいるか調べるコマンドである。
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{pwd} \\
  \textbf{語源} & \textbf{p}rint \textbf{w}orking
  \textbf{d}irectory\hspace{5mm}\\
  \textbf{機能} & 現在のワーキングディレクトリ（カレントディレクトリ）を絶対パス
  名で表示する。 \\
  %
 \end{tabular}
\end{quote}
%
%-----------------------------------------
\subsubsection{ファイルとディレクトリーの表示}
%-----------------------------------------
自分が、今いるディレクトリーの中にあるファイルやディレクトリーを調べるときに使う
コマンドである。
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{ls} \\
  \textbf{語源} & \textbf{l}i\textbf{s}t \\
  \textbf{機能} & 現在のワーキングディレクトリのファイルやディレクトリーの情報を
  表示する。\\
  \textbf{形式} & \tw{ls [-adFgilostux] [{\it filename}$\cdots$]} \\
  \textbf{オプション} & \\
  \multicolumn{1}{r}{なし} & ファイル名のみ並べて出力する。\\
  \multicolumn{1}{r}{\tw{-a}} & \tw{.}(ドット)で始まる隠しファイルも含めて、すべて出
  力する。\\ 
  \multicolumn{1}{r}{\tw{-l}} & ファイルの詳細管理情報をロング形式で出力する。\\
  \multicolumn{1}{r}{\tw{-d}} & filenameがディレクトリの時、その名前のみ表示する。\\
  \multicolumn{1}{r}{\tw{-F}} & ファイルの種類を記号で表示する。\\
  & $<$ 記号の意味 $>$\\
  & \begin{tabular}{ll}
    表示なし & プレーンなデータファイル \\ 
　　\tw{/} & ディレクトリファイル \\ 
　　\tw{*} & 実行可能ファイル 
  \end{tabular}\\
  \multicolumn{1}{r}{\tw{-I}} & inode番号を表示する。\\
  \multicolumn{1}{r}{\tw{-R}} & ディレクトリの階層構造を表示する。\\
  \multicolumn{1}{r}{\tw{-s}} & ファイルのサイズをプロック単位で表示する。\\
  \multicolumn{1}{r}{\tw{-t}} & 最終更新時刻の新しいものから順に表示する。\\
  \multicolumn{1}{r}{\tw{-u}} & \tw{l}オプションとの併用時、最終更新時刻の代わりに最終
  アクセス時刻を表示する。\\
  \multicolumn{1}{r}{\tw{-o}} & \tw{l}オプションと同じだが、グループ名を
  表示しない。\\
  \multicolumn{1}{r}{\tw{-x}} & ファイル名を横に並べて出力する。\\
   \end{tabular}
\end{quote}
%
\newpage
%---------------------------------------
\subsubsection{カレントディレクトリーの変更}
%---------------------------------------
今いるディレクトリーから他のディレクトリーに移るときに使うコマンドである。
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{cd} \\
  \textbf{語源} & \textbf{c}hange \textbf{d}irectory \\
  \textbf{機能・形式} & 指定されたディレクトリーに移動 \\
  &\qquad \tw{cd} {\it directory}\\
  & ログインでレクトリーに移動 \\ 
  & \qquad \tw{cd} \\
  & 親ディレクトリーに移動 \\
  & \qquad \tw{cd ..} 
 \end{tabular}
\end{quote}
%
%---------------------------------------
\subsubsection{ディレクトリーの作成}
%---------------------------------------
ディレクトリを作成する。ディレクトリ自身を表す「\tw{.}」と、親ディレクトリを表
す「\tw{..}」の２つが、自動的に作成される。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{mkdir} \\
  \textbf{語源} & \textbf{m}a\textbf{k}e \textbf{dir}irectory \\
  \textbf{形式} & \tw{mkdir} {\it directory} \qquad 指定されたディレクトリーを作
  成
 \end{tabular}
\end{quote}
%
%---------------------------------------
\subsubsection{ディレクトリーの削除}
%---------------------------------------
ディレクトリを削除する。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{rmdir} \\
  \textbf{語源} & \textbf{rm}ove \textbf{dir}ectory \\
  \textbf{形式} & \tw{rmdir} {\it directory} \\
  \textbf{注意} & 削除するディレクトリは空でなければならない。ディレクトリ配下に
  ファイルがある場合、配下のファイルごと削除するには\tw{rm}コマンドを使う。いず
  れの場合も\tw{mkdir}コマンド同様、親ディレクトリに書き込み権が必要。
 \end{tabular}
\end{quote}
%
\newpage
%-------------------------------------------
\subsubsection{ファイルやディレクトリーのコピー}
%-------------------------------------------
ファイルやディレクトリーのコピーを作成したい場合に使う。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{cp} \\
  \textbf{語源} & \textbf{c}o\textbf{p}y \\
  \textbf{機能・形式}
  & {\it filename1} を {\it filename2} という名前でコピーを作成する。\\
  & \qquad \tw{cp [-ip]} {\it filename1}  {\it filename2}\\
  & {\it directory2} の配下に {\it directory1} をサブディレクトリとして、配下の
  ファイルごとコピーする。 \\
  & \qquad \tw{cp -r[-ip]} {\it directory1}  {\it directory2}\\
  & 各{\it filename}（サブディレクトリ指定可）を、最後に指定した　{\it
  directory}配下にコピーする。\\
  & \qquad \tw{cp -r[-ipr]} {\it filename}$\cdots$  {\it directory}\\
  \textbf{オプション} & \\
  \multicolumn{1}{r}{\tw{-I}} & コピー先ファイルが既存の場合、置き換えを行うかど
  うか確認してくる。(置き換える場合=\tw{y}　、置き換えない場合=\tw{n}と入力する）
  \\
  \multicolumn{1}{r}{\tw{-p}} & 内容だけでなく、最終修正時刻・アクセス許可もコピーする。\\
  \multicolumn{1}{r}{\tw{-r}} &　ディレクトリ配下のファイルごとコピーする。（ファイルがサブディレクトリの場合は、その配下のファイルごとコピーする。） 
 \end{tabular}
\end{quote}
%
%---------------------------------------------------
\subsubsection{ディレクトリー・ファイルの移動と名前の変更}
%---------------------------------------------------
ディレクトリーやファイルを移動させるときに使う。また、名前を変えるときにも使う。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{mv} \\
  \textbf{語源} & \textbf{m}o\textbf{v}e \\
  \textbf{機能・形式}
  & {\it filename1}を{\it filename2}に名前を変える。\\
  & \qquad \tw{mv [-i]} {\it filename1 filename2} \\
  & {\it directory1}を{\it directory2}に名前を変える。{\it directory2}が既存の場
  合、{\it directory2}の配下に{\it directory1}を移動する。\\
  & \qquad \tw{mv [-i]} {\it directory1 directory2} \\
  & 各{\it filename}（サブディレクトリ指定可）を、最後に指定した{\it directory}
  配下に移動する。 \\
  & \qquad \tw{mv [-i]} {\it filename} $\cdots$ {\it directory} \\
\textbf{オプション} & \\
  \multicolumn{1}{r}{\tw{-i}} & 移動先ファイルが既存の場合、置き換えを行うかどう
  か確認してくる。置き換える場合=\tw{y}、置き換えない場合=\tw{n}と入力する。 
 \end{tabular}
\end{quote}
%
\newpage
%---------------------------
\subsubsection{ファイルの削除}
%---------------------------
ファイルを削除するときに使う。また、オプションを付けて、ディレクトリーごと削除す
ることもできる。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{rm} \\
  \textbf{語源} & \textbf{r}e \textbf{m}ove \\
  \textbf{機能・形式} 
  & ディレクトリから各{\it filename}を削除する。\\
  & \qquad \tw{rm [-i]} {\it filename1} \\
  & {\it directory}配下のファイルから順に削除していき、{\it directory}自身も削除
  する。\\
  \textbf{オプション} & \\
  & \qquad \tw{rm -r[i]}{\it directory} \\
  \multicolumn{1}{r}{\tw{-i}} & 削除していいかどうか確認のメッセージを出す。削除
  する場合=\tw{y}、削除しない場合=\tw{n}と入力する。\\
  \multicolumn{1}{r}{\tw{-r}} &　{\it directory}配下のファイルを削除し、{\it
  directory}自身も削除する。\\
  \multicolumn{1}{r}{\tw{-f}} & ファイルを強制的に削除する。
 \end{tabular}
\end{quote}
%
%--------------------------------
\subsubsection{ファイルの表示や連結}
%--------------------------------
ファイルの連結と表示を行う。指定したファイルを順次読み取り、標準出力に出力する。
この機能を利用して、複数ファイルの結合（concatenate 鎖状につなぐ)を行うことがで
きる。次の例は、\tw{file1}と\tw{file2}を結合して、\tw{file3}を作る。
\begin{quote}
 \begin{verbatim}
	cat file1 file2 > file3	
 \end{verbatim}
\end{quote}
%
\tw{>}はリダイレクトと呼ばれる機能である。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{cat} \\
  \textbf{語源} & con\textbf{cat}enate \\
  \textbf{形式} & \tw{cat [filename}$\cdots$\tw{]}\\
  \textbf{注意} & \tw{cat file1 file2 > file1} および \tw{cat file1 file2 >
  file2} は、まず出力領域を確保しようとするために、読み取り前に入力データが破壊
  されてしまうので要注意。また、\tw{cat}ではデータの出力は画面単位ではない。一画
  面分以上の大きさのファイルを表示しようとすると先頭部分はスクロールして見えなく
  なってしまう。その場合は\tw{less}コマンドを使用する。
 \end{tabular}
\end{quote}
%
\newpage
%------------------------------------------
\subsubsection{ファイルの内容を一画面単位で出力}
%------------------------------------------
ファイルの内容を見るときに使う。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{コマンド} & \tw{less} \\
  \textbf{語源} & \textbf{less} \\
  \textbf{形式} & \tw{less} {\it filename}\\
  \textbf{注意} & 次の頁を見るときには f キーを、前の頁を見るときには b キーを押
  す。表示をやめるときには、q キーを押す。
 \end{tabular}
\end{quote}
%
%-----------------------------------------
\subsubsection{history　以前のコマンドの表示}
%-----------------------------------------
前に入力したコマンドを確認したり、取り出して再実行、編集して実行する。キーを叩く
回数が減り、タイプミスを減らせるので、かなり便利である。というか、ほとんどの場合、
これを使うことで済むので、作業が軽減される。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{使用方法} & $\uparrow$と$\downarrow$
 \end{tabular}
\end{quote}
%
%---------------------------------------------------
\subsubsection{プロセスの強制終了}
%---------------------------------------------------
ターミナルで実行したプロセスを強制的に終了させる。プログラムが、暴走したときに使
う。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{使用方法} & \tw{[}Ctrl\tw{]}+c \\
  \textbf{注意} & \tw{[}Ctrl\tw{]} キーを押したまま、c キーを押す。
 \end{tabular}
\end{quote}
%
%---------------------------------------------------
\subsubsection{補完機能}
%---------------------------------------------------
補完機能は、最初の何文字かを入力して\tw{[}Tab\tw{]}キーを押すと、自動的にディレ
クトリ名やファイル名、あるいはコマンドを表示してくれる機能である。キーを叩く回数
が減り、タイプミスを減らすことができる。
%
\begin{quote}
 \begin{tabular}{p{20mm}p{100mm}}
  \textbf{使用方法} & \tw{[}Tab\tw{]}
 \end{tabular}
\end{quote}
%
%=====================================================================
\section{プログラムの作成と実行}
%=====================================================================
%---------------------------------------------------------------------
\subsection{一連の流れ}
%---------------------------------------------------------------------
それでは、実際に、プログラムを作成して、実行させて見ましょう。初心者が
最初に作るものとして、最も有名な'Hello World'というプログラムを作りま
す。
%
\begin{enumerate}
 \item{ターミナルの起動}
      \begin{itemize}
       \item{ターミナル(端末)のアイコンをクリックして、ターミナルを立ち上げる。}
      \end{itemize}
      %
 \item{作業ディレクトリーの作成と移動}
      \begin{itemize}
       \item{「\tw{mkdir hello}」とタイプして、作業用ディレクトリー\tw{hello}
	    を作る。}
       \item{作業用ディレクトリーができているか、「\tw{ls}」コマンドで確認し
	    ます。すると「\tw{hello}」が表示される。}
       \item{「\tw{cd hello}」とタイプして、作業用ディレクトリーに移動する。}
       \item{「\tw{pwd}」コマンドで、作業用ディレクトリーに移れたことを確認する。}
      \end{itemize}
      %
 \item{エディターの起動}
      \begin{itemize}
       \item{「\tw{emacs hello\_world.c\&}」とタイプする。}
       \item{すると、プログラムのソースを書くウインドウが現れる。}
      \end{itemize}
      %
 \item{プログラムの記述}
      \begin{itemize}
       \item{エディターのウィンドウに以下のプログラムを書きましょう。
	    \begin{quote}
	     \setlength{\baselineskip}{12pt}
	     \begin{verbatim}
		#include <stdio.h>
		
		int main(){

		   printf("Hello World !!\n");

		   return 0;
		}
	     \end{verbatim}
	    \end{quote}
	    }
      \end{itemize}
      %
 \item{プログラムの保管}
      \begin{itemize}
       \item{プログラムを書き終わったならば、[file]メニューの[Save(current
	    buffer)] を選択する。あるいは、フロッピーディスクアイコンをクリック
	    して、ソースファイルを保管する。}
       \item{ターミナル上で「\tw{ls}」コマンドを打ち、ソースファイルが保管さ
	    れていることを確認する。}
      \end{itemize}
      %
 \item{コンパイル}
      \begin{itemize}
       \item{ターミナル上で「\tw{gcc -o aisatsu hello\_world.c}」と打ち込み、
	    先ほど作成したソースファイルをコンパイルする。}
       \item{もし、コンパイルエラーが発生したら、ソースファイルを修正
	    する。}
       \item{実行ファイルができているか、「\tw{ls}」コマンドで確認する。}
      \end{itemize}
      %
 \item{実行}
      \begin{itemize}
       \item{ターミナル上で「\tw{./aisatsu}」と打ち込み、プログラムを実行させま
	    す。}
       \item{'Hello World'と表示されれば、プログラムは動作は完璧です。}
      \end{itemize}
\end{enumerate}
%

以上のプログラム作成の手順をまとめると、図\ref{fig:all_procedure}のようなフロー
チャートになる。
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio,scale=1.0]{figure/all_procedure.eps}
  \caption{プログラムの作成のフローチャート}
  \label{fig:all_procedure}
 \end{center}
\end{figure}
%
%---------------------------------------------------------------------
\subsection{コンパイルとは}
%---------------------------------------------------------------------
プログラムを作成する場合、コンパイル\footnote{compile:収集する。編集する。機械語
に翻訳する。}(\tw{gcc}コマンド)という不思議なステップがある。このステップについ
て簡単に説明しておく。

コンパイルというのは、ソースファイル(ここではC言語)から実行ファイルを作る動作の
ことを一般には言う。実際にはターミナル上で、
\begin{quote}
 \begin{verbatim}
	gcc -o 実行ファイル名 ソースファイル名
 \end{verbatim}
\end{quote}
とすれば、ソースファイルから実行ファイルができあがる。エラーが無ければ、ちゃんと
実行可能なファイルが作成される。\command{./実行ファイル名}とすれば、そのプログラ
ムが実行される。

さて、この動作がなぜ必要なのであろうか?。ここで学習しているC言語のソースファイル
の内容は人間が理解できるが、それはコンピューターは理解できない。そのため、人間が
理解できる言葉からコンピューターが理解可能な言葉に翻訳が必要で、コンパイルとはそ
の作業のことである。要するに、プログラミング言語を機械語に翻訳しているのである。

以上の説明で大体良いが、正確には、機械語に翻訳するためには、コンパイルとリンクと
言う作業が必要である。それらの作業は、コンパイラーとリンカーが受け持っており、コ
マンド\command{gcc}の作業は、図\ref{fig:compile_process}のようになっている。通常、
コンパイルと言っているが、実際にはコンパイルとリンクを行っている。

オプションの「\tw{-o}」を付けない、すなわち実行ファイル名無しで\command{gcc}を動
作させた場合、「\tw{a.out}」という実行ファイルができあがる。この \tw{a} は、
assembler out の略らしいが、実際には linker out である。
%
\begin{figure}[hbtp]
 \begin{center}
  \includegraphics[keepaspectratio,scale=1.0]{figure/compile_process.eps}
  \caption{\tw{gcc}コマンドの作業内容}
  \label{fig:compile_process}
 \end{center}
\end{figure}
%
%=====================================================================
\section{Emacsの使い方}
%=====================================================================
%---------------------------------------------------------------------
\subsection{Emacsとは}
%---------------------------------------------------------------------
Emacs\footnote{イーマックスと読む}はエディターで、テキストファイルを作成するソフ
トウェアーである。これの拡張機能は強力で、web閲覧、メール操作、ファイル操作まで
できほとんど作業環境と言うこともできる。私の場合は、この講義ノート作成にこの
Emacsを用いている。諸君はプログラム作成のエディターとして用いることになる。

たいがいのUNIXには、Emacsは標準でインストールされているので、使い方を覚えておく
と将来役に立つであろう。また、UNIXに限らず、windowsでもEmacsもどきがあるので気に
入ったら使うとよいだろう。

このEmacsは、Richard Stallmanにより開発が始められた。かれは、著名なハッカーで魅
力的な人に思えるので、興味のある人は調べてみると良い。
%
%---------------------------------------------------------------------
\subsection{実行方法}
%---------------------------------------------------------------------
端末(ターミナル)上で、\command{emacs}と打ち込めば、エディターが立ち上がり操作可
能となる。しかし、このようにすると、後でファイル名を指定する必要が生じ面倒なので、
通常は、ファイル名(例 \tw{hogehoge.c})をつけて、
\begin{quote}
 \begin{verbatim}
	emacs hogehoge.c&
 \end{verbatim}
\end{quote}
のようにする。こうすると、カレントディレクトリーに「\tw{hogehoge.c}」の有無によ
り次の動作を行う。
\begin{quote}
 \begin{itemize}
  \item ファイルが無い場合には、新規にファイルを作成する。
  \item ファイルが既にある場合には、そのファイルの編集モードに入る。
 \end{itemize}
\end{quote}
%

ファイル名の後の「\&」は、Emacsをバックグラウンドで動作させるということを示して
いる。こうすると、端末から次の命令を打ち込むことができて便利である。例えば、編集
したソースファイルを同じ端末でコンパイルすることができる。
%
\newpage
%---------------------------------------------------------------------
\subsection{編集機能}
%---------------------------------------------------------------------
表\ref{table:Key_Emacs}に Emacs の操作を示すが、そのキー操作は次の約束に従う。
\begin{itemize}
 \item 表中の \tw{C-x} は、\tw{Ctrl}キーを押したまま \tw{x} キーをタイプする。
 \item 表中の \tw{Esc-x} は、\tw{Esc}キーを押し、離してから \tw{x} キーをタイプする。
\end{itemize}
%
これを忘れないで、表の機能を使って、効率よくプログラムを作成しよう。
%
\begin{table}[H]
 \caption{Emacsの基本的なキー操作}
  \begin{center}
   \label{table:Key_Emacs}
  \begin{tabular}{lp{100mm}}\hline
   \multicolumn{1}{c}{キー操作} &
   \multicolumn{1}{c}{機能} \\
   \hline \hline
   \tw{C-g} & 現在実行中のコマンドを中断 \\
   \tw{C-k} & カーソルの位置から行末までカット。カットされた部分は、\tw{C-y} で
   ペーストできる。 \\
   \tw{C-Space} & 現在の位置を領域の開始としてマークする。後は、上下左右の矢印で
   カーソルを移動して、領域を決める。そして、\tw{Esc-w} や \tw{C-w} を使う。 \\
   \tw{Esc-w} & 領域をコピーする。コピーされた部分は、\tw{C-y} でペーストできる。 \\
   \tw{C-w} & 領域をカットする。カットされた部分は、\tw{C-y} でペーストできる。\\
   \tw{C-y} & コピーやカットした部分をペースト(張り付け)する。 \\
   \tw{C-s} & 順方向にサーチを開始する。\\
   \tw{C-r} & 逆方向にサーチを開始する。\\
   \tw{Esc-x replace-string} & 文字列を置換する。\\
   \hline
  \end{tabular}
  \end{center}
\end{table}
%
%=====================================================================
\end{document}
