Chương 1: Lối đi của chương trình máy tính

Trở về Mục lục cuốn sách

Mục đích của cuốn sách này là hướng dẫn bạn suy nghĩ như là một nhà khoa học máy tính. Tôi thích lối suy nghĩ của những nhà khoa học máy tính vì ở đó có sự kết hợp những đặc điểm hay nhất của toán học, kĩ thuật, và khoa học tự nhiên. Cũng như những nhà toán học, những nhà khoa học máy tính dùng những ngôn ngữ có quy cách để diễn đạt ý tưởng (đặc biệt là tính toán). Giống như những kĩ sư, họ cũng làm công việc thiết kế, gắn kết các thành phần tạo nên một hệ thống và đánh giá những ưu khuyết giữa các phương án khác nhau. Giống như những nhà khoa học, họ khảo sát các động thái của hệ thống phức tạp, đề ra các giả thiết, và kiểm định những tính toán.

Kĩ năng quan trọng nhất của nhà khoa học máy tính là giải quyết vấn đề. Giải quyết vấn đề chính là cách tạo lập vấn đề, suy nghĩ giải pháp một cách sáng tạo, và trình bày giải pháp một cách rõ ràng và chính xác. Như bạn sẽ thấy, việc học lập trình chính là một cơ hội tuyệt vời để bạn luyện tập những kĩ năng giải quyết vấn đề. Đó là lí do tại sao chương này lại có tên là “Lối đi của chương trình máy tính”.

Một mặt, bạn sẽ được học cách lập trình, vốn bản thân nó là một kĩ năng hữu dụng. Mặt khác, bạn sẽ dùng lập trình như một phương tiện để giải quyết vấn đề. Điều này bạn sẽ dần dần làm được trong quá trình học.

1.1 Ngôn ngữ lập trình là gì?

Ngôn ngữ lập trình mà bạn sẽ học là Java, vốn là một ngôn ngữ tương đối mới (phiên bản đầu tiên do Sun phát hành vào tháng 5-1995). Java là một ví dụ trong số các ngôn ngữ lập trình bậc cao; một số ngôn ngữ lập trình bậc cao khác mà bạn có thể biết đến gồm có Python, C, C++, và Perl.

Nhắc đến “ngôn ngữ lập trình bậc cao”, có lẽ bạn cũng suy đoán được rằng còn những ngôn ngữ lập trình bậc thấp, đôi khi mà ta gọi là “ngôn ngữ máy” hoặc “hợp ngữ”. Nói nôm na, máy tính chỉ có thể thực hiện các chương trình được viết bằng ngôn ngữ bậc thấp. Vì vậy những chương trình được viết bằng một ngôn ngữ bậc cao cần được xử lý trước khi chúng có thể chạy được. Bước phụ trợ này sẽ tốn thêm thời gian, đây là một nhược điểm nhỏ của các ngôn ngữ bậc cao.

Tuy vậy, các ưu điểm là rất lớn. Thứ nhất, việc lập trình bằng ngôn ngữ bậc cao dễ hơn nhiều. Chương trình được viết bằng ngôn ngữ bậc cao được viết nhanh hơn, nội dung chương trình ngắn hơn, dễ đọc hơn, và nhiều khả năng là chúng chính xác. Thứ hai, các ngôn ngữ bậc cao có tính khả chuyển theo nghĩa chạy được trên nhiều hệ máy tính khác nhau mà ít hoặc không cần phải sửa đổi. Các chương trình bậc thấp chỉ có thể chạy trên một loại máy tính và phải được viết lại nếu muốn chạy trên các hệ máy khác.

Bởi các ưu điểm nêu trên, hầu hết các chương trình đều được lập trình bằng ngôn ngữ bậc cao. Các ngôn ngữ bậc thấp chỉ được dùng cho một số ít những ứng dụng đặc biệt.

Hai loại chương trình có nhiệm vụ chuyển đổi các ngôn ngữ bậc cao về dạng ngôn ngữ bậc thấp: trình thông dịch và trình biên dịch. Trình thông dịch là một chương trình máy tính, có nhiệm vụ đọc một chương trình bậc cao và thực hiện nó theo đúng những gì mà chương trình chỉ định. Nó xử lý chương trình một cách dần dần, nghĩa là đọc câu lệnh đến đâu thì thực hiện tính toán tới đó.

