分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1

Similar documents
memo

数はファイル内のどの関数からでも参照できるので便利ではありますが 変数の衝突が起こったり ファイル内のどこで値が書き換えられたかわかりづらくなったりなどの欠点があります 複数の関数で変数を共有する時は出来るだけ引数を使うようにし グローバル変数は プログラムの全体の状態を表すものなど最低限のものに留

untitled

プログラミング及び演習 第1回 講義概容・実行制御

PowerPoint プレゼンテーション

プログラミング実習I

double float

プログラミング及び演習 第1回 講義概容・実行制御

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Fortran 勉強会 第 5 回 辻野智紀

コンパイラとは プログラミング言語 ( 高級言語 ) で書かれたプログラムを入力し, コンピュータが実行できる言語 ( 機械語など ) に変換するプログラムのこと例 : gcc コンパイラは対応する言語によって複雑である場合もあるし単純である場合もある 本実験では簡単な言語のコンパイラを作成する

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - 09.pptx

文法と言語 ー文脈自由文法とLR構文解析2ー

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft PowerPoint ppt

情報処理 Ⅱ 2007 年 11 月 26 日 ( 月 )

C

untitled

た場合クラスを用いて 以下のように書くことが出来る ( 教科書 p.270) プログラム例 2( ソースファイル名 :Chap08/AccountTester.java) // 銀行口座クラスとそれをテストするクラス第 1 版 // 銀行口座クラス class Account String name

3.Cygwin で日本語を使いたい Cygwin で以下のコマンドを実行すると それ以降 メッセージが日本語になります export LANG=ja_JP.UTF-8 これは 文字コードを日本語の UTF-8 に設定することを意味しています UTF-8 は Cygwin で標準の文字コードで, 多

プログラミングI第10回

Boost.Preprocessor でプログラミングしましょう DigitalGhost

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

PowerPoint プレゼンテーション

PowerPoint Presentation

株式会社アルウィン C 言語コーディング規約 ver.0.1

Microsoft PowerPoint - å®�æ−•試é¨fi3ㆮ対ç�Œ.pptx

PGRelief C/C++ 強化ポイント説明書

日本アンドロイドの会 四国支部 Kickoff ミーティング in ABC2009

yacc.dvi

Microsoft PowerPoint - 第5章補足-DB2組み込みSQL.ppt

法政大学理工学部創生科学科 小林一行研究室 YP-Spur をMATLAB で使うには? YP-Spur は,Linux ベースで開発されているようであるが,Windows でも使えるようなので, ここでは,Windows 版のMATLAB から使う方法を紹介する.YP-Spu

デバッグの工夫

JavaプログラミングⅠ

kiso2-03.key

講習No.1

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

PowerPoint プレゼンテーション

KPIT 社 GNU Tool のダウンロード 使い方 インドの KPIT 社のサイトでは H8 SH 等の GNU カを無償ダウンロードできるようになっています C コンパイラ アセンブラ デバッ 日

C 言語の式と文 C 言語の文 ( 関数の呼び出し ) printf("hello, n"); 式 a a+4 a++ a = 7 関数名関数の引数セミコロン 3 < a "hello" printf("hello") 関数の引数は () で囲み, 中に式を書く. 文 ( 式文 ) は

プレポスト【問題】

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

Microsoft Word - Lab5d-DB2組み込みSQL.doc

第3回 配列とリスト

Transcription:

分割コンパイル (2018 年度 ) 担当 : 笹倉 佐藤 2018.12.20 分割コンパイルとは 一つのプログラムのソースを複数のソースファイルに分けてコンパイルすること ある程度大きなプログラムの場合ソースファイルをいくつかに分割して開発するのが普通 1

なぜ分割コンパイルするのか 1. コンパイル時間を短縮するため 2. ソースコードを見やすくするため 3. ソースコードを再利用しやすくするため 4. 複数人での開発をしやすくするため 分割コンパイル演習 クイックソートのプログラムで試してみる. 1. ~sasakura/compiler/2007/src/qsort.c を自分のところにコピーする 2. このプログラムを main 関数だけのソースファイル main.c と quicksort 関数だけのソースファイル quicksort.c の二つに分ける. 3. それぞれをコンパイルする 2

分割コンパイル演習 コンパイルのしかた gcc -o main main.c gcc -o quicksort quicksort.c gcc -c main.c gcc -c quicksort.c gcc -o qsort main.o quicksort.o それぞれのソースファイルをコンパイルしてオブジェクトファイルを作っている オブジェクトファイル同士をリンクしている 分割コンパイル演習 quicksort.c の中のコメントアウトしてある部分のコメントを外して ( アンコメント ) 動くようにする ( この部分はクイックソートの途中経過を表示するもの ) 3

分割コンパイル演習 コメントを外しただけでは動かない理由 1. MAXNUM を知らないと言われる 2. data を知らないと言われる 対処方法 1. #define MAXNUM 10 を quicksort.c にいれる 2. extern data[]; を quicksort.c にいれる 大域変数と分割コンパイル 大域変数のスコープは通常はそのソースファイルの中 他のソースファイルで宣言されている大域変数を参照したいときは参照したい方のソースファイルで extern 宣言をする 大域変数はプログラムを読みにくくするので極力使わない方がいい 4

プロトタイプ宣言と分割コンパイル 他のソースファイルにある関数のプロトタイプ宣言はなくてもコンパイルエラーにはならない しかし, それはコンパイル時に検査していないだけ もし型が違えばリンク時にエラーが出る よって, 使用する関数についてはプロトタイプ宣言をしておいた方がよい ヘッダファイルの活用 記号定数,extern 宣言, 関数のプロトタイプ宣言は main.c にも quicksort.c にも同じものを書かなくてはならない 面倒 共通のものをヘッダファイルにしてそれを include するようにする 他にも共通の typedef などはヘッダファイルにいれると便利 5

ヘッダファイルの例 myheader.h (main.c, quicksort.c と同じディレクトリに作る ) #define MAXNUM 10 extern int data[]; void quicksort(int[], int, int); #include myheader.h を main.c と quicksort.c にいれる make の利用 毎回以下の用なコマンドを手で打つのは面倒 gcc -c main.c gcc -c quicksort.c gcc -o qsort main.o quicksort.o make (GNU make) を使って楽をしよう 6

make とは ファイルの更新時間をみて処理を行うためのツール 主に分割コンパイルの支援のために使われる Unix で標準でついてくるツール make の基本 デフォルトでは Makefile (makefile でもいい ) に処理の規則を書く 処理の規則の書き方 FileB : FileA1 FileA2. <tab> 指定するコマンド FileA1, FileA2, のファイルのうちどれか一つでも更新時間が FileB よりも新しければ指定するコマンドを実行する ここは必ず タブ でなければならない 7

Makefile の例 以下の内容の Makefile をソースファイルのおいてあるディレクトリで作成する qsort : main.o quicksort.o gcc -o qsort main.o quicksort.o main.o : main.c myheader.h gcc -c main.c quicksort.o : quicksort.c myheader.h gcc -c quicksort.c make とすると, 更新されたものだけコンパイルされる でも, これだとソースファイルが増えるたびにいちいち同じようなことを書かないといけない 面倒 賢い make の使い方 マクロの利用 長いものに別名をつけて何度も書かなくていいように 変更も容易 暗黙のルールの利用 よく使うルールはあらかじめ make が知っている. 例えば.c ファイルからは.o ファイルを作る. 8

CC = gcc CFLAGS = -O -Wall HDRS = myheader.h LDFLAGS = LIBS = OBJS = main.o quicksort.o PROGRAM = qsort all: $(PROGRAM) Makefile の例 2 $(PROGRAM): $(OBJS) $(HDRS) $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM) clean:; rm -f *.o *~ ### main.o: main.c myheader.h quicksort.o: quicksort.c myheader.h make についてもっと知りたい人は http://www.ecoop.net/coop/translated/gnumake3.77/make_toc.jp.html などを参照のこと yacc,lex を使うときの makefile の例 CC = gcc CFLAGS = -O Wall LEX = flex YACC = bison -d HDRS = parse.tab.h LDFLAGS = -lfl -ly LIBS = OBJS = parse.tab.o lex.yy.o ast.o PROGRAM = mycompiler all: $(PROGRAM) $(PROGRAM): $(OBJS) $(HDRS) $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM) lex.yy.c: lex.l $(LEX) lex.l parse.tab.c: parse.y $(YACC) parse.y clean:; rm -f *.o *~ ### ast.o: ast.c ast.h 9