簡體   English   中英

Java中字節碼的用途是什么?

[英]What is the purpose of bytecode in Java?

鑒於我可以在幾秒鍾內編譯300個類,Java的實現可以只給Java源文件而不是字節碼作為輸入,然后編譯和緩存輸入源代碼,永遠不再編譯它(例如python這樣做,並且很多語言實現的做法是相同的,除了甚至懶得緩存):

  1. 這種初始編譯體驗等同於用戶已經習慣的安裝過程
  2. 這將消除在字節碼解釋器中實現非簡單驗證任務的需要(實際上只是重新實現編譯時間檢查的一部分),從而降低了實現復雜性。
  3. 當前的Java,每次啟動時都會驗證輸入字節碼,即使它之前已經驗證過它。 第2點當然會減少啟動時間,因為它消除了這一步驟(盡管當前的Java平台也可以在某處緩存“已檢查”狀態以減少啟動時間,我不確定它是否會這樣做)
  4. 這將允許實現編譯但是他們想要(或根本不想),例如為了性能。 Android甚至不使用Java字節碼,它使用dalvik字節碼,因為它們聲稱它更適合他們的需求(例如,在他們的硬件上更高性能)。 如果字節碼不存在,Google的這一設計決定將完全透明。
  5. 這將促進開源

這就解釋了為什么分發字節碼而不是本機代碼,但要清楚,我想知道為什么甚至有一個編譯格式的分發呢? 假設編譯很重要,為什么不只是擁有運行時編譯源並緩存它?

我能提出的唯一剩余理由是混淆,但......

  • 當前編譯器編譯的方式,代碼可以非常准確地進行機械反編譯
  • 源代碼也可以被混淆

...所以這一點被簡化為直覺會說字節碼比源代碼更復雜,因此具有字節碼分發格式允許欺騙商人認為他們的IP受到保護(即字節碼將“增加價值”,但是沒有技術原因)。

為什么Java平台設計用於向用戶分發字節碼,而不是將源代碼分發給用戶? 我無法在互聯網上找到任何解釋。 我在這里失蹤有很大的原因嗎?


如果你給出一個理由,你應該說明這是語言設計者最初的原因,還是今天仍然有效的理由。

你在思考你的小世界 有一些令人信服的理由來編譯源代碼並提供字節碼:

  • 下載時間(小應用程序應該成為一種被廣泛接受的Web技術) - 用戶不需要源代碼,為什么要保留源代碼? 減少傳輸的信息量意味着更快的下載速度。
  • 減少啟動時間。 每次運行時編譯都需要額外的時間。 如果你可以每秒編譯300個類,這意味着現在只有JRE的額外5-10秒啟動時間。 你知道,1995年的機器有點慢。
  • Java面向眾多平台。 有些平台沒有PC那么強大。 想想嵌入式和移動設備。 它們可能既沒有存儲也沒有編譯代碼的能力。
  • 字節碼允許將任何語言編譯為字節碼 - 而不僅僅是Java。 還有很多其他語言可以編譯成字節碼。 您是否希望為每個編譯器安裝新的編譯器?
  • 公司往往不願意將“源頭”從他們手中奪走。 如果要在“源代碼”中提供程序,Java會有更多的接受問題。
  • 字節碼是一種簡單的機器代碼形式,可直接在硬件中執行(有一些嵌入式設計具有部分本機字節碼支持)。

我確信有更多的字謎代碼,我甚至沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM