Có bất kỳ lý do để sử dụng C ++ thay vì C, Perl, Python, v.v.? [đóng cửa]


164

Là nhà phát triển Linux (phía máy chủ), tôi không biết nên sử dụng C ++ ở đâu và tại sao.

Khi tôi đi biểu diễn, lựa chọn đầu tiên và cuối cùng là C.

Khi "hiệu suất" không phải là vấn đề chính, các ngôn ngữ lập trình như Perl và Python sẽ là lựa chọn tốt.

Hầu như tất cả các ứng dụng nguồn mở mà tôi biết trong lĩnh vực này đã được viết bằng C, Perl, Python, Bash script, AWK hoặc thậm chí PHP, nhưng không ai sử dụng C ++.

Tôi không thảo luận về các lĩnh vực khác như GUI hoặc ứng dụng web, tôi chỉ nói về Linux, CLI và trình nền.

Có bất kỳ lý do thỏa đáng để sử dụng C ++?


5
Tôi chỉ xem xét C ++ vì STL.
dan_waterworth

46
Vì vậy, một cái gì đó có thể được thực hiện bằng C, perl và python với nhau chỉ có thể được thực hiện bằng C ++. Và bạn đang hỏi tại sao nên sử dụng C ++?
Manoj R

36
«Khi tôi đi biểu diễn, lựa chọn đầu tiên và cuối cùng là C.» vâng chắc chắn: D Đây là một khẳng định sai lầm và tầm thường.
deadalnix

16
@deadalnix: Tôi sẽ không nói như vậy. C ++ có các quy tắc phức tạp có thể gây tác dụng ngược với trình tối ưu hóa, vì nó không được phép thực hiện một số điều. Và thật dễ dàng để bước vào những kẻ giết người hiệu suất vô hình. Nó khá nhiều tiên đề và do đó đúng: D Trong thực tế, mã C ++ đôi khi sẽ nhanh hơn vì bạn sẽ sử dụng các thuật toán và cấu trúc dữ liệu hiệu quả hơn và dù sao cũng không thực sự tối ưu hóa mã C. Vì vậy, khi được thực hiện chính xác, C ++ an toàn và hiệu quả hơn C, và bạn nên chọn C ++ hơn C khi không có vấn đề tương thích hoặc yêu cầu phần mềm khả dụng 100%.
Coder

4
Lý do tốt nhất, không được xem xét trong các câu trả lời được đăng, liên quan trực tiếp đến câu hỏi của OP. PHỤ LỤC !!!!, Không phải hệ thống trung bình của bạn thiếu các lib c ++, nhưng một hệ thống nhúng có thể không có sẵn chúng. Cách duy nhất để có được chương trình của bạn trong mọi hệ thống, là viết chương trình của bạn thường xuyên C. Mọi thứ khác chỉ là tranh luận tại sao bạn nên, hoặc ít đại diện hơn, không nên sử dụng C ++. Không ai trong số đó giải quyết lý do tại sao C ++ không được sử dụng thường xuyên hơn, và bất kể giá trị, lý do là sự phụ thuộc .... O và cũng là câu nói nổi tiếng về c ++ nổi tiếng của Linus.
JM Becker

Câu trả lời:


308

Khi tôi đi biểu diễn, lựa chọn đầu tiên và cuối cùng là C.

Và đó là nơi bạn nên sao lưu. Bây giờ, tôi không thể, tất cả , nói để phát triển máy chủ. Có lẽ thực sự không có lý do thuyết phục nào để thích C ++ hơn các lựa chọn thay thế.

Nhưng nói chung, lý do để sử dụng C ++ hơn là các ngôn ngữ khác thực sự là hiệu suất. Lý do cho điều đó là C ++ cung cấp một phương tiện trừu tượng, không giống như tất cả các ngôn ngữ khác mà tôi biết, không có chi phí hoạt động khi chạy.

Điều này cho phép viết mã rất hiệu quả mà vẫn có mức độ trừu tượng rất cao.

Hãy xem xét các khái niệm trừu tượng thông thường: hàm ảo, con trỏ hàm và thành ngữ PIMPL. Tất cả những điều này dựa trên sự gián tiếp trong thời gian chạy được giải quyết bằng số học con trỏ. Nói cách khác, nó phải chịu một chi phí hiệu suất (tuy nhiên có thể nhỏ).

C ++, mặt khác, cung cấp một cơ chế xác định không phát sinh chi phí (hiệu suất): các mẫu. (Lợi thế này được trả tiền với thời gian biên dịch tăng (đôi khi rất nhiều).)

Hãy xem xét ví dụ về một hàm sắp xếp chung.

Trong C, hàm qsortlấy một con trỏ hàm thực hiện logic theo đó các phần tử được sắp xếp tương đối với nhau. Arrays.sortHàm của Java có nhiều biến thể; một trong số chúng sắp xếp các đối tượng tùy ý và yêu cầu một Comparatorđối tượng được truyền cho nó hoạt động giống như con trỏ hàm trong C's qsort. Nhưng có một số tình trạng quá tải nữa đối với các kiểu Java bản gốc của Java. Và mỗi người trong số họ có một bản sao riêng của sortphương thức - một bản sao mã khủng khiếp.

Java minh họa một sự phân đôi chung ở đây: hoặc bạn có sự sao chép mã hoặc bạn phải chịu một chi phí thời gian chạy.

Trong C ++, sorthàm hoạt động giống như qsorttrong C, với một điểm khác biệt nhỏ nhưng cơ bản: bộ so sánh được truyền vào hàm là một tham số mẫu . Điều đó có nghĩa là cuộc gọi của nó có thể được nội tuyến . Không có sự gián tiếp là cần thiết để so sánh hai đối tượng. Trong một vòng lặp chặt chẽ (như trường hợp ở đây) điều này thực sự có thể tạo ra một sự khác biệt đáng kể.

Không có gì đáng ngạc nhiên, hàm C ++ sortvượt trội hơn C sortngay cả khi thuật toán cơ bản giống nhau. Điều này đặc biệt đáng chú ý khi logic so sánh thực tế là giá rẻ.

Bây giờ, tôi không nói rằng C ++ là một tiên nghiệm hiệu quả hơn C (hoặc các ngôn ngữ khác), cũng không phải là một tiên nghiệm cung cấp một sự trừu tượng cao hơn. Những gì nó cung cấp là một sự trừu tượng rất cao và cực kỳ rẻ cùng một lúc để bạn thường không cần phải chọn giữa mã hiệu quả và có thể sử dụng lại.


16
Bây giờ tôi biết đủ về C ++ để biết bạn đang phát hiện ra hay sai. Nhưng cũng muốn thêm bạn chỉ nhận được 1 downvote nên thư giãn. Đây là internet và downvote xảy ra. Câu trả lời tuyệt vời nếu âm thanh kỹ thuật của nó!
Chris

46
không có chi phí hoạt động khi chạy - điều đó không phải lúc nào cũng đúng. Nếu bạn nhìn vào các triển khai vectơ STL, bạn sẽ thấy rằng họ không tận dụng lợi thế của việc sử dụng realloc () (họ không thể vì con trỏ, câu chuyện dài) trong khi tất cả các ngôn ngữ cấp cao hơn mà tôi biết đều có thể và sử dụng realloc ( ) trong vector impl. Đây chỉ là một ví dụ mà nó không rõ ràng và toàn màu đen trắng.
mojuba

19
@Jaroslaw, @Steve: nhưng tương tự (= mã phình, lỗi bộ nhớ cache hướng dẫn) đúng với mã được tối ưu hóa bằng tay được điều chỉnh cho từng loại dữ liệu (xem các Arrays.sorttriển khai khác nhau của Java ). Chỉ có bạn mất đi lợi thế của sự trừu tượng cao. Đây không phải là nhược điểm cụ thể của các mẫu, nói chung là nhược điểm của sao chép mã. Hơn nữa, điều này có xu hướng không quan trọng vì trong các vòng lặp chặt chẽ, nó thường luôn là cùng một mã được tải.
Konrad Rudolph

18
@Jaroslaw: điều thú vị về bộ đệm hướng dẫn là nó là bộ đệm . Đó là, nó không cố lưu trữ mọi thứ , chỉ sử dụng mã gần đây . Các mẫu có thể tạo ra nhiều mã tương tự cho các loại khác nhau (một vector.push_backcho vector<int>và một cho vector<float>, nhưng trong khi làm việc với một vector<int>, có rất ít lý do tại sao vector<float>mã sẽ nằm trong bộ đệm hướng dẫn. Vì vậy, tôi không thấy điều đó thực sự quan trọng. cá nhân mẫu instantiation là tối ưu hóa cao và thường hơn nhỏ gọn hơn so với nhận tất cả generic triển khai
jalf

29
@ Steve314: Những gì bạn gọi là "phình to" là những gì được thực hiện thủ công cho C và Java. Trong C ++, nó có thể được tự động hóa và trình biên dịch có thể thông minh như các nhà cung cấp dám tạo ra chúng để tránh phình to. Nếu tôi phải quyết định giữa việc chậm (như trong C) hoặc sử dụng mã trùng lặp (như trong Java), thì trình biên dịch thực hiện sao chép (và có thể thông minh về nó) có vẻ khá tốt, phải không?
sbi

166

Tôi thấy quá nhiều lập trình viên C ghét C ++. Tôi đã mất khá nhiều thời gian (năm) để từ từ hiểu được điều gì là tốt và điều gì là xấu về nó. Tôi nghĩ cách tốt nhất để diễn đạt nó là:

Mã ít hơn, không có chi phí thời gian chạy, an toàn hơn.

Chúng tôi viết càng ít mã càng tốt. Điều này nhanh chóng trở nên rõ ràng trong tất cả các kỹ sư phấn đấu cho sự xuất sắc. Bạn sửa một lỗi ở một nơi, không nhiều - bạn thể hiện một thuật toán một lần và sử dụng lại nó ở nhiều nơi, v.v. Người Hy Lạp thậm chí còn có một câu nói, truy nguyên từ người Sparta cổ đại: "nói một điều gì đó ít lời hơn, nghĩa là rằng bạn khôn ngoan về điều đó ". Và thực tế của vấn đề là, khi được sử dụng một cách chính xác , C ++ cho phép bạn thể hiện bản thân bằng mã ít hơn nhiều so với C, mà không tốn chi phí thời gian chạy, trong khi vẫn an toàn hơn (tức là bắt được nhiều lỗi hơn trong thời gian biên dịch) so với C là.

Đây là một ví dụ đơn giản từ trình kết xuất của tôi : Khi nội suy các giá trị pixel qua đường quét của tam giác. Tôi phải bắt đầu từ tọa độ X x1 và đạt tọa độ X x2 (từ bên trái sang bên phải của một tam giác). Và qua từng bước, qua từng pixel tôi chuyển qua, tôi phải nội suy các giá trị.

Khi tôi nội suy ánh sáng xung quanh đạt đến pixel:

  typedef struct tagPixelDataAmbient {
      int x;
      float ambientLight;
  } PixelDataAmbient;

  ...
  // inner loop
  currentPixel.ambientLight += dv;

Khi tôi nội suy màu (được gọi là bóng "Gouraud", trong đó các trường "đỏ", "xanh" và "xanh" được nội suy bởi một giá trị bước ở mỗi pixel):

  typedef struct tagPixelDataGouraud {
      int x;
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  } PixelDataGouraud;

  ...
  // inner loop
  currentPixel.red += dred;
  currentPixel.green += dgreen;
  currentPixel.blue += dblue;

Khi tôi hiển thị trong bóng "Phong", tôi không còn nội suy cường độ (ambientLight) hoặc màu (đỏ / xanh / xanh) - Tôi nội suy một vectơ bình thường (nx, ny, nz) và ở mỗi bước, tôi phải tái - tính toán phương trình chiếu sáng, dựa trên vectơ bình thường nội suy:

  typedef struct tagPixelDataPhong {
      int x;
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  } PixelDataPhong;

  ...
  // inner loop
  currentPixel.nX += dx;
  currentPixel.nY += dy;
  currentPixel.nZ += dz;

Bây giờ, bản năng đầu tiên của các lập trình viên C sẽ là "heck, viết ba hàm nội suy các giá trị và gọi chúng tùy thuộc vào chế độ cài đặt". Trước hết, điều này có nghĩa là tôi có một vấn đề kiểu - tôi làm việc với cái gì? Là pixel của tôi PixelDataAmbient? PixelDataGouraud? PixelDataPhong? Oh, đợi đã, lập trình viên C hiệu quả nói, hãy sử dụng một liên minh!

  typedef union tagSuperPixel {
      PixelDataAmbient a;
      PixelDataGouraud g;
      PixelDataPhong   p;
  } SuperPixel;

.. và sau đó, bạn có một chức năng ...

  RasterizeTriangleScanline(
      enum mode, // { ambient, gouraud, phong }
      SuperPixel left,
      SuperPixel right)
  {
      int i,j;
      if (mode == ambient) {
          // handle pixels as ambient...
          int steps = right.a.x - left.a.x;
          float dv = (right.a.ambientLight - left.a.ambientLight)/steps;
          float currentIntensity = left.a.ambientLight;
          for (i=left.a.x; i<right.a.x; i++) {
              WorkOnPixelAmbient(i, dv);
              currentIntensity+=dv;
          }
      } else if (mode == gouraud) {
          // handle pixels as gouraud...
          int steps = right.g.x - left.g.x;
          float dred = (right.g.red - left.g.red)/steps;
          float dgreen = (right.g.green - left.a.green)/steps;
          float dblue = (right.g.blue - left.g.blue)/steps;
          float currentRed = left.g.red;
          float currentGreen = left.g.green;
          float currentBlue = left.g.blue;
          for (j=left.g.x; i<right.g.x; j++) {
              WorkOnPixelGouraud(j, currentRed, currentBlue, currentGreen);
              currentRed+=dred;
              currentGreen+=dgreen;
              currentBlue+=dblue;
          }
...

Bạn có cảm thấy sự hỗn loạn trượt vào?

Trước hết, một lỗi đánh máy là tất cả những gì cần thiết để đánh sập mã của tôi, vì trình biên dịch sẽ không bao giờ ngăn tôi trong phần "Gouraud" của hàm, để thực sự truy cập vào ".a." (môi trường) giá trị. Một lỗi không được hệ thống loại C bắt gặp (nghĩa là trong quá trình biên dịch), có nghĩa là một lỗi xuất hiện trong thời gian chạy và sẽ yêu cầu gỡ lỗi. Bạn có để ý rằng tôi đang truy cập left.a.greenvào tính toán của "cây xanh" không? Trình biên dịch chắc chắn không nói với bạn như vậy.

Sau đó, có sự lặp lại ở khắp mọi nơi - forvòng lặp ở đó nhiều lần như có các chế độ kết xuất, chúng tôi tiếp tục thực hiện "trừ đi bên trái chia cho các bước". Xấu xí, và dễ bị lỗi. Bạn có để ý tôi so sánh việc sử dụng "i" trong vòng lặp Gouraud không, khi nào tôi nên sử dụng "j"? Trình biên dịch là một lần nữa, im lặng.

Điều gì về if / other / lad cho các chế độ? Nếu tôi thêm một chế độ kết xuất mới, trong ba tuần thì sao? Tôi có nhớ xử lý chế độ mới trong tất cả "if mode ==" trong tất cả mã của mình không?

Bây giờ hãy so sánh sự xấu xí ở trên, với bộ cấu trúc C ++ này và một hàm mẫu:

  struct CommonPixelData {
      int x;
  };
  struct AmbientPixelData : CommonPixelData {
      float ambientLight;
  };
  struct GouraudPixelData : CommonPixelData {
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  };
  struct PhongPixelData : CommonPixelData {
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  };

  template <class PixelData>
  RasterizeTriangleScanline(
      PixelData left,
      PixelData right)
  {
      PixelData interpolated = left;
      PixelData step = right;
      step -= left;
      step /= int(right.x - left.x); // divide by pixel span
      for(int i=left.x; i<right.x; i++) {
          WorkOnPixel<PixelData>(interpolated);
          interpolated += step;
      }
  }

Bây giờ hãy nhìn vào điều này. Chúng tôi không còn tạo ra một loại súp kết hợp: chúng tôi có các loại cụ thể cho mỗi chế độ. Họ sử dụng lại những thứ phổ biến của họ (trường "x") bằng cách kế thừa từ một lớp cơ sở ( CommonPixelData). Và khuôn mẫu làm cho trình biên dịch CREATE (nghĩa là tạo mã) ba hàm khác nhau mà chúng ta sẽ tự viết bằng C, nhưng đồng thời, rất nghiêm ngặt về các loại!

Vòng lặp của chúng tôi trong mẫu không thể đi và truy cập các trường không hợp lệ - trình biên dịch sẽ sủa nếu chúng tôi làm.

Mẫu thực hiện công việc chung (vòng lặp, tăng theo "bước" mỗi lần) và có thể thực hiện theo cách đơn giản KHÔNG THỂ gây ra lỗi thời gian chạy. Suy cho mỗi loại ( AmbientPixelData, GouraudPixelData, PhongPixelData) được thực hiện với sự operator+=()rằng chúng tôi sẽ thêm vào trong các cấu trúc - mà về cơ bản sai khiến như thế nào với từng loại được nội suy.

Và bạn có thấy những gì chúng tôi đã làm với WorkOnPixel <T> không? Chúng tôi muốn làm công việc khác nhau cho mỗi loại? Chúng tôi chỉ đơn giản gọi một chuyên ngành mẫu:

void WorkOnPixel<AmbientPixelData>(AmbientPixelData& p)
{
    // use the p.ambientLight field
}


void WorkOnPixel<GouraudPixelData>(GouraudPixelData& p)
{
    // use the p.red/green/blue fields
}

Đó là - chức năng để gọi, được quyết định dựa trên loại. Tại thời điểm biên dịch!

Để viết lại nó một lần nữa:

  1. chúng tôi thu nhỏ mã (thông qua mẫu), sử dụng lại các phần chung,
  2. chúng tôi không sử dụng các bản hack xấu xí, chúng tôi giữ một hệ thống loại nghiêm ngặt để trình biên dịch có thể kiểm tra chúng tôi mọi lúc.
  3. và tốt nhất của tất cả: không có gì chúng tôi đã làm có bất kỳ tác động thời gian chạy nào. Mã này sẽ chạy JUST nhanh như mã C tương đương - trên thực tế, nếu mã C đang sử dụng các con trỏ hàm để gọi các WorkOnPixelphiên bản khác nhau , mã C ++ sẽ FASTER hơn C, bởi vì trình biên dịch sẽ nội tuyến WorkOnPixelhóa chuyên môn mẫu cụ thể gọi!

Mã ít hơn, không có chi phí thời gian chạy, an toàn hơn.

Điều này có nghĩa là C ++ là tất cả và cuối cùng của ngôn ngữ? Dĩ nhiên là không. Bạn vẫn phải đo lường sự đánh đổi. Những người thiếu hiểu biết sẽ sử dụng C ++ khi họ nên viết một tập lệnh Bash / Perl / Python. Những người mới sử dụng C ++ vui vẻ sẽ tạo ra các lớp lồng nhau sâu với nhiều kế thừa ảo trước khi bạn có thể dừng chúng và gửi chúng đóng gói. Họ sẽ sử dụng lập trình meta Boost phức tạp trước khi nhận ra rằng điều này là không cần thiết. Họ vẫn sẽ sử dụng char*, strcmpvà macro, thay vì std::stringvà các mẫu.

Nhưng điều này không nói gì hơn là ... xem bạn làm việc với ai. Không có ngôn ngữ để bảo vệ bạn khỏi những người dùng bất tài (không, thậm chí không phải Java).

Tiếp tục học và sử dụng C ++ - đừng quá tin tưởng.


18
+1 cho "không, thậm chí không phải Java" :)
Nathan Osman

53
+1 cho ví dụ. Đó là một bài viết dài, nhưng so sánh giữa mã C và C ++ là ấn tượng.
paercebal

Và điều này, thưa quý vị và các bạn, là lý do tại sao lex / yacc tồn tại. Cùng một lý do, tôi không bao giờ nhận ra các phần của c ++ rơi vào cùng một triết lý tạo mã. Thỉnh thoảng tôi sẽ phải xem lại nó.
Spencer Rathbun

2
Tôi đã viết rất nhiều mã kết xuất 2D (hơn một thập kỷ trước) và gặp phải vấn đề này khi chuyển từ C sang C ++: làm thế nào để bạn xác định cấu trúc pixel, nếu đường quét của bạn được tạo bằng pixel 1 bit (8 pixel trong một byte)? Và khi đường quét của bạn được tạo bởi các byte R, G và B (3 byte mỗi pixel)? Và khi bạn có ba bộ đệm riêng cho R, G và B? Bạn biết câu trả lời: C ++ không giúp ích gì ở đó và việc khăng khăng sử dụng các mẫu sẽ khiến bạn mất rất nhiều tối ưu hóa không gian và thời gian
Walter Tross

Tại sao bạn sử dụng các mẫu trong C ++ cho việc này? Phương thức của bạn khai báo một tham số của lớp cơ sở để theo quan điểm [lập trình viên C #] của tôi, có vẻ như bạn chỉ có thể chuyển thể hiện loại dẫn xuất sang tham số loại cơ sở. Tôi không biết C ++, bạn có thể giải thích không?
Vlad

79

RAII cho em bé chiến thắng.

Nghiêm túc, sự phá hủy xác định trong C ++ làm cho mã rõ ràng hơn và an toàn hơn mà không cần bất kỳ chi phí nào.


20
"C ++: Tùy chọn xác định nghiêm túc duy nhất . Hãy hỏi bác sĩ của bạn về nó ngày hôm nay."
Kyle Strand

2
Theo dõi: Rust hiện là một ứng cử viên trong lĩnh vực này. Xem ví dụtài liệu RAII cơ bản về các phương pháp hủy diệt của Rust .
Kyle Strand

1
C sẽ mang tính quyết định, nhưng đòi hỏi nhiều công việc hơn để đảm bảo điều đó thực sự xảy ra khi sử dụng bộ nhớ malloc-ed
Baldrickk

1
@Baldrickk trong C bạn phải viết mã dọn dẹp ở mọi nơi bạn sử dụng tài nguyên. Trong C ++, bạn viết nó một lần , theo định nghĩa của tài nguyên. Cả C và Java đều gặp phải lỗi "tài nguyên được sử dụng sau khi xử lý" và "rò rỉ tài nguyên", vì việc dọn dẹp không tự động . Bộ nhớ không phải là tài nguyên duy nhất.
Caleth

70

Có bất kỳ lý do thỏa đáng để sử dụng C ++?

  1. Mẫu và STL. Bạn giao dịch một ít thời gian xây dựng (và một số thông báo lỗi có thể hiểu được) cho rất nhiều công cụ trừu tượng và tiết kiệm lao động hữu ích, không có hiệu suất thời gian chạy đáng kể (mặc dù dấu chân nhị phân có thể lớn hơn một chút).

    Phải mất một thời gian để quấn đầu bạn (tôi mất vài năm trước khi nhấp chuột), nhưng một khi bạn làm điều đó có thể làm cho cuộc sống đơn giản hơn rất nhiều .

  2. Xử lý văn bản trong C ++ là các đơn đặt hàng có cường độ ít đau đớn hơn so với C.


35
+1 để xử lý văn bản, điều mà tôi hoàn toàn quên mất trong câu trả lời của mình.
Konrad Rudolph

8
Heh tôi thấy đặc biệt là xử lý văn bản đau đớn so với giả sử Python ..
Nils

7
Boost là lý do duy nhất tôi vẫn sử dụng C ++.
Ferruccio

33
@Nils: Trên thang điểm từ 1 đến đau, xử lý văn bản trong C ++ chắc chắn tệ hơn so với các ngôn ngữ hiện đại hơn như Python. Chỉ là việc xử lý văn bản trong C định nghĩa đau đớn. Nếu lựa chọn nằm giữa C và C ++ cho ứng dụng cụ thể đó, thì C ++ sẽ thắng dễ dàng.
John Bode

8
Tôi không biết tại sao mọi người gặp khó khăn như vậy với những thứ như xử lý văn bản trong C / C ++. Chỉ cần sử dụng một thư viện hoặc viết của riêng bạn. Khi bạn đã viết các hàm cấp thấp (đau một lần), bạn sẽ có được hiệu suất lớn, mã chặt chẽ và tính linh hoạt cao hơn. Có, tôi sẽ sử dụng Python cho các tiện ích dòng lệnh nhanh / bẩn nhưng đối với mã sản xuất nghiêm trọng C / C ++ của nó.

41

Đúng.

Nếu bạn đang tìm kiếm hiệu quả thực thi, bạn sẽ xuống C hoặc C ++, vì vậy tôi sẽ tập trung vào đó.

Ngay cả trước khi các mẫu phổ biến, tôi vẫn thích sử dụng C ++ hơn C cho các loại thực thi mà bạn thảo luận sớm nhất là giữa những năm 1990 vì hai lý do rất đơn giản: đa hình đối tượngRAII .

Tôi đã sử dụng các đối tượng C ++ đa hình cho tất cả các loại điều thú vị. Chẳng hạn, tôi đang làm việc trên một hệ thống Linux nhúng với lớp phủ bộ đệm khung trên CPU ARM OMAP và XScale. Hai kiến ​​trúc phần cứng có các tính năng lớp phủ khác nhau với các API rất khác nhau. Tôi đã sử dụng một lớp cơ sở "Lớp phủ" ảo phổ biến để hiển thị chế độ xem lý tưởng hóa các lớp phủ và sau đó viết các lớp "OmapOverlay" và "XScaleOverlay" được khởi tạo một cách thích hợp trong thời gian chạy, tùy thuộc vào kiến ​​trúc mà mã phát hiện được.

Để đơn giản hóa, RAII là ý tưởng rằng bạn phân bổ các tài nguyên được kết nối với một đối tượng trong suốt quá trình xây dựng của đối tượng, hoặc có thể sau đó trong vòng đời của đối tượng và các tài nguyên sẽ được giải phóng hoặc giải phóng trong hàm hủy của đối tượng. Điều đó thực sự tốt trong C ++, bởi vì các đối tượng là biến tự động bị phá hủy khi chúng vượt ra khỏi phạm vi. Đối với ai đó có thẩm quyền như nhau trong C và C ++, việc tránh rò rỉ tài nguyên và bộ nhớ trong C ++ sẽ dễ dàng hơn nhiều. Bạn cũng không thấy nhiều mã C ++ với meme C rất phổ biến của nhãn ở cuối hàm trước một loạt các lệnh gọi đến free(), và các gotochuỗi khác nhau trong khối chức năng nhảy tới đó.

Tôi hoàn toàn nhận thức được rằng bạn có thể làm tất cả những điều này với C - nó chỉ là công việc nhiều hơn, nhiều dòng mã hơn và những gì bạn gặp phải là xấu hơn rất nhiều và thường khó hiểu hơn. Có mã đa hình thông qua các phần bên trong máy chủ X , và con người, có phải nó khó hiểu và kỳ lạ và thường khó theo dõi.

Tôi cũng làm rất nhiều việc với các công nghệ Gnome như GTK + và Clutter, tất cả đều được viết bằng C bằng hệ thống GObject. GObject giống như hệ thống đối tượng C ++ với vỏ bọc đẹp được tháo ra và tất cả các phần bên trong xấu xí được phơi bày, và nó thường yêu cầu một nửa tá dòng mã để thực hiện những gì mà một cuộc gọi phương thức C ++ một dòng sẽ làm. Tôi hiện đang viết một số ClutterActors, và trong khi toán học thực sự thú vị, tôi không ngừng suy nghĩ, "Tất cả điều này sẽ ngắn gọn và dễ hiểu hơn nhiều trong C ++".

Tôi cũng thường nghĩ: "Bạn biết đấy, nếu tôi viết bài này bằng C ++ thay vì C, tôi sẽ ra ngoài phòng khách xem Chuyện hoang đường với vợ tôi thay vì ngồi trong văn phòng của tôi lúc 9 giờ tối."


9
Tôi thực sự có thể liên quan đến những gì bạn đang nói ở đây, đặc biệt là 1) quan điểm về RAII và 2) ý nghĩ "Bạn biết đấy, nếu tôi viết điều này bằng C ++ thay vì C ..." Tôi thực hiện rất nhiều phát triển hệ thống nhúng và ngay cả khi nhóm có khá nhiều loại cửa hàng "C" hoặc "C với các lớp", tôi thực sự cố gắng khuyến khích RAII cho những việc như thao tác gián đoạn, thao tác đột biến và truy tìm / ghi nhật ký (đặc biệt là những điều như làm đảo lộn I / O dòng). Và mô tả của bạn về bộ đệm khung đa hình nhắc nhở tôi về việc tôi sử dụng bộ đệm tin nhắn đa hình trong một hệ thống phân tán.
Radian

29

C ++ có tốc độ nhanh như C (một số thứ nhanh hơn, chậm hơn một chút) và nó cung cấp sự trừu tượng và tổ chức tốt hơn. Các lớp hoạt động tương tự như các kiểu nguyên thủy, cho phép sử dụng một lượng lớn mã mà không cần lưu ý. Toán tử quá tải và các mẫu cho phép viết mã có chức năng tốt hơn nếu biểu diễn dữ liệu thay đổi. Các ngoại lệ có thể cho phép xử lý lỗi dễ dàng hơn. Trình biên dịch có thể được sử dụng để kiểm tra nhiều thứ hơn tại thời gian biên dịch.

Cái giá bạn phải trả cho điều này là một đường cong học tập khá khó chịu và dễ phạm sai lầm tinh vi hơn so với hầu hết các ngôn ngữ khác mà tôi quen thuộc.

Vì vậy, tôi không thể biết liệu nó có đáng để bạn học nó cho những gì bạn đang làm bây giờ không. Bạn chắc chắn có thể nhận được bằng cách kết hợp Python hoặc Perl và C, nhưng C ++ cung cấp cả tính trừu tượng và hiệu năng trong một gói khó sử dụng.


13
Không trường hợp nào C ++ chậm hơn C vì bạn luôn có thể sử dụng cách C nếu nó nhanh hơn (và bạn quan tâm).
Jack Aidley

1
@JackAidley - Ngoại trừ việc C ++ không hỗ trợ các tham số mảng hạn chế và tĩnh. Và ngoại trừ việc sử dụng C ++ - phong cách ở một nơi buộc bạn phải sử dụng nó ở những nơi khác.
martinkunev

@martinkunev restrictđược sử dụng để loại trừ khỏi tối ưu hóa răng cưa, vậy làm thế nào để giúp mọi thứ nhanh hơn ? và "tham số mảng tĩnh" là gì? và "phong cách" ảnh hưởng đến hiệu suất như thế nào?
gạch dưới

1
@underscore_d hạn chế cho phép tối ưu hóa, dựa trên sự đảm bảo cho việc không răng cưa; Các tham số mảng tĩnh cho phép trình biên dịch giả định rằng một đối số con trỏ không phải là NULL và con trỏ này trỏ đến ít nhất một số phần tử đã cho; từ "phong cách" có một số ý nghĩa và đưa nó ra khỏi bối cảnh thay đổi ý nghĩa của nó - ví dụ, tôi đang nói về cách, ngoại lệ thực thi việc sử dụng con trỏ thông minh.
martinkunev

1
@martinkunev Hmm, vì vậy tôi tự hỏi liệu một tham số mảng tĩnh có cho phép mọi thứ khác về mặt chức năng so với mẫu C ++ bằng cách sử dụng T (&arr)[n]hay không std::array<T, n>- sẽ phải nghiên cứu thêm về điều này, vì không có nhiều thông tin ngoài đó. Điều đó có ý nghĩa về con trỏ thông minh, chắc chắn là một ví dụ tốt. Nếu mã hóa trên một sân chơi bình đẳng, chúng tôi sẽ không sử dụng ngoại lệ, do đó, không có chi phí tiềm năng nào phát sinh ... tuy nhiên tôi nghi ngờ bạn có thể ám chỉ đến việc, khi các thư viện của bên thứ 3 xâm nhập vào bức tranh, rất nhiều giả định Có nguy cơ.
underscore_d

27

Tôi coi C ++ là ngôn ngữ của những năm 1990, ngôn ngữ của thời đại đã qua.

Trước đó, nó rất lớn bởi vì nó cung cấp các cấu trúc và cơ chế ngôn ngữ cấp cao hơn với chi phí thấp hơn về mặt hiệu suất. Nó là công cụ phổ biến để phát triển mọi thứ, từ các ứng dụng sổ địa chỉ đến phần mềm điện tử hàng không, và điều đó đã truyền cảm hứng cho cơn sốt OO. OOP đã giải quyết nạn đói và AIDS, và vâng, tôi đổ lỗi cho C ++ vì đã cố gắng tẩy não tôi vào cuối những năm 1990 khi tôi bắt đầu lập trình rằng bất kỳ ngôn ngữ không phải OO nào cũng không đáng để học.

Bây giờ phần cứng đã phát triển rất nhiều và mới hơn, các ngôn ngữ hiện đại đã xuất hiện, tôi không thấy C ++ vẫn là một lựa chọn phù hợp cho hầu hết các chương trình ứng dụng ngoại trừ phần mềm chuyên sâu tính toán mà bạn vẫn cần một số trừu tượng (trò chơi, mô phỏng vật lý, hệ thống CAD, v.v. ). Ngay cả cái sau cũng có thể tránh được nếu bạn viết một công cụ mô-đun nhỏ gọn bằng C và có logic ứng dụng cấp cao hơn được ủy quyền cho một ngôn ngữ kịch bản gọn gàng.

Nếu bạn cần xuống kim loại, hãy sử dụng C một cách an toàn và khi bạn cần lên cấp cao, hãy thực hiện bằng ngôn ngữ hiện đại không quảng cáo đóng gói trong khi bạn có thể tự do thay đổi từng byte thông qua một con trỏ.


11
Vì vậy, không thay đổi byte ngẫu nhiên bằng cách sử dụng con trỏ. Điều đó không quá khó để tránh, phải không?
David Thornley

11
@Blagovest: Tôi đồng ý với bạn về độ phức tạp của C ++ và tôi sẽ không bao giờ sử dụng nó để thay thế một ngôn ngữ hướng đối tượng. Nhưng bất chấp sự phức tạp của nó, nó vẫn giành chiến thắng trước C vì nhiều ưu điểm của nó được nêu ra trong các câu trả lời khác nhau (trừu tượng hóa, bàn giao tài nguyên, xử lý chuỗi lỗi). Trên thực tế, bạn đã đặt tên cho một vài lĩnh vực hợp lệ trong đó C ++ vẫn có liên quan và nơi đó vượt trội hơn nhiều so với C.
Konrad Rudolph

6
@Blagovest: Đó là lý do tại sao tôi đứng ngoài những góc tối. Thật dễ dàng để có được kết nối trong C ++ hơn bất kỳ ngôn ngữ nào tôi biết. Bằng cách sử dụng nó, tôi hưởng lợi từ RAII, xử lý chuỗi tốt hơn C, các lớp mẫu kiểu STL, các tính năng OO và các lợi thế khác mà nó có được trên C.
David Thornley

24
@Blagovest: Không, bạn không. Ví dụ, những gì bạn đã đề cập là không đủ để đạt được RAII và các lớp container có chức năng vượt ra ngoài các cấu trúc dữ liệu thủ công đơn giản. Nếu bạn nghĩ điều đó là có thể, bạn sẽ không bao giờ học tốt C ++.
David Thornley

5
@Jaroslaw Tôi không biết tại sao máy đa lõi sẽ đưa OOP xuống mồ. Nếu bạn có nghĩa là C ++, tôi có thể thấy bạn đến từ đâu. OOP là một khái niệm cơ bản trong nhiều ngôn ngữ lập trình hiện đại, đặc biệt là các ngôn ngữ cấp cao. Thậm chí C có thể là OO, nếu bạn lập trình theo cách đó. Nó chỉ không thuận tiện như C ++ IMO.
vedoity

21

Theo Linus , không:

Khi tôi lần đầu tiên nhìn vào mã nguồn Git, có hai điều khiến tôi thấy kỳ lạ: 1. Pure C trái ngược với C ++. Không biết tại sao. Xin đừng nói về tính di động, đó là BS.

BẠN đầy nhảm nhí.

C ++ là một ngôn ngữ khủng khiếp. Nó trở nên khủng khiếp hơn bởi thực tế là rất nhiều lập trình viên không đạt tiêu chuẩn sử dụng nó, đến mức dễ dàng hơn nhiều để tạo ra toàn bộ và hoàn toàn tào lao với nó. Thẳng thắn mà nói, ngay cả khi lựa chọn của C là không làm ngoài việc ngăn chặn các lập trình viên C ++, thì chính nó sẽ là một lý do rất lớn để sử dụng C.

Nói cách khác: sự lựa chọn của C là sự lựa chọn lành mạnh duy nhất. Tôi biết Miles Bader đã nói đùa rằng "làm phiền bạn", nhưng thực ra nó là sự thật. Tôi đã đi đến kết luận rằng bất kỳ lập trình viên mà muốn dự án sẽ được trong C ++ trên C có thể là một lập trình viên mà tôi thực sự sẽ thích piss off, để ông không đến và vít lên bất kỳ dự án Tôi tham gia với.

C ++ dẫn đến sự lựa chọn thiết kế thực sự tồi tệ. Bạn luôn bắt đầu sử dụng các tính năng thư viện "đẹp" của ngôn ngữ như STL và Boost và các crap hoàn toàn và hoàn toàn khác, có thể "giúp" bạn lập trình, nhưng nguyên nhân:

  • vô số nỗi đau khi chúng không hoạt động (và bất cứ ai nói với tôi rằng STL và đặc biệt là Boost đều ổn định và có thể mang theo rất nhiều BS đến nỗi nó thậm chí không hài hước)

  • Các mô hình lập trình trừu tượng không hiệu quả trong đó hai năm sau bạn nhận thấy rằng một số trừu tượng không hiệu quả lắm, nhưng bây giờ tất cả mã của bạn phụ thuộc vào tất cả các mô hình đối tượng đẹp xung quanh nó và bạn không thể sửa nó mà không cần viết lại ứng dụng của mình.

Nói cách khác, cách duy nhất để làm C ++ tốt, hiệu quả và ở cấp độ hệ thống và di động kết thúc là giới hạn bản thân bạn trong tất cả những thứ cơ bản có sẵn trong C. Và giới hạn dự án của bạn ở C có nghĩa là mọi người không bắt vít và cũng có nghĩa là bạn có rất nhiều lập trình viên thực sự hiểu các vấn đề cấp thấp và không làm hỏng mọi thứ với bất kỳ "mô hình đối tượng" ngu ngốc nào.

Vì vậy, tôi xin lỗi, nhưng đối với một cái gì đó như git, trong đó hiệu quả là mục tiêu chính, "lợi thế" của C ++ chỉ là một sai lầm lớn. Thực tế là chúng tôi cũng chọc giận những người không thể thấy đó chỉ là một lợi thế lớn.

Nếu bạn muốn có một VCS được viết bằng C ++, hãy chơi với Monotone. Có thật không. Họ sử dụng một "cơ sở dữ liệu thực". Họ sử dụng "các thư viện hướng đối tượng đẹp". Họ sử dụng "trừu tượng C ++ tốt đẹp". Và thật lòng mà nói, là kết quả của tất cả những quyết định thiết kế nghe có vẻ hấp dẫn đối với một số người CS, kết quả cuối cùng là một mớ hỗn độn khủng khiếp và không thể nhầm lẫn.

Nhưng tôi chắc chắn rằng bạn thích nó hơn git.

      Linus

62
Tôi không nghĩ Linus nên trở thành người tranh luận ở đây. Những lời tán dương của anh ta là chủ quan khủng khiếp và chưa trưởng thành. Anh ta thực sự có một vài điểm tốt nhưng họ bị chôn vùi quá sâu (dưới mức nhảm nhí, cũng như nhảm nhí) mà họ rất khó tìm thấy.
Konrad Rudolph

19
Haha, đó là một tiếng cười tốt Tôi không bao giờ muốn gặp anh chàng này.
Felix Dombek

30
Linus làm tôi nhớ đến một thợ lợp nhà rất tài năng, người không bao giờ treo tấm lợp, nhưng gọi những người đàn ông tấm lợp là pansies vì ​​họ sử dụng ốc vít thay vì đinh.
Bob Murphy

8
Linus có một điểm nhưng thể hiện nó quá khắc nghiệt để được thực hiện nghiêm túc.
Blagovest Buyukliev

39
Tôi đồng ý với @Daniel, Nếu có ai đó có thể nói về việc vượt qua ranh giới của phần cứng là John Carmack, người tạo ra sự diệt vong, trận động đất và các trò chơi khác và người sáng lập phần mềm Id. Ông đã viết điều này về c và c ++ trên một twitt vài tháng trước: "IMO, mã C ++ tốt tốt hơn mã C tốt, nhưng C ++ xấu có thể tệ hơn nhiều so với mã C xấu." twitter.com/#!/ID_AA_Carmack/status/26560399602
Onema

18

Tôi không nghĩ có bất kỳ lý do thuyết phục nào để sử dụng C ++. Nếu bạn muốn lập trình OO, bạn có thể sử dụng Python thay thế và viết các phần cần hiệu suất nhanh trong C.

EDIT: Có những ngôn ngữ khác có giao diện tốt với C, vì vậy nếu bạn không thích Python, có những ngôn ngữ thay thế.


3
Còn phát triển nhúng thì sao? Python không phải lúc nào cũng có sẵn và sự khác biệt về tốc độ giữa C và C ++ được viết tốt là không đáng kể trên các thiết bị vượt qua một mức độ xử lý nhất định. Tất nhiên, tôi cho rằng một trình biên dịch C ++ sẽ không luôn khả dụng ...
James

6
@James "C ++ cũng được viết" - có một
nhược điểm

5
Tôi đồng ý với câu trả lời này, thực hiện mức độ cao với python, vì bạn sẽ viết nó nhanh hơn gấp 3 lần, hồ sơ và sau đó giải phóng các nút cổ chai bằng cách thay thế chúng bằng C / C ++. Thật dư thừa khi nói "thay thế nút cổ chai bằng mã C ++" vì bạn sẽ không thực hiện bất kỳ cấp độ cao nào với mã bạn cần phải nhanh, vì đó sẽ là mã cấp thấp. Có một điều: tôi không biết cách giao diện c ++ với python: /. nhưng về mặt thời gian sử dụng trước màn hình và hiệu quả, tôi nghĩ đó là giải pháp tốt nhất, vì hầu hết các mã C ++ sẽ nhanh chóng không có gì!
jokoon

8
Đi làm cho một công ty tài chính lớn và xây dựng một hệ thống tài chính phức tạp trong một nhóm phân phối lớn trong Python và xem bạn thích nó như thế nào. Kinh nghiệm sẽ dạy cho bạn: a) lợi thế của an toàn loại, b) lợi thế của trình biên dịch tiết kiệm mông của bạn, c) Mã LUDICROUS mà Python cho phép noobs viết. Mọi người nói rằng thật dễ dàng để bắn vào chân bạn bằng C ++ -> một số công cụ python có thể hoạt động nhưng bị điên loạn biên giới. Ngay bây giờ tôi sẽ làm việc rất nhiều trong C ++ ...
MrFox

1
@suslik: Wow, tôi bị sốc vì bất kỳ ai cũng thực sự sử dụng python cho loại hệ thống đó. Tôi đồng ý với bạn về mã python xấu noob; Tôi đã nhìn thấy một số bản thân mình.
Larry Coleman

13

Có một lý do để sử dụng C ++? Chắc chắn rồi.

Một số người có thể chỉ đơn giản thích sử dụng C ++ hơn các tùy chọn khác. Hỏi nếu có lý do để sử dụng C ++ cũng giống như hỏi tại sao chúng ta cần phải có hàng trăm hương vị kem. Không phải ai cũng thích đơn giản là gắn bó với Vanilla.

Nếu các nhà phát triển đã rất thành thạo với C ++, câu hỏi dành cho họ có thể không phải là 'tại sao lại sử dụng nó?', Mà là 'tại sao không?'. Dường như có điều chống C ++ thời thượng này đang diễn ra trong SO ngay bây giờ, nhưng tin hay không, không phải ai cũng đăng ký vào đó. Một số người đơn giản có thể thích C ++ tốt hơn các ngôn ngữ khác.

C ++ có cần được sử dụng cho các ứng dụng không? Dĩ nhiên là không. Nhưng câu hỏi chính xác tương tự này cũng có thể được hỏi cho bất kỳ ngôn ngữ nào khác. Có rất, rất ít trường hợp một ngôn ngữ cụ thể cần được sử dụng cho một ứng dụng.


12

Tôi chỉ chuyển từ C sang C ++ và tôi nghĩ mức tăng là đáng kể, ngay cả khi bạn không có nhu cầu về mẫu và OOP.

  • Quản lý bộ nhớ tốt hơn
  • Hệ thống loại mạnh hơn
  • Một thư viện tiêu chuẩn tốt hơn
  • Không gian tên
  • Vân vân.

8

Tôi ngạc nhiên không ai đề cập đến điều này, nhưng C ++ đã giới thiệu cho chúng tôi các tài liệu tham khảo , gần như giải quyết tất cả các vấn đề và cạm bẫy của con trỏ:

void ModifyVar(int& var)
{
    var = 5;
}

int test = 4;
ModifyVar(test);

Thay vì:

void ModifyVar(int * var)
{
    *var = 5;
}

int test = 4;
ModifyVar(&test);

An toàn và dễ dàng hơn nhiều ... và không có chi phí chuyển qua giá trị.


3
Cũng kém linh hoạt hơn nhiều. Tài liệu tham khảo (kiểu C ++) rất tốt trong việc đơn giản hóa một số cấu trúc phổ biến nhất định trong ngôn ngữ cũng có con trỏ, nhưng chúng không bị thay thế cho con trỏ, thậm chí còn không hài hước. Và ví dụ của bạn không phải là một trường hợp tốt để tham khảo.
Ben Voigt

3
@Ben: Sau đó, bạn có thể vui lòng giải thích tại sao đó là một ví dụ xấu?
Nathan Osman

6
@George: Bởi vì không có gì thay đổi, ngoại trừ hai ký tự (tính) em ngắn hơn? Nó không giải quyết bất kỳ vấn đề nào, nó không làm nổi bật bất kỳ cạm bẫy nào, thậm chí nó không làm được gì hay ho như kéo dài thời gian tồn tại của một biến tạm thời (mà các tài liệu tham khảo rất tốt).
Ben Voigt

@Ben: Bạn đang quên điều gì đó - tài liệu tham khảo luôn hợp lệ. Con trỏ có thể trỏ đến bất cứ điều gì (bao gồm NULL) có thể dẫn đến tất cả các loại lỗi bộ nhớ nếu mọi thứ không được thực hiện đúng. Tài liệu tham khảo không bao giờ có thể là NULL và địa chỉ mà chúng trỏ đến không bao giờ có thể thay đổi.
Nathan Osman

5
@George: "tham chiếu luôn hợp lệ" là không đúng. Tôi sẽ đưa ra một ví dụ nếu bạn cần, nhưng tôi hy vọng rằng bạn đủ chuyên môn để nhận thức được điều này. Và tôi cũng không nói về việc hình thành một tham chiếu không hợp lệ bằng cách sử dụng một con trỏ không hợp lệ. Các hàm sử dụng con trỏ cần tài liệu nêu các điều kiện tiên quyết trên các đối số. Nhưng thực tế mà nói, tất cả các chức năng đều cần mức tài liệu đó, vì vậy thật vô lý khi gọi đó là một cuộc đình công chống lại con trỏ.
Ben Voigt

5

Nơi và tại sao thường sẽ là:

  • sự quen thuộc
  • tính năng ngôn ngữ mong muốn
  • thư viện cụ thể bạn muốn sử dụng
  • các yêu cầu thực hiện

Đối với lập trình phía máy chủ, bạn thường có thể chọn từ vô số ngôn ngữ khác nhau, được biên dịch hoặc giải thích. Thông thường sự lựa chọn ngôn ngữ được thúc đẩy bởi nền tảng mà bạn hoặc nhóm của bạn sẽ có hiệu quả nhất. Hoặc nếu bạn chưa có một nhóm, sự sẵn có của các kỹ năng trên thị trường.

Bên cạnh đó, tôi không thực sự hiểu việc quyết định sử dụng C / C ++ dựa trên hiệu suất (chỉ) vì nhiều ngôn ngữ kịch bản có thể mở rộng với C / C ++. Bạn nhận được lợi ích của một ngôn ngữ phát triển nhanh chóng cùng với khả năng di chuyển các phần chậm vào các phần mở rộng C / C ++. Chắc chắn nếu hệ thống làm việc của bạn lập trình trong đó mọi op đều có thể hiểu được, nhưng trong hầu hết các phát triển ứng dụng, tôi không hiểu điều đó.


2
Sự quen thuộc là lý do số 1 và tôi ngạc nhiên khi bạn là người đầu tiên đề cập đến nó.
Paul Butcher

4

C ++ vs Python vs Perl không thể được đánh giá dễ dàng. Nó phụ thuộc vào dự án và yêu cầu.

C ++ có một kho tiện ích từ lâu, chạy trên nhiều nền tảng. Nhưng thật đau đớn khi bắt đầu đi bộ qua các luồng chỉ để chuyển String sang Integer và đảo ngược.

C ++, mặt khác, có một thỏa thuận khủng khiếp với sự phụ thuộc vào các thư viện. Khi bạn biên dịch một cái gì đó trong GCC X hoặc VC ++ Y, thì bạn không thể tin rằng mã sẽ được chạy bởi phiên bản tiếp theo của các công cụ đó. Địa ngục tương tự trên Windows, địa ngục tương tự cũng trên Unix.

Perl, lấy sức mạnh từ thế giới Unix nhưng đặc biệt là một công cụ biểu thức thông thường. Đây là những gì nó được sử dụng hầu hết thời gian. Cùng với một số công cụ khá nghiêm trọng mà ngay cả Java cũng không thể làm điều đó theo cách thông thường (kiểm tra cách tải tệp lên máy chủ web), Perl là "chỉ cần làm điều đó".

Python là ngôn ngữ dễ dàng, linh hoạt và năng động. Dễ dàng đến mức bạn có thể gửi một số nguyên cho một hàm, tập lệnh mong đợi chuỗi, nhưng bạn có thể có kết quả! Mặc dù bất ngờ, nhưng một kết quả. Vì vậy, nó lập trình viên cần phải rất thận trọng. IDLE cung cấp một số gỡ lỗi, nhưng khi bạn đã chuyển sang hệ thống ĐIỆN THOẠI hoặc SSH ở ba cấp độ và bạn muốn tìm ra vấn đề của mình, trình gỡ lỗi sẽ không ở đó để đứng bên cạnh bạn. Nhưng, nó có thể làm một số công việc toán học tuyệt vời nhanh chóng.

