Những nguyên tắc nào được học từ C mà không thể học được bằng các ngôn ngữ cấp cao hơn? [đóng cửa]


11

Tôi tin rằng C là một ngôn ngữ tốt để tìm hiểu các nguyên tắc đằng sau lập trình. Bạn sẽ học được gì trong các ngôn ngữ cấp thấp bị "phù phép" khỏi các ngôn ngữ cấp cao, chẳng hạn như Ruby?


2
Bạn học phép thuật, hoặc một số của nó, dù sao. Vì C "gần với kim loại hơn" nên bạn tìm hiểu thêm về kim loại.
Robert Harvey

1
Tôi chưa bao giờ hiểu đầy đủ về khái niệm tham chiếu cho đến khi tôi gặp C ++.
dùng6245072

6
C sẽ dạy cho bạn biết một ngăn xếp tràn thực sự là gì. Con đường gian nan.
david25272

1
Tôi ước các lập trình viên mới sẽ bắt đầu bằng cách học Pascal cũ và lập trình có cấu trúc. Bạn học cách thể hiện bản thân một cách logic và có cấu trúc.
Bent

2
Một điều mà chỉ C và C ++ dạy cho bạn là trình biên dịch là kẻ thù tồi tệ nhất của bạn.
CodeInChaos

Câu trả lời:


9

Không có nguyên tắc, theo nghĩa trừu tượng chung của khoa học máy tính, hiện diện trong C mà cũng không có trong các ngôn ngữ cấp cao hơn. Tất cả các khoa học máy tính tập trung vào các thuật toán và tất cả các thuật toán có thể được thực hiện bằng bất kỳ ngôn ngữ nào là Turing-Complete như C là.

Sự khác biệt mà C mang theo ngoài các ngôn ngữ cấp cao hơn tương tự như sự khác biệt mà mã máy mang theo ngoài C: Mối quan hệ của máy với mã.

Khi bạn viết mã bằng các ngôn ngữ cấp cao, bạn thường không quan tâm đến việc mã của bạn tương tác với máy như thế nào. Máy ảo mà ngôn ngữ tự xác định ẩn chứa nhiều khía cạnh của việc thực thi mã.

Trong C, sự tương tác của chương trình với bộ nhớ của bạn được đặt lên hàng đầu. Không chỉ đơn thuần là bạn phải quản lý việc sử dụng heap, nó bao gồm sự tương tác của mã với ngăn xếp và cách truy cập bộ nhớ đơn thuần của mã ảnh hưởng đến hành vi và hiệu suất của mã của bạn - thậm chí không theo thứ tự truy cập bộ nhớ có thể được phép thoát khỏi sự chú ý của bạn, vì đọc sai bộ nhớ không đúng lúc có thể làm tê liệt hiệu quả.

Trong các ngôn ngữ cấp cao hơn, những điều này chỉ đơn giản là không rõ ràng. Bộ nhớ được phân bổ và giải quyết mà không có kiến ​​thức của bạn, và đôi khi không có sự nhắc nhở của bạn. Thông thường, điều này chỉ đơn giản là ngoài tầm kiểm soát của bạn. Thời gian, ở đâu, như thế nào và tại sao của hầu hết các phân bổ bộ nhớ chỉ đơn giản là ẩn khỏi bạn.

Tương tự như vậy, theo một hướng khác, viết mã máy hoặc mã lắp ráp mang lại nhiều chi tiết hơn cho tiền cảnh: Hầu như không có gì còn lại ngoài tầm nhìn của bạn và mã của bạn phải được ghi nhận về mọi phân bổ, mọi tài nguyên, mọi phần dữ liệu đi qua thông qua các thanh ghi của CPU - kiến ​​thức đã bị loại bỏ khỏi các ngôn ngữ cấp cao như là phức tạp.


6
Tôi chưa bao giờ hiểu tại sao mọi người luôn đề cập đến tính đầy đủ của Turing trong các loại thảo luận này. Turing-đầy đủ không có ý nghĩa trong bối cảnh này; C không khác với các ngôn ngữ lập trình khác về khía cạnh đó, vì vậy không có gì để học về tính đầy đủ của Turing bằng cách chuyển sang C. Thời gian duy nhất Turing-đầy đủ trở nên có liên quan là khi thảo luận về một thứ không hoàn chỉnh, như CSS hoặc HTML . Chết tiệt, nếu bạn nheo mắt đủ mạnh, ngay cả những thứ đó là Turing-Complete . Các câu hỏi có ý nghĩa hơn tập trung vào khả năng sử dụng.
Robert Harvey

3
@RobertHarvey Quan điểm của tôi là miễn là ngôn ngữ có khả năng tính toán tối thiểu hợp lý, "cấp độ" của nó trở nên không liên quan theo quan điểm của thuật toán, đó là điều duy nhất quan trọng trong bối cảnh này.
greyfade

3
Bởi vì bạn đang đưa ra một quan điểm hoàn toàn không quan trọng đối với câu hỏi của OP. Các lập trình viên làm điều này mọi lúc; họ ném xung quanh cụm từ "Turing-Complete" giống như nó thực sự có một số cách sử dụng có ý nghĩa trong các thuật ngữ thực tế. Nó không, ngoại trừ chỉ ra rằng nó không quan trọng.
Robert Harvey

2
<trớ trêu> Sinh học chỉ là một trường hợp đặc biệt của hóa học, là trường hợp đặc biệt của vật lý hạt. Không có gì bạn có thể học từ sinh học nếu bạn biết vật lý hạt. Phải không? </ Trớ trêu>
Florian F

3
Đáng để chỉ ra rằng C đơn giản yêu cầu bạn phân bổ và giải quyết rõ ràng, nhưng họ vẫn quan tâm đến một cỗ máy trừu tượng, giống như trong các ngôn ngữ "cấp cao hơn" - máy x86 vật lý (ví dụ) vẫn nằm ngoài phạm vi của C. Một có thể tạo một VM hộp cát hoàn hảo để giải thích mã C nhưng không có quyền kiểm soát phân bổ bộ nhớ của máy vật lý và nó vẫn có thể là một triển khai tuân thủ 100%.
Theodoros Chatzigiannakis

13

Tôi biết C là một ngôn ngữ tốt để tìm hiểu các nguyên tắc đằng sau lập trình.

Tôi không đồng ý. C vắng mặt quá nhiều tính năng để học các nguyên tắc đằng sau lập trình. Các tính năng của C để tạo ra sự trừu tượng là rất tệ và sự trừu tượng là một trong những nguyên tắc chính của lập trình.

Nếu bạn muốn tìm hiểu cách thức hoạt động của phần cứng và do đó có một số thiện cảm cơ học cho máy, bạn nên tìm hiểu mã máy, hay còn gọi là kiến ​​trúc tập lệnh và cũng nghiên cứu cấu trúc bộ đệm của CPU hiện đại. Lưu ý rằng tôi không khuyến nghị ngôn ngữ lắp ráp, chỉ cần hiểu các hướng dẫn phần cứng, vì vậy bạn hiểu trình biên dịch tạo ra những gì.

Nếu bạn muốn học các nguyên tắc lập trình, hãy sử dụng một ngôn ngữ hiện đại như Java, C # hoặc Swift hoặc một trong hàng tá ngôn ngữ khác như Rust. Ngoài ra, nghiên cứu các loại mô hình lập trình khác nhau, bao gồm cả chức năng.


12
C chỉ tốt trong việc tạo ra sự trừu tượng. Bạn có thể viết các phương thức trong C và bạn có thể đóng gói dữ liệu dưới dạng các cấu trúc trong C. Toàn bộ hệ điều hành đã được xây dựng bằng C. Điều C không tốt là thỏa mãn ý tưởng "hiện đại" của mọi người về hướng nhìn đối tượng được nhìn giống.
Robert Harvey

4
Không hẳn. C là cấp độ khá cao hơn một chút so với ASM. Chỉ không mong đợi sử dụng các lớp trong đó, mặc dù có nhiều cách để làm điều đó , nếu bạn rất có khuynh hướng.
Robert Harvey

4
Thay thế "Brainfuck" cho "trình biên dịch" trong nhận xét của bạn và nó vẫn đúng. Nhưng điều đó không có nghĩa là tôi sẽ sớm sử dụng Brainfuck.
Robert Harvey

6
Lập luận của bạn về các tính năng của C thực sự chỉ có giá trị nếu bạn tin rằng các lớp (và bộ sưu tập rác, v.v.) là một yếu tố cần thiết để dạy một lập trình viên mới (mà tôi không biết). Không ai ở đây đang ủng hộ việc cố gắng sử dụng các lớp trong một ngôn ngữ không có lớp.
Robert Harvey

5
@Robert, lập luận của tôi là C là ngôn ngữ cấp thấp hơn và vì vậy nó hầu như không phải là ngôn ngữ tốt nhất để hiểu các nguyên tắc lập trình, mà chúng ta cũng có thể nói về trình biên dịch, và, vì chúng là ngôn ngữ cấp thấp hơn không có nghĩa chúng bằng cách nào đó gần hơn với các nguyên tắc lập trình "thực sự". Thay vào đó, các ngôn ngữ này tốt hơn để hiểu cách phần cứng và hệ điều hành hoạt động và nếu đó là mối quan tâm, tôi khuyên bạn nên bỏ qua mức thấp nhất, trong kiến ​​thức thiết lập hướng dẫn học tập và ngôn ngữ máy. Mặt khác, có rất nhiều ngôn ngữ để lựa chọn.
Erik Eidt

8

C và máy (Tóm tắt)

Hầu hết các ngôn ngữ lập trình được mô tả dưới dạng các máy trừu tượng. Sau đó, chúng được triển khai bằng cách sử dụng các bộ công cụ như trình biên dịch, trình liên kết, trình biên dịch, trình thông dịch, máy phân tích tĩnh, ngôn ngữ trung gian và phần cứng sẽ tạo ra một kết quả nhằm tôn vinh ít nhất tất cả các hành vi dự kiến ​​của máy trừu tượng, như được quan sát bởi một chương trình .

C không phải là một ngoại lệ cho quy tắc trên. Nó được mô tả dưới dạng một cỗ máy trừu tượng không có khái niệm về phần cứng thực tế của bạn.

Như vậy, khi mọi người nói rằng C dạy cho bạn cách máy tính của bạn thực sự hoạt động, điều họ thường nói là C dạy cho bạn cách C hoạt động. Nhưng C rất phổ biến trong lập trình hệ thống, có thể hiểu rằng rất nhiều người bắt đầu nhầm lẫn nó với chính máy tính. Và cá nhân tôi sẽ đi xa hơn khi nói rằng việc biết C hoạt động như thế nào thường quan trọng hơn việc biết chính máy tính hoạt động như thế nào.

Tuy nhiên, C và máy tính những thứ khác nhau. Phần cứng thực tế rất phức tạp - theo cách làm cho thông số C đọc giống như một cuốn sách dành cho trẻ em. Nếu bạn quan tâm đến cách phần cứng của bạn hoạt động, bạn luôn có thể tra cứu hướng dẫn và bắt đầu viết mã trong trình biên dịch. Hoặc bạn luôn có thể bắt đầu tìm hiểu về các mạch kỹ thuật số để bạn có thể tự thiết kế một số phần cứng. (Ít nhất, bạn sẽ đánh giá cao mức độ C là bao nhiêu.)

Làm thế nào làm bạn học? Và bạn học như thế nào?

Được rồi, thực sự học về phần cứng liên quan đến những thứ khác ngoài C. Nhưng C có thể dạy bất cứ điều gì khác cho các lập trình viên ngày nay không?

Tôi nghĩ rằng nó phụ thuộc.

  • Có một số người sẽ nói rằng bạn có thể học tốt hơn một khái niệm bằng cách làm việc trong một môi trường cung cấp nó và khuyến khích nó, thường theo nhiều cách.
  • Có một số người sẽ nói rằng bạn có thể học tốt hơn một khái niệm bằng cách làm việc trong một môi trường không cung cấp nó và thay vào đó bạn phải tự xây dựng nó.

Đừng quá nhanh để chọn một trong những khả năng này. Tôi đã viết mã trong nhiều năm và tôi vẫn không biết câu nào là câu trả lời đúng, hoặc liệu câu trả lời đúng chỉ là một trong hai, hoặc liệu có một câu trả lời đúng về vấn đề này không.

Tôi hơi có xu hướng tin rằng cuối cùng bạn có thể nên áp dụng cả hai lựa chọn, một cách lỏng lẻo theo thứ tự tôi đã mô tả chúng. Nhưng tôi không nghĩ đây thực sự là một vấn đề kỹ thuật, tôi nghĩ đó là một vấn đề chủ yếu mang tính giáo dục. Mỗi người dường như học theo những cách khác nhau đáng kể.

Độc quyền trong C

Nếu bạn trả lời câu hỏi trên ít nhất là liên quan đến tùy chọn thứ hai mà tôi đã đề xuất, thì bạn đã có một vài câu trả lời trong vành đai của mình: mọi thứ có thể học bằng ngôn ngữ cấp cao hơn có thể được học tốt hơn bằng cách phát minh lại bằng C hoặc tại ít mở rộng nhất bằng cách thêm C vào hỗn hợp.

Nhưng, bất kể câu trả lời của bạn là gì, chắc chắn có một vài điều mà bạn có thể học gần như độc quyền từ C (và có lẽ là một số ít ngôn ngữ khác).

  • C là lịch sử quan trọng. Đó là một cột mốc mà bạn có thể nhìn vào và đánh giá cao nơi chúng tôi đến và có thể có thêm một chút bối cảnh về nơi chúng tôi sẽ đến. Bạn có thể đánh giá cao tại sao những hạn chế nhất định tồn tại và bạn có thể đánh giá cao những hạn chế nhất định đã được dỡ bỏ.

  • C có thể dạy bạn làm việc trong môi trường không an toàn. Nói cách khác, nó có thể huấn luyện bạn quan sát lưng khi ngôn ngữ (bất kỳ ngôn ngữ nào) không thể hoặc sẽ không làm điều đó cho bạn, vì bất kỳ lý do nào. Điều này có thể giúp bạn trở thành một lập trình viên tốt hơn ngay cả trong môi trường an toàn vì bạn sẽ tự tạo ra ít lỗi hơn và vì bạn sẽ có thể tắt an toàn tạm thời để giảm tốc độ thêm khỏi chương trình an toàn khác của bạn (ví dụ: sử dụng con trỏ trong C #), trong những trường hợp an toàn đi kèm với chi phí thời gian chạy.

  • C có thể dạy cho bạn rằng mọi đối tượng đều có yêu cầu lưu trữ, bố trí bộ nhớ, thực tế là bộ nhớ có thể được truy cập thông qua một không gian địa chỉ hữu hạn, v.v. Mặc dù các ngôn ngữ khác không cần sự chú ý của bạn về những vấn đề này, có một vài trường hợp trong đó một số trực giác có được có thể giúp bạn đưa ra quyết định sáng suốt hơn.

  • C có thể dạy cho bạn về các chi tiết của các tập tin liên kết và đối tượng và các vấn đề phức tạp khác thông qua hệ thống xây dựng của nó. Điều này có thể cung cấp cho bạn một sự hiểu biết thực hành hữu ích về cách một chương trình được biên dịch nguyên bản thường đi từ mã nguồn đến thực thi.

  • C có thể uốn cong tâm trí của bạn để suy nghĩ theo những cách mới lạ thông qua khái niệm hành vi không xác định. Hành vi không xác định là một trong những khái niệm yêu thích của tôi trong phát triển phần mềm, bởi vì nghiên cứu về ý nghĩa của nó đối với các trình biên dịch phi cổ điển là một bài tập tinh thần độc đáo mà bạn không thể có được từ các ngôn ngữ khác. Tuy nhiên, bạn sẽ phải từ chối thử và sai và bắt đầu nghiên cứu ngôn ngữ một cách cẩn thận và thận trọng trước khi bạn có thể đánh giá đầy đủ khía cạnh này.

  • Nhưng có lẽ nhận thức quan trọng nhất mà C có thể cấp cho bạn, là một ngôn ngữ nhỏ, là ý tưởng rằng tất cả các chương trình đều tập trung vào dữ liệu và hoạt động . Bạn có thể xem mọi thứ như các lớp mô-đun với hệ thống phân cấp và giao diện với công văn ảo hoặc các giá trị bất biến thanh lịch được vận hành bằng cách sử dụng các hàm toán học thuần túy. Và đó là tất cả tốt - nhưng C sẽ nhắc nhở bạn rằng tất cả chỉ là dữ liệu + hoạt động . Đó là một suy nghĩ hữu ích vì nó cho phép bạn đưa ra khá nhiều rào cản về tinh thần.


5

Lý do tại sao C tốt cho việc học không phải là nó dạy bất kỳ nguyên tắc nào . Nó dạy bạn, cách mọi thứ hoạt động .

C có thể được so sánh với một trong những chiếc xe cũ tốt từ những năm 70 hoặc 80, được chế tạo để lái. Bạn có thể xé chúng ra, vặn bằng vít và hiểu cách thức từng bộ phận hoạt động và cách thức hoạt động cùng với các bộ phận khác mà bạn có thể cầm trong tay để xem xét. Một khi bạn hiểu tất cả các bộ phận, bạn có một bức tranh rất rõ ràng làm thế nào toàn bộ hoạt động.

Ngôn ngữ hiện đại giống như một chiếc xe hơi hiện đại, trong đó động cơ về cơ bản là một hộp đen, quá phức tạp để có thể hiểu được bởi chủ sở hữu xe hơi trung bình. Những chiếc xe đó có thể làm rất nhiều, quái gì, trong những ngày này, chúng đang tích cực học lái xe. Và với sự phức tạp và thoải mái đó, giao diện người dùng đã được di chuyển ra xa hơn nhiều so với những gì đang thực sự diễn ra trong động cơ.

Khi bạn học lập trình bằng C, bạn tiếp xúc với rất nhiều ốc vít và đai ốc mà máy tính được tạo ra. Điều này cho phép bạn phát triển sự hiểu biết về chính máy. Chẳng hạn, nó cho phép bạn hiểu tại sao việc xây dựng một chuỗi dài như thế này không phải là một ý tưởng hay:

java.lang.String result = "";
for(int i = 0; i < components.size; i++) {
     result = result + components[i];
};

(Tôi hy vọng, đây là Java chính xác, tôi đã không sử dụng nó trong một thời gian ...) Từ ví dụ mã này, không rõ tại sao vòng lặp có độ phức tạp bậc hai. Nhưng đó là trường hợp, và đó là lý do tại sao mã này sẽ dừng lại khi bạn có một vài triệu thành phần nhỏ để nối. Lập trình viên C có kinh nghiệm biết ngay vấn đề đang ở đâu và có thể sẽ tránh viết mã như vậy ngay từ đầu.


Tôi hoàn toàn đồng ý. C sẽ dạy cho bạn nhiều về cách mọi thứ hoạt động, đi một chặng đường dài để hiểu a) tại sao các ngôn ngữ cấp cao hơn được viết (ví dụ, ý nghĩa của chúng để trừu tượng hóa) và b) làm thế nào những ngôn ngữ cấp cao đó hoạt động đằng sau hậu trường, chắc chắn kiến ​​thức tốt phải có. Nó sẽ không dạy các nguyên tắc và có thể không dễ dàng, nhưng kết quả là bạn sẽ tôn trọng nó, máy tính và hiểu sâu hơn về các ngôn ngữ cấp cao hơn. Đồng thời đọc Back to Basic của Joel Spolsky: joelonsoftware.com/articles/fog0000000319.html
jleach

1
Câu trả lời của bạn chắc chắn là tốt, nhưng nếu bạn viết for(int i = 0; i < strlen(s); i++)bằng C, vòng lặp cũng sẽ có độ phức tạp bậc hai và nó cũng không khó hiểu như trong ví dụ Java của bạn ;-)
Doc Brown

Không chắc chắn, nhưng tôi sẽ tin tưởng trình biên dịch Java để tối ưu hóa điều này :-)
Bruno Schäpper

Lập trình viên Java có kinh nghiệm cũng biết ngay vấn đề đang ở đâu và có thể sẽ tránh viết mã như vậy ngay từ đầu. Vấn đề cụ thể này được thảo luận trong các hướng dẫn Java cơ bản. Vì vậy, đây chắc chắn không phải là thứ có thể học được từ C mà không phải từ Java.
Peter Taylor

@PeterTaylor Nếu bạn có một người hướng dẫn Java biết C của họ, vâng. Nhưng tôi nghi ngờ rằng loại kiến ​​thức này sẽ tồn tại một khi những người biết C đã chết. Đối với lập trình viên C, chính định nghĩa về chuỗi C là gì, cho họ biết ví dụ mã của tôi không thể hiệu quả. Đối với lập trình viên Java, đó là một số kiến ​​thức sâu sắc, phức tạp và ít được sử dụng về các khái niệm trừu tượng mà họ sử dụng, điều này cho họ biết để tránh loại mã này. Ok, tôi đang phóng đại một chút ở đây, nhưng bạn có ý tưởng: Lập trình viên C phải biết điều đó, lập trình viên Java có thể thoát khỏi việc không biết điều đó.
cmaster - phục hồi monica

2

Có những ngôn ngữ tốt hơn C để học "các nguyên tắc đằng sau lập trình", đặc biệt là các nguyên tắc lý thuyết, nhưng C có thể tốt để học một số điều thực tế, quan trọng về nghề thủ công. Câu trả lời của greyfade hoàn toàn chính xác, nhưng IMHO có nhiều thứ bạn có thể học từ C hơn là cách tự quản lý bộ nhớ. Ví dụ,

  • Làm thế nào để tạo các chương trình xử lý lỗi hoàn toàn trong trường hợp không có ngoại lệ

  • Làm thế nào để tạo cấu trúc trong một chương trình mà không cần bất kỳ sự hỗ trợ ngôn ngữ nào cho việc định hướng đối tượng

  • Làm thế nào để xử lý dữ liệu khi không có cấu trúc dữ liệu như danh sách kích thước động, từ điển hoặc trừu tượng chuỗi hữu ích

  • Làm thế nào để tránh các lỗi phổ biến như tràn mảng ngay cả khi trình biên dịch hoặc môi trường thời gian chạy không tự động cảnh báo bạn

  • Làm thế nào để tạo các giải pháp chung chung mà không cần hỗ trợ ngôn ngữ cho các mẫu hoặc chung chung

  • và tôi đã đề cập đến việc bạn có thể tự học cách quản lý bộ nhớ chưa? ;-)

Hơn nữa, bằng cách học C, bạn sẽ học được điểm tương đồng cú pháp của C ++, Java, C #, Objective C đến từ đâu.

Năm 2005, Joel Spolsky đã viết một đề nghị học C trước bất kỳ ngôn ngữ cấp cao nào khác. Lập luận của anh ấy là

  • "bạn sẽ không bao giờ có thể tạo mã hiệu quả bằng các ngôn ngữ cấp cao hơn."

  • "Bạn sẽ không bao giờ có thể làm việc trên các trình biên dịch và hệ điều hành, đó là một số công việc lập trình tốt nhất xung quanh."

  • "Bạn sẽ không bao giờ được tin tưởng để tạo ra kiến ​​trúc cho các dự án quy mô lớn"

  • "Nếu bạn không thể giải thích tại sao sao while(*s++ = *t++);chép một chuỗi hoặc nếu đó không phải là điều tự nhiên nhất trên thế giới đối với bạn, thì, bạn đang lập trình dựa trên sự mê tín

Tất nhiên, những gì anh ấy viết chắc chắn là có thể gây tranh cãi, nhưng IMHO rất nhiều lập luận của anh ấy vẫn còn hiệu lực cho đến ngày nay.


1
C là một ngôn ngữ rất tốt để học trước khi bạn học những "cấp độ cao hơn mà bạn nghĩ C không hỗ trợ", bởi vì nó giúp bạn hiểu những thứ đó thực sự hoạt động như thế nào (và chúng đắt như thế nào).
Brendan

@Brendan: Tôi không chắc ý định bình luận của bạn là thể hiện một thỏa thuận, một sự bất đồng hay chỉ là một phụ đề cho câu trả lời của tôi.
Doc Brown

Các chương trình C được viết bởi các chuyên gia được phát hành với lỗi tràn bộ đệm và các sự cố cứng. Vì vậy, trong khi một lập trình viên kỷ luật có thể chọn học những điều này , thì ngôn ngữ C vốn không chỉ dạy bằng cách nghèo nàn. Có rất nhiều cách xấu (và tệ hơn là trộn nhiều cách không nhất quán) để xử lý lỗi mà không có ngoại lệ và tạo cấu trúc không có đối tượng, chẳng hạn.
Erik Eidt

@ErikEidt: thực sự, nhưng đặc biệt là trong tầng sinh thái C tồn tại rất nhiều sách, hướng dẫn và tài liệu khác sẽ giải quyết các chủ đề này. Ví dụ: "Viết mã vững chắc" của Steve Maguire. Tất nhiên, nếu ai đó chọn phiên bản đầu tiên của K & R để học cú pháp ngôn ngữ, có lẽ anh ta sẽ không trở thành một lập trình viên giỏi hơn.
Doc Brown

1

Hai tóm tắt cơ bản của điện toán là máy Turing và máy tính Lambda, và C là một cách để thử nghiệm quan điểm tính toán của máy Turing: chủ yếu là sự kế thừa của các hành động cấp thấp từ đó đưa ra kết quả mong muốn. Nhưng bạn phải nhớ rằng C đi kèm với mô hình tính toán của riêng nó. Vì vậy, học C sẽ dạy cho bạn các chi tiết cấp thấp của máy trừu tượng C, nó đang trở nên khá khác biệt so với các kiến ​​trúc thực tế. Một trong những điều đầu tiên tôi được dạy trong C là không bao giờ cố gắng vượt qua trình biên dịch bằng cách áp dụng các thủ thuật "thông minh" và dường như xu hướng này ngày càng hướng tới việc tối ưu hóa nhiều hơn trong trình biên dịch. Giống như trong các ngôn ngữ cấp cao khác, khi bạn viết bằng C, trình biên dịch sẽ hiểu những gì bạn mong muốn được thực hiện trên máy C trừu tượng và thực hiện điều đó trên phần cứng thực tế,

Vì vậy, điều tôi muốn nói là việc học C không nhất thiết sẽ cho bạn một bức tranh tốt về những gì thực sự xảy ra trong phần cứng. "C gần với máy" nên được hiểu là "gần hơn hầu hết các ngôn ngữ cấp cao hơn". Học trực tiếp kiến ​​trúc phần mềm sẽ trở nên bổ ích hơn nếu bạn muốn có một bức tranh chính xác hơn về "cách thức hoạt động".

Mặt khác, học C có thể giúp bạn làm quen với lập trình hệ thống, các loại cấp thấp, con trỏ và phân bổ bộ nhớ cụ thể. Đối với việc học các thuật toán và cấu trúc dữ liệu, tôi không có lợi thế để học chúng bằng C hơn là các ngôn ngữ khác.


1
Vì vậy, những gì C có thể dạy cho bạn rằng ngôn ngữ cấp cao hơn không thể?
Philip Kendall

2
Tôi nghĩ rằng câu trả lời ngầm là: " Không có gì , ít nhất không phải là những điều mà những người đề xướng thường yêu cầu". Đó là cách tôi hiểu câu trả lời.
Jörg W Mittag

-3

Đó là câu hỏi kết thúc rất mở, có thể không trả lời kết luận. Bạn có thể học được khá nhiều thứ trong mọi ngôn ngữ với điều kiện bạn hiểu được nội bộ của khung ngôn ngữ. C buộc bạn phải hiểu chi tiết thấp hơn vì nó chủ yếu được thiết kế để viết một hệ điều hành. Ngay cả sau nhiều năm, nó vẫn là một trong những ngôn ngữ được sử dụng nhiều nhất chủ yếu nhờ vào các hệ thống nhúng và các dự án nguồn mở. Vì vậy, câu hỏi là những gì bạn muốn học? Và trong miền nào?

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.