1.1. C++ là gì ?

Bạn bị thu hút bởi tin học và muốn học lập trình? Khi mới bắt đầu, bạn có thể thấy nó khá phức tạp, nhưng trên thực tế, việc học lập trình không quá khó khăn như bạn vẫn nghĩ.

Bạn băn khoăn phải bắt đầu từ đâu, liệu C++ có phù hợp với bạn, liệu bạn có nên bắt đầu bằng một ngôn ngữ khác. Bạn tự hỏi liêu C++ có cho phép bạn làm những gì bạn muốn, đâu là những điểm mạnh và điểm yếu của C++…

Trong chương này, chúng tôi sẽ cố gắng trả lời cho bạn tất cả những câu hỏi đó. Đừng quên rằng đây là một giáo trình dành cho người mới bắt đầu học lập trình. Bạn không cần phải có một nền tảng kiến thức lập trình hay tin học nào  để theo học giáo trình này. Ngay cả khi bạn chưa từng lập trình, tất cả những gì bạn cần là học theo giáo trình của chúng tôi một cách bài bản, không nhảy cóc và phải thực hành thường xuyên cùng chúng tôi.

Các chương trình

Các chương trình là nền tảng của tin học. Nó cho phép bạn thao tác với máy tính.

Chúng ta hãy cùng đến với ví dụ dưới đây thông qua ảnh chụp màn hình máy tính của tôi. Các bạn có thể nhìn thấy 3 cửa sổ tương ứng với 3 chương trình khác nhau. Theo thứ tự từ gần đến xa bạn :

 Cửa sổ trong Windows

  • Trình duyệt web Google Chrome, cho phép bạn truy cập các trang web
  • Trình quản lí các tệp, cho phép bạn quản lí các tệp tin trong máy tính
  • Trình soạn thảo văn bản Microsoft Word, cho phép bạn soạn thư và văn bản

Như các bạn thấy, mỗi chương trình khác nhau được tạo ra với một mục đích riêng biệt. Chúng ta cũng có thể kể đến các games nổi tiếng như Starcraft II, World ò Warcraft, Worms, Team Fortress 2, … Tất cả đều là các chương trình.

Các chương trình không nhất thiết phải được hiển thị để bạn có thể nhìn thấy, ví dụ như các chương trình cập nhật tự động cho máy tính của bạn, hay các chương trình diệt virus. Nó vẫn ngầm chạy, mặc dù không được hiển thị ra màn hình máy tính để bạn thấy ; nhưng điều đó không có nghĩa là nó không tương tác hay không hoạt động.

Starcraft II

Tôi cũng muốn tạo một chương trình. Vậy tôi phải làm như thế nào ?

Trước hết, hãy xác định rõ bạn muốn tạo một chương trình ở cấp độ nào ? Một trò chơi như Starcraft II cần hàng chục lập trình viên toàn thời gian, làm việc trong nhiều năm trời. Đừng đặt ra cho bạn những mục tiêu quá khó để đạt được ngay lúc mới bắt đầu học lập trình.

Nếu bạn theo học giáo trình này, bạn sẽ có những kiến thức lập trình nền tảng. Ở một bài thực hành trong giáo trình, bạn sẽ được tự tạo cho mình một trình duyệt web (đơn giản hóa) giống như Mozilla Firefox và Google Chrome ! Bạn sẽ biết tạo các chương trình với cửa sổ tương tác. Bạn thậm chí có thể tạo ra các games 2D và 3D nếu bạn muốn. Tóm lại, với thời gian và sự kiên trì học tập, bạn có thể tiến rất xa so với hình dung ban đầu.

Các ngôn ngữ lập trình

Máy tính của bạn là một cỗ máy phức tạp và chứa đựng nhiều điều đáng ngạc nhiên. Nó chỉ có thể hiểu một ngôn ngữ nền tảng chỉ dựa trên mã hóa 0 và 1. Một dãy kí tự giống như

1010010010100011010101001010111010100011010010

Có thể tương ứng với việc « Hiển thị một cửa sổ ra màn hình ».

Phải, nhưng nó rất phức tạp. Chúng ta có cần thiết phải học loại ngôn ngữ này ? May thay câu trả lời là không. Nếu phải viết bằng thứ ngôn ngữ này (chúng ta gọi nó là ngôn ngữ nhị phân), trò chơi Starcraft sẽ cần được viết không phải trong nhiều năm mà là trong nhiều thế kỉ (bạn đừng cười !)

Để đơn giản hóa, các kĩ sư tin học đã  tạo ra các ngôn ngữ trung gian, đơn giản hơn ngôn ngữ nhị phân. Ngày nay tồn tại hàng trăm ngôn ngữ lập trình khác nhau. Để dễ hình dung, bạn có thể tham khảo danh sách các ngôn ngữ lập trình tại wikipedia. Mỗi ngôn ngữ có một đặc điểm riêng, chúng ta sẽ nghiên cứu kĩ hơn ở phần sau.

Tất cả các ngôn ngữ lập trình được tạo ra với cùng một mục đích : giúp bạn giao tiếp với máy tính một cách dễ dàng hơn là thông qua ngôn ngữ nhị phân. Nó hoạt động như sau :

  1. Bạn viết các câu lệnh cho máy tính bằng một ngôn ngữ lập trình (ví dụ như C++)
  2. Các câu lệnh được dịch sang ngôn ngữ nhị phân nhờ vào một « chương trình dịch »
  3. Máy tính lúc này có thể đọc các lệnh đã được dịch sang ngôn ngữ nhị phân và thực hiện các câu lệnh của bạn.

Sơ đồ dưới đây tóm tắt 3 bước trên :

Biên dịch

Trình biên dịch (compiler)

«Chương trình dịch» có tên gọi là trình biên dịch (compiler). Đây là một công cụ không thể thiếu, biến đổi đoạn code mà bạn viết bằng một ngôn ngữ lập trình thành một chương trình thực sự có thể chạy được.

Chúng ta hãy cùng biểu diễn lại sơ đồ bên trên bằng ngôn ngữ tin học :

Biên dịch

Vậy làm thế nào để lựa chọn giữa hàng trăm ngôn ngữ lập trình ? Ngôn ngữ nào là ngôn ngữ tốt nhất ? C++ có phải là một lựa chọn tốt ?

Các lập trình viên thường phải biết nhiều ngôn ngữ lập trình chứ không phải một. Họ thường không chỉ tập trung vào một ngôn ngữ duy nhất.

Tất nhiên để bắt đầu, bạn chỉ cẩn học tốt một trong số các ngôn ngữ đó. May mắn thay, bạn có thể bắt đầu bằng bất cứ  ngôn ngữ nào bạn muốn. Các nguyên tắc lập trình không thay đổi, sẽ không quá khó khăn để bạn chuyển từ ngôn ngữ này sang ngôn ngữ khác.

Tuy vậy, chúng ta sẽ cùng xem xét điều làm nên sự khác biệt giữa C++ và các ngôn ngữ khác. Đúng thế, bạn đừng quên bạn đang đọc giáo trình C++.

C++ so với các ngôn ngữ lập trình khác

C++ là ngôn ngữ bậc cao hay ngôn ngữ bậc thấp ?

Trong số hàng trăm ngôn ngữ lập trình đang cùng tồn tại, một số được dùng phổ biến hơn những ngôn ngữ còn lại. C++ là một ngôn ngữ phổ biến như thế.  Một số trang web giống như langpop.com vẫn cập nhật bảng xếp hạng các ngôn ngữ đang được dùng nhiều nhất, nếu bạn muốn tìm hiểu. Như bạn có thể thấy, C, Java và C++ là 3 ngôn ngữ luôn giữ vị trí rất cao trong bảng xếp hạng.

Câu hỏi đặt ra là : Có nhất thiết phải chọn một ngôn ngữ phổ biến ? Có những ngôn ngữ rất thú vị nhưng ít được sử dụng rộng rãi. Nếu bạn học những ngôn ngữ này, bạn sẽ gặp khó khăn trong việc tìm người có thể giúp bạn khi bạn gặp phải vấn đề gì đó. Đó là lí do vì sao C++ là một lựa chọn tốt cho những người mới bắt đầu : có rất nhiều người lập trình bằng C++ và bạn sẽ không cảm thấy lạc lõng khi học ngôn ngữ này.

Tất nhiên cũng có những tiêu chí khác ngoài tính phổ biến. Tiêu chí quan trọng nhất theo quan điểm cá nhân của tôi là bậc của ngôn ngữ. Có hai nhóm ngôn ngữ lập trình : ngôn ngữ bậc cao và ngôn ngữ bậc thấp.

Vậy ngôn ngữ bậc cao là gì ?

Đó là một ngôn ngữ khác hẳn so với ngôn ngữ nhị phân, nghĩa là khác hẳn so với cách máy tính vận hành. Nó giúp bạn lập trình một cách nhanh chóng và dễ dàng.

Ngược lại, ngôn ngữ bậc thấp có vẻ gần gũi với sự vận hành của máy tính hơn : nó thường đòi hỏi nhiều hơn ở bạn nhưng cũng cho bạn nhiều khả năng kiểm soát hơn đối với những gì bạn làm.

C++ được xếp vào nhóm ngôn ngữ lập trình bậc thấp. Điều này không có gì khiến bạn phải sợ hãi cả. Mặc dù khá phức tạp, ngôn ngữ này có những ưu điểm nổi bật như hiệu năng và tốc độ cao.  Trên thực tế, lí do chính khiến phần lớn các trò chơi được phát triển bằng C++ chính là sức mạnh và tốc độ của ngôn ngữ này. Đây là lí do khiến C++ trở thành một ngôn ngữ mà bạn không thể bỏ qua.

Sơ đồ sau đây giới thiệu với bạn một số ngôn ngữ lập trình phân loại theo bâc :

Hệ thống ngôn ngữ

Bạn có thể thấy chúng ta có thể lập trình bằng hệ nhị phân dựa vào một ngôn ngữ cổ điển có tên gọi Assembleur. Bởi vì riêng việc viết một chương trình để thực hiện các phép tính cơ bản bằng ngôn ngữ nhị phân đỏi hỏi những nỗ lực khủng khiếp mà người thường khó có thể làm được, chúng ta thường ưu tiên sử dụng một ngôn ngữ lập trình (trung gian).

Trong lập trình, khái niệm « bậc » là một khái niệm tương đối. Chúng ta có thể coi C++ là ngôn ngữ bậc thấp so với Python, nhưng nó ở bậc cao hơn so với Assembleur. Tất cả phụ thuộc vào góc nhìn của chúng ta.

Tóm tắt các điểm mạnh của C++

C++ rất phổ biến. Như bạn đã thấy, nó là một trong những ngôn ngữ được sử dụng nhiều nhất trên thế giới. Vì thế chúng ta có thể tìm thấy rất nhiều các tài liệu trên internet cũng như các sự trợ giúp trên các diễn đàn về C++. Thậm chí có những người tốt bụng viết hẳn giáo trình C++ dành cho người mới bắt đầu.

C++ rất nhanh, thậm chí là cực nhanh. Ưu điểm này khiến nó là lựa chọn số 1 cho các ứng dụng cần tốc độ, điển hình như các trò chơi, các phần mềm tài chính hay các chương trình quân sự hoạt động theo thời gian thực.

Nó có tính di động (portable) : Một đoạn code C++ trên lý thuyết có thể được chuyển đổi một cách dễ dàng để chạy trong Windows, Mac OS hay Linux. Bạn không cần phải viết lại chương trình của mình để chạy trong một plateform khác.

Có rất nhiều các thư viện cho C++. Các thư viện là các mở rộng cho một ngôn ngữ, gần giống như các plug-in.  C++, bản thân nó, không thể làm được nhiều điều, nhưng khi kết hợp với các thư viện, chúng ta có thể tạo các chương trình 3D, mạng, âm thanh, cửa sổ,…

C++ đa mô hình (multi-paradigms). Nghĩa là chúng ta có thể lập trình C++ bằng nhiều cách khác nhau. Vì bạn vẫn đang chập chững bước vào thế giới lập trình nên chúng tôi sẽ chưa giới thiệu ngay với bạn các cách lập trình khác nhau, tuy nhiên bạn có thể biết một trong số đó là lập trình hướng đối tượng. Đây là cách lập trình  giúp làm đơn giản hóa cơ cấu code trong các chương trình của chúng ta và giúp một số đoạn code có thể được tái sử dụng một cách dễ dàng.  Toàn bộ phần II của giáo trình sẽ được dành để nói về lập trình hướng đối tượng.

Cần phải nhấn mạnh với bạn C++ không phải là ngôn ngữ duy nhất đáng để học. Bản thân nó cũng có các nhược điểm so với nhiều ngôn ngữ khác, điển hình là sự phức tạp của nó. Với C++ bạn có rất nhiều quyền kiểm soát đối với hoạt động của máy tính (và việc quản lí bộ nhớ) : đây là một điểm mạnh nhưng nếu bạn sử dụng nó không đúng, bạn sẽ rất dễ dàng làm « treo » chương trình. Chúng ta sẽ dần dần tìm hiểu tất cả các vấn đề này xuyên suốt giáo trình.

Làm quen với C++

Dưới đây là một chương trình đơn giản để bạn dễ dàng hình dung về C++ : Chương trình hiển thị dòng « Hello world ! » ra màn hình (chương trình kinh điển để bắt đầu học lập trình). Đây sẽ là một trong những mă nguồn (code) đầu tiên mà chúng ta sẽ tìm hiểu trong chương tiếp theo.

#include 
using namespace std;
int main(){
    cout << "Hello world!" << endl;
    return 0;
}
Một chút về lịch sử của C++

Lịch sử lập trình đã trải qua một quăng thời gian rất dài trước khi C++ ra đời. Ở thời kì đầu, bàn phím thậm chí còn chưa tồn tại, người ta đă sử dụng những tấm card như hình bên dưới để đưa ra các lệnh cho máy tính. Công việc này đòi hỏi thời gian và sự tỉ mỉ rất cao.

Algol

Với sự phát triển của tin học, bàn phím và các ngôn ngữ lập trình đầu tiên cũng ra đời :

1958 : Rất lâu trước đây, thời mà máy tính nặng hàng tấn và có kích thước bằng cả tòa nhà của bạn, con người đã bắt đầu phát minh ra một ngôn ngữ có tên là Algol.

1960-1970 : công nghệ phát triển, người ta tạo ra một ngôn ngữ mới có tên là CPL, sau đó phát triển thành BCPL, rồi được đổi tên thành ngôn ngữ B (bạn không cần phải ghi nhớ tất cả những thứ này :) ).

1970 : Vào một ngày đẹp trời, người ta tạo ra một ngôn ngữ lập trình mang tên C. Ngôn ngữ này, sau khi có một số thay đổi, vẫn là một trong những ngôn ngữ được sử dụng nhiều nhất bây giờ (theo langpop.com).

1983 : Một thời gian sau, người ta nghĩ đến việc thêm vào C những yếu tố mới để làm nó phát triển hơn. Một ngôn ngữ mới ra đời dưới cái tên C++ và được hình thành hoàn toàn trên nền ngôn ngữ C. C++ thực chất là C với nhiều yếu tố mới. Các yếu tố mới này gồm có khái niệm lập trình tiên tiến như lập trình hướng đối tượng, đa hình (polymorphism), flux,… Tóm lại, đó là những yếu tố có vẻ khá phức tạp với bạn vào thời điểm này nhưng chúng ta sẽ có cơ hội quay trở lại nghiên cứu chúng vào phần sau của giáo trình.

Chờ một chút,… nếu như C++ là một bước cải tiến của C thì tại sao ngày nay vẫn còn rất nhiều người lập trình bằng C ?

Vì không phải ai cũng cần đến những bước cải tiến của C++. Bản thân ngôn ngữ C cũng đủ mạnh để làm nền tảng cho các hệ điều hành như Linux, Mac OS X và Windows.

Những người không cần đến các cải tiến (cũng như sự phức tạp) của C++ tiếp tục lập trình bằng C bất chấp tuổi đời của ngôn ngữ này. Nói một cách khác, một ngôn ngữ có thể đă già nhưng vẫn phù hợp với thời đại.

Cha đẻ của C++

Bjarne Stroustrup, một kĩ sư tin học người Đan Mạch, đă xây dựng C++. Không hài lòng với những gì C có thể làm được, ông đã tạo ra, vào năm 1983, ngôn ngữ C++ bằng việc thêm vào C các tính năng mà theo ông C vẫn còn thiếu.

Bjarne Stroustrup hiện đang giảng dạy về tin học tại đại học Texas A&M ở Mỹ. Ông là một hiện tượng lớn của thế giới tin học mà bạn cần phải nhớ (ít nhất là tên ông).

Rất nhiều ngôn ngữ khác được xây dựng lấy ý tưởng từ C++, ví dụ như Java.

C++, mặc dù đã tồn tại trong một thời gian tương đối dài, vẫn đang tiếp tục được cải tiến và hoàn thiện. Một phiên bản mới, có tên gọi C++1x, đang trong gian đoạn xây dựng và phát triển. Nó không phải một ngôn ngữ mới mà là một phiên bản nâng cấp của C++. Những đổi mới mà nó mang lại dường như quá phức tạp với chúng ta nên chúng ta sẽ không nói đến nó trong giáo trình này.

Tóm tắt bài hoc :
  • Các chương trình cho phép thực hiện các hoạt động khác nhau trên máy tính của bạn : duyệt web, soạn thảo văn bản, thao tác với các tệp,…
  • Để thực hiện chương trình, chúng ta viết các câu lệnh cho máy tính thông qua một ngôn ngữ lập trình. Nó được gọi là mă nguồn (code source).
  • Code cần phải được dịch sang hệ nhị phân nhờ vào một công cụ gọi là trình biên dịch (Compiler) để máy tính có thể chạy được chương trình. (Máy tính chỉ có thể hiểu được ngôn ngữ nhị phân.)
  • C++ là một ngôn ngữ lập trình rất phổ biến và rất nhanh. Nó là một sự cải tiến của C vì nó mang đến khái niệm lập trình hướng đối tượng, một phương thức lập trình đầy sức mạnh (sẽ được giải thích trong giáo trình).