1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Các vấn đề cơ sở của khoa học máy tính: Chương 4 - Tô Oai Hùng

47 21 0

Đ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 47
Dung lượng 346,02 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Các vấn đề cơ sở của khoa học máy tính - Chương 4: Phần mềm cung cấp cho người học các kiến thức: Các thệ hệ của ngôn ngữ lập trình, trình biên dịch và trình thông dịch, máy ảo, lập trình thủ tục, lập trình hướng đối tượng, ngôn ngữ kịch bản, ngôn ngữ lập trình hàm, cú pháp ngôn ngữ và ngữ nghĩa. Mời các bạn cùng tham khảo nội dung chi tiết.

Trang 1

Ch ương 4:

PHẦN MỀM

Trang 3

Các Thế Hệ của Ngôn Ngữ Lập Trình

Các nhà khoa học máy tính gọi chung các ngôn ngữ lập trình, các chương trình và các

sản phẩm là phần mềm (software)

Một lệnh máy là một dãy các bit 0 và 1 được

chứa trong bộ nhớ máy tính

Khi máy tính đọc bộ nhớ, nó xác định xem dãy bit đã đọc có phải là lệnh máy không Nếu đúng, máy tính thực thi lệnh đó, ngược lại máy tính sẽ dừng vì lệnh không hợp lệ

Mỗi máy tính (một họ CPU) có một tập lệnh

máy hữu hạn Hầu hết các máy tính ngày nay

có từ 75 đến 150 lệnh máy trong tập lệnh

Mỗi kiến trúc máy tính được thể hiện trong

3

Trang 4

Các Thế Hệ của Ngôn Ngữ Lập Trình

tập lệnh Các tập lệnh của các kiển trúc khác nhau sẽ khác nhau Ví dụ, tập lệnh của Intel Pentium khác với của Sun SPARC Cả khi thực hiện cùng một tác vụ, một lệnh của kiến trúc này cũng sẽ khác với kiến trúc khác

Trong các máy tính trước đây, việc lập trình được thực hiện trực tiếp bằng lệnh máy Người lập trình làm việc với các bit 0 và 1 để viết mã cho mỗi lệnh Ví dụ sau là ba lệnh của máy tính 16 bit để cộng hai giá trị được chứa trong bộ nhớ tại địa chỉ 64 và 65 và lưu kết quả vào địa chỉ 66:

Trang 5

Các Thế Hệ của Ngôn Ngữ Lập Trình

0110000001000000 Nạp giá trị tại 64 vào AX

0100000001000001 Cộng với giá trị tại 65

0111000001000010 Chứa giá trị AX vào 66

Khi tất cả lệnh máy được tạo, người lập trình lưu chúng vào bộ nhớ Sau đó, thiết lập thanh ghi PC trỏ đến lệnh đầu tiên của chương trình

và thực thi

Các thao tác cơ bản của máy tính là đọc lệnh trong bộ nhớ được trỏ bởi thanh ghi PC, tăng thanh ghi PC, thực thi lệnh và lặp lại

Một sự cải tiến trước đây để lập trình hiệu

quả hơn là sử dụng hợp ngữ (assembly language) Trong hợp ngữ, chúng ta có thể

5

Trang 6

Các Thế Hệ của Ngôn Ngữ Lập Trình

đọc mã lệnh bằng từ gợi nhớ (chữ và số -

mnemonic) thay vì mã máy và mỗi từ gợi nhớ ứng với một lệnh máy

Hợp ngữ được gọi là ngôn ngữ thế hệ thứ hai

(second-generation language) Trong hợp ngữ, người lập trình viết mã lệnh gợi nhớ và

Trang 7

Các Thế Hệ của Ngôn Ngữ Lập Trình

- ALS : Dịch các bit trong AX sang trái 1 đơn

vị

- SSA : Nếu bit msb của AX là 1, bỏ qua lệnh

kế tiếp Ngược lại, thực thi lệnh kế tiếp

Trang 8

FORTRAN là chữ viết tắt của FORmula TRANslation Ngôn ngữ này giúp người lập trình làm việc ở mức trừu tượng cao hơn

