63
ללללל4 - ללללל ללללללל לC makefile ADT-Abstract Data Type ללללל ללללל לADT - ללללל( ( לל לללל- לל[email protected] לללל לללללל ל''ל לללל

תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח [email protected]@cs.technion.ac.il

  • View
    235

  • Download
    2

Embed Size (px)

Citation preview

Page 1: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

4תרגול

Cפיתוח מודולרי ב-makefile

ADT-Abstract Data Type ) )תאריך-ADTדוגמא פשוטה ל

[email protected]לי-טל משיח

נערך והורחב ע''י ודים אייזנברג

Page 2: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

הבעיה: קשה לפתח ולתחזק תוכנה גדולה

למיליוני שורות קודלמיליוני שורות קודיכולה להגיע תוכנה גדולה תוכנה גדולה –מידעמידעכזאת של קשה לתפוס כמותקשה לתפוס כמותלמוח האנושי – את התוכנה לכל לשנותלשנות ולדבג, להביןלהביןיש צורך –

אורך החיים שלה

2

Page 3: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

שלבים בחיים של תוכנה

פיתוחפיתוח1.1.

תחזוקהתחזוקה2.2.

אחרי שהגרסה הרבה שנים הרבה שנים תוכנה יכולה "לחיות" –הראשונה פותחה

מכל ההוצאות 80%מהוות עד תחזוקהתחזוקהעל הוצאותהוצאות– על התוכנה

כל הזמן משתנהמשתנההתוכנה –באגיםבאגיםתיקוני •/סביבות עבודה נוספותהוספת אפשרויותהוספת אפשרויות•בחוקים/כללים עסקיים/נהלים שמצריכים שינויים שינוייםשינויים•

בתוכנה

3

Page 4: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

תחזוקה של התוכנה

נכתבתנכתבת יותר פעמים מאשר נקראתנקראתהתוכנה •כל כך חשובה הקריאותהקריאותלכן –

בראש ובראשונה בשביל להיכתבלהיכתבהתוכנה צריכה •אותההאנשים שיתחזקו האנשים שיתחזקו

כמובן היא גם צריכה להתקמפל ולבצע את מה –שמצופה ממנה

התוכנה צריכה להיכתב כך שיהיה•אותה להביןלהביןקל – אותהלדבגלדבגקל – אותהלשנותלשנותקל –להכניס באגיםלהכניס באגיםקשה –

4

Page 5: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

תכנות מודולרי הפיתרון:

בצורה לוגית למודוליםלמודולים התוכנה חלוקתחלוקת•בנוסף לחלוקה לפונקציות–

לא נחוץ להבנה של המודלים הסתרת מידע הסתרת מידע •גדולותכמויות מידע כמויות מידע עם התמודדותהתמודדותמקלה על –של המודולים בלי להשפיע על שינוי מימוש שינוי מימוש מאפשרת –

שאר התוכנה

(code reuse)במודולים שימוש חוזר שימוש חוזר •אין צורך לכתוב אותו קוד כמה פעמים–מקטין את התוכנה–

פחות קוד להבין, לתחזק ולדבג •

5

Page 6: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

הפרדה לממשק ומימוש

כל מודול מורכב משני חלקים:•(interface) ממשקממשק1.1.(implementation) מימושמימוש2.2.

ממשק מהווה מעין "חוברת הוראות שימוש" או •"לוח כניסות" של המודול

כל פרטי המימוש של המודול הלא מסתירמסתיר•נחוצים לעבודה עם המודול

6

Page 7: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

פיתוח תוכנה בלי מודולים

7

Page 8: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

חלוקה למודולים

8

Page 9: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

חלוקה למודולים והסתרת המימוש

9

הסתרת פרטים •שלא נחוצים לעבודה עם

המודול ועלולים לבלבל את

המשתמשים

Page 10: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

חלוקה למודולים והסתרת המימוש

כשרוצים להבין את •התמונה הגדולה –

מתעלמים מהמימוש של המודולים

כשרוצים להבין מימוש •של מודול כלשהו –

נכנסים פנימה ומבינים איך המודול

מומש

10

Page 11: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

שינוים במימוש של מודול כלשהו

שינויים במודול •כלשהו לא

משפיעים על שאר המודולים

11

Page 12: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

כל מודול יכול גם להתחלק למודולים

12

Page 13: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

שימוש חוזר במודולים בתוכנה אחרת

