it-swarm-vi.com

Tôi không biết C. Và tại sao tôi nên học nó?

Ngôn ngữ lập trình đầu tiên của tôi là PHP ( gasp ). Sau đó tôi bắt đầu làm việc với JavaScript. Gần đây tôi đã hoàn thành công việc trong C #.

Tôi chưa bao giờ nhìn vào các ngôn ngữ cấp thấp hoặc trung bình như C.

Sự đồng thuận chung trong cộng đồng lập trình nói chung là "một lập trình viên chưa học được điều gì đó như C, thật lòng, không thể xử lý các khái niệm lập trình như con trỏ, kiểu dữ liệu, truyền giá trị bằng tham chiếu, v.v."

Tôi không đồng ý. Tôi lập luận rằng:

  1. Bởi vì các ngôn ngữ cấp cao có thể dễ dàng truy cập, nhiều "người không lập trình" hơn đã lao vào và gây rối
  2. Để thực sự có được bất cứ điều gì được thực hiện bằng một ngôn ngữ cấp cao, người ta cần phải hiểu các khái niệm tương tự mà hầu hết những người đề xướng "truyền giáo cấp thấp trước tiên" truyền giáo.

Một số người cần biết C; những người đó có công việc yêu cầu họ viết mã từ thấp đến trung bình. Tôi chắc chắn C rất tuyệt vời và tôi chắc chắn có một vài lập trình viên xấu biết C.

Vì sao thiên vị? Là một lập trình viên giỏi, trung thực, đói, nếu tôi phải học C (vì một lý do không lường trước được), tôi sẽ học C. Xem xét vô số ngôn ngữ ngoài kia, các lập trình viên giỏi có nên tập trung vào việc học những gì tiến bộ chúng ta không? Chúng ta không nên tìm hiểu những gì chúng ta quan tâm? Chúng ta không nên sử dụng thời gian hữu hạn của mình để di chuyển về phía trước ? Tại sao một số lập trình viên không đồng ý với điều này?

Tôi tin rằng phấn đấu cho sự xuất sắc trong những gì bạn làm là đặc điểm quyết định cơ bản giữa những lập trình viên giỏi và những người xấu.

Có ai có bất kỳ ví dụ thực tế nào về cách một thứ được viết bằng ngôn ngữ cấp cao mà nói Java, Pascal, PHP hoặc JavaScript không thực sự được hưởng lợi từ kiến ​​thức trước về C không? Ví dụ sẽ được đánh giá cao nhất.

58
Stephen

Lợi thế khi biết C là bạn có một ý tưởng rất hay về cách máy tính hoạt động. Không chỉ là cách mô hình lập trình của bạn hoạt động, mà còn là cách bộ nhớ được sắp xếp và tương tự.

Cấp độ duy nhất dưới C là hội được nói bởi một CPU cụ thể.

(Tôi nói thêm rằng việc biết C cũng cho phép bạn đánh giá cao việc bạn phải làm ít hơn bao nhiêu trong ngôn ngữ cấp cao hơn. Và hy vọng sự đánh giá cao về chi phítham gia làm việc ở mức cao hơn đó ngôn ngữ cấp.)

113
Frank Shearar

Tôi không nghĩ bất kỳ câu trả lời nào ở đây thực sự là những gì OP đang tìm kiếm, vì vậy tôi sẽ đưa ra ý kiến ​​của riêng mình.

Hãy nhìn xem, tôi là một kẻ hợm hĩnh C. Thái độ của tôi là nếu bạn không biết C, thì ở một mức độ nào đó bạn không thực sự biết bạn đang làm gì với tư cách là một lập trình viên. Vì vậy, tôi nghĩ rằng tôi là loại người "thiên vị" mà bạn đang nói đến ở đây.

Tuy nhiên, trên thực tế, việc bạn thực sự biết bạn đang làm gì với tư cách là một lập trình viên không nhất thiết ngăn bạn phát triển phần mềm thực sự tuyệt vời, hữu ích sử dụng các công cụ cấp cao. Ý tôi là, người tạo ra Stack Overflow, Jeff Atwood, dường như thậm chí không biết C, nhưng tôi sẽ nói Stack Overflow là một ứng dụng web khá hay.

Việc bạn có quyết định học C (hoặc C++ hay hội) hay không tùy thuộc vào loại lập trình viên bạn muốn trở thành. Nếu bạn chỉ muốn phát triển các ứng dụng web hay ứng dụng kinh doanh thú vị, điều đó tốt - không cần phải học C. Nhưng nếu bạn muốn thực sự Excel thì sao bạn làm - nếu bạn muốn làm việc với các dự án thực sự tuyệt vời Đẩy mạnh trạng thái nghệ thuật, thì bạn thực sự cần phải nghiêm túc với tư cách là một lập trình viên để thực sự hiểu máy tính hoạt động như thế nào. Vì C về cơ bản là hệ điều hành lingua franca, cũng như ngôn ngữ cung cấp năng lượng cho mọi thứ khác (từ nhân Linux đến hầu hết Java VM, đến Python = và Ruby trình thông dịch, cơ sở dữ liệu SQL, máy chủ web và chỉ về mọi trình điều khiển thiết bị), một sự hiểu biết sâu sắc về ngôn ngữ sẽ đi một chặng đường dài.

Chưa kể rằng việc biết C (hoặc C++) mở ra một cơ hội lớn để đóng góp cho các dự án nguồn mở lớn có tác động đến hàng triệu (hoặc hàng trăm triệu) người. Bạn muốn làm việc để cải thiện trình biên dịch Python hoặc trình duyệt web Chromium? Chà, bạn cần biết C cho cái đầu tiên và C++ cho cái sau.

Đó là lý do tại sao việc so sánh C với các ngôn ngữ tự nhiên đã chết như tiếng Latin hoặc các công nghệ lỗi thời như ngựa và xe ngựa là hoàn toàn sai lầm. Một phần lớn cơ sở hạ tầng phần mềm thế kỷ 21 của chúng tôi được cung cấp bởi mã C, đó là lý do tại sao C vẫn có liên quan như ngày nay.

Vì vậy, việc bạn có nên học C hay không thực sự phụ thuộc vào những gì bạn muốn trong sự nghiệp là một lập trình viên.

72
Charles Salvia

Một nguyên tắc thực tế là bạn cần hiểu ít nhất một mức độ trừu tượng dưới mức bạn thường làm việc. Hãy xem xét rằng PHP hoặc trình thông dịch JavaScript của bạn thực sự có thể được triển khai trong C hoặc C++. Cuối cùng, bạn sẽ gặp một lỗi trong trình thông dịch hoặc thậm chí là lỗi thời gian chạy C. Nếu bạn không hiểu C, bạn sẽ bị giới hạn gửi báo cáo lỗi cho người bảo trì, hy vọng họ có thể sao chép và quan tâm đến nó, và sau đó vặn ngón tay cái của bạn. Nếu bạn biết C, bạn có thể cho họ biết chính xác vấn đề là gì và nó là gì.

Điều này cũng có nghĩa là nếu bạn làm việc trong C/C++, ít nhất bạn sẽ có thể đọc hội trên nền tảng của mình.

Đối với việc học C khi bạn cần: quan sát của tôi là hầu hết các lập trình viên có thể học Perl/Python/Javascript theo yêu cầu, nhưng trình biên dịch/C/LISP dường như cần nhiều thời gian hơn, vì vậy, đáng để học ít nhất một số điều cơ bản trước khi cần phát sinh.

12
Charles E. Grant

Tôi không đồng ý rằng bạn cần học C đầu tiên, nhưng tôi tin rằng bạn nên học C cuối cùng. Tất cả các tóm tắt đều bị rò rỉ và hiểu C giúp dễ hiểu hơn những gì thực sự xảy ra khi bạn sử dụng một số trừu tượng cấp cao lạ mắt. Điều đó nói rằng, tôi cũng nghĩ rằng tất cả các lập trình viên nghiêm túc cuối cùng cũng nên học cách đọc ít nhất trình biên dịch chương trình, vì lý do tương tự.

Học các khái niệm cấp thấp này mang lại khả năng đáng ngạc nhiên để suy luận về các công cụ cấp cao. Ví dụ, trong C++ và D, các đối số mặc định cho các hàm ảo được xác định bởi loại tĩnh (thời gian biên dịch) của đối tượng, không phải loại động (thời gian chạy). Điều này vô nghĩa trừ khi bạn hiểu cách vtables và gọi các quy ước hoạt động và tại sao sẽ cực kỳ khó để thực hiện các chức năng ảo theo cách ngược lại.

7
dsimcha

Sự thiên vị là một trong những hiện trạng. Vào thời xưa (những năm 1980 trở về trước), C/C++ là một yêu cầu khá lớn đối với các ứng dụng hiệu suất. Điều đó đã thay đổi nhưng các nhà phát triển cao cấp thường đến từ nền tảng cũ kỹ đó và xem mọi thứ trong bối cảnh đó.

Để phát triển thực tế, các ngôn ngữ khác are được sử dụng - C # là ngôn ngữ phổ biến, cũng như Java, trong khi PHP và Python là phổ biến cho các dự án nội bộ và luôn hữu ích khi có ai đó có ít nhất kiến ​​thức cơ bản trong lĩnh vực đó trong trường hợp bạn chọn một nguồn mở PHP cho, giả sử, hệ thống theo dõi lỗi của bạn. Tuy nhiên, công việc thông số kỹ thuật dường như vẫn đến từ mẫu tiêu chuẩn đã được viết cách đây 25 năm.

7
JohnL

Thật là một lễ hội sên lớn! (Như họ đã nói: Đây có phải là một cuộc chiến riêng tư, hoặc có ai có thể tham gia không?)

Tôi là một giáo sư, và điều tôi tìm thấy (sau một vài lần thử và sai) là việc dẫn sinh viên dễ dàng hơn nhiều thông qua các khái niệm phức tạp về lập trình nếu họ hiểu, ở cấp độ cơ bản, chỉ là những gì máy tính đang làm. Không phải trong tất cả các chi tiết nitty, nhưng nguyên tắc cơ bản, như bộ nhớ là gì, hướng dẫn là gì, v.v. Điều tôi thích ở C là nó gần với máy.

Điều đó không có nghĩa là các giáo viên khác đã đến cùng một nơi. Họ bắt đầu bằng ngôn ngữ cấp cao (BASIC :-) và đi tiếp từ đó, không có hiệu ứng bệnh rõ ràng.

Vì vậy, dòng dưới cùng, Stephen, bạn có thể đúng. Tôi sẽ không nghĩ như vậy, nhưng tôi đã sai trước đây.

6
Mike Dunlavey

Nhiều khi tôi ghét đăng bài viết trên blog Joel bắt buộc, tôi đồng ý với anh ấy tại đây . C là ngôn ngữ chung của lập trình. Tôi không thể nghĩ ra bất kỳ ngôn ngữ cấp cao nào không thể giao tiếp với nó bằng cách nào đó. Do đó, C vẫn là một lựa chọn phổ biến cho các loại công cụ lập trình hệ thống. Bạn chỉ đơn giản là không thể giao tiếp với một số thứ ở cấp độ hệ điều hành mà không có C.

Bên cạnh đó, bạn dự định làm gì khi ngôn ngữ cấp cao của bạn không đủ nhanh? Biết cách viết C đặc biệt quan trọng khi bạn đang sử dụng một ngôn ngữ được gõ động ở mức độ cao như Ruby, Python hoặc PHP. Nhưng ngay cả các lập trình viên thậm chí Java và C # cần phải giảm xuống C theo thời gian.

6
Jason Baker

Tôi đoán đây là sự tiến bộ.

Hai mươi năm trước, sự khôn ngoan thông thường là bạn phải học trình biên dịch để hiểu những gì bạn đã đạt được từ các ngôn ngữ cấp cao hơn như C (đó là lý do tại sao tôi phải học một lớp trình biên dịch ở trường đại học bằng VAX Macro; đoán làm thế nào hữu ích mà hóa ra là khi tốt nghiệp).

Có một sự mê tín rằng vì C hơi khó học và nó cung cấp gần như không trừu tượng (con trỏ và luồng byte khá nhiều), học bằng cách nào đó sẽ giúp bạn trở thành một lập trình viên tốt hơn hoặc cung cấp cho bạn cái nhìn sâu sắc hơn vào cách mọi thứ hoạt động ở cấp độ phần cứng.

Điều này không thực sự đúng. Tiêu chuẩn C không giúp bạn đến gần kim loại hơn bất kỳ 3GL nào khác (Pascal, Fortran, v.v.). Một số C triển khai có thể cung cấp các móc nối cho phép bạn truy cập nhiều hơn vào một số khu vực, nhưng nói chung, các con trỏ trần trụi gần như bạn nhận được, hoàn toàn không gần gũi. Bạn không thể truy cập trực tiếp vào sổ đăng ký hoặc từ trạng thái.

Cuối cùng, tất cả đều thuộc về opcodes và chế độ địa chỉ, vì vậy nếu bạn thực sự quan tâm đến cách mọi thứ hoạt động ở cấp thấp hơn, bạn sẽ được phục vụ tốt hơn cho trình biên dịch học trên C.

Chính nó, học C sẽ không (nhất thiết) làm cho bạn trở thành một lập trình viên tốt hơn. Nó chắc chắn sẽ cung cấp cho bạn sự đánh giá cao đối với các loại chuỗi thực tế và các thư viện container được tiêu chuẩn hóa.

4
John Bode

Procoively hỏi: Bạn đang yêu cầu xác nhận rằng bạn không phải học C? Nếu bạn học thuần túy C (không nhất thiết phải là C++), bạn sẽ có được sự hiểu biết thấu đáo về mô hình thực thi của máy tính. Đặc biệt là về bộ nhớ và phân bổ. Công cụ này cũng quan trọng đối với những người lập trình trong langauges cấp cao hơn.

Đối với một lập trình viên PHP, cách mã được thực thi trên máy đã cho không rõ ràng. Nó có thể không quan trọng đối với lập trình viên PHP vì chuyển mạng là cổ chai trong ứng dụng, v.v.

Plain PHP/Python/C # có rất nhiều lớp trừu tượng giữa ngôn ngữ và CPU. các lớp này dày đến mức chúng không cho phép bạn nhìn xuyên qua chúng. Khi bạn học C, có một tấm mỏng giữa bạn và CPU và hệ điều hành. Điều đó không làm cho việc lập trình dễ dàng hơn (và nó thậm chí có thể không tốt hơn). Nhưng bạn thực sự có thể tìm hiểu làm thế nào CPU hoạt động. Khi bạn biết C "trung gian", bạn thực sự có thể bắt đầu liên kết kiến ​​thức đó với ngôn ngữ cấp cao hơn. Đây là lợi ích trước mắt mà bạn sẽ đạt được.

Theo tôi, một lập trình viên nên luôn dành thời gian để học các khái niệm lập trình khác nhau. Nó chắc chắn trả tiền để có một cái nhìn về C, nhưng cũng phải hãy nhìn vào các ngôn ngữ lập trình cấp cao hơn như Clojure, Haskell, Prolog.

Bạn không cần phải trở thành bậc thầy trong những điều này, họ sẽ chỉ dạy cho bạn bài học rằng "cấp độ" của ngôn ngữ lập trình không phải là nhị phân mà có rất nhiều cấp độ. Nhận biết chúng, từ trên xuống dưới (Trình biên dịch). Nó sẽ làm cho bạn một lập trình viên tốt hơn.

2
wirrbel

Bạn cần biết đủ C để đọc mã được viết bằng C, vì số lượng lớn mã rất quan trọng được viết bằng ngôn ngữ. Đó là về tất cả những gì bạn sẽ giữ được thông qua một hướng dẫn kỹ lưỡng về chủ đề (tôi đã sử dụng "lập trình bằng C" của Kochan) mà không thực sự phải viết mã bằng ngôn ngữ. Nếu bạn gặp khó khăn trong một tình huống đòi hỏi bạn phải sử dụng ngôn ngữ rộng rãi, bạn sẽ có một cơ sở tốt để xây dựng. Bạn có thể muốn nghiên cứu một cái gì đó như cuốn sách Duntemanns hội nếu máy là một hộp đen kiêng đối với bạn. Tôi cũng đề nghị "Mã" của Petzold.

Ngoài điều đó - kiến ​​thức cơ bản về C và sự quen thuộc cơ bản với máy cơ bản - bạn sẽ được phục vụ tốt nhất dành thời gian học tập cho những thứ thực sự, như SICP, TCP/IP Illustrated hoặc sách về Concrete Math, thuật toán hoặc cấu trúc dữ liệu . Các công cụ thực sự.

Dành nhiều thời gian để học C trong khi viết mã PHP đơn giản là không đáng với chi phí cơ hội. Có nhiều thứ hữu ích hơn để học. C thực sự chỉ là một ngôn ngữ khác mà bạn có thể học tốt chỉ khi học và sử dụng, nhưng có thể nhận khi bạn cần.

Đổ mồ hôi những thứ cứng.

2
naftalimich

Một ngôn ngữ là một công cụ. Nếu bạn chỉ phải viết các trang web và những thứ tương tự thì tôi chắc chắn rằng bạn có thể thoát khỏi mà không cần phải học C, giống như cách mà bạn chỉ làm bộ dụng cụ mô hình bằng nhựa, bạn chỉ cần một con dao và keo sắc nhọn, a cờ lê thường không được yêu cầu.

Tôi viết mã cho các hệ thống nhúng có tài nguyên bộ nhớ bị hạn chế cao (lớn nhất tôi đã thực hiện gần đây là 16kbyte và đó là LỚN) Trong thị trường này, C hoặc trình biên dịch là các tùy chọn duy nhất và bất kỳ ngôn ngữ cấp cao hơn nào không hoạt động.

2
uɐɪ

Theo kinh nghiệm của tôi, trong một thời gian, C/C++ là một bộ đệm tốt giúp tách biệt các lập trình viên giỏi khỏi các lập trình viên VB6. Sau khi thực hiện năm năm lẻ C/C++, tôi đã có một công việc làm việc tại VB6. Tôi đã rất ngạc nhiên về chất lượng (hoặc thiếu nó) của các lập trình viên. Họ ít quan tâm đến sự can đảm của ngôn ngữ, trong thiết kế hay về hiệu suất. Thật không may, khi công ty chuyển sang .Net, các lập trình viên C/C++ và các lập trình viên .Net đã sử dụng cùng các công cụ. Các lập trình viên VB thậm chí còn tệ hơn các lập trình viên VB.Net. Tình hình trở nên tồi tệ hơn khi tất cả sự phát triển đều chuyển sang ASP.NET. Đột nhiên bất cứ ai có thể kéo và thả điều khiển đều là lập trình viên.

Tuy nhiên, trong thị trường việc làm, không có nhiều sự khác biệt giữa các lập trình viên lõi cứng (ví dụ C/C++) và khách du lịch.

Như vậy, có C hoặc C++ trong sơ yếu lý lịch của bạn có thể giúp bạn khác biệt với riff-raff.

2
dave

C (và có thể là C++) là biển bạn đang bơi. Hệ điều hành sẽ chạy mã của bạn có thể được mã hóa bằng C (và C++). Vì vậy, API gốc của bạn để truy cập các dịch vụ HĐH sẽ ở C.

Nếu bạn có thể làm mà không biết những gì bên dưới, thì không cần phải biết C. Tuy nhiên, hầu hết các lập trình viên cần phải lặn xuống các cấp thấp hơn vào lúc nào đó trong cuộc sống của họ.

Nó cũng dựa trên chuyên môn của bạn về các lĩnh vực phát triển. Ví dụ, một nhà phát triển web viết HTML, Javascript và một số kịch bản phía máy chủ có thể không bao giờ cần biết gì về C, nhưng một nhà phát triển hệ thống hoặc trò chơi phân tán sẽ.

Sẽ không bao giờ đau lòng khi dành một vài tuần để học một cái gì đó rất cơ bản cho nghề nghiệp của bạn.

1
Mert Akcakaya

C là ngôn ngữ được sử dụng để viết các ngôn ngữ khác. Nó cho phép bạn thân mật với CPU và các phần cứng khác tùy thích.

Nếu bạn không biết C, bạn sẽ không biết các ngôn ngữ khác đạt được kết quả như thế nào.

Tất nhiên, trừu tượng là một khái niệm quan trọng và không phải ai cũng cần biết khuôn khổ lựa chọn của họ đạt được kết quả như thế nào. Bạn không cần phải mất 20 năm để viết C, hoặc thực sự suy nghĩ về những gì xảy ra với vtables của bạn khi bạn sử dụng nhiều kế thừa, để viết mã tốt.

Bây giờ, bạn có thể lái xe mà không hiểu động cơ 4 thì hoạt động như thế nào hoặc thực sự không thể sử dụng lẫy chuyển số (hộp số tay).

Tuy nhiên, nếu bạn hiểu những gì đang diễn ra dưới mui xe, đôi khi bạn sẽ có thể đạt được kết quả đặc biệt mà một người không có kiến ​​thức đó sẽ phải vật lộn để nhân rộng.

1
Bill Michell

C có nhiều ưu điểm:

  1. C là ngôn ngữ cấp thấp. Bạn có thể sử dụng c để phát triển kernel và trình điều khiển.
  2. C là ngôn ngữ nhanh nhất. Nhiều phần mềm điện được phát triển bởi c. Ví dụ: memcached, redis, nginx, Apache, mysql, v.v.
  3. C là một ngôn ngữ đa nền tảng. Chương trình được phát triển bởi c có thể chạy ở mọi nền tảng. Các ngôn ngữ đa nền tảng khác không thể làm điều này. Java, python, php, v.v. không thể chạy trên nền tảng iOS.
  4. C++ không thể chạy ở nhiều hệ thống nhúng.
1
Edward Shen