Học C có cần thiết cho Khoa học Máy tính không? [đóng cửa]


15

Tôi là một nhà phát triển front-end, người hầu như không nhìn thấy một tập tin có .hhoặc .cphần mở rộng. Tôi biết cú pháp C cơ bản, tôi đã học nó trong Unreality nhưng chưa bao giờ quan tâm đến lập trình cấp thấp như vậy bởi vì nó đơn giản là quá nhiều thiết lập cho những điều đơn giản.

Tôi rất thích tìm hiểu tất cả các khía cạnh của Khoa học Máy tính nhưng tôi muốn tin rằng tôi không thực sự phải biết một ngôn ngữ cụ thể để hiểu hầu hết các khái niệm trong Khoa học Máy tính. Tuy nhiên, khi tôi bắt đầu đọc sách và bài viết về các khái niệm cơ bản của Khoa học máy tính như Cấu trúc dữ liệu và Thiết kế thuật toán, có vẻ như tôi phải học C, bởi vì tất cả các ví dụ và thậm chí các bài học đều bằng C (và đôi khi là Java).

Câu hỏi của tôi là, C là ngôn ngữ lập trình cần thiết cho Khoa học Máy tính hay chúng ta tình cờ có tất cả tài nguyên của chúng tôi trong CS được viết bằng C? Có thể học Khoa học Máy tính mà không học C không?


4
Dưới đây là ý kiến ​​của Joel Spolsky về điều đó: joelonsoftware.com/articles/Col pheAdvice.html Có thể thảo luận, nhưng tôi nghĩ rằng anh ấy có quan điểm của mình.
Doc Brown

2
Những người theo chủ nghĩa thuần túy sẽ cho rằng khoa học máy tính không phải là về máy tính, điều này làm cho các ngôn ngữ lập trình không cần thiết.
Blrfl

1
"Khoa học máy tính" nghĩa là gì? Những gì bạn mô tả chủ yếu là phần Kỹ thuật phần mềm của khoa học máy tính tôi nghĩ. Ngoài ra, tôi không thấy tất cả các tài nguyên được viết bằng C. Tôi đã đọc khá nhiều sách về thuật toán / cấu trúc dữ liệu và không sử dụng C. Hầu như tất cả chúng đều sử dụng một loại ngôn ngữ mã giả, dễ hiểu cho mọi người (tốt, ngoại trừ TAOCP sử dụng lắp ráp ... nhưng đó là một câu chuyện khác)
Bakuriu

Bất thực? Nó có phải là một trò chơi tự động sửa lỗi từ trường đại học hay nó là một trường phái ma thuật đen? Tuy nhiên, tôi biết đến Đại học Unseen: [
Deer Hunter

Câu trả lời:


31

Tôi sẽ đi ngược lại dòng chảy ở đây và nói có, bạn phải học C. Tôi thực sự đồng ý với những điểm trong nhiều câu trả lời khác, nhưng bạn đưa ra tuyên bố rất mạnh mẽ rằng

Tôi rất thích tìm hiểu tất cả các khía cạnh của Khoa học Máy tính nhưng tôi muốn tin rằng tôi không thực sự phải biết một ngôn ngữ cụ thể để hiểu hầu hết các khái niệm trong Khoa học Máy tính.

(nhấn mạnh của tôi)

Chà, hệ điều hành và ngăn xếp mạng là hai khía cạnh lớn của Khoa học máy tính và tất cả các hệ điều hành và hệ thống mạng chiếm ưu thế được viết chủ yếu bằng C. Nếu bạn muốn hiểu những điều đó, bạn nên học C. Có, một số trường học có thể dạy các lớp HĐH của họ bằng Java, nhưng nó giống như đọc Homer bằng tiếng Anh.

Bên cạnh đó, C không phải là ngôn ngữ lớn. Nếu bạn thực sự muốn tìm hiểu tất cả các khía cạnh của khoa học máy tính, bạn nên nhún vai và nói 'meh', 'thêm một ngôn ngữ nữa?'


Tôi thường đồng ý với điều này, mặc dù với tôi "học" C có nghĩa là về cơ bản tôi đủ thông thạo ngôn ngữ để viết các chương trình không tầm thường trong đó mà không cần hỗ trợ. Tôi không chắc mức độ hiểu biết đó có phải là điều kiện tiên quyết cho các hệ điều hành và lập trình mạng hay không.
Telastyn

3
@Telastyn: điều đó có nghĩa là bạn đủ thông thạo để hiểu và sửa đổi mã hệ điều hành và mã mạng - các miền mà C được sử dụng và đó là nó. Điều đó không có nghĩa là bạn cần biết cách viết trò chơi bằng C, tạo giao diện người dùng đẹp và các ứng dụng biểu đồ trong C, đồ họa hoặc công cụ thông minh máy trong C; bởi vì đối với mọi miền khác của CS, có những lựa chọn ngôn ngữ khác.
rwong

12

Trong một thời gian rất dài, trong thời đại khoa học máy tính là khoa học chứ không phải là một ơn gọi, có một vài lựa chọn hạn chế cho một ngôn ngữ chạy trên tất cả các hệ thống mà tất cả các trường đại học khác nhau sử dụng.

Cho đến nay, các trường đại học có xu hướng sử dụng các hệ thống Unix. Thuận tiện, điều này đã được lập trình trong C. Người ta có thể bắt đầu học C trên bất kỳ máy nào và cuối cùng vào mã nguồn unix ở C. Ở nhà, học sinh có thể sử dụng trình biên dịch C như Borland Turbo C trên Windows hoặc MPW trên Mac - nó hoạt động ở mọi nơi.

Pascal là một lựa chọn khác, nhưng có một vấn đề là tại một thời điểm nhất định trong lập trình, nó không đủ ngôn ngữ để làm những gì bạn thực sự cần làm (lập trình một hệ điều hành trong pascal sẽ gây đau đớn).

Một số trường học cũ đã học Fortran, nhưng một lần nữa, nó không phải là ngôn ngữ đủ mạnh trong nhiều trường hợp để có thể dạy các lớp CS cấp cao hơn (lý thuyết AI trong fortran? Doable nhưng đau đớn).

Và vì vậy, trong một thời gian dài C là sự lựa chọn.

Đó không phải là sự lựa chọn duy nhất và hiện nay có rất nhiều trường đại học dạy bằng các ngôn ngữ khác để che giấu một số nội bộ và học các khái niệm cấp cao hơn mà không phải đối phó với sự xấu xí của quản lý bộ nhớ và những thứ tương tự. Một số nghĩ rằng điều này là tốt, một số nghĩ rằng điều này là xấu .


Vì vậy, không, học C không cần thiết để học khoa học máy tính. Bạn có thể tìm thấy nhiều cuốn sách khác dạy về khoa học máy tính từ Java hoặc Python. Chỉ là trong một thời gian dài, C là sự lựa chọn và sách học thuật di chuyển chậm.


Đối với hồ sơ, đào tạo AI được thực hiện theo truyền thống với người bạn đồng hành của C trong suốt thập niên 70 và 80, LISP, nhưng câu trả lời nằm ở đầu.
viết

@jwrush câu trả lời của tôi cũng giống với các bạn có thể học AI ở C, so với các ngôn ngữ khác cùng thời (không phải LISP - và tôi đã tham gia một lớp học không thể thiếu trong thập niên 90 cho AI). Được cấp, MIT (quê hương của những người tự cao) vào thời điểm đó đã dạy nhiều lớp học của họ trong LISP - và đó chắc chắn là một lựa chọn khác, nhưng không hoàn toàn thực tế trong các lĩnh vực khác. Trong giảng dạy, điều quan trọng là phải làm việc từ cùng một cơ sở trong mỗi lớp để người ta không phải dành tuần đầu tiên hoặc hai người dạy cho sinh viên một ngôn ngữ khác chuyên ngành cho lớp đó.

12

Tôi thừa nhận rằng một người có thể có được một công việc được trả lương cao và làm việc hiệu quả mà không bao giờ chạm vào C, nhưng tôi khuyên bạn nên học C cho bất kỳ ai nghiêm túc về hiểu biết vững chắc về khoa học máy tính.

Mặc dù khoa học máy tính là về các khái niệm, có thể được học bất kể ngôn ngữ lập trình cụ thể nào, có những lĩnh vực có thể được hiểu rõ hơn nhiều bằng cách học C hoặc bằng cách học lĩnh vực đó bằng C.

  • Thuật toán và cấu trúc dữ liệu. Tiêu chuẩn C hầu như không có điều nào trong số này - những điều này đã được thực hiện bằng ngôn ngữ hoặc trong thư viện tiêu chuẩn của nó có xu hướng làm mất tinh thần cho sinh viên: " Tại sao tôi phải bận tâm thực hiện điều gì đó có sẵn?"Nhìn vào một đoạn mã C, bạn sẽ thấy ngay chi phí thuật toán của nó, vì mọi thứ trong C chỉ biên dịch theo một vài lệnh máy. Các ngôn ngữ cấp cao (ví dụ Perl hoặc Python) thường sử dụng các cấu trúc dữ liệu nâng cao theo cú pháp nhẹ. Mã cảm thấy nhẹ, nhưng thực tế không phải vậy. Bạn đã cần rất nhiều kiến ​​thức để lý giải chính xác về độ phức tạp thuật toán của các đoạn mã đó. Do đó, các ngôn ngữ đó không phù hợp để học thuật toán và cấu trúc dữ liệu, và nhiều lập trình viên luôn sống trên các ngôn ngữ cấp cao, có xu hướng không có khả năng xử lý các vấn đề về hiệu suất, khi chúng gặp phải chúng.

  • Các hệ điều hành. Hầu hết các hệ điều hành được viết bằng C. Bạn muốn hiểu quá trình tạo mà không cần gọi forknhư thế nào? Lớp trừu tượng của Java VM không giúp được gì ở đây. Và chỉ nói về nó mà không bao giờ tạo ra một quy trình thậm chí còn tệ hơn ... Làm thế nào bạn có thể viết một phần mềm như Eclipse có thể chuyển hướng đầu ra tiêu chuẩn vào một trong các cửa sổ của nó? Bạn cần hiểu các khái niệm cấp hệ điều hành cho điều đó và bạn chỉ có thể chạm vào các khái niệm trực tiếp trong C.

  • Vô cảm. Bạn không thể làm C mà không làm việc với con trỏ. Con trỏ buộc bạn phải suy nghĩ ở hai cấp độ, và điều đó kéo dài các kỹ năng trừu tượng của bạn.

Ngoài ra còn có một số lợi thế kỹ thuật của kiến ​​thức C:

  • Khả năng tương tác đa ngôn ngữ. Bạn muốn tích hợp một mô-đun Ruby tuyệt vời vào dự án Python của mình (thay thế hai ngôn ngữ tùy ý ở đây). Có thể là cách duy nhất để làm điều đó, là thông qua C, bởi vì cả hai ngôn ngữ đều có giao diện nước ngoài với C.

  • Viết phần mềm quan trọng hiệu suất. Người ta không thể bỏ qua cấp thấp để làm điều này.


Tôi không nói rằng, mọi chương trình nên được viết bằng C. Nhưng C có thể giúp bạn hiểu biết, điều này hữu ích cho bất kỳ ngôn ngữ nào bạn lập trình.


Số học con trỏ là rất quan trọng để hiểu hệ điều hành vì dẫn đến lý do tại sao. Ví dụ: tại sao các đống và ngăn xếp khác nhau, tại sao bộ nhớ ảo hoạt động tốt hay kém, tại sao một số vòng lặp hoạt động nhanh hơn các vòng lặp khác, v.v.
Michael Storesin

6

Tôi cũng sẽ chống lại hạt gạo ở đây và cố gắng tạo ra một trường hợp thẩm mỹ (hơi hài hước) cho C. Trong khi một số người có thể gọi nó là "xấu xí" vì những lý do khác nhau, chẳng hạn như việc thiếu các cấu trúc cấp cao hơn như các lớp học hoặc nó phụ thuộc vào con trỏ, tôi thấy rằng đó không phải là trường hợp của tôi .

TL; DR : Theo tôi, C đơn giản, C tốt có thể đọc được và có một niềm vui nhất định được tìm thấy trong các bit đập.

C đơn giản

Tiêu chuẩn C chỉ định nghĩa một vài loại và cơ chế cơ bản để tạo các hàm, con trỏ và mảng trong số chúng. Trên hết, có một số lượng nhỏ các cấu trúc thành phần để tạo ra các loại phức tạp hơn từ các nguyên thủy (như cấu trúc và công đoàn). Lưu ý cách tôi mô tả hầu hết các ngôn ngữ trong hai câu. Điều này có nghĩa là bạn không phải giữ quá nhiều quy tắc và hình thức cú pháp trong đầu khi viết mã.

Đơn giản là đẹp .

C không phức tạp

Không giống như nhiều ngôn ngữ cấp cao hơn, bạn sẽ khó tìm thấy nhiều biểu tượng kỳ lạ, khó hiểu trong C. Trong thế giới C, cơ sở chính cho cả trừu tượng hóa và "nén cú pháp" là chức năng - về mặt ngữ nghĩa rất đơn giản và xây dựng tự giải thích. Phong cách C tốt khuyến khích vẻ đẹp gần như thơ mộng, dễ đọc. Để minh họa, chúng ta hãy thử đọc đoạn mã sau từ nhân Linux. Ngay cả khi không nắm bắt được các cấu trúc dữ liệu cơ bản và chi tiết triển khai, chúng ta có thể hiểu rất nhiều về những điều sau đây:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Phần giữa của hàm ghi "trong trường hợp không chắc là dòng điện bị đóng băng, hãy hỏi tủ lạnh nếu việc đóng băng thực sự xảy ra". Tiến sĩ Seuss không thể viết nó tốt hơn.

Đọc được là đẹp .

C là minh bạch

Trừ khi một câu lệnh C bao gồm một lệnh gọi hàm, bạn thường có thể có được một ý tưởng rất tốt về chi phí thời gian chạy và các tác dụng phụ của nó. C cung cấp cho người lập trình điều khiển và cuối cùng tin tưởng anh ta hoặc cô ta làm điều đúng đắn. Chúng ta có thể có được một bức tranh về những gì xảy ra khi đoạn trích này (được định dạng lại một chút cho SE) ra khỏi việc triển khai strlen()trong thư viện GNU C, bởi vì mọi toán tử đều có ngữ nghĩa được xác định rõ. Không có quá tải trong C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Đối với mục đích "tối ưu hóa", khách sạn này là tuyệt vời. Có thể cho rằng, một số ngôn ngữ cấp cao làm cho biểu thức ngắn gọn của thuật toán cấp cao dễ dàng hơn (như C ++ với các lớp và nạp chồng), nhưng với mục đích C được thiết kế để - hoạt động như một trình biên dịch di động - C là lý tưởng. Đôi khi, khi thực hiện thành công mã cấp thấp, một lập trình viên có thể cảm thấy một cái với máy, theo một nghĩa nào đó (hoặc bằng không - đó là một chi tiết triển khai). Điều này không có nghĩa là các ngôn ngữ khác là xấu, không đủ "zen" hoặc một thứ ngớ ngẩn như thế, chỉ là IMO C có thể thú vị theo cách mà nhiều ngôn ngữ khác đã chọn không tồn tại, vì nhiều lý do hợp lệ.

Theo tôi, ba điểm được trình bày ở trên giúp quản lý việc tạo ra các hệ thống phức tạp - nhưng hiệu quả -, được thể hiện trong tâm trí của tôi bởi Linux. Tôi thấy rằng thế giới này hấp dẫn sự nhạy cảm thẩm mỹ của tôi và tôi khuyên mọi người coi C là mục tiêu tiếp theo của mình để xem xét những điểm này. Tôi cảm thấy rằng các đối số về hệ điều hành và không có gì được hỗ trợ tốt hơn bằng cách nêu rõ chúng bởi vì người ta chắc chắn không cần phải hiểu hạt nhân để trở thành một lập trình viên thành công, nhưng người ta có thể thấy các lĩnh vực này hấp dẫn một cách chủ quan.


3

Ngôn ngữ lập trình bạn sử dụng để thảo luận về khoa học máy tính phần lớn không liên quan đến nhiệm vụ học phương tiện và khoa học máy tính.

Công trình bán kết (được cho là) ​​về Khoa học Máy tính, Nghệ thuật lập trình máy tính , không sử dụng bất kỳ ngôn ngữ hiện có nào để thông báo cho chủ đề. Thay vào đó, Donald Knuth chọn định nghĩa một máy tính hư cấu và ngôn ngữ máy hư cấu (và ngôn ngữ lắp ráp liên quan) theo cách mà ông thảo luận về tất cả các chủ đề.

Một tác phẩm được đánh giá cao khác về chủ đề này, Cấu trúc và diễn giải các chương trình máy tính , đã sử dụng một cách tiếp cận tương tự, nghĩ ra một phương ngữ đơn giản hóa của ngôn ngữ lập trình LISP để hoạt động như bối cảnh của chính nó. Ngôn ngữ này là những gì chúng ta biết bây giờ là Scheme.

Một công việc rất hay khác về Khoa học máy tính, Các yếu tố của hệ thống máy tính (thực sự là hai phần bằng nhau Kỹ thuật máy tính và Khoa học máy tính, và rất ngắn gọn), sử dụng cách tiếp cận cơ bản hơn trong việc dạy logic kỹ thuật số, từ đó nó xây dựng máy móc, các công cụ và ngôn ngữ, trước khi giảng dạy Khoa học Máy tính tiểu học.

Vì vậy, không, C không cần thiết cho sự hiểu biết về Khoa học Máy tính. Vấn đề là sự hiểu biết của bạn về các khái niệm cốt lõi của thuật toán và ứng dụng của chúng.


2

Tôi bắt đầu sự nghiệp lập trình bằng cách học vb3 từ sách hướng dẫn đi kèm với đĩa mềm được phát hành. Tôi đã học được một số java và có thể tạo ra một số chương trình đáng kính nhưng mãi đến khi tôi học C tại trường đại học, tôi mới cảm thấy rằng tôi thực sự hiểu những gì đang xảy ra "dưới mui xe". Bây giờ tôi chỉ làm việc với .net và không bao giờ thực sự lo lắng về con trỏ, địa chỉ không hợp lệ hoặc tràn - nhưng tôi hiểu chúng, điều này cho biết các quyết định tôi đưa ra hàng ngày và một số nội dung trường học cũ vẫn còn trong các ngôn ngữ hiện đại, cờ , hoạt động khôn ngoan bit, logic Boolean, tất cả các công cụ mạnh mẽ và rất hiệu quả.

Tìm hiểu C. Nó sẽ giúp bạn đứng vững. Tôi giữ một bản sao của cuốn sổ tay lập trình viên c trong nhiều năm và đọc Kernighan và Ritchie từ trang bìa này sang trang bìa khác. Không có vấn đề gì ngôn ngữ bạn kết thúc làm việc với Hiểu C chắc chắn sẽ giúp.


1

Có thể học Khoa học Máy tính mà không học C không?

Câu trả lời là Có. Tôi có bằng về CS và không bắt buộc phải học C, mà là Java. Ít nhất ở trường tôi, trọng tâm là học lập trình hướng đối tượng, với một số bài giảng về ngôn ngữ hội, cấu trúc dữ liệu và thiết kế cơ sở dữ liệu.


7
Bạn có chắc chắn bằng cấp của bạn bao trùm " tất cả các khía cạnh" của CS không?
SK-logic

Tôi sẽ nói tất cả các khía cạnh cần thiết. Không có bằng cấp bao gồm tất cả các khía cạnh của một chương trình cấp bằng. Cộng với "tất cả" là chủ quan.
PhillyNJ

1
Làm thế nào để bạn xác định "cần thiết"? Tất cả là tất cả - có nghĩa là, bao gồm tất cả các ứng dụng CS có thể. Nó không "chủ quan", nó khá định lượng.
SK-logic

Tôi xác định 'cần thiết' trong bối cảnh CS bao gồm nghiên cứu về tính toán và công nghệ máy tính, phần cứng và phần mềm và không phải bất kỳ ngôn ngữ cụ thể nào đang trả lời câu hỏi ban đầu.
PhillyNJ

Ok, và làm thế nào bạn sẽ bao gồm phần cứng mà không có ngôn ngữ cấp thấp? Làm thế nào bạn sẽ bao gồm lịch sử của các ngôn ngữ lập trình (vốn là một phần đặc biệt quan trọng của "tất cả" CS) mà không có ngôn ngữ chính như vậy? Làm thế nào bạn sẽ bao gồm ngữ nghĩa ngôn ngữ lập trình mà không có ít nhất một ngôn ngữ với mỹ phẩm con trỏ? Bằng cách này hay cách khác, nhưng một ngôn ngữ tương tự như C phải có trong bất kỳ chương trình giảng dạy CS toàn diện nào.
SK-logic

0

Nó thực sự phụ thuộc vào những gì bạn muốn làm với những gì bạn đang học. Điều chắc chắn là có rất nhiều thuật toán được đưa ra trong C hoặc hậu duệ của chúng. Tuy nhiên, trong nhiều năm qua tôi đã thấy nhiều ví dụ về C ++, C # và Java. Những gì CS có nghĩa là dạy là một sự hiểu biết chung về điện toán, và do đó làm thế nào để chọn hoặc tạo một ngôn ngữ phù hợp cho nhiệm vụ trong tay.

Tuy nhiên, vẫn còn rất nhiều người có ngôn ngữ đầu tiên và cuối cùng là một số biến thể của C hoặc Java và không phải tất cả họ sẽ được đào tạo để hiểu bất kỳ ngôn ngữ nào được cung cấp mà bằng cấp CS cung cấp. Thậm chí một số sinh viên tốt nghiệp CS gặp rắc rối với lập trình. Vì vậy, bạn có thể cần có một sự hiểu biết đủ tốt về những ngôn ngữ mà bạn có thể giao tiếp với chúng, tùy thuộc vào con đường sự nghiệp của bạn. Nếu bạn có kế hoạch gắn bó với học viện, thì bạn sẽ có nhiều rào cản ngôn ngữ hơn đối với nội dung, đặc biệt là trong các lĩnh vực liên ngành (nơi mọi người sử dụng prolog, lisp, haskell, mathicala, v.v.)


-1

Nếu bạn thực sự sẽ học "tất cả các khía cạnh của Khoa học máy tính" (kế hoạch đầy tham vọng!), Bạn sẽ phải đối phó với một số ngôn ngữ lắp ráp khác nhau và ít nhất một HDL (và thực hành mã hóa ở cấp độ danh sách mạng trong đó).

Và như một bước cấp cao hơn để tiếp cận những điều thực sự cơ bản này, bạn phải chọn thứ gì đó như C hoặc Pascal, điều đó là không thể tránh khỏi. Bỏ qua các bước trên một bậc thang trừu tượng là phản tác dụng.

Dù sao, tôi nghi ngờ câu hỏi này thậm chí đáng để hỏi. Rốt cuộc, C chỉ là một ngôn ngữ nhỏ. Bạn có thể đã học những điều cơ bản của nó trong một thời gian ngắn hơn là bạn lãng phí khi suy nghĩ về việc bạn có phải học C hay không.

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.