תוכנה א 13תוכנה ב

Page 14: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

יתרונות נוספים של תכנות מודולארי

בנפרד ולהיבדקולהיבדק להיכתבלהיכתבכל מודול יכול •שוניםשוניםאו צוותים אנשיםאנשיםעל ידי –בזמנים שונים–במקומות שונים–

14

Page 15: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

: הממשקCתכנות מודולארי ב-

headerheader (.h)הממשק נכתב בקובץ •

הקובץ מכיל•אותן מממש המודול הפונקציותהפונקציותעל ההצהרותההצהרות– אשר טיפוסיםטיפוסים והגדרות של קבועיםקבועיםשל הגדרותהגדרות–

המשתמש במודול זה צריך להכיראפשריים של הפונקציותערכי שגיאה ערכי שגיאה למשל •

הינן headerהפונקציות המוצהרות ב • אותם מספק המודול לשאר השירותיםהשירותים

התוכנה15

Page 16: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

: המימושCתכנות מודולארי ב-

c.נכתב בקובץ המימושהמימוש•הקובץ מכיל•

headerאשר הוצהרו ב-מימוש הפונקציות מימוש הפונקציות –למודול אשר לא נועדו לשימוש פונקציות פנימיות פונקציות פנימיות –

מחוץ למודולשל הקובץמשתנים סטטיים משתנים סטטיים –

16

Page 17: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

דוגמא: מודול תאריך

הקשורות פעולותפעולותבתוכנית שנכתוב מתבצעות •לתאריכיםלתאריכים

dateנממש את הפעולות במודול נפרד בשם •

17

Page 18: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.h :headerקובץ ה-#include <stdio.h>

/* date module This module defines a date type and implements some date

manipulation functions. */

typedef struct Date_t { int day; char month[4]; int year;} Date;

typedef enum {DateSuccess,DateFail,DateFailRead, DateBadArgument} DateResult;

18

Page 19: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.h :headerהמשך קובץ ה-/* reads a date from an open file – ‘inputFile’ expects the ‘date’ to point to an allocated Date */DateResult dateRead (FILE* inputFile, Date* date);

/* writes the date to the output file ‘outputFile’ */DateResult dateWrite (FILE* outputFile, Date* date);

/* returns the number of days between dates */DateResult dateDifference(Date* date1, Date* date2,

int* difference);

19

Page 20: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש : #include <string.h>#include <assert.h>#include <stdbool.h>#include "date.h"

#define MIN_DAY 1#define MAX_DAY 31#define MIN_MONTH 1#define MAX_MONTH 12#define DAYS_IN_YEAR 365

static char* months[]= {"JAN", "FEB", "MAR", " APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};20

קבועים שמוגדרים – c.בקובץ

מוסתרים משאר התוכנה

משתנה סטאטי של קובץ –

מוסתר משאר התוכנה

Page 21: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש :

/* returns the date’s month number (1-12) */static DateResult dateToMonth(Date* date,

int* month); /* returns the number of days passed from

01/01/00 */static DateResult dateToDays(Date* date,

int* day);

21

פונקציות פנימיות של

המודול – מוסתרות

משאר התוכנה

Page 22: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש : static bool isDayValid(int day){ return ((day >= MIN_DAY) && (day <= MAX_DAY));}

static bool isMonthNumberValid(int month){return ((month >= MIN_MONTH) && (month <= MAX_MONTH));

{

static bool isMonthStringValid(char* month){for (int i = MIN_MONTH; i <= MAX_MONTH; i++){

if (strcmp(month, months[i-1]) == 0){return true;

}}return false;

}

22

פונקציות פנימיות של

המודול – מוסתרות

משאר התוכנה

Page 23: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש : DateResult dateRead(FILE* inputFile, Date* date) { if (inputFile == NULL || date == NULL) return DateBadArgument; if (fscanf (inputFile, "%d %s %d", &(date->day),

date->month, &(date->year)) != 3) return DateFailRead; if (!isDayValid(date->day) ||

!isMonthStringValid(date->month)) return DateFail; return DateSuccess;}

23

Page 24: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש :

DateResult dateWrite(FILE* outputFile, Date* date){

if (outputFile == NULL || date == NULL)return DateBadArgument;

if (fprintf (outputFile, "%d %s %d ", date->day, date->month, date->year) < 0)

return DateFail;return DateSuccess;

}

24

Page 25: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש : static DateResult dateToMonth(Date* date, int* month) {

int i = 0;if (date== NULL || month == NULL)

return DateBadArgument;

for (i = MIN_MONTH; i <= MAX_MONTH; i++){if (strcmp(date->month, months[i-1]) == 0){

*month = i;return DateSuccess;

}}return DateFail;

}

25

Page 26: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש : static DateResult dateToDays(Date* date, int* days) {

int month;if (date == NULL || days == NULL)

return DateBadArgument;

if (dateToMonth(date,&month) != DateSuccess) return DateFail;

assert(isMonthNumberValid(month));

*days = date->day + month*(MAX_DAY – MIN_DAY + 1) + DAYS_IN_YEAR *date->year;

return DateSuccess;}

26

assertאם ה-נכשל - יש באג

dateToMonthב-

Page 27: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

date.cקובץ המימוש : DateResult dateDifference(Date* date1, Date* date2, int* difference) {

int days1, days2;

if (date1 == NULL || date2 == NULL || difference == NULL)return DateBadArgument;

if ((dateToDays(date1,&days1) != DateSuccess) || (dateToDays(date2,&days2) != DateSuccess))

return DateFail;

*difference = (days1 > days2) ? (days1 – days2) : (days2 - days1);assert(*difference >= 0);return DateSuccess;

}

27

Page 28: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

מודול שמשתמש במודול תאריך: proc.c

#include <stdio.h>#include "date.h"

int main() {Date date1,date2;int difference;if (dateRead(stdin,&date1) == DateFail || dateRead(stdin,&date2) == DateFail)

return 1;printf ("The difference between ");

dateWrite(stdout,&date1);printf(" and ");dateWrite(stdout,&date2);dateDifference(&date1, &date2,&difference); printf("is %d days.\n", difference);return 0;

}

28

Page 29: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

בכתיבת מודולים Cתמיכת שפת

כתיבת מודולים הוטמעה – בכך שבניית Cבשפת

התוכנה נעשית בשני שלבים:

של כל (compilation) הידורהידור1.1.קובץ בנפרד

של כל (linking) קישורקישור2.2.הקבצים ביחד

29

file1.c file2.c filen.c

file1.o file2.o filen.o

Compiler Compiler Compiler

Linker

runfile

Page 30: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Cהידור ב-

מקומפל בנפרדמקומפל בנפרדכל קובץ •

בנפרדבנפרדקובץ כלשהו לקמפללקמפלהבעיה: איך אפשר • שנמצאות פונקציות חיצוניותפונקציות חיצוניותאם הוא משתמש ב

? בקבצים אחרים בקבצים אחרים

הפתרון: הקומפיילר אינו צריך לראות את •, אלא רק את הפונקציות החיצוניותהפונקציות החיצוניותשל המימוש המימוש

הצהרותיהןהצהרותיהן

שמכילים headerheaderקבצי קבצי של includeincludeיש לעשות •בהן משתמשמשתמששהמודול פונקציותפונקציותשל הצהרותהצהרות

30

Page 31: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

headerשימוש בקבצי

בפריטים כלשהם של להשתמשלהשתמשכל קובץ שצריך – שלו :-headerלקובץ ה includeincludeמודול מסוים, יבצע

#include “date.h”

#include <stdio.h>

31

•include של header של התוכנה

מלא של pathניתן לציין •הקובץ

•include של header סטנדרטי )של מערכת ההפעלה(

הסטנדרטיים headersכל ה-•נמצאים במקום מוגדר מראש

ע''י מערכת ההפעלה

Page 32: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

includeהוראת

שצריכיםשצריכיםלדברים רקרק includeחייבים לעשות •include שבו עושים במקוםבמקוםאותם

רק אם יש צורך רק אם יש צורך header ב-includeעושים – עצמוheaderשל הקובץ הנכלל ב-בהגדרות בהגדרות

-headerבהצהרה של פונקציות של ה•

לצמצם תלויותלצמצם תלויותהמטרה - •

במקום הלא במקום הלא או ללא צורך ללא צורך includeincludeהוראות הוראות •- סגנון תכנות רע נחוץ נחוץ

32

Page 33: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

header בקבצי ifndef#מגנון

עשוי headerמכיוון שקובץ ה-•, יש להיכלל במספר קבציםלהיכלל במספר קבצים

, אשר ##ifndefifndefלהשתמש במנגנון בודק האם קבוע מסוים הוגדר.

בה יתבצערק בפעם הראשונה רק בפעם הראשונה • #,include "date.h" הקובץ

date.hייכלל בפועל

headerחייב להופיע בכל קובץ •

33

#ifndef #ifndef DATE_HDATE_H#define #define DATE_HDATE_H/* file date.h – the /* file date.h – the header of module header of module date date */*/

......

#endif#endif

Page 34: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Cהידור ב-

objectobjectקובץ קובץ תוצאת ההידור היא •שמתאים לקוד מקור של המודולקוד מכונה קוד מכונה מכיל –"חוריםחוריםבמקום קריאות לפונקציות חיצוניות יש "–שלב הקישורשלב הקישורה"חורים" ימולאו בשלב הבא – –

34

0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 14: e8 00 00 00 00 callq 19 <foo+0x19> 19: c7 45 fc 00 00 00 00 movl $0x0,0xfffffffffffffffc)%rbp( 36: eb e8 jmp 20 <foo+0x20> 38: b8 00 00 00 00 mov $0x0,%eax 3d: e8 00 00 00 00 callq 42 <foo+0x42> 42: c9 leaveq 43: c3 retq

קוד מכונה ניתן פה להמחשה

בלבד – אין צורך להבין אותו

Page 35: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

(linking)קישור

לתוכנית objectאת כל קבצי ה- מחברמחבר linkerlinkerה-•אחת

במידע object" בקבצי ה"חוריםה"חוריםאת כל ממלאממלא•אמיתי

35

Page 36: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

gccהידור וקישור על ידי

כאשר מבצעים•

ניתן להפריד את השלבים:•gcc -c prog.c date.cgcc -c prog.c date.c

objectobject יוצר את קבצי ה-יוצר את קבצי ה-gcc prog.o date.ogcc prog.o date.o -o prog-o prog

progprogויוצר קובץ הרצה ויוצר קובץ הרצה objectobject מקשר את קבצי ה-מקשר את קבצי ה-

gcc prog.c date.c -o proggcc prog.c date.c -o prog מבוצעים שני השלבים ביחד – נוצר קובץ הרצה מבוצעים שני השלבים ביחד – נוצר קובץ הרצה

progprog

36

Page 37: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

שינוי במודולים של תוכנה

– אילו קבצים משתנהמשתנהמסוים קובץקובץאם •?צריך לקמפל/לקשר מחדשצריך לקמפל/לקשר מחדש

ניתן לקמפל רק cc . .בקובץ בקובץ אם השינוי נעשה –אותו

, חייבים headerheaderבקובץ בקובץ אם השינוי נעשה –תלויים בקובץ תלויים בקובץ לקמפל את כל הקבצים ש

ששונהששונהואחרי שקימפלנו קובץ כלשהוא חייבים לבצע –

objectשל כל קבצי ה-קישור מחדש קישור מחדש

37

Page 38: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

בנייה יעילה של תוכנה ממספר קבצים

דוגמא: תוכנית המורכבת מהקבצים הבאים:•–calc.c–control.c–main_prog.c

מסוים, מספיק להדר שוב רק cc . .שמשנים קובץשמשנים קובץבכל פעם •אותו ולבצע קישור מחדש.

, מספיק לבצע:control.c לדוגמא, אם שונה •

gcc -c calc.cgcc -c calc.cgcc -c control.cgcc -c control.cgcc -c main_prog.cgcc -c main_prog.cgcc calc.o control.o main_prog.o -o proggcc calc.o control.o main_prog.o -o prog

gcc -c control.cgcc -c control.cgcc calc.o control.o main_prog.o -o proggcc calc.o control.o main_prog.o -o prog

38

Page 39: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

אוטומציה של בניית התוכנה

מורכבמורכב גדולה יכול להיות בניית תוכנהבניית תוכנהתהליך •)מודולים(אלפי קבצים אלפי קבצים –כמה שעותכמה שעותעלול לקחת –הידור בצורה שונההידור בצורה שונהכל קובץ יכול לדרוש –

דגלי קומפילציה שונים•שפות תכנות שונות•קומפיילרים שונים•

בין הקבציםתלויות מורכבות תלויות מורכבות –כשקובץ מסוים משתנה – אילו קבצים צריך לקמפל מחדש?•קיימת סכנה בפספוס חלק מהתלויות ובניית תוכנה פגומה •

כתוצאה מכךלא יעיל לקמפל את כל הקבצים בשביל כל שינוי•

39

Page 40: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

makeאוטומציה של בניית התוכנה -

אוטומטיאוטומטיבניית התוכנה ל תהליךתהליךניתן להפוך את •makemakeע"י שימוש בתוכנה

חוקי חוקי שבו מקודדים MakefileMakefileמקבלת כקלט קובץ –בניית התוכנהבניית התוכנה

יש לקמפל ולקשר, מתי ובאילו תנאיםאילו קבצים אילו קבצים •לקמפל/לקשר את הקבצים איךאיך•בין הקבצים תלויותתלויות•

הפקודה makemake,קובץ כלשהו ומריצים משניםמשניםכאשר –חייבים לבצע חייבים לבצע בבניית התוכנה אילו צעדים אילו צעדים מחשבת

ומבצעת רק אותםחוסכת קימפול מחדש של כל הקבצים•

40

Page 41: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Makefileקבצי

המתאים לדוגמא הנ"ל הוא: MakefileMakefileקובץ ה-•

41

prog:prog: main_prog.o calc.o control.o main_prog.o calc.o control.ogcc calc.o control.o main_prog.o -o gcc calc.o control.o main_prog.o -o

progprog

calc.o:calc.o: calc.c calc.cgcc -c calc.cgcc -c calc.c

control.o:control.o: control.c control.cgcc -c control.cgcc -c control.c

main_prog.o:main_prog.o: main_prog.c main_prog.cgcc -c main_prog.cgcc -c main_prog.c

Page 42: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Makefileדוגמא נוספת –

תוכנה שמורכבת •מהקבצים הבאים :

a.h b.h c.h

a.c b.c c.c

a.o b.o c.o

prog

#include "b.h"

#include "a.h" #include "b.h" #include "b.h"#include "c.h"

42

Page 43: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

make

המתאים לתוכנה הזאת: MakefileMakefileקובץ ה-•

על התוכנה makemakeהפעלת •

prog:a.o b.o c.ogcc a.o b.o c.o -o prog

a.o:a.c a.h b.hgcc -c a.c

b.o:b.c b.hgcc -c b.c

c.o:c.c c.h b.hgcc -c c.c

> make> make> make prog> make prog

43

Page 44: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Makefileמבנה קובץ ממספר כניסותממספר כניסות מורכב Makefileקובץ •מבנה הכניסות :•

<target>: <other targets or files, the target depends on><TAB> <build command for the target>

או header, objectבדרך כלל מציין קובץ )קובץ מקור, targettargetכל •הרצה(

הערה עד סוף השורההערה עד סוף השורהמסמן ##•נקודות נוספות:•

.הפקודה לא תתבצעהפקודה לא תתבצעבתחילת שורת הפקודה, TABTAB בלי – בסוף כל שורה \\לכמה שורות יש להוסיף לשבור שורה ארוכה לשבור שורה ארוכה כדי –

בתחילת כל שורה(TABפרט לאחרונה )ועדיין יש לשים לא בתחילת שורה ולא בסופהאין לשים רווחים אין לשים רווחים –

Enterסיום שורות ב-•

44

Page 45: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

makeשימוש ב-

make [ -f filename ] [ target ]•make את קובץ ה- מחפשמחפשMakefile:באופן הבא

הוא מחפש קובץ בשם f-אם לא משתמשים באופציה –makefile או Makefile.בתיקיה הנוכחית

הוא מחפש את הקובץ f-אם משתמשים באופציה –filename

,הפקודה מבצעת makeבהפעלת מופיעמופיע targettarget אם• targetאת רשימת הפקודות המופיעות ב-

Makefileב-הפקודה make בהפעלתלא מופיע לא מופיע targettargetאם •

Makefileב- הראשון הראשון targettargetה-ה-מבצעת את 45

Page 46: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

makeאופן פעולת

אותו הוא הולך targetב-בודקת את התלויות בודקת את התלויות 1.1.לבצע

חדש חדש אם יש קובץ ברשימת התלויות שהוא 2. יש לבצע את הפקודה targetמקובץ ה- יותר יותר

לעדכנולעדכנו על מנת targetשל ה-

, כך רקורסיבירקורסיבינעשית באופן בדיקת התלויות בדיקת התלויות 3.3.שיבוצעו כל הפקודות של הקבצים שבהם

בסדר הנכוןבסדר הנכון תלוי, targetה-

46

Page 47: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Makefileהגדרת מאקרו ב- מחרוזתמאקרומאקרו כדאי להגדיר כMakefileב-•

שחוזרת כמה פעמים–שעשויה להשתנות בעתיד–

ניתן להגדיר מאקרו בצורה הבאה:•EXEC = prog

אחרי שמאקרו כלשהו מוגדר, ניתן להתיחס אליו •EXEC$)ושם המאקרו בסוגריים: ) על ידי $

:מאקרו מוגדרים מראשמאקרו מוגדרים מראשקיימים • הנוכחיtarget הוא ה-$@– הנוכחי ללא סיומתtarget הוא ה-$*–

47

Page 48: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

Makefileדוגמא לשימוש במאקרו ב-

48

CC = gccOBJS = a.o b.o c.oEXEC = progDEBUG_FLAG = # now empty, assign -g for debugCOMP_FLAG = -c -Wall

$(EXEC) : $(OBJS)$(CC) $(DEBUG_FLAG) $(OBJS) -o $@

a.o : a.c a.h b.h$(CC) $(DEBUG_FLAG) $(COMP_FLAG) $*.c

b.o : b.c b.h$(CC) $(DEBUG_FLAG) $(COMP_FLAG) $*.c

c.o : c.c c.h b.h$(CC) $(DEBUG_FLAG) $(COMP_FLAG) $*.c

clean:rm -f $(OBJS) $(EXEC)

> make cleanrm -f a.o b.o c.o prog> makegcc -c -Wall a.cgcc -c -Wall b.cgcc -c -Wall c.cgcc a.o b.o c.o -o prog

Page 49: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

באופן Makefileיצירת תלויות ל-אוטומטי

ע"י שימוש למצוא תלויות בין קבצים למצוא תלויות בין קבצים אפשר •בפקודה הבאה:

gcc -MM <c files>למשל:•

שלדשלדפלט זה בקובץ ולהשתמש בו כ לשמורלשמורניתן •Makefileל-

> gcc -MM *.c> gcc -MM *.ca.o : a.c a.h b.ha.o : a.c a.h b.hb.o : b.c b.hb.o : b.c b.hc.o : c.c c.h b.hc.o : c.c c.h b.h

49

Page 50: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT

Abstract Data Type

Page 51: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT מבנה נתונים מופשט •ADTADT מיוחדמיוחדמסוג מודולמודולהינומשאר הגדרת המבנההגדרת המבנהגם את מסתיריםמסתירים ADTב-•

התוכנהטיפוס של מצביע למבנהטיפוס של מצביע למבנהמגדירים •

של אינם ידועים מחוץ למודול אינם ידועים מחוץ למודול גודל המבנה ושדותיו –ADTה-

אשר רק קבוצת פונקציות קבוצת פונקציות נותנים למשתמש •בעזרתן ניתן לטפל בטיפוס

ישADTכמו לכל מודול ל-•( h. ממשק )קובץ –c).מימוש )קובץ –

