কীভাবে mscorlib এর `System.Boolean` স্ট্রাক্ট বিন্যাস চক্র এড়ানো যায়?


10

System.Booleanরেফারেন্স উত্স ওয়েবসাইটের জন্য উত্স-কোড সূচিত করে যে কন্টেন্টগুলির উদাহরণগুলিতে struct Booleanকেবল একটি একক boolক্ষেত্র রয়েছে private bool m_value:

https://referencesource.microsoft.com/#mscorlib/system/boolean.cs,f1b135ff6c380b37

namespace System {

    using System;
    using System.Globalization;
    using System.Diagnostics.Contracts;

    [Serializable]
    [System.Runtime.InteropServices.ComVisible(true)]
    public struct Boolean : IComparable, IConvertible
#if GENERICS_WORK
        , IComparable<Boolean>,  IEquatable<Boolean>
#endif
    {
      private bool m_value;

      internal const int True = 1; 
      internal const int False = 0; 

      internal const String TrueLiteral  = "True";
      internal const String FalseLiteral = "False";

      public static readonly String TrueString  = TrueLiteral;
      public static readonly String FalseString = FalseLiteral;
}

কিন্তু আমি লক্ষ্য করেছি যে ...

  • boolহয় একটি C # এর ভাষা ওরফে জন্য System.Boolean।
  • টাইপটি struct Booleanযা কোনও মান-ধরণের যার অর্থ এটি ক্ষেত্র হিসাবে নিজেকে ধারণ করতে পারে না ।
  • ... তবুও এই কোডটি সম্ভবত সংকলন করে।
  • আমি বুঝি যে যখন -nostdlibকম্পাইলার বিকল্প সেট করা হয় আপনি আপনার নিজের প্রদান করতে অপরিহার্য টাইপ সংজ্ঞা পছন্দ System.String, System.Int32, System.Exception- যে শুধু পার্থক্য আছে।
  • প্রকাশিত উত্স-কোডে অন্য কোনও বিশেষ গুণাবলী নেই [MethodImpl( MethodImplOptions.InternalCall )]।

সুতরাং এই কোডটি কিভাবে সংকলন করে?


1
এটি একটি শালীন বিক্ষোভ যে সাধারণ "এটি একটি উপনাম" অনুমানটি একটি ভাঙ্গা মানসিক মডেল। সি # ভাষার boolএকটি কীওয়ার্ড । সংকলক এবং রানটাইম উভয়ই টাইপ সম্পর্কে প্রচুর অন্তর্নির্মিত জ্ঞান রাখে এবং সিস্টেম.বুলিয়ান থেকে কোনও সাহায্যের দরকার নেই। আদিম মানের ধরণের জন্য mscorlib এ ঘোষণাগুলি টাইপের বক্সযুক্ত উপস্থাপনার সাথে মেলে।
— হ্যানস প্যাস্যান্ট

উত্তর:


3

সংক্ষিপ্ত উত্তর : টাইপ বক্সিং এবং তাদের অন্তর্নিহিত উপস্থাপনা সম্পর্কিত এটি একটি বিশেষ ক্ষেত্রে। এই ধরণেরগুলি সংকলকটির কাছে সুপরিচিত এবং যেমন নিয়মিত ধরণের তুলনায় রানটাইমের মূল অংশগুলি এবং সংকলক / জেআইটি অপ্টিমাইজার দ্বারা কিছুটা আলাদাভাবে চিকিত্সা করা হয়।


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

বক্সিং ব্যবহারের শব্দার্থক শব্দ এবং মূল্য প্রকারের আনবক্সিং ভাষাটি সহজতর করার জন্য ইচ্ছাকৃতভাবে অস্বচ্ছ। এক্ষেত্রে Booleanকাঠামো নিজেই প্রকৃত শব্দার্থবিদ্যা বাস্তবায়নের জন্য নির্দিষ্ট বক্সিং বিধি প্রয়োগের উপর নির্ভর করে বলে মনে হয়:

  // Determines whether two Boolean objects are equal.
  public override bool Equals (Object obj) {
    //If it's not a boolean, we're definitely not equal
    if (!(obj is Boolean)) {
      return false;
    }

    return (m_value==((Boolean)obj).m_value);
  }

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

আমি অভ্যন্তরীণভাবে বিশ্বাসীগণ! যদি একটি bool হিসাবে গৃহীত হবে boxed করা হয়েছিল System.Objectআপনি এই জন্য লাইন বরাবর কিছু দিয়ে শেষ হবে (টাইপ ইরেজিওর অথবা যেখানে কোন অপ্টিমাইজেশান সম্ভব would কারণে) trueযা বক্স মান 1।

ldc.i4.1
box        [mscorlib]System.Boolean

সুতরাং একটি উচ্চ স্তরে থাকাকালীন boolএবং System.Booleanঅভিন্ন বলে মনে হয় এবং একইভাবে অনুকূলিত হতে পারে, রানটাইমের মধ্যে এই বিশেষ ক্ষেত্রে, এর বাক্সযুক্ত এবং আনবক্সযুক্ত সংস্করণগুলির মধ্যে পার্থক্যগুলি boolসরাসরি প্রকাশিত হয়। সিমিলারি, একটি আনবক্সডকে boolতুলনা করা যায় না System.Objectযা সহজাতভাবে একটি বক্সযুক্ত প্রকার is বক্সিং / আনবক্সিংয়ের প্রয়োজনীয়তা সম্পর্কিত এই উত্তরটি নীতিটি নিজেই ব্যাখ্যা করার মতো আরও অনেক গভীরতায় চলেছে।

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

যদিও 'bool,' 'System.Boolean' এর জন্য একটি টাইপ ওরফে হচ্ছে এই প্রশ্ন মূলত সাধারণ ব্যবহারের ক্ষেত্রে জুড়ে, যখন রানটাইম বাস্তবায়ন কাছাকাছি চলে, সি # এর উপভাষা আরও মত "বাস্তবায়ন নির্দিষ্ট সি #" রূপান্তরিত হবে নিয়ম সামান্য বক্র করতে পারে ।


আমি আপনার অন্তর্দৃষ্টির জন্য এটি উত্সাহিত করেছি - তবে আমি এটিকে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করতে পারি না কারণ এটি অনুমোদিত নয়, দুঃখিত :(
— দাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.