JavaRush /جاوا بلاگ /Random-UR /ہڈ کے تحت جاوا ایپلی کیشنز کو مرتب کرنا اور اس پر عمل درآ...
Павел Голов
سطح
Москва

ہڈ کے تحت جاوا ایپلی کیشنز کو مرتب کرنا اور اس پر عمل درآمد کرنا

گروپ میں شائع ہوا۔

مواد:

  1. تعارف
  2. بائیک کوڈ پر مرتب کرنا
  3. پروگرام کی تالیف اور عمل درآمد کی مثال
  4. ورچوئل مشین پر پروگرام چلانا
  5. جسٹ ان ٹائم (جے آئی ٹی) کی تالیف
  6. نتیجہ
ہڈ کے تحت جاوا ایپلی کیشنز کو مرتب کرنا اور اس پر عمل کرنا - 1

1. تعارف

سب کو سلام! آج میں اس بارے میں معلومات شیئر کرنا چاہوں گا کہ جاوا تحریری ایپلی کیشن چلانے کے بعد JVM (جاوا ورچوئل مشین) کے تحت کیا ہوتا ہے۔ آج کل، ایسے جدید ترقیاتی ماحول موجود ہیں جو آپ کو JVM کے اندرونی حصوں کے بارے میں سوچنے، جاوا کوڈ کو مرتب کرنے اور اس پر عمل کرنے سے بچنے میں مدد کرتے ہیں، جس کی وجہ سے نئے ڈویلپرز ان اہم پہلوؤں سے محروم رہ سکتے ہیں۔ ساتھ ہی انٹرویو کے دوران اکثر اس موضوع سے متعلق سوالات پوچھے جاتے ہیں، اسی لیے میں نے مضمون لکھنے کا فیصلہ کیا۔

2. بائیک کوڈ کی تالیف

ہڈ کے تحت جاوا ایپلی کیشنز کو مرتب کرنا اور اس پر عمل کرنا - 2
آئیے نظریہ سے شروع کرتے ہیں۔ جب ہم کوئی بھی ایپلی کیشن لکھتے ہیں تو ہم ایک ایکسٹینشن کے ساتھ فائل بناتے ہیں .javaاور اس میں جاوا پروگرامنگ لینگویج میں کوڈ ڈالتے ہیں۔ ایسی فائل جس میں انسانی پڑھنے کے قابل کوڈ ہوتا ہے اسے سورس کوڈ فائل کہا جاتا ہے ۔ ایک بار سورس کوڈ فائل تیار ہوجانے کے بعد، آپ کو اسے انجام دینے کی ضرورت ہے! لیکن اس مرحلے پر یہ معلومات پر مشتمل ہے جو صرف انسانوں کے لیے قابل فہم ہے۔ جاوا ایک ملٹی پلیٹ فارم پروگرامنگ زبان ہے۔ اس کا مطلب یہ ہے کہ جاوا میں لکھے گئے پروگراموں کو کسی بھی پلیٹ فارم پر عمل میں لایا جا سکتا ہے جس میں جاوا کا رن ٹائم سسٹم نصب ہے۔ اس سسٹم کو جاوا ورچوئل مشین (JVM) کہا جاتا ہے۔ کسی پروگرام کا سورس کوڈ سے کوڈ میں ترجمہ کرنے کے لیے جسے JVM سمجھ سکتا ہے، آپ کو اسے مرتب کرنا ہوگا۔ JVM کے ذریعے سمجھے جانے والے کوڈ کو بائٹ کوڈ کہا جاتا ہے اور اس میں ہدایات کا ایک سیٹ ہوتا ہے جسے ورچوئل مشین بعد میں عمل میں لائے گی۔ بائیک کوڈ میں سورس کوڈ کو مرتب کرنے کے لیے، javacJDK (جاوا ڈویلپمنٹ کٹ) میں ایک کمپائلر شامل ہے۔ ان پٹ کے طور پر، کمپائلر ایک فائل کو ایکسٹینشن کے ساتھ قبول کرتا ہے .java، جس میں پروگرام کا سورس کوڈ ہوتا ہے، اور آؤٹ پٹ کے طور پر، یہ ایکسٹینشن کے ساتھ ایک فائل تیار کرتا ہے .class، جس میں ورچوئل مشین کے ذریعے پروگرام کو انجام دینے کے لیے ضروری بائی کوڈ ہوتا ہے۔ ایک بار جب کسی پروگرام کو بائیک کوڈ میں مرتب کیا جاتا ہے، تو اسے ورچوئل مشین کا استعمال کرتے ہوئے عمل میں لایا جا سکتا ہے۔

3. پروگرام کی تالیف اور عمل درآمد کی مثال

فرض کریں کہ ہمارے پاس ایک سادہ پروگرام ہے، جو ایک فائل میں موجود ہے Calculator.java، جو 2 عددی کمانڈ لائن دلائل لیتا ہے اور ان کے اضافے کا نتیجہ پرنٹ کرتا ہے:
class Calculator {
    public static void main(String[] args){
        int a = Integer.valueOf(args[0]);
        int b = Integer.valueOf(args[1]);

        System.out.println(a + b);
    }
}
javacاس پروگرام کو بائی کوڈ میں مرتب کرنے کے لیے، ہم کمانڈ لائن پر کمپائلر استعمال کریں گے :
javac Calculator.java
تالیف کے بعد، ہمیں بائٹ کوڈ کے ساتھ ایک آؤٹ پٹ کے طور پر ایک فائل موصول ہوتی ہے Calculator.class، جسے ہم کمانڈ لائن پر جاوا کمانڈ کا استعمال کرتے ہوئے اپنے کمپیوٹر پر نصب جاوا مشین کا استعمال کر کے عمل کر سکتے ہیں۔
java Calculator 1 2
نوٹ کریں کہ فائل کے نام کے بعد، 2 کمانڈ لائن آرگیومینٹس بتائے گئے تھے - نمبر 1 اور 2۔ پروگرام کو چلانے کے بعد، نمبر 3 کمانڈ لائن پر ظاہر ہوگا۔ اوپر کی مثال میں، ہمارے پاس ایک سادہ کلاس تھی جو اپنے طور پر رہتی ہے۔ . لیکن کیا ہوگا اگر کلاس کسی پیکیج میں ہے؟ آئیے درج ذیل صورت حال کی تقلید کرتے ہیں: ڈائریکٹریز بنائیں src/ru/javarushاور اپنی کلاس کو وہاں رکھیں۔ اب یہ اس طرح لگتا ہے (ہم نے فائل کے شروع میں پیکیج کا نام شامل کیا ہے):
package ru.javarush;

class Calculator {
    public static void main(String[] args){
        int a = Integer.valueOf(args[0]);
        int b = Integer.valueOf(args[1]);

        System.out.println(a + b);
    }
}
آئیے درج ذیل کمانڈ کے ساتھ ایسی کلاس کو مرتب کریں:
javac -d bin src/ru/javarush/Calculator.java
اس مثال میں، ہم نے ایک اضافی کمپائلر آپشن کا استعمال کیا ہے جو مرتب شدہ فائلوں کو ڈائرکٹری سے ملتی جلتی ساخت کے ساتھ -d binڈائرکٹری میں رکھتا ہے ، لیکن ڈائرکٹری کو پہلے سے بنانا ضروری ہے۔ اس تکنیک کا استعمال بائٹ کوڈ فائلوں کے ساتھ سورس کوڈ فائلوں کو الجھانے سے بچنے کے لیے کیا جاتا ہے۔ مرتب کردہ پروگرام کو چلانے سے پہلے، یہ تصور کی وضاحت کے قابل ہے ۔ وہ راستہ ہے جس پر ورچوئل مشین پیکجوں اور مرتب شدہ کلاسوں کی تلاش کرے گی۔ یعنی اس طرح سے ہم ورچوئل مشین کو بتاتے ہیں کہ فائل سسٹم میں کون سی ڈائریکٹریز جاوا پیکج کے درجہ بندی کی جڑ ہیں۔ پرچم کا استعمال کرتے ہوئے پروگرام شروع کرتے وقت مخصوص کیا جا سکتا ہے . ہم کمانڈ کا استعمال کرتے ہوئے پروگرام شروع کرتے ہیں: binsrcbinclasspathClasspathClasspath-classpath
java -classpath ./bin ru.javarush.Calculator 1 2
اس مثال میں، ہمیں کلاس کا پورا نام درکار ہے، بشمول اس پیکیج کا نام جس میں یہ رہتا ہے۔ حتمی فائل کا درخت اس طرح لگتا ہے:
├── src
│     └── ru
│          └── javarush
│                  └── Calculator.java
└── bin
      └── ru
           └── javarush
                   └── Calculator.class

4. ورچوئل مشین کے ذریعے پروگرام کو انجام دینا

تو، ہم نے تحریری پروگرام شروع کیا۔ لیکن کیا ہوتا ہے جب ایک مرتب شدہ پروگرام کو ورچوئل مشین کے ذریعے لانچ کیا جاتا ہے؟ پہلے، آئیے یہ معلوم کریں کہ تالیف اور کوڈ کی تشریح کے تصورات کا کیا مطلب ہے۔ تالیف ایک اعلی سطحی ماخذ زبان میں لکھے گئے پروگرام کا مشین کوڈ کی طرح کم سطح کی زبان میں مساوی پروگرام کا ترجمہ ہے۔ تشریح ایک آپریٹر بہ بیان ہے (کمانڈ بہ لائن، لائن بہ لائن) تجزیہ، پروسیسنگ اور سورس پروگرام یا درخواست کا فوری عمل درآمد (تالیف کے برخلاف، جس میں پروگرام کو بغیر عمل کیے ترجمہ کیا جاتا ہے)۔ جاوا لینگویج میں ایک کمپائلر ( javac) اور ایک ترجمان دونوں ہوتے ہیں، جو کہ ایک ورچوئل مشین ہے جو بائٹ کوڈ کو لائن بہ لائن مشین کوڈ میں تبدیل کرتی ہے اور فوری طور پر اس پر عمل درآمد کرتی ہے۔ اس طرح، جب ہم ایک مرتب شدہ پروگرام چلاتے ہیں، تو ورچوئل مشین اس کی تشریح کرنا شروع کر دیتی ہے، یعنی بائٹ کوڈ کو مشین کوڈ میں لائن بہ لائن تبدیل کرنے کے ساتھ ساتھ اس پر عمل درآمد بھی۔ بدقسمتی سے، خالص بائیک کوڈ تشریح ایک طویل عمل ہے اور جاوا کو اپنے حریفوں کے مقابلے سست بناتا ہے۔ اس سے بچنے کے لیے ورچوئل مشین کے ذریعے بائیک کوڈ کی تشریح کو تیز کرنے کے لیے ایک طریقہ کار متعارف کرایا گیا۔ اس طریقہ کار کو Just-in-time compilation (JITC) کہا جاتا ہے۔

5. جسٹ ان ٹائم (جے آئی ٹی) کی تالیف

سادہ الفاظ میں، جسٹ-ان-ٹائم کمپیلیشن کا طریقہ کار یہ ہے: اگر پروگرام میں کوڈ کے کچھ حصے ہیں جو کئی بار عمل میں آتے ہیں، تو انہیں ایک بار مشین کوڈ میں مرتب کیا جا سکتا ہے تاکہ مستقبل میں ان پر عمل درآمد کو تیز کیا جا سکے۔ پروگرام کے ایسے حصے کو مشین کوڈ میں مرتب کرنے کے بعد، پروگرام کے اس حصے پر آنے والی ہر کال کے ساتھ، ورچوئل مشین فوری طور پر مرتب شدہ مشین کوڈ کی تشریح کرنے کے بجائے اس پر عمل درآمد کرے گی، جس سے قدرتی طور پر پروگرام پر عمل درآمد میں تیزی آئے گی۔ پروگرام کو تیز کرنا میموری کی کھپت کو بڑھا کر (ہمیں مرتب شدہ مشین کوڈ کو کہیں ذخیرہ کرنے کی ضرورت ہے!) اور پروگرام کے عمل کے دوران کمپلیشن پر خرچ ہونے والے وقت کو بڑھا کر حاصل کیا جاتا ہے۔ جے آئی ٹی کی تالیف ایک پیچیدہ طریقہ کار ہے، تو آئیے اوپر جاتے ہیں۔ مشین کوڈ میں بائیک کوڈ کی JIT تالیف کے 4 درجے ہیں۔ تالیف کی سطح جتنی اونچی ہوگی، یہ اتنا ہی پیچیدہ ہے، لیکن ساتھ ہی اس طرح کے سیکشن کا نفاذ نچلی سطح والے حصے سے زیادہ تیز ہوگا۔ JIT - مرتب کرنے والا فیصلہ کرتا ہے کہ ہر پروگرام کے ٹکڑے کے لیے کون سی تالیف کی سطح مقرر کی جائے اس بنیاد پر کہ اس ٹکڑے کو کتنی بار عمل میں لایا جاتا ہے۔ ہڈ کے نیچے، JVM 2 JIT کمپائلرز - C1 اور C2 استعمال کرتا ہے۔ C1 کمپائلر کو کلائنٹ کمپائلر بھی کہا جاتا ہے اور یہ صرف تیسرے درجے تک کوڈ کو مرتب کرنے کی صلاحیت رکھتا ہے۔ C2 کمپائلر چوتھی، سب سے پیچیدہ اور تیز ترین تالیف کی سطح کے لیے ذمہ دار ہے۔
ہڈ کے تحت جاوا ایپلیکیشنز کو مرتب کرنا اور اس پر عمل کرنا - 3
مندرجہ بالا سے، ہم یہ نتیجہ اخذ کر سکتے ہیں کہ سادہ کلائنٹ ایپلی کیشنز کے لیے، C1 کمپائلر استعمال کرنا زیادہ منافع بخش ہے، کیونکہ اس صورت میں یہ ہمارے لیے اہم ہے کہ ایپلیکیشن کتنی جلدی شروع ہوتی ہے۔ سرور کی طرف، طویل مدتی ایپلی کیشنز کو شروع ہونے میں زیادہ وقت لگ سکتا ہے، لیکن مستقبل میں انہیں کام کرنا چاہیے اور اپنا کام تیزی سے انجام دینا چاہیے - یہاں C2 کمپائلر ہمارے لیے موزوں ہے۔ JVM کے x32 ورژن پر جاوا پروگرام چلاتے وقت، ہم دستی طور پر بتا سکتے ہیں کہ ہم کون سا موڈ استعمال کرنا چاہتے ہیں -clientاور فلیگ -server۔ جب یہ جھنڈا متعین کیا جاتا ہے، تو -clientJVM پیچیدہ بائیک کوڈ آپٹیمائزیشن نہیں کرے گا، جو ایپلیکیشن کے آغاز کے وقت کو تیز کرے گا اور استعمال شدہ میموری کی مقدار کو کم کرے گا۔ جھنڈے کی وضاحت کرتے وقت، -serverپیچیدہ بائی کوڈ آپٹیمائزیشن کی وجہ سے ایپلیکیشن شروع ہونے میں زیادہ وقت لے گی اور مشین کوڈ کو ذخیرہ کرنے کے لیے زیادہ میموری استعمال کرے گی، لیکن یہ پروگرام مستقبل میں تیزی سے چلے گا۔ JVM کے x64 ورژن میں، جھنڈے کو -clientنظر انداز کر دیا جاتا ہے اور ایپلیکیشن سرور کنفیگریشن کو بطور ڈیفالٹ استعمال کیا جاتا ہے۔

6. نتیجہ

یہ جاوا ایپلیکیشن کو مرتب کرنے اور اس پر عمل کرنے کے طریقہ کار کے بارے میں میرے مختصر جائزہ کو ختم کرتا ہے۔ اہم نکات:
  1. javac کمپائلر پروگرام کے سورس کوڈ کو بائیک کوڈ میں تبدیل کرتا ہے جسے کسی بھی پلیٹ فارم پر عمل میں لایا جا سکتا ہے جس پر جاوا ورچوئل مشین انسٹال ہے۔
  2. تالیف کے بعد، JVM نتیجے میں آنے والے بائیک کوڈ کی تشریح کرتا ہے۔
  3. جاوا ایپلی کیشنز کو تیز کرنے کے لیے، JVM جسٹ-ان-ٹائم کمپلیشن میکانزم کا استعمال کرتا ہے جو کسی پروگرام کے اکثر کام کرنے والے حصوں کو مشین کوڈ میں تبدیل کرتا ہے اور انہیں میموری میں محفوظ کرتا ہے۔
مجھے امید ہے کہ اس مضمون نے آپ کو اس بات کی گہرائی سے سمجھنے میں مدد کی ہے کہ ہماری پسندیدہ پروگرامنگ زبان کیسے کام کرتی ہے۔ پڑھنے کا شکریہ، تنقید خوش آئند ہے!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION