কেন এখনও জেভিএম টেল-কল অপ্টিমাইজেশন সমর্থন করে না?


95

জেভিএম-প্রতিরোধ-লেজ-কল-অপ্টিমাইজেশনের দুটি বছর পরে , মনে হচ্ছে এটি একটি প্রোটোটাইপ বাস্তবায়ন হয়েছে এবং এমএলভিএম এই বৈশিষ্ট্যটিকে কিছু সময়ের জন্য "প্রোটো 80%" হিসাবে তালিকাভুক্ত করেছে।

জেভিএম- তে উল্লিখিত টেল কলগুলিকে সমর্থন করার ক্ষেত্রে সান / ওরাকলের পক্ষ থেকে কোনও সক্রিয় আগ্রহ নেই বা লেজ কলগুলি কেবল "[...] প্রতিটি বৈশিষ্ট্য অগ্রাধিকার তালিকার দ্বিতীয় অবস্থানে আসতে ভীত [...]" ভাষা সম্মেলন ?

আমি যদি সত্যিই আগ্রহী যে কেউ যদি এমএলভিএম বিল্ড পরীক্ষা করে দেখে এবং এটি কতটা ভাল কাজ করে তার কিছু ছাপ ভাগ করে নিতে পারে (যদি আদৌ))

আপডেট: নোট করুন যে কিছু ভিএম যেমন অ্যাভিয়ান কোনও সমস্যা ছাড়াই যথাযথ টেল-কল সমর্থন করে।


14
ওরাকল থেকে সূর্যের মানুষের রিপোর্ট প্রস্থান, আমি আশা করবেন যে কোন বর্তমান প্রকল্পের অবিরত যদি না স্পষ্টভাবে তাই ওরাকল থেকে :( বলেন
Thorbjørn Ravn অ্যান্ডারসনকে

16
মনে রাখবেন যে আপনার গৃহীত উত্তর সম্পূর্ণ ভুল। টেল কল অপ্টিমাইজেশন এবং ওওপি এবং অবশ্যই, ওসিএএমএল এবং এফ # এর মতো বেশ কয়েকটি ভাষার ওওপি এবং টিসিও উভয়ের মধ্যে কোনও মৌলিক বিরোধ নেই।
জেডি

4
ঠিক আছে, ওসিএএমএল এবং এফ # ওওপি ভাষাগুলি কল করা প্রথমে খারাপ রসিকতা। তবে হ্যাঁ, ওওপি এবং টিসিও তেমন মিল নেই, রানটাইমটি যাচাই করতে হবে যে পদ্ধতিটি অপ্টিমাইজ করা হচ্ছে অন্য কোথাও ওভাররাইড / সাবক্ল্যাসেড নয়।
SOC

5
+1 একটি সি ব্যাকগ্রাউন্ড থেকে এসে আমি সর্বদা ধরে নিয়েছিলাম যে কোনও আধুনিক জেভিএম-তে টিসিও দেওয়া হয়েছিল a আমার কাছে আসলে চেক করার মতো ঘটনা কখনই ঘটেনি এবং যখন আমি ফলাফলগুলি অবাক
করেছিলাম

4
@ এসোক: "রানটাইমটি যাচাই করতে হবে যে পদ্ধতিটি অপ্টিমাইজ করা হচ্ছে অন্য কোথাও ওভাররাইড / সাবক্ল্যাসেড নয় তা ব্যতীত"। আপনার "সত্য" সম্পূর্ণ বোকা।
জেডি

উত্তর:


33

জাভা কোড নির্ণয়: আপনার জাভা কোড ( Alt ) এর পারফরম্যান্স উন্নতি করে JVM লেজ-কল অপ্টিমাইজেশন সমর্থন করে না কেন তা ব্যাখ্যা করে।

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

এটি তখন জাভা কোডের একটি উদাহরণ দেয় যা রূপান্তরিত হয় না।

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

তারপরে এটি একটি পরীক্ষা দেয় যা আপনি আপনার জেআইটি এটি করে কিনা তা নির্ধারণের জন্য ব্যবহার করতে পারেন।

স্বাভাবিকভাবেই, যেহেতু এটি একটি আইবিএম কাগজ তাই এটিতে একটি প্লাগ অন্তর্ভুক্ত রয়েছে:

আমি জাভা এসডিকে দু'একটি নিয়ে এই প্রোগ্রামটি চালিয়েছি, এবং ফলাফলগুলি অবাক করে দিয়েছে। সংস্করণ ১.৩-র জন্য সান হটস্পট জেভিএম-এ চালনা প্রকাশ করে যে হটস্পট রূপান্তর সম্পাদন করে না। ডিফল্ট সেটিংসে, স্ট্যাকের জায়গাটি আমার মেশিনে এক সেকেন্ডেরও কম সময়ে শেষ হয়ে গেছে। অন্যদিকে, আইবিএম এর জেভিএম সংস্করণ 1.3 পুরের জন্য কোনও সমস্যা ছাড়াই ইঙ্গিত করে যে এটি কোডটি এইভাবে রূপান্তরিত করে।


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

4
"অবশ্যই একটি জেআইটি সংকলক দ্বারা গতিশীলভাবে করা উচিত" যার অর্থ এটি জাভা সংকলক না হয়ে নিজেই জেভিএম দ্বারা করা উচিত। তবে ওপি জেভিএম সম্পর্কে জিজ্ঞাসা করছে।
রায়েডওয়াল্ড

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

5
উদ্ধৃত নিবন্ধটির লিঙ্কটি এখন ভেঙে গেছে, যদিও গুগল এটি ক্যাশে করেছে। আরও বড় কথা, লেখকের যুক্তি ত্রুটিপূর্ণ। দৃষ্টান্ত স্থাপন করতে পারে লেজ কলে-অপ্টিমাইজ স্ট্যাটিক ব্যবহার করে এবং হতে না শুধু গতিশীল সংকলন, যদি শুধুমাত্র কম্পাইলার একটি সন্নিবেশিত instanceofকিনা তা আপনার পরীক্ষা thisএকটি হল Exampleবস্তু (বদলে একটি উপশ্রেণী Example)।
অ্যালেক্স


30

জাভাতে টিসিও বাস্তবায়ন না করার জন্য আমি অতীতে দেখেছি (এবং এটি কঠিন হিসাবে দেখা হচ্ছে) হ'ল জেভিএমের অনুমতি মডেলটি স্ট্যাক-সংবেদনশীল এবং সুতরাং টেল-কলগুলি অবশ্যই সুরক্ষা দিকগুলি পরিচালনা করতে পারে।

আমি বিশ্বাস করি এটি ক্লিমেটস এবং ফেলেলিসেন [1] [2] দ্বারা কোনও বাধা না হিসাবে দেখানো হয়েছিল এবং আমি নিশ্চিত যে প্রশ্নে উল্লিখিত এমএলভিএম প্যাচটিও এর সাথে সম্পর্কিত হয়েছে।

আমি বুঝতে পারি এটি আপনার প্রশ্নের উত্তর দেয় না; শুধু আকর্ষণীয় তথ্য যুক্ত।

  1. http://www.ccs.neu.edu/scheme/pubs/esop2003-cf.pdf
  2. http://www.ccs.neu.edu/scheme/pubs/cf-toplas04.pdf

4
+1 ব্রায়ান গয়েটজ youtube.com/watch?v=2y5Pv4yN0b0&t=3739
এমকুলিভ

15

সম্ভবত আপনি এটি ইতিমধ্যে জানেন, তবে জাভা ভাষা প্রকৃতপক্ষে প্রোগ্রামারটির কাছে স্ট্যাকের ট্রেস উন্মোচিত করার পরে বৈশিষ্ট্যটি ততটা তুচ্ছ নয়।

নিম্নলিখিত প্রোগ্রাম বিবেচনা করুন:

public class Test {

    public static String f() {
        String s = Math.random() > .5 ? f() : g();
        return s;
    }

    public static String g() {
        if (Math.random() > .9) {
            StackTraceElement[] ste = new Throwable().getStackTrace();
            return ste[ste.length / 2].getMethodName();
        }
        return f();
    }

    public static void main(String[] args) {
        System.out.println(f());
    }
}

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

মূলত, এর অর্থ এটি পশ্চাতে সামঞ্জস্যপূর্ণ থাকা অবস্থায় এটি সমর্থন করা শক্ত।


17
আপনার চিন্তায় ভুলটি খুঁজে পেয়েছে: "প্রোগ্রামটির শব্দার্থবিজ্ঞানগুলি এর উপর নির্ভর করে যেহেতু পুরো কল-স্ট্যাকটি বইয়ের রাখার প্রয়োজন"। :-) এটি নতুন "চাপা ব্যতিক্রমগুলি" এর মতো। এই জাতীয় বিষয়ের উপর নির্ভরশীল প্রোগ্রামগুলি ভাঙ্গতে বাধ্য। আমার মতে প্রোগ্রামটির আচরণটি একেবারে সঠিক: স্ট্যাক ফ্রেমগুলি ছুঁড়ে ফেলাটাই হ'ল লেজ কলগুলি thing
Soc

4
@ মারকো, তবে যে কোনও পদ্ধতিই ব্যতিক্রম ছুঁড়ে ফেলতে পারে, যা থেকে পুরো কল-স্ট্যাকটি উপলভ্য হতে বাধ্য, তাই না? এছাড়াও, আপনি আগে থেকে সিদ্ধান্ত নিতে পারবেন না যে পদ্ধতিগুলি অপ্রত্যক্ষভাবে gএই ক্ষেত্রে কল করবে ... উদাহরণস্বরূপ বহুরূপী এবং প্রতিবিম্ব সম্পর্কে চিন্তা করুন।
আইয়ুব

4
এটি জাভা AR. এ আরএম সংযোজনের কারণে সৃষ্ট একটি পার্শ্ব-প্রতিক্রিয়া It এটি একটি উদাহরণ যা আপনি উপরে দেখিয়েছেন এমন জিনিসের উপর নির্ভর করতে পারবেন না।
এসএসপি

6
"যে ভাষা কল-স্ট্যাকের বহিঃপ্রকাশ ঘটায় তা বাস্তবায়ন করা শক্ত করে তোলে": ভাষাটির কি প্রয়োজন হয় যে স্ট্যাক-ট্রেসটি getStackTrace()এমন কোনও পদ্ধতি থেকে ফিরে আসে x()যে উত্স কোডটি দেখায় এমন একটি পদ্ধতি y()থেকেও x()বলা হয় যে y()কোথা থেকে ডাকা হয়েছিল ? কিছুটা স্বাধীনতা থাকলে সত্যিকারের সমস্যা নেই।
রায়েডওয়াল্ড

8
এটি কেবল একটি একক পদ্ধতির বৈশিষ্ট্যের কথাই বলার বিষয়, "আপনাকে সমস্ত স্ট্যাক ফ্রেম দেয়" থেকে "আপনাকে সমস্ত সক্রিয় স্ট্যাকফ্রেম দেয়, পুচ্ছ কল দ্বারা অচলিত এগুলি ছেড়ে"। তদ্ব্যতীত, কেউ এটিকে কমান্ড লাইন সুইচ বা টেল-কলকে সম্মানিত করা হয় কিনা এমন কোনও সিস্টেম সম্পত্তি তৈরি করতে পারে।
ইনগো

12

জাভা অন্তত কার্মিক ভাষা আপনি সম্ভবত কল্পনা করতে পারে (অবশ্য ঠিক আছে, হয় সম্ভবত না !) কিন্তু এই JVM ভাষার মত একটি মহান সুবিধা হবে Scala , যা।

আমার পর্যবেক্ষণগুলি হ'ল জেভিএমকে অন্যান্য ভাষার জন্য প্ল্যাটফর্ম তৈরি করা কখনই সান এর অগ্রাধিকার তালিকার শীর্ষে বলে মনে হয় নি এবং আমার ধারণা, এখন ওরাকলের পক্ষে for


16
@ থরবজর্ন - আমি প্রদত্ত একটি প্রোগ্রাম সীমাবদ্ধ পরিমাণে থামবে কিনা তা অনুমান করার জন্য একটি প্রোগ্রাম লিখেছিলাম। আমার বয়স হয়েছিল !
অক্সবো_লেকস 11

4
আমি ব্যবহৃত প্রথম বেসিকগুলিতে ফাংশন ছিল না, বরং গুসব এবং রিটার্ন করুন। আমি মনে করি না যে ললকোডি খুব কার্যকরী, হয় (এবং আপনি এটি দুটি বুদ্ধিতে নিতে পারেন)।
ডেভিড থর্নলি

4
@ ডেভিড, ক্রিয়ামূলক! = এর কার্যকারিতা রয়েছে
থরবজর্ন রাভন অ্যান্ডারসন

4
@ থরবজর্ন রাভন অ্যান্ডারসন: না, তবে এটি পূর্বশর্তের মতো, আপনি কি বলবেন না?
ডেভিড থর্নলি

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