অক্সিজিন

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

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

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

২০০৮ থেকে ২০১২ সাল পর্যন্ত রেমঅবজেক্টস সফটওয়্যার তাদের কম্পাইলার এবং আইডিই প্রযুক্তি এমবারকাডেরো-কে লাইসেন্স করেছিল, যা তাদের এমবারকাডেরো প্রিজম পণ্যে ব্যবহৃত হয়েছিল। ২০১১ সালের শরৎ থেকে অক্সিজিন দুটি পৃথক সংস্করণে উপলব্ধ হয়, যেখানে দ্বিতীয় সংস্করণটি জাভা এবং অ্যান্ড্রয়েড রানটাইমগুলির জন্য সমর্থন যোগ করে। এক্সই৪ সংস্করণের রিলিজ থেকে, এমবারকাডেরো প্রিজম *রেড স্টুডিও স্কু*-এর অংশ নয়। প্রিজম গ্রাহকদের অক্সিজিনে স্থানান্তর করার জন্য বিভিন্ন সহায়তা এবং আপগ্রেড পথ উপলব্ধ রয়েছে। ২০১৬ সালের হিসাবে, অক্সিজিনের শুধুমাত্র একটি সংস্করণ রয়েছে, যা উইন্ডোস বা ম্যাকওএস-এ ডেভেলপমেন্টের সুযোগ দেয় এবং উইন্ডোস, লিনাক্স, ওয়েব অ্যাসেম্বলি .নেট, আইওএস, এন্ড্রয়েড, জাভা এবং ম্যাকওএস এর জন্য এক্সিকিউটেবল তৈরি করতে সক্ষম।

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

অক্সিজিন একটি অবজেক্ট-ওরিয়েন্টেড ভাষা, অর্থাৎ এটি ক্লাস ব্যবহার করে প্রোগ্রাম ডিজাইন করে, যা ডেটা ধারণ করতে পারে এবং কোড কার্যকর করতে পারে। ক্লাস হল বস্তুগুলির জন্য একটি "প্রোটোটাইপ", যেমন আপেলের ধারণাটি সেই আপেলের প্রোটোটাইপ, যা কেউ দোকানে কিনতে পারে। জানা যায় যে একটি আপেলের একটি রঙ আছে, এবং এটি খোসা ছাড়ানো যেতে পারে: এগুলি আপেল ক্লাসের ডেটা এবং কার্যকর "কোড"।

অক্সিজিন কিছু সমান্তরাল প্রোগ্রামিং বৈশিষ্ট্যের জন্য ভাষা স্তরে সমর্থন প্রদান করে। এর লক্ষ্য হল কম্পিউটারের সব কোর বা প্রসেসর ব্যবহার করে কর্মদক্ষতা বাড়ানো। এই লক্ষ্য অর্জনের জন্য বিভিন্ন থ্রেডের মধ্যে কাজগুলি বিতরণ করতে হয়। .নেট ফ্রেমওয়ার্ক-এর `ThreadPool` ক্লাস বিভিন্ন থ্রেডের সাথে দক্ষতার সাথে কাজ করার একটি উপায় প্রদান করেছিল। .নেট ৪.০ এ টাস্ক প্যারালাল লাইব্রেরি (টিপিএল) প্রবর্তন করা হয়, যা সমান্তরাল প্রোগ্রামিংয়ের জন্য আরও বৈশিষ্ট্য প্রদান করে।

অক্সিজিনে `class operator` সিনট্যাক্স ব্যবহার করে অপারেটর ওভারলোড করা যায়:


```delphi
class operator implicit(i : Integer) : MyClass;
```


অপারেটর ওভারলোডিং-এর ক্ষেত্রে প্রতিটি অপারেটরের একটি নাম থাকে, যা অপারেটর ওভারলোডিং সিনট্যাক্সে ব্যবহার করতে হয়, কারণ উদাহরণস্বরূপ "+" অক্সিজিনে একটি বৈধ মেথড নাম হিসাবে গ্রহণযোগ্য নয়।

### প্রোগ্রাম কাঠামো
অক্সিজিন ডেলফির মতো "ইউনিটস" ব্যবহার করে না, বরং .নেট নেমস্পেস ব্যবহার করে টাইপগুলোকে সংগঠিত এবং গ্রুপ করে। একটি নেমস্পেস একাধিক ফাইল (এবং অ্যাসেম্বলি) জুড়ে বিস্তৃত হতে পারে, তবে একটি ফাইলে শুধুমাত্র একটি নেমস্পেসের টাইপ থাকতে পারে। ফাইলের শীর্ষে এই নেমস্পেসটি সংজ্ঞায়িত করা হয়:
 
 namespace ConsoleApplication1;

অক্সিজিন ফাইলগুলোকে একটি ইন্টারফেস এবং একটি ইমপ্লিমেন্টেশন সেকশনে বিভক্ত করে, যা ডেলফি থেকে পরিচিত একটি কাঠামো। নেমস্পেস ঘোষণার পরে ইন্টারফেস সেকশনটি আসে। এটি `uses` ক্লজ ধারণ করে, যা অক্সিজিনে অন্যান্য নেমস্পেস থেকে টাইপ আমদানি করে:

```delphi
uses
  System.Linq;
```

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

`uses` ক্লজের পরে ফাইলে টাইপ ডিক্লারেশন থাকে, যা ডেলফি থেকে পরিচিত:

```delphi
interface

type
  ConsoleApp = class
  public
    class method Main;
  end;
```

সি শার্পের মতো, মেইন মেথড প্রতিটি প্রোগ্রামের প্রবেশ বিন্দু। এটি একটি প্যারামিটার `args : Array of String` নিতে পারে, যা প্রোগ্রামে কমান্ড লাইন আর্গুমেন্ট পাস করতে ব্যবহৃত হয়।

আরও টাইপ ঘোষণা করা যেতে পারে `type` কীওয়ার্ড পুনরাবৃত্তি ছাড়াই।

ঘোষিত মেথডগুলির ইমপ্লিমেন্টেশন ইমপ্লিমেন্টেশন সেকশনে স্থাপন করা হয়:

```delphi
implementation

class method ConsoleApp.Main;
begin
  // এখানে আপনার নিজস্ব কোড যোগ করুন
  Console.WriteLine('Hello World.');
end;

end.
```

ফাইলগুলো সবসময় `end.` দিয়ে শেষ করা হয়।

### টাইপসমূহ
.নেট ভাষা হিসেবে অক্সিজিন .নেট টাইপ সিস্টেম ব্যবহার করে: এখানে ভ্যালু টাইপ (যেমন struct) এবং রেফারেন্স টাইপ (যেমন array বা class) রয়েছে।

অক্সিজিন নিজস্ব "প্রি-ডিফাইন্ড" টাইপ সরবরাহ না করলেও, এটি কিছু টাইপের জন্য আরও "প্যাসকালিশ" জেনেরিক নাম সরবরাহ করে, যেমন `System.Int32` কে `Integer` নামে ব্যবহার করা যায় এবং `Boolean` (`System.Boolean`), `Char` (`System.Char`), `Real` (`System.Double`) পাসক্যাল টাইপের অংশ হিসেবে ব্যবহার করা যায়। .নেট এর অংশ হিসেবে এই টাইপগুলির struct চরিত্র পুরোপুরি সংরক্ষিত থাকে।

সব .নেট ভাষার মতো, অক্সিজিনে টাইপের একটি ভিজিবিলিটি থাকে। অক্সিজিনে ডিফল্ট ভিজিবিলিটি হলো `assembly`, যা সি শার্পের `internal` ভিজিবিলিটির সমান। অন্যান্য সম্ভব টাইপ ভিজিবিলিটি হলো `public`।

```delphi
type
  MyClass = public class
end;
```

প্রতিটি সংজ্ঞায়িত টাইপের (যেমন class, interface, record) জন্য ভিজিবিলিটি নির্ধারণ করা যায়।

টাইপের জন্য একটি এলিয়াস নাম সংজ্ঞায়িত করা যায়, যা স্থানীয়ভাবে বা অন্যান্য অক্সিজিন অ্যাসেম্বলি-তে ব্যবহার করা যেতে পারে।

```delphi
type
  IntList = public List<Integer>; //অন্যান্য অক্সিজিন অ্যাসেম্বলিতে দৃশ্যমান
  SecretEnumerable = IEnumerable<String>; //অন্যান্য অ্যাসেম্বলিতে দৃশ্যমান নয়
```

পাবলিক টাইপ এলিয়াস অন্যান্য ভাষার জন্য দৃশ্যমান হবে না।

#### রেকর্ডস
রেকর্ড হল অক্সিজিনে .নেট struct এর সমতুল্য। এগুলো ক্লাসের মতোই ঘোষণা করা হয়, তবে `record` কীওয়ার্ড ব্যবহার করে:

```delphi
type
  MyRecord = record
    method Foo;
  end;
```

এগুলো .নেট struct হিসেবে ব্যবহৃত হয়, তাই রেকর্ডে ফিল্ড, মেথড এবং প্রপার্টি থাকতে পারে, তবে এগুলোতে ইনহেরিটেন্স নেই এবং কোনো ইন্টারফেসও ইমপ্লিমেন্ট করতে পারে না।

### ইন্টারফেসেস
.নেট গ্লোবাল ইন্টারফেস একটি খুব গুরুত্বপূর্ণ প্লাটফর্ম, এবং ফ্রেমওয়ার্ক নিজেই এগুলোর ব্যাপকভাবে ব্যবহার করে। ইন্টারফেস হল কিছু মেথড, প্রপার্টি এবং ইভেন্টের একটি নির্দিষ্টকরণ, যা ইন্টারফেসটি ইমপ্লিমেন্ট করার সময় একটি ক্লাসকে বাস্তবায়ন করতে হয়। যেমন, `IEnumerable<T>` ইন্টারফেসটি `GetEnumerator` মেথডটি নির্দিষ্ট করে, যা সিকোয়েন্সগুলির উপর পুনরাবৃত্তি করতে ব্যবহৃত হয়।

ইন্টারফেস ক্লাসের মতোই ঘোষণা করা হয়:

```delphi
type
  MyInterface = public interface
    method MakeItSo : IEnumerable;
    property Bar : String read write;
  end;
```

প্রপার্টির ক্ষেত্রে গেটার এবং সেটার নির্দিষ্ট করা থাকে না।

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

অক্সিজিন অ্যানোনিমাস ডেলিগেট তৈরি করতে পারে; উদাহরণস্বরূপ, মেথডগুলোকে `Invoke` মেথডে পাস করা যায় ডেলিগেট ঘোষণা ছাড়াই:

```delphi
method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs);
begin
  Invoke(@DoSomething);
end;
```

কম্পাইলার মেথড `DoSomething` এর সিগনেচার সহ একটি অ্যানোনিমাস ডেলিগেট তৈরি করবে।

অক্সিজিন পলিমরফিক ডেলিগেট সমর্থন করে, যার অর্থ হল ডেলিগেটগুলোর প্যারামিটার হিসেবে নিচের টাইপের উপাদান থাকলে সেগুলো অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ হয়। ধরুন দুটি ক্লাস `MyClass` এবং `MyClassEx = class(MyClass)`, তাহলে নিচের কোডে `BlubbEx` হল `Blubb` এর অ্যাসাইনমেন্ট-সামঞ্জস্যপূর্ণ।

```delphi
type
  delegate Blubb(sender : Object; m : MyClass);
  delegate BlubbEx(sender : Object; mx : MyClassEx);
```


ফিল্ডগুলো একটি ইন্টারফেসের ইমপ্লিমেন্টেশন ডেলিগেট করতে ব্যবহার করা যেতে পারে, যদি টাইপটি সেই ইন্টারফেসটি ইমপ্লিমেন্ট করে:

```delphi
Implementor = public class(IMyInterface)
  // ... ইন্টারফেস ইমপ্লিমেন্টেশন ...
end;

MyClass = public class(IMyInterface)
  fSomeImplementor : Implementor; public implements IMyInterface; //ইন্টারফেস ইমপ্লিমেন্টেশনের যত্ন নেয়
end;
```

এই উদাহরণে কম্পাইলার `MyClass` এ পাবলিক মেথড এবং প্রপার্টি তৈরি করবে, যা `fSomeImplementor` এর মেথড/প্রপার্টি কল করবে, IMyInterface এর সদস্যদের ইমপ্লিমেন্ট করার জন্য। এটি মিক্সিন-জাতীয় ফাংশনালিটি প্রদান করতে ব্যবহার করা যেতে পারে।

### অ্যানোনিমাস মেথড
অ্যানোনিমাস মেথডগুলো অন্যান্য মেথডের ভিতরে বাস্তবায়িত হয়। এগুলো বাইরে থেকে প্রবেশযোগ্য নয়, যদি না এগুলো ডেলিগেট ফিল্ডের ভিতরে সংরক্ষিত থাকে। অ্যানোনিমাস মেথডগুলো সেই মেথডের লোকাল ভেরিয়েবল এবং তাদের নিজ ক্লাসের ফিল্ডগুলো ব্যবহার করতে পারে, যেখানে এগুলো বাস্তবায়িত হয়।

অ্যানোনিমাস মেথডগুলো বিশেষভাবে কার্যকর যখন গুই (GUI) থ্রেডে কোড কার্যকর করা প্রয়োজন, যা .নেট-এ মেথডটি `Invoke` মেথডে পাস করে সম্পন্ন করা হয় (WinForms এ `Control.Invoke`, WPF এ `Dispatcher.Invoke`):

```delphi
method Window1.PredictNearFuture;  //ইন্টারফেসে async হিসেবে ঘোষণা করা হয়েছে
begin
  // ... ফলাফল এখানে গণনা করা হয় এবং "theFuture" ভেরিয়েবলে সংরক্ষিত থাকে
    Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, method; begin
      theFutureTextBox.Text := theFuture;
    end);
end;
```


অ্যানোনিমাস মেথডগুলোতেও প্যারামিটার থাকতে পারে:

```delphi
method Window1.PredictNearFuture;  //ইন্টারফেসে async হিসেবে ঘোষণা করা হয়েছে
begin
  // ... ফলাফল এখানে গণনা করা হয় এবং "theFuture" ভেরিয়েবলে সংরক্ষিত থাকে
    Dispatcher.Invoke(DispatcherPriority.ApplicationIdle, method(aFuture : String); begin
      theFutureTextBox.Text := aFuture ;
    end, theFuture);
end;
```


উভয় সোর্স কোডেই অ্যানোনিমাস ডেলিগেট ব্যবহার করা হয়েছে।

### প্রপার্টি নোটিফিকেশন
প্রপার্টি নোটিফিকেশন মূলত ডেটা বাইন্ডিংয়ের জন্য ব্যবহৃত হয়, যখন GUI-কে জানতে হয় যে কোনো প্রপার্টির মান পরিবর্তিত হয়েছে। .নেট ফ্রেমওয়ার্ক এই উদ্দেশ্যে `INotifyPropertyChanged` এবং `INotifyPropertyChanging` (যা .নেট 3.5-এ প্রবর্তিত হয়েছে) ইন্টারফেস সরবরাহ করে। এই ইন্টারফেসগুলোতে ইভেন্ট থাকে, যা তখন ফায়ার করতে হয় যখন কোনো প্রপার্টি পরিবর্তিত হয় বা পরিবর্তিত হওয়ার পর।

অক্সিজিন `notify` মডিফায়ার সরবরাহ করে, যা প্রপার্টির উপর ব্যবহার করা যায়। যদি এই মডিফায়ার ব্যবহার করা হয়, তবে কম্পাইলার ক্লাসের সাথে ইন্টারফেসগুলো যুক্ত করবে, সেগুলো ইমপ্লিমেন্ট করবে এবং প্রপার্টি পরিবর্তিত হওয়ার সময় ইভেন্টগুলো বাড়ানোর জন্য কোড তৈরি করবে।


```delphi
property Foo : String read fFoo write SetFoo; notify;
property Bar : String; notify 'Blubb'; // "Bar" এর পরিবর্তে প্রপার্টি "Blubb" পরিবর্তিত হয়েছে বলে জানানো হবে
```


মডিফায়ারটি সেই প্রপার্টিগুলোর উপর ব্যবহার করা যেতে পারে, যেগুলোর একটি সেটার মেথড থাকে। কোডটি কম্পাইল সময়ে এই মেথডে ইভেন্ট বাড়ানোর জন্য যোগ করা হবে।

বিষয়শ্রেণী:প্রোগ্রামিং ভাষা