Java là một hệ sinh thái gồm các từ thông dụng, các công nghệ xa lạ và các từ lớn và khi bạn chỉ muốn tải một tệp lên máy chủ web, bạn thấy rằng bạn chỉ có thể làm điều đó nếu máy chủ có JSP . Nếu bạn muốn gọi các thư viện hệ thống hoặc các chức năng hệ thống như giám sát, bạn thấy rằng bạn phải khai thác rất nhiều. Và có lẽ để đạt được JNI và OK ... bạn nghĩ sau đó ... "Tại sao, Chúa?"

Ngoài ra, Java là một công cụ tuyệt vời cho các bộ kinh doanh và đa luồng, tôi thích nó rất nhiều.

Nhanh chóng thực hiện một chương trình và hiển thị với CV của bạn "Ồ, tôi cũng biết công nghệ đó" và ông chủ muốn trở thành của bạn, thật ngạc nhiên! Mặc dù, công nghệ có thể không cần thiết ... (OK, thưa các bạn, tôi ghét Spring Framework ....)


1
than ôi, bạn phải xem xét rằng Python có phụ thuộc phiên bản - đặc biệt là khi bạn di chuyển sang Python 3, tương tự với perl .. hoặc có ai bận tâm chuyển sang Perl 6 chưa? Mọi thứ đều có sự phụ thuộc khó chịu :(
gbjbaanb

3

Điều cần lưu ý trong khi chọn ngôn ngữ là bạn sẽ nhận được lợi ích gì từ việc sử dụng ngôn ngữ đó và mất bao lâu để có được ngôn ngữ đó.

Ý tưởng chính giữa các ngôn ngữ như python và perl là làm nhiều hơn với thời gian ít người hơn, nhưng với thời gian cpu nhiều hơn. Trong thực tế, bạn sẽ dành nhiều thời gian hơn để mã hóa một tập lệnh python hoặc perl so với nó sẽ được thực thi, nhưng bạn hiểu ý tôi.

Ưu điểm của C / C ++ là chúng nhanh, nhưng với chi phí cú pháp và gõ mạnh: bạn phải tự làm rất nhiều việc để máy tính không phải chọn nó trong thời gian biên dịch.

Khi bạn tạo mã, một số dòng sẽ được chạy nhiều hơn các dòng khác và những dòng đó là vấn đề gây ra vấn đề. Mặt khác, tất cả các phần còn lại của mã, mã mà bạn đã dành nhiều thời gian trên, được thực thi ít thường xuyên hơn nhiều. Bạn có thể đã nghe thấy nó, nhưng đó là quy tắc 80/20 khét tiếng và bạn sẽ không thể bỏ qua quy tắc đó.

Giải pháp cho vấn đề này, là sử dụng một ngôn ngữ dễ dàng hơn (bằng cách dễ dàng hơn tôi có nghĩa là thân thiện với nhà phát triển hơn: ít gõ hơn, diễn giải lười biếng, nhiều thói quen và công cụ có sẵn, v.v.) để làm tất cả mã của bạn.

Bạn sẽ làm điều đó rất nhanh so với nếu bạn đã làm nó với C hoặc C ++, nó sẽ khiến bạn bị đau não nhiều hơn.

Chương trình của bạn sẽ chậm, nhưng với một trình lược tả, bạn tách phần được chạy 80% thời gian và bạn thực hiện chúng với C hoặc C ++.

Bằng cách prorgamming theo cách này, bạn đã tiết kiệm được rất nhiều thời gian và chương trình của bạn hiệu quả, nhanh như vậy, có ít cơ hội rò rỉ bộ nhớ hơn và bạn tiết kiệm được thời gian.

Các ngôn ngữ script được thiết kế để đứng về phía nhà phát triển, nhưng vẫn có thể tối ưu hóa. Tất nhiên bạn có thể là một pháp sư mẫu thiết kế hoặc một voodoo STL hoặc thậm chí là một chiến binh lisp, và có thể là một tu sĩ haskell. Nhưng ngôn ngữ khiến chúng ta nói chuyện với máy tính, ngôn ngữ không được tạo ra để chúng ta trở thành máy tính!



2

C ++ tôi sử dụng được gọi là C với các lớp!


8
Hoan hô, bạn đã sử dụng từ khóa 'lớp'. Bây giờ bạn đã hiểu thiết kế OO!
dss539

C ++ của tôi được gọi là C với không gian tên.
jsz

6
C ++ của tôi được gọi là, umm .. C ++ của Manoj.
Manoj R

+1 Lớp học là lý do duy nhất tại sao tôi sử dụng C ++.
mbq

... ok, cũng có ngoại lệ.
mbq

0

Thực sự có một câu trả lời duy nhất cho tất cả các câu hỏi được hình thành như thế này. Lý do tốt nhất để sử dụng tech X thay vì tech Y (trong đó X và Y gần như ở cùng cấp độ [giống như tất cả các ngôn ngữ lập trình đương đại]) là vì bạn đã biết X và không biết Y.

(nhưng sau khi Haskell đến, không có lý do gì để sử dụng bất cứ thứ gì khác)


0

Không hoàn toàn không. Nếu bạn không cần hiệu suất và có một thư viện bạn có thể sử dụng ngôn ngữ khác thì đừng bận tâm với C / C ++. Ngày nay tôi chỉ làm điều đó khi tôi nhắm mục tiêu các hệ thống nhúng không thể (dễ dàng?) Chạy các ngôn ngữ. Đôi khi tôi sử dụng C vì tôi đang viết một plugin nhưng thực sự không có.

Tuy nhiên, tôi sẽ không sử dụng Python, Perl, v.v. để tránh sử dụng C. Sở thích của tôi thực sự là C #, vì tôi thích một thư viện tốt (vốn là thế mạnh của .NET) và tôi thích các ngôn ngữ được nhập tĩnh. Boo là một lựa chọn tốt. Nhưng thực sự Haskell , OCaml , D , ML và như vậy đều ổn.


7
Bạn đã bỏ lỡ điểm.
Matt Joiner

@Matt Joiner: Tôi chắc chắn là tôi không có. Tôi đã bỏ lỡ cái gì?

Câu hỏi là về việc không sử dụng C ++.
Matt Joiner

@Matt Joiner: hmm, trên một cái nhìn khác tôi có thể thấy rằng đang được hỏi. Nhưng có vẻ như tôi cũng đã trả lời như vậy (tôi nói đừng bận tâm và các lựa chọn thay thế tôi sử dụng)

Tôi gần như muốn hạ thấp điều này vì C # ...
Vreality
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.