Thay vì bị hạn chế bởi tập lệnh máy, người

Trang 9

Các Thế Hệ của Ngôn Ngữ Lập Trình

lập trình bây giờ sử dụng các câu lệnh giống như tiếng Anh và các biểu thức toán học

Ngôn ngữ cũng bao gồm các lệnh rẽ nhánh, lặp và nhập/xuất

Sau đây là câu lệnh của FORTRAN Các tên biến X, Y và Z trở thành tên đại diện cho các

vị trí nhớ Câu lệnh sẽ cộng nội dung của Y với Z và chứa tổng vào X:

Trang 10

Các Thế Hệ của Ngôn Ngữ Lập Trình

chức hợp lý một dãy các bước cần thiết để thực thi tác vụ nào đó

Các ngôn ngữ thủ tục còn được gọi là các

“ngôn ngữ mệnh lệnh” (imperative language),

bởi vì các câu lệnh của ngôn ngữ là những mệnh lệnh cho máy tính – các bước của chương trình chỉ định mỗi hành động của máy tính

Khác với các ngôn ngữ mệnh lệnh là các ngôn ngữ “hướng đối tượng” (object- oriented) Hầu hết, nhưng không phải là tất cả các chương trình ngày nay được viết bằng các ngôn ngữ mệnh lệnh

Trang 11

Các Thế Hệ của Ngôn Ngữ Lập Trình

Cho đến nay, các ngôn ngữ thế hệ thứ ba gồm: LISP (for LISt Processing), Cobol, PL/1, BASIC, ADA, C, Smalltalk, C++, Java Trong

đó, Smalltalk, C++ và Java là các ngôn ngữ lập trình hướng đối tượng

11

Trang 12

Trình Biên Dịch và Trình Thông Dịch

Với sự ra đời của FORTRAN, chương trình

trở nên phức tạp hơn để tạo ra mã máy Một chương trình khác được gọi là trình biên dịch

(compiler) dùng để dịch ngôn ngữ lập trình cấp cao thành mã máy

Đầu vào của trình biên dịch là mã nguồn

được viết bằng ngôn ngữ cấp cao Đầu ra của trình biên dịch là mã máy

Ví dụ sau là đoạn mã của ngôn ngữ FORTRAN:

DIMENSION X(1000)

READ(*, 1) N, M

FORMAT(2I5)

WRITE(*, 2) M, N

Trang 13

Trình Biên Dịch và Trình Thông Dịch

FORMAT('AVERAGES ON ', I6, ' TESTS

FOR EACH OF ', I6, 1’ SUBJECTS’) EM=M

Trang 14

Trình Biên Dịch và Trình Thông Dịch

Trình biên dịch xử lý mã nguồn qua hàng loạt các bước:

1. Bước đầu tiên gọi là “quét” (scanning) hay

“phân tích từ vựng” (lexical analysis) và xuất ra một chuỗi các “token” (từ tố/thẻ từ)

Token là từ của ngôn ngữ, ví dụ “READ”,

“FORMAT”, “AV”, “4” và “3X” là các token trong chương trình ví dụ

2 Kế đến, trình biên dịch “phân tích từ loại”

(parse) chuỗi token đó Bước này được gọi

là “phân tích cú pháp” (syntax analysis)

Xem xét “văn phạm” hay các qui tắc của ngôn ngữ Trình biên dịch sử dụng “cây

Trang 15

Trình Biên Dịch và Trình Thông Dịch

phân tích cú pháp” (parse tree) để thẩm tra các lệnh trong mã nguồn là những lệnh hợp lệ của ngôn ngữ Tại bước này, trình biên dịch trả về thông báo lỗi, ví dụ thiếu dấu phẩy hay sai từ khoá

3 Nếu tất cả câu lệnh đều hợp lệ, trình biên dịch tiếp tục “phân tích ngữ nghĩa”

(semantic analysis) Trong giai đoạn này, ý

nghĩa (meaning) của các lệnh được tạo, các

lệnh sẽ được chuyển thành các mã thực thi

(executable code)

Các trình biên dịch ngày nay thường biên dịch chương trình nguồn thành “ngôn ngữ

15

Trang 16

Trình Biên Dịch và Trình Thông Dịch

trung gian” (intermediate language) và sau đó

sẽ chuyển thành mã máy Trong khi các trình biên dịch trước đây hoặc là tạo mã hợp ngữ

và sau đó sẽ hợp dịch (assemble) bằng trình hợp dịch (assembler) hoặc là tạo trực tiếp

thành mã máy

Ưu điểm của trình biên dịch ngày nay là có

thể biên dịch nhiều ngôn ngữ khác nhau thành mã trung gian ở dạng tổng quát, không

phụ thuộc vào môi trường/nền (platform) và

sau đó có thể sinh ra mã máy tối ưu cho từng loại máy

Kết quả của sự biên dịch chương trình là tập

Trang 17

Trình Biên Dịch và Trình Thông Dịch

tin mã đối tượng (object code) Nó là tập tin

nhị phân của các lệnh máy và sẽ thực thi khi chương trình chạy

Trình biên dịch thực hiện dịch mã nguồn thành mã thực thi chỉ 1 lần, khi chương trình chạy, các mã này sẽ thực thi ngay lập tức

Đối với trình thông dịch (interpreter) thì khác

Trình thông dịch thực hiện dịch từng dòng mã nguồn thành mã máy ở mỗi thời điểm khi chương trình thực thi Ví dụ, BASIC là ngôn ngữ sử dụng trình thông dịch

Nói chung, một chương trình được thực thi bằng trình thông dịch sẽ chạy chậm hơn

17

Trang 18

Trình Biên Dịch và Trình Thông Dịch

chương trình đã được biên dịch thành mã máy Bởi vì, ở mỗi thời điểm trình thông dịch phải phân tích từng dòng lệnh và chuyển nó thành mã máy khi chương trình chạy

Trình thông dịch thường cung cấp thông báo chuẩn đoán tốt hơn vì nó làm việc trực tiếp với từng dòng lệnh

Sự khác biệt giữa ngôn ngữ sử dụng trình

biên dịch và thông dịch đôi khi cũng không rõ ràng Có một số ngôn ngữ sử dụng cả trình thông dịch và biên dịch như BASIC, PERL, LISP, Java, …

Trang 19

Máy Ảo

Máy ảo (virtual machine) là máy tính được

định nghĩa bởi phần mềm hơn là phần cứng Máy ảo chạy các chương trình giống như máy tính thật, nhưng máy ảo thực sự được điều khiển bởi chương trình khác, một sự tạo dựng bởi phần mềm đó là lấy, giải mã và thực thi các lệnh của chương trình

Thuật ngữ máy ảo mô tả một lớp trừu tượng

được thêm vào giữa người dùng và phần cứng, vì thế các nhà khoa học máy tính cũng

sử dụng thuật ngữ này để mô tả phần mềm tạo nên sự thể hiện ở các dạng khác nhau của máy tính

19

Trang 20

Lập Trình Thủ Tục

Theo nhiều người, lập trình thủ tục

(procedural programming) là mô hình tự nhiên Một chương trình được mô tả đơn giản chỉ là một danh sách các lệnh được thực thi theo trình tự, tức là một thủ tục

Các ngôn ngữ lập trình thủ tục cũng được gọi

là các ngôn ngữ mệnh lệnh (imperative language)

Trong lập trình thủ tục, mã lệnh cho một công việc cụ thể được chứa trong một thủ tục có tên Thủ tục cũng còn được gọi là subroutine

Cho ví dụ, hãy tạo một thủ tục để tìm độ lệch chuẩn của một dãy số

Trang 21

Lập Trình Thủ Tục

Độ lệch chuẩn được định nghĩa như sau Gọi

σ là độ lệch chuẩn và 𝒙𝒙� là trung bình của các phần tử trong dãy số:

𝝈𝝈 = (� 𝒙𝒙𝒊𝒊𝟐𝟐 − 𝒏𝒏𝒙𝒙�𝟐𝟐)

𝒏𝒏 𝒊𝒊=𝟏𝟏

/𝒏𝒏

Sau đây là thủ tục được viết bằng mã giả để tính độ lệch chuẩn:

21

Trang 22

Lập Trình Thủ Tục

SUM = 0.0, SUMSQUARES = 0.0

n = size of the array of scores

Start with the first score and

continue until all the scores have been processed

SUM = SUM + score

SUMSQUARES = SUMSQUARES + score 2

Trang 24

float mean = sum / n;

float variance = (sumSquares -

n * mean * mean) / n;

return (float)Math.sqrt(variance); }

}

