Saturday, August 5, 2017

প্রোগ্রামিং টার্ম নিয়ে কিছু কনফিউশানঃ ০৩

1.   Stack এবং Heap কী? এদের মধ্যে পার্থক্য কী?

Stack এবং Heap উভয়ই computer এর RAM এ স্টোর হয়। চিন্তা করা যেতে পারে র‍্যামের দুটি মেমরি পার্ট।
·         Stack ব্যবহৃত হয় Static Memory Allocation এর জন্য আর Heap ব্যবহৃত হয় Dynamic Memory Allocation এর জন্য  
·         Stackallocated হওয়া Variable গুলো directly memory তে স্টোর হয় যখন প্রোগ্রাম কম্পাইল হয় এবং মেমরিতে অনেক দ্রুত এক্সেস করা যায় কিন্তু সাধারনত Heap allocated হওয়া Variable গুলো তাদের মেমরিতে allocated হয় রান টাইমে এবং এই মেমরিতে এক্সেস করা বেশ স্লো। মূলত স্ট্যাক হিপের চেয়ে অনেক ফাস্ট।
·         স্ট্যাক এর সাইজ ফিক্সড থাকে যেটা আর বৃদ্ধি পায় না। হিপের সাইজ শুধুমাত্র সিস্টেমের ভারচুয়েল মেমরির জন্য লিমিটেড হয়ে থাকে কিন্তু অপারেটিং সিস্টেম দ্বারা হিপে আরো মেমরি এড করা যায়।
·         যেহেতু স্ট্যাকের মেমরি ছোট তাই কম্পাইল টাইমের আগে যদি এক্সাকটলি আপনি জানেন যে কতটুকু ডাটা আপনার মেমরিতে এলোকেট করা প্রয়োজন তাহলে স্ট্যাক ইউজ করতে পারেন। আর যদি আপনি না জানেন যে রান টাইমে কতগুলো ডাটা আপনার প্রয়োজন অথবা আপনার ডাটার জন্য অনেক মেমরি প্রয়োজন তাহলে হিপ ইউজ করাই বেস্ট।
·         স্ট্যাকের ডাটা অটোমেটিক্যাল্লি ডিএলোকেটেড হয় যখন ভ্যারিয়েবল গুলো স্কোপের বাহিরে চলে যায়। অর্থাৎ একটি ফাংশান কল করার জন্য যদি যেকোন ডাটা স্ট্যাকে তৈরি করা হয় তাহলে ফাংশান কল কমপ্লিট হয়ে গেলেই সেগুলো অটোমেটিক্যাল্লি ডিলিট হয়ে যায়। কিন্তু হিপে স্টোর হওয়া যেকোন ডাটা রয়ে যায় যতক্ষন না প্রোগ্রামার ম্যানুয়াল্লি ডিলিট করে। ম্যানুয়াল্লি ডিলিট করার জন্য প্রোগ্রামাররা একটি বিল্ট ইন কিওয়ার্ড ইউজ করে। ডটনেট সে কাজটি করার জন্য garbage collection ব্যবহার করে যেখানে প্রোগ্রামারদের কিছুই করতে হয় না।
·         একটি মাল্টি থ্রেড সিচুয়েশানে প্রত্যেক থ্রেডের সম্পুর্ন স্বাধীন স্ট্যাক থাকবে কিন্তু তারা হিপ শেয়ার করবে কারণ স্ট্যাক হলো থ্রেড স্পেসিফিক এবং হিপ হলো এপ্লিকেশান স্পেসিফিক।
·         Stack এ ভ্যালু স্টোর হয় একটির উপর আরেকটি অর্থাৎ স্ট্যাকের মতো কিন্তু Heap এ ভ্যালু স্টোর হয় রেন্ডোমল অর্ডারে।
এখানে দুইটি ছবি দেওয়ায় হলো স্ট্যাক ও হিপের ব্যাপারে ক্লিয়ার হবার জন্য

ভ্যালু Type যেমন, int, double, enum, struct  স্টোর করা হয় স্ট্যাকে আর হিপে অবজেক্ট, স্ট্রিং অ্যারে, ক্লাস ইত্যাদির ভ্যালু স্টোর করা হয় যার রেফারেন্স বা এড্রেস স্টোর করা হয় স্ট্যাকে।



2.    Value Type Vs Reference Type?

·         যে ভ্যারিয়েবলগুলো ডাটা স্টোর করে এবং একচুয়্যাল ডাটা রিপ্রেজেন্ট করে তাদের ভ্যালু টাইপ বলে। যেমনঃ int, enum, structs etc.
যে ভ্যারিয়েবলগুলো প্রকৃত ডাটাকে স্টোর করেনা শুধুমাত্র তার রেফারেন্স বা এড্রেস স্টোর করে তাকে রেফারেন্স টাইপ বলে। যেমনঃ String, class, object, array, interface, delegate etc.

·         ভ্যালু টাইপ স্ট্যাকে স্টোর হয় কিন্তু রেফারেন্স টাইপ ভ্যালু মূলত হিপে স্টোর হয় তবে তার মেমরি লোকেশান রেফারেন্স বা এড্রেস স্টোর হয় স্ট্যাকে।
·         Value Type সাধারনত কোন নাল ভ্যালু নেয় না তবে তার nullable একটি টাইপ আছে এর মাধ্যমে সে নাল ভ্যালু নিতে পারে। কিন্তু Reference Type সর্বদায় নাল ভ্যালু Allow করে।
·         Value Type ভ্যালু স্ট্যাক থেকে সরে আসে যখন তারা তাদের স্কোপ থেকে বেরিয়ে আসে। কিন্তু Reference Type ভ্যালুকে মেমোরি থেকে সরাতে Garbage Collector প্রয়োজন পরে।
·         Value Type এর মেমরি এলোকেট হয় কম্পাইল টাইমে কিন্তু Reference Type এর মেমরি এলোকেট হয় Run Time এ।

3.   সি শার্প এর nullable ডাটা টাইপের উদাহরন দাও?

সি শার্পের একটি বিশেষ ডাটা টাইপ হচ্ছে nullable টাইপ যেগুলোতে স্বাভাবিক রেঞ্জের ভ্যালু যেমন এসাইন করা যায় তেমনি নাল ভ্যালুও এসাইন করা যায়।
using System;
namespace CalculatorApplication
{
   class NullablesAtShow
   {
      static void Main(string[] args)
      {
         int? num1 = null;
         int? num2 = 45;
         double? num3 = new double?();
         double? num4 = 3.14157;
        
         bool? boolval = new bool?();

         // display the values
        
         Console.WriteLine("Nullables at Show: {0}, {1}, {2}, {3}", num1, num2, num3, num4);
         Console.WriteLine("A Nullable boolean value: {0}", boolval);
         Console.ReadLine();
      }
   }
}
ফলাফলঃ
Nullables at Show: , 45,  , 3.14157
A Nullable boolean value:

4.   What’s the output of the following program? 

int x = new int();
x = 20;
int y = new int();
y = x;
        
y = 30;
     //Line3    
return x;

Output--20
At Line 3 only y value is changes. "x" has its own location on stack which is not
 
affected
 by this and hence retains is old values. 



class Numbers
 
{
    public int MyValue;
}


            
Numbers x = new Numbers();
x.MyValue = 3;
Numbers y = new Numbers();
y = x;
y.MyValue = 4;
Console.WriteLine( x.MyValue);
            
Output- 4. Both x and y are pointing to the same location on the heap.
 

5.   Data Structure কী?
ডেটাকে অনেক ভাবেই সাজিয়ে রাখা যায়। ডেটা স্ট্রাকচার হচ্ছে ডেটাগুলোকে নির্দিষ্ট পদ্ধতিতে সাজিয়ে রাখার লজিক্যাল বা ম্যাথমেটিক্যাল মডেল। অর্থাৎ ডেটাকে কম্পিউটার মেমরিতে সংরক্ষণ ও সেগুলোকে নিয়ে প্রসেস করার জন্য efficient পদ্ধতিতে ডেটাগুলোকে organize করার নামই ডেটা স্ট্রাকচার।  যেমন, Array, Stack, Queue, List, HashTable,
দুই ধরণের ডেটা স্ট্রাকচার রয়েছে। একটা হচ্ছে Linear Data Structure, আরেকটি হচ্ছে Nonlinear Data Structure.

6.    Linear Data Structure and Nonlinear Data Structure

লিনিয়ার ডেটা স্ট্রাকচার হচ্ছে এমন এক ধরণের স্ট্রাকচার যা মেমরিতে sequence অনুযায়ী স্টোর হয়। এই স্ট্রাকচারের ডেটাগুলো একটার পর একটা সিরিয়াল্যি সাজানো থাকে। এই লিনিয়ার ডেটা স্ট্রাকচারের দুই ধরনের representation রয়েছে। একটা হচ্ছে Array. সোজা সাপটা ভাবে একই ডেটা টাইপের (int, float, double, char) ডেটাগুলো লাইন ধরে সাজানো থাকে অ্যারের মধ্যে। আরেকটা রিপ্রেজেন্টেশন হচ্ছে, লিস্টের element-গুলোর মধ্যকার সম্পর্ক। এর উদাহরন হচ্ছে Linked List.

নন লিনিয়ার ডেটা স্ট্রাকচারের উদাহরণ হিসেবে উল্লেখ করা যায় Tree স্ট্রাকচারের কথা। Tree-তে অ্যারের মত সিরিয়াল্যি ডেটা সাজানো থাকে না বা সম্ভবও না। কারণ এখানে root, শাখা-প্রশাখা ইত্যাদির হিসাব-নিকাশ রয়েছে।

7.    Array কী?

(Type Fixed and Size Fixed)
অ্যারেকে এক কথায় সংজ্ঞায়িত করতে চাইলে এভাবে বলা যায়, নির্দিষ্ট সংখ্যক ডেটা স্টোর করার জন্য একটা স্ট্রাকচার যেখানে শুধুমাত্র এক ধরণের ডেটাই সংরক্ষণ করা যায়। অর্থাৎ অ্যারের একটা নির্দিষ্ট সাইজ থাকবে। এই সাইজের চেয়ে বেশি ডেটা কোন অ্যারে স্টোর করতে পারবে না। আর একই ধরণের ডেটাই স্টোর করতে হবে। int type ডেটা স্টোর করতে চাইলে সেই অ্যারেতে শুধুমাত্র int type এর ডেটাই স্টোর করা যাবে। সেখানে int, float, double, char ইত্যাদি মিক্স করে স্টোর করা যাবে না। যদি int type একটা ১০০ সাইজের অ্যারে ডিক্লেয়ার করি তাহলে এই অ্যারেতে সর্বোচ্চ ১০০ টা int-ই স্টোর করা যাবে। অ্যারেকে ডিক্লিয়ার এবং ইনিশিয়ালাইজ করা হয় এভাবে।
Array Declaration
Int[] age = new int[100]
Array Initialization (insert)
age[0] = 45;
age[1] = 17;
age নামক অ্যারের প্রথম ইন্ডেক্সে একটা ভ্যালু (45) assign করা হয়েছে। এখানে 0, 1 হলো ইন্ডেক্স নাম্বার আর 45, 17 হলো ইন্ডেক্স ভ্যালু
এখন যদি আমরা এইজ ভ্যালুগুলো প্রিন্ট করতে চাই তবে আমাদের ফর লুপ চালাতে হবে।
for (int=i; i<age.Length; i++)
{
  Console.WriteLine(age[i]);
}
8.    Collection কী এবং কত প্রকার ও কী কী? অ্যারের সাথে এর পার্থক্য কী?
Collection হলো Array এর মতো একটি ক্লাস যেটি গ্রুপ অফ অব্জেকটস নিয়ে কাজ করার আরো বেশি ফ্ল্যাক্সিবল সুবিধা দিয়ে থাকে। তবে Array এর সাথে Collection এর মূল পার্থক্য হলো একটি Array Declaration এর সময়েই Array এর সাইজ সম্পর্কে বলে দিতে হয় কিন্তু একটি Collection এ আগেথেকেই তার সাইজ নির্ধারন করে দিতে হয় না। একটি Collection এর কোন নির্দিষ্ট পজিশানে যেমন আমরা Item এড করতে পারি তেমনি ডিলিট করতে পারি কিন্তু সেটা Array তে তা সম্ভব না।
Collection দুই প্রকারঃ
1.    Non-Generic
2.    Generic

 Non-generic                    Generic
  ArrayList    ------------->      List
  HashTable  ------------->      Dictionary
  SortedList   ------------->      SortedList
Stack        ------------->      Stack
  Queue       ------------->      Queue

9.   Implicitly Conversion Example:

ছোট সাইজ থেকে বড় সাইজে কনভার্ট করতে সহজ আর এটাই ইমপ্লিসিট কনভার্সান। গ্লাসের পানি বালতি ঢুকানো সহজ আর এটাও এর একটা উদাহরণ হতে পারে।

10.  Explicit Conversion Example:

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



11.  Authentication এবং Authorization এর মধ্যে পার্থক্য কি?
অথেন্টিকেশানঃ সে কি অথেন্টিক বা সঠিক বা ভ্যালিড ইউজার?

অথোরাইজেশানঃ সে কোন ধরনের ইউজার?