51

Page 52: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT מודול תאריך שאינו

הגדרת המבנה הגדרת המבנה במודול תאריך שראינו קודם, • חשופהחשופה ולכן הייתה headerהופיעה בקובץ לשאר התוכנה

ADTלכן הוא אינו •חשיפת המבנה גורמת לבעיות•

52

Page 53: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

בעיות בחשיפת המבנה

גישה גישה כל המודולים של התוכנה מקבלים •של המשתנים מסוג תאריךלשדות לשדות

לקלקללקלקלבטעות עלולעלולכל מודול של כל התוכנה –משתנה מסוג תאריך

ברגע שתאריך מקולקל מופיע בתוכנה מאוד קשה – שקילקל את מי המודולמי המודול– הבאגהבאגלמצוא איפה

המשתנה

53

Page 54: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

בעיות בחשיפת המבנה

בכל המודולים יגרור שינויים יגרור שינויים המבנה שינוישינוי•שעובדים ישירות עם מבנה התאריך

ניגשים לשדות שלו–מקצים משתנים מסוג תאריך–

54

Page 55: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADTכפתרון

משאר המודוליםהמבנה מוסתר המבנה מוסתר ADTב-•פונקציות פונקציות – רק מקולקלמקולקל ADTאם משתנה מסוג –

יכלו לקלקל אותו עצמו עצמוADTADTשל ה-של ה-קל למצוא באגים•

השינוי משפיע השינוי משפיע אם מתעורר צורך בשינוי המבנה, –ADTרק על הפונקציות של ה-

לשאר מודולים של התוכנהגרירה של שינויים גרירה של שינויים איןאין•

55

Page 56: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.h header

#ifndef DATE_H#define DATE_H#include <stdio.h>

/* date ADT */typedef struct Date_t* Date;typedef enum {DateSuccess,DateFail,DateFailRead,

DateBadArgument} DateResult;

56

מגדירים ADTב- structמצביע ל-

לא ידוע עצמו structה-

c.מוגדר בקובץ

Page 57: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.h header/* reads a date from an open file – ‘inputFile’ expects the ‘date’ to point to an allocated Date */DateResult dateRead(FILE* inputFile, Date date);

/* writes the date to the output file ‘outputFile’ */DateResult dateWrite(FILE* outputFile, Date date);

/* returns the number of days between dates */DateResult dateDifference(Date date1, Date date2,

int* difference);

57

השינוי היחיד הוא שעכשיו

Date הוא מצביע structל-

Page 58: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.h header/* Allocates and initializes a new date. Returns NULL if

fails.*/Date dateCreate(int day, int month, int year);