Trang 25

Lập Trình Thủ Tục

Trong lập trình thủ tục, các mã lệnh có thể được viết trong một khối gọi là thủ tục

(procedure)/hàm (function) Khối này được truy xuất thông qua tên của nó và có thể tái

Một thủ tục có thể được truy xuất bởi chương

trình khác Chỉ đơn giản là chúng ta thêm thủ tục đó vào thư viện

25

Trang 26

Lập Trình Thủ Tục

Khái niệm lập trình cấu trúc (structured programming) được hiểu như là tập con của lập trình thủ tục Phương pháp lập trình cấu trúc thường đi đôi với phương pháp phân tích trên xuống (top-down) Tác vụ của

chương trình được chia thành nhiều thủ tục/hàm Điều này rất quan trọng trong thiết

kế chương trình, bởi vì chương trình được cục bộ hóa nên dễ đọc, dễ bảo trì, độ tin cậy cao, tái sử dụng và tạo thư viện

Lập trình cấu trúc sử dụng các lệnh có cấu

trúc như các lệnh rẽ nhánh, lặp để gọi các thủ tục/hàm đã được định nghĩa Các ngôn ngữ

Trang 27

Lập Trình Thủ Tục

hỗ trợ lập trình cấu trúc như ALGOL, ADA, Pascal, C, …

Nhược điểm: Trong lập trình cấu trúc, giải

thuật luôn phụ thuộc chặt chẽ vào cấu trúc

dữ liệu, do đó khi thay đổi cấu trúc dữ liệu, phải thay đổi giải thuật Nghĩa là phải viết lại chương trình

Khái niệm lập trình không cấu trúc

(unstructured/non-structured programming)

được hiểu là chương trình có sử dụng các lệnh GOTO hay JUMP Kết quả sẽ làm cho chương trình khó đọc, khó tìm lỗi, khó tái sử dụng

Các ngôn ngữ hỗ trợ lập trình không cấu trúc như Assembly, BASIC, …

27

Trang 28

Lập Trình Hướng Đối Tượng

Lập trình hướng đối tượng (Object-oriented

programming – OOP) được phát triển sau này, nó cung cấp độ tin cậy và tái sử dụng phần mềm xa hơn nữa

Thay vì lập trình thủ tục, lập trình hướng đối tượng dựa vào các đối tượng phần mềm như

là các đơn vị của chương trình

Một đối tượng là một thể hiện (instance) của

một “lớp” (class) Để tạo ra một thể hiện,

người ta sử dụng các đặc tả của lớp đó Ví dụ MyCar là một thể hiện của lớp Automobile:

có 4 bánh, có động cơ, có ghế ngồi, …

Trang 29

Lập Trình Hướng Đối Tượng

Một thể hiện của một lớp có “trạng thái” hay

các nét đặc trưng (characteristic) của riêng

nó Ví dụ, màu của thể hiện MyCar là đỏ và của YourCar là xanh Hoặc MyCar có 170 hp

Các đối tượng cũng có “hành vi” (behavior)

Hành vi được xác định bởi các thủ tục của lớp đó, các thủ tục như thế được gọi là các

phương thức (method) Ví dụ, lớp

29

Trang 30

Lập Trình Hướng Đối Tượng

Automobile có phương thức như changeSpeed() để thay đổi tốc độ xe nhanh hay chậm hơn, park() xác định kích thước của chỗ đậu xe Phương thức còn được gọi

phương thức thể hiện (instance method)

Lập trình hướng đối tượng “đóng gói”

(encapsulate) trạng thái và hành vi của đối tượng Chương trình chỉ có thể truy xuất các thuộc tính public và phương thức public của đối tượng

