Hãy nhớ rằng tôi nói được ASFAC++B. :) Tôi đã đặt yếu tố phân biệt quan trọng đầu tiên.
Garbage Collection
Garbage Collection (GC) là yếu tố quan trọng nhất trong sự khác biệt giữa các ngôn ngữ.
Mặc dù C và C++ có thể được sử dụng với GC, nhưng nó có thể được "bảo thủ" nghĩa là nó không thể thu thập tất cả bộ nhớ không sử dụng.
C# được thiết kế từ đầu để làm việc trên nền tảng GC, với thư viện chuẩn cũng được thiết kế theo cách đó. Nó tạo ra một sự khác biệt cơ bản hoàn toàn cho năng suất của nhà phát triển mà phải có kinh nghiệm để được tin tưởng.
Có một niềm tin phổ biến trong số những người dùng C/C++ mà GC tương đương với "hiệu suất kém". Nhưng đây là văn hóa dân gian lỗi thời (thậm chí cả bộ sưu tập Boehm trên C/C++ hoạt động tốt hơn nhiều so với hầu hết mọi người mong đợi nó). Nỗi sợ điển hình là "tạm dừng dài", nơi chương trình dừng lại để GC có thể thực hiện một số công việc. Nhưng trong thực tế, những tạm dừng dài này xảy ra với các chương trình không phải GC, bởi vì chúng chạy trên hệ thống bộ nhớ ảo, thỉnh thoảng gián đoạn để di chuyển dữ liệu giữa bộ nhớ vật lý và đĩa.
Cũng có niềm tin rộng rãi rằng GC có thể được thay thế bằng shared_ptr, nhưng không thể; sự trớ trêu là trong một chương trình đa luồng, shared_ptr
là chậm hơn một hệ thống dựa trên GC.
Có những môi trường tiết kiệm đến mức GC không thực tế - nhưng chúng ngày càng hiếm. Điện thoại di động thường có GC. CLR của GC mà C# thường chạy trên dường như là nhà nước-of-the-nghệ thuật.
Kể từ khi áp dụng C# khoảng 18 tháng trước, tôi đã trải qua một số giai đoạn điều chỉnh hiệu suất thuần túy với trình thu thập thông tin và GC hiệu quả đến mức không thể thực hiện được trong quá trình hoạt động của chương trình. GC không phải là thuốc chữa bách bệnh, nó không giải quyết tất cả các vấn đề lập trình, nó chỉ thực sự dọn dẹp cấp phát bộ nhớ, nếu bạn đang phân bổ khối bộ nhớ rất lớn thì bạn vẫn cần phải cẩn thận, và nó vẫn còn có thể có những gì số tiền cho một rò rỉ bộ nhớ trong một chương trình đủ phức tạp - và được nêu ra, hiệu quả của GC về năng suất làm cho nó một xấp xỉ khá gần với một thuốc chữa bách bệnh!
Behavior Không xác định
C++ được xây dựng trên khái niệm về hành vi không xác định. Tức là, đặc tả ngôn ngữ xác định kết quả của một số cách sử dụng các tính năng ngôn ngữ khác nhau và mô tả tất cả các cách sử dụng khác như gây ra hành vi không xác định , có nghĩa là hoạt động có thể có bất kỳ kết quả nào. -diagnose lỗi liên quan đến tham nhũng rõ ràng không xác định dữ liệu).
Hầu như mọi thứ về C++ đều chạm vào hành vi không xác định.Ngay cả các tính năng sắp tới rất đẹp như biểu thức lambda có thể dễ dàng được sử dụng như là cách thuận tiện để tham nhũng ngăn xếp (nắm bắt một địa phương bằng cách tham chiếu, cho phép cá thể lambda để sống lâu hơn).
C# được thành lập theo nguyên tắc rằng tất cả các hoạt động có thể phải có hành vi được xác định. Điều tồi tệ nhất có thể xảy ra là một ngoại lệ được ném ra. Điều này hoàn toàn thay đổi kinh nghiệm xây dựng phần mềm.
(Có chế độ không an toàn, trong đó có con trỏ và hành vi do đó không xác định, nhưng điều đó không được khuyến khích mạnh mẽ để sử dụng chung - nghĩ về nó như tương tự như ngôn ngữ lắp ráp nhúng.)
phức tạp
Về phức tạp, C++ phải được chỉ ra, đặc biệt nếu chúng ta xem xét phiên bản mới được chuẩn hóa rất sớm. C++ thực hiện mọi thứ có thể để làm cho nó có hiệu quả, ngắn gọn khi giả sử GC, và kết quả là nó có một đường cong học tập tuyệt vời. Các nhà thiết kế ngôn ngữ lý giải nhiều điều này bằng cách nói "Những tính năng này chỉ dành cho tác giả thư viện, không phải người dùng thông thường" - nhưng thực sự hiệu quả trong bất kỳ ngôn ngữ nào, bạn cần xây dựng mã của mình làm thư viện có thể tái sử dụng. Vì vậy, bạn không thể trốn thoát.
Về mặt tích cực, C++ rất phức tạp, nó giống như một sân chơi dành cho nerds! Tôi có thể đảm bảo với bạn rằng bạn sẽ có rất nhiều niềm vui học tập như thế nào tất cả phù hợp với nhau. Nhưng tôi không thể nghiêm túc đề nghị nó như là một cơ sở cho công việc mới sản xuất (oh, những năm lãng phí ...) trên các nền tảng chính thống.
C giữ ngôn ngữ đơn giản (đơn giản theo nghĩa "trình biên dịch dễ viết"), nhưng điều này làm cho kỹ thuật mã hóa trở nên phức tạp hơn.
Lưu ý rằng không phải tất cả các tính năng ngôn ngữ mới đều tương đương với độ phức tạp được thêm vào. Một số tính năng ngôn ngữ được mô tả là "đường cú pháp", vì chúng là viết tắt mà trình biên dịch mở rộng cho bạn. Đây là một cách hay để suy nghĩ về rất nhiều cải tiến đối với C# trong những năm gần đây. Tiêu chuẩn ngôn ngữ thậm chí còn chỉ định một số tính năng bằng cách cung cấp bản dịch cho dài, ví dụ: Câu hỏi using
mở rộng thành try
/finally
.
Tại một thời điểm, có thể nghĩ về các mẫu C++ theo cùng một cách. Nhưng họ đã trở nên mạnh mẽ đến nỗi giờ đây họ trở thành cơ sở của một chiều hướng hoàn toàn riêng biệt của ngôn ngữ, với chính nó là enthusiastic user communities and idioms.
Libraries
Điều lạ lùng nhất về C và C++ là họ không có một hình thức hoán đổi cho nhau tiêu chuẩn của thư viện trước khi biên dịch. Việc tích hợp mã của người khác vào dự án của bạn luôn luôn hơi khó sử dụng, với các quyết định tối nghĩa được đưa ra về cách bạn sẽ liên kết với nó.
Ngoài ra, thư viện chuẩn là cực kỳ cơ bản - C++ có bộ cấu trúc dữ liệu hoàn chỉnh và cách biểu diễn chuỗi (std::string
), nhưng vẫn còn tối thiểu. Có cách nào tiêu chuẩn để tìm danh sách tệp trong thư mục không? Thật ngạc nhiên, không! Có hỗ trợ thư viện chuẩn để phân tích cú pháp hoặc tạo XML không? Không. Điều gì về việc truy cập cơ sở dữ liệu? Nghiêm trọng! Viết một trang web back-end? Bạn điên à? v.v.
Vì vậy, bạn phải đi săn xa hơn. Đối với XML, hãy thử Xerces. Nhưng nó có sử dụng std::string
để đại diện cho chuỗi không? Tất nhiên là không!
Và tất cả các thư viện bên thứ ba này có phong tục kỳ lạ của riêng họ để đặt tên lớp và chức năng không? Bạn betcha!
Tình huống trong C# không thể khác nhau nhiều hơn; các nguyên tắc cơ bản được đặt ra ngay từ đầu, vì vậy mọi thứ hoạt động tốt đẹp (và vì các nguyên tắc cơ bản do CLR cung cấp, có hỗ trợ đa ngôn ngữ).
Nó không hoàn hảo; Generics nên có được tại chỗ từ đầu nhưng không, mà không để lại một vết sẹo có thể nhìn thấy trên một số thư viện cũ; nhưng nó thường là tầm thường để sửa lỗi này bên ngoài. Ngoài ra một số thư viện phổ biến được chuyển từ Java, mà không phải là tốt phù hợp như nó lần đầu tiên xuất hiện.
đóng cửa (Anonymous Các phương pháp với tính năng Chụp Biến địa phương)
Java và C là thực tế các ngôn ngữ chủ đạo còn lại cuối cùng thiếu đóng cửa, và các thư viện có thể được thiết kế và sử dụng nhiều hơn nữa gọn gàng với họ hơn mà không (đây là một trong những lý do tại sao các thư viện Java được chuyển đôi khi có vẻ khó khăn với người dùng C#).
Điều thú vị về C++ là thư viện chuẩn của nó được thiết kế như thể đóng cửa có sẵn trong ngôn ngữ (loại vùng chứa, <algorithm>
, <functional>
). Sau đó mười năm trôi qua, và bây giờ họ cuối cùng đã được thêm vào! Họ sẽ có một tác động rất lớn (mặc dù, như đã nói ở trên, họ bị rò rỉ hành vi underfined).
C# và JavaScript là ngôn ngữ được sử dụng rộng rãi nhất trong đó các bao đóng được "thiết lập thành ngữ". (Sự khác biệt chính giữa các ngôn ngữ đó là C# được gõ tĩnh trong khi JavaScript được gõ động).
hỗ trợ nền tảng
Tôi đã đặt cuối cùng này chỉ vì nó không xuất hiện để phân biệt các thứ tiếng càng nhiều như bạn nghĩ. Tất cả các ngôn ngữ này có thể chạy trên nhiều hệ điều hành và kiến trúc máy. C được hỗ trợ rộng rãi nhất, sau đó C++ và cuối cùng là C# (mặc dù C# có thể được sử dụng trên hầu hết các nền tảng chính nhờ vào việc triển khai mã nguồn mở được gọi là Mono).
Trải nghiệm của tôi về việc chuyển các chương trình C++ giữa Windows và các hương vị Unix khác nhau thật khó chịu. Tôi đã không bao giờ cố gắng porting bất cứ điều gì rất phức tạp trong C# để Mono, vì vậy tôi không thể bình luận về điều đó.
Bạn có thể làm rõ liệu bạn có quan tâm đến so sánh từ góc độ ứng dụng web không? –
Bạn có muốn tiếp tục là một nhà phát triển web hay bạn đang tìm cách làm điều gì đó khác biệt? ví dụ. Ngôn ngữ lập trình ứng dụng iPhone chủ yếu dựa trên Objective-C –