জাভা 8 জেভিএম চালানোর জন্য জাভা 8 কোডটি কি সংকলন করা যায়?


163

জাভা 8 গুরুত্বপূর্ণ নতুন ভাষার বৈশিষ্ট্য যেমন ল্যাম্বডা এক্সপ্রেশনগুলির সাথে পরিচয় করিয়ে দেয়।

ভাষার এই পরিবর্তনগুলি কি সংকলিত বাইটকোডে এমন উল্লেখযোগ্য পরিবর্তনগুলির সাথে রয়েছে যা কিছু রেট্রোট্রান্সলেটর ব্যবহার না করে জাভা 7 ভার্চুয়াল মেশিনে চালানো থেকে বিরত রাখতে পারে?


উত্তর:


146

না, আপনার উত্স কোডে 1.8 টি বৈশিষ্ট্য ব্যবহার করার জন্য আপনার একটি 1.8 ভিএম টার্গেট করা দরকার। আমি মাত্র নতুন জাভা 8 রিলিজের চেষ্টা করেছি এবং সংকলনের চেষ্টা করেছি -target 1.7 -source 1.8এবং সংকলকটি প্রত্যাখ্যান করেছে:

$ javac Test -source 1.8 -target 1.7
javac: source release 1.8 requires target release 1.8

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

কেন? "হ্যাঁ" ইঙ্গিত করবে জাভা 8 কোনও জাভা 7 ভিএম-তে চালানোর জন্য সংকলিত করা যেতে পারে, যা জাভা 8 সংকলক অনুসারে ভুল।
জেস্পের ই

5
এখন আমি দেখতে পেলাম: আপনার "না" প্রশ্নের শিরোনামের উত্তর দেয়, প্রশ্নের শরীর নয়।
আবদুল

58

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

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

টীকাগুলি পুনরাবৃত্তি করা কেবল সিনট্যাকটিক চিনি। তারা পূর্ববর্তী সংস্করণগুলির সাথে বাইকোড সামঞ্জস্যপূর্ণ। জাভা 7-এ আপনাকে নিজের জন্য সহায়ক পদ্ধতিগুলি প্রয়োগ করতে হবে (যেমন getAnnotationsByType ) যা একটি ধারক টীকা প্রয়োগের বিশদটি গোপন করে যা বারবার টীকাগুলি অন্তর্ভুক্ত করে।

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

জাভা 7 সহ বাইটকোডে পদ্ধতির প্যারামিটারের নামগুলি বিদ্যমান, তাই এটিও সামঞ্জস্যপূর্ণ। পদ্ধতির বাইকোড পড়ে এবং পদ্ধতির ডিবাগ তথ্যের স্থানীয় পরিবর্তনশীল নামগুলি দেখে আপনি তাদের অ্যাক্সেস পেতে পারেন। উদাহরণস্বরূপ স্প্রিং ফ্রেমওয়ার্কটি হ'ল @ প্যাথভেরিয়েবল বাস্তবায়নের জন্য তাই করে, তাই সম্ভবত একটি লাইব্রেরি পদ্ধতি রয়েছে যা আপনি কল করতে পারেন। যেহেতু অ্যাবস্ট্রাক্ট ইন্টারফেসের পদ্ধতিগুলির কোনও মেথড বডি নেই, জাভা in তে এবং এএফআইএকে জাভা ৮-তে ইন্টারফেস পদ্ধতিগুলির জন্য ডিবাগ তথ্য উপস্থিত নেই।

অন্যান্য নতুন বৈশিষ্ট্যগুলি হ'ল বেশিরভাগ নতুন এপিআই, হটস্পট এবং সরঞ্জামদানের উন্নতি। নতুন কয়েকটি API গুলি তৃতীয় পক্ষের লাইব্রেরি হিসাবে উপলব্ধ (যেমন থ্রিটেন-ব্যাকপোর্ট এবং স্ট্রিমসপোর্ট )।

Summa Summarum, ডিফল্ট পদ্ধতিতে নতুন JVM বৈশিষ্ট্য প্রয়োজন তবে অন্যান্য ভাষার বৈশিষ্ট্যগুলি এটির নয়। আপনি যদি সেগুলি ব্যবহার করতে চান তবে আপনাকে জাভা 8-র কোডটি সংকলন করতে হবে এবং তারপরে রেট্রোলম্বদা সহ বাইটোকোডটি জাভা 5/6/7 ফর্ম্যাটে রূপান্তর করতে হবে। সর্বনিম্ন বাইটকোড সংস্করণটি পরিবর্তন করা দরকার, এবং জাভ্যাক অস্বীকার করে -source 1.8 -target 1.7তাই একটি retrotranslator প্রয়োজন।


3
প্রকৃতপক্ষে টাইপ টীকাগুলি রানটাইম দৃশ্যমান হতে পারে। stackoverflow.com/questions/22374612/…
এন্টিমোনি

33

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

নীচের রেফারেন্স উপাদানগুলি ল্যাম্বডা সম্পর্কিত পরিবর্তনগুলি কীভাবে চালিত হচ্ছে তা বোঝার জন্য কোনওভাবে সহায়তা করতে পারে।

এইগুলি কীভাবে হুডের নীচে জিনিসগুলি চালিত হয় তা বিশদভাবে ব্যাখ্যা করে। সম্ভবত আপনি সেখানে আপনার প্রশ্নের উত্তর খুঁজে পেতে পারেন।


7
কোনও নতুন বাইকোড নয়, তবে নতুন স্ট্রাকচার। যাচাইকারী ছিটিয়ে দেবে।
জোনাথন এস ফিশার

12
একটি ভাল উদাহরণ ইন্টারফেস। তারা এখন পদ্ধতি থাকতে পারে। জাভা 7 ভেরিফায়ার এটি পরিচালনা করতে সজ্জিত নয়। পুরানো বাইকোডগুলি সমস্তই ব্যবহৃত হয় তবে একটি নতুন উপায়ে।
জোনাথন এস ফিশার 21

1
আমি অবাক হয়েছি যে কীভাবে অনেকগুলি ভাষা বৈশিষ্ট্য সহ স্কেল সংকলন করতে পারে এমনকি জেডি কে 5 এর একটি লক্ষ্য jvm রিলিজ অর্জন করতে পারে।
মেরিনোস

1
@ মেরিনোসন আপনার সঠিক অর্থ কি? বৈশিষ্ট্যগুলোই কংক্রিট পদ্ধতি, যেমন ধারণ সঙ্গে এমআই class C extends A with B, স্বাভাবিক ইন্টারফেস সহ বাস্তবায়িত হয় Aএবং Bএবং সহচর শ্রেণীর A$classএবং B$class। ক্লাস Cকেবল স্ট্যাটিক সহচর ক্লাসগুলিতে পদ্ধতিগুলি ফরওয়ার্ড করে। স্ব-প্রকারগুলি একেবারেই প্রয়োগ করা হয় না, ল্যাম্বডাস অভ্যন্তরীণ ক্লাসগুলি বিমূর্ত করার জন্য সংকলন-সময়ে স্থানান্তরিত হয়, তাই একটি new D with A with Bঅভিব্যক্তি। প্যাটার্ন-ম্যাচিং যদি-অন্য কাঠামোগুলির একগুচ্ছ হয়। অ-স্থানীয় রিটার্ন? ল্যাম্বদা থেকে চেষ্টা করার চেষ্টা করুন। কিছু বাকি আছে? (মজার বিষয় হল, আমার স্ক্যাল্যাকটি 1.6 ডিফল্ট বলে)
অ্যাডোরাথ

1
অবশ্যই, স্ব-প্রকার ইত্যাদি বিশেষ শ্রেণীর বৈশিষ্ট্য এবং টীকাগুলিতে এনকোড করা হয়েছে যাতে স্ক্যাল্যাক ইতিমধ্যে সংকলিত ক্লাস ব্যবহার করার সময় নিয়মগুলি প্রয়োগ করতে এবং প্রয়োগ করতে পারে।
অ্যাডোরাথ


-5

আপনি এটি করতে পারেন -source 1.7 -target 1.7তারপর এটি সংকলন হবে। তবে আপনার জাবা লাম্বডাসের মতো 8 টি নির্দিষ্ট বৈশিষ্ট্য থাকলে তা সংকলন করবে না


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