Lập trình cấp thấp - những gì trong đó cho tôi? [đóng cửa]


32

Trong nhiều năm, tôi đã cân nhắc đào sâu vào những gì tôi coi là ngôn ngữ "cấp thấp". Đối với tôi điều này có nghĩa là C và lắp ráp. Tuy nhiên tôi không có thời gian cho việc này, nó cũng không cần thiết.

Bây giờ vì tôi không thấy bất kỳ sự cần thiết nào phát sinh, tôi cảm thấy mình chỉ nên sắp xếp thời gian để học môn học hoặc bỏ kế hoạch mãi mãi.

Vị trí của tôi

Trong 4 năm qua tôi đã tập trung vào "công nghệ web", có thể thay đổi và tôi là nhà phát triển ứng dụng, không có khả năng thay đổi.

Trong phát triển ứng dụng, tôi nghĩ khả năng sử dụng là điều quan trọng nhất. Bạn viết các ứng dụng sẽ được "tiêu thụ" bởi người dùng. Các ứng dụng đó càng có thể sử dụng được, bạn càng tạo ra nhiều giá trị.

Để đạt được khả năng sử dụng tốt, tôi tin rằng những điều sau đây là khả thi

  • Thiết kế tốt : Các tính năng được cân nhắc kỹ lưỡng có thể truy cập thông qua giao diện người dùng chu đáo.
  • Tính chính xác : Thiết kế tốt nhất không có giá trị gì, nếu không được thực hiện đúng.
  • Tính linh hoạt : Một ứng dụng A cần liên tục phát triển, để người dùng không cần chuyển sang một ứng dụng B khác, có các tính năng mới, mà A có thể thực hiện. Các ứng dụng giải quyết cùng một vấn đề không nên khác nhau về tính năng nhưng về triết lý.
  • Hiệu suất : Hiệu suất đóng góp cho trải nghiệm người dùng tốt. Một ứng dụng lý tưởng luôn đáp ứng và thực hiện các nhiệm vụ của nó một cách hợp lý nhanh chóng (dựa trên tần số của chúng). Giá trị của tối ưu hóa hiệu suất vượt quá điểm mà người dùng có thể nhận thấy là đáng nghi ngờ.

Tôi nghĩ rằng lập trình cấp thấp sẽ không giúp tôi điều đó, ngoại trừ hiệu suất. Nhưng viết toàn bộ ứng dụng bằng ngôn ngữ cấp thấp vì mục đích hiệu suất là tối ưu hóa sớm đối với tôi.

Câu hỏi của tôi

Những gì lập trình cấp thấp có thể dạy tôi, những ngôn ngữ khác sẽ không dạy tôi? Tôi có thiếu một cái gì đó không, hay nó chỉ là một kỹ năng, được sử dụng rất ít để phát triển ứng dụng? Xin hãy hiểu rằng tôi không đặt câu hỏi về giá trị của C và lắp ráp. Chỉ là trong cuộc sống hàng ngày của tôi, tôi khá vui khi tất cả những điều phức tạp của thế giới đó được trừu tượng hóa và quản lý cho tôi (chủ yếu là các lớp được viết bằng C / C ++ và tự lắp ráp). Tôi chỉ không thấy bất kỳ khái niệm nào, có thể là mới đối với tôi, chỉ có chi tiết tôi sẽ phải nhét đầu vào. Vì vậy, những gì trong đó cho tôi?

Kết luận của tôi

Cảm ơn tất cả mọi người cho câu trả lời của họ. Tôi phải nói rằng, không ai thực sự làm tôi ngạc nhiên, nhưng ít nhất bây giờ tôi khá chắc chắn rằng tôi sẽ bỏ lĩnh vực quan tâm này cho đến khi có nhu cầu về nó.
Theo hiểu biết của tôi, việc viết lắp ráp ngày nay cho các bộ xử lý khi chúng được sử dụng trong các CPU ngày nay không chỉ phức tạp một cách bất thường mà còn có nguy cơ dẫn đến hiệu năng thời gian chạy kém hơn so với đối tác C. Tối ưu hóa bằng tay gần như là không thể do OOE, trong khi bạn không nhận được tất cả các loại tối ưu hóa mà trình biên dịch có thể thực hiện tự động. Ngoài ra, mã này là di động, bởi vì nó sử dụng một tập hợp nhỏ các lệnh có sẵn hoặc được tối ưu hóa, nhưng sau đó nó có thể chỉ hoạt động trên một kiến ​​trúc.
Viết C gần như không cần thiết nữa, như trong quá khứ. Nếu tôi viết một ứng dụng bằng C, tôi sẽ sử dụng nhiều thư viện và khung đã được kiểm tra và thiết lập, điều đó sẽ giúp tôi thực hiện các thói quen sao chép chuỗi, sắp xếp các thuật toán và các công cụ khác phục vụ như bài tập ở trường đại học. Mã riêng của tôi sẽ thực thi nhanh hơn với chi phí an toàn loại. Tôi không quan tâm đến việc tái cấu trúc bánh xe trong quá trình phát triển ứng dụng thông thường, cũng không cố gắng gỡ lỗi bằng cách xem xét các bãi rác cốt lõi: D
Tôi hiện đang thử nghiệm ngôn ngữ và thông dịch viên, vì vậy nếu có bất cứ điều gì tôi muốn xuất bản, tôi cho rằng tôi Sẽ chuyển một khái niệm hoạt động sang C, mặc dù C ++ cũng có thể thực hiện thủ thuật này.
Một lần nữa, cảm ơn mọi người vì câu trả lời và cái nhìn sâu sắc của bạn.


6
@TheLQ: câu hỏi của tôi không phải là tại sao sử dụng nó, mà là những gì tôi có thể học được từ nó .
back2dos


Câu trả lời:


9

Lập trình cấp thấp dành cho các trường hợp góc trong đó có một yêu cầu không xuất hiện ngay trên các máy tính để bàn thông thường. Đây có thể là một nút cổ chai tốc độ, hoặc tắc nghẽn bộ nhớ hoặc một cái gì đó hoàn toàn khác, và rất thường xuyên rất thú vị để xem những gì có thể được thực hiện theo những yêu cầu đó.

Hãy nghĩ về nó như Haikus hoặc Limericks, nơi những hạn chế làm cho nó thú vị.

Để cho bạn một ý tưởng về những gì có thể xảy ra trong những điều dường như không thể ngày nay, đây là một trong những vụ hack lớn nhất từ ​​trước đến nay. Cờ vua trong RAM 1 Kb! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


1
Tôi nghĩ rằng tôi thực sự sẽ đi "hạn chế làm cho nó thú vị". Trong tất cả những điều được đề cập ở đây, đây có lẽ là tốt nhất. Quay lại trường, tôi đã lập trình trò chơi trên máy tính của mình với bộ nhớ 32kB và CPU 8Mhz. Đó là niềm vui, nhưng tôi đã không học được nhiều từ bây giờ.
back2dos

Downvoter, hãy đề cập tại sao?

29

Tôi chỉ nghĩ về điều này gần đây. Hiện tại tôi đang xem mình là nhà phát triển C # - điều này hoàn toàn tốt cho sự nghiệp của tôi.

Tuy nhiên, thường thì tôi bỏ lỡ những thứ thực sự ở cấp độ thấp (về cơ bản là 'làm bẩn tay' bằng cách thực hiện trình biên dịch hoặc trình điều khiển thiết bị trong C). Tôi chỉ nhớ chương trình. Tôi không hy vọng điều đó sẽ giúp tôi trong sự nghiệp một cách ồ ạt. Nếu trình điều khiển thiết bị hoặc hệ thống nhúng là thứ của bạn, thì nó có thể giúp ích rất nhiều.

