2012-07-28 46 views
6

Chúng tôi biết rằng Ngôn ngữ trung gian chung (CIL) hoặc (MSIL) là ngôn ngữ lắp ráp hướng đối tượng . Là CIL một ngôn ngữ lắp ráp và JIT là một bộ lắp ráp

Nhưng trình biên dịch chỉ trong thời gian (JIT) thực sự ánh xạ từng hướng dẫn đến bộ xử lý cơ bản opcodes?

Và Nếu vậy chúng ta có thể gọi CIL một ngôn ngữ lắp ráp và JIT một lắp ráp

Lưu ý: Wikipedia không liệt kê CIL như một ngôn ngữ lắp ráp trong nó list of assembly languages

+1

câu hỏi thú vị, tôi tryied để trả lời, nhưng nó không phải là dễ dàng như vậy.Tôi nghĩ rằng bạn không thể xem xét nó một ngôn ngữ lắp ráp kể từ tehre là không có cpu thực chạy nó trực tiếp –

+0

@FelicePollano sau đó CIL có thể là một phần lắp ráp ngôn ngữ .. :) – Anirudha

+3

Assembly language mnemonics tương ứng 1: 1 với các chỉ dẫn mã máy cụ thể của CPU. Một bộ ghép chỉ ánh xạ mã assembly có thể đọc được (sorta) với các hướng dẫn này, chắc chắn không phải là trường hợp với CIL. tuổi tác có một định nghĩa rất rõ ràng. –

Trả lời

3

Không, bạn không thể gọi cho CIL một ngôn ngữ lắp ráp. Lắp ráp được tạo thành từ các bộ nhớ cho các hướng dẫn mã máy của một bộ xử lý cụ thể. Một biểu diễn trực tiếp các số 1 và 0 làm cho lõi thực thi mã, nhưng được viết bằng văn bản để làm cho nó dễ dàng trên một con người. Mà là rất không giống như CIL:

  • bạn không thể mua một bộ xử lý thực thi CIL
  • CIL không nhắm mục tiêu một bộ xử lý cụ thể, jitter không
  • CIL giả định một mô hình thực hiện dựa trên stack, vi xử lý chủ yếu dựa register
  • đang
  • CIL được tối ưu hóa từ dạng ban đầu của nó
  • không có một-một bản dịch của một hướng dẫn CIL tới một chỉ dẫn xử lý

Đó là viên đạn cuối cùng là một viên đạn quan trọng, một quyết định thiết kế mà làm cho CIL mạnh mẽ khác với bytecode là các lệnh CIL là loại-less. Chỉ có một lệnh ADD nhưng bộ xử lý có nhiều phiên bản của nó. Những cái cụ thể có các toán hạng byte, ngắn, int, dài, float và double. Cần thiết vì các phần khác nhau của lõi bộ vi xử lý được sử dụng để thực thi phần bổ sung. Jitter chọn đúng, dựa trên loại toán hạng nó xâm nhập từ các lệnh CIL trước đó.

Giống như toán tử + trong ngôn ngữ C#, nó cũng có thể hoạt động với các toán hạng khác nhau. Mà thực sự làm cho L trong CIL đáng kể, nó là một ngôn ngữ. Một cách đơn giản, nhưng nó chỉ đơn giản giúp bạn dễ dàng viết một jitter cho nó.

+3

Tại sao bộ xử lý vật lý lại tồn tại? Điều gì sẽ xảy ra nếu một người nào đó tạo ra một bộ xử lý vật lý cho mã byte CIL trong tương lai, liệu nó có làm cho CIL trở thành một ngôn ngữ lắp ráp không? Ngoài ra, điều này có nghĩa là [MIXAL] (http://en.wikipedia.org/wiki/MIX) không phải là ngôn ngữ lắp ráp? – svick

+0

Trò chơi "gì nếu" không hiệu quả lắm. Thực tế là không có bộ vi xử lý như vậy, phần cuối của câu trả lời của tôi đã chỉ ra một lý do có thể khiến chúng tôi vẫn chưa có. Ngay cả Java không có ở đó, Jazelle không thực thi tất cả các mã byte. Tôi sẽ hứa rằng ngay sau khi tôi có một trong máy của tôi cho phép tôi gửi đến SO sau đó tôi sẽ sử dụng nó chỉnh sửa câu trả lời này. Có thể xảy ra, hãy xem những gì Midori tạo ra. –

+0

Quan điểm của tôi là định nghĩa dựa trên sự tồn tại của một số phần cứng cụ thể là ngớ ngẩn. Phần cứng cụ thể không tạo ra một ngôn ngữ lắp ráp, cơ chế biên dịch của nó làm. – svick

1

Các CIL là hơn một bytecode hơn một ngôn ngữ lắp ráp. Đặc biệt, nó không phải là một dạng văn bản có thể đọc được của con người, không giống như các ngôn ngữ assembly (Có lẽ CIL cũng định nghĩa định dạng của các tệp bytecode).

JIL MSIL là việc triển khai virtual machine cho bytecode đó. Cách triển khai (từ Microsoft hoặc từ Mono) dịch CIL thành mã máy là chi tiết triển khai thực sự không quan trọng đối với bạn (và cho rằng Microsoft VM có thể là độc quyền, sau đó sẽ không cho bạn biết cách thực hiện). Tôi nghĩ rằng Mono-một phần mềm miễn phí thực hiện CIL- đang sử dụng LLVM vì vậy có lẽ không dịch từng bytecode tại một thời điểm nhưng có lẽ toàn bộ phương pháp hoặc chức năng.

+0

CIL cũng có dạng người có thể đọc được. – svick

+1

bytecode là một biểu diễn vật lý hoặc phiên bản "biên dịch" của CIL. CIL không phải là mã bytecode. –

6

Câu hỏi này là tất cả về định nghĩa, vì vậy hãy xác định các điều khoản đúng cách. Thứ nhất, assembly language:

ngôn ngữ hội là một ngôn ngữ lập trình bậc thấp cho máy tính, bộ vi xử lý, vi điều khiển, và các thiết bị có thể lập trình khác, trong đó mỗi câu lệnh tương ứng với một hướng dẫn ngôn ngữ máy duy nhất. Một ngôn ngữ lắp ráp là đặc trưng cho một kiến ​​trúc máy tính nhất định, trái ngược với hầu hết các ngôn ngữ lập trình bậc cao, mà nói chung là di động với nhiều hệ thống.

Bây giờ, CIL:

Common Intermediate Language là cấp thấp nhất ngôn ngữ lập trình của con người có thể đọc được định nghĩa bởi cơ sở hạ tầng Common Language đặc điểm kỹ thuật (CLI) và được sử dụng bởi .NET Framework và Mono. Các ngôn ngữ nhắm vào môi trường thời gian chạy tương thích CLI biên dịch thành CIL, được lắp ráp thành một mã đối tượng có định dạng kiểu bytecode.

Được rồi, phần này không chính xác: ví dụ trình biên dịch C# biên dịch trực tiếp sang bytecode, nó không đi qua CIL (ngôn ngữ có thể đọc được), nhưng về mặt lý thuyết, chúng ta có thể tưởng tượng đó là những gì đang xảy ra.

Với hai định nghĩa này, CIL ngôn ngữ assembly, bởi vì mỗi câu lệnh trong nó được biên dịch thành một lệnh bytecode duy nhất. Thực tế là không có máy tính vật lý nào có thể thực thi bytecode đó một cách trực tiếp không quan trọng.

Định nghĩa nói rằng mỗi ngôn ngữ lắp ráp là "cụ thể cho một kiến ​​trúc máy tính nhất định". Trong trường hợp này, kiến ​​trúc là máy ảo CLR.

Giới thiệu về JIT: trình biên dịch JIT không thể được coi là một trình biên dịch: nó không thực hiện dịch 1: 1 từ dạng có thể đọc được bằng con người sang bytecode, ilasm thực hiện điều đó.

+0

Máy ảo thực hiện biên dịch JIT với các chỉ dẫn máy cụ thể (x86, x64, ia64, v.v.). –

+0

@PeterRitchie Yeah, vậy sao? – svick

+0

Một phần của câu hỏi OP được hỏi về JIT. –

2

Dòng thực sự khá mờ ... các đối số mà tôi đã thấy khi gọi CIL một "ngôn ngữ lắp ráp" có thể áp dụng gần như là tốt cho x86/x86-64 trong thực tế.

Intel và AMD chưa tạo bộ xử lý thực thi các lệnh lắp ráp chính xác như được phát ra trong nhiều thập kỷ (nếu có), vì vậy thậm chí mã được gọi là "gốc" không khác nhiều so với chạy trên máy ảo có bytecode được chỉ định trong x86/x86-64.

x86/x86-64 là những điều-mức thấp nhất các nhà phát triển điển hình có thể truy cập, vì vậy nếu chúng tôi phải đưa chân chúng tôi xuống và gọi một cái gì đó trong hệ sinh thái của chúng ta một "ngôn ngữ lắp ráp", điều đó sẽ giành chiến thắng, và kể từ CIL bytecode cuối cùng đòi hỏi x86/x86-64 hướng dẫn để có thể chạy trên một bộ xử lý trong gia đình đó, sau đó có một trường hợp khá mạnh mẽ để được thực hiện rằng nó thực sự không "cảm thấy" như nó nên đếm.

Vì vậy, theo nghĩa, có thể không được coi là "ngôn ngữ lắp ráp". Khi đề cập đến các bộ vi xử lý x86/x86-64, chúng tôi hầu như không bao giờ đề cập đến các bộ vi xử lý thực thi x86/x86-64 mà không dịch nó thành một thứ khác (tức là, bất kỳ mã micro nào).

Để thêm một nếp nhăn khác, cách thức mà bộ xử lý x86/x86-64 thực hiện chuỗi lệnh nhất định có thể thay đổi đơn giản bằng cách cập nhật mã micro. Một tìm kiếm nhanh cho thấy rằng Linux thậm chí có thể làm cho nó dễ dàng để làm điều này cho mình in software!

Vì vậy, tôi đoán, đây là tiêu chí mà có thể biện minh cho việc đặt chúng trong hai loại riêng biệt:

  1. Liệu nó có vấn đề mà tất cả các máy hiện tại chạy CIL bytecode được thực hiện trong phần mềm?
  2. Có vấn đề gì khi cùng một phần cứng có thể diễn giải cùng một hướng dẫn x86/x86-64 theo một cách khác sau khi được hướng dẫn làm như vậy trong phần mềm?
  3. Có quan trọng là chúng tôi hiện không có cách nào bỏ qua mã vi mô và phát lệnh trực tiếp đến các đơn vị vật lý của bộ vi xử lý x86/x86-64?

Vì vậy, liên quan đến việc "là một câu hỏi CIL lắp ráp language`, câu trả lời tốt nhất mà tôi có thể đưa ra là 'nó phụ thuộc' (đối với các nhà khoa học) và 'khá nhiều' (cho các kỹ sư).