Bytecode là gì,

 - 

Nếu một fan yêu cầu những JVM khác nhau cho các con kiến ​​trúc không giống nhau, tôi quan yếu phát âm được ngắn gọn xúc tích đằng sau câu hỏi ra mắt quan niệm này là gì. Trong các ngữ điệu khác, công ty chúng tôi buộc phải những trình biên dịch khác biệt cho những sản phẩm khác nhau, dẫu vậy trong Java, công ty chúng tôi yên cầu những JVM không giống nhau, vậy xúc tích ẩn dưới câu hỏi trình làng tư tưởng về JVM hoặc bước bổ sung này là gì ??


Logic là mã byte JVM dễ dàng hơn rất nhiều so với Java.

Bạn đang xem: Bytecode là gì,

Trình biên dịch hoàn toàn có thể được xem như là, ở mức độ trừu tượng cao, gồm bố phần cơ bản: so sánh cú pháp, phân tích ngữ nghĩa cùng tạo ra mã.

Phân tích cú pháp bao gồm hiểu mã và biến nó thành màn trình diễn cây bên phía trong bộ lưu trữ của trình biên dịch. Phân tích ngữ tức là phần mà nó so với cây này, khám phá ý nghĩa của nó với đơn giản và dễ dàng hóa toàn bộ những cấu trúc cao cấp xuống những cấp thấp hơn. Và việc tạo ra mã lấy cây đơn giản hóa với viết nó thành một đầu ra output phẳng.

Với tệp mã byte, giai đoạn so với cú pháp được dễ dàng hóa tương đối nhiều, vì chưng nó được viết theo thuộc định hình luồng byte phẳng nhưng JIT thực hiện, cụ do ngôn từ mối cung cấp đệ quy (cấu tạo cây). Trong khi, rất nhiều các bước so sánh ngữ nghĩa đã có được tiến hành vày trình biên dịch Java (hoặc ngữ điệu khác). Vì vậy, toàn bộ phần đa gì buộc phải làm cho là đọc mã, có tác dụng về tối tphát âm so sánh cú pháp và phân tích ngữ nghĩa tối tgọi, với tiếp nối tiến hành tạo nên mã.

Vấn đề này tạo cho trọng trách cơ mà JIT bắt buộc triển khai đơn giản rộng không ít, và do đó thực hiện nhanh rộng không hề ít, trong những lúc vẫn bảo đảm hết sức tài liệu nấc cao và thông tin ngữ nghĩa giúp cho về phương diện lý thuyết rất có thể viết mã nguồn đối chọi, đa gốc rễ.


79
Các thay mặt đại diện trung gian của các các loại khác nhau sẽ ngày dần thịnh hành trong xây đắp trình biên dịch/thời gian chạy, bởi vì một vài lý do.

Trong trường hòa hợp của Java, lý do số một lúc đầu chắc hẳn rằng là tính di động: Java được lăng xê nườm nượp ban sơ là "Viết một lượt, chạy phần nhiều nơi". Trong Lúc chúng ta có thể có được vấn đề đó bằng cách phân phối hận mã mối cung cấp với thực hiện những trình biên dịch khác biệt nhằm nhắm kim chỉ nam các nền tảng không giống nhau, điều này còn có một vài nhược điểm:

trình biên dịch là những lý lẽ phức hợp nên phát âm tất cả những cú pháp thuận tiện của ngôn ngữ; mã byte rất có thể là một trong những ngôn từ đơn giản và dễ dàng rộng, vày nó gần với mã xúc tiến của máy hơn là mối cung cấp rất có thể hiểu được của nhỏ người; điều này còn có nghĩa là:quy trình biên dịch rất có thể chậm rãi đối với thực hiện mã bytetrình biên dịch nhắm kim chỉ nam những căn cơ không giống nhau rất có thể sẽ khởi tạo ra hành vi khác biệt hoặc không áp theo kịp sự đổi khác ngôn ngữcâu hỏi chế tác một trình biên dịch cho một căn nguyên mới khó rộng không ít đối với vấn đề tạo ra một trình biên dịch VM (hoặc trình biên dịch mã byte-to-phiên bản địa) cho gốc rễ đóphân phối hận mã nguồn không hẳn cơ hội nào thì cũng mong muốn; bytecode hỗ trợ một vài đảm bảo an toàn hạn chế lại kỹ thuật đảo ngược (tuy vậy nó vẫn khá dễ dàng dịch ngược trừ khi cố tình có tác dụng xới trộn)

