কেন জাভাতে টেল-পুনর্বিবেচনার জন্য মোটেই অপ্টিমাইজেশন নেই?


92

আমি যা পড়েছি তা থেকে: কারণটি হ'ল আমাদের উত্তরাধিকার হিসাবে কোন পদ্ধতিটি আসলে বলা হবে তা নির্ধারণ করা সহজ নয়।

তবে, জাভা কেন কমপক্ষে স্থির পদ্ধতিগুলির জন্য লেজ-পুনরাবৃত্তি অপ্টিমাইজেশন এবং সংকলকটির সাথে স্থির পদ্ধতিগুলি কল করার উপযুক্ত উপায় প্রয়োগ করে না?

পুচ্ছ-পুনরাবৃত্তির জন্য জাভার কোনও সমর্থন নেই কেন?

এখানে মোটেও কোনও অসুবিধা আছে কিনা তা আমি নিশ্চিত নই।


সংক্রান্ত প্রস্তাব ডুপ্লিকেট , যেমন দ্বারা ব্যাখ্যা Jörg ডব্লিউ Mittag 1 :

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

তৈরি করা পয়েন্টগুলি কল করার জন্য 1 ফর্ম্যাট করা।


26
এরিক লিপার্টের উদ্ধৃতি দিতে : "বৈশিষ্ট্যগুলি সস্তা নয়; এগুলি অত্যন্ত ব্যয়বহুল এবং তাদের কেবল নিজের ব্যয়কে ন্যায়সঙ্গত করা উচিত নয়, তাদের অবশ্যই বাজেটের সাথে আমরা যে শত শত বৈশিষ্ট্যগুলি করতে পারতাম সেগুলি না করার সুযোগ ব্যয়কে ন্যায্যতা দিতে হবে।" জাভা সি / সি ++ বিকাশকারীদের কাছে আবেদন করার জন্য অংশে নকশা করা হয়েছিল এবং সেই ভাষাগুলিতে লেজ পুনরাবৃত্তি অপ্টিমাইজেশনের গ্যারান্টিযুক্ত নয়।
ডোভাল

5
আমি ভুল হলে আমাকে সংশোধন করুন, তবে এরিক লিপার্ট কি সি # এর ডিজাইনার যার লেজ পুনরাবৃত্তি অপ্টিমাইজেশন রয়েছে?
অবহিত

1
তিনি সি # সংকলক দলে আছেন, হ্যাঁ।
ডোভাল

10
আমি যা বুঝতে পেরেছি তা থেকে জেআইটি এটি করতে পারে , যদি কিছু শর্ত পূরণ হয় , হতে পারে। সুতরাং অনুশীলনে আপনি এটির উপর নির্ভর করতে পারবেন না। তবে সি # করুক বা না থাকুক তা এরিকের পয়েন্টের সাথে নিরবচ্ছিন্ন।
ডোভাল

4
@ ইন্সট্রাক্টেডএ আপনি যদি আরও গভীর খনন করেন তবে আপনি দেখতে পাবেন যে এটি 32-বিট জেআইটি সংকলকটিতে কখনও হয় নি। -৪-বিট জেআইটি বিভিন্নভাবে নতুন এবং স্মার্ট s এমনকি আরও নতুন পরীক্ষামূলক সংকলক (32 এবং 64-বিটের জন্য উভয়ই) এখনও স্মার্ট, এবং আইএল-তে লেজ-পুনরাবৃত্তি অপ্টিমাইজেশানকে সমর্থন করবে যা স্পষ্টভাবে এটির জন্য জিজ্ঞাসা করে না। আপনার আরেকটি বিষয় বিবেচনায় নিতে হবে - জেআইটি সংকলকদের খুব বেশি সময় নেই। তারা গতির জন্য ভারীভাবে অনুকূলিত হয়েছে - অ্যাপ্লিকেশন যাতে সি ++ এ সংকলন করতে কয়েক ঘন্টা সময় লাগতে পারে তারপরেও বেশিরভাগ (কমপক্ষে আংশিকভাবে) কয়েক শতাধিক এমএসে আইএল থেকে নেটিভ যেতে হবে।
লুয়ান

উত্তর:


132

যেমনটি এই ভিডিওতে ব্রায়ান গয়েটজ (ওরাকলে জাভা ল্যাঙ্গুয়েজ আর্কিটেক্ট) দ্বারা ব্যাখ্যা করেছেন :

jdk ক্লাসে [...] সুরক্ষা সংবেদনশীল অনেকগুলি পদ্ধতি রয়েছে যেগুলি jdk লাইব্রেরি কোড এবং কলিং কোডের মধ্যে স্ট্যাক ফ্রেমগুলি গণ্য করার উপর নির্ভর করে যে তাদের কল দিচ্ছে তা নির্ধারণ করতে।

স্ট্যাকের ফ্রেমের সংখ্যা পরিবর্তন করা যে কোনও কিছু এটি ভেঙে দেয় এবং ত্রুটির কারণ হতে পারে। তিনি স্বীকার করেছেন যে এটি একটি নির্বোধ কারণ এবং তাই জেডিকে বিকাশকারীরা এই প্রক্রিয়াটি প্রতিস্থাপন করেছেন।

তিনি আরও উল্লেখ করেছিলেন যে এটি কোনও অগ্রাধিকার নয়, তবে এই লেজ পুনরাবৃত্তি

শেষ পর্যন্ত করা হবে।

এনবি এটি হটস্পট এবং ওপেনজেডিকে প্রযোজ্য, অন্যান্য ভিএম আলাদা হতে পারে।


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

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

2
আপনি বা এখানকার অন্য কেউ গভীর খোঁড়াখুঁড়ি করতে এবং সেই "সুরক্ষা সংবেদনশীল পদ্ধতি" কী তা সুনির্দিষ্টভাবে সরবরাহ করতে পারলে আমাদের পক্ষে এটি আরও ভাল। ধন্যবাদ!
অবগত

3
@InstructedA - দেখুন securingjava.com/chapter-three/chapter-three-6.html যার কিভাবে জাভা নিরাপত্তা পরিচালক ব্যবস্থার জাভা 2. মুক্তির প্রায় কাজ একটি বিস্তারিত বিবরণ রয়েছে
জুলে

3
একটি কাজের সমাধান অন্য জেভিএম ভাষা ব্যবহার করা। উদাহরণস্বরূপ, স্কালা রানটাইম নয়, সংকলকটিতে এটি করে।
জেমস মুর

24

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

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


36
এই উত্তরটি ঠিক মনে হচ্ছে না। লেজ পুনরাবৃত্তি কঠোরভাবে প্রয়োজন হয় না, কারণ এটি কার্যকর হবে না। পুনরাবৃত্ত সমাধানগুলি পুনরাবৃত্তির তুলনায় বোঝার জন্য প্রায়শই সহজ, তবে লেজ কলগুলির অভাব মানে পুনরাবৃত্তির অ্যালগোরিদমগুলি বড় সমস্যার আকারের জন্য ভুল হয়ে যায় যা স্ট্যাকটি ফুঁ দিয়ে উঠবে। এটি নির্ভুলতা সম্পর্কে, পারফরম্যান্স নয় (সরলতার জন্য ব্যবসায়ের গতি প্রায়শই এর জন্য মূল্যবান)। সঠিক উত্তর নোট হিসাবে, লেজ কলগুলির অভাব স্ট্যাকের চিহ্নগুলিতে নির্ভর একটি অদ্ভুত সুরক্ষা মডেলের কারণে, অপরিহার্য গোঁড়ামির প্রতি নয়।
আমন

4
@ এমন জেমস গোসলিং একবার বলেছিলেন যে যদি একাধিক লোক এটির অনুরোধ না করে তবে তিনি জাভাতে কোনও বৈশিষ্ট্য যুক্ত করবেন না , তবেই তিনি এটি বিবেচনা করবেন । সুতরাং উত্তরের অংশটি যদি সত্যিই "আপনি সর্বদা একটি forলুপ ব্যবহার করতে পারতেন " (এবং একইভাবে প্রথম শ্রেণীর ফাংশন বনাম অবজেক্টের জন্য) হত তবে আমি অবাক হব না । আমি এটিকে "অপরিহার্য ধর্মান্ধতা" বলা যতদূর যেতে পারব না তবে আমি মনে করি না 1995 সালে এটি জাভা-র গতি এবং জেনেরিকের অভাবের কারণে সম্ভবত এটির খুব বেশি চাহিদা ছিল।
ডোভাল

7
@ আমন, একটি সুরক্ষা মডেল টিসিওকে প্রাক-বিদ্যমান ভাষার সাথে যুক্ত না করার বৈধ কারণ হিসাবে আমাকে আঘাত করে, তবে এটি প্রথমে ভাষায় ডিজাইন না করার একটি দুর্বল কারণ। লোকচক্ষুর অন্তর্ভুক্ত বৈশিষ্ট্যটি অন্তর্ভুক্ত করতে আপনি কোনও বড় প্রোগ্রামার-দৃশ্যমান বৈশিষ্ট্যটি ছুঁড়ে ফেলবেন না। "জাভা ৮ টিতে টিসিও নেই কেন" "জাভা ১.০ টি টিসিও কেন নেই?" এর চেয়ে খুব আলাদা প্রশ্ন? আমি উত্তর উত্তর ছিল।
কার্ল বিলেফেল্ট 16

3
@ রুং, আপনি যে কোনও পুনরাবৃত্ত ফাংশনকে পুনরাবৃত্ত করতে পারেন। (আমি, আমি একটি উদাহরণ লিখেছি পারে এখানে )
Alain

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

5

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

এটি দেখতে সামাজিক (এবং সম্ভবত প্রযুক্তিগত) কারণে মনে হচ্ছে, জেভিএম-তে একটি নতুন বাইকোড অপারেশন যুক্ত করা (যা এটিকে জেভিএমের পূর্ববর্তী সংস্করণগুলির সাথে সঙ্গতিপূর্ণ করবে না) জেভিএম স্পেকের মালিকের পক্ষে মারাত্মকভাবে কঠিন।

জেভিএম বৈশিষ্ট্যে একটি নতুন বাইকোড না যুক্ত করার প্রযুক্তিগত কারণগুলির মধ্যে বাস্তব জীবনের জেভিএম বাস্তবায়নগুলি অত্যন্ত জটিল সফ্টওয়্যার টুকরা অন্তর্ভুক্ত রয়েছে (যেমন এটি অনেকগুলি জেআইটি অপ্টিমাইজেশনের কারণে করছে) of

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


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

1
@ জার্গডব্লিউমিত্যাগ: এটি সত্য, তবে আমি ভাবছি যে এটি সত্যিই সত্য যে জাভা প্রোগ্রামিং ভাষার সঠিক লেজ কল নেই। এটা রাষ্ট্র যে জাভা প্রোগ্রামিং ভাষা নয় আরো সঠিক হতে পারে আছে সঠিক লেজ কল আছে বৈশিষ্ট এটা ম্যান্ডেট যে কিছুই হবে। (এটি: আমি নিশ্চিত নই যে
অনুমানের কোনও

4

টেল কল করার জন্য কোনও ভাষার একটি বিশেষ সিনট্যাক্স না থাকলে (পুনরাবৃত্ত বা অন্যথায়) এবং একটি সংকলক যখন টেইল কল অনুরোধ করা হয় তবে উত্পন্ন করা যায় না, "alচ্ছিক" লেজ-কল বা পুচ্ছ-পুনরাবৃত্তি অপ্টিমাইজেশান এমন পরিস্থিতি তৈরি করে যেখানে কোনও অংশ কোডের জন্য একটি মেশিনে 100 বাইটের কম স্ট্যাকের প্রয়োজন হতে পারে তবে অন্যটিতে স্ট্যাকের 100,000,000 বাইটেরও বেশি হতে পারে। এই ধরনের একটি পৃথক নিছক পরিমাণগত চেয়ে গুণগত বিবেচনা করা উচিত।

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


2

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

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