Chương 1 NGÔN NGỮLẬPTRÌNHVÀ TỰ ĐỘNGHOÁTHIẾTKẾ 1.1. KHÁI NIỆM VỀ NGÔN NGỮLẬPTRÌNHNgônngữlậptrình là những phần mềm để phát triển các ứng dụng. Ngônngữlậptrình đã trải qua quá trình phát triển và không ngừng hoàn thiện, nó là công cụ quan trọng đối với sự phát triển của công nghệ thông tin. Tựđộnghoá tính toán, thiếtkếvà hiển thị kết quả tính đều thông qua ngônngữlập trình. Những ngônngữlậptrình có ứng dụng rộng rãi và hiệu quả có thể nêu lên sau đây. 1.2. GIỚI THIỆU MỘT SỐ NGÔNNGỮLẬPTRÌNH ĐIỂN HÌNH • FORTRAN (viết tắt từ FORmula TRANslation) ra đời từ những năm năm mươi, chính xác hơn năm 1957, ứng dụng chủ yếu trong các ngành khoa học, kỹ thuật. Phiên bản đầu của FORTRAN thường được nhắc đến với tên gọi FORTRAN II , song phiên bản được dùng phổ biến nhất là FORTRAN IV. Các dàn máy IBM thời bấy giờ nhận dạng phiên bản phổ thông này dưới tên viết ghép FORTRAN. Ngônngữ thích hợp cho việc xử lý những bài toán cỡ lớn của thời đại, được dùng trong các chương trình tính toán thiếtkế ô tô, tàu thuỷ, máy bay, tính toán độ bền các công trình xây dựng, thiếtkế tối ưu. Có thể coi hơn 90% những chương trình lớn trong các lĩnh vực khoa học, kỹ thuật được viết bằng ngônngữ này. Thực tế sử dụng đã nảy sinh vài vấn đề phiền toái. Các nhà sản xuất các chương trình đa năng tự cho phép mình viết các bộ dịch cho FORTRAN theo sở trường của riêng mình. Tuy phần lớn các nhà sản xuất vẫn dựa vào tiêu chuẩn của ANSI - American National Standards Institute để biên soạn compiler cho FORTRAN IV song chẳng có bộ dịch nào giống bộ dịch nào, vì người nào cũng cố xé rào khỏi chuẩn ANSI. Tình hình ấy bắt buộc ANSI phải ra tay thống nhất, năm 1978 phiên bản cuối cùng mang tên ANSI X3.9 - 1978 đã đặt dấu chấm cho sự bùng phát tự do. Phiên bản này có tên gọi FORTRAN 77, ngày nay được dùng tương đối rộng rãi. • Algol , viết tắt từ Algorithm, ra đời vào đầu những năm sáu mươi với sự tham gia rất đông các nhà toán học, những người viết chương trình của châu Âu. Ngônngữ được thiếtkế rất trong sáng, dễ học, dễ thực hiện. Đây là phiên bản của bộ môn toán tính dùng trong máy tính. Ngônngữ thích hợp cho việc giải quyết những vấn đề khoa học của thời đại. Tất cả các thuật toán chuẩn ra đời trong thời kỳ này được chuyển thành chương trình viết bằng Algol 60. Cho đến cuối những năm bảy mươi chương trình bằng ngônngữ Algol còn được chạy trên các dàn máy lớn. Những chương trình mẫu giải quyết những vấn đề tính toán theo phương pháp số, đặc biệt phần đại số tuyến tính, viết bằng Algol từ những năm sáu mươi cho đến tận ngày nay vẫn là những chương trình ưu việt, chưa gì thay được. Ngônngữ này là ngônngữ tốt song không sinh ra tại Mỹ, có lẻ đó là căn cứ để giải thích câu hỏi tại sao ngônngữ này không tìm được chỗ đứng ở Mỹ, việc này đồng nghĩa với sự hạn chế số người dùng và sự phát triển tiếp theo. • COBOL (Common Business Oriented Language) ra đời năm 1960, áp dụng chủ yếu trong lĩnh vực kinh doanh, thương mại. Ngônngữ này được hoàn thiện và còn tìm thấy chỗ đứng tận hôm nay. • BASIC (viết tắt từ Beginner's All-purpose Symbolie Instruction Code) do Kemeny và Kurtz phát triển từ năm 1964 tại Mỹ, là ngônngữ dùng cho máy tính nhỏ. Basic dễ học và sử dụng không khó lắm, song khả năng giải quyết công việc không lớn. Điều phiền toái nữa là ngônngữ này thuộc dạng "dễ tính" nên được phát triển gần như không kiểm soát được. Tồn tại quá nhiều "thổ ngữ" từ Basic nên khó chọn thứ tiếng chuẩn mực cho ứng dụng. Năm 1975 Gates W. viết ngônngữ cũng mang tên BASIC cho máy Altair, dạng microcomputer đầu tiên. Ngônngữ mang tên BASIC ngày nay thực tế là các cải biên của thứ tiếng mà Gates đã đưa ra thời đó. • Ngônngữ PL ( Programming Language ) còn được viết dưới dạng PL1 hoặc PL/I, cải biên cách viết PL1, được người khổng lồ lúc bấy giờ IBM đặt ra trong thời gian 1963 - 1966 sau thành công của FORTRAN và các ngônngữ khác tại Mỹ. Ngônngữ thừa kế những kết quả tốt đẹp của FORTRAN, Algol , Cobol . Bản thân ngônngữ bậc cao này cũng đã có tham vọng sử dụng ngônngữ assembly làm các phương tiện nối ghép, chạy chương trình mẫu. Người ta đặt thêm số 1 cuối tên gọi với hàm ý "ngôn ngữlậptrình số 1". Tuy ý tưởng hay, thiếtkế chuẩn song thực tế không được như ý muốn chủ quan của những người sinh non ra nó. Ngônngữ được quảng cáo rùm beng, song người dùng không nhiều vì các compiler của PL làm việc quá tồi. Ngônngữ không thọ được bao lâu, ngày nay thế hệ trẻ khỏi phải nghe quảng cáo ngônngữ number one nữa . • Pascal ra đời chính thức 1971. Người có công thiếtkếngônngữ là Niklaus Wirrth . Tên gọi của ngônngữ Pascal để ghi nhớ công lao của nhà toán học lớn thế kỷ 17 Blaise Pascal. Ngônngữ Pascal thuộc nhóm có cấu trúc chặt, là ngônngữlậptrình tiêu chuẩn bất cứ người lậptrình nào cũng nên biết. Theo nhận định của các nhà chuyên môn, đây là thứ ngônngữ "lingua franca", làm cả chức năng "common tongue", là tiếng nói chung cho lập trình. Ngày nay trong các trường học, trong các lớp học về lập trình, tại các kỳ thi năng khiếu ngônngữ này còn là ngônngữ chính thức để truyền thụ và thi tài. • C là ngônngữlậptrình đa năng, ứng dụng vào việc giải quyết những công việc thực tế nảy sinh từ cuộc sống. C được coi là ngônngữ gần "ngôn ngữ máy", có khả năng giải quyết mọi công việc mà những ngônngữlậptrình "bậc cao" sinh trước nó như FORTRAN, PL1, Pascal đã làm, đồng thời còn giải quyết cả những việc mà đàn anh không muốn chạm tới, những việc chỉ giành cho ngônngữ gần gũi máy như Assembler giải quyết. Lịch sử phát triển của C có nhiều điều đáng nhắc. Yêu cầu thực tế của AT & T là phải có ngônngữ dùng cho hệ điều hành UNIX, sử dụng trên máy DEC PDP - 11. Việc này được giao cho Nennis Ritchie. Hệ điều hành, compiler và chương trình ứng dụng đều được D.Ritchie viết bằng C năm 1972. Thực ra, trước đó Martin Richards đã được giao công việc tương tựvà kết quả của nó là ra đời ngônngữ có tên viết tắt BCPL. Trên cơ sở BCPL năm 1970 Ken Thompson soạn ngônngữ B (có thể bắt nguồn từ cái tên BCPL) và đã soạn đủ phần mềm để điều hành DEC PDP - 7. Vào năm 1972 với sự cộng tác của K.Thompson , D.Ritchie đã đi từ B đến C. Nguồn gốc của tên gọi "C" chỉ đơn giản vậy. Năm 1978 nhà xuất bản Prentice - Hall tung ra thị trường "The C Pragramming Language" do Brian W . Kernighan và Dennis M.Ritchie, viết tắt là K & R cùng viết. Sách ra đời là món quà vô giá đối với giới lập trình. C vượt ra khỏi ranh giới ban đầu là ngônngữ của hệ điều hành UNIX để thâm nhập vào DOS và hệ điều hành của IBM. Năm 1983 American National Standarts Institute (ANSI) thành lập uỷ ban này là khẳng định tính đúng đắn của C và uỷ ban chấp nhận (có thêm bớt) ngônngữ C với tên "ANSI C". ANSI C chính thức có hiệu lực từ năm 1988. Cuối những năm tám mươi và đầu những năm chín mươi thế giới lậptrình chứng kiến sự bùng nổ ứng dụng C. Ngônngữ C đang lấn sân những ngônngữlậptrình đàn anh đã một thời vang bóng. Ngoài hệ điều hành UNIX của AT & T, nhiều hãng sản xuất phần mềm xây dựng các bộ dịch C để đưa vào hoạt động. Các bộ dịch có độ tin cậy cao gồm : • Turbo C ++ Professinal, Borland C++ • Zortech C cho máy IBM PC • Microsoft C • Mixsoftware's Power Điểm mạnh của C được thể hiện trên nhiều mặt. C rất gần với ngônngữ Assembly và giao tiếp dễ dàng với Assembly. C thao tác trên các bit nhanh chóng, chính xác và hiệu quả như ngônngữ máy vẫn làm. C chấp nhận làm việc với mọi kiểu dữ liệu, với độ chính xác do người dùng đặt. Với biến con trỏ C phát huy thế mạnh khi thao tác mảng, chuỗi, hàm, v v . So với các ngônngữlậptrình khác, C điều khiển con trỏ thuần thục, dễ dàng hơn. Con trỏ giúp C đẩy nhanh tốc độ tính toán, giảm chi phí bộ nhớ. Con trỏ làm cho C vượt trội các ngônngữ khác về tính mềm mại, dễ sử dụng và tạo cho C sức mạnh để chinh phục các vấn đề phức tạp. • Ngônngữ C ++ Bản thân C ++ là sự phát triển ở mức cao từ C, song nó lại không hoàn toàn là C. Ngônngữ C thuộc nhóm ngônngữlậptrình có cấu trúc chặt, còn C ++ lại tạo cho người viết những thoả mái ngoài mong đợi . Trong C chương trình được xây dựng với mục đích rất cụ thể, để giải quyết một việc cụ thể nào đó. C ghi nhận dữ liệu và dữ liệu đó có thể ở dạng đơn giản hoặc phức tạp, xử lý dữ liệu và thông báo ra cũng là dữ liệu là đối tượng phục vụ của nó. Còn C ++ , hiểu theo nghĩa lậptrình hướng đối tượng (OOP) thì lại nhắm vào đối tượng, mà đối tượng theo nghĩa chung nhất là một cái gì đó có giới hạn. Trong đối tượng người ta đưa dữ liệu vào và cả các phương pháp khai thác, sử dụng dữ liệu nữa. Vàlậptrình hướng đối tượng không chỉ hạn chế làm một việc cụ thể mà giải quyết bất kỳ việc gì cần cho đối tượng. Trước khi mang tên C ++ ngônngữ này có tên ban đầu là "C with Classes" tức là "C với các lớp". Lớp đi liền với chúng ta khi còn dùng C ++ . C ra đời trên thực tế từ 1972 từ Bell Labs do Dennis Ritchie và Ken Thompson viết. Ban đầu C chưa nổi tiếng ngay, nó phát triển âm thầm cho đến năm 1978 khi Brian Keringhan và Dennis Ritchie tung ra "The C Programming Language". Từ đó ngônngữ C phát triển nhanh và được tiêu chuẩn hoá bằng hội đồng của ANSI ( Mỹ ), từ 1983 đến năm 1988. Ngônngữ ANSI C được chính thức khai tên từ 1988. C ++ tự nó đã là ngônngữlậptrình như tên gọi của cuốn sách, song nó thừa kế một cách hoàn mỹ những gì tốt đẹp nhất của C và phát triển sự tốt đẹp ở mức cao hơn. Thực tế đã chứng minh C là ngônngữ uyển chuyển, có khả năng thâm nhập vào các lĩnh vực tính toán, quản lý song C ++ còn linh hoạt và uyển chuyển hơn. C là ngônngữ vô cùng mạnh song C ++ được coi là mạnh hơn. Giống như các ngônngữlậptrình khác, C theo nghĩa cũ vẫn bị rào cản trong một vài hạn chế, còn C ++ đang phá bỏ rào cản đó. Trong thực tế có thể coi C ++ là công cụ làm việc thích hợp cho những người lập trình. Trong quản lý dữ liệu, C và nhiều ngônngữ khác sử dụng struct (hay còn gọi là record nếu hiểu theo nghĩa chung nhất) để quản lý các đối tượng. Công việc quản lý đó không có gì chê trách được. Song khác với struct, khi C ++ đưa vào lớp (class) cả đối tượng và công cụ quản lý đối tượng nó liền phát huy thế mạnh đến mức không ngờ được. Ngônngữlậptrình nếu kể đầy đủ phải bao gồm từngônngữ máy vàngônngữ gần với ngônngữ máy. Có thể xếp các ngônngữ máy tính vào trong năm nhóm, hay nói cách khác trong năm thế hệ của ngônngữlập trình. Thế hệ đầu tiên giành chỉ các mã số 0 và số 1 mà mỗi bit của máy tính đều hiểu. Ngônngữ này làm người thông ngôn duy nhất trong những năm bốn mươi đến đầu những năm năm mươi. Tại thời điểm này máy chỉ có thể "hiểu" ngônngữ độc nhất là mã nhị phân (binary code), gồm 0 và 1. Ngônngữ đầu tiên này còn mang tên gọi "ngôn ngữ máy". Thế hệ thứ hai của ngônngữ máy tính đánh dấu bằng sự ra đời của ngônngữ Assembly, ngày nay có người dịch là hợp ngữ. Assembly giúp cho máy tính nhận diện và dịch sang ngônngữ máy các mã mnemonic như ADD (cộng, thêm vào), SUB (trừ), MOV (dịch chuyển) v v . Các chương trình sử dụng các mnemonic để viết được gọi là assembly, còn chương trình dịch assembly sang ngônngữ máy có tên gọi là Assembler. Ngônngữ Assembly ra đời trong những năm năm mươi và đến tận hôm nay còn giữ được vị trí rất cao trong làng ngônngữlập trình, mặc dầu bản thân nó là cầu nối giữa "ngôn ngữ bậc thấp" với "ngôn ngữ bậc cao". Thế hệ thứ ba đánh dấu bằng sự ra đời và thống trị của "ngôn ngữ bậc cao" (tiếng Anh viết là HLL - high level languages), kểtừ Algol, FORTRAN, . Ngônngữ bậc cao còn được gọi là ngônngữ thủ tục hoá. Sở dĩ có tên gọi như vừa nêu vì rằng cách diễn đạt bằng ngôntừ khi dùng HLL không khác gì làm thủ tục tính toán. Người ta viết các lệnh dưới dạng công thức tính như đang viết công thức toán vậy, không hề để ý đến nguyên lý làm việc của ngônngữ máy là thứ ngônngữ duy nhất máy có thể hiểu. Ví dụ khi cần tính "số quả còn lại C, nếu biết rằng tổng số quả A, em đã ăn B quả", người lậptrình chỉ cần ra lệnh: C = A - B Để máy hiểu được ý trên nhất thiết phải dịch dòng lệnh này ra ngônngữ máy. Những bộ dịch cho HLL mang một trong hai tên gọi "compiler" hoặc "interpreter". Thứ tự truyền đạt lệnh đến máy có thể hình dung như sau: người lậptrình → compiler hoặc interpreter → Assembler → máy tính. Bạn đọc cần phân biệt hai tên gọi vừa nêu "compiler" và "interpreter" cùng làm một việc, trong tiếng Anh người ta dùng khái niệm "translation" (nghĩa của nó là dịch) để diễn đạt việc ấy. Compiler dịch toàn bộ chương trình giống như cách dịch toàn bộ bài nói của một ai đó từ tiếng nước này sang ngônngữ của nước chủ nhà. Trong khi đó interpreter dịch từng câu lệnh một, giống kiểu người phiên dịch (tiếng Anh gọi là interpreter) chuyển từng câu nói của một vị khách sang tiếng chủ nhà. Trường hợp bắt buộc phải có mặt cả hai thành phần cho công việc dịch là người phát biểu bằng tiếng nước ngoài và người phiên dịch. Compiler thực hiện công việc nhanh hơn, gọn hơn. Công việc kiểu sau chậm hơn vì phải chờ thông tin qua lại giữa người phát biểu và phiên dịch viên. Tuy nhiên interpreter có ưu điểm nổi trội là làm cho chương trình hoạt động thuận lợi và dễ dàng hơn. Vì không cần thiết phải dịch xong toàn bộ chương trình mới chạy chương trình, interpreter chuyển từng phần chương trình vào hoạt động nếu phần việc ấy đã được viết đúng bằng ngônngữlập trình. Trường hợp có lỗi trong câu lệnh, interpreter phát hiện lỗi ngay tức thì và yêu cầu chỉnh lại ngay lúc đó. Sau mỗi lần chỉnh, nếu đúng, câu lệnh sẽ được thực thi ngay. Trong thực tế người ta đang kết hợp cả hai cách làm việc nhằm đẩy mạnh tốc độ thực hiện và tạo thuận lợi tối đa cho người dùng. Tại đây bạn đọc cần làm quen thêm với khái niệm mã nguồn và mã đối tượng. Mã chương trình được gọi là mã nguồn. Sản phẩm có xuất xứ từ mã nguồn, sau khi dịch gọi là mã đối tượng. Tất cả phần mềm khi bán ra đều được ghi lại dưới dạng mã đối tượng. Với các bản dịch người dùng không còn một khả năng nào để đọc, để nhận biết và không có cách nào để cải biên, thay đổi. Thế hệ thứ tư giành cho ngônngữ bậc rất cao (Very high level languages). Trong trào lưu này, nhờ những Generator, người ta chỉ cần đưa những đặc trưng chính của công việc, generator chuyển thông tin vào hệ thống làm việc của máy như đã miêu tả cho thế hệ trước, máy tính "tự động" tạo ra những chương trình ứng dụng. Ý này, phục vụ công việc quản lý cơ sở dữ liệu (tiếng Anh: Database Management) mang dáng dấp của ngônngữ thế hệ thứ tư này. Các ngônngữ SQL (viết tắt từ Structured Query Language), QBE (Query-by- Example) và QUEL (Query Language) là đại biểu xuất sắc nhất trong nhóm. Từ 1986 bắt đầu quá trình tiêu chuẩn hoá SQL. Năm 1992 ANSI chính thức thông qua tiêu chuẩn cho SQL-92. SQL đang được dùng trong các phiên bản Sybase SQL Server, Microsoft SQL Server, IBM OS/2 Extended Edition Database Manager, DEC RDb/VMS và Oracle Server for OS/2 vv . Trong tài liệu này sẽ không đề cập đến ngônngữ này, người viết chỉ có thể hứa nhanh chóng hoàn tất bản thảo giới thiệu tài liệu về các ngônngữ này. Thế hệ thứ năm gắn liền với nhóm ngônngữ trí tuệ nhân tạo (AI-Artificial Intelligence). Đây là ngônngữ không - thủ tục (khác với khái niệm ngônngữ thủ tục vừa nêu trên), gắn liền với trạng thái của đối tượng trong vấn đề đang giải quyết, với quan hệ giữa các đối tượng. Một trong các ngônngữ đang dùng có kết quả PROLOG, đang được người Nhật chấp nhận, phát triển và hoàn thiện. Ngônngữ mang tên Nhật HIMIKO xuất phát từ PROLOG, đang là cơ sở cho nhóm ngônngữ thế hệ thứ năm này. Trong lĩnh vực quản lý dữ liệu, sự gắn bó giữa ngônngữ thế hệ thứ tưvà thứ năm đã sinh ra DATALOG chuyên phục vụ công tác hệ thống dữ liệu. Ngônngữ LDL (Logic Data Language) đang chiếm vị trí xứng đáng trong lĩnh vực truyền dữ liệu. Cần nói thêm, ngônngữ LISP cũng thuộc nhóm ngônngữ trí tuệ nhân tạo, được phát triển từ những năm sáu mươi tại Mỹ, ngày nay đang đóng vai trò hết sức quan trọng trong công cuộc tựđộnghoáthiết kế. Tài liệu về LISP và AutoLISP đề nghị bạn đọc tìm hiểu thêm qua sách chuyên đề của cùng người viết. . NGÔN NGỮ LẬP TRÌNH VÀ TỰ ĐỘNG HOÁ THIẾT KẾ 1.1. KHÁI NIỆM VỀ NGÔN NGỮ LẬP TRÌNH Ngôn ngữ lập trình là những phần mềm để phát triển các ứng dụng. Ngôn ngữ. động hoá tính toán, thiết kế và hiển thị kết quả tính đều thông qua ngôn ngữ lập trình. Những ngôn ngữ lập trình có ứng dụng rộng rãi và hiệu quả có thể