Làm thế nào để các lập trình viên đối phó với sự phát triển phần mềm cấp thấp trong các ngôn ngữ cấp cao?


20

Tôi hơi mới đối với lập trình và cách tốt nhất tôi có thể hỏi câu hỏi này là với một ví dụ.

Tôi biết cách làm những điều cơ bản trong Java và C #. Những thứ như một cửa sổ nhỏ hình thành ứng dụng hoặc tạo một lớp chung. Về cơ bản, tôi đã học và chưa thử làm bất cứ điều gì lớn. Dù sao, tôi luôn tò mò về cách mọi thứ được thực hiện "dưới mui xe" Tôi đoán bạn có thể nói.

Tôi biết tất cả được rút gọn xuống 1 và 0 và các ngôn ngữ lắp ráp về cơ bản đưa ra các lệnh cho các mẫu 1 và 0, nhưng có vẻ như có một bước nhảy từ đó để: sử dụng một thư viện cho thư viện này. Dường như với tôi, tất cả C # có thể làm mà không cần thư viện là logic số học và nhị phân. Để nhận đầu vào hoặc đầu ra, bạn sử dụng các thư viện, v.v ...

Tôi biết câu hỏi này có vẻ rõ ràng đối với một số người và tôi biết rằng tôi có rất nhiều điều để học nhưng tôi thậm chí không biết bắt đầu từ đâu với một câu hỏi như thế này. Cảm ơn bạn.

Vì vậy, câu hỏi của tôi là:

Nếu ai đó định tạo một máy ảo hoặc trình giả lập Playstation, hoặc hệ điều hành hoặc trình điều khiển hoặc thêm hỗ trợ mp3 cho trình phát phương tiện hoặc tạo loại tệp của riêng bạn, v.v ... Làm thế nào? Tôi không thể thấy cách sẽ được thực hiện với C # hoặc Java.

Nói cách khác, nếu tôi đọc một cuốn sách như Professional C # của WROX hoặc Lập trình C # của OReilly, tôi có biết làm thế nào để làm những việc này không? Hay bạn phải học ngôn ngữ lắp ráp hoặc một cái gì đó cấp thấp hơn như C ++?


7
Một mẹo để hiểu những gì đang diễn ra "dưới mui xe" là tập trung và sử dụng các đoạn văn để làm cho mọi thứ dễ đọc và dễ hiểu. Vui lòng chỉnh sửa câu hỏi này để dễ đọc hơn.
S.Lott

1
Với sự quan tâm của bạn, bạn có thể muốn lấy một bản sao Mã của Charles Petzold: Ngôn ngữ ẩn của Phần cứng và Phần mềm Máy tính. Đó là một đọc tốt. amazon.com/Code-Lingu-Computer-Hardware-Software/dp/ory
DKnight

@ S.Lott Để giải cứu :-)
Martin Wickman

@Martin Wickman: Mặc dù công việc rất tuyệt vời, nhưng nó có giúp @ fender1901 chỉnh sửa hoặc tập trung không?
S.Lott

1
@Martin Wickman: Hoàn tác các thay đổi không phải là vấn đề. Khuyến khích người khác học bằng cách làm là quan điểm của tôi. Bạn rõ ràng đã biết. @ fender1901 cần học bằng cách làm. Câu hỏi của tôi là: "nó có giúp @ fender1901 chỉnh sửa hoặc tập trung không?" Bạn nghĩ sao?
S.Lott

Câu trả lời:


9

Câu hỏi thú vị! Bạn sẽ thấy rằng các ngôn ngữ như Java và C # thực tế hỗ trợ lập trình ở mức khá thấp. Ví dụ, hãy xem một số mã nguồn I / O trong OpenJDK cho Java. Bạn sẽ thấy rằng các phương thức cấp cao hơn được triển khai với các công nghệ ổ cắm cấp thấp hơn, mảng byte và vặn bit.

Liên quan đến C # và Java, các ngôn ngữ đó biên dịch thành mã byte, được xử lý trên máy ảo. Bạn thực sự có thể xem và học hỏi một cách vui vẻ từ mã byte (ví dụ: Xem cách Java xử lý các đối tượng Chuỗi nối).

Nếu môi trường bạn đang phát triển không lưu trữ một trong những máy ảo cấp cao hơn này (thường là do yêu cầu về không gian và hiệu suất), thì bạn cần sử dụng ngôn ngữ 'cấp thấp hơn'.

Tôi tin rằng C / C ++ vẫn cai trị phần đầu trong lĩnh vực viết trình điều khiển cấp thấp, v.v. vì bạn có thể điều chỉnh việc quản lý bộ nhớ và cấu trúc dữ liệu ở mức thứ n.

Hội là khá chuyên môn ngày nay, thật tốt khi tham gia ít nhất một khóa học nhanh trong đó để đánh giá cao những gì xảy ra ở cấp độ đó. Khi bạn viết một số hội để điền vào một thanh ghi trong khi nó trống, bạn bắt đầu đánh giá cao các loại độ dài mà mỗi lớp ngôn ngữ lập trình phải đi.

HTH


Bạn thực sự có thể lập trình với các ngôn ngữ trung gian hay chúng chỉ ở đó để kiểm tra?
fender1901

Bạn đang hỏi liệu bạn có thể viết mã nguồn 'bytecode' không?
Martijn Verburg

Tôi nghĩ. Tôi đang tự hỏi nếu bạn chỉ có thể bắt đầu mã hóa bằng cách sử dụng mã byte hoặc il giống như bạn sẽ java hoặc c #?
fender1901

Java hoặc C #, rất ít người thao túng mã byte, tuy nhiên một nhóm người lớn hơn nhìn vào mã byte nào mà mã cấp cao hơn cụ thể của họ sôi lên
Martijn Verburg

4

Hầu hết các chương trình "cấp thấp" về cơ bản đều tương tác trực tiếp với Hệ điều hành. Lý do có vẻ như bạn không thích có một cách "rõ ràng" để làm điều này là bởi vì nói chung, các ngôn ngữ cấp cao hơn như Java cố gắng để dễ sử dụng và tính di động. Mã có giao diện trực tiếp với Hệ điều hành thường ít di động hơn mã cấp cao hơn, trừ khi nó được gói trong một bản tóm tắt.

Trong các ngôn ngữ cấp thấp hơn như C và C ++, API hệ điều hành có thể truy cập trực tiếp (phần lớn là do thực tế là hầu hết các hệ điều hành được viết bằng C, do đó chúng hiển thị API thông qua ngôn ngữ C). Ví dụ, trong C trên hệ thống UNIX, bạn có thể gọi ioctlhàm để giao tiếp trực tiếp với thiết bị.

Tất nhiên, các ngôn ngữ cấp cao hơn như Java và C # cũng cần nói chuyện với Hệ điều hành. Mỗi khi bạn mở tệp hoặc đọc từ ổ cắm mạng, bạn sẽ giao tiếp với HĐH. Chỉ là Java và C # bao bọc các cuộc gọi hệ điều hành cấp thấp trong các bản tóm tắt cấp cao hơn, giống như một Socketđối tượng. Cách tiếp cận cấp cao hơn này có lợi thế là cùng một mã Java sẽ hoạt động trên các nền tảng khác nhau. Trong khi đó, cách bạn mở một ổ cắm trong C trên UNIX hoàn toàn khác với cách bạn sẽ làm trên Windows.

Nói chung, ngôn ngữ càng cao cấp, bạn càng có ít quyền kiểm soát đối với cách chương trình của bạn giao tiếp với Hệ điều hành. Điều đó nói rằng, rất nhiều điều bạn đề cập thể làm trong một ngôn ngữ cấp cao hơn. Ví dụ: không có lý do gì bạn không thể viết Máy ảo bằng Java hoặc C #.


2

Tin tốt là, nó có thể được thực hiện với Java hoặc C #. Vấn đề duy nhất bạn cần biết là làm thế nào . Về cơ bản, bạn cần biết những điều nhỏ nhặt này về Kiến trúc phần cứng (không cần PC, nhưng Playstation nếu đó là những gì bạn muốn mô phỏng). Và tôi e rằng bạn sẽ cần phải đi sâu, như Trình biên dịch và Ngôn ngữ máy.
Tất cả ALU, thanh ghi, MMU và các thứ có thể được trừu tượng hóa và mô phỏng bằng ngôn ngữ cấp cao. Bạn thậm chí có thể gọi các hàm cấp thấp để nhận hỗ trợ phần cứng (ví dụ: tìm hiểu về PInvoke và JNA).

Tuy nhiên, vì bạn là người mới bắt đầu nên tôi không khuyên bạn nên bắt đầu với nhiệm vụ to lớn như vậy. Tôi sẽ đề nghị bạn tìm hiểu C / C ++, một chút về Linux (hoặc hệ điều hành tương tự Unix khác, ví dụ FreeBSD), Kiến trúc máy tính, sau đó là Trình biên dịch ... Có thể mất vài năm, vì vậy ...
Điều bạn thực sự cần là động lực và sự kiên nhẫn.


2

Những gì tôi đã làm những gì đã học một ngôn ngữ cấp cao (Java) sau đó trở nên quan tâm hơn, như bạn, về ngôn ngữ và phần cứng cấp thấp. Ở trạng thái nguyên thủy nhất của nó, một máy tính là thiết bị điện tử. 1 và 0 chỉ là số liệu cho các chi phí điện (bật và tắt). Khi tôi bắt đầu hiểu logic đằng sau bộ xử lý và những gì bên trong Đơn vị logic số học, mọi thứ thực sự rơi vào vị trí.
Tôi nghĩ bạn nên bắt đầu việc học của mìnhvới những thứ như logic boolean (AND, OR, XOR, v.v.), sau đó bắt đầu thiết kế ALU nhỏ và xem xét cách bộ nhớ và thanh ghi phát vào mọi thứ. Sau đó, học một số ngôn ngữ lắp ráp và sau đó bạn sẽ nhận ra cách một trình biên dịch hoạt động. Khá sớm ngôn ngữ cấp cao sẽ có vẻ nhàm chán! :) Đùa thôi. Thật tuyệt khi mọi thứ rơi vào vị trí, và thật thú vị khi học. Khi bạn bắt đầu đi theo con đường tò mò, bạn sẽ chọn mọi thứ ngay lập tức.


2

Mặc dù bạn có thể thực hiện các công cụ cấp thấp bằng C # hoặc Java (hoặc hầu hết các ngôn ngữ khác), hầu hết mọi người đều không. Do đó, bất kỳ cuốn sách hợp lý phổ biến nào bạn chọn trên một trong hai sẽ bỏ đi những thứ cấp thấp. Chúng có thể bao gồm các tính năng ngôn ngữ bạn cần, nhưng không áp dụng chúng theo cách bạn tò mò. Tương tự, sách về các công cụ cấp thấp có thể sẽ bằng C, có lẽ là một ngôn ngữ lắp ráp nhỏ.

Học C tự nó sẽ không khó đối với một lập trình viên C #, ngoài thao tác con trỏ, mặc dù học để làm những việc trong đó sẽ mất nhiều thời gian hơn. Vì C là ngôn ngữ ít biểu cảm hơn C #, nên một số điều bạn biết cách làm hiệu quả trong C # sẽ phải được thực hiện theo cách khác, và thường vụng về hơn, theo cách C.

Những gì bạn nên tìm kiếm tiếp theo là những cuốn sách về những thứ cấp thấp hơn mà bạn muốn tìm hiểu. Ví dụ, có những cuốn sách về nhân Linux, nhưng lập trình cấp nhân sẽ khó nắm bắt nếu không có nền tảng, vì vậy trước tiên bạn có thể muốn nghiên cứu các nguyên tắc cơ bản của hệ điều hành.


Tôi nghĩ vấn đề lớn nhất của tôi hiện tại là rất nhiều chủ đề này sẽ khó nắm bắt vì tôi không có nền tảng. Tôi cần, tôi đoán, một cây cầu vào những khu vực đó.
fender1901

@ fender1901: Đó có thể là một vấn đề. Nhân Linux thực hiện một số điều có vẻ rất kỳ lạ đối với người không hiểu hệ điều hành làm gì. Trình giả lập, trong số những điều bạn đã đề cập, có lẽ là dễ hiểu nhất, và có những trình giả lập đơn giản ngoài kia, thường dành cho các máy vi tính đời đầu.
David Thornley

1

Bạn phải tìm hiểu, có thể thực hiện chức năng cấp thấp với nền tảng / ngôn ngữ đã sử dụng hay không:

  • lưu trữ một byte vào một biến
  • đọc / ghi tệp theo byte,
  • thiết lập một mảng byte, truy cập các phần tử,
  • sử dụng các tính năng thủ tục thực sự, OOP,
  • truy cập màn hình, bàn phím, ổ cắm.

Hừm, âm thanh mà chọn một ngôn ngữ nên là ngẫu nhiên.


-2

Câu hỏi có một số câu trả lời: 1. Java và C # là các ngôn ngữ cấp cao được phát triển để phát triển ứng dụng trên hệ điều hành hiện có, người quản lý bộ nhớ (điều này cũng giúp tạo ra các chương trình lai có thể chạy trên các hệ thống khác nhau). 2. Các lĩnh vực cần lập trình cấp thấp là phát triển hệ điều hành, phát triển trình điều khiển, phát triển trò chơi AAA, v.v. Thông thường lập trình cấp thấp không được thực hiện bằng Java hoặc C #, nó được thực hiện bằng C / C ++ và ngôn ngữ hội.

Chỉ với hai điểm này, chúng ta có thể nói rằng lập trình cấp thấp được thực hiện riêng biệt và không cần lập trình cấp thấp trong lập trình cấp cao. Các phần mà lập trình thấp là cần thiết như I / O được thực hiện bởi trình thông dịch, chính nó được viết bằng ngôn ngữ cấp thấp (ví dụ JVM của java được viết bằng C).

Câu trả lời chính cho câu hỏi của bạn là những thứ này không được phát triển bằng Java và C #, những thứ này được thực hiện trong C và hội thay vì tìm cách để làm điều đó trong Java và C #, bạn nên bỏ túi học C và hội vì chúng là những công việc lớn nhất của lập trình và có lợi thế lớn là chương trình được viết ở cấp độ thấp và nhỏ.


điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 6 câu trả lời trước đó đã được đăng cách đây vài năm
gnat
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.