/* deallocates the date*/ void dateDestroy (Date date);

/* copies the Date. returns NULL if fails */Date dateCopy(Date date);#endif

58

פונקציות חדשות – ליצירה, הריסה

והעתקה של ADTה-

Page 59: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.c#include <stdio.h>#include <assert.h>#include <stdbool.h>#include “date.h”#define MIN_DAY 1#define MAX_DAY 31#define MIN_MONTH 1#define MAX_MONTH 12#define DAYS_IN_YEAR 365

struct Date_t { int day; char month[4]; int year;};

static char* months[]= {"JAN", "FEB", "MAR", “APR”, "MAY", "JUN", "JUL", "AUG", “SEP", "OCT", "NOV", "DEC"};

59

המבנה מוגדר !c.בקובץ

מוסתר משאר התוכנה

Page 60: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.cDateResult dateWrite(FILE* outputFile,

Date date){if (outputFile == NULL || date == NULL)

return DateBadArgument;if (fprintf (outputFile, "%d %s %d ", date->day, date->month, date->year) < 0)

return DateFail;return DateSuccess;

}

60

אותו מימוש כמו בגרסה שהיא לא

ADT, הוא Dateרק הפעם structמצביע ל-

אותה הערה תקפה לגבי שאר הפונקציות

שהיו בגרסה שהיא ADTלא

Page 61: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.cDate dateCreate(int day, int month, int year) {

Date date = NULL;if (!isDayValid(day) || !isMonthNumberValid(month))

return NULL ;date = (Date) malloc(sizeof(struct Date_t));if (date == NULL)

return NULL;date->day = day ;strcpy (date->month,months[month-1]);date->year = year ;return date ;

}

61

פונקציה חדשה

Page 62: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

ADT תאריך: קובץ date.cvoid dateDestroy(Date date) {

free(date);}

Date dateCopy(Date date) {int month = -1;if (dateToMonth(date,&month) != DateSuccess)

return NULL; assert(isMonthNumberValid(month)); return dateCreate(date->day, month, date->year);{62

פונקציות חדשות

Page 63: תרגול 4 פיתוח מודולרי ב -C makefile ADT-Abstract Data Type דוגמא פשוטה ל ADT- ( תאריך ( לי-טל משיח litalma@cs.technion.ac.illitalma@cs.technion.ac.il

תאריך: ADTמודול שמשתמש ב-proc.c

#include <stdio.h>#include "date.h"

int main() {Date date1,date2;int difference;if ((date1 = dateCreate(1,1,1)) == NULL)||(date2 = dateCreate(2,2,2)) == NULL)) return 1;if ((dateRead(stdin,date1) == DateFail) || (dateRead(stdin,date2) == DateFail))

return 1;printf ("The difference between ");

dateWrite(stdout,date1);printf(" and ");dateWrite(stdout,date2);dateDifference(date1,date2,&difference); printf(" is %d days.\n", difference);dateDestroy(date1);dateDestroy(date2);return 0;

}63

חייבים לקרוא dateDestroyל-