Chương I Một số khái niệm về lập trình và ngôn ngữ lập trình Khái niệm cơ sở về lập trình; Khái niệm và các thành phần của ngôn ngữ lập trình; Vai trò và phân loại chương trình dịch. KHÁI NIỆM LẬP TRÌNH VÀ NGÔN NGỮ LẬP TRÌNH Như đã biết, mọi bài toán có thuật toán đều có thể giải được trên máy tính điện tử. Khi giải bài toán trên máy tính điện tử, sau các bước xác định bài toán và xây dựng hoặc lựa chọn thuật toán khả thi là bước lập trình. Lập trình là sử dụng cấu trúc dữ liệu và các câu lệnh của ngôn ngữ lập trình cụ thể để mô tả dữ liệu và diễn đạt các thao tác của thuật toán.
Chương trình viết bằng ngôn ngữ lập trình bậc cao nói chung không phụ thuộc vào máy, nghĩa là một chương trình có thể thực hiện trên nhiều máy. Chương trình viết bằng ngôn ngữ máy có thể được nạp trực tiếp vào bộ nhớ và thực hiện ngay còn chương trình viết bằng ngôn ngữ lập trình bậc cao phải được chuyển đổi thành chương trình trên ngôn ngữ máy mới có thể thực hiện được. Chương trình đặc biệt có chức năng chuyển đổi chương trình được viết bằng ngôn ngữ lập trình bậc cao thành chương trình thực hiện được trên máy tính cụ thể được gọi là chương trình dịch. Chương trình dịch nhận đầu vào là chương trình viết bằng ngôn ngữ lập trình bậc cao (chương trình nguồn) thực hiện chuyển đổi sang ngôn ngữ máy (chương trình đích).
Chương trình nguồn Chương trình dịch Chương trình đích Xét ví dụ, bạn chỉ biết tiếng Việt nhưng cần giới thiệu về trường của mình cho đoàn khách đến từ nước Mĩ, chỉ biết tiếng Anh. Có hai cách để bạn thực hiện điều này. Cách thứ nhất: Bạn nói bằng tiếng Việt và người phiên dịch giúp bạn dịch sang tiếng Anh. Sau mỗi câu hoặc một vài câu giới thiệu trọn một ý, người phiên dịch dịch sang tiếng Anh cho đoàn khách.
Sau đó, bạn lại giới thiệu tiếp và người phiên dịch lại dịch tiếp. Việc giới thiệu của bạn và việc dịch của người phiên dịch luân phiên cho đến khi bạn kết thúc nội dung giới thiệu của mình. Cách dịch trực tiếp như vậy được gọi là thông dịch. Cách thứ hai: Bạn soạn nội dung giới thiệu của mình ra giấy, người phiên dịch dịch toàn bộ nội dung đó sang tiếng Anh rồi đọc hoặc trao văn bản đã dịch cho đoàn khách đọc.
Như vậy, việc dịch được thực hiện sau khi nội dung giới thiệu đã hoàn tất. Hai công việc đó được thực hiện trong hai khoảng thời gian độc lập, tách biệt nhau. Cách dịch như vậy được gọi là biên dịch. Sau khi kết thúc, với cách thứ nhất không có một văn bản nào để lưu trữ, còn với cách thứ hai có hai bản giới thiệu bằng tiếng Việt và bằng tiếng Anh có thể lưu trữ để dùng lại về sau.
Tương tự như vậy, chương trình dịch có hai loại là thông dịch và biên dịch. a) Thông dịch Thông dịch (interpreter) được thực hiện bằng cách lặp lại dãy các bước sau: Kiểm tra tính đúng đắn của câu lệnh tiếp theo trong chương trình nguồn; Chuyển đổi câu lệnh đó thành một hay nhiều câu lệnh tương ứng trong ngôn ngữ máy; Thực hiện các câu lệnh vừa chuyển đổi được. 3 Như vậy, quá trình dịch và thực hiện các câu lệnh là luân phiên. Các chương trình thông dịch lần lượt dịch và thực hiện từng câu lệnh.
Loại chương trình dịch này đặc biệt thích hợp cho môi trường đối thoại giữa người và hệ thống. Tuy nhiên, một câu lệnh nào đó phải thực hiện bao nhiêu lần thì nó phải được dịch bấy nhiêu lần. Các ngôn ngữ khai thác hệ quản trị cơ sở dữ liệu, ngôn ngữ đối thoại với hệ điều hành,. đều sử dụng trình thông dịch.
b) Biên dịch Biên dịch (compiler) được thực hiện qua hai bước: Duyệt, kiểm tra, phát hiện lỗi, kiểm tra tính đúng đắn của các câu lệnh trong chương trình nguồn; Dịch toàn bộ chương trình nguồn thành một chương trình đích có thể thực hiện trên máy và có thể lưu trữ để sử dụng lại khi cần thiết. Như vậy, trong thông dịch, không có chương trình đích để lưu trữ, trong biên dịch cả chương trình nguồn và chương trình đích có thể lưu trữ lại để sử dụng về sau. Thông thường, cùng với chương trình dịch còn có một số dịch vụ liên quan như biên soạn, lưu trữ, tìm kiếm, cho biết các kết quả trung gian,. Toàn bộ các dịch vụ trên tạo thành một môi trường làm việc trên một ngôn ngữ lập trình cụ thể.
Ví dụ, Turbo Pascal 7. trên ngôn ngữ Pascal, Turbo C++, Visual C++,. trên ngôn ngữ C++. Các môi trường lập trình khác nhau ở những dịch vụ mà nó cung cấp, đặc biệt là các dịch vụ nâng cấp, tăng cường các khả năng mới cho ngôn ngữ lập trình.
4 Bài đọc thêm 1: Em có biết AI LÀ LẬP TRÌNH VIÊN ĐẦU TIÊN? Đó là một phụ nữ, bà Ada Augusta Byron Lovelace, con gái của nhà thơ nổi tiếng thời đó Lord Byron. Ada là một trong những nhân vật ấn tượng nhất trong lịch sử Tin học. Bà sinh ngày 10/12/1815 và là người cùng thời với Charles Babbage, người đầu tiên đưa ra đề án thiết kế chiếc máy tính điều khiển theo chương trình có tên là Analytical Engine (máy giải tích). Từ nhỏ, bà đã nổi tiếng là một người thông minh, có khả năng đặc biệt về toán học.
Ngay từ khi thiết kế máy giải tích còn ở trên giấy, Ada đã đề Ada Augusta Byron Lovelace xuất với Babbage một kế hoạch chi tiết để máy giải tích tính các số Bernouilli. Ngày nay người ta coi kế hoạch này là chương trình máy tính đầu tiên và bà được gọi là lập trình viên đầu tiên. Các ghi chép được công bố của Ada cho tới nay vẫn đặc biệt có ý nghĩa đối với các lập trình viên. Von Neumann đã viết rằng các quan sát của Ada "chứng tỏ bà đã hiểu được các nguyên tắc lập trình máy tính trước thời đại của mình hàng thế kỉ".
Như một nhà toán học, Ada đánh giá cao khả năng tự động hoá các công việc tính toán nặng nhọc. Nhưng bà quan tâm hơn đến các nguyên tắc của việc lập trình các thiết bị đó. Ngay khi máy giải tích còn chưa được xây dựng, Ada đã thí nghiệm viết những dãy lệnh. Bà nhận ra giá trị của một vài thủ thuật đặc biệt trong nghệ thuật mới này và điều thú vị là những thủ thuật này hiện giờ vẫn còn là cơ bản đối với các ngôn ngữ lập trình hiện đại, đó chính là chương trình con, vòng lặp và các phép chuyển điều khiển.
Thay cho việc viết các dãy lệnh lặp đi lặp lại nhiều lần, ta có thể viết chúng dưới dạng các chương trình con để dùng nhiều lần. Các chương trình con ngày nay là thành phần không thể thiếu được của mọi ngôn ngữ lập trình. Máy giải tích và các máy tính số thực hiện rất tốt các tính toán nhiều lần một cách nhanh chóng. Thời kì đó, các bìa đục lỗ được sử dụng để đưa dữ liệu và các lệnh vào máy.
Bằng việc phát minh ra các lệnh thực hiện việc chuyển thiết bị đọc bìa về một bìa xác định trước nó, sao cho dãy các lệnh có thể được thực hiện một số lần nhất định, Ada đã phát minh ra vòng lặp – một trong những cấu trúc điều khiển quan trọng trong các ngôn ngữ lập trình. Khả năng lôgic của Ada đã phát huy với phép chuyển điều khiển có điều kiện. Bà nghĩ ra một loại lệnh để thao tác với thiết bị đọc bìa, nhưng thay cho việc quay lại và lặp lại dãy bìa, lệnh này cho phép thiết bị đọc bìa chuyển tới một bìa khác tại bất kì vị trí nào trong dãy, NẾU một điều kiện nào đó được thoả mãn. Việc thêm chữ NẾU đó vào danh sách các lệnh số học thuần tuý trước đây có nghĩa là chương trình có thể làm nhiều hơn là tính toán đơn thuần.
Ở dạng thô sơ nhưng về tiềm năng là rất có ý nghĩa, máy giải tích có thể thực hiện các quyết định. Ada mất năm 1852, khi mới qua tuổi 36. Nếu như bà không qua đời sớm như vậy, chắc chắn khoa học lập trình của thế kỉ XIX đã có thể tiến nhanh hơn nhiều. Để tưởng nhớ công lao của Ada, một ngôn ngữ lập trình do Bộ Quốc phòng Mĩ tạo ra năm 1979 mang tên bà.
CÁC THÀNH PHẦN CỦA NGÔN NGỮ LẬP TRÌNH 1. Các thành phần cơ bản Mỗi ngôn ngữ lập trình thường có ba thành phần cơ bản là bảng chữ cái, cú pháp và ngữ nghĩa. a) Bảng chữ cái là tập các kí tự được dùng để viết chương trình. Không được phép dùng bất kì kí tự nào ngoài các kí tự quy định trong bảng chữ cái.
Trong C++, bảng chữ cái bao gồm các kí tự: Các chữ cái thường và các chữ cái in hoa của bảng chữ cái tiếng Anh: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 10 chữ số thập phân Ả Rập: 0 1 2 3 4 5 6 7 8 9 Các kí tự đặc biệt: + - * / = < > [ ]. , (dấu phẩy) ; # ^ $ @ & ( ) { } : ' (dấu nháy) dấu cách (mã ASCII 32) _ (dấu gạch dưới) Bảng chữ cái của các ngôn ngữ lập trình nói chung không khác nhau nhiều. Ví dụ, bảng chữ cái của ngôn ngữ lập trình C++ chỉ khác Pascal là có sử dụng thêm các kí tự như dấu nháy kép ("), dấu sổ ngược (\), dấu chấm than (!). b) Cú pháp là bộ quy tắc để viết chương trình.
Dựa vào chúng, người lập trình và chương trình dịch biết được tổ hợp nào của các kí tự trong bảng chữ cái là hợp lệ và tổ hợp nào là không hợp lệ. Nhờ đó, có thể mô tả chính xác thuật toán để máy thực hiện. c) Ngữ nghĩa xác định ý nghĩa thao tác cần phải thực hiện, ứng với tổ hợp kí tự dựa vào ngữ cảnh của nó. Ví dụ Phần lớn các ngôn ngữ lập trình đều sử dụng dấu cộng (+) để chỉ phép cộng.
Xét các biểu thức: A+B (1) I+J (2) Giả thiết A, B là các đại lượng nhận giá trị thực và I, J là các đại lượng nhận giá trị nguyên. Khi đó dấu "+" trong biểu thức (1) được hiểu là cộng hai số thực, dấu "+" trong biểu thức (2) được hiểu là cộng hai số nguyên. Như vậy, ngữ nghĩa dấu "+" trong hai ngữ cảnh khác nhau là khác nhau. Tóm lại, cú pháp cho biết cách viết một chương trình hợp lệ, còn ngữ nghĩa xác định ý nghĩa của các tổ hợp kí tự trong chương trình.