1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

Đ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

Thông tin cơ bản

Định dạng
Số trang 64
Dung lượng 1,05 MB

Nội dung

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Ừ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN