هل سيلتزم برنامج التحويل البرمجي Java مبالغ حرفية؟
-
29-09-2019 - |
سؤال
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 ، فيجب عليك إلقاء نظرة على التحسينات المترجمة أو المجمعين جافا.
شيء آخر مثير للاهتمام هو أنه حتى إذا تم تحسين الكود الخاص بك أثناء التجميع ، فسيتم إجراء تحسين ثانٍ أثناء تشغيل وقت التشغيل نقطة ساخنة.
موارد :
حول نفس الموضوع: