Tại sao ngành công nghiệp chuyển từ C sang C ++? [đóng cửa]


19

Trước hết tôi muốn có một câu trả lời thực sự, tôi luôn cố gắng kiếm được nhiều hơn từ nhiều nguồn và bài viết khác nhau, và khi tôi đọc những thứ như C ++ thì chậm vì nó có chức năng ảo và vì C này tốt hơn , tôi thực sự không biết nói gì và nghĩ như một con người với bộ não. Vì vậy, xin vui lòng tránh để đạt đến cấp độ này trong câu trả lời của bạn.

Câu hỏi của tôi là về một sự chuyển đổi lớn sang C ++ đã được hoàn thành, ít nhiều, với Doom 3.

Điều thú vị đối với tôi là trước cột mốc này, hầu hết các công cụ trò chơi và bản thân trò chơi đều được viết bằng C, giống như từ thời Quake . Thật thú vị khi lưu ý rằng phần mềm ID quyết định viết lại hoàn toàn cơ sở mã cho IdTech 4 trong C ++, một số lượng lớn công việc mà tôi không thể hiểu được nếu không có danh sách lý do thực sự tốt.

Tôi đang tập trung vào Doom 3 vì tôi chủ yếu quan tâm đến thế giới OpenGL và trong hành trình của mình, tôi cố gắng tập trung vào chủ đề này, vì vậy tôi đã đọc rất nhiều về điều này, nhưng tôi nghĩ rằng một câu hỏi như thế có thể là API kết xuất -không có quá nhiều vấn đề.

Tại sao tại một thời điểm nhất định, ngành công nghiệp chuyển đổi ồ ạt sang C ++? Các lý do cho sự lựa chọn mà ID đã thực hiện là gì?

Điều cuối cùng mà tôi muốn nói là ngôn ngữ C đơn giản hơn nhiều để thực hiện và cung cấp số lượng tính năng ít hơn, vì điều này ít có cơ hội bị "phân mảnh" thành các phần không giống như C ++ thực sự thường làm. Nói một cách đơn giản, tôi có nhiều cơ hội hơn để tìm một trình biên dịch C thực sự tốt hơn là một trình biên dịch C ++ tốt với tất cả các tính năng được triển khai theo cách tốt.

Ví dụ, NDK cho Android vẫn không hỗ trợ C ++ tốt (với bản phát hành r8b) với tất cả các tính năng mới nhất và tốt nhất, và đó là bộ công cụ gốc dành cho HĐH di động phổ biến nhất trên thế giới!

Nếu tôi đã viết mã của mình trong một C ++ hiện đại, có lẽ tôi sẽ bị đau bây giờ vì một trong những hệ điều hành phổ biến nhất trên thế giới sẽ vượt quá giới hạn đối với tôi. Và giống như Android, nhiều trình biên dịch khác không phải là tuyệt vời.

Tôi có nên viết mã C ++ liên quan đến phiên bản C ++ đã cũ 2-3 không?


1
Tôi nghi ngờ rằng C ++ là một phần mở rộng gần như của C. Mọi người bắt đầu viết C với các tính năng C ++ như std :: vector, từ đó trên C ++ đã được dạy thay vì C và do đó mọi người bắt đầu viết C ++ hoàn toàn.
API-Beast

1
Chà, C so với C ++ khi phát triển một ứng dụng lớn ? OOP là một mô hình tuyệt vời và .. C ++ hỗ trợ nó. Nếu bạn sẽ viết một trò chơi bằng C, thì hãy xem xét thiết kế hướng dữ liệu . Mặt khác, hãy suy nghĩ về lý do tại sao tất cả các công ty lớn trong ngành hiện tại sử dụng C ++. Kỹ thuật phần mềm, có thể là cho các ứng dụng tài chính hoặc giải trí, đi sâu vào vai của mô hình OOP và của các mẫu kiến ​​trúc và thiết kế. Nói một cách đơn giản, C không thể đưa ra bức tranh lớn mà sự đóng gói mang lại cho bạn. Có phần mềm lớn hiện đại nào được viết bằng C không? Có thể hạt nhân và hệ thống nhúng.
teodron

@teodron 1) Tôi phải tạo ra một công cụ thực thi tốt, tôi quan tâm đến ngôn ngữ như tôi quan tâm đến một tài sản quan trọng, nhưng đó không phải là tất cả và đó không phải là thứ tôi bán 2) đóng gói nó không tốt cho hiệu suất, nếu ai đó muốn thuyết phục tôi rời khỏi thế giới C ++, đóng gói là một trong những chủ đề tốt cho việc này.
dùng827992

3
" Điều thú vị đối với tôi là trước cột mốc này, hầu hết các công cụ trò chơi và bản thân trò chơi đều được viết bằng C, giống như từ thời Quake. " Tôi muốn xem một số bằng chứng cho điều đó. Bên cạnh các công cụ nguồn mở của phần mềm Id. Họ không phải là toàn bộ ngành công nghiệp trò chơi điện tử.
Nicol Bolas

@NicolBolas tôi đã giải thích lý do tại sao tôi nói về ID, xin vui lòng hiểu ý nghĩa của toàn bộ câu hỏi.
dùng827992

Câu trả lời:


28

C ++ làm mọi thứ C làm. Bạn có thể trộn C và C ++ một cách tầm thường trong trường hợp lợi thế của C vượt trội so với C ++. Đây là một quyết định thiết kế rất có chủ ý của C ++.

C ++ làm những việc mà C không làm. Điều này bao gồm đa hình dễ dàng, nhưng cũng dễ dàng biên dịch tạo mã thời gian thông qua các mẫu. Điều này thực sự tiện dụng cho những thứ như container, điểm yếu lớn nhất của C. Nó cũng cho phép các loại giống như con trỏ do người dùng xác định (tay cầm thông minh) giúp tiết kiệm nhiều thời gian, cũng như các loại giống như nguyên thủy do người dùng định nghĩa như vectơ và ma trận có hỗ trợ toán tử (cũng tiết kiệm nhiều thời gian).

Các chức năng ảo chậm hơn các chức năng không ảo. Tuy nhiên, bạn phải chọn tham gia các chức năng ảo và một lập trình viên có năng lực chỉ làm như vậy khi chúng có lợi. Các lập trình viên C có các con trỏ hàm và thường lưu trữ các bộ sưu tập của những người trong cấu trúc được tham chiếu bởi các cấu trúc khác; nói cách khác, họ trải qua công việc làm thêm để tạo lại chính xác điều tương tự như các bảng chức năng ảo. Trong trường hợp chỉ cần một con trỏ hàm duy nhất và không cần bảng, C ++ vẫn hoàn toàn cho phép điều đó và tương đương với C. Với trình biên dịch hiện đại, C ++ chỉ chậm hơn C trong các trường hợp cụ thể mà lập trình viên chọn tham gia vào một tính năng . Ngoài ra, chi phí hoạt động ảo trong thực tế là rất nhỏ trên CPU modem. Phần cứng ngày nay được thiết kế cho các kiểu sử dụng của C ++ và thậm chí ngày càng được thiết kế cho các nhu cầu của ngôn ngữ được giải thích ở mức độ cao.

Các ngoại lệ C ++ trong lịch sử áp đặt rất nhiều chi phí, làm cho C ++ chậm hơn ngay cả khi bạn không sử dụng chúng. Các ngoại lệ là một điều khủng khiếp khi thêm vào C ++, nếu không vì lý do nào khác ngoài sự gia tăng to lớn về độ phức tạp liên quan đến việc viết mã an toàn ngoại lệ, và trên thực tế, một số thiết kế container thực sự không thể tạo ra ngoại lệ an toàn. Các lập trình viên trò chơi thường bỏ qua sự tồn tại của ngoại lệ và thậm chí vô hiệu hóa chúng trên trình biên dịch. Trình biên dịch hiện đại có ngoại lệ không chi phí (nghĩa là bạn chỉ phải trả chi phí cho chúng khi bạn thực sự sử dụng chúng).

C đơn giản hơn để tìm hiểu tất cả các quy tắc của. C ++ là một ngôn ngữ rất lớn, phức tạp. C ++ cho phép viết mã cấp cao hơn, tạo ra các API dễ dàng và đơn giản hơn. Một số người muốn hiểu ngôn ngữ dễ dàng hơn, một số người muốn viết mã nâng cao dễ dàng hơn. Đó là một sự đánh đổi giữa sự đơn giản để hiểu trình biên dịch đang làm gì với một đoạn mã cụ thể so với sự đơn giản của việc viết các ứng dụng liên kết phức tạp lớn. Một số người coi trọng cái này hơn cái kia, vì nhiều lý do.

Cuối cùng, C ++ là một siêu sao của C. Theo tôi, không có một lập trình viên C ++ có năng lực cao , người cũng không phải là một lập trình viên C có thể vượt qua (mặc dù có rất nhiều lập trình viên C ++ nằm dưới thanh của tôi bị mất trong C). Trong khi C ++ thêm các phương tiện để cách ly lập trình viên khỏi phần lớn C, mã C ++ không tầm thường thường cần sử dụng C để hoàn thành công việc. Đây là một trong những khác biệt chính giữa C ++ và Java và C #. Rốt cuộc, có một lý do mà bạn thường thấy "C / C ++" gộp lại với nhau.

Niềm tin cá nhân của tôi - được chia sẻ với hầu hết các chuyên gia trong ngành trò chơi khác mà tôi đã tương tác - là tính biểu cảm nâng cao và các phương tiện lập trình cấp cao của C ++ vượt xa sự phức tạp của ngôn ngữ so với C và hầu hết các ngôn ngữ khác thường xuyên tuyên bố chống C ++ được đưa ra chỉ đơn giản là lỗi thời với công nghệ ngày nay.


19
"Không có cái nào giống như một lập trình viên C ++ có năng lực mà cũng không phải là một lập trình viên C có thẩm quyền" Tôi hoàn toàn không đồng ý với tuyên bố này. Thành ngữ C rất khác với thành ngữ C ++. Hai kiểu đã phân kỳ, một kiểu nhấn mạnh các con trỏ mờ và hàm tĩnh, kiểu kia sử dụng đóng gói dựa trên ngôn ngữ và vv. Một người chỉ biết C ++ thành ngữ sẽ có khả năng về C ++, nhưng vẫn bị nhầm lẫn bởi thành ngữ C.
Nicol Bolas

Tôi không đồng ý rằng bạn có thể thành thạo C ++ và chỉ biết "C ++ thành ngữ". Các phần cứng của C ++ là các phần cứng giống nhau của C (các mẫu cộng). Nếu một lập trình viên C ++ bị nhầm lẫn bởi các hàm độc lập, các cấu trúc đơn giản và các con trỏ thô hoặc mờ, thì anh ta chưa viết bất kỳ mã C ++ không tầm thường nào trong bất kỳ kịch bản phi học thuật nào trong thế giới thực. Tôi đã đi xa hơn khi tranh luận rằng bất cứ ai chỉ thành thạo "thành ngữ" bất cứ điều gì vẫn chưa đạt được năng lực.
Sean Middleditch

3
"Thành ngữ" là một cách khác để nói "thoải mái", mà ngoài việc là người thân của họ cũng có nghĩa là, gần như theo định nghĩa, một khu vực không thoải mái của ngôn ngữ mà một lập trình viên C ++ có năng lực khác sẽ không thành thạo. (Tôi không nhất thiết nghĩ rằng điều đó có nghĩa là họ "bối rối" bởi những yếu tố đó, chỉ đơn thuần là họ không thoải mái hoặc không thông thạo chúng.) Và, ở một mức độ nào đó, những người học C ++ thành ngữ được dạy là không thoải mái chỉ nhìn thoáng qua một con trỏ thô. Vì vậy, tôi không nghĩ rằng một lập trình viên C ++ có thẩm quyền ngụ ý một lập trình viên C có thẩm quyền.
John Calsbeek

Nói cách khác, chắc chắn có một lĩnh vực C ++ cấp cao hơn mà bạn hoàn toàn có thể tránh sử dụng bất kỳ tính năng cấp thấp nào sẽ được yêu cầu để viết bất kỳ mã C nghiêm trọng nào. Tôi chắc chắn rằng hầu hết các cơ sở mã phi học thuật trong thế giới thực không ở hoàn toàn trong vương quốc này, nhưng tôi nghi ngờ bạn có thể tìm thấy một người chỉ thoải mái với lĩnh vực này và vẫn gọi họ là "có thẩm quyền". Tất nhiên, bạn sẽ không so sánh một người như vậy với một lập trình viên C, bạn sẽ so sánh họ với một người lập trình bằng bất kỳ ngôn ngữ cấp cao nào khác.
John Calsbeek

1
@DanielCarlsson: Đủ công bằng, tôi chỉ là người phạm tội. Lấy làm tiếc. Mặc dù vậy, ... C ++ không làm bất cứ điều gì khiến việc tối ưu hóa khó hơn C. :) Ý tôi là, chắc chắn, nếu bạn sử dụng STL thì bạn bị giới hạn ở những gì STL làm, nhưng phần lớn lý do tại sao chúng tôi sử dụng C ++ thay vì C # hoặc Java là vì chúng tôi chỉ có thể thực hiện lại toàn bộ STL hoặc sử dụng mảng thô hoặc thậm chí quay trong trình biên dịch nội tuyến hoặc phần mở rộng ngôn ngữ (như nội tại SSE), v.v.
Sean Middleditch

12

Tại sao tại một thời điểm nhất định, ngành công nghiệp chuyển đổi ồ ạt sang C ++? Các lý do cho sự lựa chọn mà ID đã thực hiện là gì?

Phần mềm Id không phải là "ngành công nghiệp". Họ là một công ty. Trong khi họ có thể có ảnh hưởng, họ không phải là tất cả mọi người.

Tôi đã làm việc trên một vài công cụ trò chơi có từ năm 1999 và họ đã sử dụng C ++.

Những lý do chính cho việc áp dụng C ++ "trong khoảng thời gian đó" là:

  1. Nó đã được chuẩn hóa . C ++ 98 được đặt tên là bởi vì nó được phát hành dưới dạng tiêu chuẩn ISO vào năm 1998. Cho đến lúc đó, có nhiều phương ngữ của C ++ mà không có ý tưởng rõ ràng là "thực" hay "chính xác". Khi nó được chuẩn hóa và trình biên dịch bắt đầu thực hiện tiêu chuẩn, các nhà phát triển trò chơi có thể dựa vào tiêu chuẩn thực tế.

  2. Hãy nhớ lại câu nói đùa cũ: Một anh chàng bước vào văn phòng bác sĩ và nói: "Thật đau khi tôi giơ tay như thế này." Vì vậy, bác sĩ nói, "Vì vậy, đừng giơ cánh tay của bạn như thế."

    Nếu các chức năng ảo chậm cho nhu cầu của bạn, C ++ không bắt buộc bạn phải sử dụng chúng. Mọi thứ trong C ++ đều được chọn tham gia. Bạn chọn sử dụng từng tính năng cụ thể. Nếu bạn đang ở trong mã quan trọng về hiệu suất và bạn không muốn chi phí ảo, bạn không sử dụng các chức năng ảo. Giống như nếu bạn đang ở trong mã quan trọng về hiệu năng trong C, bạn không sử dụng các con trỏ hàm.

    Thật vậy, điều này dẫn đến rất nhiều game C ++ không phải là C ++ thành ngữ (ít nhất, không phải là C ++ thành ngữ hiện đại ), mà chỉ là "C với các lớp". Và đây là một cách hoàn hảo về chức năng để lập trình C ++. Chết tiệt, chỉ cần có thể không phải gõ typedef structkhi bạn tạo một loại mới là một lợi ích.

    C ++ là một túi lớn các tính năng và bạn có thể chọn những tính năng bạn muốn.

Ví dụ, NDK cho Android vẫn không hỗ trợ C ++ tốt (với bản phát hành r8b) với tất cả các tính năng mới nhất và tốt nhất, và đó là bộ công cụ gốc dành cho HĐH di động phổ biến nhất trên thế giới!

Điểm của bạn đang được? Google hầu như không chấp nhận những người sử dụng NDK; rõ ràng là họ muốn mọi người sử dụng Java. Lý do duy nhất NDK tồn tại là vì có một số nhà phát triển quan trọng nhất định sẽ không sử dụng nền tảng mà không có nó. Do đó, NDK tồn tại để phục vụ họ và nhu cầu tính năng của họ.

Có, C ++ là một đặc tả lớn hơn, phức tạp hơn để thực hiện. Java cũng vậy. Vì vậy, bất kỳ ngôn ngữ nào ngoại trừ C.

Ngoài ra, ý của bạn là "tất cả các tính năng mới nhất và lớn nhất" là gì? Nếu bạn đang nói về công cụ C ++ 11, tốt, không ai thực hiện đầy đủ điều đó. Thông số kỹ thuật bây giờ chỉ mới một năm tuổi. Ngoài ra, tôi cũng không biết nếu NDK hỗ trợ C11; có, C cũng có "các tính năng mới nhất và tốt nhất" không được hỗ trợ ở mọi nơi.

Điều này mang đến một điểm quan trọng: nếu bạn muốn ứng dụng Pure-C của mình biên dịch trên Visual Studio, thì nó cần phải tuân theo C89, và không có gì cao hơn thế. Vì vậy, phân mảnh với C đã tồn tại. Một số nền tảng chỉ hỗ trợ C89. Một số hỗ trợ C99. Một số hỗ trợ C11, ở mức độ khác nhau. V.v.

Nếu bạn muốn sử dụng C, sau đó sử dụng C . Việc người khác không đưa ra lựa chọn đó không có nghĩa là lựa chọn của bạn sai hoặc lựa chọn của họ sai. Bạn không cần phải tự biện minh cho họ và họ không cần phải tự biện minh cho bạn.


2
Tôi không nghĩ rằng Google hầu như không chấp nhận những người sử dụng NDK vì sự phát triển của NDK đang diễn ra và có một số bản phát hành có sẵn cho Android, ngay cả khi Google ghét C / C ++, tôi không nghĩ rằng mình có thể đạt được Một mức độ hiệu năng tốt cho trò chơi của tôi trong Java hoặc những người chơi quan trọng nhất trên thị trường có thể viết lại mã của họ chỉ cho java và Android, Có lẽ đó là một điều ác cần thiết đối với Google, tôi không biết, quan điểm của tôi là hỏi về một phạm vi rộng xem và không phải là một câu hỏi khập khiễng về C vs C ++ so với Java so với thế giới, tôi đang tìm kiếm một câu trả lời khái quát hơn từ ngôn ngữ tiếp tục
user827992

với trình biên dịch xem xét tất cả các tính năng ngôn ngữ, câu trả lời của bạn cũng cho phép tôi nhấn mạnh điểm ban đầu của tôi về tính khả dụng của trình biên dịch C trên thị trường, trên Windows tôi có hầu hết tất cả các nhà phần mềm sản xuất trình biên dịch với trình biên dịch riêng, tôi cũng có các tùy chọn miễn phí khác như MinGW. Vấn đề thực sự mà tôi gặp phải với C là thiếu hỗ trợ riêng cho cấu trúc dữ liệu, các thùng chứa, trong C ++, bạn có thể biết được chi phí cho một container cụ thể hoặc một tuyên bố cụ thể là bao nhiêu
user827992

Trong C có lẽ mã thực hiện điều tương tự có nhiều hơn 1 lần thực hiện, trong C ++, trình biên dịch có thể tối ưu hóa nhiều hơn do hậu quả của việc này. Tôi có lẽ nên học C ++ nhiều hơn nhưng tôi nghĩ rằng tôi sẽ chuyển sang C ++ chỉ để hỗ trợ tốt cho một số tính năng cụ thể, không phải cho ngôn ngữ.
dùng827992

7

Thật thú vị khi lưu ý rằng phần mềm ID quyết định viết lại hoàn toàn cơ sở mã cho IdTech 4 trong C ++, một số lượng lớn công việc mà tôi không thể hiểu được nếu không có danh sách lý do thực sự tốt.

Việc họ viết lại gần như toàn bộ công cụ cho mỗi lần phát hành là điều phổ biến (ít nhất là cho đến gần đây - tôi không biết nhiều về vài trò chơi gần đây), và vì C ++ đang ngày càng phổ biến nên sử dụng nó thay vì gắn bó với C. Theo thời gian, ngày càng ít người có khả năng với C.

Tại sao tại một thời điểm nhất định, ngành công nghiệp chuyển đổi ồ ạt sang C ++?

Bởi vì nó cung cấp cho bạn rất nhiều chức năng cấp cao hơn trong khi gần như hoàn toàn tương thích ngược với mã C.

Các lý do cho sự lựa chọn mà ID đã thực hiện là gì?

Google sẽ trả lời điều này cho bạn: http://fabiensanglard.net/doom3/interviews.php

"... một nửa số lập trình viên thực sự có nền tảng C ++ ngay từ đầu. Tôi đã có nền tảng C và Objective-C, và tôi đã" trượt vào C ++ "bằng cách chỉ nhìn vào mã mà các chàng trai C ++ đang viết. Nhìn nhận lại, tôi ước gì tôi đã dành ngân sách thời gian để nghiên cứu kỹ lưỡng và khám phá ngôn ngữ trước khi bắt đầu sử dụng nó.

Bạn vẫn có thể nói rằng mã kết xuất được phát triển phần lớn trong C, sau đó sắp xếp vào C ++.

Hôm nay, tôi tin chắc rằng C ++ là ngôn ngữ phù hợp cho các dự án lớn, nhiều nhà phát triển với các yêu cầu hiệu suất quan trọng và Tech 5 tốt hơn rất nhiều cho trải nghiệm Doom 3. "

Nếu tôi đã viết mã của mình trong một C ++ hiện đại, có lẽ tôi sẽ bị đau bây giờ vì một trong những hệ điều hành phổ biến nhất trên thế giới sẽ vượt quá giới hạn đối với tôi.

  1. Các lập trình viên không thể nhìn vào tương lai. Họ sẽ không biết rằng sẽ có một nền tảng mới với sự hỗ trợ C ++ kém. Android đã không tồn tại đúng cho đến năm 2009. Doom 3 là từ năm 2004.
  2. Bạn có nghĩ rằng các lập trình viên đang viết các trò chơi 3D tiên tiến cho PC và máy chơi game cũng mong mã của họ chạy trên điện thoại không? Nhằm mục đích cho mức độ di động đó là rất hiếm và thường là vô nghĩa do sự khác biệt lớn về sức mạnh có sẵn.

Tôi có nên viết mã C ++ liên quan đến phiên bản C ++ đã cũ 2-3 không?

Tại sao bạn quan tâm đến điều này? Đừng để bị mắc kẹt theo đuổi điều mới nhất. Nếu nó đủ tốt 5 năm trước, nó sẽ không đột nhiên trở nên tồi tệ hơn bây giờ.


3

Chà, C ++ đã ra mắt từ những năm 80 nên nếu một trình biên dịch không hỗ trợ nó, có lẽ bạn nên sử dụng một trình biên dịch khác. Ngoài ra, C ++ không thực sự chậm hơn C. Nó thực sự chỉ chậm hơn nếu bạn tải nó xuống với các hàm ảo và các khái niệm trừu tượng khác. Tuy nhiên, C ++ được sử dụng rất nhiều ngày nay trong thế giới không unix vì tính linh hoạt và các tính năng mới hơn mà C không có. Viết mã mô-đun trong C ++ dễ dàng hơn nhiều so với làm bằng C và giúp bạn viết mã di động hơn. Quay lại chủ đề của trình biên dịch, tôi không biết bất kỳ trình biên dịch nào không hỗ trợ C ++ (có thể không hoàn toàn là C ++ 11, nhưng bất kỳ trình biên dịch nào cũng nên hỗ trợ C ++).

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.