কেন সি # সংকলক এই নেস্টেড লিংক কোয়েরিতে পাগল হবে?


97

নিম্নলিখিত কোডটি সংকলন করার চেষ্টা করুন এবং আপনি দেখতে পাবেন যে সংকলকটি> 3 গিগাবাইট র‌্যাম (আমার মেশিনে সমস্ত নিখরচায় মেমরি) এবং সংকলন করতে খুব দীর্ঘ সময় (আসলে আমি 10 মিনিটের পরে আইও ব্যতিক্রম পাই)।

using System;
using System.Linq;

public class Test
{
    public static void Main()
    {
        Enumerable.Range(0, 1).Sum(a =>
        Enumerable.Range(0, 1).Sum(b =>
        Enumerable.Range(0, 1).Sum(c =>
        Enumerable.Range(0, 1).Sum(d =>
        Enumerable.Range(0, 1).Sum(e =>
        Enumerable.Range(0, 1).Sum(f =>
        Enumerable.Range(0, 1).Count(g => true)))))));
    }
}

কেউ কি এই কৌতূহলী আচরণ ব্যাখ্যা করতে পারেন?

সিএস সংস্করণ: মাইক্রোসফ্ট (আর) ভিজ্যুয়াল সি # সংকলক সংস্করণ 4.0.30319.17929
ওএস নাম: মাইক্রোসফ্ট উইন্ডোজ 7 আলটিমেট
ওএস সংস্করণ: 6.1.7601 পরিষেবা প্যাক 1 বিল্ড 7601

স্মৃতি এর ব্যবহার


4
ভাল কল! আমি কোডটি ভিজ্যুয়াল স্টুডিওতে আটকিয়েছি এবং এটি সমস্ত 4 জিবি গ্রাস করেছে যে 32-বিট প্রক্রিয়াটি অনুমোদিত এবং তারপরে ক্র্যাশ হয়ে গেছে (উইন্ডোজ 8.1 এ 2013 এর চূড়ান্ত)।
সাতনহক

4
এই কোডটি একটি ভাগ করা কোড-বেসে যুক্ত করুন (নোটপ্যাড ব্যবহার করে) এবং আপনার সহকর্মীদের মেশিনগুলির ক্র্যাশ দেখুন।
usr

4
মাইক্রোসফ্ট কানেক্টে রিপোর্ট করা ভাল জিনিস এবং রোজলিন দলের কাছে মনে হয় যদি তাদের সংকলক একই আচরণ প্রদর্শন করে।
ট্রিলিয়ান

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

4
ভাল হয়েছে, এটিকে ছাঁটাই করুন এবং এর জন্য আপনার একটি দুর্দান্ত উত্তর থাকতে পারে: আপনার প্রিয় সংকলকটি ক্র্যাশ করুন
নাথান কুপার

উত্তর:


40

আমি বিশ্বাস করি যে এটি ওভারলোড রেজোলিউশনের সাথে মিলিয়ে টাইপ ইনফারেন্স এবং / অথবা ল্যাম্বদা প্রজন্মের সাথে (যখন টাইপ অনুক্রমটি স্বাভাবিকের বিপরীত দিকে যেতে হয়)। দুর্ভাগ্যক্রমে, কেবলমাত্র পরামিতি সরবরাহ করার ফলে পরিস্থিতি কোনওভাবেই সহায়তা করে না (যেখানে সম্ভবত এটি এখনও টাইপ চেকিং করতে হবে)।

লাম্বদাস বিশ্লেষণ করার পরে নিম্নলিখিত কোডটি যা যৌক্তিকভাবে আপনার কাছ থেকে সমতুল্য কোড হওয়া উচিত, তা ইস্যু ছাড়াই সংকলন করছে:

static void Main()
{
    var x = Enumerable.Range(0, 1).Sum(a);
}

private static int a(int a)
{
    return Enumerable.Range(0, 1).Sum(b);
}
private static int b(int b)
{
    return Enumerable.Range(0, 1).Sum(c);
}
private static int c(int c)
{
    return Enumerable.Range(0, 1).Sum(d);
}
private static int d(int d)
{
    return Enumerable.Range(0, 1).Sum(e);
}
private static int e(int e)
{
    return Enumerable.Range(0, 1).Sum(f);
}
private static int f(int f)
{
    return Enumerable.Range(0, 1).Count(g);
}
private static bool g(int g)
{
    return true;
}

আমি বিশ্বাস করি যে এরিক লিপার্ট সি # সংকলকের এমন একটি স্থানের আগে এই ধরণের অনুমিতি পোস্ট করেছেন যেখানে (কিছু সমস্যা) কমপ্লেয়ারকে এনপি-সম্পূর্ণ সমস্যা সমাধানের চেষ্টা করতে বাধ্য করতে পারে এবং এর একমাত্র আসল কৌশল (যেমন এখানে) নিষ্ঠুর শক্তি। যদি আমি প্রাসঙ্গিক তথ্যগুলি খুঁজে পেতে পারি তবে আমি সেগুলি এখানে যুক্ত করব।


আমি খুঁজে পাচ্ছি সেরা রেফারেন্সটি এখানে যেখানে এরিকের এটি ওভারলোড রেজোলিউশন কাজ যা আসল ব্যয়ের কারণ হিসাবে বিবেচনা করছে - মনে রাখবেন, এনুমারবেল S সামের 10 টি ওভারলোড রয়েছে যা একটি ল্যাম্বদা / পদ্ধতি গ্রহণ করে।


4
সুতরাং, মূলত, সংকলক 10^nসংমিশ্রণগুলির মাধ্যমে তার পথকে আঘাত করে (যেখানে nশৃঙ্খলিত পদ্ধতিগুলির পরিমাণ)। যুক্তিসঙ্গত বলে মনে হচ্ছে (এটি ব্যাখ্যা হিসাবে)।
ডার্ক ওয়ান্ডারার

4
@ ডার্ক ওয়ান্ডারার:that^numberofpossibletypes
লিপি

@ ড্যামিয়েন_সে_ অবিশ্বাসী, আমি আপনার চিন্তাভাবনাটি বুঝতে পেরেছি, সত্যই যুক্তিসঙ্গত হতে পারছি (কোডটি সংকলন করার উপায় নয় )
ইউজিন ডি গুবেনকভ

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

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