বাইটকোড বৈশিষ্ট্যগুলি জাভা ভাষায় উপলভ্য নয়


146

জাভা বাইটকোডে জাভা ভাষার মধ্যে থেকে আপনি যে জিনিসগুলি করতে পারবেন না সেগুলিতে বর্তমানে (জাভা 6) এমন কিছু আছে?

আমি জানি উভয়ই ট্যুরিং সম্পূর্ণ, সুতরাং "হিসাবে" করতে পারে "তাত্পর্যপূর্ণ / দ্রুততর বা আরও ভালভাবে করতে পারে বা অন্যভাবে" পড়ুন।

আমি অতিরিক্ত বাইকোডগুলির মতো ভাবছি invokedynamicযা জাভা ব্যবহার করে উত্পন্ন করা যায় না, নির্দিষ্ট সংস্করণটি ভবিষ্যতের সংস্করণের জন্য বাদে।


3
"জিনিস" সংজ্ঞায়িত করুন। শেষ পর্যন্ত, জাভা ভাষা এবং জাভা বাইটকোড উভয়ই টুরিং সম্পূর্ণ ...
মাইকেল বর্গওয়ার্ট

2
আসল প্রশ্ন কি; বাইট কোডে কোনও সুবিধা প্রোগ্রামিং আছে যেমন জাভা পরিবর্তে জেসমিন ব্যবহার করে?
পিটার লরি

2
rolএসেম্বলারের মতো , যা আপনি সি ++ তে লিখতে পারবেন না।
মারটিজন কোর্টে

1
এটি একটি অত্যন্ত দুর্বল অনুকূল সংকলক যা (x<<n)|(x>>(32-n))কোনও rolনির্দেশকে সংকলন করতে পারে না ।
র্যান্ডম 832

উত্তর:


62

আমি যতদূর জানি জাভা 6 দ্বারা সমর্থিত বাইটকোডগুলিতে এমন কোনও প্রধান বৈশিষ্ট্য নেই যা জাভা উত্স কোড থেকে অ্যাক্সেসযোগ্য নয়। এর মূল কারণ স্পষ্টতই জাভা বাইটকোডটি জাভা ভাষার কথা মাথায় রেখে তৈরি করা হয়েছিল।

কিছু কিছু বৈশিষ্ট্য রয়েছে যা আধুনিক জাভা সংকলকগুলির দ্বারা উত্পাদিত হয়নি, তবে:

  • ACC_SUPERপতাকা :

    এটি এমন একটি পতাকা যা কোনও শ্রেণিতে সেট করা যেতে পারে এবং নির্দিষ্ট করে দেয় যে invokespecialবাইকোডের নির্দিষ্ট কোণার কেসটি এই শ্রেণীর জন্য পরিচালনা করা হয়। এটি সমস্ত আধুনিক জাভা সংকলক (যেখানে "আধুনিক" হয়> = জাভা 1.1, যদি আমি সঠিকভাবে মনে করি) দ্বারা সেট করা হয়েছে এবং কেবলমাত্র প্রাচীন জাভা সংকলকগুলি ক্লাস ফাইল তৈরি করেছিল যেখানে এটি সেট ছিল না। এই পতাকাটি কেবল পিছনের সামঞ্জস্যের কারণে বিদ্যমান। নোট করুন যে জাভা 7u51 দিয়ে শুরু করে, এসিসি_সুপার সুরক্ষার কারণে পুরোপুরি উপেক্ষা করা হবে।

  • jsr/ retBytecodes।

    এই বাইকোডগুলি উপ-রুটিনগুলি প্রয়োগ করতে ব্যবহৃত হয়েছিল (বেশিরভাগ finallyব্লক বাস্তবায়নের জন্য )। এগুলি জাভা 6 এর পরে আর উত্পাদিত হয় না । তাদের অবমূল্যায়নের কারণ হ'ল তারা কোন লাভের জন্য স্থির যাচাইকরণকে অনেক জটিল করে তোলে (উদাহরণস্বরূপ যে কোডটি ব্যবহার করে প্রায় সবসময় খুব সামান্য ওভারহেড সহ সাধারণ লাফ দিয়ে পুনরায় প্রয়োগ করা যেতে পারে)।

  • ক্লাসে দুটি পদ্ধতি রয়েছে যা কেবল রিটার্নের ধরণের চেয়ে পৃথক।

    জাভা ভাষার স্পেসিফিকেশন একই শ্রেণিতে দুটি পদ্ধতির অনুমতি দেয় না যখন তারা কেবল তাদের ফেরতের প্রকারের (যেমন একই নাম, একই যুক্তি তালিকার, ...) আলাদা হয় । জেভিএম স্পেসিফিকেশন তবে, এমন কোন বিধিনিষেধ আছে তাই একটি ক্লাস ফাইল করতে যেমন দুটি পদ্ধতি রয়েছে, শুধু কোন উপায় স্বাভাবিক জাভা কম্পাইলার ব্যবহার যেমন একটি ক্লাস ফাইল উত্পাদন করতে হবে। এই উত্তরে একটি দুর্দান্ত উদাহরণ / ব্যাখ্যা রয়েছে ।


5
আমি অন্য উত্তর যোগ করতে পারে, কিন্তু আমরা পাশাপাশি আপনার উত্তরীয় উত্তর করতে পারে। আপনি উল্লেখ করতে চাইতে পারেন যে বাইটকোডে কোনও পদ্ধতির স্বাক্ষরে ফেরতের ধরণ রয়েছে । এটি হ'ল, একই প্যারামিটার ধরণের সাথে আপনার দুটি পদ্ধতি থাকতে পারে তবে ভিন্ন ভিন্ন রিটার্ন টাইপ। এই আলোচনাটি দেখুন: স্ট্যাকওভারফ্লো
অ্যাডাম পেইন্টার

8
আপনার যে কোনও চরিত্রের সাথে ক্লাস, পদ্ধতি এবং ফিল্ডের নাম থাকতে পারে। আমি একটি প্রকল্পে কাজ করেছি যেখানে "ক্ষেত্রগুলিতে" তাদের নামে স্পেস এবং হাইফেন ছিল। : পি
পিটার লরে

3
@ পিটার: ফাইল সিস্টেমের চরিত্রগুলির কথা বলতে গিয়ে আমি একটি দফায় দফায় দফায় দফায় দফায় জেআর ফাইলের অভ্যন্তরে একটি শ্রেণি aএবং অন্যটির নামকরণ করেছিলাম A। অনুপস্থিত ক্লাসগুলি কোথায় ছিল তা বুঝতে পেরে আমি প্রায় উইন্ডোজ মেশিনে আনজিপিংয়ের প্রায় আধা ঘন্টা সময় নিয়েছিলাম । :)
অ্যাডাম পেইন্টার

3
@JoachimSauer: paraphrased জেভিএম বৈশিষ্ট, পৃষ্ঠা 75: ক্লাসের নাম, মেথড, ক্ষেত্র, এবং স্থানীয় ভেরিয়েবল থাকতে পারে কোন ব্যতীত চরিত্র '.', ';', '[', অথবা '/'। পদ্ধতির নাম একই, তবে সেগুলিও ধারণ করতে পারে না '<'বা থাকতে পারে না '>'। (এর উল্লেখযোগ্য ব্যতিক্রম ছাড়া <init>এবং <clinit>উদাহরণস্বরূপ এবং স্ট্যাটিক কনস্ট্রাকটর জন্য।) আমি নির্দেশ করা উচিত যে আপনি যদি স্পেসিফিকেশন কঠোরভাবে অনুসরণ করছে, ক্লাসের নাম আসলে আরো অনেক কিছু সীমাবদ্ধ, কিন্তু সীমাবদ্ধতার জারি করা হয় না।
লিবিয়াথনবাজার

3
@ জোয়াচিমসৌয়ার: এছাড়াও, আমার নিজের একটি অননুমোদিত সংযোজন: জাভা ভাষায় "throws ex1, ex2, ..., exn"পদ্ধতির স্বাক্ষরের অংশ হিসাবে অন্তর্ভুক্ত রয়েছে ; ওভাররাইড পদ্ধতিতে আপনি ব্যতিক্রম নিক্ষেপগুলি যুক্ত করতে পারবেন না। কিন্তু, জেভিএম কম যত্ন নিতে পারে না। finalঅবশ্যই কেবলমাত্র পদ্ধতিগুলি অবশ্যই জেভিএমকে ব্যতিক্রম-মুক্ত হওয়ার গ্যারান্টিযুক্ত - অবশ্যই RuntimeExceptionএস এবং Errorএসগুলি বাদ দিয়ে । চেক হওয়া ব্যতিক্রম হ্যান্ডলিংয়ের জন্য এত কিছু: ডি
লিভিয়াথনবাজার

401

জাভা বাইট কোডটি নিয়ে বেশ কিছুক্ষণ কাজ করার পরে এবং এই বিষয়ে কিছু অতিরিক্ত গবেষণা করার পরে, এখানে আমার অনুসন্ধানের সংক্ষিপ্তসার তুলে ধরছি:

সুপার কনস্ট্রাক্টর বা সহায়ক কন্সট্রাক্টরকে কল করার আগে কোনও কনস্ট্রাক্টরে কোড কার্যকর করুন

জাভা প্রোগ্রামিং ল্যাঙ্গুয়েজে (জেপিএল), কোনও কনস্ট্রাক্টরের প্রথম বিবৃতি অবশ্যই একটি সুপার কনস্ট্রাক্টর বা একই বর্গের অন্য কোনও কনস্ট্রাক্টরের অনুরোধ হতে হবে। এটি জাভা বাইট কোড (জেবিসি) এর ক্ষেত্রে সত্য নয়। বাইট কোডের মধ্যে, কোনও কনস্ট্রাক্টরের আগে কোনও কোড কার্যকর করা একেবারেই বৈধ, যতক্ষণ না:

  • এই কোড ব্লকের পরে আরও একটি সামঞ্জস্যপূর্ণ কনস্ট্রাক্টর কল করা হয়।
  • এই কলটি শর্তাধীন বিবৃতিতে নয়।
  • এই কনস্ট্রাক্টর কল করার আগে, নির্মিত ইনস্ট্যান্টের কোনও ক্ষেত্রটি পড়া হয় না এবং এর কোনও পদ্ধতির অনুরোধ করা হয় না। এটি পরবর্তী আইটেমটি বোঝায়।

সুপার কনস্ট্রাক্টর বা সহায়ক কন্সট্রাক্টরকে কল করার আগে উদাহরণ ক্ষেত্রগুলি সেট করুন

পূর্বে উল্লিখিত হিসাবে, অন্য কোনও কনস্ট্রাক্টরকে কল করার আগে উদাহরণের ক্ষেত্রের মান নির্ধারণ করা পুরোপুরি আইনী। এমনকি একটি লিগ্যাসি হ্যাক উপস্থিত রয়েছে যা এটি 6 এর আগে জাভা সংস্করণগুলিতে এই "বৈশিষ্ট্য "টি কাজে লাগাতে সক্ষম করে:

class Foo {
  public String s;
  public Foo() {
    System.out.println(s);
  }
}

class Bar extends Foo {
  public Bar() {
    this(s = "Hello World!");
  }
  private Bar(String helper) {
    super();
  }
}

এইভাবে, সুপার কন্সট্রাক্টর চালিত হওয়ার আগে একটি ক্ষেত্র সেট করা যেতে পারে যা সম্ভবত আর সম্ভব নয়। জেবিসি-তে, এই আচরণটি এখনও প্রয়োগ করা যেতে পারে।

একটি সুপার কনস্ট্রাক্টর কল শাখা

জাভাতে, কনস্ট্রাক্টর কলের মতো সংজ্ঞা দেওয়া সম্ভব নয়

class Foo {
  Foo() { }
  Foo(Void v) { }
}

class Bar() {
  if(System.currentTimeMillis() % 2 == 0) {
    super();
  } else {
    super(null);
  }
}

জাভা 7u23 অবধি, হটস্পট ভিএম এর যাচাইকারী অবশ্য এই চেকটি মিস করে নি যার কারণেই এটি সম্ভব হয়েছিল। এটি বেশ কয়েকটি কোড জেনারেশন সরঞ্জাম দ্বারা হ্যাকের বাছাই হিসাবে ব্যবহার করা হয়েছিল তবে এটির মতো শ্রেণি প্রয়োগ করা এখন আর আইনী নয়।

দ্বিতীয়টি এই সংকলক সংস্করণে কেবল একটি বাগ ছিল। আরও নতুন সংকলক সংস্করণে, এটি আবার সম্ভব।

কোনও নির্মাতা ছাড়াই একটি ক্লাস সংজ্ঞায়িত করুন

জাভা সংকলক সর্বদা যে কোনও শ্রেণীর জন্য কমপক্ষে একজন নির্মাতা বাস্তবায়ন করবে implement জাভা বাইট কোডে, এটি প্রয়োজন হয় না। এটি এমন শ্রেণীর তৈরি করতে দেয় যা প্রতিবিম্ব ব্যবহার করার পরেও নির্মাণ করা যায় না। তবে, sun.misc.Unsafeএখনও ব্যবহারের ফলে এ জাতীয় দৃষ্টান্ত তৈরি করা যায়।

অভিন্ন স্বাক্ষর সহ তবে ভিন্ন রিটার্নের ধরণের সাথে পদ্ধতিগুলি সংজ্ঞায়িত করুন

জেপিএলে, কোনও পদ্ধতি তার নাম এবং এর কাঁচা প্যারামিটার ধরণের দ্বারা অনন্য হিসাবে চিহ্নিত করা হয়। জেবিসি-তে, কাঁচা ফেরতের প্রকারটি অতিরিক্তভাবে বিবেচনা করা হয়।

নামগুলি দ্বারা পৃথক নয় কেবল ক্ষেত্রগুলি নির্দিষ্ট করুন

কোনও শ্রেণি ফাইলটিতে একই নামের বেশ কয়েকটি ক্ষেত্র থাকতে পারে যতক্ষণ না তারা ভিন্ন ক্ষেত্রের প্রকার ঘোষণা করে। জেভিএম সর্বদা একটি ক্ষেত্রকে নাম এবং প্রকারের টিপল হিসাবে উল্লেখ করে।

অঘোষিত চেক করা ব্যতিক্রমগুলি তাদের না ধরে ফেলে দিন

জাভা রানটাইম এবং জাভা বাইট কোড চেক করা ব্যতিক্রমগুলির ধারণা সম্পর্কে অবগত নয়। এটি কেবল জাভা সংকলকই যাচাই করেছে যে চেক করা ব্যতিক্রমগুলি সর্বদা হয় ছুঁড়ে দেওয়া হয় বা যদি তারা নিক্ষিপ্ত হয় তবে তা ঘোষণা করা হয়।

ল্যাম্বডা এক্সপ্রেশনগুলির বাইরে ডায়নামিক পদ্ধতি অনুরোধ ব্যবহার করুন

তথাকথিত গতিশীল পদ্ধতির প্রার্থনা কেবল জাভার ল্যাম্বডা এক্সপ্রেশনগুলির জন্য নয়, যে কোনও কিছুর জন্য ব্যবহার করা যেতে পারে। এই বৈশিষ্ট্যটি ব্যবহার করা উদাহরণস্বরূপ রানটাইমে এক্সিকিউশন লজিকটিকে স্যুইচ আউট করার অনুমতি দেয়। অনেকগুলি গতিশীল প্রোগ্রামিং ল্যাঙ্গুয়েজ যা জেবিসি-তে ডুবে গেছে এই নির্দেশিকাটি ব্যবহার করে তাদের কার্যকারিতা উন্নত করেছে । জাভা বাইট কোডে, আপনি জাভা in-তে ল্যাম্বডা এক্সপ্রেশনগুলি অনুকরণ করতে পারেন যেখানে জেভিএম ইতিমধ্যে নির্দেশটি বুঝতে পেরে কম্পাইলার এখনও গতিশীল পদ্ধতির অনুরোধের কোনও অনুমতি দেয়নি।

সনাক্তকারীদের ব্যবহার করুন যা সাধারণত আইনী হিসাবে বিবেচিত হয় না

কখনও আপনার পদ্ধতির নামে ফাঁকা স্থান এবং একটি লাইন ব্রেক ব্যবহার করে ফ্যানসিড করেছেন? আপনার নিজের জেবিসি এবং কোড পর্যালোচনার জন্য শুভকামনা তৈরি করুন। শনাক্তকারী কেবল অবৈধ অক্ষর ., ;, [এবং /। অতিরিক্তভাবে, নাম নেই <init>বা <clinit>না থাকতে পারে এমন পদ্ধতিতে <এবং >

finalপরামিতি বা thisরেফারেন্স পুনরায় সাইন করুন

finalপ্যারামিটারগুলি জেবিসি-তে বিদ্যমান নেই এবং ফলস্বরূপ পুনরায় নিয়োগ দেওয়া যেতে পারে। thisরেফারেন্স সহ যে কোনও প্যারামিটার কেবল JVM এর মধ্যে একটি সাধারণ অ্যারেতে সংরক্ষণ করা হয় যা কোনও একক পদ্ধতি ফ্রেমের মধ্যে thisসূচীতে রেফারেন্সটিকে পুনরায় নিয়োগ করতে দেয় 0

finalক্ষেত্রগুলি পুনরায় বরাদ্দ করুন

যতক্ষণ না কোনও নির্মাণকারীর মধ্যে একটি চূড়ান্ত ক্ষেত্র নির্ধারিত হয়, এই মানটিকে পুনরায় নিয়োগ করা এমনকি কোনও মান নির্ধারণ না করাও আইনী is অতএব, নিম্নলিখিত দুটি নির্মাণকারী বৈধ:

class Foo {
  final int bar;
  Foo() { } // bar == 0
  Foo(Void v) { // bar == 2
    bar = 1;
    bar = 2;
  }
}

জন্য static finalক্ষেত্র, এমনকি এটি বর্গ সূচনাকারী বাইরে ক্ষেত্র reassign অনুমোদিত হয়।

কনস্ট্রাক্টর এবং ক্লাস ইনিশিয়ালাইজারকে ট্রিট করুন যেন তারা পদ্ধতি

এটি একটি ধারণাগত বৈশিষ্ট্য বেশি তবে নির্মাতারা সাধারণ পদ্ধতির চেয়ে জেবিসি-র মধ্যে কোনও আলাদা আচরণ করা হয় না। এটি কেবল জেভিএমের যাচাইকারীই আশ্বাস দেয় যে নির্মাতারা অন্য আইনী কনস্ট্রাক্টরকে কল করে call তা ছাড়া, এটি কেবল জাভা নামকরণের কনভেনশন যা নির্মাণকারীদের ডেকে আনা <init>এবং ক্লাস ইনিশিয়ালাইজার বলা হয় <clinit>। এই পার্থক্য ছাড়াও, পদ্ধতি এবং নির্মাতাদের প্রতিনিধিত্ব অভিন্ন। হোলগার যেমন একটি মন্তব্যে নির্দেশ করেছেন, আপনি এমনকি voidএই পদ্ধতিগুলি কল করা সম্ভব না হলেও, আপনি যুক্তি ব্যতীত অন্য কোনও রিটার্ন টাইপের সাথে নির্মাণকারী বা ক্লাস ইনিশিয়ালাইজারকে সংজ্ঞায়িত করতে পারেন ।

অসমমিতিক রেকর্ড তৈরি করুন *

একটি রেকর্ড তৈরি করার সময়

record Foo(Object bar) { }

জাভাক একটি একক ক্ষেত্রের নামের সাথে একটি ক্লাস ফাইল তৈরি করবে bar, নামক একটি অ্যাসেসর পদ্ধতি bar()এবং একটি একক গ্রহণকারী একটি নির্মাণকারী Object। অতিরিক্তভাবে, এর জন্য একটি রেকর্ড বৈশিষ্ট্য barযুক্ত করা হয়। ম্যানুয়ালি একটি রেকর্ড উত্পন্ন করার মাধ্যমে, ক্ষেত্রটি এড়ানো এবং অ্যাক্সেসরটিকে আলাদাভাবে প্রয়োগ করা সম্ভব, একটি ভিন্ন নির্মাতা আকার তৈরি করা সম্ভব। একই সময়ে, এখনও প্রতিবিম্বের এপিআই বিশ্বাস করা সম্ভব যে শ্রেণিটি একটি আসল রেকর্ড উপস্থাপন করে।

যে কোনও সুপার পদ্ধতিতে কল করুন (জাভা ১.১ অবধি)

তবে এটি কেবল জাভা সংস্করণ 1 এবং 1.1 এর ক্ষেত্রেই সম্ভব। জেবিসি-তে, পদ্ধতিগুলি সর্বদা সুস্পষ্ট লক্ষ্য ধরণের প্রেরণ করা হয়। এর অর্থ এটি for

class Foo {
  void baz() { System.out.println("Foo"); }
}

class Bar extends Foo {
  @Override
  void baz() { System.out.println("Bar"); }
}

class Qux extends Bar {
  @Override
  void baz() { System.out.println("Qux"); }
}

তা বাস্তবায়ন করা সম্ভব ছিল Qux#bazডাকা Foo#bazযখন উপর জাম্পিং Bar#baz। সরাসরি সুপার ক্লাসের চেয়ে আরও একটি সুপার পদ্ধতি বাস্তবায়ন কল করার জন্য একটি স্পষ্ট আহবানকে এখনও সংজ্ঞায়িত করা সম্ভব হলেও এর ফলে জাভা সংস্করণগুলিতে ১.১ এর পরে আর কোনও প্রভাব পড়বে না। জাভা ১.১-এ, ACC_SUPERপতাকাটি সেট করে এই আচরণটি নিয়ন্ত্রণ করা হয়েছিল যা একই আচরণকে সক্ষম করবে যা কেবল প্রত্যক্ষ সুপার শ্রেণীর প্রয়োগকে কল করে।

একই শ্রেণিতে ঘোষিত একটি পদ্ধতির একটি অ-ভার্চুয়াল কল সংজ্ঞা দিন

জাভাতে, কোনও শ্রেণির সংজ্ঞা দেওয়া সম্ভব নয় is

class Foo {
  void foo() {
    bar();
  }
  void bar() { }
}

class Bar extends Foo {
  @Override void bar() {
    throw new RuntimeException();
  }
}

উপরের কোডটি সর্বদা এর ফলাফল হিসাবে প্রদর্শিত হবে RuntimeExceptionযখন এর fooউদাহরণটিতে অনুরোধ জানানো হয় Barএর নিজস্ব পদ্ধতিটি যা সংজ্ঞায়িত হয়েছে Foo::fooতা আহবান করার জন্য পদ্ধতিটি নির্ধারণ করা সম্ভব নয় । হিসাবে একটি অ-ব্যক্তিগত উদাহরণস্বরূপ পদ্ধতি, কল সবসময় ভার্চুয়াল হয়। বাইট কোড দিয়ে, এক তবে ব্যবহার করতে আবাহন বর্ণনা করতে পারেন opcode যা সরাসরি সংযোগ পদ্ধতি কল করার 'র সংস্করণ। এই অপকোডটি সাধারণত সুপার পদ্ধতি আমন্ত্রণগুলি বাস্তবায়নের জন্য ব্যবহৃত হয় তবে বর্ণিত আচরণটি প্রয়োগ করতে আপনি অপকডটি পুনরায় ব্যবহার করতে পারেন। barFoobarINVOKESPECIALbarFoo::fooFoo

সূক্ষ্ম শস্য ধরণের টিকা

জাভাতে, টীকাগুলি ঘোষণাপত্র অনুসারে টীকাগুলি প্রয়োগ করা হয় @Target। বাইট কোড ম্যানিপুলেশন ব্যবহার করে, এই নিয়ন্ত্রণ থেকে স্বতন্ত্রভাবে টীকাগুলি সংজ্ঞায়িত করা সম্ভব। এছাড়াও, উদাহরণস্বরূপ প্যারামিটারটি উল্লেখ না করে প্যারামিটারের প্রকারটি টিকিয়ে দেওয়া সম্ভব হয় এমনকি যদি @Targetটীকা উভয় উপাদানের ক্ষেত্রে প্রযোজ্য।

কোনও প্রকার বা এর সদস্যদের জন্য কোনও বৈশিষ্ট্য নির্ধারণ করুন

জাভা ভাষার মধ্যে কেবল ক্ষেত্র, পদ্ধতি বা ক্লাসের জন্য টীকা সংজ্ঞা দেওয়া সম্ভব। জেবিসি তে, আপনি মূলত জাভা ক্লাসে কোনও তথ্য এম্বেড করতে পারেন। এই তথ্যটি ব্যবহার করার জন্য, আপনি আর জাভা বর্গ লোডিং পদ্ধতির উপর নির্ভর করতে পারবেন না তবে আপনাকে নিজের দ্বারা মেটা তথ্য বের করতে হবে।

ওভারফ্লো এবং পরোক্ষভাবে বরাদ্দ byte, short, charএবং booleanমান

পরবর্তী আদিম ধরণেরগুলি সাধারণত জেবিসি তে পরিচিত হয় না তবে কেবল অ্যারে প্রকারের জন্য বা ক্ষেত্র এবং পদ্ধতি বর্ণনাকারীদের জন্য সংজ্ঞায়িত হয়। বাইট কোডের নির্দেশাবলীর মধ্যে, নামযুক্ত সমস্ত ধরণের স্থান 32 বিট নেয় যা তাদের হিসাবে প্রতিনিধিত্ব করতে দেয় int। সরকারিভাবে মাত্র int, float, longএবং doubleধরনের বাইট কোড মধ্যে উপস্থিত থাকার যা সব প্রয়োজন জেভিএম এর যাচাইকারী শাসন দ্বারা স্পষ্ট রূপান্তর।

একটি মনিটর মুক্তি না

একটি synchronizedব্লক আসলে দুটি বিবৃতি নিয়ে গঠিত, একটি অর্জন এবং একটি মনিটর প্রকাশ করার জন্য। জেবিসি-তে, আপনি এটি প্রকাশ না করে একটি অর্জন করতে পারেন।

দ্রষ্টব্য : হটস্পটের সাম্প্রতিক বাস্তবায়নে, এটি পরিবর্তে IllegalMonitorStateExceptionকোনও পদ্ধতির শেষে বা কোনও পদ্ধতি ব্যতিক্রম দ্বারা পদ্ধতিটি সমাপ্ত হলে নিখুঁত মুক্তির দিকে নিয়ে যায়।

returnটাইপ ইনিশিয়ালাইজারে একাধিক স্টেটমেন্ট যুক্ত করুন

জাভাতে, এমনকি একটি তুচ্ছ ধরনের প্রারম্ভিক

class Foo {
  static {
    return;
  }
}

অবৈধ। বাইট কোডে, টাইপ ইনিশিয়ালাইজারকে অন্য যে কোনও পদ্ধতি হিসাবে ধরা হয়, অর্থাত্ রিটার্নের স্টেটমেন্টগুলি যে কোনও জায়গায় সংজ্ঞায়িত করা যায়।

অপরিবর্তনীয় লুপগুলি তৈরি করুন

জাভা সংকলক জাভা বাইট কোডের লোটগুলিকে গোটো বিবৃতিতে রূপান্তর করে। এই জাতীয় বিবৃতি অপরিবর্তনীয় লুপগুলি তৈরি করতে ব্যবহার করা যেতে পারে যা জাভা সংকলক কখনই করে না।

একটি পুনরাবৃত্তাকারী ব্লক সংজ্ঞা দিন

জাভা বাইট কোডে, আপনি একটি ব্লক সংজ্ঞায়িত করতে পারেন:

try {
  throw new Exception();
} catch (Exception e) {
  <goto on exception>
  throw Exception();
}

synchronizedজাভাতে কোনও ব্লক ব্যবহার করার সময় অনুরূপ বিবৃতি স্পষ্টভাবে তৈরি করা হয় যেখানে কোনও মনিটর ছাড়ার সময় কোনও ব্যতিক্রম এই মনিটরটি প্রকাশের নির্দেশে ফিরে আসে। সাধারণত, এই জাতীয় নির্দেশের ক্ষেত্রে কোনও ব্যতিক্রম ঘটানো উচিত নয় তবে যদি এটি (যেমন অবনমিত ThreadDeath) হয় তবে মনিটরটি এখনও মুক্তি পাবে।

যে কোনও ডিফল্ট পদ্ধতিতে কল করুন

জাভা সংকলকটির ডিফল্ট পদ্ধতির প্রার্থনা মঞ্জুর করার জন্য বেশ কয়েকটি শর্ত পূরণ করতে হবে:

  1. পদ্ধতিটি অবশ্যই সুনির্দিষ্ট একটি হতে হবে ( কোনও সুপার ইন্টারফেস সহ যে কোনও ধরণের দ্বারা প্রয়োগ করা হয় এমন একটি উপ ইন্টারফেসের মাধ্যমে ওভাররাইড করা উচিত নয় )।
  2. ডিফল্ট পদ্ধতির ইন্টারফেস প্রকারটি অবশ্যই ক্লাসের মাধ্যমে সরাসরি প্রয়োগ করা উচিত যা ডিফল্ট পদ্ধতিটি কল করে। তবে, যদি ইন্টারফেসটি ইন্টারফেস Bপ্রসারিত Aকরে তবে কোনও পদ্ধতিতে ওভাররাইড না করে A, তবুও পদ্ধতিটি চালু করা যেতে পারে।

জাভা বাইট কোডের জন্য, কেবলমাত্র দ্বিতীয় শর্ত গণনা করা হয়। প্রথমটি যদিও অপ্রাসঙ্গিক।

এমন উদাহরণে একটি সুপার পদ্ধতি চাওয়া this

জাভা সংকলক কেবল উদাহরণের ভিত্তিতে একটি সুপার (বা ইন্টারফেস ডিফল্ট) পদ্ধতি চালু করতে অনুমতি দেয় this। বাইট কোডে, তবে নীচের মতো একই ধরণের উদাহরণে সুপার পদ্ধতিটি আহ্বান করাও সম্ভব:

class Foo {
  void m(Foo f) {
    f.super.toString(); // calls Object::toString
  }
  public String toString() {
    return "foo";
  }
}

সিন্থেটিক সদস্যদের অ্যাক্সেস করুন

জাভা বাইট কোডে, সরাসরি সিন্থেটিক সদস্যদের অ্যাক্সেস করা সম্ভব। উদাহরণস্বরূপ, নীচের উদাহরণে অন্য Barউদাহরণের বাইরের উদাহরণটি কীভাবে অ্যাক্সেস করা হয় তা বিবেচনা করুন:

class Foo {
  class Bar { 
    void bar(Bar bar) {
      Foo foo = bar.Foo.this;
    }
  }
}

এটি কোনও সিন্থেটিক ক্ষেত্র, শ্রেণি বা পদ্ধতির ক্ষেত্রে সাধারণত সত্য।

সিঙ্কের বাইরে সিঙ্কের জেনেরিক ধরণের তথ্য সংজ্ঞায়িত করুন

যদিও জাভা রানটাইম জেনেরিক ধরণের প্রক্রিয়া করে না (জাভা সংকলক প্রকার মুছে ফেলার পরে), এই তথ্যটি এখনও একটি সংকলিত শ্রেণিতে মেটা তথ্য হিসাবে সংযুক্ত করা হয় এবং প্রতিবিম্ব এপিআইয়ের মাধ্যমে অ্যাক্সেসযোগ্য করে তোলে।

যাচাইকারী এই মেটা ডেটা- Stringএনকোডড মানগুলির সামঞ্জস্যতা পরীক্ষা করে না । সুতরাং মুছে ফেলার সাথে মেলে না এমন জেনেরিক ধরণের তথ্য সংজ্ঞায়িত করা সম্ভব। ফলস্বরূপ, নিম্নলিখিত দাবিগুলি সত্য হতে পারে:

Method method = ...
assertTrue(method.getParameterTypes() != method.getGenericParameterTypes());

Field field = ...
assertTrue(field.getFieldType() == String.class);
assertTrue(field.getGenericFieldType() == Integer.class);

এছাড়াও, স্বাক্ষরটিকে অবৈধ হিসাবে সংজ্ঞায়িত করা যেতে পারে যে কোনও রানটাইম ব্যতিক্রম নিক্ষেপ করা হয়। অলসভাবে মূল্যায়ন করা হয় বলে তথ্য প্রথমবার অ্যাক্সেস করা হয় যখন এই ব্যতিক্রম নিক্ষেপ করা হয়। (একটি ত্রুটিযুক্ত টীকা সহ মানসমূহের অনুরূপ।)

প্যারামিটার মেটা তথ্য কেবলমাত্র কয়েকটি নির্দিষ্ট পদ্ধতির জন্য যুক্ত করুন

জাভা সংকলক parameterপতাকা সক্ষমিত সহ কোনও শ্রেণি সংকলন করার সময় প্যারামিটারের নাম এবং সংশোধক তথ্য এম্বেড করার অনুমতি দেয় । জাভা শ্রেণীর ফাইল ফর্ম্যাটে, এই তথ্যটি প্রতি-পদ্ধতিতে সঞ্চিত থাকে যা নির্দিষ্ট পদ্ধতির জন্য কেবল এই জাতীয় পদ্ধতি এম্বেড করা সম্ভব করে।

আপনার জেভিএমকে জঘন্য জিনিসগুলি আপ করুন এবং হার্ড-ক্র্যাশ করুন

উদাহরণস্বরূপ, জাভা বাইট কোডে, আপনি যে কোনও পদ্ধতিতে যে কোনও পদ্ধতিতে আবেদন করতে সংজ্ঞা দিতে পারেন। সাধারণত, যাচাইকারী অভিযোগ করবেন যদি কোনও ধরণের এই জাতীয় পদ্ধতির কথা না জানা থাকে। তবে আপনি যদি অ্যারেতে কোনও অজানা পদ্ধতিটি চালু করেন তবে আমি কিছু জেভিএম সংস্করণে একটি বাগ পেয়েছি যেখানে যাচাইকারী এটি মিস করবে এবং নির্দেশটি শুরু হওয়ার পরে আপনার জেভিএম সমাপ্ত হবে। এটি যদিও খুব কমই কোনও বৈশিষ্ট্য, তবে এটি প্রযুক্তিগতভাবে জাভাক সংকলিত জাভা দ্বারা সম্ভব নয় । জাভা কিছু ধরণের ডাবল বৈধতা আছে। প্রথম বৈধতা জাভা সংকলক দ্বারা প্রয়োগ করা হয়, দ্বিতীয়টি JVM দ্বারা যখন কোনও শ্রেণি লোড হয়। সংকলকটি এড়িয়ে গিয়ে আপনি যাচাইকারীর বৈধতার মধ্যে একটি দুর্বল জায়গা খুঁজে পেতে পারেন। যদিও এটি কোনও বৈশিষ্ট্যের চেয়ে সাধারণ বিবৃতি।

যখন বাইরের শ্রেণি নেই তখন কোনও কনস্ট্রাক্টরের রিসিভার প্রকারটি টিকান

জাভা 8 হ'ল, অ স্থিতিশীল পদ্ধতি এবং অভ্যন্তরীণ শ্রেণীর নির্মাতারা কোনও রিসিভার প্রকার ঘোষণা করতে এবং এই জাতীয় প্রকারগুলি টিকা দিতে পারে। শীর্ষ-স্তরের শ্রেণির নির্মাতারা তাদের প্রাপক প্রকারটি বেনিফিট করতে পারে না কারণ তারা বেশিরভাগই কোনও ঘোষণা করে না।

class Foo {
  class Bar {
    Bar(@TypeAnnotation Foo Foo.this) { }
  }
  Foo() { } // Must not declare a receiver type
}

যেহেতু Foo.class.getDeclaredConstructor().getAnnotatedReceiverType()কোনও AnnotatedTypeপ্রতিনিধিত্ব করে ফেরত দেয় Foo, Fooতাই ক্লাস ফাইলে যেখানে এই টীকাগুলি পরে প্রতিবিম্ব এপিআই দ্বারা পড়া হয় সেখানে সরাসরি নির্মাতার জন্য টাইপ টীকাগুলি অন্তর্ভুক্ত করা সম্ভব ।

অব্যবহৃত / উত্তরাধিকার বাইট কোড নির্দেশাবলী ব্যবহার করুন

যেহেতু অন্যরা এর নাম দিয়েছে, আমি এটিও অন্তর্ভুক্ত করব। জাভা পূর্বে বক্তব্য JSRএবং RETবিবৃতি দ্বারা সাবরুটাইন ব্যবহার করছিল । জেবিসি এমনকি এই উদ্দেশ্যে একটি নিজস্ব রিটার্ন ঠিকানা জানত knew তবে সাব্রোটাইনগুলির ব্যবহার স্থিতিশীল কোড বিশ্লেষণকে অতিরঞ্জিত করেছিল যার কারণে এই নির্দেশাবলী আর ব্যবহার করা হয় না। পরিবর্তে, জাভা সংকলকটি এটি সংকলিত কোডটির নকল করবে। তবে এটি মূলত অভিন্ন যুক্তি তৈরি করে যার কারণে আমি অন্য কিছু অর্জনের জন্য এটি সত্যই বিবেচনা করি না। একইভাবে, আপনি উদাহরণস্বরূপ যোগ করতে পারেNOOPবাইট কোড নির্দেশ যা জাভা সংকলক দ্বারা ব্যবহৃত হয় না তবে এটি আপনাকে নতুনভাবে কিছু অর্জন করতে দেয় না। প্রসঙ্গে উল্লেখ করা হয়েছে, এই উল্লিখিত "বৈশিষ্ট্য নির্দেশাবলী" এখন আইনী অপকোডগুলির সেট থেকে সরানো হয়েছে যা তাদের কোনও বৈশিষ্ট্য এমনকি কম সরবরাহ করে।


3
পদ্ধতির নাম সম্পর্কিত, <clinit>নামের সাথে পদ্ধতিগুলি নির্ধারণ করে <clinit>তবে পরামিতিগুলি স্বীকার করে বা voidফেরত না দেওয়া টাইপ করে আপনার একাধিক পদ্ধতি থাকতে পারে । তবে এই পদ্ধতিগুলি খুব কার্যকর নয়, জেভিএম এগুলি উপেক্ষা করবে এবং বাইট কোড তাদের অনুরোধ করতে পারে না। একমাত্র ব্যবহার হবে পাঠকদের বিভ্রান্ত করা।
হলগার

2
আমি সবেমাত্র আবিষ্কার করেছি, ওরাকলসের জেভিএম পদ্ধতি থেকে বেরোনোর ​​সময় একটি অপ্রকাশিত মনিটর সনাক্ত করে এবং IllegalMonitorStateExceptionযদি আপনি monitorexitনির্দেশটি বাদ দেন তবে একটি নিক্ষেপ করে । এবং ব্যতিক্রমী পদ্ধতিতে প্রস্থান করার ক্ষেত্রে যা করতে ব্যর্থ হয়েছে monitorexit, এটি নিরবে নিরীক্ষণটি পুনরায় সেট করে।
হোলার

1
@ হোলজার - এটি জানেন না, আমি জানি যে কমপক্ষে জেভিএমগুলিতে এটি সম্ভব ছিল, এই জাতীয় বাস্তবায়নের জন্য জ্রোকিতের নিজস্ব হ্যান্ডলারও রয়েছে। আমি এন্ট্রি আপডেট করব।
রাফায়েল

1
ঠিক আছে, জেভিএম স্পেসিফিকেশন এ জাতীয় আচরণের আদেশ দেয় না। আমি কেবল এটি আবিষ্কার করেছি কারণ আমি এই জাতীয় অ-মানক বাইট কোড ব্যবহার করে একটি জটলা অন্তর্জাতীয় লক তৈরি করার চেষ্টা করেছি।
26-24 ই

3
ঠিক আছে, আমি প্রাসঙ্গিক বৈশিষ্টটি খুঁজে পেয়েছি : " স্ট্রাকচার্ড লকিং এমন পরিস্থিতি যখন কোনও পদ্ধতিতে অনুরোধ করার সময়, প্রদত্ত মনিটরের প্রতিটি প্রস্থান সেই মনিটরের পূর্ববর্তী প্রবেশের সাথে মেলে। যেহেতু জাভা ভার্চুয়াল মেশিনে জমা দেওয়া সমস্ত কোড কাঠামোগত লকিং সম্পাদন করবে এমন কোনও নিশ্চয়তা নেই, তাই জাভা ভার্চুয়াল মেশিনের বাস্তবায়ন অনুমোদিত তবে কাঠামোগত লকিংয়ের গ্যারান্টি সহ নিম্নলিখিত দুটি বিধি প্রয়োগ করতে হবে না। … ”
26:44

14

এখানে কিছু বৈশিষ্ট্য যা জাভা বাইটকোডে করা যেতে পারে তবে জাভা উত্স কোডে নয়:

  • পদ্ধতিটি ছুড়ে ফেলেছে তা ঘোষণা না করেই কোনও পদ্ধতি থেকে একটি পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলা হচ্ছে। চেক করা এবং চেক না করা ব্যতিক্রমগুলি এমন একটি জিনিস যা কেবল জাভা সংকলক দ্বারা পরীক্ষা করা হয়, জেভিএম নয়। এর জন্য উদাহরণস্বরূপ স্কেলা পদ্ধতিগুলি থেকে কোনও ঘোষণা না দিয়ে চেক করা ব্যতিক্রমগুলি ফেলে দিতে পারে। যদিও জাভা জেনেরিকের সাথে স্নেকি থ্রো নামে একটি কাজ রয়েছে ।

  • ক্লাসে দুটি পদ্ধতি রয়েছে যা কেবল রিটার্নের ধরণের চেয়ে পৃথক, ইতিমধ্যে জোয়াকিমের উত্তরে বলা হয়েছে : জাভা ভাষার স্পেসিফিকেশন যখন কেবল তাদের ফেরতের প্রকারে পৃথক হয় (যেমন একই নাম, একই যুক্তি তালিকার, ...)। জেভিএম স্পেসিফিকেশন তবে, এমন কোন বিধিনিষেধ আছে তাই একটি ক্লাস ফাইল করতে যেমন দুটি পদ্ধতি রয়েছে, শুধু কোন উপায় স্বাভাবিক জাভা কম্পাইলার ব্যবহার যেমন একটি ক্লাস ফাইল উত্পাদন করতে হবে। এই উত্তরে একটি দুর্দান্ত উদাহরণ / ব্যাখ্যা রয়েছে ।


4
মনে রাখবেন যে, সেখানে হয় জাভা প্রথম জিনিস করতে একটি উপায়। একে কখনও কখনও স্নিগ্ধ থ্রো বলা হয় ।
জোচিম সউর

এখন যে লুক্কায়িত! : ডি ভাগ করে নেওয়ার জন্য ধন্যবাদ।
এস্কো লুন্তটোলা

আমি মনে করি আপনি Thread.stop(Throwable)একটি লুক্কায়িত নিক্ষেপের জন্যও ব্যবহার করতে পারেন । আমি ধরে নিলাম ইতিমধ্যে সংযুক্ত একটি যদিও দ্রুত is
বার্ট ভ্যান হিউকেলোম

2
জাভা বাইটকোডে কোনও কনস্ট্রাক্টরকে কল না করে আপনি উদাহরণ তৈরি করতে পারবেন না। যাচাইকারী এমন কোনও কোড প্রত্যাখ্যান করবে যা একটি অবিশ্রুত উদাহরণ ব্যবহার করার চেষ্টা করে। অবজেক্টের ডিসিরিয়ালাইজেশন বাস্তবায়নটি কনস্ট্রাক্টর কলিং ছাড়াই দৃষ্টান্ত তৈরির জন্য দেশীয় কোড সহায়ক ব্যবহার করে uses
হলগার

অবজেক্ট অবজেক্টের ক্লাস ফুয়ের জন্য, আপনি অবজেক্টে ঘোষিত কোনও কনস্ট্রাক্টরকে ফোন করে ফুটিকে ইনস্ট্যান্ট করতে পারেননি। যাচাইকারী এটি অস্বীকার করবে। আপনি জাভা এর রিফ্লেকশনফ্যাক্টরি ব্যবহার করে এমন একটি নির্মাণকারী তৈরি করতে পারেন তবে এটি খুব কমই বাইট কোড বৈশিষ্ট্যযুক্ত তবে জ্নি দ্বারা উপলব্ধি করা হয়েছে। আপনার উত্তরটি ভুল এবং হলগার সঠিক।
রাফায়েল

8
  • GOTOআপনার নিজস্ব নিয়ন্ত্রণ কাঠামো তৈরি করতে লেবেলগুলি ব্যবহার করা যেতে পারে ( for whileইত্যাদি ব্যতীত )
  • আপনি thisকোনও পদ্ধতির অভ্যন্তরে স্থানীয় পরিবর্তনশীলটিকে ওভাররাইড করতে পারেন
  • এই উভয়ের সংমিশ্রণে আপনি টেইল কলটি তৈরি করতে পারেন বাইটকোডটি অনুকূলিত করে তৈরি করুন (আমি এটি জেকম্পিলিতে করি )

সম্পর্কিত পয়েন্ট হিসাবে আপনি ডিবাগের সাথে সংকলিত হলে পদ্ধতির জন্য প্যারামিটারের নাম পেতে পারেন ( প্যারানামার বাইটকোড পড়ে এটি করেন


আপনি কিভাবে overrideএই স্থানীয় পরিবর্তনশীল?
মাইকেল 12

2
@ মিশেল ওভাররাইড করা খুব শক্ত শব্দ। বাইটকোড স্তরে, সমস্ত স্থানীয় ভেরিয়েবলগুলি একটি সংখ্যাসূচক সূচক দ্বারা অ্যাক্সেস করা হয় এবং বিদ্যমান ভেরিয়েবলটিতে লেখা বা একটি নতুন ভেরিয়েবল (একটি বিচ্ছিন্ন স্কোপ সহ) আরম্ভ করার মধ্যে কোনও পার্থক্য নেই, উভয় ক্ষেত্রেই, এটি কেবল স্থানীয় ভেরিয়েবলের লেখার জন্য। thisপরিবর্তনশীল সূচক শূন্য আছে, কিন্তু সঙ্গে হচ্ছে ব্যতীত প্রাক সক্রিয়া thisযখন একটি দৃষ্টান্ত পদ্ধতি লিখে রেফারেন্স, এটি শুধু একটি স্থানীয় পরিবর্তনশীল আছে। সুতরাং আপনি এটিতে একটি পৃথক মান লিখতে পারেন, যা আপনি কীভাবে ব্যবহার করেন তার উপর নির্ভর করে this'স্কোপ শেষ করা বা পরিবর্তনশীল পরিবর্তন করার মতো কাজ thisকরতে পারে।
হলগার

আমি দেখি! সুতরাং সত্যিই কি এটি আবার thisনিয়োগ দেওয়া যেতে পারে? আমি মনে করি এটি কেবল শব্দ ওভাররাইড ছিল যা আমাকে ভাবছিল যে এর সঠিক অর্থ কী।
মাইকেল 12

5

সম্ভবত এই দস্তাবেজের 7A ধারাটি আগ্রহের বিষয়, যদিও এটি বাইটোকোড বৈশিষ্ট্যগুলির চেয়ে বাইটোকোড ক্ষতি সম্পর্কে ।


আকর্ষণীয় পড়া, তবে দেখে মনে হচ্ছে না যে কেউ এই জিনিসগুলির (আব) ব্যবহার করতে চাইবে
বার্ট ভ্যান হিউকেলোম

4

জাভা ভাষায় কনস্ট্রাক্টরের প্রথম বিবৃতি অবশ্যই সুপার বর্গ কনস্ট্রাক্টরের কাছে কল হতে হবে। বাইটকোডের এই সীমাবদ্ধতা নেই, পরিবর্তে নিয়মটি হ'ল সুপার ক্লাসের কনস্ট্রাক্টর বা একই শ্রেণির অন্য কোনও কনস্ট্রাক্টর সদস্যদের অ্যাক্সেস করার আগে অবজেক্টটির জন্য ডাকতে হবে। এটি আরও স্বাধীনতা যেমন:

  • অন্য কোনও অবজেক্টের উদাহরণ তৈরি করুন, এটি স্থানীয় ভেরিয়েবলে সঞ্চয় করুন (বা স্ট্যাক) এবং অন্য ব্যবহারের জন্য সেই পরিবর্তনশীলটিতে রেফারেন্স রাখার পরেও এটি সুপার বর্গ কনস্ট্রাক্টরের কাছে প্যারামিটার হিসাবে পাস করুন।
  • শর্তের উপর ভিত্তি করে অন্যান্য অন্যান্য কনস্ট্রাক্টরকে কল করুন। এটি সম্ভব হওয়া উচিত: জাভাতে শর্তসাপেক্ষে কোনও ভিন্ন নির্মাতাকে কীভাবে কল করবেন?

আমি এগুলি পরীক্ষা করি নি, তাই আমি ভুল হলে দয়া করে আমাকে সংশোধন করুন।


এমনকি কোনও সুপারস ক্লাস কনস্ট্রাক্টরকে কল করার আগে আপনি কোনও সদস্যদের সেট করতে পারেন। ক্ষেত্রগুলি পড়া বা কল করার পদ্ধতিগুলি তার আগে অবশ্য সম্ভব নয়।
রাফায়েল শীতকালীন

3

আপনি সরল জাভা কোডের পরিবর্তে বাইট কোড দিয়ে যা কিছু করতে পারেন তা হল কোড তৈরি করা যা কোনও সংকলক ছাড়াই লোড এবং চলতে পারে run অনেক সিস্টেমে জেডিকে-র পরিবর্তে জেআরই থাকে এবং আপনি যদি গতিশীলভাবে কোড উত্পন্ন করতে চান তবে জাভা কোডের পরিবর্তে বাইট কোড উত্পন্ন করা ভাল, এটি ব্যবহারের আগে সংকলন করতে হবে।


6
তবে আপনি কেবল সংকলকটি এড়িয়ে যাচ্ছেন, এমন কিছু তৈরি করছেন না যা সংকলক ব্যবহার করে উত্পাদিত হতে পারে না (যদি তা উপলব্ধ থাকত)।
বার্ট ভ্যান হিউকেলাম

2

আমি আই-প্লে থাকাকালীন আমি বাইকোড অপটিমাইজার লিখেছিলাম (এটি J2ME অ্যাপ্লিকেশনগুলির কোডের আকার হ্রাস করার জন্য তৈরি করা হয়েছিল)। আমি যুক্ত করা একটি বৈশিষ্ট্য হ'ল ইনলাইন বাইটকোড (সি ++ তে ইনলাইন সমাবেশ ভাষার অনুরূপ) ব্যবহার করার ক্ষমতা। আমি কোনও ফাংশনের আকার হ্রাস করতে সক্ষম হয়েছি যা DUP নির্দেশ ব্যবহার করে একটি গ্রন্থাগার পদ্ধতির অংশ ছিল, যেহেতু আমার কাছে দুবার মান প্রয়োজন। আমার শূন্য বাইট নির্দেশাবলীও ছিল (আপনি যদি এমন পদ্ধতিতে কল করে যা একটি চর নেয় এবং আপনি কোনও পূর্বে পাস করতে চান তবে আপনি জানেন যে কাস্ট করার দরকার নেই আমি চর (var) প্রতিস্থাপন করতে int2char (var) যুক্ত করেছি এবং এটি মুছে ফেলা হবে কোডটির আকার হ্রাস করার জন্য i2c নির্দেশনা। আমি এটিকে ফ্ল্যাট এ = 2.3; ফ্লোট বি = 3.4; ফ্লোট সি = এ + বিও করেছি; এবং এটি স্থির বিন্দুতে রূপান্তরিত হবে (দ্রুত, এবং কিছু জে 2 এমইও করেন নি) সমর্থন ভাসমান পয়েন্ট)।


2

জাভাতে, আপনি যদি কোনও সুরক্ষিত পদ্ধতিতে (বা অ্যাক্সেসের কোনও হ্রাস) পাবলিক পদ্ধতিকে ওভাররাইড করার চেষ্টা করেন তবে আপনি একটি ত্রুটি পেয়েছেন: "দুর্বল অ্যাক্সেসের সুযোগগুলি নির্ধারণের চেষ্টা"। আপনি যদি এটি জেভিএম বাইটকোড দিয়ে করেন, যাচাইকারীটি এটির সাথে ঠিক আছে, এবং আপনি এই পদ্ধতিগুলি পিতামাত্ত শ্রেণীর মাধ্যমে কল করতে পারেন যেন সেগুলি সর্বজনীন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.