lập trình · Python

[Trở thành 1 nhà khoa học máy tính] Bài 1: con đường đến chương trình máy tính

Mục tiêu của loạt bài này là biến người đọc (cũng như người dịch) cách suy nghĩ như một nhà khoa học máy tính thực sự (computer scientist). Cách suy nghĩ này là sự kết hợp những gì tốt nhất của những nhà toán học, kĩ sư và khoa học tự nhiên: Sử dụng các công thức để diễn đạt ý tưởng như những nhà toán học, thiết kế và lắp ráp ý tưởng như các kĩ sư, nghiên cứu, quan sát hiện tượng, phán đoán cách giải thích và kiểm tra như các nhà khoa học.

Kĩ năng quan trọng nhất của 1 nhà khoa học máy tính là giải quyết vấn đề (problem solving) . Nó bao gồm việc xây dựng vấn đề, tìm các cách giải quyết khác nhau, và áp dúng cách giải quyết rõ ràng và chính xác nhất. Cuối cùng là xây dựng các chương trình ứng dụng nó. Đó là lý đo tại sao bài 1 có tên là “Con Đường đến các chương trình”.

1. Ngôn ngữ lập trình Python

Ngôn ngữ lập trình mà loạt bài này sử dụng là Python. Python được biết đến là 1 trong số rất nhiều các ngôn ngữ lập trình bậc cao (high-level language) , ngoài Python ra còn java, c#,.. cũng được gọi là các ngôn ngữ lập trình bậc cao (ngôn ngữ có cấu trúc ngữ pháp rất gần so với tiếng Anh thông dụng -> tương đối dễ học đối với những người mới bắt đầu). Đối nghĩa với chúng là các ngôn ngữ lập trình bậc thấp (lowlevel languages), ở một số tài liệu thì chúng còn được gọi là mã máy(“machine languages”).

Tuy ngôn ngữ bậc cao dễ học hơn và hiện nay được sử dụng phổ biến hơn, nhưng thực tế thì máy tính chỉ hiểu được các ngôn ngữ bậc thấp, vì vậy, các đoạn mã được viết bởi các ngôn ngữ bậc cao bắt buộc phải được biên dịch ra ngôn ngữ bậc thấp để có thể thực hiện trên máy tính. Quá trình này khiến cho việc thực hiện các đoạn mã ở ngôn ngữ bậc cao chạy chậm hơn ở các ngôn ngữ bậc thấp, đây là 1 trong những điểm yếu của các ngôn ngữ bậc cao.

Tuy vậy, lợi thế mà ngôn ngữ bậc cao đem lại là rất lớn. Việc bắt đầu với ngôn ngữ bậc cao là đơn giản hơn hẳn so với ngôn ngữ bậc thấp: Tốc đọ viết mã nhanh, dễ đọc, ngắn và 1 tính chất đặc biệt quan trọng là chúng portable: Có thể chạy cùng 1 đoạn mã trên nhiều máy tính khác nhau mà chỉ cần sửa 1 chút hoặc thậm chí là không sửa mã nguồn. Ngôn ngữ bậc thấp không làm được như vậy.

Quá trình chuyển hóa từ ngôn ngữ bậc cao sang ngôn ngữ bậc thấp được chia làm 2 loại: thông dịch(interpreters) và biên dịch(). Trình thông dịch đọc mã theo từng đoạn lệnh rồi thực hiện các tính toán của đoạn lệnh đó.interpret

Trong khi đó trình biên dịch lại tiến hành dịch toàn bộ mã chương trình sang ngôn ngữ bậc thấp rồi mới tiến hành chạy chương trình. Trong trường hợp này thì file chứ mã cấp cao được gọi là source code, file chứa mã máy được gọi là object code hoặc là executable . Khi một file source code đã được biên dịch thì bạn có thể thực hiên chương trình nhiều lần mà không cần biên dịch lại.

compiler

Python là ngôn ngữ thông dịch. Có 2 cách đê gọi trình thông dịch của Python:commandline mode và script mode. ở Commandline mode, bạn chỉ cần gõ các dòng lệnh và trình dịch sẽ trả về kết quả ngay lập tức:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1+1
2

dòng đầu tiên là câu lệnh gọi khởi động trình thông dịch python, 3 dòng tiếp theo là tin nhắn hồi âm từ trình thông dịch. Ờ dòng thứ 5 bắt đầu bởi dấu >>> báo hiệu trình thông dịch đã sẵn sàng. Nhập print 1+1, trình thông dịch ngay lập tức in ra 2.

Ngoài ra, bạn hoàn toàn có thể tạo một file chứ mã nguồn chương trình và sử dụng trình thông dịch để chạy file. 1 file như vậy được gọi là kịch bản (script).Tương tự ví dụ trên, chúng ta tạo ra file latoya.py với nội dung:

print 1 + 1

Bạn hoàn toàn có thể đổi tên file nếu bạn muốn, nhưng đuôi của file thì bắt buộc phải là .py . Bây giowf bạn chỉ cần gọi trình thông dịch đi kèm với tên file mã nguồn của bạn, chương trình sẽ chạy ngay lập tức.

$ python latoya.py
2

Phần lớn nội dung của loạt bài này là các quá trình gõ lệnh thực hiện trên Commandline, vì sự thuận tiện: dễ dàng kiểm tra, thay thế, tiết kiệm thời gian lưu file,v..v.. .

2. Chương trình là gì ?

Chương trình là 1 chuỗi các dòng hướng dẫn(bằng ngôn ngữ lập trình) giúp cho máy tính thực hiện 1 công việc tính toán. Tính toán ở đây có thể hiểu là như trong toán học thong thường, tìm x, tính giá trị đa thực,.. nhưng cũng có thể hiểu là các thuật toán như tìm kiếm, sắp xếp hay thậm chí là thuật toán biên dịch chương trình.

Có rất nhiều ngôn ngữ lập trình giống nhau nhưng cơ bản thì trong 1 chương trình bất kì thường gồm các yếu tố:

input: Lấy dữ liệu từ bàn ohism, từ file, hay từ các thiết bị khác

output: xuất dữ liệu ra màn hình, ra file hay ra các dữ liệu khác

math: các pháp toán cơ bản như phép cộng và phép nhân

conditional execution: các cấu trúc kiểm tra điều kiện

repetition: các vòng lặp chương trình

Có thể khó tin nhưng đó là tất cả những điều cần thiết để tạo ra 1 chương trình. Mọi chương trình mà bạn sử dụng đều chỉ được tạo ra từ các yếu tố trên. Có thể định nghĩa quá trình tạo ra 1 chương trình hay “Đường đi của chương trình”  là quá trình phân tích vấn đề lớn ban đầu thành các vấn đề nhỏ, nhỏ thành nhỏ hơn,.. cứ thế cho đến khi các vấn đề có thể giải quyết 1 cách đơn giản.

Thực sự thì đó là 1 vấn đề rất khó và chắc chắn chúng ta sẽ đi sâu hơn khi nói về thuật toán .

3. Debug là gì?

Chương trình thực sự là 1 quá trình phức tạp và nó lại được tạo ra bởi con người nên chắc chắn là nó sẽ có rất nhiều lỗi. Lỗi chương trình như vậy được gọi là bug quá trình phát hiện + sửa lỗi được gọi là debug.

Các loại lỗi cơ bản thường gặp gồm có syntax errors, runtime errors và semantic errors.

3.1. syntax errors(lỗi cú pháp)

Python chỉ có thể thực hiện 1 yêu cầu nếu và chỉ nếu yêu cầu đó được viết đúng cú pháp mặc định của Python, nếu không, trình dịch sẽ không thực hiện yêu cầu và đưa ra thông báo lỗi. Tring giai đoạn đầu khi mới học lập trình việc mắc lỗi cú pháp thường xuyên là chuyện rất bình thường và hay gặp. Tuy nhiên khi đã có số kinh nghiệm nhất định thì nó sẽ rất hiếm khi xảy ra.

