[Powered by Google Translate] ROB Bowden: Chúng ta hãy nói về trình biên dịch.
Cho đến thời điểm này, bạn đã chỉ cần gõ mã nguồn của bạn vào
một số tập tin, gửi cho họ thông qua hộp đen lớn
Clang, và ra đến tập tin thực thi của bạn mà không
chính xác những gì bạn đã viết trong mã nguồn của bạn.
Huyền diệu như đó là được, chúng ta sẽ mất một gần gũi hơn
nhìn vào những gì thực sự xảy ra
khi chúng tôi biên dịch tập tin.
Vì vậy, nó biên dịch một cái gì đó có ý nghĩa gì?
>> Vâng, theo nghĩa chung nhất, nó chỉ có nghĩa
chuyển đổi mã bằng văn bản trong một
ngôn ngữ lập trình khác.
Nhưng thường là khi người nói rằng họ biên dịch gì đó, họ
có nghĩa là họ đang dùng nó từ một lập trình cấp cao hơn
ngôn ngữ để một ngôn ngữ lập trình cấp thấp hơn.
Đây có vẻ như điều kiện rất chủ quan.
Ví dụ, bạn có thể không nghĩ của C như là một cao
mức độ ngôn ngữ lập trình, nhưng bạn biên dịch nó.
Nhưng đó là tất cả tương đối.
Như chúng ta sẽ thấy, mã lắp ráp và cuối cùng máy
mã mà chúng tôi biên dịch xuống là không thể phủ nhận một mức độ thấp hơn
hơn C.
Mặc dù chúng tôi sẽ được sử dụng Clang trong cuộc biểu tình ngày hôm nay, một
rất nhiều các ý tưởng ở đây thực hiện qua các trình biên dịch khác.
>> Clang, có bốn bước chính trong tổng thể
biên dịch.
Đây là một, tiền xử lý được thực hiện bởi tiền xử lý, hai,
biên soạn được thực hiện bởi trình biên dịch, ba, lắp ráp
thực hiện bằng cách lắp ráp và bốn,
liên kết được thực hiện bởi các mối liên kết.
Nó có thể gây nhầm lẫn rằng một trong substeps của toàn bộ
Trình biên dịch Clang được gọi là trình biên dịch, nhưng
chúng tôi sẽ nhận được điều đó.
Chúng tôi sẽ sử dụng một chương trình Hello World đơn giản như ví dụ của chúng ta
suốt video này.
Hãy có một cái nhìn.
>> Bước đầu tiên là tiền xử lý.
Tiền xử lý làm gì?
Trong khá nhiều mọi chương trình C, bạn đã từng đọc hoặc bằng văn bản,
bạn đã sử dụng dòng mã bắt đầu với một băm.
Tôi sẽ gọi nó băm, nhưng bạn cũng có thể gọi nó là bảng Anh, số
đăng nhập, hoặc sắc nét.
Bất kỳ dòng như vậy là một chỉ thị tiền xử lý.
Bạn đã có thể nhìn thấy # define và # bao gồm trước, nhưng có
một số tiền xử lý công nhận.
Hãy thêm một # xác định ví dụ hello thế giới của chúng tôi.
Bây giờ chúng ta hãy chỉ chạy các tiền xử lý trên tập tin này.
Bởi đi qua clage E-flag, bạn đang hướng dẫn cho nó chạy
chỉ cần các tiền xử lý.
Hãy xem những gì xảy ra.
Nó trông giống như Clang chỉ spits ra tất cả mọi thứ
tại dòng lệnh.
Để tiết kiệm tất cả các đầu ra này vào một tập tin mới gọi là
hello2.c, chúng tôi sẽ nối thêm> hello2.c lệnh của chúng tôi.
Bây giờ chúng ta hãy nhìn vào tập tin preprocessed của chúng tôi.
>> Whoa, chuyện gì đã xảy ra với chương trình nhỏ của chúng tôi ngắn?
Nếu chúng ta đi tất cả các cách để dưới cùng của tập tin này, chúng ta sẽ thấy
một số mã mà chúng tôi thực sự đã viết.
Chú ý rằng các định nghĩa # đã biến mất và tất cả các trường hợp của tên
đã được thay thế với chính xác những gì chúng tôi quy định
# xác định dòng.
Vì vậy, tất cả các typedefs và tờ khai chức năng là gì
ở phía trên cùng của tập tin?
Chú ý rằng các định nghĩa # không phải là tiền xử lý chỉ
chỉ thị mà chúng tôi quy định.
Chúng tôi cũng đã # bao gồm stdio.h.
Vì vậy, tất cả các dòng điên thực sự chỉ là stdio.h sao chép
và dán vào đầu của tập tin này.
Đó là lý do tại sao các tập tin tiêu đề rất hữu ích cho các chức năng
tờ khai.
Thay vì cần sao chép và dán tất cả các chức năng
khai báo bạn có kế hoạch sử dụng ở phía trên cùng của tập tin của bạn,
tiền xử lý sẽ sao chép và dán chúng từ tiêu đề
nộp cho bạn.
>> Bây giờ mà chúng tôi đang thực hiện tiền xử lý, chúng tôi di chuyển lên
biên dịch.
Lý do chúng ta gọi là quá trình biên dịch bước là bởi vì đây là
bước Clang thực sự không biên dịch từ C đến
lắp ráp mã.
Để có Clang biên dịch một tập tin để lắp ráp, nhưng
tiếp tục xa hơn, vượt qua nó S-flag
tại dòng lệnh.
Chúng ta hãy nhìn vào lắp ráp
tập tin đã được đưa ra cả.
Nó trông giống như một ngôn ngữ hoàn toàn khác nhau.
Hội đang rất xử lý cụ thể.
Trong trường hợp này, kể từ khi thiết bị CS50 đang chạy trên một
bộ xử lý x86 ảo, đây là mã x86, lắp ráp.
Rất ít người viết trực tiếp trong mã lắp ráp những ngày này,
nhưng tất cả các chương trình C bao giờ bạn viết được chuyển xuống
vào lắp ráp.
Một lần nữa, chúng tôi gọi đây là bước biên dịch C vào lắp ráp
kể từ khi chúng tôi đang đi từ một mức độ cao hơn một mức độ thấp hơn
ngôn ngữ lập trình.
>> Điều gì làm cho mức độ lắp ráp thấp hơn so với C?
Tốt, trong lắp ráp, chúng tôi rất hạn chế trong những gì chúng ta có thể làm.
Có không nếu, trong khi là, cho là, hoặc vòng của bất cứ loại nào.
Nhưng bạn có thể thực hiện những điều tương tự này kiểm soát
cấu trúc cung cấp bằng cách sử dụng các hoạt động hạn chế
lắp ráp không cung cấp.
Tuy nhiên, để xem mức thấp lắp ráp thực sự là như thế nào, chúng ta đi
thêm một bước nữa trong việc biên soạn của chúng tôi, lắp ráp.
Đó là công việc của nhà lắp ráp để chuyển đổi mã lắp ráp
vào đối tượng hoặc mã máy.
Hãy nhớ rằng lắp ráp không lắp ráp đầu ra;
đúng hơn, nó có trong máy lắp ráp và mã kết quả đầu ra.
Mã máy là thực tế của số 1 và 0 mà CPU có thể
hiểu, mặc dù chúng tôi vẫn còn có một chút nhỏ bé của công việc còn lại
trước khi chúng tôi có thể chạy chương trình của chúng tôi.
Hãy lắp ráp mã lắp ráp của chúng tôi bằng cách đi qua
Clang c-flag.
Bây giờ chúng ta hãy xem những gì trong file lắp ráp.
>> Vâng, đó không giúp chúng tôi rất nhiều.
Hãy nhớ rằng mã máy là những người thân và số không
máy tính của bạn có thể hiểu được.
Điều đó không có nghĩa là nó dễ dàng để chúng tôi hiểu.
Vì vậy, chính xác mức độ thấp là lắp ráp?
Nó gần giống với mã đối tượng.
Đi từ lắp ráp để mã đối tượng là nhiều hơn nữa của một
dịch hơn một chuyển đổi, đó là lý do tại sao
không ai có thể xem xét việc lắp ráp để
làm bất cứ biên dịch thực tế.
Trong thực tế, nó rất dễ dàng để tự dịch từ
lắp ráp để mã máy.
Nhìn vào lắp ráp cho một chức năng chính, dòng đầu tiên đó
xảy ra tương ứng với 0x55 thập lục phân.
Trong hệ nhị phân, đó là 1.010.101.
Dòng thứ hai sẽ xảy ra tương ứng 0x895 hệ thập lục phân.
Và, bên cạnh 0x56.
Với một bảng tương đối đơn giản, bạn có thể dịch
lắp ráp thành mã mà máy tính có thể hiểu quá.
>> Vì vậy, có một bước còn lại trong
biên soạn, được liên kết.
Liên kết kết hợp một loạt các đối tượng tập tin thành một tập tin lớn
mà bạn thực sự có thể thực hiện.
Liên kết là rất hệ thống phụ thuộc.
Vì vậy, cách dễ nhất để có được Clang phải chỉ liên kết đối tượng
tập tin với nhau là để gọi Clang trên tất cả các tập tin mà
bạn muốn liên kết lại với nhau.
Nếu bạn chỉ định các tập tin o, sau đó nó sẽ không cần để tái xử lý,
biên dịch, và lắp ráp tất cả các mã nguồn của bạn.
Hãy ném một chức năng toán học vào tập tin của chúng tôi, để chúng tôi có
một cái gì đó để liên kết.
Bây giờ chúng ta hãy biên dịch lại mã đối tượng và
gọi Clang vào nó.
Rất tiếc.
Từ khi chúng tôi bao gồm một chức năng toán học, chúng ta cần phải liên kết
thư viện toán học-lm.
>> Nếu chúng ta muốn liên kết với nhau loạt các o các tập tin mà chúng tôi
đã viết trên của chúng ta, chúng tôi chỉ muốn chỉ định tất cả.
dòng lệnh.
Hạn chế là chỉ có một trong những tập tin này phải
thực sự chỉ định một chức năng chính, hoặc người nào khác
kết quả thực thi sẽ không biết bắt đầu từ đâu
chạy mã của bạn.
Sự khác biệt giữa chỉ định một tập tin để liên kết trong là gì
-l và chỉ cần xác định một tập tin trực tiếp?
Không có gì.
Nó chỉ là Clang xảy ra cho biết tập tin chính xác những gì
một cái gì đó như thế-lm xảy ra để tham khảo.
Nếu bạn biết rằng tập tin chính mình, bạn có thể xác định nó
rõ ràng.
Chỉ cần nhớ rằng tất cả các-l cờ phải đến lúc kết thúc
nhu cầu khách hàng của bạn.
>> Và đó là tất cả để có nó.
Khi bạn chỉ cần chạy Clang trên một số tập tin, đây là những gì nó
thực sự làm.
Tên tôi là Rob Bowden, và đây là CS50.