ডিজাইনের সময় ভ্যারিয়েবলের ঘোষিত ঘোষিত ভেরিয়েবলের প্রকারটি আমি নির্ভরযোগ্যভাবে কীভাবে নির্ধারণ করতে পারি?


109

আমি ইমাসে সি # এর জন্য একটি সমাপ্তি (ইন্টেলিজেন্স) সুবিধা নিয়ে কাজ করছি।

ধারণাটিটি হ'ল, যদি কোনও ব্যবহারকারী কোনও খণ্ড টাইপ করেন, তবে নির্দিষ্ট কীস্ট্রোকের সংমিশ্রণের মাধ্যমে সমাপ্তির জন্য জিজ্ঞাসা করেন, সমাপ্তির সুযোগটি সম্ভাব্য পরিপূর্ণতা নির্ধারণের জন্য .NET প্রতিবিম্ব ব্যবহার করবে।

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

শব্দার্থক ব্যবহার করে, ইমাসে উপলব্ধ একটি কোড লেক্সার / পার্সার প্যাকেজ, আমি পরিবর্তনশীল ঘোষণা এবং তাদের প্রকারগুলি সনাক্ত করতে পারি। প্রদত্ত পদ্ধতিতে এবং ধরণের বৈশিষ্ট্যগুলি পেতে প্রতিবিম্বটি ব্যবহার করা সহজ, এবং তারপরে ব্যবহারকারীদের কাছে বিকল্পগুলির তালিকা উপস্থাপন করুন। (ঠিক আছে, পুরোপুরি সহজবোধ্য করতে মধ্যে Emacs কিন্তু ব্যবহার Emacs ভিতরে PowerShell প্রক্রিয়া চালানোর জন্য ক্ষমতা , এটা অনেক সহজ হয়ে যায়। আমি একটি কাস্টম .NET সমাবেশ elisp লিখতে প্রতিফলন করতে হবে, PowerShell সেটিকে লোড, এবং তারপর মধ্যে চলমান ইমাকস কমেন্টের মাধ্যমে পাওয়ারশেলগুলিতে কমান্ড পাঠাতে এবং প্রতিক্রিয়াগুলি পড়তে পারে। ফলস্বরূপ ইমাসগুলি প্রতিবিম্বের ফলাফলগুলি দ্রুত পেতে পারে get)

কোডটি যখন varজিনিসটি সম্পন্ন হচ্ছে ঘোষণায় ব্যবহার করে তখন সমস্যাটি উপস্থিত হয় । তার মানে ধরণটি স্পষ্টভাবে নির্দিষ্ট করা হয়নি, এবং সমাপ্তি কাজ করবে না।

varকীওয়ার্ডের সাথে ভেরিয়েবল ঘোষিত হলে আমি কীভাবে নির্ভরযোগ্যভাবে ব্যবহৃত প্রকৃত প্রকারটি নির্ধারণ করতে পারি ? কেবল পরিষ্কার করে বলার জন্য, রানটাইমে এটি নির্ধারণ করার দরকার নেই। আমি এটি "ডিজাইনের সময়" এ নির্ধারণ করতে চাই।

এখন পর্যন্ত আমার এই ধারণাগুলি রয়েছে:

  1. সংকলন এবং প্রার্থনা:
    • ঘোষণাপত্রের বিবৃতিটি বের করুন, যেমন eg var foo = "একটি স্ট্রিংয়ের মান"; ``
    • statement foo.GetType (); `একটি বিবৃতি যুক্ত করুন`
    • পরিবর্তনশীল ফলাফল # সি খণ্ড এটি নতুন সমাবেশে কম্পাইল করুন
    • অ্যাসেমব্লিকে নতুন অ্যাপডোমেনে লোড করুন, ফ্রেমমেন্টটি চালান এবং রিটার্নের ধরণটি পান।
    • সমাবেশ আনলোড এবং বাতিল

    আমি জানি কীভাবে এই সব করা যায়। তবে সম্পাদকীয়তে প্রতিটি সমাপ্তির অনুরোধের জন্য এটি দুর্দান্তভাবে ভারী ওজনের বলে মনে হচ্ছে।

    আমি মনে করি প্রতিবার নতুন অ্যাপডোমেনের দরকার নেই। আমি একাধিক অস্থায়ী সমাবেশগুলির জন্য একটি একক অ্যাপডোমেন পুনরায় ব্যবহার করতে পারি এবং একাধিক সমাপ্তির অনুরোধগুলি জুড়ে এটি স্থাপন এবং ছিঁড়ে ফেলার ব্যয়কে আমরাইজ করতে পারি। এটি মৌলিক ধারণাটির আরও একটি টুইট।

  2. সংকলন এবং IL পরিদর্শন

    সংকলক দ্বারা অনুমান করা হয়েছে এমন প্রকৃত ধরণটি নির্ধারণ করতে কেবল ঘোষণাটিকে একটি মডিউলে সংকলন করুন এবং তারপরে আইএল পরিদর্শন করুন। এটি কীভাবে সম্ভব হবে? আইএল পরীক্ষা করতে আমি কী ব্যবহার করব?

