Tôi đang xem xét việc học C
Không có lý do cụ thể để không học C nhưng tôi sẽ đề xuất C ++. Nó cung cấp phần lớn những gì C làm (vì C ++ là một bộ siêu C), với một lượng lớn "bổ sung". Học C trước C ++ là không cần thiết - chúng là những ngôn ngữ riêng biệt hiệu quả.
Nói cách khác, nếu C là một bộ công cụ chế biến gỗ, thì đó có thể là:
- cây búa
- móng tay
- cưa tay
- khoan tay
- khối sander
- đục (có thể)
Bạn có thể xây dựng bất cứ thứ gì với những công cụ này - nhưng bất cứ điều gì tốt đẹp có khả năng đòi hỏi nhiều thời gian và kỹ năng.
C ++ là tập hợp các công cụ điện tại cửa hàng phần cứng địa phương của bạn.
Nếu bạn gắn bó với các tính năng ngôn ngữ cơ bản để bắt đầu, C ++ có đường cong học tập bổ sung tương đối ít.
Nhưng tại sao mọi người sử dụng C (hoặc C ++) nếu nó có thể được sử dụng 'nguy hiểm'?
Bởi vì một số người không muốn đồ nội thất từ IKEA. =)
Nghiêm túc mà nói, mặc dù nhiều ngôn ngữ "cao hơn" C hoặc C ++ có thể có những thứ khiến chúng (có khả năng) "dễ sử dụng" hơn trong một số khía cạnh nhất định, nhưng điều này không phải lúc nào cũng tốt. Nếu bạn không thích cách làm một cái gì đó hoặc một tính năng không được cung cấp, có thể bạn sẽ không thể làm được gì nhiều về nó. Mặt khác, C và C ++ cung cấp đủ các tính năng ngôn ngữ "cấp thấp" (bao gồm cả con trỏ) để bạn có thể truy cập nhiều thứ khá trực tiếp (đặc biệt là phần cứng hoặc hệ điều hành) hoặc tự xây dựng nó, điều này có thể không thể thực hiện được ngôn ngữ như được thực hiện.
Cụ thể hơn, C có bộ tính năng sau đây khiến nhiều lập trình viên mong muốn:
- Tốc độ - Do tính đơn giản tương đối và tối ưu hóa trình biên dịch qua nhiều năm, nên nó thực sự rất nhanh. Ngoài ra, rất nhiều người đã tìm ra rất nhiều phím tắt cho các mục tiêu cụ thể khi sử dụng ngôn ngữ, điều này khiến nó có khả năng nhanh hơn nữa.
- Kích thước - Vì những lý do tương tự như tốc độ được liệt kê cho tốc độ, các chương trình C có thể được thực hiện rất nhỏ (cả về kích thước thực thi và mức sử dụng bộ nhớ), điều này mong muốn đối với các môi trường có bộ nhớ hạn chế (ví dụ như nhúng hoặc di động).
Khả năng tương thích - C đã xuất hiện từ lâu và mọi người đều có công cụ và thư viện cho nó. Bản thân ngôn ngữ cũng không kén chọn - nó hy vọng bộ xử lý sẽ thực thi các lệnh và bộ nhớ để chứa nội dung và đó là về nó.
Hơn nữa, có một cái gì đó được gọi là Giao diện nhị phân ứng dụng (ABI) . Nói tóm lại, đây là một cách để các chương trình giao tiếp ở cấp mã máy, có thể có lợi thế so với Giao diện lập trình ứng dụng (API) . Mặc dù các ngôn ngữ khác như C ++ có thể có ABI, thông thường những ngôn ngữ này ít đồng nhất (đã thỏa thuận) hơn C, vì vậy C tạo ra ngôn ngữ nền tảng tốt khi bạn muốn sử dụng ABI để giao tiếp với một chương trình khác vì một số lý do.
Tại sao các lập trình viên không chỉ sử dụng Java hoặc Python hoặc ngôn ngữ được biên dịch khác như Visual Basic?
Hiệu quả (và đôi khi các chương trình quản lý bộ nhớ không thể thực hiện được nếu không truy cập tương đối trực tiếp vào bộ nhớ).
Truy cập trực tiếp vào bộ nhớ bằng các con trỏ giới thiệu rất nhiều thủ thuật gọn gàng (thường là nhanh chóng) khi bạn có thể đặt bàn chân mập mạp của mình lên các khối nhỏ và số không trong khối lập phương bộ nhớ của bạn và không phải đợi giáo viên ol 'chỉ đưa ra đồ chơi tại thời gian chơi sau đó múc chúng lên một lần nữa.
Nói tóm lại, việc thêm các công cụ có khả năng tạo ra độ trễ hoặc giới thiệu sự phức tạp không mong muốn.
Về ngôn ngữ kịch bản và ilk đó, bạn phải nỗ lực để có được các ngôn ngữ yêu cầu các chương trình thứ cấp chạy hiệu quả như C (hoặc bất kỳ ngôn ngữ được biên dịch nào) thực sự. Việc thêm một trình thông dịch nhanh chóng vốn đã giới thiệu khả năng giảm tốc độ thực thi và tăng mức sử dụng bộ nhớ vì bạn đang thêm một chương trình khác vào hỗn hợp. Hiệu quả chương trình của bạn phụ thuộc nhiều vào hiệu quả của chương trình thứ cấp này cũng như mức độ (kém =)) bạn đã viết mã chương trình ban đầu của mình. Chưa kể chương trình của bạn thường hoàn toàn phụ thuộc vào chương trình thứ hai để thậm chí thực thi. Chương trình thứ hai đó không tồn tại vì một số lý do trên một hệ thống cụ thể? Mã không đi.
Trong thực tế, việc giới thiệu bất cứ thứ gì "thêm" có khả năng làm chậm hoặc làm phức tạp mã của bạn. Trong các ngôn ngữ "không có con trỏ đáng sợ", bạn luôn chờ đợi các đoạn mã khác dọn dẹp phía sau bạn hoặc tìm ra cách "an toàn" để thực hiện - bởi vì chương trình của bạn vẫn đang thực hiện các hoạt động truy cập bộ nhớ giống như có thể được thực hiện với con trỏ. Bạn không phải là người xử lý nó (vì vậy bạn không thể f * ck nó lên, thiên tài = P).
Nguy hiểm, ý tôi là với con trỏ và những thứ tương tự khác. [...] Giống như câu hỏi Stack Overflow Tại sao hàm get lại nguy hiểm đến mức không nên sử dụng?
Theo câu trả lời được chấp nhận:
"Nó vẫn là một phần chính thức của ngôn ngữ theo tiêu chuẩn ISO C năm 1999, nhưng nó đã bị xóa chính thức bởi tiêu chuẩn năm 2011. Hầu hết các triển khai C vẫn hỗ trợ nó, nhưng ít nhất gcc đưa ra cảnh báo cho bất kỳ mã nào sử dụng nó."
Quan niệm rằng bởi vì một cái gì đó có thể được thực hiện bằng một ngôn ngữ, nó phải được thực hiện là ngớ ngẩn. Ngôn ngữ có sai sót được sửa chữa. Vì lý do tương thích với mã cũ hơn, cấu trúc này vẫn có thể được sử dụng. Nhưng không có gì (có khả năng) buộc một lập trình viên sử dụng get () và trên thực tế, lệnh này về cơ bản được thay thế bằng các lựa chọn thay thế an toàn hơn.
Hơn nữa, vấn đề với got () không phải là vấn đề con trỏ mỗi se. Đó là một vấn đề với một lệnh không nhất thiết phải biết cách sử dụng bộ nhớ một cách an toàn. Theo một nghĩa trừu tượng, đây là tất cả các vấn đề về con trỏ - đọc và viết những thứ bạn không cần phải làm. Đó không phải là vấn đề với con trỏ; đó là một vấn đề với việc thực hiện con trỏ.
Để làm rõ, con trỏ không nguy hiểm cho đến khi bạn vô tình truy cập vào một vị trí bộ nhớ mà bạn không có ý định. Và thậm chí sau đó không đảm bảo máy tính của bạn sẽ tan chảy hoặc phát nổ. Trong hầu hết các trường hợp, chương trình của bạn sẽ ngừng hoạt động (chính xác).
Điều đó nói rằng, bởi vì các con trỏ cung cấp quyền truy cập vào các vị trí bộ nhớ và vì dữ liệu và mã thực thi tồn tại trong bộ nhớ cùng nhau, có đủ nguy cơ thực sự của tham nhũng vô tình mà bạn muốn quản lý bộ nhớ chính xác.
Đến thời điểm đó, bởi vì các hoạt động truy cập bộ nhớ trực tiếp thực sự thường mang lại ít lợi ích nói chung hơn so với những năm trước đây, ngay cả các ngôn ngữ được thu thập rác như C ++ đã giới thiệu những thứ như con trỏ thông minh để giúp thu hẹp khoảng cách giữa hiệu quả và an toàn bộ nhớ.
Tóm lại, có rất ít lý do để sợ con trỏ miễn là nó được sử dụng an toàn. Chỉ cần lấy một gợi ý từ phiên bản Steve "The Hunter Hunter" của South Park - đừng đi xung quanh dính ngón tay cái của bạn vào lỗ hổng của crocs .