8

Ví dụ, khi tôi biên dịch một ứng dụng C là tệp được xuất ra được đọc dưới dạng nhị phân hoặc hệ điều hành có giải thích việc biên dịch không? Là "nhị phân thuần túy" của máy tính?Các chương trình đã biên dịch có thực sự ở dạng nhị phân thực?

CHỈNH SỬA: Có, mọi thứ trên máy tính là nhị phân thuần túy. Tôi hỏi nếu trình xử lý trực tiếp diễn giải tệp được trình biên dịch xuất ra hay hệ điều hành xử lý nó trước?

+1

Điều gì làm cho nhị phân "true" hoặc "tinh khiết"? –

Trả lời

16

Chương trình được biên dịch thường chứa tiêu đề, theo sau là hướng dẫn CPU thực tế (những gì bạn có thể gọi là "nhị phân") + các dữ liệu khác.

Khi bạn cố gắng yêu cầu hệ điều hành tải chương trình của bạn, tiêu đề sẽ được hệ điều hành đọc và được sử dụng để kiểm tra xem tệp thực thi có thực sự là tệp thực thi dành cho hệ điều hành này và kiến ​​trúc này hay không. I E. để bạn không vô tình chạy một chương trình Linux trên Windows hoặc tương tự.

Tiêu đề cũng chứa nhiều bit thông tin khác về nơi các chỉ lệnh CPU thực tế được đặt trong tệp exeutable, nơi các phân đoạn dữ liệu (văn bản, chuỗi, đồ họa) được đặt và vv.

Khi hệ điều hành hài lòng với tệp thực thi, thì hệ điều hành sẽ tải các phân đoạn khác nhau từ tệp thi hành vào bộ nhớ và hướng dẫn CPU bắt đầu chạy phân đoạn mã "nhị phân". Mã này là "thuần túy" theo nghĩa là nó là mã lắp ráp CPU thẳng.

Tuy nhiên, hệ điều hành có thể làm gián đoạn CPU (ví dụ để chuyển sang chương trình khác hoặc chỉ xóa chương trình khỏi bộ nhớ và vv). Vì vậy, có rất nhiều thứ xảy ra xung quanh chương trình đang chạy này và kiểu hệ điều hành "quản lý" nó và đảm bảo nó hoạt động giống như một cậu bé tốt, nhưng chính mã khi nó đang chạy đang thực hiện các lệnh CPU thuần túy càng nhanh càng tốt ..không có hệ điều hành phải giải thích mã ở giữa.

Cũng lưu ý rằng chương trình đang chạy có thể gọi hệ điều hành theo nhiều cách khác nhau khi đang chạy. Ví dụ để yêu cầu hệ điều hành mở một cửa sổ trên màn hình, mở một kết nối mạng, cấp phát bộ nhớ, v.v. Tất cả những gì thực sự đang xảy ra là CPU chỉ nhảy để thực thi mã tại một vị trí khác (tức là nó nhảy từ chạy mã trong tệp thực thi, để chạy một đoạn mã nào đó trong hệ điều hành và sau đó nhảy lại).

Đó là tóm lại. Có nhiều cách khác để chạy chương trình. Có các máy ảo, các ngôn ngữ thông dịch (như Java hoặc Ruby chẳng hạn), v.v. Và tất cả đều chạy các chương trình theo những cách khác nhau từ các ngôn ngữ "thuần nhị phân" truyền thống như C/C++, nhưng hy vọng điều này giúp bạn hiểu cách hoạt động tốt hơn một chút.

+2

+1 không thể tự nói tốt hơn cho mình –

0

ứng dụng như thế này thường được biên dịch thành mã máy, hướng dẫn trực tiếp thực hiện bởi bộ vi xử lý:

http://en.wikipedia.org/wiki/Machine_code

x86 ASM là một trong những phổ biến nhất. Hãy suy nghĩ về nó khi mã của bạn được biên dịch thành một ngôn ngữ cấp rất thấp. Đó là một lớp trên chỉ 1 và 0 được gửi thẳng dọc theo kim loại nếu đó là những gì bạn có nghĩa là, và hệ điều hành vẫn có quyền kiểm soát những gì được thực hiện. Nhưng vâng, vào cuối ngày, tất cả sẽ được chuyển thành nhị phân - mọi thứ trên PC sẽ hoạt động!

2

Ý bạn là "binary thực"? Tất cả dữ liệu trong một máy tính là 1s và 0s, mặc dù CPU "giải thích" các opcodes theo cách bố trí của các cổng bên trong và các bóng bán dẫn. Không có lý tưởng thuần khiết nào về ngôn ngữ nhị phân.

3

Tôi nghĩ rằng những gì bạn đang thực sự yêu cầu là, các chương trình được biên dịch chạy trên kim loại trần (chúng có thực thi độc lập với hệ điều hành) hay không. Câu trả lời rất ngắn gọn là, không. Mặc dù chương trình tự thực hiện các chỉ lệnh CPU nguyên bản, nhưng hệ điều hành có khả năng hạn chế nó và kiểm soát hành vi của nó. Hơn nữa, trong giai đoạn tải, một số biểu tượng bên ngoài (dll) cần được giải quyết. Cuối cùng, hầu hết các chương trình dựa vào các trừu tượng hệ điều hành khác nhau (truy cập bộ nhớ, ví dụ - viết chức năng hoán đổi của riêng bạn là vô cùng khó khăn và vô nghĩa). Theo nghĩa này, không có nhị phân nào không phải là mã máy kim loại trần tự trị.

Tuy nhiên, chúng nhị phân thuần túy. Mọi thứ trên máy tính là.

EDIT

Một cách khác để giải thích câu hỏi của bạn là: được biên soạn chương trình hướng dẫn CPU thực sự bản địa. Câu trả lời là có (ngoài việc tải nhị phân, mà hệ điều hành phải trợ giúp). Trình biên dịch đầu ra ngôn ngữ lắp ráp trong đó mỗi dòng tương ứng với chính xác một lệnh CPU. Đây vẫn là văn bản. Việc lắp ráp được biên dịch bởi một assembler thành nhị phân thực tế.

0

Cũng nên xem xét rằng ngôn ngữ thông dịch có mã máy ảo. (Nó vẫn còn trong nhị phân.) Chúng được biến thành mã máy bởi một máy ảo, một lớp phần mềm. (Ngoài ra nhị phân.)

0

Tôi tự hỏi tại sao không ai đề cập đến khái niệm liên kết .

Về cơ bản, đầu ra của trình biên dịch thực sự là một tệp nhị phân, nhưng có một sự bắt buộc cho điều này. Tệp nhị phân được biên dịch này thường được gọi là tệp đối tượng có chứa mã số đối tượng . Bây giờ, đừng nhầm lẫn bản thân ở đây. Mã đối tượng là gì, nhưng mã máy hoặc mã nhị phân như bạn gọi, nhưng chỉ là một phần của nó. Trình biên dịch thường xuất ra nhiều tệp đối tượng như vậy từ nguồn của một chương trình. Vì vậy, về cơ bản, mỗi tệp đối tượng này chứa một phần của mã máy thực thi hoàn chỉnh cho chương trình đó. Về cơ bản, nó liên kết tất cả các tệp đối tượng này thành hoàn thành thực thi mà máy có thể chạy dưới dạng chương trình.

+0

http://en.wikipedia.org/wiki/Linker_(computing) –

Các vấn đề liên quan