কোড সমাপ্তি কীভাবে কাজ করে?


84

প্রচুর সম্পাদক এবং আইডিই এর কোড সমাপ্তি রয়েছে। তাদের মধ্যে কিছু খুব "বুদ্ধিমান" অন্যরা সত্যই নয়। আমি আরও বুদ্ধিমান টাইপ আগ্রহী। উদাহরণস্বরূপ আমি আইডিইগুলি দেখেছি যা কেবলমাত্র যদি একটি ফাংশন সরবরাহ করে তবে তা বর্তমান স্কোপে উপলব্ধ খ) এর রিটার্ন মানটি বৈধ। (উদাহরণস্বরূপ "5 + foo [ট্যাব" "এর পরে এটি কেবল এমন ফাংশন সরবরাহ করে যা সঠিক সংখ্যার পূর্ণসংখ্যার বা পরিবর্তনশীল নামগুলিতে যোগ করা যায় এমন কিছু ফিরিয়ে দেয়)) আমি আরও দেখেছি যে তারা বেশিরভাগ ক্ষেত্রে ব্যবহৃত বা দীর্ঘতম বিকল্পকে সামনে রাখে they তালিকার।

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

একটি সময় বাধাও আছে। কোনও তালিকা উপস্থিত হতে কয়েক সেকেন্ড সময় লাগলে সম্পূর্ণ হওয়া অকেজো। কখনও কখনও সম্পূর্ণতা অ্যালগরিদম হাজার হাজার ক্লাস নিয়ে কাজ করে।

এর জন্য ভাল অ্যালগরিদম এবং ডেটা স্ট্রাকচার কী কী?


4
একটি ভাল প্রশ্ন। আপনি হয়ত কিছু ওপেন-সোর্স আইডিই-র জন্য কোডটি একবারে দেখতে চান যা কোড :: ব্লকস কোডব্লকস.আরজে

4
সি # তে কোড সমাপ্তি তৈরি করার নিবন্ধটি এখানে রয়েছে # সি-তে কোড কমপ্লিটেশন তৈরি করা
প্রীতম জোপ

উত্তর:


65

আমার অবাস্তব স্ক্রিপ্ট ভাষা পরিষেবা পণ্যের ইনটেলিসেন্স ইঞ্জিনটি জটিল, তবে আমি এখানে যতটা পারি তার যথাসম্ভব সেরা একটি ওভারভিউ দেব। ভিএস2008 এসপি 1-এ সি # ভাষা পরিষেবাটি আমার পারফরম্যান্স লক্ষ্য (সঙ্গত কারণে)। এটি এখনও সেখানে নেই, তবে এটি যথেষ্ট দ্রুত / নির্ভুল যে আমি কোনও একক অক্ষর টাইপ করার পরে নিরাপদে পরামর্শ দিতে পারি, সিটিআরএল + স্পেস বা ব্যবহারকারী .( টাইপ ) টাইপ না করে । এই বিষয় সম্পর্কে লোকেরা [ভাষা পরিষেবাদিগুলিতে কাজ করা] যত বেশি তথ্য পাবে, শেষের-ব্যবহারকারীর কাছ থেকে আমার যত ভাল অভিজ্ঞতা পাওয়া যায় সেগুলি তাদের পণ্যগুলি ব্যবহার করা উচিত। এমন অনেক পণ্য রয়েছে যা নিয়ে কাজ করার দুর্ভাগ্যজনক অভিজ্ঞতা পেয়েছি যা বিশদগুলিতে তেমন মনোযোগ দেয় নি এবং ফলস্বরূপ আমি কোডিংয়ের চেয়ে আইডিইয়ের সাথে লড়াই করে যাচ্ছিলাম।

আমার ভাষা পরিষেবাতে, এটি নীচের মতো করে দেওয়া হয়েছে:

  1. কার্সার এ অভিব্যক্তি পান। এটি সদস্য অ্যাক্সেস এক্সপ্রেশনের শুরু থেকে শনাক্তকারীর শেষ পর্যন্ত চলে যায় কার্সারটি শেষ। সদস্য অ্যাক্সেস এক্সপ্রেশন সাধারণত ফর্ম হয় aa.bb.cc, কিন্তু এছাড়াও পদ্ধতি কল থাকতে পারে হিসাবে aa.bb(3+2).cc
  2. কার্সারের চারপাশে প্রসঙ্গটি পান । এটি খুব জটিল, কারণ এটি সর্বদা সংকলক (দীর্ঘ গল্প) এর মতো একই নিয়মগুলি অনুসরণ করে না, তবে এখানে অনুমান করুন এটি তা করে। সাধারণত এর অর্থ কার্সারের মধ্যে থাকা পদ্ধতি / শ্রেণীর সম্পর্কে ক্যাশেড তথ্য পান information
  3. প্রসঙ্গ অবজেক্ট বাস্তবায়ন বলুন IDeclarationProvider, যেখানে আপনি সুযোগগুলিতে সমস্ত আইটেমের দৃশ্যমান GetDeclarations()পেতে কল করতে পারেন IEnumerable<IDeclaration>। আমার ক্ষেত্রে, এই তালিকায় স্থানীয় / পরামিতি (যদি কোনও পদ্ধতিতে থাকে), সদস্য (ক্ষেত্র এবং পদ্ধতি, কেবল উদাহরণ পদ্ধতি ব্যতীত স্থিতিশীল, এবং বেস ধরণের কোনও ব্যক্তিগত সদস্য নেই), গ্লোবাল (I ভাষার জন্য প্রকার এবং ধ্রুবক রয়েছে) এবং আমি কীওয়ার্ড দিচ্ছি। এই তালিকায় নাম সহ একটি আইটেম থাকবে aa। # 1-এ অভিব্যক্তিটি মূল্যায়নের প্রথম পদক্ষেপ হিসাবে, আমরা পরবর্তী পদক্ষেপের জন্য aaআমাদেরকে একটি নাম দিয়ে প্রসঙ্গের তালিকা থেকে আইটেমটি নির্বাচন করি IDeclaration
  4. এরপরে, আমি অন্যটির "সদস্য" (কোনও অর্থে) ধারণ করে অন্যটি পেতে IDeclarationপ্রতিনিধিত্ব aaকরতে অপারেটরটি প্রয়োগ করি । যেহেতু অপারেটর থেকে ভিন্ন অপারেটর, আমি কল এবং আশা সঠিকভাবে বস্তুর তালিকাভুক্ত অপারেটর প্রযোজ্য।IEnumerable<IDeclaration>aa.->declaration.GetMembers(".")IDeclaration
  5. আমি আঘাত না করা পর্যন্ত এটি অব্যাহত থাকে cc, যেখানে ঘোষণা তালিকায় নামের সাথে কোনও অবজেক্ট থাকতে পারে বা নাও থাকতে পারে cc। আমি নিশ্চিত যে আপনি সচেতন, যদি একাধিক আইটেম শুরু হয় ccতবে সেগুলিও উপস্থিত হওয়া উচিত। আমি চূড়ান্ত গণনা গ্রহণ করে এবং এটি ব্যবহারকারীর পক্ষে সবচেয়ে সহায়ক তথ্য সরবরাহ করার জন্য আমার নথিভুক্ত অ্যালগরিদমের মাধ্যমে এটি সমাধান করি

ইন্টেলিসেন্স ব্যাকএন্ডের জন্য এখানে কিছু অতিরিক্ত নোট রয়েছে:

  • আমি প্রয়োগের ক্ষেত্রে লিনকিউ এর অলস মূল্যায়ন ব্যবস্থার ব্যাপক ব্যবহার করি GetMembers। আমার ক্যাশে থাকা প্রতিটি বস্তু এমন একটি ফান্টর সরবরাহ করতে সক্ষম যা এর সদস্যদের মূল্যায়ন করে, তাই গাছের সাথে জটিল ক্রিয়া সম্পাদন করা তুচ্ছ।
  • এর প্রতিটি List<IDeclaration>সদস্যের সদস্যদের রাখার পরিবর্তে আমি একটি রাখি List<Name>, যেখানে Nameএকটি কাঠামো যেখানে সদস্যকে বর্ণনা করে একটি বিশেষভাবে বিন্যাসিত স্ট্রিংয়ের হ্যাশযুক্ত containing একটি প্রচুর পরিমাণে ক্যাশে রয়েছে যা বস্তুর নাম ম্যাপ করে। এইভাবে, যখন আমি কোনও ফাইল পুনরায় পার্স করি, তখন আমি ক্যাশে থেকে ফাইলটিতে ঘোষিত সমস্ত আইটেম সরিয়ে ফেলতে এবং আপডেট সদস্যদের সাথে এটি পুনরায় তৈরি করতে পারি। ফান্ট্যাক্টরা কনফিগার করা পদ্ধতির কারণে সমস্ত এক্সপ্রেশন তত্ক্ষণাত নতুন আইটেমগুলিতে মূল্যায়ন করে।

ইন্টেলিসেন্স "ফ্রন্ট্যান্ড"

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

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

পূর্ববর্তী বিভাগের জন্য কোড স্নিপেট:

class A
{
    int x; // linked to A

    void foo() // linked to A
    {
        int local; // linked to foo()

    // foo() ends here because bar() is starting
    void bar() // linked to A
    {
        int local2; // linked to bar()
    }

    int y; // linked again to A

আমি অনুভব করেছি যে আমি এই লেআউটটি প্রয়োগ করেছি ইন্টেলিজেন্স বৈশিষ্ট্যগুলির একটি তালিকা যুক্ত করব। প্রত্যেকের ছবি এখানে অবস্থিত।

  • স্বয়ংক্রিয়ভাবে সম্পূর্ণ
  • সরঞ্জাম টিপস
  • পদ্ধতি টিপস
  • ক্লাস ভিউ
  • কোড সংজ্ঞা উইন্ডো
  • কল ব্রাউজার (ভিএস 2010 শেষ পর্যন্ত এটি সি # তে যুক্ত করেছে)
  • শব্দগুচ্ছভাবে সঠিকভাবে সমস্ত রেফারেন্স সন্ধান করুন

এই মহান, আপনাকে ধন্যবাদ. আমি বাছাইয়ের সময় কেস কেসে সংবেদনশীল পক্ষপাতিত্ব নিয়ে কখনই ভাবিনি। আমি বিশেষত পছন্দ করি যে আপনি অমিল ধনুর্বন্ধনী সঙ্গে ডিল করতে পারেন।
stribika

16

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

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

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

ত্রি (বা অন্যান্য ডেটা স্ট্রাকচার) গণনা করার জন্য আপনার প্রকল্পের সমস্ত চিহ্নগুলির একটি তালিকা পেতে আপনার সমস্ত কোডকে বিশ্লেষণ করতে হবে। ভিজ্যুয়াল স্টুডিওগুলি এটি আপনার ইন্টিলিসেন্স ডাটাবেসে .ncbসংরক্ষণ করে, এটি আপনার প্রকল্পের পাশাপাশি সঞ্চিত একটি ফাইল, যাতে প্রতিবার আপনার প্রজেক্টটি বন্ধ করে পুনরায় খোলার সময় আপনাকে সবকিছু পুনর্বার করতে হবে না। প্রথমবার আপনি যখন কোনও বড় প্রকল্পটি খুলুন (বলুন যে আপনি কেবলমাত্র উত্স নিয়ন্ত্রণের সাথে সিঙ্ক করেছেন), ভিএস সমস্ত কিছু পার্স করতে এবং ডেটাবেস তৈরি করতে সময় নেবে।

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

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


ট্রাই সত্যিই ভাল ধারণা। বর্ধিত পরিবর্তনগুলি হিসাবে যখন বর্তমান লাইনে উপেক্ষা করা কাজ করে না এবং যখন এনক্লোজিং ignore ...} ব্লকটিকে উপেক্ষা করে কাজ করে না তখন প্রথমে ফাইলটি পুনরায় পার্স করার চেষ্টা করা সম্ভব। অন্য সব ব্যর্থ হলে শেষ ডাটাবেস ব্যবহার করে।
stribika

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