Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
1,05 MB
Nội dung
i CHNG I. NGUYÊNLÝ LP 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 lp trình I.1.1. Vài nét v lch s Bui ban đu hng ngôn ng lp trình (programming language) đu tiên trên máy tính đin t là ngôn ng máy (machine language), t hp ca các con s h hai, hay h nh phân, hay các bit (vit tt ca binary digit) 0 và 1. Ngôn ng máy ph thuc hoàn toàn vào kin trúc phn cng ca máy tính và nhng quy c kht khe ca nhà ch to. gii các bài toán, ngi lp trình phi s dng mt tp hp các lnh điu khin rt s cp mà mi lnh là mt t hp các s h hai nên gp rt nhiu khó khn, mt nhc, rt d mc phi sai sót, nhng li rt khó sa li. N T nhng nm 1950, đ gim nh vic lp trình, ngi ta đa vào k thut chng trình con (sub-program hay sub-routine) và xây dng các th vin chng trình (library) đ khi cn thì gi đn hoc dùng li nhng đon chng trình đã vit. Ngôn ng máy tin gn đn ngôn ng t nhiên Cng t nhng nm 1950, ngôn ng hp dch, hay hp ng (assembly) hay cng còn đc gi là ngôn ng biu tng (symbolic) ra đi. Trong hp ng, các mã lnh và đa ch các toán hng đc thay th bi các t ting Anh gi nh (mnemonic) nh ADD, SUB, MUL, DIV, JUMP . tng ng vi các phép toán s hc + - × /, phép chuyn điu khin, v.v . Do máy tính ch hiu ngôn ng máy, các chng trình vit bng hp ng không th chy ngay đc mà phi qua giai đon hp dch (assembler) thành ngôn ng máy. Tuy nhiên, các hp ng vn còn ph thuc vào phn cng và xa l vi ngôn ng t nhiên (natural language), ngi lp trình vn còn gp nhiu khó khn khi gii các bài toán trên máy tính. Nm 1957, hãng IBM đa ra ngôn ng FORTRAN (FORmula TRANslator). ây là ngôn ng lp trình đu tiên gn gi ngôn ng t nhiên vi cách din đt toán hc. FORTRAN cho phép gii quyt nhiu loi bài toán khoa hc, k thut và sau đó đc nhanh chóng ng dng rt rng rãi cho đn ngày nay vi kho tàng th vin thut toán rt đ s và tin dng. Tip theo là s ra đi ca các ngôn ng ALGOL 60 (ALGOrithmic Language) nm 1960, COBOL (Comon Business Oriented Language) nm 1964, Simula nm 1964, v.v . 1 2 LP TRÌNH HÀM Phát trin ca ngôn ng lp trình Theo s phát trin ca các th h máy tính, các ngôn ng lp trình cng không ngng đc ci tin và hoàn thin đ càng ngày càng đáp ng nhu cu ca ngi s dng và gim nh công vic lp trình. Rt nhiu ngôn ng lp trình đã ra đi trên nn tng lý thuyt tính toán (theory of computation) và hình thành hai loi ngôn ng : ngôn ng bc thp và ngôn ng bc cao. Các ngôn ng bc thp (low-level language), hp ng và ngôn ng máy, thng ch dùng đ vit các chng trình điu khin và kim tra thit b, chng trình sa li (debugger) hay công c . Các ngôn ng lp trình bc cao (high-level language) là phng tin giúp ngi làm tin hc gii quyt các vn đ thc t nhng đng thi cng là ni mà nhng thành tu nghiên cu mi nht ca khoa hc máy tính đc đa vào. Lnh vc nghiên cu phát trin các ngôn ng lp trình va có tính truyn thng, va có tính hin đi. Ngày nay, vi nhng tin b ca khoa hc công ngh, ngi ta đã có th s dng các công c hình thc cho phép gim nh công vic lp trình t lúc phân tích, thit k cho đn s dng mt ngôn ng lp trình. I.1.2. nh ngha mt ngôn ng lp trình Các ngôn ng lp trình bc cao đc xây dng mô phng ngôn ng t nhiên, thng là ting Anh (hoc ting Nga nhng nm trc đây). nh ngha mt ngôn ng lp trình là đnh ngha mt vn phm (grammar) đ sinh ra các câu đúng ca ngôn ng đó. Có th hình dung mt vn phm gm bn thành phn : b ký t, b t vng, cú pháp và ng ngha. 1. B ký t (character set) Gm mt s hu hn các ký t (hay ký hiu) đc phép dùng trong ngôn ng. Trong các máy tính cá nhân, ngi ta thng s dng các ký t ASCII. Có th hiu b ký t có vai trò nh bng ch cái (alphabet) ca mt ngôn ng t nhiên đ to ra các t (word). 2. B t vng (vocabulary) Gm mt tp hp các t, hay đn v t vng (token), đc xây dng t b ký t. Các t dùng đ to thành câu lnh trong mt chng trình và đc phân loi tu theo vai trò chc nng ca chúng trong ngôn ng. Chng hn chng trình Pascal sau đây : program P; var ×, y : integer; begin read(x); y:=x+2; write(y) end. gm các đn v t vng : 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. Hng (constants) : 2 Phép toán (operators) : + , := Du phân cách (delimiters) : :, (, ), . NGUYÊNLÝ LP TRÌNH HÀM 3 3. Cú pháp (syntax) Cú pháp quy đnh cách thc kt hp các ký t thành t, kt hp các t thành câu lnh đúng (statement hay instruction), kt hp các câu lnh đúng thành mt chng trình hoàn chnh v mt vn phm. Có th hình dung cách kt hp này ging cách đt câu trong mt ngôn ng t nhiên. Thng ngi ta dùng s đ cú pháp (syntax diagram) hoc dng chun Backus-Naur (Backus-Naur Form, vit tt BNF), hoc dng chun Backus-Naur m rng (EBNF − Extended Backus-Naur Form) đ mô t cú pháp ca vn phm. Ví d I.1.1 : Trong ngôn ng Pascal (hoc trong phn ln các ngôn ng lp trình), tên gi, 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 mt s đ cú pháp, các ô hình ch nht ln lt phi đc thay th bi các ô hình tròn. Quá trình thay th thc hin th t theo chiu mi tên cho đn khi nhn đc câu đúng. Chng hn có th «đc» s đ trên nh sau : tên phi bt đu bng ch, tip theo có th là ch hoc s tu ý, ch ch có th là mt trong các ch cái A Za z, s ch có th là mt trong các ch s 0 9. Nh vy, Delta, x1, x2, Read, v.v . là các tên vit đúng, còn 1A, β, π, bán kính, v.v . đu không phi là tên vì vi phm quy tc cú pháp. Vn phm BNF gm mt dãy quy tcc. Mi quy tc gm v trái, du đnh ngha ::= (đc đc đnh ngha bi) và v phi. V trái là mt ký hiu phi đc đnh ngha, còn v phi là mt dãy các ký hiu, hoc đc tha nhn, hoc đã đc đnh ngha t trc đó, tuân theo mt quy c nào đó. EBNF dùng các ký t quy c nh sau : Ký hiu Ý ngha ::=, hoc →, hoc = đc đnh ngha là { } chui ca 0 hay nhiu mc lit kê tu chn (option) [] hoc 0 hoc 1 mc lit kê tu chn < > mc lit kê phi đc thay th | hoc (theo ngha loi tr) Các quy tc BNF đnh ngha 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 Vn phm ca mt ngôn ng lp trình đn gin dng EBNF nh sau : <program> ::= program <statement> * end <statement> ::= <assignment> | <loop> <assignment> ::= <identifier> := <expression> ; 4 LP 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’ Mt câu, tc là mt chng trình đn gin, vit trong vn phm trên nh sau : program n := 1 ; while n <= 10 do n := n + 1 ; done end 4. Ng ngha (semantic) Cn c vào cú pháp ca ngôn ng lp trình, ngi lp trình vit chng trình gm các câu lnh theo trình t cho phép đ gii quyt đc bài toán ca mình. đt đc mc đích đó, mi câu lnh vit ra không nhng đúng đn v mt cú pháp, mà còn phi đúng đn c v mt ng ngha, hay ý ngha logic ca câu lnh. Tính đúng đn v mt ng ngha cho phép gii quyt đc bài toán, chng trình chy luôn luôn dng, n đnh và cho kt qu phù hp vi yêu cu đt ra ban đu. I.1.3. Khái nim v chng trình dch Chng trình đc vit trong mt ngôn ng lp trình bc cao, hoc bng hp ng, đu đc gi là chng trình ngun (source program). Bn thân máy tính không hiu đc các câu lnh trong mt chng trình ngun. Chng trình ngun phi đc dch (translate) thành mt chng trình đích (target program) trong ngôn ng máy (là các dãy s 0 và 1), máy mi có th đc «hiu» và thc hin đc. Chng trình đích còn đc gi là chng trình thc hin (executable program). Chng trình trung gian đm nhim vic dch đó đc gi là các chng trình dch. Vic thit k chng trình dch cho mt ngôn ng lp trình đã cho là cc k khó khn và phc tp. Chng trình dch v nguyên tc phi vit trên ngôn ng máy đ gii quyt vn đ x lý ngôn ng và tính vn nng ca các chng trình ngun. Tuy nhiên, ngi ta thng s dng hp ng đ vit các chng trình dch. Bi vì vic dch mt chng trình hp ng ra ngôn ng máy đn gin hn nhiu. Hin nay, ngi ta cng vit các chng trình dch bng chính các ngôn ng bc cao hoc các công c chuyên dng. Thông thng có hai loi chng trình dch, hay hai ch đ dch, là trình biên dch và trình thông dch, hot đng nh sau : Trình biên dch (compilater) dch toàn b chng trình ngun thành chng trình đích ri sau đó mi bt đu tin hành thc hin chng trình đích. • • Trình thông dch (interpreter) dch ln lt tng câu lnh mt ca chng trình ngun ri tin hành thc hin luôn câu lnh đã dch đó, cho ti khi thc hin xong toàn b chng trình. Có th hiu trình biên dch là dch gi, trình thông dch là thông dch viên. NGUYÊNLÝ LP TRÌNH HÀM 5 Nhng ngôn ng lp trình cp cao ch đ biên dch hay gp là : Fortran, Cobol, C, C++, Pascal, Ada, Basic . ch đ thông dch hay ch đ tng tác : Basic,Lisp, Prolog . I.1.4. Phân loi các ngôn ng lp trình Cho đn nay, đã có hàng trm ngôn ng lp trình đc đ xut nhng trên thc t, ch có mt s ít ngôn ng đc s dng rng rãi. Ngoài cách phân loi theo bc nh đã nói trên, ngi ta còn phân loi ngôn ng lp trình theo phng thc (paradigm), theo mc đ quan trng (measure of emphasis), theo th h (generation), v.v . Cách phân loi theo bc hay mc (level) là da trên mc đ tru tng so vi các yu t phn cng, chng hn nh lnh (instructions) và cp phát b nh (memory allocation). Mc Lnh S dng b nh Ví d Thp Lnh máy đn gin Truy cp và cp phát trc tip Hp ng, Autocode Cao Biu thc và điu khin tng minh Truy cp và cp phát nh các phép toán, chng hn new FORTRAN, ALGOL, Pascal, C, Ada Rt cao Máy tru tng Truy cp n và t đng cp phát SELT, Prolog, Miranda Hình I.2. Ba mc ca ngôn ng lp trình. Nhng nm gn đây, ngôn ng lp trình đc phát trin theo phng thc lp trình (còn đc gi là phong cách hay kiu lp trình). Mt phng thc lp trình có th đc hiu là mt tp hp các tính nng tru tng (abstract features) đc trng cho mt lp ngôn ng mà có nhiu ngi lp trình thng xuyên s dng chúng. S đ sau đây minh ho s phân cp ca các phng thc lp trình : Khai báo Phng thc lp trình Mnh lnh C s d liu Hàm Lôgic X lý song song Hng đi tng Th tc Hình I.3. Phân cp ca các phng thc lp trình. Sau đây là mt s ngôn ng lp trình quen thuc lit kê theo phng thc : Các ngôn ng mnh lnh (imperative) có Fortran (1957), Cobol (1959), Basic (1965), Pascal (1970), C (1971), Ada (1979) . • • • • • • Các ngôn ng đnh hng đi tng (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 da logic (logic-based) ch yu là ngôn ng Prolog (1970). Ngôn ng thao tác c s d liu nh SQL (1980) . Các ngôn ng x lý song song (parallel) nh Ada, Occam (1982), C-Linda, . Ngoài ra còn có mt s phng thc lp trình đang đc phát trin ng dng nh : 6 LP TRÌNH HÀM Lp trình phân b (distributed programming). • • • • Lp trình ràng buc (constraint programming). Lp trình hng truy cp (access-oriented programming). Lp trình theo lung d liu (dataflow programming), v.v . Vic phân loi các ngôn ng lp trình theo mc đ quan trng là da trên cái gì (what) s thao tác đc (achieved), hay tính đc (computed), so vi cách thao tác nh th nào (how). Mt ngôn ng th hin cái gì s thao tác đc mà không ch ra cách thao tác nh th nào đc gi là ngôn ng đnh ngha (definitional) hay khai báo (declarative). Mt ngôn ng th hin cách thao tác nh th nào mà không ch ra cái gì s thao tác đc gi là ngôn ng thao tác (operational) hay không khai báo (non-declarative), đó là các ngôn ng mnh lnh. Hình I.4. Phát trin ca ngôn ng lp trình. Các ngôn ng lp trình cng đc phân loi theo th h nh sau : Th h 1 : ngôn ng máy • • • • • • Th h 2 : hp ng Th h 3 : ngôn ng th tc Th h 4 : ngôn ng áp dng hay hàm Th h 5 : ngôn ng suy din hay da logic Th h 6 : mng n-ron (neural networks) NGUYÊNLÝ LP TRÌNH HÀM 7 Trc khi nghiên cu lp các ngôn ng lp trình hàm, ta cn nhc li mt s đc đim ca lp các ngôn ng lp trình mnh lnh. I.1.5. Ngôn ng lp trình mnh lnh Trong các ngôn ng mnh lnh, ngi lp trình phi tìm cách din đt đc thut toán, cho bit làm cách nào đ gii mt bài toán đã cho. Mô hình tính toán s dng mt tp hp (hu hn) các trng thái và s thay đi trng thái. Mi trng thái phn ánh ni dung các bin d liu đã đc khai báo. Trng thái luôn b thay đi do các lnh điu khin và các lnh gán giá tr cho các bin trong chng trình. Chng trình biên dch cho phép lu gi các trng thái trong b nh chính và thanh ghi, ri chuyn các phép toán thay đi trng thái thành các lnh máy đ thc hin. Kiu : tp hp giá tr tp hp phép toán cu trúc lu tr bit du 2 14 2 13 2 2 . . . 2 1 2 0 biu din theo bit : 0 0 0 1 . . . 0 1 Tên bin i Tên kiu integer ., −1, 0, 1, . +, −, ×, /, . Mc ngôn ng Mc chng trình dch S 5 Mc máy Hình I.5. Quan h gia tên bin, kiu và giá tr trong ngôn ng mnh lnh Hình I.5. minh ha cách khai báo d liu trong các ngôn ng mnh lnh và các mi quan h theo mc. Ngi ta phân bit ba mc nh sau : mc ngôn ng liên quan đn tên bin, tên kiu d liu và cu trúc lu tr ; mc chng trình dch liên quan đn phng pháp t chc b nh và mc máy cho bit cách biu din theo bit và giá tr d liu tng ng. Mi khai báo bin, ví d int i, ni kt (bind) tên bin (i) vi mt cu trúc đc trng bi tên kiu (int) và vi mt giá tr d liu đc biu din theo bit nh lnh gán i := 5 (hoc nh mt lnh va khai báo va khi gán int i=5). T hp tên, kiu và giá tr đã to nên đc trng ca bin. Các ngôn ng mnh lnh đc s dng hiu qu trong lp trình do ngi lp trình có th tác đng trc tip vào phn cng. Tuy nhiên, tính thc dng mnh lnh làm hn ch trí tu ca ngi lp trình do phi ph thuc vào cu trúc vt lý ca máy tính. Ngi lp trình luôn có khuynh hng suy ngh v nhng v trí lu tr d liu đã đc đt tên (nguyên tc đa ch hoá) mà ni dung ca chúng thng xuyên b thay đi. Thc t có rt nhiu bài toán cn s tru tng hoá khi gii quyt (ngha là không ph thuc vào cu trúc vt lý ca máy tính), không nhng đòi hi tính thành tho ca ngi lp trình, mà còn đòi hi kin thc Toán hc tt và kh nng tru tng hoá ca h. T nhng lý do trên mà ngi ta tìm cách phát trin nhng mô hình tng tác không phn ánh mi quan h vi phn cng ca máy tính, mà làm d dàng lp trình. Ý tng ca mô hình là ngi lp trình cn đc t cái gì s đc tính toán mà không phi mô t cách tính nh th nào. S khác nhau gia «nh th nào» và «cái gì», cng nh s khác nhau gia các ngôn ng 8 LP TRÌNH HÀM mnh lnh và các ngôn ng khai báo, không phi luôn luôn rõ ràng. Các ngôn ng khai báo thng khó cài đt và khó vn hành hn các ngôn ng mnh lnh. Các ngôn ng mnh lnh thng gn gi ngi lp trình hn. Sau đây là mt s đc trng ca ngôn ng lp trình mnh lnh : − S dng nguyênlý tinh ch tng bc hay làm mn dn, x lý ln lt các đi tng d liu đã đc đt tên. − Khai báo d liu đ ni kt mt tên bin đã đc khai báo vi mt kiu d liu và mt giá tr. Phm vi hot đng (scope) ca các bin trong chng trình đc xác đnh bi các khai báo, hoc toàn cc (global), hoc cc b (local). − Các kiu d liu c bn thông dng là s nguyên, s thc, ký t và lôgic. Các kiu mi đc xây dng nh các kiu cu trúc. Ví d kiu mng, kiu bn ghi, kiu tp hp, kiu lit kê, . − Hai kiu d liu có cùng tên thì tng đng vi nhau, hai cu trúc d liu là tng đng nu có cùng giá tr và có cùng phép toán x lý. − Trng thái trong (b nh và thanh ghi) b thay đi bi các lnh gán. Trng thái ngoài (thit b ngoi vi) b thay đi bi các lnh vào-ra. Giá tr đc tính t các biu thc. − Các cu trúc điu khin là tun t, chn la (r nhánh), lp và gi chng trình con. − Chng trình con thng có hai dng : dng th tc (procedure) và dng hàm (function). S khác nhau ch yu là hàm luôn tr v mt giá tr, còn th tc thì không không nht thit tr v giá tr. Vic trao đi tham bin (parameter passing) vi chng trình con hoc theo tr (by value) và theo tham chiu (by reference). − S dng chng trình con thng gây ra hiu ng ph (side effect) do có th làm thay đi bin toàn cc. − Mt chng trình đc xây dng theo bn mc : khi (block), chng trinh con, đn th (module/packages) và chng trình. I.2 C s ca các ngôn ng hàm I.2.1. Tính khai báo ca các ngôn ng hàm Trong các ngôn ng mnh lnh, mt chng trình thng cha ba li gi chng trình con (th tc, hàm) liên quan đn quá trình đa vào d liu, x lý d liu và đa ra kt qu tính toán nh sau : begin GetData( .) ; { đa vào } ProcessData( .); { x lý } OutPutResults( .); { xem kt qu } end Trong các ngôn ng lp trình hàm, các li gi chng trình con đc vit thành biu thc rt đn gin : (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ÊNLÝ L P TRÌNH HÀM Bài t p ch 31 ng 11 Vi t các hàm Miranda tính g n úng giá tr các hàm sau v i 4 1 11 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),. phn t có cùng kiu, ví d : [1, 4, 9, 16 ] || danh sách gm 4 s nguyên [1. .10 ] || danh sách 10 s nguyên (1. .10 ) [’u’, ’f’, ’0’] || danh sách gm 3 ký