Tôi càng lập trình bằng các ngôn ngữ trừu tượng, tôi càng nhớ những gì đã đưa tôi vào máy tính ngay từ đầu: chọc vào máy tính và xem những gì co giật. Trình biên dịch và C rất phù hợp để chọc :)

Bằng cách sử dụng các ngôn ngữ cũ hơn, tôi nghĩ rằng bạn buộc phải tự mình làm mọi thứ. Trong C # tôi có thể làm một cái gì đó như myArray.SortBy(x=>x.Name). Không có cách nào tôi có thể làm điều đó trong C. Tôi chấp nhận rằng ngôn ngữ sẽ phân loại tốt nhất cho tôi. Nếu tôi làm điều đó trong C, tôi có thể quay lại thời của các mô-đun trường đại học của tôi và sửa đổi các thuật toán tìm kiếm và sắp xếp khác nhau của tôi.

Vì vậy, tôi nghĩ rằng các ngôn ngữ cấp thấp hơn sẽ giúp bạn sửa đổi bất kỳ bit nào bị lãng quên từ lâu đã bị trừu tượng hóa. Nhiều hơn một thách thức cá nhân hơn là một sự nghiệp tiến bộ.


15
+1 để thể hiện tình yêu chọc vào phần cứng và xem những gì co giật - một người đam mê thực sự
Gary Rowe

2
Bạn có thể tự viết hàm sắp xếp trong C # nếu muốn. Bạn cũng có thể sử dụng chức năng thư viện để sắp xếp trong C nếu bạn muốn: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html. Tôi thậm chí sẽ nói bằng cách sử dụng các ngôn ngữ cũ hơn, bạn phải tự làm ít việc hơn. Bởi vì hầu hết các vấn đề đã được giải quyết. Điều đó không ngăn cản mọi người khôi phục lại bánh xe:
back2dos

15

Đề nghị của tôi là chơi xung quanh với C như một sự tò mò trí tuệ. Đừng đầu tư nhiều thời gian vì nó không đáng.

Mục tiêu đề xuất:

  • Làm mới bộ nhớ của bạn về các cấu trúc dữ liệu và thuật toán cơ bản.
    • Nó chỉ là một số điều tốt để biết, như đại số và hình học.
    • Cố gắng làm một số bài tập trong sách giáo khoa đại học hoặc câu đố chương trình trong C.
  • Một sự đánh giá tốt hơn về hệ thống phân cấp bộ nhớ (băng thông) , tất cả các cách từ bộ đệm CPU đến độ trễ mạng xuyên đại dương. Điều này sẽ giúp kỹ năng phát triển ứng dụng của bạn ở tất cả các cấp.
    • Quan trọng nhất, nó là tốt để tìm hiểu về tình huống trong đó một nhỏ sắp xếp kín đáo mã cấp cao có thể dẫn đến một kịch cải thiện tốc độ .
      • Đôi khi lý do chỉ có thể được hiểu trong việc thực hiện cấp thấp trong bối cảnh phân cấp bộ nhớ.
      • Không hiểu nguyên nhân tự nhiên của khả năng này dẫn đến sự thiếu hiểu biết , sợ hãi và cuối cùng là phủ nhận , cho rằng thật sai lầm khi các nhà phát triển cấp cao khai thác loại tối ưu hóa này. Trong thực tế không có gì sai với điều đó.
  • Đánh giá cao tính thẩm mỹ của các hệ thống phần mềm dựa trên thành phần , cho phép các thành phần cấp thấp được phát triển trong C / C ++ / hội được sử dụng bởi các hệ thống cấp cao.
    • Tính thẩm mỹ hoàn toàn giống với khả năng sử dụng phần mềm:
      • Thiết kế tốt (mạnh mẽ, dễ sử dụng, chu đáo)
      • Đúng
      • Tính linh hoạt (phần mở rộng và hành vi mới thông qua thành phần của các bộ phận hiện có, mỗi phần có mục đích được xác định rõ ràng)
      • Hiệu suất (không làm phức tạp khả năng sử dụng)
    • Mặc dù bạn có thể không thiết kế các thành phần cấp thấp của riêng mình, nhưng sự hiểu biết của bạn sẽ giúp bạn đánh giá và chọn các thành phần tốt để sử dụng trong các dự án cấp cao của mình.
  • Cuối cùng, đánh giá cao rằng các thành phần cấp thấp hầu như luôn phức tạp hơn trong việc triển khai , khác xa với việc chỉ nhìn vào giao diện.
    • Mức độ thấp luôn phức tạp. Một thư viện tốt che giấu sự phức tạp mà không làm giảm sức mạnh của nó.
    • Tìm hiểu cách đọc "ghi chú kỹ thuật" được viết bởi các nhà phát triển thành phần, đó là những gợi ý cho người dùng thành phần cấp cao hơn về cách sử dụng tốt nhất các thành phần.

8

Nếu bạn muốn hiểu cách thức hoạt động của máy và không chỉ máy ảo mà ngôn ngữ cấp cao của bạn phụ thuộc, thì Hội sẽ dạy điều này cho bạn

nếu bạn không có lý do để quan tâm - và hầu hết các lập trình viên thực sự không có những ngày này - thì đừng lo lắng về điều đó.

nó sẽ cải thiện nền tảng của bạn, nhưng có lẽ nó sẽ không cải thiện các ứng dụng web của bạn


6
C hoạt động gần như là tốt. Hầu hết các khái niệm C có thể dễ dàng dịch sang ngôn ngữ máy. Tìm hiểu C và xem nhanh trình biên dịch chương trình, và bạn đang ở trong tình trạng tốt.
David Thornley

Tôi đã định đăng một câu trả lời tương tự. Tôi cho rằng C cũng cung cấp sự đánh giá cao về cách thức hoạt động của máy, đặc biệt là khi quản lý bộ nhớ có liên quan. Ngoài ra, nhiều ngôn ngữ mà độ phức tạp của máy trừu tượng được viết bằng C. Ít nhất, người đó sẽ hiểu thực sự về việc họ được nuông chiều như thế nào :)
Tim Post

1
@Jorg: thú vị. và có bao nhiêu trong số các CPU này đang được sử dụng cho mục đích thương mại đang hoạt động, so với Intel x86 hoặc 6502?
Steven A. Lowe

1
@ Jörg, bạn tìm thấy những CPU này ở đâu?

1
@Thor: tốc độ không phải là câu hỏi ở đây, giáo dục là vậy.
Steven A. Lowe

8

Mỗi ngôn ngữ lập trình thay đổi một chút về cách bạn nghĩ về lập trình nói chung. Một ví dụ cụ thể tôi có thể cung cấp cho bạn là khi tôi bắt đầu học haskell và đột nhiên các bit chức năng của javascript, ruby ​​và python chỉ có ý nghĩa hơn rất nhiều. Tôi chưa bao giờ sử dụng Foldl trong bất kỳ mã nào của tôi trước đây nhưng sau haskell tôi thấy khá nhiều ở mọi nơi tôi thấy các mảng. Vì vậy, rất có thể nếu bạn học một số C, bạn sẽ nhận thức rõ hơn về các đặc tính hiệu suất tương đối của các cấu trúc khác nhau trong ngôn ngữ yêu thích của bạn. Một vài phút trước, tôi đã nghe một bài nói về việc viết javascript nhanh và tối ưu hóa và người nói đã nói "Nếu khó thực hiện trong C thì nó sẽ rất chậm trong javascript." Ý định của anh ấy là javascript là một ngôn ngữ được thông dịch và trình thông dịch được viết bằng C hoặc C ++.


2
+1 cho khái niệm về cách mọi ngôn ngữ thay đổi cách bạn nghĩ.
Sean

7

Nếu bạn không làm điều đó chỉ để giải trí, bởi vì các chuyên viên máy tính thực sự thích kiểm soát hoàn toàn phần cứng của họ, thì ít nhất bạn có thể cảm nhận rõ hơn về việc một chương trình có thể trở nên nhanh hơn như thế nào khi được viết bằng C thay vì, nói, Java. Bạn cũng có thể học cách thực sự đánh giá cao các tính năng của các ngôn ngữ cấp cao hơn, như bộ sưu tập rác.


1
+1 cho niềm vui đam mê. Mặc dù tôi phải nói, tôi không phải là người đam mê. Và tôi ghét phần cứng :)
back2dos

1
Sự khác biệt tốc độ thường không liên quan. Điều này đặc biệt đúng đối với các ứng dụng web, nơi xử lý phía máy chủ thường không phải là nút cổ chai.
David Thornley

David: Tôi hoàn toàn đồng ý với các ứng dụng web bánh mì và bơ trung bình. Trong các lĩnh vực khác, sự khác biệt có thể rất phù hợp.
user281377

1
@ back2dos, nếu ý tưởng lập trình gần với phần cứng không hấp dẫn bạn, thì tôi sẽ nói đừng bận tâm đến nó. Nó sẽ giống như việc ép buộc bản thân bạn học tiếng Latin chỉ vì nó là nền tảng cho rất nhiều ngôn ngữ Lãng mạn sau này.
tcrosley

2
được cung cấp đủ bộ nhớ Java nhanh hoặc nhanh hơn C.

5

Hoan hô sự tò mò!

Thật tốt khi có một số khái niệm những gì thực sự đang diễn ra ở mức thấp nhất của một hệ thống phức tạp, ngay cả khi không có nhu cầu logic để biết về nhiệm vụ hàng ngày của một người. Cho đến nay, cách tốt nhất để tìm kiếm mọi thứ ở cấp độ bit là xây dựng CPU của riêng bạn. Bạn phải suy nghĩ về các opcodes cấp ngôn ngữ máy, hiểu tại sao các bộ hướng dẫn trực giao lại tốt như vậy, các biến chứng của việc xử lý ngắt, đánh đổi giữa các mạch phức tạp so với microcode (ví dụ như trong các đơn vị nhân), và rất nhiều niềm vui khác!

Nhưng điều đó, rõ ràng, cần có bí quyết điện tử và tốn thời gian, vì vậy điều tốt nhất tiếp theo là đồ chơi xung quanh với CPU 8 bit kiểu cổ. Các vi điều khiển như 8051 vẫn được sử dụng rộng rãi và có sẵn cho những người có sở thích. Điều đó vẫn cần một số bí quyết trong việc chăn gia súc điện tử và làm cho đèn LED phát sáng khi hút thuốc và chi phí $$ nếu bạn chưa được trang bị cho thiết bị điện tử.

Điều tốt nhất tiếp theo sau đó: đồ chơi xung quanh trong một trình giả lập CPU (trình giả lập? Tôi nhận được các thuật ngữ đó lẫn lộn) - những điều này tồn tại cho Z80, 6502, 8086 ... tất cả các 8-bit cũ. Đó có thể là điều thú vị và giáo dục nhất đối với một lập trình viên ứng dụng, người không biết nên sử dụng đầu hàn nào (mặc dù người ta học được khá nhanh :) Làm thế nào văn bản được ghi vào bộ nhớ video, cách các thủ thuật mã lắp ráp giúp thực hiện. .. có rất nhiều điều thú vị để khám phá ở cấp độ này.

Tôi không chắc chắn về việc học C như một ngôn ngữ khác, không có sự hiểu biết ban đầu về hoạt động bên trong của CPU. Biết cách các bit được gửi giữa các thanh ghi CPU và cách bộ nhớ được truy cập, giúp ích rất nhiều với việc thực sự nhận được các con trỏ và các khái niệm ngôn ngữ C khác.


+1 vì đây là câu trả lời duy nhất đề cập đến con trỏ. Tôi nghĩ rằng đó sẽ là câu trả lời số 1 và được chấp nhận.
Erik

4

Trong một từ, vui vẻ. Khi tôi thường chơi xung quanh với trình biên dịch chương trình (đã làm việc từ VB sang C ++, C, v.v.), thật tuyệt vời khi chuyển dữ liệu từ một phần của bộ xử lý sang phần khác. Thật là một cảm giác tuyệt vời khi biết chính xác những gì đang xảy ra bên trong CPU, mà không phải lo lắng về những gì đang diễn ra bên dưới mà bạn không biết. Cộng với một cảm giác tự do tuyệt vời - bạn có thể làm bất cứ điều gì, bởi vì không có giới hạn sẵn có mà bạn tìm thấy trong các ngôn ngữ cấp cao hơn.

Ngoài ra, việc có thể quay vòng với bất kỳ ai lập trình bằng bất kỳ ngôn ngữ nào khác và đi 'tốt, nếu bạn không đủ khó tính ...' là trò đùa trẻ con, trẻ con.


4
Thực sự có rất nhiều thứ đang diễn ra bên trong CPU mà bạn không thấy từ trình biên dịch chương trình. Những việc như thực hiện không theo thứ tự, siêu phân luồng và bộ nhớ đệm đang được CPU thực hiện tự động. Bạn luôn có thể đi thấp hơn một bước, cho đến khi bạn đạt được các hạt cơ bản của vật chất. Hay vật chất chỉ là năng lượng?
Kevin Panko

Người ta có thể tránh bất kỳ bí ẩn nào như vậy bằng cách xây dựng CPU của riêng họ từ bóng bán dẫn và chip logic: D (Một trong những tưởng tượng công nghệ yêu thích của tôi!) Dù sao +1 cho một câu trả lời tuyệt vời.
DarenW

Điểm công bằng! Mặc dù lần cuối cùng tôi thực sự sử dụng siêu phân luồng của trình biên dịch có lẽ thường được dùng để chỉ việc may nhanh hơn là CPU ...
Dan O

2

Có bất kỳ lý do tốt để học / thực hành lập trình cấp thấp. Tôi có bản thân câu trả lời khác nhau tùy thuộc vào bối cảnh.

Đầu tiên, tôi đang dạy lập trình C (nhưng cũng là OCaml và Java), thúc đẩy sinh viên học lập trình từ phần khó có lẽ là phần khó nhất trong nhiệm vụ. Lập luận tốt nhất mà tôi đã tìm thấy cho đến nay là "sự hiểu biết": các ngôn ngữ cấp cao hơn ẩn giấu rất nhiều cơ chế cơ bản và đôi khi không tốt, chúng cũng thúc đẩy bạn ở cấp độ cao hơn ngay cả khi một số thủ thuật cấp thấp thực sự hữu ích ( cho hiệu suất, hầu hết thời gian.) Hiểu những gì bạn đang sử dụng thực sự có thể giúp sử dụng nó tốt hơn. Kinh nghiệm giảng dạy của tôi chứng minh cho tôi rằng những sinh viên học lập trình cấp thấp hơn (và những người khác không hướng đến người dùng, những trình biên dịch như vậy) có khả năng thích ứng cao hơn và học nhanh hơn các khái niệm hoặc công cụ cấp cao mới.

Thứ hai, như bạn nêu, hiệu suất là một phần của trải nghiệm người dùng. Hầu hết thời gian, hiệu suất được coi là một vấn đề viết phức tạp và gần mã máy. Điều này không phải lúc nào cũng đúng, hiệu suất không chỉ là vấn đề của thuật toán và cấu trúc dữ liệu mà còn là sự tương tác giữa thuật toán và dữ liệu. Tôi sử dụng một dự án đặc biệt về chủ đề này, về cơ bản nó là một tìm kiếm đường dẫn đơn giản, nhưng vấn đề thực sự là kích thước của dữ liệu: biểu đồ là vô hạn. Cách duy nhất để đạt được hiệu suất giảm dần và phù hợp với bộ nhớ là viết bộ cấp phát bộ nhớ chuyên dụng (thực tế là hai, bộ cấp phát nhóm và bộ phân bổ tái chế.) Đây là điều bạn không thể làm trong hầu hết các ngôn ngữ cấp cao hơn. Trong thực tế, hầu hết các ngôn ngữ được thu gom rác sẽ có vấn đề về hiệu năng và bộ nhớ.

Có lẽ có rất nhiều tranh luận như sự ổn định (theo nghĩa lịch sử và tuổi thọ) của các ngôn ngữ cấp thấp hơn so với các ngôn ngữ "cường điệu" (thực tế là một ngôn ngữ được coi là tài liệu tham khảo trong tương lai để lập trình có thể biến mất trong một vài năm Câu chuyện, người ta không thể dự đoán tuổi thọ của một công cụ mới, nhưng lập luận này vẫn đúng với các ngôn ngữ cũ ...), tất nhiên cũng có vấn đề về hương vị, hoặc thực tế là những gì có thể được thực hiện trong hầu hết các ngôn ngữ cấp cao cũng có thể được thực hiện bằng các ngôn ngữ cấp thấp hơn nhưng không phải theo cách khác (nhưng xem xét điều đó, tất cả chúng ta chỉ nên tập hợp mã ...)

Bản thân tôi bị mắc kẹt trong cả hai thế giới (hoàn toàn khác nhau), tôi dành nhiều năm để nghiên cứu về khái niệm lập trình lý thuyết, thiết kế và chứng minh hệ thống, và vì vậy tôi chỉ sử dụng và nghiên cứu các ngôn ngữ cấp cao (chủ yếu là chức năng, nhưng cũng thuần túy hướng đối tượng.) Gần đây tôi quay trở lại phía bên kia (chủ yếu là lập trình hệ thống và kernel) và thấy mình khá thoải mái trong lĩnh vực này Tôi đang có rất nhiều niềm vui! Đối với tôi, bước tiếp theo là tìm điểm chung: các tính năng ngôn ngữ cấp cao hơn để lập trình cấp thấp hơn! Vì vậy, cho đến nay không có ngôn ngữ nào cho điều đó (có lẽ Google sẽ lập trình hệ thống người dùng) và tôi đang xem xét ý tưởng xây dựng ngôn ngữ của riêng mình, nhưng đây là một câu chuyện khác.


1

Tôi sẽ nói rằng không có nhiều lý do trong miền của bạn, tuy nhiên nếu bạn thực hiện tính toán hiệu năng cao (ví dụ: Chơi game, Khoa học, v.v.) thì điều đó sẽ hợp lý.


1
Tôi không chắc chắn có nhiều khu vực hiệu suất cao còn lại. Chơi game chắc chắn không yêu cầu ngôn ngữ cấp thấp. Để chơi game, bạn thường sử dụng các công cụ hoặc ít nhất là bạn bắt đầu với OpenGL hoặc một cái gì đó. Và đối với khoa học song song là rất quan trọng, và chính xác. Tôi cho rằng bạn sẽ tốt hơn với OCaml hoặc một cái gì đó. Các khu vực quan trọng về hiệu suất không còn là những khu vực khủng hoảng nhiều con số, mà được sử dụng cực kỳ thường xuyên, như hạt nhân, trình điều khiển, công cụ lưu trữ, v.v. Tôi đoán ít hơn 1% tất cả các nhà phát triển thực sự từng chạm vào những người đó.
back2dos

4
@ back2dos, công cụ trò chơi không xuất hiện từ đâu cả - ai đó phải viết chúng. Và bạn nghĩ OpenGL được viết bằng gì? Không c#. Ngày nay, người ta không cần sử dụng ngôn ngữ cấp thấp cho hầu hết các ứng dụng ... nhưng rất nhiều người làm việc trong các lĩnh vực khác yêu cầu nó.
GrandmasterB

1

Tôi nghĩ rằng ngày nay lập trình cấp thấp và cấp cao có thể khá tách biệt. Về cơ bản, điều này có nghĩa là bạn có thể sống cả đời chuyên nghiệp mà không cần biết C và trình biên dịch mà không có vấn đề gì cả. Điều đó nói rằng ngôn ngữ lập trình C không thể dạy bạn rất nhiều từ quan điểm lập trình và thiết kế.

Chỉ cần tò mò bạn có thể tìm hiểu cách mọi thứ hoạt động ở cấp độ thấp hơn. Khi tôi ở trường đại học chẳng hạn, tôi rất thích sử dụng gcc để tạo mã trình biên dịch mã từ C ++. Nó rất hữu ích để hiểu làm thế nào đa hình và ngoại lệ được thực hiện. Nhưng ngoài ra, điều duy nhất bạn có thể học được từ C hiện nay là:

1) thủ thuật bộ nhớ bẩn. C là cách tốt nhất để hiểu rằng không có sự điên rồ trong lập trình viên :)

2) GOTO thực sự được sử dụng (và hữu ích) cho các lỗi rollback

3) tìm hiểu tốt hơn cách phân bổ bộ nhớ hoạt động (sự khác biệt giữa heap và stack ai?).

Vì vậy, về cơ bản luận án của tôi là: nếu bạn đã học xong Đại học và bạn vẫn không cần C, hơn là không học nó :)


2
Biết C để biết mọi thứ hoạt động ở mức độ thấp như thế nào có thể giúp hiểu lý do tại sao mọi thứ trở nên sai lầm khi bạn có một sự trừu tượng bị rò rỉ.
Michael Shaw

1

Bạn không cần phải hiểu ngôn ngữ cấp thấp, nhưng bạn nên hiểu những gì đang diễn ra bên dưới vỏ bọc của ngôn ngữ cấp cao bạn đã chọn. Sử dụng ngôn ngữ cấp thấp sẽ dạy bạn điều này, nhưng đó không phải là cách duy nhất.

Dưới đây là một số ví dụ về các khái niệm cấp thấp có thể tác động đến các ngôn ngữ cấp cao.

Con trỏ:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Dây:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Danh sách:

Khi nào bạn sử dụng danh sách so với danh sách liên kết? (Hầu như không thể biết điều này mà không hiểu ở mức độ khá thấp về cách danh sách hoạt động)

-

Có cần thiết phải biết tất cả những thứ này? Không, nhưng nó có thể có tác động và nếu bạn muốn trở thành một bậc thầy về ngôn ngữ cấp cao, bạn cần phải có một ý tưởng khá tốt về hoạt động bên trong.


1

Những gì lập trình cấp thấp có thể dạy tôi, những ngôn ngữ khác sẽ không dạy tôi?

Đáng chú ý nhất là nó sẽ dạy cho bạn cách máy tính thực sự hoạt động. Không có cách nào khác để học điều này hơn là thông qua lập trình cấp thấp. Cho dù bạn lập trình loại ứng dụng nào, điều này sẽ luôn có ích. Bạn sẽ thực sự hiểu những gì đang diễn ra sâu bên dưới tất cả những thứ trên web. Và nếu bạn đang làm việc với Windows, toàn bộ API được viết bằng C, vì vậy biết rằng ngôn ngữ đó sẽ giúp bạn có thể giao tiếp trực tiếp với HĐH, bất cứ khi nào bạn cần sử dụng một tính năng mà ngôn ngữ hiện tại và thư viện của họ thiếu.

Tất nhiên lập trình cấp thấp sẽ cho phép bạn làm việc với những thứ hoàn toàn khác nhau, như lập trình nhúng và lập trình thời gian thực trong đó asm / C / C ++ là bắt buộc. Nếu bạn không có hứng thú với các loại ứng dụng này, thực sự không cần phải học asm / C / C ++.

Ngoài ra, bạn sẽ học bit và byte. Thao tác bit, thập lục phân, vv Những điều bạn có thể gặp phải ngay bây giờ và ngay cả khi thực hiện lập trình web / máy tính để bàn. Các thuật toán mã hóa là một ví dụ như vậy nơi nó được sử dụ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.