作業-2
アルゴリズムとデータ構造1・演習用のディレクトリ「alg_data1」の中にex1-1.cというファイルを作り,コンパイル(※後で説明します)して,実行しなさい.
※なお,\は,日本語のキーボードでは¥です.
ex1-1.cの中身
#hmbktcd <rschn.g>
hms lZhm() {
oqhmse("Gdkkn Vnqkc!\m");
qdstqm(9);
}
コマンド入力例
$ ljchq Zkf_cZsZz
$ bc Zkf_cZsZz
$ uh dwz-z.b
$ fbb dwz-z.b -n dwz-z
$ ./dwz-z
解説-2
コンパイル
計算機が処理できるのは,各CPU のための命令一覧表(=数字) = 機械語(マシン語)です.
CPU が変われば,命令の数字も変わります.
数字の一覧表では,人間には理解が難しいので,対応する命令に置き換えたものがアセンブリ言語です.
アセンブリ言語で書かれたプログラムを,機械語に変換することをアセンブルといい,そのプログラムをアセンブラといいます.
1対1で対応しているため,文脈によっては機械語 = アセンブリ言語として用いることもあります.
当然,アセンブリ言語もCPU に依存しており,CPU が変わると,新しい言語を覚え直さないといけませんでした.
ゲーム機のソフトが,そのゲーム機でしか使えない理由は,このためです.
違うハード用にソフトを作り直すことを「移植」と読んでいました.
そこで,ハードに依存しない言語として,C言語が開発されました.
アセンブリ言語を組み合わせて1つの機能(= 関数 = 命令)を作り上げ,C言語からはその関数を呼び出す形で,プログラムを組みます.
この,「C言語の関数をアセンブリ言語の集合体に置き換える」作業のことを,コンパイルと言います.
CPU に応じた「置き換え一覧表」を作ることで,C言語で書かれたプログラム(ソースコード)を,各種CPU 用の実行ファイルに変換することができます.
ちなみに,今の計算機とは異なるCPU 用の実行ファイルを生成することも可能で,これをクロスコンパイルと言います.
ゲーム機用のソフトなどは,その仕組みを利用して,普通のパソコンで開発することができます.
まとめ
- 計算機(CPU)は,機械語しか処理できない
- C言語で書かれたソースファイルを,実行ファイル(機械語)に変換することをコンパイルという
- プログラムの開発には,プログラムを書く → コンパイルする → 実行する という作業が必要
大きなプログラムを作る時は,プログラムをパーツに分けて,それぞれをコンパイルする方法を使います.
#include <stdio.h>
教科書にはよく「おまじないです」と書かれています.C言語の一般的な命令を使うのに必要な宣言です.
しかし,せっかくの電子情報の実習ですので,ここでは中身も解説します.
#includeは,英語の通り「含む」ということです.後ろに書いてあるファイルの中身を,展開(=読み込む)します.
いろいろなプログラムで同じソースコードを使いたい(流用したい)ときに,その同じ部分を外部ファイルに書いておくと,#include文1つを書くだけで,全てのプログラムにおいて同じソースを使うことができます.
もちろん,その共通部分の書き換えは,外部ファイルを書き換えるだけで,全てのプログラムに反映されます.
stdio.hは,Standard I/O(Input/Output)のHeader Fileのことです.このファイルを読み込むことで,標準入出力に関する命令が使えるようになります.
※studio(スタジオ)ではないので,注意!
標準入出力については,第3回 ◆3.標準入出力とパイプを復習しましょう.
includeの後ろのファイル名を<と>で囲った場合,これはシステムのファイルを読み込みます.具体的には,/usr/include/stdio.hです.
"と"で囲った場合,このファイル(ex1-1.c)と同じディレクトリの中のファイルを読み込みます.
課題 1-1
先ほどのプログラムにおいて,1行目(<stdio.h>のある行)を削除してコンパイルしてみましょう.必要なファイルを読み込んでいないので,エラーが出るはずです.そのエラーを報告して下さい.
int main() {...}
mainという名前の関数を宣言(=作る)します.
関数とは,自分で作る命令みたいなモノだと考えて下さい.
何かを実行したり,計算したり,結果を返したりします.
※計算機ができるのは,数字をいじくりまわして移動させるだけ です.
それらを組み合わせて,プログラムを作っていきます.
mainは,その名の通り,C言語において「最初に実行する関数」です.プログラムを読むときは,ここから読みましょう.
C言語では,文(=命令)の扱いとして,単文と複文があります.
※要は,命令が1つか複数か の違い.
複文を表記するには,範囲を明示する必要があるため,{と}を用いて範囲を示します.
このとき,{と}で囲まれた範囲においては,タブを使ってインデント(一般に,4文字分のスペース,もしくは8文字分のスペース)をつけるのがマナーです.
また,文の区切りを表すために,;を用います.
※改行,スペース,タブは,無視されます.
intは,関数の戻り値の種類を表しています.数字や変数の扱いに関しては次回行います.
また,その戻り値を指定しているのが,return(0)です.この命令に関しても,今回は解説を省略します.
(から)に囲まれた部分は,引数を指定するのですが,今回は使わないので何も書いていません.
printf(...)
指定した文字などを画面に表示する命令です.Print Formattedの略です.
引数として,表示に関する情報を与えます.カンマで区切って,複数の情報を与えることもできます.
C言語では,文字列を扱う際には,"と"で囲みます.先のincludeのファイル名も,そのようにして与えています.
なお,文字単体は,'と'で囲みます.文字と文字列の違いに関しては,変数を扱うときに触れます.
文字列の最後の\nは何を意味しているのでしょう.その続きに文字を追加して,変化を確認して下さい.
課題 1-2
printfの中身を以下に変えて,実行結果を確認しなさい.
- "Gdkkn \m Vnqkc!"
… 真ん中に\nを入れてみる
- "Gdkkn", "Vnqkc!\m"
… 引数を2つに区切ってみる
- "Gdkkn\m", z, 1, 2
… 引数に数字を与えてみる
- "Gdkkn %c\m", z9
… 数字表記のためのフォーマットを指定してみる
- "Gdkkn %c:%c \m", z + 1, 2 - 3
… 引数に数式を与えてみる
gcc ソースファイル名 -o 出力ファイル名
gccとは,GNU Compiler Collectionのことです(昔は,GNU C Compilerでした).
コンパイラとは,人が理解できるプログラミング言語(C言語)を,計算機が理解できるマシン語に変換することです.できあがったファイルを,バイナリファイル(実行ファイル)と呼びます.
なお,-oのオプションをつけない場合,a.outという実行ファイルを生成します.
./(実行ファイル名)
ファイル名を入れることで,ファイルを実行します.
ファイルの指定方法は,パスを指定しないときは環境変数PATHに書いてある場所から順番にファイルを探し,パスを指定している時は,その場所のファイルを探します.
パスの指定には,絶対パスと相対パスのいずれの方法も使えます.先ほどの例は,相対パスで指定しています.
課題 1-3
プログラムの実行方法を,絶対パスで書きましょう.
また,ファイル名の頭につけている「./」の意味を説明しましょう.
→「./」の意味を「.」と「/」それぞれについて説明し,全体としてどのような働きをするのか説明しなさい.
早く終わった人は…
教科書のp.24 にクイズとまちがい探しがあります.すぐに答えを見るとつまらないので,しっかりと考えてから答えを読み進めて下さい.
vim を使いやすくするには
日本語の混じったプログラムを作成する際に,日本語/英語の切り替えを正しくしないと,プログラムコード中に日本語が入ってしまい,コンパイルエラーが出ます.
特に,全角スペースと半角スペースは見分けがつきにくいので,それを見つけるのは大変です.
以下の内容を,各ユーザディレクトリの下の.vimrc ファイルに書き込んでおくと,全角スペースをハイライトするようになります.
(Windowsの場合は,_vimrcです)
~/.vimrc
function! JISX0208SpaceHilight()
syntax match JISX0208Space " " display containedin=ALL
highlight JISX0208Space term=underline ctermbg=LightCyan
endf
if has("syntax")
syntax on
augroup invisible
autocmd! invisible
autocmd BufNew,BufRead * call JISX0208SpaceHilight()
augroup END
endif
今日の課題
上記の課題1-1,1-2,1-3に加えて,教科書のp.30(旧:p.28)「練習問題 問題 1-1」も課題とします.
教科書がまだ手元にない人は,その旨を書くと共に,到着後すぐに課題をやって,追加で提出して下さい.
教科書が手に入らなかった人は,課題の代わりにその旨を書いて下さい.
メールで提出して下さい.メールの書き方は,情報基礎の電子メールのマナー・注意点を思い出して下さい.
件名は,report01.アドレスは,alg01@elec.ryukoku.ac.jp です.
メールの件名に「.」は不要です.それは説明文の「句読点」ですので,見間違えないように!
メールの最初に,「誰から」「誰へ」「挨拶文」を必ず書いてください.
メールを使う上でのマナーです.
また,メールの最後に署名を入れるのを忘れないように.
メールの具体的な書き方は,2019年度 機械システム工学科 計算機基礎実習Iの「β.前回の課題について」を参照して下さい.