কীভাবে চালিত এবং কীভাবে এটি ব্যবহার করব?


159

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

উত্তর:


165

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


3
দিনে দিনে জাভা প্রোগ্রামিংগুলিতে গতিশীলভাবে পদ্ধতিগুলি চাওয়ার জন্য প্রতিবিম্বটি ব্যবহার করা অস্বাভাবিক কিছু নয় meth.invoke(args)। সুতরাং কিভাবে invokedynamicফিট meth.invoke?
ডেভিড কে।

1
আমি যে ব্লগ পোস্টটির বিষয়ে কথা বলছি তা উল্লেখ করি MethodHandle, যা সত্যই একই ধরণের জিনিস তবে আরও নমনীয়তার সাথে। তবে এই সমস্ত ক্ষেত্রে আসল শক্তি জাভা ভাষার সংযোজন নয়, অভ্যন্তরীণভাবে আরও গতিশীল এমন অন্যান্য ভাষাগুলিকে সমর্থন করার ক্ষেত্রে নিজেই জেভিএমের সক্ষমতা।
আর্নেস্ট ফ্রাইডম্যান-পার্বত্য


1
দেখে মনে হয় যে জাভা 8 কিছু ল্যাম্বডাস অনুবাদ করে invokedynamicযা এটি ব্যবহার করে তোলে (একটি বেনামে অভ্যন্তরীণ-শ্রেণিতে তাদের জড়ানোর তুলনায় যা প্রবর্তনের আগে প্রায় একমাত্র পছন্দ ছিল invokedynamic)। সম্ভবত জেভিএম-এর শীর্ষে প্রচুর কার্যকরী প্রোগ্রামিং ভাষা অনন-অভ্যন্তর-শ্রেণীর পরিবর্তে এটিতে সংকলন করতে পছন্দ করবে।
নাদের ঘানবাড়ি

2
কেবলমাত্র একটি ছোট্ট সতর্কতা, ২০০৮ সালের ব্লগ পোস্টটি আশাহীনভাবে পুরানো এবং প্রকৃত প্রকাশের রাজ্যটিকে প্রতিফলিত করে না (২০১১)।
হলগার

9

কিছু সময় আগে, সি # একটি দুর্দান্ত বৈশিষ্ট্য যুক্ত করেছে, সি # এর মধ্যে ডায়নামিক সিনট্যাক্স

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তাদের প্রোগ্রামগুলিতে সুবিধা নেওয়ার কোনও সহজ উপায় তাদের কাছে নেই ।


41
invokedynamicজাভা প্রোগ্রামারদের জন্য ব্যবহার করার ইচ্ছা ছিল না । আইএমও এটি জাভা দর্শনে মোটেই ফিট করে না। এটি জাভা নন ভাষাগুলির জন্য একটি জেভিএম বৈশিষ্ট্য হিসাবে যুক্ত করা হয়েছিল।
মার্ক পিটারস

5
@ মার্ক কখনই কার উদ্দেশ্যে নয়? জাভা ভাষার খ্যাতিমান ব্যক্তিদের মধ্যে একটি পরিষ্কার শক্তির কাঠামো আছে বা এটি একটি ভাল সংজ্ঞায়িত সমষ্টিগত "উদ্দেশ্য" আছে এমনটি নয়। ভাষা দর্শনের ক্ষেত্রে - এটি বেশ সম্ভাব্য, নিল গিটার (বিশ্বাসঘাতক!) ব্যাখ্যা দেখুন: ইনকিউকিউ
স্ট্যাটিকালি-

3
@ মার্ক পিটারস: ইনভোকাডাইনামিক আসলে জাভা প্রোগ্রামারদের জন্যই কেবলমাত্র অ্যাক্সেসযোগ্য নয় intended এটি জাভা 8 এর বন্ধ হওয়ার ভিত্তি।
এম প্ল্যাটভয়েট

2
@ রিটারপটেবল: জেএসআর অবদানকারীদের দ্বারা কখনই উদ্দেশ্যযুক্ত নয়। এটি বলছে যে জেএসআরটির নাম "জাভা প্ল্যাটফর্মের ডায়নামিকালি টাইপড ল্যাঙ্গুয়েজগুলিকে সমর্থন করা"। জাভা কোনও গতিসম্পন্ন টাইপ করা ভাষা নয়।
মার্ক পিটার্স

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

4

চালিত দুটি চালিয়ে যাওয়ার আগে দুটি ধারণাগুলি বুঝতে হবে।

1. স্ট্যাটিক বনাম ডায়নামিন টাইপিং

স্থিতিশীল - সংকলন সময়ে প্রিফর্ম পরীক্ষা পরীক্ষা (যেমন জাভা)

গতিশীল - রানটাইমের সময় প্রকারের পরীক্ষা করা (যেমন জাভাস্ক্রিপ্ট)

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

২. শক্তিশালী বনাম দুর্বল টাইপিং

শক্তিশালী - এর ক্রিয়াকলাপগুলিতে সরবরাহ করা মানের ধরণের বিধিনিষেধ নির্দিষ্ট করে (যেমন জাভা)

দুর্বল - কোনও ক্রিয়াকলাপকে (ক্যাসেট) আর্গুমেন্টগুলি যদি কোনও যুক্তির সাথে বেমানান ধরনের থাকে (যেমন ভিজ্যুয়াল বেসিক)

জাভা একটি স্ট্যাটিক্যালি এবং দুর্বল টাইপযুক্ত তা জেনে আপনি কীভাবে জেভিএম-তে ডায়নামিকালি এবং শক্তভাবে টাইপ করা ভাষা প্রয়োগ করবেন?

ইনভোকডিনামিক একটি রানটাইম সিস্টেম প্রয়োগ করে যা কোনও পদ্ধতি বা ফাংশনের সর্বাধিক উপযুক্ত প্রয়োগ চয়ন করতে পারে - প্রোগ্রামটি সংকলনের পরে।

উদাহরণ: (a + b) থাকা এবং সংকলনের সময় a, b ভেরিয়েবল সম্পর্কে কিছু না জানা, চালনার সময় জাভাতে সবচেয়ে উপযুক্ত পদ্ধতিতে এই ক্রিয়াকলাপটি চালিত। উদাহরণস্বরূপ, যদি এটি a, b টি স্ট্রিংস দেখা দেয় তবে তারপরে কল পদ্ধতি (স্ট্রিং এ, স্ট্রিং বি)। এটিতে যদি দেখা যায় যে, বি ইনটগুলি হয়, তবে কল পদ্ধতি (ইন এ, ইনট বি)।

ইনভোকাডাইনামিক জাভা 7 এর সাথে চালু হয়েছিল।


4

আমার জাভা রেকর্ডস নিবন্ধের অংশ হিসাবে , আমি ইনোক ডায়নামিকের পিছনে অনুপ্রেরণা সম্পর্কে জোর দিয়েছি। আসুন শুরু করা যাক ইন্দির মোটামুটি সংজ্ঞা দিয়ে।

ইনডির পরিচয়

ডায়নামিক টাইভ ল্যাঙ্গুয়েজের জন্য জেভিএম সমর্থন বাড়ানোর উদ্দেশ্যে জেএসআর 292-এর অংশ ছিল ইনভোক ডায়নামিক ( ইন্ডি নামেও পরিচিত ) । জাভা in এ প্রথম প্রকাশের পরে, অপকোডটি তার লাগেজ সহ জেআরবির মতো গতিশীল জেভিএম-ভিত্তিক ভাষা ব্যবহার করে quiteinvokedynamicjava.lang.invoke

যদিও ইনডি বিশেষত গতিশীল ভাষার সমর্থন বাড়ানোর জন্য ডিজাইন করা হয়েছে, এটি এর চেয়ে অনেক বেশি প্রস্তাব দেয়। প্রকৃতপক্ষে, ডায়নামিক টাইপ অ্যাক্রোব্যাটিক্স থেকে গতিশীল কৌশলগুলি পর্যন্ত কোনও ভাষা ডিজাইনারের যে কোনও গতিশীলতার প্রয়োজন যেখানেই এটি উপযুক্ত!

উদাহরণস্বরূপ, জাভা 8 ল্যাম্বডা এক্সপ্রেশনগুলি বাস্তবে ব্যবহার করে প্রয়োগ করা হয় invokedynamic, যদিও জাভা একটি স্ট্যাটিকালি টাইপ করা ভাষা!

ব্যবহারকারী-সংজ্ঞায়িত বাইটকোড

বেশ কিছু সময়ের জন্য জেভিএম চারটি পদ্ধতি আহ্বান প্রকারের সমর্থন করেছিল: invokestaticস্ট্যাটিক পদ্ধতিগুলি invokeinterfaceকল করতে , ইন্টারফেসের পদ্ধতিগুলি invokespecialকল করতে, কনস্ট্রাক্টরকে কল করতে super()বা ব্যক্তিগত পদ্ধতিতে এবং invokevirtualউদাহরণ পদ্ধতিতে কল করতে।

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

ইন্ডি কীভাবে কাজ করে?

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

এখানে চিত্র বর্ণনা লিখুন

তারপরে বুটস্ট্র্যাপ পদ্ধতিটি একটি উদাহরণ দেয় java.lang.invoke.CallSite। এটি CallSiteপ্রকৃত পদ্ধতি, অর্থাত্ একটি রেফারেন্স ধারণ করে MethodHandle

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

উদাহরণ: জাভা 14 রেকর্ডস

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, আমাদের অ্যাপ্লিকেশন পুনঃসংশোধন ছাড়াই এই উন্নতির সুবিধা নিতে পারে। এইভাবে আমাদের কিছু ধরণের ফরওয়ার্ড বাইনারি সামঞ্জস্য রয়েছে । এছাড়াও, এটি সেই গতিশীল কৌশল যা আমরা বলছিলাম!

অন্যান্য উদাহরণ

জাভা রেকর্ডস ছাড়াও, ইনভোক ডায়নামিক এর মত বৈশিষ্ট্যগুলি প্রয়োগ করতে ব্যবহৃত হয়েছে:

  • জাভা 8+ এ ল্যাম্বদা এক্সপ্রেশন: LambdaMetafactory
  • জাভা 9+ এ স্ট্রিং কনটেনটেশন: StringConcatFactory
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.