এখানে আরও ভাল ধারণা আছে? মন্তব্য? পরামর্শ?


সম্পাদনা - আরও এই সম্পর্কে চিন্তা করা, সংকলন এবং আহবান গ্রহণযোগ্য নয়, কারণ আহ্বানের পার্শ্ব প্রতিক্রিয়া হতে পারে। সুতরাং প্রথম বিকল্পটি বাতিল হতে হবে।

এছাড়াও, আমি মনে করি যে আমি .NET 4.0 এর উপস্থিতি ধরে নিতে পারি না।


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

এটি সম্পূর্ণরূপে দৃশ্যের সুষ্ঠু উপসেটের জন্য কাজ করে।

উদাহরণস্বরূপ, ধরুন নীচের কোড টুকরা,? ব্যবহারকারী সেই অবস্থান যেখানে সমাপ্তির জন্য বলে। এইটা কাজ করে:

var x = "hello there"; 
x.?

সমাপ্তিটি বুঝতে পারে যে এক্স একটি স্ট্রিং, এবং উপযুক্ত বিকল্পগুলি সরবরাহ করে। এটি নিম্নলিখিত উত্স কোডটি উত্পন্ন ও সংকলন করে এটি করে:

namespace N1 {
  static class dmriiann5he { // randomly-generated class name
    static void M1 () {
       var x = "hello there"; 
    }
  }
}

... এবং তারপরে সাধারণ প্রতিবিম্ব সহ IL পরিদর্শন করা।

এটিও কাজ করে:

var x = new XmlDocument();
x.? 

ইঞ্জিনটি উত্পন্ন উত্স কোডে উপযুক্ত ক্লজগুলি যুক্ত করে যুক্ত করে, যাতে এটি সঠিকভাবে সংকলিত হয় এবং তারপরে আইএল পরিদর্শন একই হয়।

এটিও কাজ করে:

var x = "hello"; 
var y = x.ToCharArray();    
var z = y.?

এর অর্থ হ'ল আইএল পরিদর্শনটিকে প্রথমটির পরিবর্তে তৃতীয় স্থানীয় পরিবর্তনশীলের ধরণটি খুঁজে পেতে হবে।

এবং এই:

var foo = "Tra la la";
var fred = new System.Collections.Generic.List<String>
    {
        foo,
        foo.Length.ToString()
    };
var z = fred.Count;
var x = z.?

... যা পূর্বের উদাহরণ মাত্র এক স্তর গভীর।

তবে, যা কাজ করে না তা কোনও স্থানীয় ভেরিয়েবলের সমাপ্তি যাঁর সূচনাটি কোনও উদাহরণের সদস্য বা স্থানীয় পদ্ধতির আর্গুমেন্টের যে কোনও সময়ে নির্ভর করে। ভালো লেগেছে:

var foo = this.InstanceMethod();
foo.?

বা লিনকিউ সিনট্যাক্স নয়।

এই জিনিসগুলি কতটা মূল্যবান তা নিয়ে আমি ভাবতে হবে আগে সম্পূর্ণ হওয়ার জন্য অবশ্যই এটি একটি "সীমিত নকশা" (হ্যাকের জন্য ভদ্র শব্দ) কী via

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


