2009-03-28 65 views
29

Như tôi đã đăng trước đó here Tôi quyết định thử một trong những điều này nhưng được ưu tiên là nhà phát triển web, tôi muốn để biết sự khác biệt giữa chúng trong các ứng dụng trong thế giới thực của chúng.Sự khác nhau giữa C, C# và C++ về ứng dụng trong thế giới thực

Chỉnh sửa Lưu ý:

Trong khi tôi là một nhà phát triển web, xin đừng để giới hạn đó câu trả lời của bạn. Tôi 30 tuổi ... Tôi đã có nhiều năm thay đổi nghề nghiệp trước tôi.

+1

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? –

+1

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 –

Trả lời

48

Cả C và C++ cung cấp cho bạn mức trừu tượng thấp hơn, với độ phức tạp tăng lên, cung cấp độ rộng truy cập vào chức năng cơ bản của máy không nhất thiết phải tiếp xúc với các ngôn ngữ khác. C++ bổ sung sự tiện lợi (thời gian phát triển giảm) của một ngôn ngữ hướng đối tượng đầy đủ, có thể, có khả năng, thêm một chi phí hiệu năng bổ sung. Trong điều kiện của các ứng dụng thế giới thực, tôi thấy các thứ tiếng áp dụng trong các lĩnh vực sau:

C

  • Kernel cấp phần mềm.
  • Trình điều khiển thiết bị phần cứng
  • Các ứng dụng truy cập vào mã cũ, ổn định là bắt buộc.

C, C++

  • ứng dụng hoặc phát triển Server, nơi quản lý bộ nhớ cần phải được điều chỉnh tốt (và không thể bị bỏ lại với các giải pháp thu gom rác thải chung).
  • Môi trường phát triển yêu cầu quyền truy cập vào các thư viện không giao tiếp tốt với nhiều ngôn ngữ được quản lý hiện đại hơn.
  • Mặc dù quản lý C++ có thể được sử dụng để truy cập vào khuôn khổ .NET, nó không phải là một quá trình chuyển đổi liền mạch.

C# cung cấp mô hình bộ nhớ được quản lý bổ sung thêm mức trừu tượng cao hơn nữa. Mức trừu tượng này làm tăng thêm sự tiện lợi và cải thiện thời gian phát triển, nhưng làm phức tạp truy cập vào các API cấp thấp hơn và làm cho các yêu cầu hiệu năng chuyên biệt có vấn đề.

Chắc chắn có thể triển khai phần mềm hiệu suất cực cao trong môi trường bộ nhớ được quản lý, nhưng nhận thức về các tác động là điều cần thiết.

Cú pháp của C# chắc chắn ít đòi hỏi hơn (và dễ bị lỗi) hơn C/C++ và đối với người lập trình khởi xướng, đường cong học tập nông hơn.

C#

  • phát triển ứng dụng client nhanh.
  • Phát triển máy chủ hiệu suất cao (StackOverflow chẳng hạn) có lợi từ khung công tác .NET.
  • Ứng dụng yêu cầu các lợi ích của khung công tác .NET bằng ngôn ngữ được thiết kế cho.

Johannes Rössel làm cho điểm hợp lệ mà việc sử dụng các từ khóa C# con trỏ, không an toàn và không được kiểm soát sẽ phá vỡ lớp trừu tượng mà C# được tạo. Tôi sẽ nhấn mạnh rằng loại lập trình là ngoại lệ đối với hầu hết các kịch bản phát triển C# và không phải là một phần cơ bản của ngôn ngữ (như trường hợp với C/C++).

+0

Bạn vẫn có quyền kiểm soát khá tốt đối với những thứ cấp thấp hơn trong C# với các từ khóa như không an toàn và không được kiểm soát; bạn thậm chí có thể sử dụng con trỏ nếu bạn không thể thoát khỏi thế giới C :) – Joey

+0

Tôi đoán điểm của tôi là trừu tượng mức độ thấp hơn là một phần của ngôn ngữ với C. Con trỏ, Không an toàn và Không được kiểm tra đang bẻ khóa cấp cao hơn của C# trừu tượng. – RedBlueThing

1

Đối với tốc độ thô, sử dụng C. Để cấp nguồn, hãy sử dụng C++. Để tương thích .net, hãy sử dụng C#. Tất cả chúng đều khá phức tạp như ngôn ngữ; C qua nhiều thập kỷ dần dần bồi đắp, C++ qua nhiều năm tăng cường nhanh hơn, và C# thông qua sức mạnh của Microsoft.

+0

Eh, có rất nhiều trường hợp C++ nhanh hơn C (std :: sort vs qsort là một ví dụ rõ ràng). Khi http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx hiển thị, C# thường hoạt động tốt. Phải mất rất nhiều công việc để có được C/C++ để thực hiện tốt hơn so với đồng bằng C# mã. – jalf

+0

Điểm duy nhất cho C# bạn đưa ra là cho "khả năng tương thích."? Thôi nào. – mmcdole

+0

@ jalf: sry, nhưng bình luận của bạn giống như so sánh táo, cam và khoai tây. C và C++ có cùng tốc độ (ngoại trừ các mã/thư viện khác nhau), trong khi C# có thể không bao giờ nhanh như trước đây. –

2

Từ các bài đăng khác của bạn, tôi đoán bạn muốn học một ngôn ngữ mới để có kỹ năng mới. Lời khuyên của tôi là ngôn ngữ không thực sự quan trọng, điều quan trọng là chất lượng của cộng đồng của nó (lời khuyên, nhưng cũng là mã hiện tại bạn có thể đọc và học hỏi) và các thư viện/khung công tác có sẵn. Về khía cạnh này, tôi nghĩ rằng "gia đình C" không phải là lựa chọn tốt nhất cho bạn: thư viện web và khung công tác ít, không di động và không tuyệt vời, và mã hóa kiểu mã bạn có thể nghiên cứu thay đổi rất nhiều và có thể làm bạn bối rối. (Mặc dù C là ngôn ngữ yêu thích của tôi)

Tôi khuyên bạn chỉ nên học C và cố gắng hiểu khái niệm về con trỏ, sau đó chuyển sang các ngôn ngữ khác thích nghi hơn với web (python hoặc javascript đến tâm trí - hoặc thậm chí java). Ngoài ra, trong gia đình C, Objective-C có sự pha trộn tốt nhất về sức mạnh và sự đơn giản theo ý kiến ​​của tôi, nhưng là một người chơi thích hợp.

9

C là ngôn ngữ trống, đơn giản, sạch sẽ giúp bạn tự làm mọi thứ. Nó không giữ bàn tay của bạn, nó không ngăn bạn bắn mình vào chân. Nhưng nó có mọi thứ bạn cần để làm những gì bạn muốn.

C++ là C với các lớp được thêm vào và sau đó là toàn bộ các thứ khác, sau đó thêm một số nội dung khác. Nó không nắm tay bạn, nhưng nó sẽ cho phép bạn nắm tay bạn, với GC bổ sung, hoặc RAII và các con trỏ thông minh. Nếu có điều gì đó bạn muốn hoàn thành, rất có thể có một cách để lạm dụng hệ thống khuôn mẫu để cung cấp cho bạn một cú pháp tương đối dễ dàng cho nó. (moreso với C++ 0x). Sự phức tạp này cũng mang lại cho bạn sức mạnh vô tình tạo ra hàng tá bản thân và bắn tất cả chúng vào chân.

C# là lỗi của Microsoft khi cải tiến trên C++ và Java. Tấn các tính năng cú pháp, nhưng không có nơi gần độ phức tạp của C++. Nó chạy trong một môi trường được quản lý đầy đủ, do đó quản lý bộ nhớ được thực hiện cho bạn. Nó cho phép bạn "bị bẩn" và sử dụng mã không an toàn nếu bạn cần, nhưng nó không phải là mặc định, và bạn phải làm một số công việc để bắn chính mình.

+0

Bạn có thể làm rõ "nhưng không có nơi gần sự phức tạp của C + +"? Thật khó để biết nếu, bởi những gì bạn đã viết, đó là tốt hay xấu. Tôi tin rằng tôi biết những gì bạn đang nhận được, nhưng nó không rõ ràng. –

+2

Nó không tốt hay xấu theo ý kiến ​​của tôi, C# dễ học và không có các góc tối của C++, nhưng có một lý do đằng sau mỗi bit phức tạp trong C++. – Eclipse

4

Ý kiến ​​của tôi là C# và ASP.NET sẽ là tốt nhất trong số ba phát triển có xu hướng web.

Tôi nghi ngờ có ai đó viết các ứng dụng web mới trong C hoặc C++ nữa. Nó đã được thực hiện cách đây 10 năm và có rất nhiều mã di sản vẫn được sử dụng, nhưng chúng không đặc biệt phù hợp, dường như không có nhiều công cụ hỗ trợ, và chúng có thể hoạt động nhỏ cộng đồng phát triển web (ngoại trừ có lẽ để phát triển máy chủ web). Tôi đã viết nhiều trang web C + + COM đối tượng trở lại trong ngày, nhưng C# là hiệu quả hơn nhiều mà không có lý do thuyết phục để mã C hoặc C + + (trong bối cảnh này), trừ khi bạn cần.

Tôi vẫn viết C++ nếu cần, nhưng thường là đối với miền có vấn đề nhỏ. ví dụ. giao tiếp từ C# thông qua P/Gọi đến dll C-style cũ - làm một số điều mà là hết sức vụng về trong C# là một khoe để tạo ra một đối tượng C++ COM như một cây cầu.

Điều tuyệt vời với C# là bạn cũng có thể dễ dàng chuyển sang viết các ứng dụng Windows và Console và giữ nguyên C#. Với Mono bạn cũng không bị giới hạn trong Windows (mặc dù bạn có thể bị giới hạn đối với thư viện nào bạn sử dụng).

Dù sao, tất cả đều từ góc độ thiên vị theo web. Nếu bạn hỏi về các thiết bị nhúng tôi muốn nói C hoặc C++.Bạn có thể tranh luận không cái nào phù hợp cho phát triển web, nhưng C#/ASP.NET khá mượt mà, nó hoạt động tốt, có nhiều tài nguyên trực tuyến, cộng đồng lớn và các công cụ miễn phí. Vì vậy, từ góc độ thế giới thực, chỉ chọn một trong C#, C++ và C theo yêu cầu, như quy tắc chung, bạn nên gắn bó với C#.

52

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 đó.

+3

Downvoters - hãy bình luận! –

+1

Đây là một câu trả lời tuyệt vời, đặc biệt là một phần về hành vi không xác định và vấn đề với các thư viện. Hai điều này gây ra rất nhiều rắc rối trong thế giới C++, nhưng đôi khi người mới bắt đầu xem chúng như một lợi thế và bảo vệ chúng. – compie

+1

(0) C# không phải là nền tảng chéo, quên nó đi. (1) Mono bây giờ là cách để làm cho C# "nền tảng chéo" vì nó là xa phía sau. Net. (2) C# Thiếu một điều quan trọng RAII (và không, sử dụng không thay thế nó). (3) Có một hành vi không xác định lớn không xác định trong C# gọi là GC. (4) Giới thiệu về thư viện ... có đủ bộ công cụ để làm tất cả các công việc bạn muốn ... Nhưng có, có nhiều hơn thì một trong những ... Đó là câu hỏi của choise. – Artyom

1

C - ngôn ngữ lập trình cũ hơn được mô tả là Thực hành. Là lập trình viên, bạn phải yêu cầu chương trình làm mọi thứ. Ngoài ra ngôn ngữ này sẽ cho phép bạn làm hầu hết mọi thứ. Nó không hỗ trợ mã orriented đối tượng. Do đó không có lớp học.

C++ - một ngôn ngữ mở rộng trên mỗi C. Trong mã C++ có nghĩa là gia số 1. Vì vậy, C++ tốt hơn C. Nó cho phép mã đối tượng được kiểm soát cao. Một lần nữa một bàn tay rất nhiều về ngôn ngữ mà đi vào chi tiết MUCH.

C# - Mã đối tượng đầy đủ hoặc tương tự giống với kiểu mã C/C++. Điều này thực sự gần gũi hơn với JAVA. C# là phiên bản mới nhất của ngôn ngữ kiểu C và rất tốt cho việc phát triển các ứng dụng web.

-1

C là ngôn ngữ cốt lõi gần giống nhất và trực tiếp dịch thành mã máy CPU. CPU theo các chỉ dẫn di chuyển, thêm, kết hợp hợp lý, so sánh, nhảy, đẩy và bật. C thực hiện chính xác điều này bằng cú pháp dễ dàng hơn nhiều. Nếu bạn nghiên cứu việc tháo gỡ, bạn có thể học cách viết mã C nhanh và gọn như lắp ráp. Nó là ngôn ngữ ưa thích của tôi trên bộ điều khiển vi 8 bit với bộ nhớ hạn chế. Nếu bạn viết một chương trình PC lớn trong C, bạn sẽ gặp rắc rối vì tổ chức giới hạn của nó. Đó là nơi lập trình hướng đối tượng trở nên mạnh mẽ.Khả năng của các lớp C++ và C# để chứa dữ liệu và các hàm cùng nhau thực thi tổ chức để cho phép khả năng hoạt động phức tạp hơn C. C++ là cần thiết để xử lý nhanh trong quá khứ khi CPU chỉ có một lõi. Tôi bắt đầu học C# ngay bây giờ. Cấu trúc lớp duy nhất của nó xuất hiện để thực thi một mức độ cao hơn của tổ chức hơn C++ mà cuối cùng sẽ dẫn đến phát triển nhanh hơn và thúc đẩy việc chia sẻ mã. C# không được hiểu như VB. Nó được biên dịch một phần vào thời gian phát triển và sau đó được dịch thêm vào thời gian chạy để trở nên thân thiện với nền tảng hơn.

Các vấn đề liên quan