Nguyên lý lập trinh hàm_chương 1

64 191 1
Tài liệu đã được kiểm tra trùng lặp
Nguyên lý lập trinh hàm_chương 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

i CHNG I. NGUYÊN LP TRÌNH HÀM « The primary purpose of a programming language is to help the programmer in the practice of his art » Charle A. Hoare (Hints on programming language design, 1973) I.1 M đu v ngôn ng lp trình I.1.1. Vài nét v lch s Bui ban đu hng ngôn ng lp trình (programming language) đu tiên trên máy tính đin t là ngôn ng máy (machine language), t hp ca các con s h hai, hay h nh phân, hay các bit (vit tt ca binary digit) 0 và 1. Ngôn ng máy ph thuc hoàn toàn vào kin trúc phn cng ca máy tính và nhng quy c kht khe ca nhà ch to.  gii các bài toán, ngi lp trình phi s dng mt tp hp các lnh điu khin rt s cp mà mi lnh là mt t hp các s h hai nên gp rt nhiu khó khn, mt nhc, rt d mc phi sai sót, nhng li rt khó sa li. N T nhng nm 1950, đ gim nh vic lp trình, ngi ta đa vào k thut chng trình con (sub-program hay sub-routine) và xây dng các th vin chng trình (library) đ khi cn thì gi đn hoc dùng li nhng đon chng trình đã vit. Ngôn ng máy tin gn đn ngôn ng t nhiên Cng t nhng nm 1950, ngôn ng hp dch, hay hp ng (assembly) hay cng còn đc gi là ngôn ng biu tng (symbolic) ra đi. Trong hp ng, các mã lnh và đa ch các toán hng đc thay th bi các t ting Anh gi nh (mnemonic) nh ADD, SUB, MUL, DIV, JUMP . tng ng vi các phép toán s hc + - × /, phép chuyn điu khin, v.v . Do máy tính ch hiu ngôn ng máy, các chng trình vit bng hp ng không th chy ngay đc mà phi qua giai đon hp dch (assembler) thành ngôn ng máy. Tuy nhiên, các hp ng vn còn ph thuc vào phn cng và xa l vi ngôn ng t nhiên (natural language), ngi lp trình vn còn gp nhiu khó khn khi gii các bài toán trên máy tính. Nm 1957, hãng IBM đa ra ngôn ng FORTRAN (FORmula TRANslator). ây là ngôn ng lp trình đu tiên gn gi ngôn ng t nhiên vi cách din đt toán hc. FORTRAN cho phép gii quyt nhiu loi bài toán khoa hc, k thut và sau đó đc nhanh chóng ng dng rt rng rãi cho đn ngày nay vi kho tàng th vin thut toán rt đ s và tin dng. Tip theo là s ra đi ca các ngôn ng ALGOL 60 (ALGOrithmic Language) nm 1960, COBOL (Comon Business Oriented Language) nm 1964, Simula nm 1964, v.v . 1 2 LP TRÌNH HÀM Phát trin ca ngôn ng lp trình Theo s phát trin ca các th h máy tính, các ngôn ng lp trình cng không ngng đc ci tin và hoàn thin đ càng ngày càng đáp ng nhu cu ca ngi s dng và gim nh công vic lp trình. Rt nhiu ngôn ng lp trình đã ra đi trên nn tng thuyt tính toán (theory of computation) và hình thành hai loi ngôn ng : ngôn ng bc thp và ngôn ng bc cao. Các ngôn ng bc thp (low-level language), hp ng và ngôn ng máy, thng ch dùng đ vit các chng trình điu khin và kim tra thit b, chng trình sa li (debugger) hay công c . Các ngôn ng lp trình bc cao (high-level language) là phng tin giúp ngi làm tin hc gii quyt các vn đ thc t nhng đng thi cng là ni mà nhng thành tu nghiên cu mi nht ca khoa hc máy tính đc đa vào. Lnh vc nghiên cu phát trin các ngôn ng lp trình va có tính truyn thng, va có tính hin đi. Ngày nay, vi nhng tin b ca khoa hc công ngh, ngi ta đã có th s dng các công c hình thc cho phép gim nh công vic lp trình t lúc phân tích, thit k cho đn s dng mt ngôn ng lp trình. I.1.2. nh ngha mt ngôn ng lp trình Các ngôn ng lp trình bc cao đc xây dng mô phng ngôn ng t nhiên, thng là ting Anh (hoc ting Nga nhng nm trc đây). nh ngha mt ngôn ng lp trình là đnh ngha mt vn phm (grammar) đ sinh ra các câu đúng ca ngôn ng đó. Có th hình dung mt vn phm gm bn thành phn : b ký t, b t vng, cú pháp và ng ngha. 1. B ký t (character set) Gm mt s hu hn các ký t (hay ký hiu) đc phép dùng trong ngôn ng. Trong các máy tính cá nhân, ngi ta thng s dng các ký t ASCII. Có th hiu b ký t có vai trò nh bng ch cái (alphabet) ca mt ngôn ng t nhiên đ to ra các t (word). 2. B t vng (vocabulary) Gm mt tp hp các t, hay đn v t vng (token), đc xây dng t b ký t. Các t dùng đ to thành câu lnh trong mt chng trình và đc phân loi tu theo vai trò chc nng ca chúng trong ngôn ng. Chng hn chng trình Pascal sau đây : program P; var ×, y : integer; begin read(x); y:=x+2; write(y) end. gm các đn v t vng : T khoá (keyword), hay t dành riêng (reserved word) : program, var, integer, begin, end. • • • • • Tên, hay đnh danh (identifier) : read, write, P, x, y. Hng (constants) : 2 Phép toán (operators) : + , := Du phân cách (delimiters) : :, (, ), . NGUYÊN LP TRÌNH HÀM 3 3. Cú pháp (syntax) Cú pháp quy đnh cách thc kt hp các ký t thành t, kt hp các t thành câu lnh đúng (statement hay instruction), kt hp các câu lnh đúng thành mt chng trình hoàn chnh v mt vn phm. Có th hình dung cách kt hp này ging cách đt câu trong mt ngôn ng t nhiên. Thng ngi ta dùng s đ cú pháp (syntax diagram) hoc dng chun Backus-Naur (Backus-Naur Form, vit tt BNF), hoc dng chun Backus-Naur m rng (EBNF − Extended Backus-Naur Form) đ mô t cú pháp ca vn phm. Ví d I.1.1 : Trong ngôn ng Pascal (hoc trong phn ln các ngôn ng lp trình), tên gi, hay đnh danh (identifier) có s đ cú pháp nh sau : tên ch s ch s 0 . 9 ch A . Z a . z Hình I.1. S đ cú pháp tên trong ngôn ng Pascal . Trong mt s đ cú pháp, các ô hình ch nht ln lt phi đc thay th bi các ô hình tròn. Quá trình thay th thc hin th t theo chiu mi tên cho đn khi nhn đc câu đúng. Chng hn có th «đc» s đ trên nh sau : tên phi bt đu bng ch, tip theo có th là ch hoc s tu ý, ch ch có th là mt trong các ch cái A Za z, s ch có th là mt trong các ch s 0 9. Nh vy, Delta, x1, x2, Read, v.v . là các tên vit đúng, còn 1A, β, π, bán kính, v.v . đu không phi là tên vì vi phm quy tc cú pháp. Vn phm BNF gm mt dãy quy tcc. Mi quy tc gm v trái, du đnh ngha ::= (đc đc đnh ngha bi) và v phi. V trái là mt ký hiu phi đc đnh ngha, còn v phi là mt dãy các ký hiu, hoc đc tha nhn, hoc đã đc đnh ngha t trc đó, tuân theo mt quy c nào đó. EBNF dùng các ký t quy c nh sau : Ký hiu Ý ngha ::=, hoc →, hoc = đc đnh ngha là { } chui ca 0 hay nhiu mc lit kê tu chn (option) [] hoc 0 hoc 1 mc lit kê tu chn < > mc lit kê phi đc thay th | hoc (theo ngha loi tr) Các quy tc BNF đnh ngha tên trong ngôn ng Pascal : <tên> ::= <ch> { <ch> | <s> } <ch> ::= ’A’ | . | ’Z’ | ’a’ | . | ’z’ <s> ::= ’0’ | . | ’9’ Ví d I.1.2 Vn phm ca mt ngôn ng lp trình đn gin dng EBNF nh sau : <program> ::= program <statement> * end <statement> ::= <assignment> | <loop> <assignment> ::= <identifier> := <expression> ; 4 LP TRÌNH HÀM <loop> ::= while <expression> do <statement>+ done <expression> ::= <value> | <value> + <value> | <value> <= <value> <value> ::= <identifier> | <number> <identifier> ::= <letter>|<identifier><letter>|<identifier><digit> <number> ::= <digit> | <number><digit> <letter> ::= ’A’ | . | ’Z’ | ’a’ | . | ’z’ <digit> ::= ’0’ | . | ’9’ Mt câu, tc là mt chng trình đn gin, vit trong vn phm trên nh sau : program n := 1 ; while n <= 10 do n := n + 1 ; done end 4. Ng ngha (semantic) Cn c vào cú pháp ca ngôn ng lp trình, ngi lp trình vit chng trình gm các câu lnh theo trình t cho phép đ gii quyt đc bài toán ca mình.  đt đc mc đích đó, mi câu lnh vit ra không nhng đúng đn v mt cú pháp, mà còn phi đúng đn c v mt ng ngha, hay ý ngha logic ca câu lnh. Tính đúng đn v mt ng ngha cho phép gii quyt đc bài toán, chng trình chy luôn luôn dng, n đnh và cho kt qu phù hp vi yêu cu đt ra ban đu. I.1.3. Khái nim v chng trình dch Chng trình đc vit trong mt ngôn ng lp trình bc cao, hoc bng hp ng, đu đc gi là chng trình ngun (source program). Bn thân máy tính không hiu đc các câu lnh trong mt chng trình ngun. Chng trình ngun phi đc dch (translate) thành mt chng trình đích (target program) trong ngôn ng máy (là các dãy s 0 và 1), máy mi có th đc «hiu» và thc hin đc. Chng trình đích còn đc gi là chng trình thc hin (executable program). Chng trình trung gian đm nhim vic dch đó đc gi là các chng trình dch. Vic thit k chng trình dch cho mt ngôn ng lp trình đã cho là cc k khó khn và phc tp. Chng trình dch v nguyên tc phi vit trên ngôn ng máy đ gii quyt vn đ x ngôn ng và tính vn nng ca các chng trình ngun. Tuy nhiên, ngi ta thng s dng hp ng đ vit các chng trình dch. Bi vì vic dch mt chng trình hp ng ra ngôn ng máy đn gin hn nhiu. Hin nay, ngi ta cng vit các chng trình dch bng chính các ngôn ng bc cao hoc các công c chuyên dng. Thông thng có hai loi chng trình dch, hay hai ch đ dch, là trình biên dch và trình thông dch, hot đng nh sau : Trình biên dch (compilater) dch toàn b chng trình ngun thành chng trình đích ri sau đó mi bt đu tin hành thc hin chng trình đích. • • Trình thông dch (interpreter) dch ln lt tng câu lnh mt ca chng trình ngun ri tin hành thc hin luôn câu lnh đã dch đó, cho ti khi thc hin xong toàn b chng trình. Có th hiu trình biên dch là dch gi, trình thông dch là thông dch viên. NGUYÊN LP TRÌNH HÀM 5 Nhng ngôn ng lp trình cp cao  ch đ biên dch hay gp là : Fortran, Cobol, C, C++, Pascal, Ada, Basic .  ch đ thông dch hay ch đ tng tác : Basic,Lisp, Prolog . I.1.4. Phân loi các ngôn ng lp trình Cho đn nay, đã có hàng trm ngôn ng lp trình đc đ xut nhng trên thc t, ch có mt s ít ngôn ng đc s dng rng rãi. Ngoài cách phân loi theo bc nh đã nói  trên, ngi ta còn phân loi ngôn ng lp trình theo phng thc (paradigm), theo mc đ quan trng (measure of emphasis), theo th h (generation), v.v . Cách phân loi theo bc hay mc (level) là da trên mc đ tru tng so vi các yu t phn cng, chng hn nh lnh (instructions) và cp phát b nh (memory allocation). Mc Lnh S dng b nh Ví d Thp Lnh máy đn gin Truy cp và cp phát trc tip Hp ng, Autocode Cao Biu thc và điu khin tng minh Truy cp và cp phát nh các phép toán, chng hn new FORTRAN, ALGOL, Pascal, C, Ada Rt cao Máy tru tng Truy cp n và t đng cp phát SELT, Prolog, Miranda Hình I.2. Ba mc ca ngôn ng lp trình. Nhng nm gn đây, ngôn ng lp trình đc phát trin theo phng thc lp trình (còn đc gi là phong cách hay kiu lp trình). Mt phng thc lp trình có th đc hiu là mt tp hp các tính nng tru tng (abstract features) đc trng cho mt lp ngôn ng mà có nhiu ngi lp trình thng xuyên s dng chúng. S đ sau đây minh ho s phân cp ca các phng thc lp trình : Khai báo Phng thc lp trình Mnh lnh C s d liu Hàm Lôgic X song song Hng đi tng Th tc Hình I.3. Phân cp ca các phng thc lp trình. Sau đây là mt s ngôn ng lp trình quen thuc lit kê theo phng thc : Các ngôn ng mnh lnh (imperative) có Fortran (1957), Cobol (1959), Basic (1965), Pascal (1970), C (1971), Ada (1979) . • • • • • • Các ngôn ng đnh hng đi tng (object-oriented) có Smalltalk (1969), C ++ (1983), Eiffel (1986), Java (1991), C # (2000), . Các ngôn ng hàm (functional) có Lisp (1958), ML (1973), Scheme (1975), Caml (1987), Miranda (1982), . Các ngôn ng da logic (logic-based) ch yu là ngôn ng Prolog (1970). Ngôn ng thao tác c s d liu nh SQL (1980) . Các ngôn ng x song song (parallel) nh Ada, Occam (1982), C-Linda, . Ngoài ra còn có mt s phng thc lp trình đang đc phát trin ng dng nh : 6 LP TRÌNH HÀM Lp trình phân b (distributed programming). • • • • Lp trình ràng buc (constraint programming). Lp trình hng truy cp (access-oriented programming). Lp trình theo lung d liu (dataflow programming), v.v . Vic phân loi các ngôn ng lp trình theo mc đ quan trng là da trên cái gì (what) s thao tác đc (achieved), hay tính đc (computed), so vi cách thao tác nh th nào (how). Mt ngôn ng th hin cái gì s thao tác đc mà không ch ra cách thao tác nh th nào đc gi là ngôn ng đnh ngha (definitional) hay khai báo (declarative). Mt ngôn ng th hin cách thao tác nh th nào mà không ch ra cái gì s thao tác đc gi là ngôn ng thao tác (operational) hay không khai báo (non-declarative), đó là các ngôn ng mnh lnh. Hình I.4. Phát trin ca ngôn ng lp trình. Các ngôn ng lp trình cng đc phân loi theo th h nh sau : Th h 1 : ngôn ng máy • • • • • • Th h 2 : hp ng Th h 3 : ngôn ng th tc Th h 4 : ngôn ng áp dng hay hàm Th h 5 : ngôn ng suy din hay da logic Th h 6 : mng n-ron (neural networks) NGUYÊN LP TRÌNH HÀM 7 Trc khi nghiên cu lp các ngôn ng lp trình hàm, ta cn nhc li mt s đc đim ca lp các ngôn ng lp trình mnh lnh. I.1.5. Ngôn ng lp trình mnh lnh Trong các ngôn ng mnh lnh, ngi lp trình phi tìm cách din đt đc thut toán, cho bit làm cách nào đ gii mt bài toán đã cho. Mô hình tính toán s dng mt tp hp (hu hn) các trng thái và s thay đi trng thái. Mi trng thái phn ánh ni dung các bin d liu đã đc khai báo. Trng thái luôn b thay đi do các lnh điu khin và các lnh gán giá tr cho các bin trong chng trình. Chng trình biên dch cho phép lu gi các trng thái trong b nh chính và thanh ghi, ri chuyn các phép toán thay đi trng thái thành các lnh máy đ thc hin. Kiu : tp hp giá tr tp hp phép toán cu trúc lu tr bit du 2 14 2 13 2 2 . . . 2 1 2 0 biu din theo bit : 0 0 0 1 . . . 0 1 Tên bin i Tên kiu integer ., −1, 0, 1, . +, −, ×, /, . Mc ngôn ng Mc chng trình dch S 5 Mc máy Hình I.5. Quan h gia tên bin, kiu và giá tr trong ngôn ng mnh lnh Hình I.5. minh ha cách khai báo d liu trong các ngôn ng mnh lnh và các mi quan h theo mc. Ngi ta phân bit ba mc nh sau : mc ngôn ng liên quan đn tên bin, tên kiu d liu và cu trúc lu tr ; mc chng trình dch liên quan đn phng pháp t chc b nh và mc máy cho bit cách biu din theo bit và giá tr d liu tng ng. Mi khai báo bin, ví d int i, ni kt (bind) tên bin (i) vi mt cu trúc đc trng bi tên kiu (int) và vi mt giá tr d liu đc biu din theo bit nh lnh gán i := 5 (hoc nh mt lnh va khai báo va khi gán int i=5). T hp tên, kiu và giá tr đã to nên đc trng ca bin. Các ngôn ng mnh lnh đc s dng hiu qu trong lp trình do ngi lp trình có th tác đng trc tip vào phn cng. Tuy nhiên, tính thc dng mnh lnh làm hn ch trí tu ca ngi lp trình do phi ph thuc vào cu trúc vt ca máy tính. Ngi lp trình luôn có khuynh hng suy ngh v nhng v trí lu tr d liu đã đc đt tên (nguyên tc đa ch hoá) mà ni dung ca chúng thng xuyên b thay đi. Thc t có rt nhiu bài toán cn s tru tng hoá khi gii quyt (ngha là không ph thuc vào cu trúc vt ca máy tính), không nhng đòi hi tính thành tho ca ngi lp trình, mà còn đòi hi kin thc Toán hc tt và kh nng tru tng hoá ca h. T nhng do trên mà ngi ta tìm cách phát trin nhng mô hình tng tác không phn ánh mi quan h vi phn cng ca máy tính, mà làm d dàng lp trình. Ý tng ca mô hình là ngi lp trình cn đc t cái gì s đc tính toán mà không phi mô t cách tính nh th nào. S khác nhau gia «nh th nào» và «cái gì», cng nh s khác nhau gia các ngôn ng 8 LP TRÌNH HÀM mnh lnh và các ngôn ng khai báo, không phi luôn luôn rõ ràng. Các ngôn ng khai báo thng khó cài đt và khó vn hành hn các ngôn ng mnh lnh. Các ngôn ng mnh lnh thng gn gi ngi lp trình hn. Sau đây là mt s đc trng ca ngôn ng lp trình mnh lnh : − S dng nguyên tinh ch tng bc hay làm mn dn, x ln lt các đi tng d liu đã đc đt tên. − Khai báo d liu đ ni kt mt tên bin đã đc khai báo vi mt kiu d liu và mt giá tr. Phm vi hot đng (scope) ca các bin trong chng trình đc xác đnh bi các khai báo, hoc toàn cc (global), hoc cc b (local). − Các kiu d liu c bn thông dng là s nguyên, s thc, ký t và lôgic. Các kiu mi đc xây dng nh các kiu cu trúc. Ví d kiu mng, kiu bn ghi, kiu tp hp, kiu lit kê, . − Hai kiu d liu có cùng tên thì tng đng vi nhau, hai cu trúc d liu là tng đng nu có cùng giá tr và có cùng phép toán x lý. − Trng thái trong (b nh và thanh ghi) b thay đi bi các lnh gán. Trng thái ngoài (thit b ngoi vi) b thay đi bi các lnh vào-ra. Giá tr đc tính t các biu thc. − Các cu trúc điu khin là tun t, chn la (r nhánh), lp và gi chng trình con. − Chng trình con thng có hai dng : dng th tc (procedure) và dng hàm (function). S khác nhau ch yu là hàm luôn tr v mt giá tr, còn th tc thì không không nht thit tr v giá tr. Vic trao đi tham bin (parameter passing) vi chng trình con hoc theo tr (by value) và theo tham chiu (by reference). − S dng chng trình con thng gây ra hiu ng ph (side effect) do có th làm thay đi bin toàn cc. − Mt chng trình đc xây dng theo bn mc : khi (block), chng trinh con, đn th (module/packages) và chng trình. I.2 C s ca các ngôn ng hàm I.2.1. Tính khai báo ca các ngôn ng hàm Trong các ngôn ng mnh lnh, mt chng trình thng cha ba li gi chng trình con (th tc, hàm) liên quan đn quá trình đa vào d liu, x d liu và đa ra kt qu tính toán nh sau : begin GetData( .) ; { đa vào } ProcessData( .); { x } OutPutResults( .); { xem kt qu } end Trong các ngôn ng lp trình hàm, các li gi chng trình con đc vit thành biu thc rt đn gin : (print (process-data (get-data ( .)))) [...]... then 1 else (1* fac (1- 1)) || g i cond > if false then 1 else (1* fac (1- 1)) || tính 1 = 0 > 1* fac (1- 1) > 1* (cond (1- 1 = 0) 1 ( (1- 1) -1) )) || g i fac > 1* ((if 1- 1=0) then 1 else ( (1- 1)*fac ( (1- 1) -1) )) || g i cond > 1* ((if true then 1 else ( (1- 1)*fac ( (1- 1) -1) )) || tính 1- 1 = 0 > 1* 1 || tính 1* 1 > 1 Ph ng pháp tính hàm ki u khôn ngoan còn th hi n m t l i ích quan tr ng khác : cho phép nh ngh a các... fac 1 s c rút g n nh c trình bày d i ây Vi c tính giá tr k t thúc và cho k t qu úng ây ta s d ng bi u th c if d ng gi ng (pseuclo-notation) Tham i th ba c a cond s không c tính n u n b ng 0, vì r ng trong tr ng h p này, không c n tính tham i n a fac 1 > cond (1= 0) 1 (1* fac (1- 1)) || g i fac > if (1= 0) then 1 else (1* fac (1- 1)) || g i cond > if false then 1 else (1* fac (1- 1)) || tính 1 = 0 > 1* fac... hàm tr v k t qu NGUYÊN L P TRÌNH HÀM Bài t p ch 31 ng 1 1 Vi t các hàm Miranda tính g n úng giá tr các hàm sau v i 4 1 1 1 3 5 1 7 x2 2 x4 2 1+ + + 2 3 4 3 2 x S = 1 - x + 2! S y= 1 x2 2! x + 2 Vi t m t ch x4 4! cho 1 2n - 1 4 x6 + cho n khi ph n t th n < e 5 6 x3 xn xn + + ( -1) n + cho n khi n! 3! n! x6 x 2n (2n)! 6! x + + n khi chính xác e = 10 -5 cho x 2n (2 n)! 10 5 có n > 1 d u c n x ng... comprehension) Ví d cách vi t : t a c , [ n | n [1, 3, 5, 7, 9] ch nh m t danh sách có th t c a các s l gi a 1 và 10 Danh sách c hi u là «g m t t c các s n n m gi a 1 và 10 tho mãn n mod 2 b ng 1 M t ví d khác v danh sách nh n bi t c: [ n*n | n . Smalltalk (19 69), C ++ (19 83), Eiffel (19 86), Java (19 91) , C # (2000), . Các ngôn ng hàm (functional) có Lisp (19 58), ML (19 73), Scheme (19 75), Caml (19 87),. phn t có cùng kiu, ví d : [1, 4, 9, 16 ] || danh sách gm 4 s nguyên [1. .10 ] || danh sách 10 s nguyên (1. .10 ) [’u’, ’f’, ’0’] || danh sách gm 3 ký

Ngày đăng: 08/11/2013, 04:15

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan