Hiểu Sâu Về Ngôn Ngữ Lập Trình C++

Hiểu Sâu Về Ngôn Ngữ Lập Trình C++

C++ ra đời như thế nào

Ngôn ngữ lập trình C ra đời đầu năm 1970 bởi Dennis Ritchie, được sử dụng trong Unix, lan dần sang các hệ điều hành khác và dần trở nên phổ biến.

Tuy nhiên điểm yếu của C là không có class (hướng đối tượng). Nếu bạn nào học về C từ thời đầu như mình, thì thấy C chỉ có các hàm, các hàm này ko thuộc một đối tượng nào cả, và có một kiểu cấu trúc tương tự như class nhưng chỉ có thuộc tính mà ko có phương thức. Do đó trong nhiều trường hợp rất khó tổ chức và thiết kế chương trình. Các tính chất cơ bản của hướng đối tượng như kế thừa, đa hình tất nhiên cũng ko có. Đây có lẽ là điểm yếu lớn nhất của ngôn ngữ C

Đó là lí do mà năm 1979 ông Bjarne Stroustrup bổ sung thêm lớp và các tính chất hướng đối tượng vào ngôn ngữ C, và gọi là ngôn ngữ C++ (C plus plus, có nghĩa là thêm vào C). Do đó, về cơ bản, C++ và C giống nhau, chỉ khác nhau phần lớn ở đoạn "class". Do đó, nhiều mã nguồn mà chúng ta thấy ngày nay, nó ko hẳn là C++ hay C, nó là hỗn hợp của 2 ngôn ngữ này.

Ví dụ như hàm printf là của ngôn ngữ C, nhưng nếu bạn dùng C++ vẫn call được ngôn ngữ này.

Nếu hiểu về kế thừa, bạn có thể hiểu C là ngôn ngữ cha, và C++ là ngôn ngữ con, kế thừa toàn bộ C và thêm phần class.

1. Chuẩn C++

Thời đầu tiên, các nhà sản xuất phần cứng, phần mềm dùng C++, nhưng lại sửa chữa mỗi người 1 kiểu, nên C++ không có chuẩn chung.

Để dễ hiểu, C++ giống như mã nguồn mở, mọi người đều có quyền thay đổi nó, tạo ra phiên bản cho riêng mình. Việc này dẫn tới sẽ có thể có rất nhiều biến thể, khó kiểm soát và phát triển, nên người ta cần sự thống nhất, chuẩn hoá. Ra đời từ năm 1979, nhưng tới 1998 C++ lần đầu tiên đc chuẩn hoá bởi ISO.

Sau đó tiêu chuẩn C++ thay đổi nhiều lần, nâng cấp dần thành C ++ 03 (2003), C ++ 11 (2011), C ++ 14 (2014), C++17 (2017) và sắp tới là C++ 20 (2020). Mỗi tiêu chuẩn sẽ có thêm 1 số thư viện, từ khoá, cách viết mới, cách biên dịch và xử lý khác nhau. Hiểu cho đơn giản, tiêu chuẩn cũng giống version, mà mỗi version phía sau cải tiến và nâng cấp phiên bản trước rất nhiều

Nhiều bạn hay hỏi tôi, tại sao cùng là mã C++ viết ở đây chạy được, ở chỗ khác thì không? Lí do có thể do khác tiêu chuẩn. Ví dụ bạn copy code ở version C++ 14 thì đố mà chạy được trên C++ 11 (nếu code ở version 14 chứa những từ khoá và cú pháp mới)

Thời tôi học là chuẩn C++ 03, giờ nó lên tới 17 nhiều lúc mình đọc code không hiểu nổi luôn. Nó xuất hiện rất nhiều cú pháp mới. Nếu bạn xem lại C++ từ năm 1998, bạn sẽ thấy nó vô cùng nông dân.

2. Các thư viện C++ nổi tiếng

  • Để phát triển giao diện, không gì ngoài QT
  • Để xử lý và nhận dạng ảnh, openCV rất nổi tiếng
  • Làm game có cocos2dx
  • Xử lý đồ hoạ có openGL (đa phần các game xịn phát triển dựa trên thư viện này)

3. Tầm quan trọng

Trong các bản thống kê về tầm quan trọng và sự phổ biến, C++ vẫn luôn đứng trong top 10. Có thể nói, thời gian gần đây, độ thông dụng và phổ biến của C++ đã giảm. Lí do là các ngôn ngữ khác thông dụng, dễ dùng, dễ tiếp cận hơn nhưng C++ vẫn luôn thu hút.

Bởi những điểm mạnh như dưới đây, nên C++ vẫn đc dùng nhiều ở các sản phẩm/hệ thống lớn, hoặc phát triển module core cho các sản phẩm khác. Các hệ thống trên ô tô hay máy bay vẫn dùng C++ là chủ yếu.

Tất nhiên, với người dùng phổ thông như chúng ta, học và làm 1 ứng dụng bằng C++ thì khá là chậm và khó. Đó là lí do mà chúng ta tưởng rằng C++ ko quá quan trọng.

4. Điểm mạnh và ứng dụng của C++

C++ là ngôn ngữ rất gần với phần cứng bởi lẽ câu lệnh của nó có thể thao tác, giao tiếp trực tiếp với phần cứng, nên C++ nhanh hơn nhiều các ngôn ngữ khác. Một ví dụ mà bạn có thể test thử, đó là cùng chạy 1 vòng for duyệt xâu, hay một số thuật toán cơ bản, sẽ thấy C++ chạy nhanh hơn Java khoảng 1-2 lần và Python từ 3-5 lần.

Lý do bọn Java hay Python chạy chậm hơn C++, là vì mã thực thi của C++ đc biên dịch và gửi thẳng xuống phần cứng. Java và python thì đi qua 1 tầng máy ảo, máy ảo này sẽ thêm các xử lý khác như kiểm tra bộ nhớ, kiểm soát ngoại lệ, ... nên bị chậm hơn.

Đây cũng là lý giải cho việc mình cùng các đồng đội đặt thời gian xử lý của Python gấp 8 lần thời gian xử lí của C++ trên Codelearn

Do tốc độ cao, thao tác trực tiếp vs phần cứng, nên C++ được dùng nhiều để phát triển driver (trình điều khiển phần cứng), hoặc các phần mềm nhúng (phần mềm nhúng vào trong phần cứng). C++ cũng đc sử dụng để phát triển các hệ thống lớn, thuật toán mạnh - nơi yêu cầu tốc độ xử lý tính toán cực nhanh, hoặc ở nơi cơ sở hạ tầng phần mềm và các ứng dụng bị hạn chế tài nguyên. C++ hay được dùng để cài đặt thuật toán, nơi yêu cầu tốc độ cao, và bộ nhớ lớn, ví dụ xử lý ảnh, AI, ...

Điểm yếu của C++ là khó làm được web. Thật ra cố thì cũng được, nhưng chỉ là làm demo thôi. Làm website phức tạp thì C++ ko thể làm đc. Link cho bạn nào cố gắng làm web bằng C++ tại hướng dẫn làm web bằng C++

Mặc dù ra đời các thư viện để hỗ trợ việc làm ứng dụng với C++, nhưng để phát triển 1 ứng dụng dù là mobile hay windows bằng C++ thì khá là chậm. Tuỳ trường hợp muốn hiệu chỉnh và cải thiện tốc độ xử lí, thì ng ta sẽ ít chọn C++ để làm việc này.

5. Điểm khó khi học C++

Học C++ khó nhất phần con trỏ, chưa kể con trỏ tới con trỏ tới con trỏ. Nhưng biết dùng con trỏ là điểm mạnh (thao tác trực tiếp tới bộ nhớ). Bạn dễ dàng tăng, giảm bộ nhớ với tốc độ cực cao, so vs Java hay Python thì hiệu quả hơn vài chục lần
Làm C++ quên ko giải phóng bộ nhớ là tiêu cơm. Tỉ lệ crash của cương trình C++ cũng cao hơn bình thường do C++ ko tự check choác các lỗi như vượt quá index mảng, quên ko cấp phát, ...
Code C++ có cấu trúc chặt chẽ hơn các ngôn ngữ khác ví dụ biến phải khai báo kiểu, chuyển kiểu phải gọi hàm convert, ...
Thư viện hàm chuẩn của C++ không đa dạng như các ngôn ngữ khác. Ví dụ python +2 số lớn hay tìm số nguyên tố trong 1s, nhưng C++ thì không có hàm như vậy.

Vậy Có nên học C++ không?

Chung quy tất cả lại, mình khuyên anh em start bằng C++ sẽ nắm chắc kiến thức cơ bản, hiểu nhiều về phần cứng hơn ngôn ngữ khác

Đây là phần 1 khoá C++ do mình cùng 1 bạn trực tiếp làm (còn thiếu phần 2 dạy về OOP và phần 3 về các thứ phức tạp khác), anh em thử học và cho phản hồi nhé, để mình có động lực ra phần tiếp theo.

Hẹn  gặp lại anh em ở bài viết sau với phần ứng dụng con trỏ trong C++.