অন্য আপডেট - উদাহরণস্বরূপ সদস্যদের উপর নির্ভর করে ভারগুলির উপর সমাপ্তি এখন কাজ করে।

আমি যা করেছি তা টাইপটিকে (শব্দার্থ মাধ্যমে) জিজ্ঞাসাবাদ করা হয়েছিল এবং তারপরে সমস্ত বিদ্যমান সদস্যের জন্য সিন্থেটিক স্ট্যান্ড-ইন সদস্য তৈরি করা হয়েছিল। এই জাতীয় সি # বাফারের জন্য:

public class CsharpCompletion
{
    private static int PrivateStaticField1 = 17;

    string InstanceMethod1(int index)
    {
        ...lots of code here...
        return result;
    }

    public void Run(int count)
    {
        var foo = "this is a string";
        var fred = new System.Collections.Generic.List<String>
        {
            foo,
            foo.Length.ToString()
        };
        var z = fred.Count;
        var mmm = count + z + CsharpCompletion.PrivateStaticField1;
        var nnn = this.InstanceMethod1(mmm);
        var fff = nnn.?

        ...more code here...

... উত্পন্ন কোড যা সংকলিত হয়, যাতে আমি আউটপুট থেকে শিখতে পারি স্থানীয় var nnn এর ধরণটি এরকম দেখাচ্ছে:

namespace Nsbwhi0rdami {
  class CsharpCompletion {
    private static int PrivateStaticField1 = default(int);
    string InstanceMethod1(int index) { return default(string); }

    void M0zpstti30f4 (int count) {
       var foo = "this is a string";
       var fred = new System.Collections.Generic.List<String> { foo, foo.Length.ToString() };
       var z = fred.Count;
       var mmm = count + z + CsharpCompletion.PrivateStaticField1;
       var nnn = this.InstanceMethod1(mmm);
      }
  }
}

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

এটি কী সম্ভব করে তোলে:

  • ইমাসে পাওয়ারশেল চালনার ক্ষমতা
  • সি # সংকলকটি সত্যিই দ্রুত। আমার মেশিনে, ইন-মেমরি অ্যাসেমবিলিটি সংকলন করতে প্রায় 0.5s লাগে। কী-স্ট্রোক বিশ্লেষণের জন্য পর্যাপ্ত দ্রুত নয়, তবে পর্যাপ্ত তালিকাগুলির অন-চাহিদা প্রজন্মকে সমর্থন করার জন্য এটি যথেষ্ট দ্রুত।

আমি এখনও লিনকিউতে দেখিনি।
এটি আরও অনেক বড় সমস্যা হয়ে উঠবে কারণ সিমেটিক লেক্সার / পার্সার ইম্যাকস সি # এর জন্য রয়েছে, লাইনকিউ করে না "


4
প্রকারের অনুক্রমের মাধ্যমে ফুয়ের ধরণটি নির্ণয় করা হয় এবং সংকলক দ্বারা পূরণ করা হয়। আমি সন্দেহ করি যে পদ্ধতিগুলি সম্পূর্ণ আলাদা। সম্ভবত টাইপ-ইনফারেন্স ইঞ্জিনের একটি হুক আছে? খুব কমপক্ষে আমি ট্যাগ হিসাবে 'টাইপ-ইনফারেন্সন' ব্যবহার করব।
জর্জ মাউয়ার

3
আপনার "নকল" অবজেক্ট মডেল তৈরির কৌশলটি যা সমস্ত ধরণের রয়েছে তবে আসল বস্তুর শব্দার্থবিজ্ঞানের কোনওটিই ভাল নয়। সেদিন আমি ভিজ্যুয়াল আন্তঃদেভে জেএসক্রিপ্টের জন্য ইন্টেলিসেন্সটি কীভাবে করেছি; আমরা আইই অবজেক্ট মডেলের একটি "নকল" সংস্করণ তৈরি করি যার সমস্ত পদ্ধতি এবং প্রকারগুলি রয়েছে তবে এর কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং তারপরে সংকলনের সময় পার্সড কোডের উপরে একটি ছোট্ট দোভাষী চালিত করে দেখি কী প্রকার ফিরে আসে।
এরিক লিপার্ট

উত্তর:


202

আমরা কীভাবে "রিয়েল" সি # আইডিইতে দক্ষতার সাথে এটি করি তা আপনার জন্য বর্ণনা করতে পারি।

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

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

আমরা একটি পাস দিয়ে শুরু করি যা সেই পদ্ধতির মধ্যে কেবল স্থানীয় পরিবর্তনশীল ঘোষণাগুলি বিশ্লেষণ করে । যখন আমরা সেই পাসটি চালাই আমরা "স্কোপ" এবং "নাম" এর একটি জুটি থেকে "টাইপ নির্ধারক" তে ম্যাপিং করি। "টাইপ নির্ধারণকারী" এমন একটি বস্তু যা "আমার প্রয়োজন হলে আমি এই স্থানীয় ধরণের প্রকারটি কাজ করতে পারি" ধারণাটি উপস্থাপন করে। একটি স্থানীয় ধরণের কাজ করা ব্যয়বহুল হতে পারে তাই আমরা যদি প্রয়োজন হয় তবে সেই কাজটি পিছিয়ে দিতে চাই।

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

String x = "hello";
var y = x.ToCharArray();
var z = from foo in y where foo.

এবং এখন আমাদের ফুও টাইপ চর আছে তা নিয়ে কাজ করা দরকার। আমরা একটি ডেটাবেস তৈরি করি যাতে সমস্ত মেটাডেটা, এক্সটেনশন পদ্ধতি, উত্স কোডের ধরণের এবং আরও রয়েছে। আমরা একটি ডাটাবেস তৈরি করি যেখানে এক্স, y এবং z এর জন্য টাইপ নির্ধারক রয়েছে। আমরা আকর্ষণীয় অভিব্যক্তি ধারণ বিবৃতি বিশ্লেষণ। আমরা এটিকে সিন্টেক্সিকভাবে রূপান্তর করে শুরু করি

var z = y.Where(foo=>foo.

ফু এর ধরণের কাজ করার জন্য আমাদের প্রথমে y এর প্রকারটি জানতে হবে। সুতরাং এই মুহুর্তে আমরা টাইপ নির্ধারককে জিজ্ঞাসা করি "y এর ধরণটি কী"? এরপরে এটি এক্সপ্রেশন মূল্যায়নকারী শুরু করে যা x.ToCharArray () কে পার্স করে এবং "x এর ধরণটি কী" জিজ্ঞাসা করে? আমাদের এটির জন্য একটি প্রকার নির্ধারক রয়েছে যা বলে যে "বর্তমান প্রসঙ্গে" আমাকে "স্ট্রিং" সন্ধান করা দরকার "। বর্তমান ধরণের কোনও স্ট্রিং নেই, তাই আমরা নেমস্পেসে দেখি। এটি সেখানে নেই সুতরাং আমরা ব্যবহারের দিকনির্দেশগুলি লক্ষ্য করি এবং আবিষ্কার করি যে "সিস্টেম ব্যবহার করে" আছে এবং সিস্টেমটির একটি স্ট্রিং রয়েছে। ঠিক আছে, তাই এটি এক্স টাইপ।

তারপরে আমরা ToCharArray এর ধরণের জন্য সিস্টেম.স্ট্রিংয়ের মেটাডেটা জিজ্ঞাসা করি এবং এটি বলে যে এটি একটি System.Char []। সুপার. সুতরাং আমরা y জন্য একটি টাইপ আছে।

এখন আমরা জিজ্ঞাসা করি "সিস্টেম.চর [] এর একটি পদ্ধতি আছে কোথায়?" না। সুতরাং আমরা ব্যবহার নির্দেশাবলী তাকান; আমরা ইতিমধ্যে ব্যবহারযোগ্য এক্সটেনশন পদ্ধতির জন্য সমস্ত মেটাডেটা সম্বলিত একটি ডাটাবেসকে পূর্বনির্মাণ করেছি।

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

আমি একটি বিশেষ ধরণের ইনফেরেন্সিং ইঞ্জিন লিখেছি যা প্রথম যুক্তি থেকে কোনও এক্সটেনশন পদ্ধতিতে অসম্পূর্ণ সূচনাগুলি পরিচালনা করতে পারে। আমরা টাইপ ইনফেরারটি চালিত করি এবং আবিষ্কার করেছি যে সেখানে একটি পদ্ধতি রয়েছে যা আমরা গ্রহণ IEnumerable<T>করি এবং আমরা সিস্টেম.চার [] থেকে IEnumerable<System.Char>, তাই টি হ'ল সিস্টেম.চার System

এই পদ্ধতির স্বাক্ষরটি Where<T>(this IEnumerable<T> items, Func<T, bool> predicate)এবং আমরা জানি যে টি হল সিস্টেম.চার C এছাড়াও আমরা জানি যে এক্সটেনশন পদ্ধতির প্রথম বন্ধনের ভিতরে যুক্তিটি ল্যাম্বডা। সুতরাং আমরা একটি ল্যাম্বডা এক্সপ্রেশন টাইপ ইনফেরার শুরু করি যা বলে যে "ফর্মাল প্যারামিটার foo সিস্টেম.চার হিসাবে ধরে নেওয়া হয়", বাকি ল্যাম্বডা বিশ্লেষণ করার সময় এই সত্যটি ব্যবহার করুন।

ল্যাম্বদার দেহ বিশ্লেষণের জন্য আমাদের এখন প্রয়োজনীয় সমস্ত তথ্য রয়েছে যা "ফু"। আমরা ফু এর ধরণটি সন্ধান করি, আমরা আবিষ্কার করেছি যে ল্যাম্বদা বাইদার অনুসারে এটি সিস্টেম.চর, এবং আমরা সম্পন্ন করেছি; আমরা System.Char এর জন্য প্রকারের তথ্য প্রদর্শন করি।

এবং আমরা কীস্ট্রোকের মধ্যে "শীর্ষ স্তরের" বিশ্লেষণ বাদে সবকিছু করি । এটাই আসল কৌতুক বিট। আসলে সমস্ত বিশ্লেষণ লেখা শক্ত নয়; এটি এটিকে এত দ্রুত তৈরি করছে যে আপনি টাইপিং গতিতে এটি করতে পারেন এটিই আসল কৌতুকপূর্ণ বিট।

শুভকামনা!


8
এরিক, সম্পূর্ণ উত্তরের জন্য ধন্যবাদ। আপনি আমার চোখ কিছুটা খুলেছেন। ইমাক্সের জন্য, আমি ব্যবহারকারীর অভিজ্ঞতার মানের দিক দিয়ে ভিজ্যুয়াল স্টুডিওর সাথে প্রতিযোগিতা করবে এমন একটি গতিময়, কী-স্ট্রোক ইঞ্জিন তৈরি করতে আগ্রহী ছিলাম না। একটি জিনিস হিসাবে, আমার ডিজাইনের অন্তর্নিহিত ~ 0.5s এর বিলম্বের কারণে, ইমাস -ভিত্তিক সুবিধাটি কেবলমাত্র অন-চাহিদা অনুসারে থাকবে; কোনও টাইপ-ফরোয়ার্ড পরামর্শ নেই। অন্যটির জন্য - আমি বিভিন্ন স্থানীয়দের প্রাথমিক সমর্থন বাস্তবায়ন করব, তবে জিনিসগুলি লোমশ হয়ে উঠলে বা নির্ভরতার গ্রাফ নির্দিষ্ট সীমা ছাড়িয়ে গেলে আমি আনন্দের সাথে কান্না করব unt এখনও নিশ্চিত না যে সেই সীমাটি কী। আবার ধন্যবাদ.
চিজো

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

21
@ ড্যান: আমি সোর্স কোডটি (বা লিখিত) দেখেছি এবং এটি আমার মনকে ছাঁটাই করে তোলে যে এটি খুব কার্যকর হয়। :-) সেখানে কিছু লোমশ জিনিস রয়েছে।
এরিক লিপার্ট

11
Elpipse ছেলেরা সম্ভবত এটি আরও ভাল করেছে কারণ তারা সি # সংকলক এবং আইডিই টিমের চেয়ে আরও দুর্দান্ত
এরিক লিপার্ট

23
এই বোকা মন্তব্য করা মোটেও মনে নেই। এমনকি এটি কোনও অর্থবোধ করে না। আমি অবশ্যই মাতাল ছিলাম। দুঃখিত।
টমাস অ্যান্ড্রেল

15

আমি আপনাকে মোটামুটিভাবে বলতে পারি যে ডেল্ফি আইডিই কীভাবে ইন্টেলিজেন্স করার জন্য ডেলফি সংকলকটির সাথে কাজ করে (কোড অন্তর্দৃষ্টি তাকে ডেল্ফি বলে calls এটি সি # তে 100% প্রযোজ্য নয়, তবে এটি একটি আকর্ষণীয় পদ্ধতির যা বিবেচনার দাবি রাখে।

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

পার্সটি মূলত এলএল (2) রিকার্সিভ ডেসেন্ট, এক্সপ্রেশন বাদে অপারেটর নজির ব্যবহার করে পার্স করা হয়। ডেলফি সম্পর্কিত একটি স্বতন্ত্র বিষয় হ'ল এটি একটি একক-পাসের ভাষা, সুতরাং ব্যবহারের আগে নির্মাণগুলি ঘোষণা করা দরকার, সুতরাং সেই তথ্যটি বাইরে আনার জন্য কোনও শীর্ষ-স্তরের পাসের প্রয়োজন হয় না।

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

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

এখন, নির্দিষ্ট প্রশ্নের কাছে: ঘোষিত ভেরিয়েবলের ধরণের অনুমান করা varযেমন পাস্কাল ধ্রুবকের ধরণের অনুমান করে। এটি আরম্ভের প্রকাশের ধরণ থেকে আসে। এই ধরণের নিচ থেকে নীচে নির্মিত হয়। যদি xটাইপ হয় Integer, এবং yটাইপ হয় Double, তবে x + yটাইপ হবে Double, কারণ সেগুলি ভাষার নিয়ম; ইত্যাদি। আপনি এই বিধিগুলি অনুসরণ করেন যতক্ষণ না আপনার ডান হাতের পুরো প্রকাশের জন্য টাইপ থাকে এবং বামদিকে প্রতীকটির জন্য আপনি এটি ব্যবহার করেন।


7

বিমূর্ত সিনট্যাক্স ট্রি তৈরি করতে যদি আপনার নিজের পার্সার লিখতে না চান তবে আপনি শার্পডেভলভ বা মনোডেভলভ উভয়ই ওপেন সোর্স থেকে পার্সার ব্যবহার করে দেখতে পারেন।


4

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

var items = myList.OfType<Foo>().Select(foo => foo.Bar);

রিটার্ন টাইপ হয় IEnumerable<Bar>, তবে এটি জেনে প্রয়োজনীয় প্রয়োজনীয় সমাধান করে:

  1. মাইলিস্টটি প্রকারভেদ করে IEnumerable
  2. এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে OfType<T>যা আইনামিউরেবলের জন্য প্রযোজ্য।
  3. ফলস্বরূপ মানটি রয়েছে IEnumerable<Foo>এবং Selectএটিতে প্রযোজ্য একটি এক্সটেনশন পদ্ধতি রয়েছে ।
  4. ল্যাম্বডা এক্সপ্রেশনটিতে foo => foo.Barফু টাইপের প্যারামিটার ফু রয়েছে। এটি Func<TIn,TOut>সিলেক্টের ব্যবহার দ্বারা অনুমিত হয়, যা টি নেয় এবং যেহেতু টিআইএন পরিচিত হয় (ফু), ফু এর ধরণের অনুমান করা যায়।
  5. টাইপ ফু এর একটি প্রপার্টি বার রয়েছে, যা টাইপ বার। আমরা জানি যে সিলেক্ট রিটার্ন IEnumerable<TOut>এবং টুটকে ল্যাম্বডা এক্সপ্রেশনের ফলাফল থেকে অনুমান করা যেতে পারে, সুতরাং ফলস্বরূপ আইটেমগুলির প্রকার হতে হবে IEnumerable<Bar>

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

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

1
@ শেইসো: সংকলকটি পরিষেবা হিসাবে ধরণের বিশ্লেষণের প্রস্তাব দেয় না। আমি আশা করি ভবিষ্যতে এটি হবে তবে কোন প্রতিশ্রুতি নেই।
এরিক লিপার্ট

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

4

যেহেতু আপনি ইমাসকে টার্গেট করছেন তাই সিডিইটি স্যুট দিয়ে শুরু করা ভাল be এরিক লিপার্ট সিডিইটি / সিমেটিক সরঞ্জামটিতে কোড ইতিমধ্যে সি ++ এর জন্য কোড বিশ্লেষকের আওতায় রয়েছে এমন সমস্ত বিবরণ। একটি সি # পার্সারও রয়েছে (যার সম্ভবত কিছুটা টিএলসি প্রয়োজন) তাই কেবলমাত্র অনুপস্থিত অংশগুলি সি # এর জন্য প্রয়োজনীয় অংশগুলি সুর করার সাথে সম্পর্কিত।

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

ড্যানিয়েলের উত্তরটি পার্সিং এবং বিশ্লেষণ করতে মনোোডিভোল্ট ব্যবহার করার পরামর্শ দেয়। এটি বিদ্যমান সি # পার্সারের পরিবর্তে বিকল্প ব্যবস্থা হতে পারে বা এটি বিদ্যমান পার্সারকে বাড়ানোর জন্য ব্যবহৃত হতে পারে।


ঠিক আছে, আমি সিডিইটিটি সম্পর্কে জানি, এবং আমি সিটেন্টের জন্য অবদান ডিরেক্টরিতে সি # সমর্থনটি ব্যবহার করছি। সিমেন্টিক স্থানীয় ভেরিয়েবল এবং তাদের প্রকারের তালিকা সরবরাহ করে। একটি সমাপ্তি ইঞ্জিন সেই তালিকাটি স্ক্যান করতে এবং ব্যবহারকারীর কাছে সঠিক পছন্দগুলি সরবরাহ করতে পারে। সমস্যাটি যখন ভেরিয়েবল হয় var। শব্দার্থক এটিরূপে সঠিকভাবে সনাক্ত করে তবে প্রকারের অনুক্রম সরবরাহ করে না। আমার প্রশ্ন বিশেষভাবে প্রায় মোকাবেলার কেমন ছিল যে । আমি বিদ্যমান সিডিইটি সমাপ্তির জন্য প্লাগিংয়ের দিকেও নজর রেখেছি, তবে কীভাবে তা বুঝতে পারি না। সিইডিইটি-র জন্য ডকুমেন্টেশন হ'ল ... আহ ... সম্পূর্ণ নয়।
চিজো

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

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

2

এটি করা ভাল সমস্যা। মূলত আপনার বেশিরভাগ লেসিং / পার্সিং / টাইপচেখিংয়ের মাধ্যমে ভাষা নির্দিষ্টকরণ / সংকলককে মডেল করতে হবে এবং উত্স কোডটির একটি অভ্যন্তরীণ মডেল তৈরি করতে হবে যা আপনি জিজ্ঞাসা করতে পারেন। এরিক এটিকে সি # এর বিশদে বিশদভাবে বর্ণনা করেছেন। আপনি সর্বদা এফ # সংকলক উত্স কোডটি (এফ # সিটিপির একটি অংশ) ডাউনলোড করতে পারেন এবং এফ # সংকলকটির service.fsiবাইরে প্রকাশিত ইন্টারফেসটি দেখে নিতে পারেন যা এফ # ভাষা পরিষেবা ইনফেলড প্রকারের জন্য ইনটেলিসেন্স, সরঞ্জামদণ্ড ইত্যাদি সরবরাহ করে mes আপনার যদি ইতিমধ্যে কল করার জন্য একটি এপিআই হিসাবে সংকলক উপলব্ধ থাকে তবে একটি সম্ভাব্য 'ইন্টারফেস' এর অনুভূতি।

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

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


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


0

"1" সমাধানের জন্য আপনার কাছে .NET 4 এ একটি নতুন সুবিধা রয়েছে এটি দ্রুত এবং সহজেই করতে। সুতরাং আপনি যদি আপনার প্রোগ্রামটি নেট 4 এ রূপান্তর করতে পারেন তবে এটি আপনার সেরা পছন্দ হবে।

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