3.2.Runtime errors (lỗi thời gian chạy)

Loại lỗi thứ 2 được gọi là lỗi thời gian chạy. Kể cả khi chương trình của bạn mắc phải lỗi này, chưa chắc nó đã xuất hiện và làm dừng chương trình của bạn. Nó chỉ xuất hiện trong các trường hợp xấu nhất xảy ra lúc chạy chương trình, vì vậy nó còn được gọi là trường hợp đặc biệt (exceptions).

3.3 Semantic errors (lỗi thuật toán)

Loại lỗi thứ 3 hay gặp là lỗi thuật toán. Nếu chương trình của bạn mắc phải lỗi này thì nó sẽ bị ẩn đi, không được trình dịch thông báo, chương trình của banj thậm chí sẽ chạy tốt và có thế kết thúc được. Nhưng, kết quả của chương trình lại không đúng, nó là 1 cái gì đó khác. Lúc này bạn sẽ nhận ra là bạn đã viết một chương trình lạc đề, nó hoàn toàn không giống với những gì mà bạn muốn viết.

3.4 Debug thực tế

Debug là 1 trong những kĩ năng quan trọng mà bạn phải nắm được nếu bạn muốn trở thành một nhà khoa học máy tính. Mặc dù đôi khi nó sẽ rất khó khăn, nản lòng nhưng thực sự thì nó sẽ là 1 hoạt động lôi cuốn, đầy thách thực và rất rất thú vị.Nó tưowng tự như là làm thám tử, bán bắt buộc phải tìm những mánh mối, từ đó suy luận ra những câu lệnh, đoạn chương trình dẫn đến kết quả sai. Dự đoán những điều sai trong chương trình, thử lại nếu dự đoán không chính xác thì tiếp tục tìm những ý tưởng khác. Như Sherlock Holme đã nói “Nếu loại bỏ tất cả các khả năng sai ra thì khả năng còn lại, dù khó tin đến đâu cũng chính là sự thật“.

Đối với 1 số những kĩ sư phần mềm lâu năm, việc debug và programing là giống nhau. Programming là quá trình debug dần dần chương trình của bạn cho đến khi nó làm được những điều bạn muốn ban đầu. Như vậy mọi chương trình lớn nhỏ trên đời đều được bắt đầu từ những chương trình đơn giản.Ví dụ, hệ điều hành Linux lần đầu tiên được Linus Torvalds sử dụng như một chương trình đơn giản trên chip Intel 80386.Và như ông nói, phiên bản đầu tiên của Linux là 1 chương trình chuyển từ chuỗi “AAAA” sang chuối “BBBB”.

Chúng ta sẽ tiếp tục đi sâu hơn vào debug trong các bài sau.

4. Chương trình đầu tiên

Theo truyền thống lâu đời trong lập trình, chương trình đầu tiên mà mỗi người sẽ viết khi bắt đầu học ngôn ngữ mới có tên là “Hello, World!”. Đó là 1 chương trình đơn giản với nhiệm vụ hiển thị dòng chữ Hello, World! ra màn hình. Trong Python nó sẽ có dạng đơn giản là (bạn có thê viết ở chế độ nào của trình thông dịch tùy thích):

print "Hello, World!"

Kết quả sẽ hiện thì ra màn hình, trong trường hợp này, nó sẽ là :

Hello, World!

Dấu ngoặc kép đánh dấu sự bắt đầu và kết thúc của chuối kí tự được hiển thị ra màn hình. Người ta thường đánh giá một ngôn ngữ lập trình dựa trên sự đợn giản của chương trình  “Hello, World!” . Và như bạn đã thấy, rõ ràng là Python đã làm rất tốt!

Bài 1 của series xin được kết thục tại đây!

 

 

Bình luận về bài viết này