Bạn sẽ sử dụng C, ngày hôm nay, cho một dự án phần mềm? [đóng cửa]


18

Nếu có, bạn sẽ sử dụng nó ở đâu và tại sao?

Nếu không, vui lòng cung cấp giải thích lý do tại sao C không được bạn chấp nhận.


10
Tất nhiên, có những ứng dụng mà C là lựa chọn đúng đắn và rõ ràng, nhưng cá nhân tôi, nếu tôi không bao giờ mua một khối bộ nhớ nữa, tôi sẽ chết hạnh phúc.
Adam Crossland

Có- Ngựa cho các khóa học.
Martijn Verburg

Điều đó nghĩa là gì?
Luca Matteis

Đó là một câu nói cũ cho những người theo dõi đua ngựa. Về cơ bản, điều đó có nghĩa là bất kỳ con Ngựa nào cũng có thể giành chiến thắng trong ngày của mình, miễn là Khóa học (Khô, Bùn, Dài, Ngắn, bất cứ thứ gì) phù hợp với nó. Các ngôn ngữ lập trình cũng vậy - nó luôn phụ thuộc vào ngữ cảnh và miền vấn đề.
Martijn Verburg

2
Không, nhưng chỉ vì hôm nay tôi không làm việc với bất kỳ dự án nào mà C sẽ là một lựa chọn ngôn ngữ tốt. Hỏi lại tôi vào ngày mai.
James McNellis

Câu trả lời:


38

C là một ngôn ngữ tuyệt vời để lập trình hệ thống

Tôi sẽ sử dụng C nếu tôi triển khai một số trình điều khiển phần mềm. Và tôi sẽ sử dụng C nếu tôi triển khai kernel Hệ điều hành hoặc Máy ảo của riêng tôi.

Đó là một ngôn ngữ rất tốt để làm những việc ở cấp độ thấp nếu bạn phải xử lý các API hệ điều hành phần cứng hoặc cấp thấp cho API Windows, Linux, Mac OS X, Solaris, v.v ... Các hệ thống nhúng thường hỗ trợ tốt cho C với một trình biên dịch + bộ phát triển.


4
Bạn có thể chỉ ra nơi "Mac OS là linux" không? Tôi nghĩ Mac OS là Darwin: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammer

1
@Stephen Furlani: LOL - vâng, đó là một cách nói nhẹ nhàng. :-) Có rất nhiều Unice chết như Xenix, DYNIX và A / UX, và các phiên bản hiện tại hầu hết chúng ta không thấy giống như HP-UX. Cây gia đình phức tạp và rối như của các gia đình hoàng gia châu Âu.
Bob Murphy

4
C là một ngôn ngữ khủng khiếp cho lập trình hệ thống. Chúng tôi đã biết rằng trong hơn 20 năm, kể từ khi Worm Morris và bất kỳ ai vẫn sử dụng nó cho bất kỳ dự án nào với bất kỳ yêu cầu bảo mật nào, đặc biệt là các hệ điều hành hoặc ứng dụng đối mặt với mạng, phải đối mặt với cáo buộc sơ suất hình sự.
Mason Wheeler

2
@Mason Wheeler: Thay vào đó chúng ta nên sử dụng cái gì?
Steve S

1
@Mason Wheeler: Hmm ... Tôi đã loại bỏ Pascal trong quá khứ, nhưng có lẽ đã đến lúc phải có một cái nhìn khác (gần hơn). bạn có ý kiến ​​khác?
Steve S

17

Phải, tất nhiên. Tôi sẽ sử dụng C để viết các phần quan trọng của hệ thống hoặc các phần giao tiếp cấp thấp. Ví dụ, tôi sẽ sử dụng C để viết NIF trong dự án Erlang chỉ vì nó là Công cụ phù hợp (tm) cho loại công việc này. Hoặc tôi sẽ sử dụng C để viết các phần tương tự (XS) trong dự án Perl.


16

Tôi sử dụng C chuyên nghiệp, gần như mỗi ngày. Trong thực tế, C là ngôn ngữ cấp cao nhất mà tôi thường xuyên lập trình.

Nơi tôi sử dụng C: Tôi viết mã thư viện cấp thấp có yêu cầu phải hiệu quả nhất có thể. Mã keo của tôi được viết bằng C, các vòng tính toán bên trong được viết bằng cách lắp ráp.

Tại sao tôi sử dụng C: Việc xử lý các cấu trúc đối số phức tạp và các điều kiện lỗi phức tạp hơn nhiều so với khi lắp ráp và chi phí hiệu năng cho loại kiểm tra điều kiện đó trước khi bắt đầu tính toán thực thường không đáng kể. Vì C là một ngôn ngữ đơn giản, được chỉ định rõ ràng, tôi có một thời gian dễ dàng làm việc với nhóm trình biên dịch để cải thiện việc tạo mã bất cứ khi nào tôi thấy mã được biên dịch với các mối nguy hiệu năng không thể chấp nhận được.

Tính di động là một ưu điểm tuyệt vời khác của C. Mã keo của tôi được chia sẻ trên nhiều triển khai phần cứng dành riêng cho các thư viện tôi làm việc, điều này thực sự đơn giản hóa việc hỗ trợ cho các nền tảng mới. Hầu hết các nền tảng không có máy ảo hoặc trình thông dịch cho hương vị ngôn ngữ của tháng. Một số nền tảng không có trình biên dịch C ++ tốt. Có rất ít nền tảng thiếu trình biên dịch C có thể sử dụng được (và, vì tôi có mối quan hệ làm việc tốt với nhóm trình biên dịch của chúng tôi, tôi thường không gặp khó khăn khi nhận được sự hỗ trợ tôi cần).


6
Âm thanh như bạn có một công việc thực sự thú vị!
Paul Nathan

Đây là công việc mơ ước của tôi.
rsmahanti

5

Có, tôi sẽ sử dụng C trong một hệ thống nhúng bị hạn chế tài nguyên nghiêm trọng. Tôi có thể sử dụng C ++ thay vì vì nó giúp dễ dàng quảng bá các giao diện mạnh giữa các thành phần phần mềm, nhưng chỉ khi tất cả các kỹ sư làm việc trong dự án hiểu rằng C ++ dễ bị lạm dụng dẫn đến phình to kích thước mã (các hàm và mẫu ảo là ví dụ về những điều cần tránh ).

Tôi cũng thấy một lập trình viên C ++ đang cố gắng tạo một đối tượng 10K trên ngăn xếp 1K, không phải là một ý tưởng hay.


2
thực tế các virtualchức năng đều ổn vì chúng tuân theo nguyên tắc "bạn không trả tiền cho những gì bạn không sử dụng", nhưng trong môi trường bị hạn chế về bộ nhớ, bạn có thể muốn vô hiệu hóa các ngoại lệ và RTTI.
Matthieu M.

Tôi cảm thấy như tôi luôn luôn tạo các đối tượng đơn lẻ trong C ++ để cung cấp các giao diện ngoại vi. Tôi nghĩ mọi người chọn C ++ hơn C trong các hệ thống nhúng vì họ nghĩ C ++ là "tốt hơn".
Erik

5

Tôi làm việc chủ yếu với Xen hypanneror, các thư viện các loại mà nó có và nhân Linux. Thỉnh thoảng, tôi phải viết trình điều khiển thiết bị (hoặc viết lại một trình điều khiển để các máy ảo nxx có thể chia sẻ một thiết bị duy nhất như HRNG). C là ngôn ngữ chính của tôi và tôi khá hài lòng với điều đó.

Tôi sẽ cố gắng viết một chương trình bảng tính bằng cách sử dụng nó? Không đời nào. Mỗi công cụ đều có ứng dụng của nó và tôi rất vui vì tôi có nhiều công cụ.

Tôi yêu C, nhưng tôi không thử đập vít bằng búa.

Nếu C là một lựa chọn hợp lý cho một dự án mới, chắc chắn. Nếu không, tôi sẽ sử dụng thứ khác.


4

Tôi sẽ cho một số dự án. Chắc chắn là nếu tôi phải thực hiện một hệ thống nhúng, hãy nói về bộ điều khiển của máy bay tự trị. Thậm chí có thể đi cấp thấp hơn trên một số bộ phận với lắp ráp.

Nếu nó phù hợp với dự án, tôi không có vấn đề với nó.

Nếu bạn muốn phát triển một ứng dụng web, hmm, có lẽ là không (hoặc tôi cần xem một lời biện minh rất mạnh mẽ và được hỗ trợ thực tế).

Tôi cũng sẽ sử dụng nó từ các dự án khác chủ yếu được phát triển với các ngôn ngữ khác khi một nút cổ chai đã được xác định rõ ràng và việc tối ưu hóa có thể được thực hiện bằng mã gốc. Chẳng hạn, một giải pháp Java cần được thực hiện các tính toán chuyên sâu cho một số kết xuất nâng cao (giả sử, một công cụ kết xuất hoặc một cái gì đó). Bạn có thể mặc định triển khai Java nếu đó không phải là một nền tảng được hỗ trợ, nhưng cung cấp một triển khai được biên dịch nguyên gốc từ C cho một số nền tảng được hỗ trợ và có được sự tăng hiệu năng tốt.


Bạn muốn một lý do để sử dụng nó cho một ứng dụng web? Memcached được viết bằng C và nó là một phần cốt lõi của nhiều ứng dụng web. Ngoài ra, một đồng nghiệp của tôi đã viết một đoạn mã liên quan đến một trang mạng xã hội bằng C - một khi nó phức tạp về mặt thuật toán, với các bộ dữ liệu giáp với kích thước của RAM có sẵn về mặt kinh tế và xử lý các truy vấn chạy trung bình 23 lần trên mỗi trang. . chúng tôi đã tiết kiệm được 4 tháng tiền lương cho các lập trình viên, với ứng dụng C 4 ngày.
qdot

@qdot: Đó là một lý do hợp lệ. Cũng có một lý do tại sao có các khung công tác tốt cho nhà phát triển web C và C ++. Sẽ không phải là lựa chọn số 1 của tôi nếu cần để phát triển một ứng dụng web hoặc trang web nói chung. Trong trường hợp của một khung như memcached, rõ ràng nó có ý nghĩa hoàn hảo. Tương tự như vậy có máy chủ trong C có thể có ý nghĩa. Do đó có lẽ là không. Memcached (và việc triển khai C cụ thể của bạn đối với phần chuyên sâu tính toán của ứng dụng web) là cách sử dụng C hoàn toàn hợp lệ cho nhà phát triển web. Nhưng bạn cần một lập trình viên C giỏi để làm điều đó. Chỉ cần không phải ai đó nhặt nó trên đường, hoặc mong đợi vấn đề.
haylem

Và nếu những người khác có những lý do hợp lệ khác như thế này, xin vui lòng gửi chúng ở đây! Nó hữu ích cho độc giả.
haylem

Nếu bạn sử dụng C, bạn sẽ học được cách mong đợi hiệu suất tuyệt vời, trải nghiệm học tập tốt và hàng tấn vấn đề không giải thích được lúc đầu. Tôi chỉ cố gắng khuyến khích mọi người sử dụng C, vì nó trở nên rất quan trọng khi bạn chuyển từ một nhà phát triển PHP / Ruby / Python "một triệu" và bắt đầu gãi đầu trước những vấn đề tính toán lớn.
qdot

@qdot: thật vậy. Thật xấu hổ khi nhiều người không thực sự biết C nữa.
haylem

4

Mỗi ngôn ngữ ngoài kia có một cách sử dụng thích hợp. Tôi thường thấy mình thực hiện mọi thứ bằng các ngôn ngữ cấp cao hơn, và sau đó dần dần đưa chúng xuống đất C nếu tôi cần chúng có hiệu suất cao hơn hoặc thậm chí chỉ đơn giản là dễ mang theo hơn. Có các trình biên dịch C cho gần như mọi thứ tồn tại và nếu bạn viết vào một API có sẵn trên toàn cầu (như POSIX), thì nó có thể rất hữu ích.

Điều tôi thường nói với những người quan tâm đến việc học lập trình ngày nay là đảm bảo rằng đến một lúc nào đó, họ học C và trở nên thoải mái với nó. Bạn có thể thấy mình trong hoàn cảnh mà bạn cần nó. Trong nhiều lần, tôi đã phải biên dịch một chương trình "khởi động lại nhanh" nhỏ, được liên kết tĩnh và sử dụng scp để đặt nó vào đĩa RAM trên máy chủ nơi hệ thống con đĩa hoàn toàn biến mất. (Máy chủ giá rẻ, giá rẻ, không có dự phòng trực tuyến và chỉ có khả năng tải một chương trình nhỏ? C là cách để đi.)

Ngoài ra, học cách làm việc trong C mà không tự bắn vào chân mình có thể đóng góp đáng kể vào khả năng viết hiệu quả trong các ngôn ngữ và môi trường khác. Ít nhất, đó là kinh nghiệm của tôi.

Mặc dù tôi chắc chắn không sử dụng nó cho mọi thứ, hoặc thậm chí hầu hết mọi thứ, nó có vị trí của nó và nó khá phổ biến: vì vậy, tôi đã sử dụng nó trong quá khứ và sẽ sử dụng nó trong tương lai (mặc dù tôi không biết khi nào vào lúc này).


4

Vâng, tôi làm điều đó mọi lúc.

Nếu bạn không gọi bất kỳ thư viện nào, mã được tạo từ C không yêu cầu hỗ trợ HĐH. Nó cũng cung cấp cho bạn quyền kiểm soát tốt đối với ngôn ngữ máy được tạo. Vì vậy, thật tuyệt vời khi viết trình điều khiển hoặc mã khác sống trong không gian kernel và các tình huống bị ràng buộc khác như nhiều loại hệ thống nhúng hoạt động. Đây cũng là ngôn ngữ chính cho các dự án nguồn mở mà tôi làm việc như X Windows, GTK + và Clutter.

Mặc dù bạn có thể làm mọi thứ trong C, bạn có thể làm trong C ++, nhưng các cơ chế của C ++ giúp viết mã nhanh hơn và dễ dàng hơn. Tôi yêu OOP và cách các lớp C ++ gói gọn chức năng và tôi yêu RAII. Việc sử dụng cẩn thận việc gọi hàm hủy tự động khi một đối tượng vượt ra khỏi phạm vi sẽ loại bỏ hầu hết các rò rỉ bộ nhớ và tài nguyên là nguyên nhân chính của lập trình C. STL về cơ bản là một thư viện khổng lồ gồm các thuật toán và cấu trúc dữ liệu được tối ưu hóa cao; nếu bạn muốn sử dụng chúng từ C, bạn phải tự viết chúng hoặc mua chúng ở đâu đó.

Thật không may, vì lý do tôi không hiểu, hệ thống thời gian chạy trên Linux yêu cầu thư viện đối tượng chia sẻ đặc biệt (tương đương với DLL trên Windows, dylib trên Mac) để chạy bất kỳ C ++ nào và không tìm thấy khi bạn chạy chương trình C. Vì vậy, tôi không thể thực hiện một trong những thủ thuật Mac và Windows yêu thích của mình, đó là viết một đối tượng chia sẻ dựa trên C ++ với API dựa trên C và gọi nó từ chương trình C.

Vì vậy, đây là quá trình ra quyết định của tôi:

  1. Tôi có làm việc trong một tình huống hạn chế như trình điều khiển thiết bị không? Sử dụng C.
  2. Tôi có đang viết thư viện Linux không ai khác sẽ phải sử dụng? Sử dụng C.
  3. Tôi có đang làm việc bên trong mã đã được viết bằng C không? Sử dụng C.
  4. Tôi đang viết thư viện Mac hay Windows, hay chỉ thư viện Linux tôi sẽ sử dụng? Viết phần bên trong trong C ++, nhưng chỉ để lộ giao diện C để tránh vấn đề giao diện nhị phân dễ vỡ.
  5. Sử dụng C ++.

Một điều tuyệt vời là vì C ++ có thể biên dịch C, nếu bạn thực sự cần kiểm soát chi tiết đối với mã được tạo cho một tình huống cụ thể, bạn chỉ có thể viết C cho điều đó và C ++ cho phần còn lại và biên dịch tất cả bằng trình biên dịch C ++ .


Bạn không thể "biên dịch tất cả bằng trình biên dịch C" vì vấn đề malloc với C ++ - bạn phải sử dụng C ++ nhưng không phải trong C. Tất nhiên mọi thứ đều ổn nếu bạn sử dụng mã C hoàn toàn hợp pháp nhưng gây khó chịu .
thay thế

1
@mathepic: Có, C ++ quyết định chặt chẽ hơn C về nhiều thứ, bao gồm cả việc gán con trỏ void cho con trỏ được gõ. Tuy nhiên, tôi đang sửa lỗi trong một vài dự án cũ, một phần bằng cách biên dịch các tệp C với C ++. Tôi đang tìm cách tạo ra các kết quả của malloc là một cái giá nhỏ để trả cho việc trình biên dịch C ++ phát hiện ra các lỗi tinh vi do mã đó hoàn toàn hợp pháp trong C.
Bob Murphy

3

Có, nhưng phụ thuộc vào dự án. C là rất tốt cho một số dự án cấp thấp hoặc một phần của giải pháp lớn nhất.

Ví dụ. Đối với logic bussines ok, nhưng không cho giao diện người dùng.


2

nếu nó phải là cả hai

  • nhanh, và
  • xách tay

sau đó tôi sử dụng C. Có thể C ++.


Nhanh và di động, đó cũng có thể là Java hoặc C #.
Jonas

11
@Jasas: không phải. Portable không có nghĩa chỉ là 'windows hoặc linux' ;-)
Steven A. Lowe

1
@Jonas: Nhanh và di động, đó sẽ không phải là Java hay C #. C ++ có khả năng di động trên các nền tảng và các thiết bị nhúng như vi điều khiển và C thậm chí còn có thể di động (dưới dạng các chức năng nước ngoài) sang các ngôn ngữ khác. Cả hai đều nhanh hơn các ngôn ngữ được thu thập dựa trên ngăn xếp không có chức năng và do đó vẫn dựa trên ngăn xếp. Bạn không cần cả hai: ngăn xếp và bộ thu gom rác.
comonad

2
@Jonas: đọc nó; lưu ý hãy cẩn thận và một lần nữa, "xách tay" không có nghĩa là chỉ có windows / linux. Câu hỏi hỏi khi nào bạn sẽ sử dụng C; Câu trả lời là: khi nó phải chạy nhanh ở mọi nơi . Tôi yêu Java và C #, nhưng chúng là búa tạ và các hệ thống nhúng / cũ hơn không có thời gian chạy. Nhiều người trong số họ thậm chí không có không gian để tổ chức thời gian chạy!
Steven A. Lowe

2
@Jonas: Tôi đánh giá cao niềm đam mê của bạn, nhưng "nền tảng mới" không phải là chủ đề. Để tôi cho bạn một ví dụ cụ thể hơn, để xem điều đó có giúp ích không: các bộ vi xử lý cung cấp hỗ trợ điều khiển hỏa lực cho xe tăng trên chiến trường có trình biên dịch C không. Họ không, cũng sẽ không bao giờ có JVM.
Steven A. Lowe

2

Vâng, trên thực tế tôi có gần đây!

Tôi thích lập trình ở C. Tôi hầu hết lập trình bằng python, nhưng có những lúc tôi cần mã nhanh và tôi thực sự thích sự thanh lịch đến từ sự đơn giản của ngôn ngữ.

Dự án tôi đang làm bây giờ là một cơ sở dữ liệu, như bạn có thể tưởng tượng, là hiệu suất quan trọng. Hiện tại tôi đang sử dụng C và một số con trăn, nhưng cuối cùng nó sẽ chủ yếu, nếu không hoàn toàn là C.


2

Đúng!

C là ngôn ngữ cấp thấp và có tình huống C gần như là lựa chọn duy nhất như tôi sử dụng C để lập trình bộ điều khiển vi mô hoặc đặt một số mã với nhau để tương tác với các thiết bị từ các cổng cổ điển như Parallel, serial hoặc thậm chí Modem!


2

Đúng. Tôi đã dành phần lớn sự nghiệp lập trình C ++ của mình, nhưng bây giờ tôi viết phần lớn mã của mình bằng Ruby và nếu tôi cần hiệu suất hoặc quyền truy cập vào các công cụ cấp thấp, tôi viết phần mở rộng C. Đó là Người đàn ông tương lai!


Một số câu trả lời đề cập đến tính di động và tốc độ là lợi ích của mã C, nhưng liên kết là một đặc tính quan trọng khác. Nó tương đối dễ dàng để liên kết mã "nước ngoài" được viết bằng C vì kỷ luật ngăn xếp "cổ điển" đơn giản của nó. Nhiều trình biên dịch C sẽ cho phép "trình biên dịch nội tuyến" thuận tiện ở mức rất thấp trong một kiến ​​trúc (rõ ràng là hy sinh tính di động trong hành động).
hardmath

1

Tôi sẽ sử dụng C nếu tôi đang viết một hệ điều hành. Vì điều đó sẽ không xảy ra trong hai mươi năm tới, trừ khi tôi trúng xổ số và không có gì khác để làm ngoài bản phân phối Linux tuyệt vời của riêng tôi, có lẽ tôi sẽ chỉ sử dụng C #, Java, Python, v.v. Tôi đã sử dụng C trong một thời gian rất dài nhưng tôi luôn thích sử dụng nó; Mặc dù vậy, tôi nghĩ rằng, những ngày này, đầu tôi rất quấn quanh OO nếu tôi phải quay lại với nó, tôi sẽ phải mất một chút để quay trở lại.


0

C ++ có khả năng di động trên các nền tảng và các thiết bị nhúng như vi điều khiển. (C ++ có thể được biên dịch thành C, do đó, vi điều khiển.)

C thậm chí còn có thể di động (như các chức năng nước ngoài) sang các ngôn ngữ khác. Do đó, nếu tôi lập trình các thư viện cấp thấp, thì tôi muốn tương thích nhiều hơn C ++.

Haskell có khả năng di động trên các nền tảng (ARM sắp ra mắt) nhưng KHÔNG được nhúng các thiết bị như vi điều khiển. Tốc độ của nó tương đương với C và C ++; nhưng vì nó hoạt động, nó sử dụng trình thu gom rác thay vì ngăn xếp thời gian chạy, do đó nó có thể nhanh hơn và chậm hơn C vào các thời điểm khác nhau (thu gom rác) và trong các tình huống khác nhau (tiếp tục thay vì các cuộc gọi phụ).


Tôi chọn ngôn ngữ trừu tượng nhất có thể, bởi vì tốc độ chương trình không khác nhau nhưng thời gian phát triển và tốc độ lỗi. C và C ++ khác nhau nhiều, nhưng không phải theo quan điểm của Haskell.

Tôi không thích các ngôn ngữ khác, mặc dù tôi biết một hoặc hai bàn tay đầy đủ. Sọ ngoại trừ trong một vài trường hợp, tốt, bash .


0

Các hệ thống nhúng thường có không quá vài kilobyte RAM và có lẽ vài chục kilobyte flash, với tốc độ xung nhịp của bộ xử lý là vài MHz. C là lựa chọn duy nhất có ý nghĩa trong môi trường kim loại trần như vậy.

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.