Còn trình biên dịch thì có nhiệm vụ đọc chương trình và dịch nó hoàn toàn trước khi thực hiện bất kì một câu lệnh nào trong chương trình. Thường thì bạn thực hiện bước biên dịch chương trình trước, sau đó mới chạy mã lệnh đã biên dịch. Khi đó, chương trình bậc cao được gọi là mã nguồn, và chương trình sau khi được dịch gọi là mã đối tượng, hoặc chương trình chạy.

Chương trình Java vừa được biên dịch lẫn thông dịch. Thay vì việc chuyển chương trình sang ngôn ngữ máy, trình biên dịch Java phát sinh ra mã byte. Mã byte dễ thông dịch (và thông dịch cũng nhanh), giống như mã máy; song nó còn khả chuyển, như một ngôn ngữ bậc cao. Vì vậy, ta có thể biên dịch một chương trình trên máy này, đưa mã byte sang máy khác, sau đó thông dịch mã byte này trên máy mới. Khả năng này là một lợi thế của Java so với nhiều ngôn ngữ bậc cao khác.

thinkjava001

Mặc dù quá trình này có vẻ phức tạp, nhưng đa số các môi trường phát triển chương trình đều giúp bạn tự động thực hiện các bước kể trên. Thông thường bạn sẽ chỉ phải viết một chương trình rồi ấn một nút hoặc gõ vào một câu lệnh để biên dịch và chạy. Mặt khác, ta vẫn cần biết những bước nào đang được máy thực hiện ngầm, để nhỡ có trục trặc thì có thể hình dung ra sai ở khâu nào.

1.2 Chương trình là gì?

Chương trình là một danh sách các chỉ dẫn cách thực hiện tính toán.1 Việc tính toán có thể là phép thao tác toán học, chẳng hạn giải hệ phương trình hoặc tìm nghiệm đa thức, nhưng cũng có thể là những phép tính trên các kí hiệu, chẳng hạn tìm kiếm và thay thế chữ trong một văn bản, hoặc (kì lạ hơn) là biên dịch một chương trình.

Những chỉ dẫn, mà ta gọi là những câu lệnh, sẽ khác nhau tùy loại ngôn ngữ lập trình, nhưng chung quy lại có một số ít các phép thao tác mà nhiều ngôn ngữ thực hiện:

nhập số liệu:
Là việc lấy số liệu từ bàn phím, file, hoặc một thiết bị khác.
xuất kết quả:
Hiển thị kết quả trên màn hình hoặc gửi kết quả ra file hoặc một thiết bị khác.
tính toán:
Thực hiện các phép toán cơ bản như cộng và nhân.
kiểm tra:
Kiểm tra một điều kiện cụ thể và thực hiện danh sách câu lệnh tương ứng với điều kiện đó.
tính lặp:
Thực hiện lặp lại công việc nhiều lần, thường là với một số thay đổi giữa các lần lặp.

Như vậy đã tương đối đầy đủ. Mỗi chương trình mà bạn đã từng dùng qua, bất kể nó phức tạp đến đâu, đều được hợp thành từ những câu lệnh thực hiện tính toán. Vì vậy, một cách mô tả lập trình, đó là quá trình chia một bài toán lớn, phức tạp thành nhiều bài toán nhỏ hơn cho đến khi từng bài toán nhỏ này đơn giản đến mức có thể được thực hiện theo một trong các chỉ dẫn trên đây.

1.3 Gỡ lỗi là gì?

Việc lập trình rất hay mắc phải lỗi. Việc theo dõi, phân tích nguyên nhân gây ra lỗi được gọi là gỡ lỗi.

Có ba loại lỗi có thể xuất hiện trong chương trình: lỗi cú pháp, lỗi chạy và lỗi ngữ nghĩa. Để nhanh chóng tìm ra lỗi ta cần phân biệt được chúng.

1.3.1 Lỗi cú pháp

Trình biên dịch chỉ có thể chuyển đổi được chương trình nếu như nó đúng đắn về cú pháp; còn nếu không, việc biên dịch sẽ thất bại và bạn sẽ không chạy được chương trình. Cú pháp nghĩa là cấu trúc của chương trình và các quy tắc về cấu trúc đó.

Chẳng hạn, trong tiếng Anh, một câu viết phải bắt đầu bằng chữ in hoa và kết thúc bằng dấu chấm. câu này có một lỗi cú pháp. Và câu này cũng vậy

Đa phần ban đọc thường không để tâm đến một số ít lỗi cú pháp, vì vậy ta có thể đọc thơ của tác giả e e cummings mà không thốt ra lời thông báo lỗi nào.

Các trình biên dịch thì không như vậy. Chỉ cần trong chương trình có lỗi cú pháp ở bất cứ đâu, trình biên dịch sẽ hiển thị thông báo lỗi và kết thúc, và bạn sẽ không thể chạy chương trình.

Tệ hơn nữa là trong Java có nhiều quy tắc cú pháp hơn là trong tiếng Anh, và thường thì những thông báo lỗi mà bạn nhận được từ trình biên dịch đều không giúp ích gì nhiều. Nếu bạn mới nhập môn lập trình được vài tuần, rất có thể bạn phải dành nhiều thời gian dò tìm lỗi. Khi kinh nghiệm tăng dần lên, bạn sẽ tránh được lỗi tốt hơn và nếu mắc thì cũng phát hiện ra lỗi nhanh hơn.

1.3.2 Lỗi thực thi

Loại lỗi thứ hai là lỗi thực thi; chúng có tên như vậy bởi vì chỉ xuất hiện khi chương trình đã bắt đầu chạy. Trong Java, lỗi thực thi xảy ra khi trình thông dịch đang chạy mã byte và có điều gì đó trục trặc.

Java có xu hướng là ngôn ngữ an toàn, theo nghĩa trình biên dịch sẽ bắt rất nhiều lỗi. Do vậy lỗi thực thi sẽ hiếm, đặc biệt là ở những chương trình đơn giản.

Trong Java, lỗi thực thi được gọi là biệt lệ, và ở hầu hết các môi trường lập trình, chúng xuất hiện dưới hình thức của sổ hoặc hộp thoại ghi rõ những thông tin về tình trạng đã diễn ra và lúc đó thì chương trình đang thực hiện những gì. Thông tin này rất có ích đối với việc gỡ lỗi.

1.3.3 Lỗi logic và ngữ nghĩa

Loại lỗi thứ ba là lỗi logic hay lỗi ngữ nghĩa. Trong trường hợp có lỗi kiểu này, chương trình sẽ vẫn được biên dịch và chạy mà không phát ra thông báo lỗi nào, nhưng sẽ không thực hiện đúng yêu cầu mong muốn, mà sẽ cho kết quả khác. Cụ thể là thực hiện theo đúng những câu lệnh mà bạn đã chỉ dẫn.

Vấn đề ở đây là chương trình bạn viết sẽ không đúng theo ý muốn của bạn. Ý nghĩa của chương trình bị sai lệch. Việc phát hiện các lỗi ngữ nghĩa đôi lúc rất khó vì bạn cần phải quay ngược lại và nhìn vào kết quả của chương trình để phán đoán xem bản thân chương trình đã thực hiện những gì.

1.3.4 Gỡ lỗi thử nghiệm

Một trong những kĩ năng quan trọng nhất mà bạn sẽ học được, đó là gỡ lỗi. Mặc dù đôi khi bị vấp váp, nhưng việc gỡ lỗi rất thú vị, chứa đầy thử thách và là một phần có giá trị trong lập trình.

Gỡ lỗi giống như việc điều tra tội phạm. Bạn có trong tay các manh mối, phải suy luận ra các quá trình và sự kiện dẫn đến những hậu quả đang chứng kiến.

Việc gỡ lỗi cũng giống như khoa học thực nghiệm. Mỗi khi có ý kiến về nguyên nhân dẫn đến lỗi sai, bạn sửa chữa chương trình và thực hiện lại. Nếu giả thiết của bạn là đúng thì bạn thu được kết quả của công việc sửa chữa, đồng thời tiến một bước gần hơn tới chương trình đúng. Còn nếu giả thiết là sai thì bạn cần đề ra một giả thiết mới. Sherlock Holmes đã chỉ ra, “Khi bạn đã loại trừ tất cả những điều không thể thì những gì còn lại, dù có mập mờ đến đâu, chính là sự thật”. (A. Conan Doyle, Dấu của bộ tứ)

Đối với một số người, việc lập trình và gỡ lỗi là giống nhau. Đó là vì lập trình chính là quá trình gỡ lỗi dần dần đến khi bạn có được chương trình mong muốn. Ý tưởng ở đây là bạn nên bắt đầu với một chương trình thực hiện được một điều gì đó, rồi thực hiện các chỉnh sửa nhỏ, gỡ lỗi trong quá trình phát triển, đến khi bạn có được một chương trình hoàn thiện.

Chẳng hạn, Linux là một hệ điều hành bao gồm hàng nghìn dòng lệnh, nhưng nó chỉ bắt đầu từ một chương trình đơn giản do Linus Torvalds dùng để khám phá chip Intel 80386. Theo Larry Greenfield thì “Một trong những dự án trước đó của Linus là một chương trình có nhiệm vụ chuyển từ việc in AAAA thành BBBB. Sau đó nó dần trở thành Linux”. (The Linux Users’ Guide Beta Version 1 / Hướng dẫn sử dụng Linux, phiên bản Beta 1).

Các chương tiếp sau đây sẽ nói thêm về việc gỡ lỗi và các vấn đề thực tế trong lập trình.

1.4 Ngôn ngữ hình thức và ngôn ngữ tự nhiên

Ngôn ngữ tự nhiên được mọi người dùng để giao tiếp, ví dụ Tiếng Anh, Tiếng Tây Ban Nha, Tiếng Pháp. Chúng tự do phát triển mà không định theo khuôn mẫu với bất kì mục đích nào (mặc dù có một số trật tự chẳng hạn như ngữ pháp);

Ngôn ngữ hình thức được con người thiết kế để ứng dụng trong những lĩnh vực riêng. Chẳng hạn, kí hiệu toán học chính là một ngôn ngữ hình thức rất hữu dụng để biểu diễn mối quan hệ giữa những biến lượng và con số. Trong hoá học, một loại ngôn ngữ hình thức khác được dùng để biểu diễn cấu trúc hoá học của các phân tử. Và quan trọng nhất:

Ngôn ngữ lập trình là những ngôn ngữ hình thức được thiết kế phục vụ mục đích diễn tả quá trình tính toán.

Các ngôn ngữ hình thức thường có quy định rất chặt chẽ về cú pháp. Chẳng hạn, 3 + 3 = 6 là một biểu thức toán học đúng, nhưng 3 $ = thì không. H2O là một công thức hoá học đúng về cú pháp, còn 2Zz thì không.

Các quy tắc cú pháp có hai dạng, thuộc về các nguyên tố và cấu trúc. Nguyên tố là các thành phần cơ sở của ngôn ngữ, chẳng hạn, các từ, các con số, và các nguyên tố hoá học. Trong ví dụ nêu trên, 3 $ = có lỗi sai vì $ không phải là một nguyên tố hợp lệ trong toán học (theo như tôi được biết). Tương tự như vậy, 2Zz không hợp lệ vì không có nguyên tố hoá học nào có kí hiệu là Zz.

Loại lỗi cú pháp thứ hai thuộc về dạng cấu trúc của một mệnh đề; nghĩa là cách sắp xếp các nguyên tố. Mệnh đề 3 $ = không hợp lệ về cấu trúc là vì bạn không thể để dấu bằng ở cuối phương trình được. Tương tự như vậy, trong một công thức hoá học thì chỉ số phải được đặt sau tên nguyên tố chứ không phải đặt trước.

Mỗi khi đọc một câu trong ngôn ngữ tự nhiên, hoặc trong ngôn ngữ hình thức, bạn cần hình dung được cấu trúc của câu đó là gì (mặc dù với ngôn ngữ tự nhiên thì việc làm này được thực hiện một cách vô thức). Quá trình này được gọi là phân tách.

Mặc dù ngôn ngữ hình thức và ngôn ngữ tự nhiên có nhiều đặc điểm chung—nguyên tố, cấu trúc, cú pháp, và ngữ nghĩa—nhưng chúng có một số khác biệt:

về sự mập mờ:
Ngôn ngữ tự nhiên chứa đựng sự mập mờ theo nghĩa con người muốn hiểu đúng phải có suy luận tuỳ từng ngữ cảnh. và có thêm các thông tin khác để bổ sung. Các ngôn ngữ hình thức được thiết kế gần như rõ ràng tuyệt đối, tức là mỗi mệnh để chỉ có đúng một nghĩa, bất kể ngữ cảnh như thế nào.
về sự dư thừa:
Để loại trừ sự mập mờ và tránh gây hiểu nhầm, ngôn ngữ tự nhiên cần dùng đến nhiều nội dung bổ trợ làm dài thêm nội dung. Các ngôn ngữ hình thì gọn gàng hơn.
về văn phong:
Các ngôn ngữ tự nhiên có chứa nhiều thành ngữ và ẩn dụ. Các ngôn ngữ hình thức luôn luôn có nghĩa đúng theo những gì được viết ra.

Chúng ta dùng ngôn ngữ tự nhiên ngay từ thuở nhỏ, nên thường có một thời gian khó khăn ban đầu khi làm quen với ngôn ngữ hình thức. Về phương diện nào đó, sự khác biệt giữa ngôn ngữ hình thức và ngôn ngữ tự nhiên cung như khác biệt giữa thơ ca và văn xuôi, dù hơn thế nữa.

Thơ ca:
Các từ được dùng với cả chức năng âm điệu bên cạnh chức năng ý nghĩa, và toàn bộ bài thơ/ca tạo ra hiệu quả cảm xúc. Luôn mang tính không rõ ràng, thậm chí còn là chủ định của tác giả.
Văn xuôi:
Coi trọng ý nghĩa của câu chữ hơn, và cấu trúc giúp cho việc diễn đạt ý nghĩa.
Chương trình:
Ý nghĩa của một chương trình máy tính là rõ ràng và được diễn đạt hoàn toàn thông qua câu chữ, theo đó ta có thể hiểu được trọn ven bằng cách phân tích các nguyên tố và cấu trúc.

Khi đọc chương trình (hoặc một ngôn ngữ hình thức nào khác) bạn nên làm như sau. Trước hết, hãy nhớ rằng ngôn ngữ hình thức cô đọng hơn ngôn ngữ tự nhiên, nên phải mất nhiều thời gian để đọc hơn. Mặt khác, cấu trúc cũng rất quan trọng, do đó không nên chỉ đọc qua một lượt từ trên xuống dưới. Thay vì vậy, bạn nên học cách phân tách ngôn ngữ trong trí óc, nhận diện các nguyên tố và diễn giải cấu trúc. Cuối cùng, những chi tiết đóng vai trò quan trọng. Các lỗi dù là nhỏ nhất trong cách viết các từ hoặc dấu câu trong ngôn ngữ hình thức sẽ có thể gây ra khác biệt lớn về ý nghĩa.

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

Theo thông lệ, chương trình đầu tiên mà bạn viết theo một ngôn ngữ lập trình mới có tên gọi là “Hello, World!” vì tất cả những gì nó thực hiện chỉ là làm hiện ra dòng chữ “Hello, World!” Một chương trình như vậy trong Java được viết như sau:

class Hello {
    // main: xuất ra một thông tin đơn giản
    public static void main(String[] args) {
        System.out.println("Hello, world.");
    }
}

Chương trình này có những đặc điểm hơi khó giải thích cho người mới bắt đầu, song nó giúp ta có cái nhìn bao quát về những chủ đề sau này sẽ được học.

Một chương trình Java được hợp thành từ những lời khai báo lớp, vốn có dạng sau:

class TENLOP {
    public static void main (String[] args) {

        CAC_CAU_LENH
    }

}

Ở đây TENLOP là một tên gọi do người lập trình đặt. Trong ví dụ trên, tên lớp là Hello.

main là một phương thức, tức là một tập hợp được đặt tên, bao gồm các câu lệnh. Tên gọi main này rất đặc biệt; nó đánh dấu điểm khởi đầu của chương trình. Khi chạy chương trình, câu lệnh đầu tiên trong main sẽ là điểm bắt đầu và kết thúc ở câu lệnh cuối cùng trong đó.

main có thể gồm nhiều câu lệnh, nhưng ở ví dụ trên thì chỉ có một. Đó là câu lệnh in, nghĩa là nó hiển thị một giá trị trên màn hình. Chỗ này dễ gây lẫn, “print” có thể mang ý nghĩa “hiện ra trên màn hình” hay “gửi nội dung đến máy in”. Trong cuốn sách này, tôi không nói về việc gửi đến máy in; tất cả việc in của chúng ta là hiển thị lên màn hình. Lệnh in kết thúc bằng một dấu chấm phẩy (;).

System.out.println là một phương thức do thư viện của Java cung cấp. Một thư viện là tập hợp gồm những lời định nghĩa lớp và phương thức.

Java dùng những cặp ngoặc nhọn ({ và }) để nhóm thông tin lại với nhau. Cặp ngoặc nhọn ở ngoài cùng (các dòng 1 và 8) chứa lời định nghĩa lớp, còn cặp ngoặc nhọn phía trong thì chứa lời định nghĩa cho main.

Dòng 3 bắt đầu bằng //. Như vậy dòng này là một lời chú thích, tức là một đoạn chữ mà bạn có thể viết vào chương trình, thường để giải thích công dụng của chương trình. Khi trình biên dịch thấy //, nó sẽ phớt lờ những gì kể từ đó đến cuối dòng.

1.6 Thuật ngữ

giải quyết vấn đề:
Quá trình thiết lập bài toán, tìm lời giải, và biểu diễn lời giải.
ngôn ngữ bậc cao:
Ngôn ngữ lập trình như Python được thiết kế nhằm mục đích để con người dễ đọc và viết.
ngôn ngữ bậc thấp:
Ngôn ngữ lập trình được thiết kế nhằm mục đích để máy tính dễ thực hiện; còn gọi là “ngôn ngữ máy” hoặc “hợp ngữ”.
tính khả chuyển:
Đặc tính của chương trình mà có thể chạy trên nhiều loại máy tính khác nhau.
thông dịch:
Thực hiện chương trình được viết bằng ngôn ngữ bậc cao bằng cách dịch nó theo từng dòng một.
biên dịch:
Dịch một lượt toàn bộ chương trình viết bằng ngôn ngữ bậc cao sang ngôn ngữ bậc thấp, để chuẩn bị thực hiện sau này.
mã nguồn:
Chương trình ở dạng ngôn ngữ bậc cao trước khi được biên dịch.
mã đối tượng:
Sản phẩm đầu ra của trình biên dịch sau khi nó đã dịch chương trình.
chương trình chạy:
Tên khác đặt cho mã đối tượng đã sẵn sàng được thực hiện.
dấu nhắc:
Các kí tự được hiển thị bởi trình thông dịch nhằm thể hiện rằng nó đã sẵn sàng nhận đầu vào từ phía người dùng.
văn lệnh:
Chương trình được lưu trong file (thường chính là chương trình sẽ được thông dịch).
chế độ tương tác:
Cách dùng trình thông dịch Python thông qua việc gõ các câu lệnh và biểu thức vào chỗ dấu nhắc.
chế độ văn lệnh:
Cách dùng trình thông dịch Python để đọc và thực hiện các câu lệnh có trong một văn lệnh.
chương trình:
Danh sách những chỉ dẫn thực hiện tính toán.
thuật toán:
Quá trình tổng quát để giải một lớp các bài toán.
lỗi:
Lỗi trong chương trình.
gỡ lỗi:
Quá trình dò tìm và gỡ bỏ cả ba kiểu lỗi trong lập trình.
cú pháp:
Cấu trúc của một chương trình.
lỗi cú pháp:
Lỗi trong chương trình mà làm cho quá trình phân tách không thể thực hiện được (và hệ quả là không thể biên dịch được).
biệt lệ:
Lỗi được phát hiện khi chương trình đang chạy.
ngữ nghĩa:
Ý nghĩa của chương trình.
lỗi ngữ nghĩa:
Lỗi có trong chương trình mà khiến cho chương trình thực hiện công việc ngoài ý định của người viết.
ngôn ngữ tự nhiên:
Ngôn ngữ bất kì được con người dùng, được trải qua sự tiến hóa tự nhiên.
ngôn ngữ hình thức:
Ngôn ngữ bất kì được con người thiết kế nhằm mục đích cụ thể, như việc biểu diễn các ý tưởng toán học hoặc các chương trình máy tính; tất cả các ngôn ngữ lập trình đều là ngôn ngữ hình thức.
nguyên tố:
Một trong những thành phần cơ bản trong cấu trúc cú pháp của một chương trình, tương đương với một từ trong ngôn ngữ tự nhiên.
phân tách:
Việc kiểm tra một chương trình và phân tích cấu trúc cú pháp.
lệnh print:
Câu lệnh khiến cho kết quả được hiển thị lên màn hình.

1.7 Bài tập

Bài tập 1

Các nhà khoa học máy tính thường có thói quen dùng những từ tiếng Anh thông thường để chỉ những thứ khác với nghĩa tiếng Anh thông dụng của từ đó. Chẳng hạn, trong tiếng Anh, “statement” và “comment” đồng nghĩa với nhau, nhưng trong chương trình thì chúng khác hẳn.

Phần thuật ngữ ở cuối mỗi chương nhằm điểm lại những từ và cụm từ có ý nghĩa riêng trong ngành khoa học máy tính. Khi bạn thấy những từ quen thuộc, thì đừng lờ đi coi như đã biết nghĩa của chúng nhé!

  1. Theo thuật ngữ máy tính, sự khác biệt giữa câu lệnh và chú thích như thế nào?
  2. Nói một chương trình có tính khả chuyển nghĩa là gì?
  3. Một chương trình chạy có nghĩa là gì?

Bài tập 2

Trước khi tiếp tục, bạn hãy tìm hiểu cách biên dịch và chạy chương trình Java trong môi trường lập trình của mình. Một số loại môi trường cung cấp sẵn những chương trình mẫu tựa như ví dụ ở Mục 1.5.

  1. Gõ vào chương trình “Hello, World”, rồi biên dịch và chạy nó.
  2. Thêm một câu lệnh để in ra một dòng chữ thứ hai theo sau “Hello, World!”. Có thể là câu đùa vui “How are you?” Hãy biên dịch và chạy lại chương trình.
  3. Thêm một chú thích vào (bất kì đâu) trong chương trình, biên dịch lại, và chạy lại lần nữa. Lời chú thích mới phải không làm ảnh hưởng đến kết quả.

Bài tập này có vẻ lặt vặt, song đây chính là điểm khởi đầu cho nhiều chương trình mà ta sẽ làm việc với. Để chắc tay gỡ lỗi, bạn phải dùng thạo môi trường lập trình của mình. Trong một số môi trường, rất dễ bị mất dấu chương trình đang chạy, và bạn có thể rơi vào trường hợp đi gỡ lỗi một chương trình trong khi vô ý chạy chương trình khác. Việc thêm vào (và thay đổi) câu lệnh in là một cách đơn giản để đảm bảo chắc chương trình đang làm việc là chương trình mà bạn chạy.

Bài tập 3

Một ý tưởng hay là hãy phạm càng nhiều lỗi trong lập trình mà bạn có thể hình dung được, để thấy những thông báo lỗi nào mà trình biên dịch đưa ra. Đôi khi trình biên dịch cho bạn biết chính xác sai ở chỗ nào, và bạn chỉ việc sủa nó. Nhưng đôi khi các thông báo lỗi lại đánh lại hướng. Bạn sẽ hình thành nên một trực giác để phân biệt lúc nào thì tin cậy trình biên dịch và lúc nào phải tự hình dung ra lỗi.

  1. Xóa bớt một trong các dấu mở ngoặc nhọn.
  2. Xóa bớt một trong các dấu đóng ngoặc nhọn.
  3. Thay vì main, hãy viết mian.
  4. Xóa từ static.
  5. Xóa từ public.
  6. Xóa từ System.
  7. Thay thế println bằng Println.
  8. Thay thế println bằng print. Câu hỏi này đánh đố ở chỗ, đây là lỗi logic chứ không phải lỗi cú pháp. Câu lệnh System.out.print hoàn toàn hợp lệ, nhưng nó có thể có hoặc không làm theo điều bạn dự kiến.
  9. Xóa một trong số các ngoặc tròn. Thêm vào một ngoặc tròn.

  1. Định nghĩa này không đúng với mọi ngôn ngữ lập trình. Một ví dụ là các ngôn ngữ đặc tả, xem http://en.wikipedia.org/wiki/Declarative_programming
Advertisements

%(count) bình luận

Filed under Think Java

One response to “Chương 1: Lối đi của chương trình máy tính

  1. Pingback: Think Java: Cách suy nghĩ như nhà khoa học máy tính | Blog của Chiến

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s