Một ý tưởng quan trọng trong lập trình hướng

đối tượng là “sự thừa kế” (inheritance) Nghĩa

là chúng ta có thể tạo một lớp mới “mạnh

Trang 31

Lập Trình Hướng Đối Tượng

hơn” bằng cách thừa kế từ lớp trước đó và thêm những tính năng mới của nó Ví dụ, lớp Limousine thừa kế từ lớp Automobile

Có liên quan đến thừa kế là khái niệm về “tính

đa hình” (polymorphism) - tính chất thể hiện

nhiều hình thái của đối tượng Tính đa hình là

sự thực thi của một phương thức có thể cho kết quả khác nhau phụ thuộc vào lớp của đối tượng mà phương thức đó được gọi

Ví dụ, lớp Automobile và Limousine (xe ô tô hạng sang) đều có phương thức park() Tuy nhiên, phương thức park() của Limousine yêu cầu chỗ đậu xe lớn hơn trong phương thức park() của Automobile 31

Trang 32

Ngôn Ngữ Kịch Bản

Ngày nay, có một số ngôn ngữ lập trình là ngôn ngữ kịch bản (scripting language) Ý tưởng ban đầu của “script” (kịch bản) là một

tập các lệnh của hệ điều hành được đặt trong tập tin Khi người sử dụng thực thi tập tin

kịch bản (script file), tập lệnh trong đó được

thực thi Các kịch bản rất hữu dụng trong việc tự động hoá công việc thường ngày

Do tính hữu dụng của ngôn ngữ kịch bản đã khơi dậy nhiều nhà phát minh phát triển ngôn ngữ mới với nhiều tính năng và tiện lợi hơn Các ngôn ngữ như Perl, PHP, Python, JaVaScript, … là những ngôn ngữ kịch bản Tuy nhiên, ngôn ngữ kịch bản được thông dịch, vì thế tốc độ thực thi không phải là ưu điểm chính của nó

Trang 33

Ngôn Ngữ Lập Trình Hàm

Các ngôn ngữ lập trình hàm (functional programming language) được phát minh từ rất sớm trong lịch sử máy tính Năm 1958, John McCarthy đã cho ra đời ngôn ngữ LISP

(LISt Processing)

Ngôn ngữ lập trình hàm thường dùng để xử

lý các hàm toán học Một hàm cần một hay nhiều đối số và trả về một trị Cho ví dụ, phương trình của đường parabol là:

f(x) = 2x 2 + 5

Khi chúng ta cung cấp giá trị cho x (ví dụ x =

3 ), thì hàm trên sẽ trả về kết quả như sau:

f(3) = 2(3) 2 + 5 = 23

33

Trang 34

Ngôn Ngữ Lập Trình Hàm

Với ngôn ngữ lập trình hàm, việc tính toán

được thực hiện bằng cách truyền các đối số đến một hàm và nhận kết quả trả về của hàm

đó

Trong các ví dụ, chúng ta sẽ sử dụng ngôn ngữ Scheme Ngôn ngữ Scheme được gọi là ngôn ngữ thao tác ký hiệu (symbolic manipulation), ra đời năm 1975 và thuộc họ LISP

Một biểu thức trong Scheme là một atom

(nguyên tử) hay một list (danh sách) Một

atom là một số, ký tự, tên hay hàm Một list là một tập các biểu thức được chứa trong dấu

Trang 35

Ngôn Ngữ Lập Trình Hàm

ngoặc () Các phần tử trong list có thể là atom hay là một list khác

Trong bất kỳ ngôn ngữ lập trình hàm nào, một

số hàm cơ bản sẽ được tạo sẵn Ngoài ra, người lập trình có thể tự định nghĩa hàm Sau đây là một số ví dụ về Scheme:

Trang 36

Trong ví dụ trên, định nghĩa hàm sum sử dụng

ký pháp lambda (lambda notation) Ưu điểm là không phân biệt định nghĩa hàm với định nghĩa giá trị

8.(define factorial

(lambda (n)

(if (<= n 1) 1 (* n (factorial(

- n 1))))))

Ngày đăng: 09/05/2021, 18:21

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm