জেভিএম কি টেল কল অপ্টিমাইজেশনকে আটকাতে পারে?


99

আমি এই প্রশ্নের এই উদ্ধৃতিটি দেখেছি: একটি ভাল কার্যকরী ভাষা কোনটির উপর একটি ওয়েব পরিষেবা তৈরি করতে হবে?

বিশেষত স্কেল স্ব-পুনরাবৃত্তি ফাংশন ব্যতীত টেল-কল অপসারণকে সমর্থন করে না, যা আপনি যে ধরনের রচনা করতে পারেন তা সীমাবদ্ধ করে (এটি জেভিএমের মৌলিক সীমাবদ্ধতা)।

এটা কি সত্য? যদি তা হয় তবে এই জেভিএম সম্পর্কে কী এটি এই মৌলিক সীমাবদ্ধতা তৈরি করে?

উত্তর:


74

এই পোস্ট: পুনরাবৃত্তি বা Iteration? সাহায্য করতে পারে.

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

সান বাগ # 4726340 তে আরও আলোচনা রয়েছে , যেখানে মূল্যায়ন (২০০২ থেকে) শেষ হয়:

আমি বিশ্বাস করি এটি তবুও করা যেতে পারে তবে এটি কোনও ছোট কাজ নয়।

বর্তমানে, দা ভিঞ্চি মেশিন প্রকল্পে কিছু কাজ চলছে । লেজ কল সাবপ্রজেক্টের স্থিতিটি "প্রোটো 80%" হিসাবে তালিকাভুক্ত; এটি জাভা 7 তে পরিণত করার সম্ভাবনা কম, তবে আমি মনে করি জাভা 8 এ এটির খুব ভাল সুযোগ রয়েছে।


আমি ব্যাখ্যাটি বেশ অনুসরণ করিনি follow আমি ভেবেছিলাম কম্পাইলার দ্বারা টেল-কল অপ্টিমাইজেশন প্রয়োগ করা হয়েছিল। ধরে নিই যে আপনার একটি ফাংশন রয়েছে যা সংকলক দ্বারা টেল-কল অনুকূলিত হতে পারে, আপনি তখন একটি সমতুল্য নন-रिकर्सিভ ফাংশন রাখতে পারেন যা লুপ ব্যবহার করে একই কার্যকারিতা কার্যকর করে? যদি তাই হয় তবে এটি সংকলক দ্বারা সম্পন্ন করা যায়নি। আমি জেভিএমের উপর নির্ভরতা অনুসরণ করতে সক্ষম নই। এটি কীভাবে এমন কোনও স্কিম সংকলকের সাথে তুলনা করবে যা দেশীয় i386 কোড উত্পন্ন করে?
গৌতম গণপতি

4
@ গৌতম: ডিবাগিং সম্পর্কে আমার বক্তব্যটি জেভিএম-তে লেজ কল নির্মূলের অভাবের জন্য ট্রামপোলিনকে কার্যকারণ হিসাবে ব্যবহার করার প্রসঙ্গে ছিল। টেইল কল এলিমিনেশন জেভিএম (আর্নল্ড শ্যাখোফার ওপেনজেডিকে করেছেন, এবং এলএলভিএম) তে প্রয়োগ করা যেতে পারে এবং এটি করা যায় কি না তা নিয়ে প্রশ্ন নেই। মাইক্রোসফ্টের সিএলআর অবশ্যই 10 বছর ধরে টেল কল নির্মূলাকে সমর্থন করেছে এবং এফ # এর প্রকাশটি প্রমাণ করেছে যে এটি গেম চেঞ্জার। আমি মনে করি উত্তরটি জেভিএম দীর্ঘদিন ধরে স্থবির হয়ে আছে।
জেডি

4
এটি একটি সাধারণ ভুল ধারণা এবং একটি পুনরাবৃত্তি অজুহাত, তবে ভুল। এটি বেশ কয়েক বছর ধরে সুপ্রতিষ্ঠিত হয়েছে যে স্ট্যাক পরিদর্শন দ্বারা সুরক্ষা (এবং দরকারী স্ট্যাকের চিহ্নগুলির বিধান) সঠিক লেজ কলগুলির সাথে সামঞ্জস্য নয়। উদাহরণস্বরূপ, 2004. থেকে এই কাগজ দেখতে citeseerx.ist.psu.edu/viewdoc/... , Downvoting যেমন উত্তরটি ভুল।
জাস্টিন শেহি

5
@ জাস্টিনসিহি: ভুল কী? প্রশ্নটি ছিল, "জেভিএম কি টেল কল অপ্টিমাইজেশনকে বাধা দেয়?" এবং উত্তরটি হ'ল "না, তবে এটি শক্ত।"
মাইকেল ময়র্স

5
আপনি কি জানেন যে জাভা 8 এ এটি অন্তর্ভুক্ত করা হয়েছে?
নাচোক্ক

27

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

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

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


5
Hence there is a very strong argument that Scala is not a real functional programming language - যুক্তিটি আসলে বেশ দুর্বল। নিশ্চিত tail calls [as] an essential feature, এবং অন্তর্নিহিত হার্ডওয়্যার (বা ভার্চুয়াল মেশিন) সরাসরি এটি সমর্থন করে যদি দুর্দান্ত। তবে এটি বাস্তবায়নের বিশদ।
ইনগো

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

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

7
@ ইঙ্গো: পারস্পরিক পুনরাবৃত্তি এবং ধারাবাহিকতা পাসিং স্টাইলের মতো ফাংশনাল প্রোগ্রামিংয়ের বেশ কয়েকটি আইডিয়ামের কাজ করতে লেজ কল বিলোপ প্রয়োজন। এটি ছাড়াই, আপনার প্রোগ্রামগুলি ওভারফ্লোতে স্ট্যাক করবে। যদি কোনও ভাষা বিশ্বস্ততার সাথে আইডিম্যাটিক ফাংশনাল কোডটি পরিচালনা করতে না পারে, তবে এটি কার্যকর? উত্তরটি আপনি রায় হিসাবে রায় রায়, কিন্তু বাস্তবে একটি গুরুত্বপূর্ণ পার্থক্য। মার্টিন ট্রোজার সবেমাত্র এই সম্পর্কে একটি আকর্ষণীয় ব্লগ পোস্ট প্রকাশ করেছেন: মার্টিনসপ্রোগ্রামিংব্লগ.ব্লগস্পট.কম
জেডি

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

22

স্কেলা ২.7.x চূড়ান্ত পদ্ধতি এবং স্থানীয় ফাংশনগুলির স্ব-পুনরাবৃত্তি (নিজেকে একটি ফাংশন কলিং) জন্য টেল-কল অপ্টিমাইজেশন সমর্থন করে।

ট্রাম্পোলিনের জন্য লাইব্রেরি সমর্থন নিয়ে স্কেলা ২.৮ আসতে পারে যা পারস্পরিক পুনরাবৃত্তি ফাংশনগুলি অনুকূল করে তোলার কৌশল।

স্কালার পুনরাবৃত্তি রাজ্য সম্পর্কে একটি ভাল চুক্তি রিচ ডগের্টির ব্লগে পাওয়া যাবে ।


আপনি কি দয়া করে বর্তমান স্কেলার স্থিতি সম্পর্কে প্রশ্ন আপডেট করতে পারবেন?
ওম-মনোনীত-

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

8

ল্যাম্বডা দ্য আলটিমেটে লিঙ্ক করা কাগজ ছাড়াও (উপরে পোস্ট করা লিংক মাইয়ার্স থেকে), সূর্যের জন রোজের কাছে লেজ কল অপ্টিমাইজেশান সম্পর্কে আরও কিছু বলার আছে।

http://blogs.oracle.com/jrose/entry/tail_calls_in_t__mm

শুনেছি এটি কোনও দিন জেভিএম-এ প্রয়োগ করা হতে পারে। অন্যান্য জিনিসগুলির মধ্যে টেইল কল সমর্থন দ্যা ভিঞ্চি মেশিনে নজর দেওয়া হচ্ছে।

http://openjdk.java.net/projects/MLvm/


0

সমস্ত উত্সগুলি জেভিএম লেজ পুনরাবৃত্তির ক্ষেত্রে অনুকূলকরণ করতে অক্ষম হওয়ার দিকে ইঙ্গিত করেছে, তবে জাভা পারফরম্যান্স টিউনিং পড়ার পরে (২০০৩, ওরিলি) আমি লেখককে দাবী করেছি যে লেজ পুনরাবৃত্তি বাস্তবায়নের মাধ্যমে তিনি বৃহত্তর পুনরাবৃত্তি কর্মক্ষমতা অর্জন করতে পারবেন।

আপনি তার দাবীটি 212 পৃষ্ঠায় খুঁজে পেতে পারেন ('পুনরাবৃত্তির জন্য অনুসন্ধান করুন' এটি দ্বিতীয় ফলাফল হওয়া উচিত)। শেষ ঘন্টা?


আইবিএম তাদের জেভিএম বাস্তবায়নে টিসিওর কিছু রূপকে সমর্থন করেছে (অপ্টিমাইজেশন হিসাবে, তাই কোনও গ্যারান্টি নেই)। সম্ভবত জাভা পারফরম্যান্স টিউনিংয়ের লেখকরা ভেবেছিলেন যে এই বৈশিষ্ট্যটি শেষ পর্যন্ত সমস্ত JVM দ্বারা প্রয়োগ করা হবে। আইবিএম.com
ডেভেলপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.