উত্তর:
এটি একটি নতুন জেভিএম নির্দেশ যা একটি সংকলককে কোড তৈরি করতে দেয় যা আগে যেমন সম্ভব ছিল তার চেয়ে বেশি আলগা স্পেসিফিকেশন সহ পদ্ধতিগুলি কল করে - আপনি যদি জানেন " হাঁসের টাইপিং " কী, তবে ইনভয়েডিনামিক মূলত হাঁসের টাইপিংয়ের অনুমতি দেয়। জাভা প্রোগ্রামার এটি করতে পারে বলে আপনার খুব বেশি কিছু নেই; আপনি যদি কোনও সরঞ্জাম নির্মাতা হন তবে আপনি আরও নমনীয়, আরও দক্ষ JVM- ভিত্তিক ভাষা তৈরি করতে এটি ব্যবহার করতে পারেন। এখানে একটি সত্যই মিষ্টি ব্লগ পোস্ট যা প্রচুর বিবরণ দেয়।
MethodHandle
, যা সত্যই একই ধরণের জিনিস তবে আরও নমনীয়তার সাথে। তবে এই সমস্ত ক্ষেত্রে আসল শক্তি জাভা ভাষার সংযোজন নয়, অভ্যন্তরীণভাবে আরও গতিশীল এমন অন্যান্য ভাষাগুলিকে সমর্থন করার ক্ষেত্রে নিজেই জেভিএমের সক্ষমতা।
invokedynamic
যা এটি ব্যবহার করে তোলে (একটি বেনামে অভ্যন্তরীণ-শ্রেণিতে তাদের জড়ানোর তুলনায় যা প্রবর্তনের আগে প্রায় একমাত্র পছন্দ ছিল invokedynamic
)। সম্ভবত জেভিএম-এর শীর্ষে প্রচুর কার্যকরী প্রোগ্রামিং ভাষা অনন-অভ্যন্তর-শ্রেণীর পরিবর্তে এটিতে সংকলন করতে পছন্দ করবে।
কিছু সময় আগে, সি # একটি দুর্দান্ত বৈশিষ্ট্য যুক্ত করেছে, সি # এর মধ্যে ডায়নামিক সিনট্যাক্স
Object obj = ...; // no static type available
dynamic duck = obj;
duck.quack(); // or any method. no compiler checking.
প্রতিচ্ছবি পদ্ধতি কলগুলির জন্য এটিকে সিনট্যাক্স চিনির হিসাবে ভাবেন। এটিতে খুব আকর্ষণীয় অ্যাপ্লিকেশন থাকতে পারে। দেখতে http://www.infoq.com/presentations/Statically-Dynamic-Typing-Neal-Gafter
সি # এর গতিশীল ধরণের জন্য দায়ী নিল গিটার, সুন থেকে এমএসে সরিয়েছেন। সুতরাং এটি ভাবা অযৌক্তিক নয় যে একই বিষয়গুলি SU- র মধ্যে আলোচনা করা হয়েছিল।
আমি মনে করি তার খুব শীঘ্রই, কিছু জাভা ডুড অনুরূপ কিছু ঘোষণা করেছিলেন
InvokeDynamic duck = obj;
duck.quack();
দুর্ভাগ্যক্রমে, বৈশিষ্ট্যটি জাভা be এ পাওয়া যাবে না Very খুব হতাশ। জাভা প্রোগ্রামারদের জন্য, invokedynamic
তাদের প্রোগ্রামগুলিতে সুবিধা নেওয়ার কোনও সহজ উপায় তাদের কাছে নেই ।
invokedynamic
জাভা প্রোগ্রামারদের জন্য ব্যবহার করার ইচ্ছা ছিল না । আইএমও এটি জাভা দর্শনে মোটেই ফিট করে না। এটি জাভা নন ভাষাগুলির জন্য একটি জেভিএম বৈশিষ্ট্য হিসাবে যুক্ত করা হয়েছিল।
চালিত দুটি চালিয়ে যাওয়ার আগে দুটি ধারণাগুলি বুঝতে হবে।
1. স্ট্যাটিক বনাম ডায়নামিন টাইপিং
স্থিতিশীল - সংকলন সময়ে প্রিফর্ম পরীক্ষা পরীক্ষা (যেমন জাভা)
গতিশীল - রানটাইমের সময় প্রকারের পরীক্ষা করা (যেমন জাভাস্ক্রিপ্ট)
টাইপ চেকিং যাচাই করার প্রক্রিয়া যা কোনও প্রোগ্রাম নিরাপদ কিনা তা যাচাই করার প্রক্রিয়া, এটি হল শ্রেণি এবং উদাহরণের ভেরিয়েবল, পদ্ধতি প্যারামিটার, রিটার্ন মান এবং অন্যান্য ভেরিয়েবলের জন্য টাইপ করা তথ্য পরীক্ষা করা। উদাহরণস্বরূপ জাভা সংকলন সময়ে, স্ট্রিং, .. সম্পর্কে জানে, যখন জাভাস্ক্রিপ্টে কোনও অবজেক্টের ধরণটি কেবল রানটাইমে নির্ধারণ করা যায়
২. শক্তিশালী বনাম দুর্বল টাইপিং
শক্তিশালী - এর ক্রিয়াকলাপগুলিতে সরবরাহ করা মানের ধরণের বিধিনিষেধ নির্দিষ্ট করে (যেমন জাভা)
দুর্বল - কোনও ক্রিয়াকলাপকে (ক্যাসেট) আর্গুমেন্টগুলি যদি কোনও যুক্তির সাথে বেমানান ধরনের থাকে (যেমন ভিজ্যুয়াল বেসিক)
জাভা একটি স্ট্যাটিক্যালি এবং দুর্বল টাইপযুক্ত তা জেনে আপনি কীভাবে জেভিএম-তে ডায়নামিকালি এবং শক্তভাবে টাইপ করা ভাষা প্রয়োগ করবেন?
ইনভোকডিনামিক একটি রানটাইম সিস্টেম প্রয়োগ করে যা কোনও পদ্ধতি বা ফাংশনের সর্বাধিক উপযুক্ত প্রয়োগ চয়ন করতে পারে - প্রোগ্রামটি সংকলনের পরে।
উদাহরণ: (a + b) থাকা এবং সংকলনের সময় a, b ভেরিয়েবল সম্পর্কে কিছু না জানা, চালনার সময় জাভাতে সবচেয়ে উপযুক্ত পদ্ধতিতে এই ক্রিয়াকলাপটি চালিত। উদাহরণস্বরূপ, যদি এটি a, b টি স্ট্রিংস দেখা দেয় তবে তারপরে কল পদ্ধতি (স্ট্রিং এ, স্ট্রিং বি)। এটিতে যদি দেখা যায় যে, বি ইনটগুলি হয়, তবে কল পদ্ধতি (ইন এ, ইনট বি)।
ইনভোকাডাইনামিক জাভা 7 এর সাথে চালু হয়েছিল।
আমার জাভা রেকর্ডস নিবন্ধের অংশ হিসাবে , আমি ইনোক ডায়নামিকের পিছনে অনুপ্রেরণা সম্পর্কে জোর দিয়েছি। আসুন শুরু করা যাক ইন্দির মোটামুটি সংজ্ঞা দিয়ে।
ডায়নামিক টাইভ ল্যাঙ্গুয়েজের জন্য জেভিএম সমর্থন বাড়ানোর উদ্দেশ্যে জেএসআর 292-এর অংশ ছিল ইনভোক ডায়নামিক ( ইন্ডি নামেও পরিচিত ) । জাভা in এ প্রথম প্রকাশের পরে, অপকোডটি তার লাগেজ সহ জেআরবির মতো গতিশীল জেভিএম-ভিত্তিক ভাষা ব্যবহার করে quiteinvokedynamic
java.lang.invoke
যদিও ইনডি বিশেষত গতিশীল ভাষার সমর্থন বাড়ানোর জন্য ডিজাইন করা হয়েছে, এটি এর চেয়ে অনেক বেশি প্রস্তাব দেয়। প্রকৃতপক্ষে, ডায়নামিক টাইপ অ্যাক্রোব্যাটিক্স থেকে গতিশীল কৌশলগুলি পর্যন্ত কোনও ভাষা ডিজাইনারের যে কোনও গতিশীলতার প্রয়োজন যেখানেই এটি উপযুক্ত!
উদাহরণস্বরূপ, জাভা 8 ল্যাম্বডা এক্সপ্রেশনগুলি বাস্তবে ব্যবহার করে প্রয়োগ করা হয় invokedynamic
, যদিও জাভা একটি স্ট্যাটিকালি টাইপ করা ভাষা!
বেশ কিছু সময়ের জন্য জেভিএম চারটি পদ্ধতি আহ্বান প্রকারের সমর্থন করেছিল: invokestatic
স্ট্যাটিক পদ্ধতিগুলি invokeinterface
কল করতে , ইন্টারফেসের পদ্ধতিগুলি invokespecial
কল করতে, কনস্ট্রাক্টরকে কল করতে super()
বা ব্যক্তিগত পদ্ধতিতে এবং invokevirtual
উদাহরণ পদ্ধতিতে কল করতে।
তাদের পার্থক্য থাকা সত্ত্বেও, এই অনুরোধের ধরণগুলি একটি সাধারণ বৈশিষ্ট্য ভাগ করে: আমরা আমাদের নিজস্ব যুক্তি দিয়ে এগুলি সমৃদ্ধ করতে পারি না । বিপরীতে, invokedynamic
আমাদের যেকোন উপায়ে অনুরোধ প্রক্রিয়া বুটস্ট্র্যাপ করতে সক্ষম করে। তারপরে জেভিএম সরাসরি বুটস্ট্র্যাপ পদ্ধতিতে কল করার জন্য যত্ন নেয়।
জেভিএম প্রথমবার কোনও invokedynamic
নির্দেশ দেখে , এটি বুটস্ট্র্যাপ পদ্ধতি নামে একটি বিশেষ স্ট্যাটিক পদ্ধতি কল করে । বুটস্ট্র্যাপ পদ্ধতিটি জাভা কোডের একটি টুকরো যা আমরা প্রকৃত প্রতিযোগিতায় যুক্তিযুক্ত যুক্তি প্রস্তুত করতে লিখেছি:
তারপরে বুটস্ট্র্যাপ পদ্ধতিটি একটি উদাহরণ দেয় java.lang.invoke.CallSite
। এটি CallSite
প্রকৃত পদ্ধতি, অর্থাত্ একটি রেফারেন্স ধারণ করে MethodHandle
।
এখন থেকে, প্রতিবার JVM এই invokedynamic
নির্দেশটি আবার দেখলে এটি ধীর পাথকে এড়িয়ে যায় এবং সরাসরি অন্তর্নিহিত নির্বাহযোগ্যকে কল করে। কিছু পরিবর্তন না হলে জেভিএম ধীর পথ এড়িয়ে চলেছে।
Records
বোবা ডেটা ধারক বলে মনে করা হয় এমন ক্লাসগুলি ঘোষণার জন্য জাভা 14 একটি দুর্দান্ত কমপ্যাক্ট সিনট্যাক্স সরবরাহ করছে।
এই সাধারণ রেকর্ডটি বিবেচনা করে:
public record Range(int min, int max) {}
এই উদাহরণের বাইটকোডটি এমন কিছু হবে:
Compiled from "Range.java"
public java.lang.String toString();
descriptor: ()Ljava/lang/String;
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokedynamic #18, 0 // InvokeDynamic #0:toString:(LRange;)Ljava/lang/String;
6: areturn
এর বুটস্ট্র্যাপ পদ্ধতি সারণীতে :
BootstrapMethods:
0: #41 REF_invokeStatic java/lang/runtime/ObjectMethods.bootstrap:
(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;
Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;
Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;
Method arguments:
#8 Range
#48 min;max
#50 REF_getField Range.min:I
#51 REF_getField Range.max:I
সুতরাং রেকর্ডগুলির জন্য বুটস্ট্র্যাপ পদ্ধতিটি বলা হয় bootstrap
যা java.lang.runtime.ObjectMethods
ক্লাসে থাকে। আপনি দেখতে পাচ্ছেন, এই বুটস্ট্র্যাপ পদ্ধতিটি নিম্নলিখিত পরামিতিগুলি আশা করে:
MethodHandles.Lookup
প্রসঙ্গ উপস্থাপনের একটি উদাহরণ ( Ljava/lang/invoke/MethodHandles$Lookup
অংশ)।toString
, equals
, hashCode
, ইত্যাদি) বুটস্ট্র্যাপ লিংক যাচ্ছে। উদাহরণস্বরূপ, যখন মানটি হয় toString
, বুটস্ট্র্যাপ এমন কোনও ConstantCallSite
( CallSite
যা কখনই পরিবর্তিত হয় না) ফিরে আসবে যা toString
এই নির্দিষ্ট রেকর্ডের জন্য প্রকৃত বাস্তবায়নের দিকে নির্দেশ করে।TypeDescriptor
পদ্ধতি (জন্য Ljava/lang/invoke/TypeDescriptor
অংশ)।Class<?>
, রেকর্ড শ্রেণীর ধরণের প্রতিনিধিত্ব করে। এটা
Class<Range>
এই ক্ষেত্রে।min;max
।MethodHandle
উপাদান প্রতি এক । এই পদ্ধতিটি কার্যকর করার জন্য বুটস্ট্র্যাপ পদ্ধতিটি MethodHandle
উপাদানগুলির উপর ভিত্তি করে তৈরি করতে পারে ।invokedynamic
নির্দেশ বুটস্ট্র্যাপ পদ্ধতি ঐ সমস্ত আর্গুমেন্ট প্রেরণ করা হয়। বুটস্ট্র্যাপ পদ্ধতি, পরিবর্তে, এর উদাহরণ দেয় ConstantCallSite
। এটি ConstantCallSite
অনুরোধ করা পদ্ধতি প্রয়োগের জন্য একটি রেফারেন্স ধারণ করে, যেমন toString
।
রিফ্লেকশন এপিআইগুলির বিপরীতে, java.lang.invoke
জেভিএম সমস্ত আমন্ত্রণের মাধ্যমে পুরোপুরি দেখতে পাওয়ায় এআইপিআই বেশ দক্ষ। অতএব, JVM যতক্ষণ না আমরা ধীর পথটিকে যতটা সম্ভব এড়াতে ততক্ষণ সব ধরণের অপ্টিমাইজেশন প্রয়োগ করতে পারি!
দক্ষতার যুক্তি ছাড়াও, invokedynamic
পদ্ধতির সরলতার কারণে আরও নির্ভরযোগ্য এবং কম ভঙ্গুর ।
তদুপরি, জাভা রেকর্ডসের জন্য উত্পন্ন বাইটকোড বৈশিষ্ট্যগুলির সংখ্যার থেকে পৃথক। সুতরাং, বাইকোড কম এবং দ্রুত প্রারম্ভকালীন সময়।
পরিশেষে, ধরা যাক জাভা এর একটি নতুন সংস্করণে একটি নতুন এবং আরও দক্ষ বুটস্ট্র্যাপ পদ্ধতি বাস্তবায়ন রয়েছে। সহ invokedynamic
, আমাদের অ্যাপ্লিকেশন পুনঃসংশোধন ছাড়াই এই উন্নতির সুবিধা নিতে পারে। এইভাবে আমাদের কিছু ধরণের ফরওয়ার্ড বাইনারি সামঞ্জস্য রয়েছে । এছাড়াও, এটি সেই গতিশীল কৌশল যা আমরা বলছিলাম!
জাভা রেকর্ডস ছাড়াও, ইনভোক ডায়নামিক এর মত বৈশিষ্ট্যগুলি প্রয়োগ করতে ব্যবহৃত হয়েছে:
LambdaMetafactory
StringConcatFactory
meth.invoke(args)
। সুতরাং কিভাবেinvokedynamic
ফিটmeth.invoke
?