Các điểm mạnh không giống của một đại diện thay mặt trung gian bao gồm:

buổi tối ưu hóa, trong những số ấy các chủng loại có thể được phân phát hiện nay vào mã byte và được biên dịch thành tương đương nkhô hanh rộng hoặc thậm chí còn được buổi tối ưu hóa cho các trường phù hợp đặc trưng Lúc lịch trình chạy (áp dụng trình biên dịch "JIT" hoặc "Just In Time")khả năng tương tác thân nhiều ngôn ngữ vào cùng một VM; vấn đề đó vẫn trsinh sống đề xuất thịnh hành cùng với JVM (ví dụ: Scala) và là mục tiêu ví dụ của form .net
Có vẻ nlỗi bạn đang từ bỏ hỏi tại vì sao bọn họ không phân phối mã mối cung cấp. Hãy nhằm tôi gửi câu hỏi đó: vì sao họ ko phân păn năn mã máy?

Rõ ràng câu vấn đáp nghỉ ngơi đó là Java, theo kiến tạo, cấm đoán rằng nó biết thiết bị là nơi mã của các bạn sẽ chạy; nó có thể là máy vi tính để bàn, hết sức máy tính, điện thoại hoặc bất cứ vật dụng gì chính giữa với xa hơn. Java dường nơi mang lại trình biên dịch JVM toàn bộ triển khai công việc của bản thân mình. Ngoài bài toán tăng tính cầm tay của mã của chúng ta, vấn đề này còn hữu ích ích là cho phép trình biên dịch thực hiện mọi việc nhỏng tận dụng ưu thế của máy- tối ưu hóa rõ ràng, ví như bọn chúng vĩnh cửu hoặc vẫn tạo thành tối thiểu mã chuyển động nếu bọn chúng không. Những máy nlỗi SSE chỉ rất có thể sử dụng giải đáp hoặc tăng tốc độ Hartware trên đồ vật cung ứng họ.

Nhìn thấy vào ánh sáng này, nguyên nhân sử dụng mã byte trên mã mối cung cấp thô rõ ràng rộng. Càng gần cùng với ngữ điệu sản phẩm công nghệ thô càng tốt cho phép Shop chúng tôi nhận thấy hoặc nhận ra một trong những phần lợi ích của mã thiết bị, chẳng hạn như:

Thời gian khởi rượu cồn nhanh khô rộng, vì chưng một trong những quá trình biên dịch và đối chiếu đã được triển khai.Bảo mật, bởi vì định hình mã byte có chính sách tích đúng theo để ký các tệp phân phối (nguồn rất có thể thực hiện điều này theo quy ước, cơ mà cách thức để thực hiện điều đó không được tích phù hợp Theo phong cách của mã byte).

Lưu ý rằng tôi không đề cập tới việc triển khai nhanh hao hơn. Cả mã nguồn và mã byte đa số hoặc rất có thể (về lý thuyết) được biên dịch không thiếu thốn vào cùng một mã lắp thêm để thực hiện thực tế.

Ngoài ra, mã byte có thể chấp nhận được một trong những cách tân đối với mã máy. Tất nhiên tất cả sự tự do nền tảng gốc rễ với về tối ưu hóa phần cứng ví dụ nhưng tôi đã nói trước kia, cơ mà cũng đều có đều thiết bị nlỗi giao hàng trình biên dịch JVM nhằm tạo thành những đường truyền triển khai bắt đầu từ bỏ mã cũ. Như vậy có thể là nhằm vá những vụ việc bảo mật thông tin hoặc giả dụ phát hiện nay tối ưu hóa bắt đầu hoặc tận dụng tối đa những gợi ý phần cứng bắt đầu. Trong thực tiễn, hi hữu thấy lúc đa số chuyển đổi Khủng Theo phong cách này, bởi vì nó có thể phơi bày những lỗi, nhưng mà điều này là hoàn toàn có thể, và đó là vấn đề xảy ra theo các phương pháp nhỏ tuổi số đông lúc.


Bên cạnh đó bao gồm ít nhất hai câu hỏi không giống nhau rất có thể bao gồm tại chỗ này. Một là thực thụ về trình biên dịch nói chung, với Java về cơ phiên bản chỉ là một trong những ví dụ về thể nhiều loại này. Cái khác cụ thể rộng là Java mã byte rõ ràng cơ mà nó thực hiện.

Trình biên dịch nói chung

Thứ nhất họ hãy để mắt tới thắc mắc chung: tại vì sao trình biên dịch đã sử dụng một số biểu diễn trung gian vào quá trình biên dịch mã nguồn để chạy xe trên một vài bộ xử lý núm thể?

Giảm độ phức tạp

Một câu vấn đáp tương đối 1-1 giản: nó biến hóa một vụ việc O (N * M) thành vụ việc O (N + M).

Nếu công ty chúng tôi hỗ trợ những ngữ điệu nguồn N với các mục tiêu M cùng từng trình biên dịch trọn vẹn chủ quyền, thì chúng tôi cần trình biên dịch N * M nhằm dịch tất cả những ngôn từ mối cung cấp kia sang tất cả những mục tiêu đó (trong những số ấy "mục tiêu" là 1 trong sự phối hợp của một CPU cùng HĐH).

Tuy nhiên, giả dụ tất cả những trình biên dịch gật đầu về một màn trình diễn trung gian tầm thường, thì chúng ta cũng có thể gồm các đồ họa N của trình biên dịch dịch các ngôn ngữ nguồn lịch sự màn biểu diễn trung gian và những trình biên dịch M dứt dịch đại diện trung gian qua 1 phương châm phù hợp cho một kim chỉ nam cụ thể.

Phân khúc vấn đề

Vẫn tốt hơn, nó phân bóc vụ việc thành hai hoặc những miền độc quyền. Những người biết/quyên tâm mang lại kiến tạo ngôn từ, so sánh cú pháp với số đông sản phẩm công nghệ như vậy có thể triệu tập vào bối cảnh trình biên dịch, trong khi những người dân biết về tập lệnh, kiến thiết Chip xử lý và hồ hết thứ như vậy hoàn toàn có thể tập trung vào phương diện sau.

Vì vậy, ví dụ, được cung ứng một cái gì đấy nlỗi LLVM, chúng tôi có nhiều hình ảnh cho các ngôn ngữ không giống nhau. Chúng tôi cũng có thể có back-over đến không ít Chip xử lý khác nhau. Một anh chàng ngôn ngữ có thể viết một đồ họa new đến ngôn ngữ của mình và mau lẹ cung ứng rất nhiều mục tiêu. Một anh chàng bộ xử lý rất có thể viết một back-over mới cho phương châm của chính mình mà lại chưa hẳn xử trí kiến tạo ngôn ngữ, so sánh cú pháp, v.v.

Xem thêm: Content Creator Là Gì - Kỹ Năng Để Trở Thành Một Content Creator

Tách các trình biên dịch thành một khía cạnh trước với mặt sau, với cùng một màn biểu diễn trung gian để tiếp xúc giữa nhị trình biên dịch không phải là bạn dạng cội cùng với Java. Đó là 1 thực tế tương đối phổ biến vào một thời hạn lâu năm (Tính từ lúc trước khi Java xuất hiện thêm, cho dù sao đi nữa).

Mô hình phân phối

Trong phạm vi nhưng mà Java đã thêm bất kể điều gì new về phương diện này, chính là vào quy mô phân phối. Đặc biệt, mặc dù những trình biên dịch đã có được tách thành những phần đầu và cuối vào nội cỗ trong một thời hạn nhiều năm, chúng thường được phân phối dưới dạng một sản phẩm. Ví dụ: nếu như bạn sẽ download trình biên dịch Microsoft C, bên phía trong nó bao gồm "C1" và "C2", tương ứng là khía cạnh trước cùng mặt sau - nhưng mà sản phẩm bạn mua chỉ là "Microsoft C" bao gồm cả nhì những phần (với một "trình điều khiển và tinh chỉnh trình biên dịch" phối kết hợp các chuyển động giữa hai phần). Mặc mặc dù trình biên dịch được tạo thành nhị phần, tuy nhiên so với một nhà phát triển bình thường sử dụng trình biên dịch thì kia chỉ là 1 trong máy tuyệt nhất được dịch tự mã mối cung cấp sang mã đối tượng người sử dụng, không có gì hiển thị trọng điểm.

Ttuyệt vào đó, Java đã phân phối hận front-end vào Java Development Kit cùng back-kết thúc vào Java Virtual Machine. Mọi người tiêu dùng Java đều sở hữu trình biên dịch back-end để nhắm mục tiêu bất kỳ hệ thống như thế nào anh ta vẫn sử dụng. Java bên phát triển sẽ phân phối mã sinh sống định hình trung gian, bởi vì vậy Khi người dùng download nó, JVM vẫn làm cho bất cứ điều gì cần thiết nhằm tiến hành mã trên vật dụng ví dụ của họ.

Tiền lệ

Lưu ý rằng mô hình phân phối này cũng ko hoàn toàn bắt đầu. ví dụ như, hệ thống P. của UCSD vận động tương tự: khía cạnh trước của trình biên dịch tạo thành mã Phường. với từng bản sao của khối hệ thống Phường gồm một đồ vật ảo tiến hành đa số gì quan trọng để triển khai mã P.. trên mục tiêu cụ thể đó1.

Mã byte Java

Mã byte Java tương đối kiểu như cùng với mã Phường. Về cơ phiên bản, kia là hướng dẫn cho 1 máy dễ dàng . Máy này được dự tính là 1 trong những phiên bản tóm tắt của các sản phẩm hiện tại bao gồm, cho nên vì vậy khá dễ dàng để dịch gấp rút lịch sự phần đông hầu như mục tiêu rõ ràng. Dễ dịch là tự khôn cùng đặc biệt bởi vì mục tiêu ban đầu là giải thích mã byte, y hệt như P-System sẽ triển khai (với, vâng, đó chính xác là cách những thực hiện lúc đầu hoạt động).

Điểm mạnh

Mã byte Java thuận tiện đến bối cảnh fan biên dịch phân phối. Nếu (ví dụ) bạn bao gồm một cây hơi nổi bật đại diện cho 1 biểu thức, nó thường tương đối dễ dãi nhằm chăm sóc qua cây và chế tạo mã tương đối trực tiếp từ đều gì các bạn tìm thấy nghỉ ngơi mỗi nút ít.

Mã byte Java khá bé dại gọn gàng - trong phần đông các trường vừa lòng, nhỏ dại gọn hơn những đối với mã mối cung cấp hoặc mã máy mang lại phần nhiều các bộ xử lý điển hình nổi bật (cùng, quan trọng đối với hầu hết những Chip xử lý RISC, nlỗi SPARC nhưng Sun bán lúc họ vẫn kiến tạo Java). Vấn đề này đặc trưng đặc trưng vào thời đặc điểm này, cũng chính vì một mục đích thiết yếu của Java là cung cấp những applet - mã được nhúng trong các website sẽ được tải xuống trước lúc triển khai - tại thời khắc hầu hết rất nhiều visitor Cửa Hàng chúng tôi qua modem qua các con đường dây điện thoại cảm ứng ở mức khoảng tầm 28,8 kilobit mỗi giây (mặc dù, tất yếu, vẫn còn tương đối nhiều người sử dụng modem cũ hơn, lờ lững hơn).

Những điểm yếu

Điểm yếu ớt béo của những mã byte Java là chúng ko quan trọng biểu cảm. Mặc cho dù chúng rất có thể biểu đạt các quan niệm tất cả vào Java tương đối giỏi, nhưng chúng không vận động gần như là giỏi nhằm trình bày các có mang không phải là một phần của Java. Tương tự điều này, trong những khi thiệt dễ dãi nhằm thực thi mã byte bên trên hầu hết các thiết bị, thì điều này lại cực nhọc rộng các theo cách tận dụng tối đa tối nhiều ngẫu nhiên sản phẩm công nghệ rõ ràng làm sao.

lấy một ví dụ, một kiến thức hơi độc đáo là nếu khách hàng thực thụ muốn tối ưu hóa mã byte Java, về cơ bạn dạng, các bạn tiến hành một vài nghệ thuật hòn đảo ngược nhằm dịch ngược từ mã đại diện như mã lắp thêm cùng biến bọn chúng trở về thành những lệnh SSA (hoặc một cái nào đó tương tự)2. Sau kia, chúng ta thao tác những chỉ dẫn SSA nhằm triển khai buổi tối ưu hóa, tiếp đến dịch từ bỏ kia quý phái thứ nào đấy nhắm vào loài kiến ​​trúc mà lại các bạn đích thực quan tâm. Tuy nhiên, trong cả với tiến trình khá phức hợp này, một số quan niệm không quen với Java đủ khó để biểu đạt rằng cạnh tranh dịch tự một số trong những ngôn ngữ mối cung cấp sang trọng mã máy chạy (thậm chí là sát với) một bí quyết tối ưu trên số đông điển hình nổi bật máy móc.

Tóm lược

Nếu bạn đang hỏi về nguyên do thực hiện các biểu diễn trung gian nói bình thường, nhị yếu tố chủ yếu là:

Giảm sự việc O (N * M) thành vấn đề O (N + M) vàPhá đổ vỡ vấn đề thành phần lớn dễ dàng thống trị hơn.

Nếu ai đang hỏi về các cụ thể cụ thể của mã byte Java và vì sao chúng ta chọn thay mặt đại diện ví dụ này núm vày một trong những không giống, thì tôi đã bảo rằng câu trả lời đa phần quay lại với mục tiêu ban đầu của mình với các giới hạn của website tại thời đặc điểm này, dẫn mang đến các ưu tiên sau:

Đại diện nhỏ gọn gàng.Nkhô hanh chóng và dễ ợt nhằm lời giải với thực hiện.Nkhô nóng chóng với dễ ợt để thực hiện trên phần nhiều những máy phổ biến.

Có thể thay mặt đại diện đến nhiều ngôn ngữ hoặc thực hiện về tối ưu trên nhiều phương châm là các ưu tiên thấp rộng những (trường hợp bọn chúng được xem là ưu tiên).

Vậy vì sao khối hệ thống Phường đa số bị lãng quên? Chủ yếu ớt là một tình huống Ngân sách. Hệ thống P. được cung cấp khá nhiều trên Apple II, Commodore Super, v.v. lúc PC của IBM trình làng, hệ thống P là một hệ quản lý và điều hành được cung ứng, nhưng lại về cơ bản, MS-DOS gồm chi phí thấp hơn (theo ý kiến của phần đông phần đa tín đồ được gửi miễn phí) cùng gấp rút bao gồm sẵn những chương trình rộng, vày đó là các thứ Microsoft cùng IBM (trong các những người dân khác) đang viết mang lại.
Ban đầu, JVM là 1 trình phiên dịch đơn thuần . Và chúng ta đạt được trình thông ngôn vận động tốt nhất nếu ngôn từ nhưng mà nhiều người đang phiên dịch là đơn giản dễ dàng càng giỏi. Đó là mục tiêu của mã byte: Để cung cấp đầu vào có thể đọc được công dụng cho môi trường thời gian chạy. Quyết định độc nhất này được đặt Java gần cùng với ngôn ngữ được biên dịch rộng là ngữ điệu được lý giải, được nhận xét do hiệu suất của chính nó.

Chỉ sau này, Lúc rõ ràng tính năng của các JVM thông ngôn vẫn còn đấy bị thu hút, những bạn đang chi tiêu sức lực để tạo thành những trình biên dịch đúng vào khi hoạt động tốt. Như vậy phần như thế nào thu hẹp khoảng cách với những ngôn ngữ nhanh khô hơn hẳn như C với C++. (Tuy nhiên, vẫn đang còn một số Java vấn đề vận tốc vốn gồm, vì vậy chúng ta có thể sẽ không còn khi nào nhận ra môi trường Java thực hiện tốt nlỗi mã C được viết.)

Tất nhiên, cùng với những kỹ thuật biên dịch đúng khi, Shop chúng tôi rất có thể quay lại nhằm thực thụ phân phối hận mã nguồn cùng biên dịch đúng khi nó để mã đồ vật. Tuy nhiên, điều đó đang làm bớt đáng kể tính năng khởi đụng cho đến lúc toàn bộ những phần có liên quan của mã được biên dịch. Mã byte vẫn là một trong trợ giúp đáng kể ở chỗ này vày vấn đề đối chiếu cú pháp đơn giản và dễ dàng rộng nhiều so với mã tương tự Java.

Xem thêm: Thời Gian Rảnh Nên Làm Gì Để Kiếm Thêm Thu Nhập


Ý tức thị vấn đề biên dịch trường đoản cú mã byte sang mã sản phẩm nhanh khô hơn đối với bài toán diễn giải mã cội của chúng ta thành mã máy đúng vào khi. Nhưng chúng tôi cần diễn giải để làm mang đến áp dụng của công ty chúng tôi nhiều căn cơ, bởi vì công ty chúng tôi mong mỏi sử dụng mã nơi bắt đầu của công ty chúng tôi bên trên hầu hết nền tảng mà lại ko cần biến hóa cùng không có ngẫu nhiên sự sẵn sàng nào (các phần tổng hợp). Vì vậy, javac trước tiên biên dịch mã nguồn của Shop chúng tôi thành mã byte, tiếp đến chúng tôi rất có thể chạy mã byte này sinh hoạt bất kể đâu với nó sẽ tiến hành lý giải vì chưng Java Máy ảo thành mã sản phẩm nhanh hao hơn. Câu trả lời: nó tiết kiệm ngân sách thời gian.


Các nhân kiệt mã byte không có sẵn trong ngôn ngữ Java

Kiểu trả về của một constructor vào java là gì?

Tại sao Java 8 lambdas được gọi là invokeocate?

Khung phiên bản đồ dùng ngăn uống xếp là gì

Tại sao invoke điều đặc biệt cần thiết khi invokeVirtual tồn tại

Lọ sao 2 * (i * i) Lọ 2 * i * i vào Java?

Cách sửa lỗi Java.lang.UnsupportedClassVersionError: Phiên phiên bản Major.minor ko được hỗ trợ

Làm biện pháp nào để hiểu tôi đang hoạt động vào JVM 64 bit hay JVM 32 bit (từ bỏ vào một chương trình)?

Không thể thiếu

Loại quăng quật PermGen trong JDK 8

Làm biện pháp làm sao nhằm viết một điểm chuẩn vi tế bào đúng chuẩn trong Java?

Sự khác biệt đích thực giữa "Máy chủ Java" với "Máy công ty Java"?

Android Studio - Không search thấy Cài đặt JVM

Thuật ngữ heap Java: cố gắng hệ ttốt, già cùng vĩnh viễn?

Điều gì thực sự gây nên lỗi Staông xã Overflow?

Làm vậy nào tôi rất có thể nhận ra một số trong những đột nhiên vào Kotlin?

Làm bí quyết làm sao nhằm kích hoạt JMX trên JVM của tôi nhằm truy cập bằng jconsole?

Dự án Android Studio Gradle "Không thể bắt đầu quy trình daemon/khởi sản xuất VM"

Cách đặt TimeZone JVM đúng cách

Tại sao các bạn sẽ khi nào thực hiện quyết toán ()?