هل سيلتزم برنامج التحويل البرمجي Java مبالغ حرفية؟

StackOverflow https://stackoverflow.com/questions/3898259

سؤال

int i = 10 + 20;

هل صحيح أن المترجم سيقوم بمعالجة هذا الرمز ، مضيفًا 10 + 20, ، ورمز البايت هو نفسه بالنسبة إلى سطر الكود هذا؟

int i = 30;

أين يمكنني أن أقرأ عنها؟

هل كانت مفيدة؟

المحلول

نعم ، ويمكنك حتى التحقق من ذلك بنفسك. خذ ملف Java صغير ، على سبيل المثال:

public class Main {
  public Main() {
    int i = 10 + 20;
  }
}

تجميعها مع javac Main.java, ثم الجري javap -c Main لتفكيكها:

Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   bipush  30
   6:   istore_1
   7:   return

}

من الواضح في رمز Bytecode ، يمكنك رؤية تحسين المترجم: bipush 30!

نصائح أخرى

نعم. يسمى هذا التحسين المترجم طي ثابت. هناك تحسن برمجي آخر يسمى انتشار مستمر مشروط متناثر هذا يفعل شيئا مشابها.

بشكل عام ، ليس هناك ما يضمن أن أحد المترجمين المعينين سيطوي بالفعل الثوابت ، ولكن في الوقت الحاضر تقريبًا كل مترجم لكل لغة يفعل ذلك. على وجه الخصوص ، مواصفات لغة جافا يتطلب تقييم التعبيرات المستمرة في وقت الترجمة.

نعم ، سيتم تبسيطها كما هو مطلوب من قبل JLS (بفضل ejp على هذه الدقة).

إذا كنت تريد المزيد من الموارد وتحسين Javac ، فيجب عليك إلقاء نظرة على التحسينات المترجمة أو المجمعين جافا.

شيء آخر مثير للاهتمام هو أنه حتى إذا تم تحسين الكود الخاص بك أثناء التجميع ، فسيتم إجراء تحسين ثانٍ أثناء تشغيل وقت التشغيل نقطة ساخنة.


موارد :

حول نفس الموضوع:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top