রাস্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে একটুখানি হ্যালো ওয়ার্ল্ড

রাস্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে একটুখানি হ্যালো ওয়ার্ল্ড

রাস্ট প্রোগ্রামিং ল্যাঙ্গুয়েজ দিয়ে একটুখানি হ্যালো ওয়ার্ল্ড

রাস্ট একটা সিস্টেম প্রোগ্রামিং ল্যাঙ্গুয়েজ যেটা ২০০৬ সালে গ্রেডন শখের বসে বানায়, উনার লিফটের ফার্মওয়্যার বারবার নষ্ট হয়ে যাচ্ছিলো, আর উনি লিফটে আটকে যাচ্ছিলেন। মানুষের শখ কি না করতে পারে? পরে মজিলা ২০১০ সালের দিকে স্পনসর করে। বিগত কয়েক বছরে স্ট্যাকঅভারফ্লোতে এটা সবচেয়ে পছন্দের ল্যাঙ্গুয়েজ ছিলো যাতে বোঝা যায় কি পরিমাণ মানুষ এটার দিকে ঝুঁকছে। কিন্তু এত পছন্দের ভাষা হবার পরেও প্রায় কেউ কেন কোড লিখেনা? রাস্ট অনেক অনেক জটিল সমস্যা সমাধান করে, আবার এই ভাষাটা শেখাটাও একটা সমস্যা 🙄 ।

আমি আজ চেষ্টা করবো রাস্টের দুই একটা ছোটখাট ব্যাপার আলোচনা করার জন্য। আজ যা আলোচনা হবে,

  1. রাস্ট নিয়ে মাতামাতি
  2. রাস্ট ইনস্টল করা এবং রাস্টের হ্যালো ওয়ার্ল্ড
  3. ওয়েবএসেম্বলির এক ঝলক
  4. রাস্ট কতটা ফাস্ট?
  5. রাস্ট শেখা কি কঠিন?
  6. শেষ কথা

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

রাস্ট নিয়ে মাতামাতি

শুরুতেই বলেছি স্ট্যাকঅভারফ্লোতে এ নিয়ে মানুষের আগ্রহ বেড়েই চলছে।

Techdiary: একদম উপরে দেখেন রাস্টের নাম লেখা। ২০১৬ হতেই এমন অবস্থা।

একদম উপরে দেখেন রাস্টের নাম লেখা। ২০১৬ হতেই এমন অবস্থা।

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

মেমোরি নিয়ে আপনার মাথাব্যাথা না থাকলেও টিল্ড কোম্পানীর ছিলো। তারা একটা জাভা প্রোগ্রামের কিছু অংশ রাস্টে নিয়ে যায় আর ৫ জিবি মেমোরি হতে সেটাকে ৫০ এম্বি করে ফেলে। এতে একটু একটু করে হলেও অনেক টাকা বেঁচে যায়।

নোমের অনেক লাইব্রেরিই রাস্টে একটু একটু করে লেখা হচ্ছে। হয়তো আগে সি দিয়ে লেখা ছিলো এখন রাস্টে লেখা হচ্ছে। librsvg নামের লাইব্রেরি রাস্টে নিয়ে যাওয়া নিয়ে লেখালেখি হয়। এইটা এমন একটা লাইব্রেরি যেটা GIMP, ImageMagick, Wikipedia, Darktable সহ বড় বড় প্রজেক্টে ব্যবহার করা হয়।

কিছুদিন আগে ডিসকর্ড গো হতে রাস্টে চলে যায়। গো তাদের পারফরমেন্স টার্গেট মিট করতে পারেনি। এমন না যে গো খারাপ, কিন্তু তাদের নির্দিষ্ট যে কোড ছিলো এতে একটু পরপরই সিপিউ স্পাইক করতো। ওই সময় গো এর মেমোরি বিষয়ক একটা ব্যাপার ছিলো। রাস্টে রানটাইম, গার্বেজ কালেকটর এইসব নাই বলে মেমোরি আর সিপিউর ওই স্পাইকটা হয়নি।

কদিন আগে এটাও বের হলো কিছু কিছু বেন্চমার্কে রাস্ট, সি হতেও বেশি স্পিড দেখাচ্ছিলো

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

এইত কয়েকদিন আগেই ফেসবুকও রাস্ট নিয়ে পোস্ট লিখলো। তারা সেই ২০১৬ হতে একটু একটু করে রাস্ট ব্যবহার শুরু করে। ২০১৭ এর দিকে তাদের জাভাস্ক্রিপ্ট আর পাইথন ডেভেলপাররা রাস্টের প্রশংসা শুরু করে। ২০১৯ এর দিকে ফেসবুকে প্রায় ১০০ জনের মত ডেভেলপার হয় যারা রাস্ট নিয়ে ঘাটাঘাটি করে। এর বেশিরভাগই তাদের Diem নামের ব্লকচেইনের জন্য। ২০২০ এর শেষের দিকে তারা একটা রাস্ট টিম তৈরি করে যারা একদম জটিল জটিল বিষয়গুলো দেখবে যেগুলো আগে সি++ দিয়ে করা হতো।

এটা দিয়ে রিডক্স নামে একটা অপারেটিং সিস্টেম পর্যন্ত লেখা হয়েছে। কিভাবে রাস্ট দিয়ে একটা অপারেটিং সিস্টেম লেখা হয় তা নিয়ে অসাধারণ রিসোর্সগুলোর একটা হলো ফিলের অপারেটিং সিস্টেম

মাতামাতির কি শেষ আছে?

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

যাক সমস্যাও আছে সমাধানও আছে। আসেন আমরা রাস্ট নিয়ে একটু দেখি।

রাস্ট ইন্সটল করা

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

sudo apt-get update
sudo apt-get -y upgrade

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

ইন্সটল হয়ে গেলে রাস্ট অনেকভাবে চালানো যায়।

প্রথমে আমরা একটা main.rs ফাইল তৈরি করি। আর ভিতরে কোডটা লিখি।

fn main() {
  println!("Hello, world!");
}

এই কোডটা বোঝানোর মত তেমন কিছু নাই। এটাকে কোনভাবে রান করতে পারলে আমাদেরকে হ্যালো পৃথিবী বলবে।

এটা বিল্ড করার জন্য আমরা নিচের কমান্ড লিখবো। বিল্ড করার পর আমরা রান করতে পারবো।

rustc main.rs

লিখলে একটা main নামে ফাইল তৈরি হবে একই ফোল্ডারে। ওটাকে আমরা চালাবো।

./main
Hello, world!

এইত আমরা রাস্ট শিখে ফেললাম! 😂

ডেভেলপমেন্ট ত এত অল্প না। এখানে ডেভেলপ করার আরেক উপায় হলো কার্গো ব্যবহার করা।

cargo new hello
cd hello

ভিতরে সে আগেই একটা src/main.rs তৈরি করে দিবে আমাদের জন্য। আমরা মেইন ফোল্ডারে cargo run লিখতে পারি, যাতে ও কম্পাইল করে মেইন ফাইলটা রান করে দেখায়।

cargo run
Hello, world!

অথবা শুধু বিল্ড করে পরে রান করতে পারি কিংবা বিল্ড করা ফাইলটাকে আমরা ছোট করতে পারি।

cargo build
target/debug/hello

এখানে রিলিজ বিল্ড সহ আরো অনেক রকম বিল্ড আছে আমরা এতকিছুতে এখন না যাই। হ্যালো ওয়ার্ল্ড যেহেতু হয়েছে বাকিটুকুও হবে।

ওয়েবএসেম্বলির এক ঝলক

ওয়েব এসেম্বলি নিয়ে বাংলা লেখালেখি হয়না বললেই চলে। নেট ঘেঁটে একটা দুইটা পোস্ট পাওয়া যায়, যেমন Cyan Tarek ভাই গো দিয়ে ওয়েব এসেম্বলির কিছু ব্যাপার দেখিয়েছেন, সুমিত ভাই ওয়েবএসেম্বলি নিয়ে একটি ভিডিও তৈরি করেছেন

ওদিকে যাবার আগে রাস্ট দিয়েও একটু দেখেন। আমরা রাস্ট দিয়ে সহজে একটা ওয়েব এসেম্বলি এপ লিখতে পারি। প্রথমে wasm নিয়ে কিছু প্রিপেরেশনের ব্যাপার আছে, ওই টুলগুলা ইন্সটল করে নিই। আমাদের লক্ষ্য হবে wasm32 টার্গেট আর nightly টুলচেইন ব্যবহার করা। এগুলা কি সেগুলা নি পরে ভাবলেও চলবে।

rustup target add wasm32-unknown-unknown
rustup override set nightly
rustup target add wasm32-unknown-unknown --toolchain nightly

এরপর আমরা একটা লাইব্রেরি তৈরি করবো।

cargo new --lib triple
cd triple

এরপর Cargo.toml নামের ফাইলটা এডিট করে [lib] নামের একটা অংশ যোগ করবো।

[lib]
name = "triple_lib"
path = "src/lib.rs"
crate-type =["cdylib"]

এরপর আমরা src/lib.rs ফাইলটা এডিট করবো। এখানে একটা সংক্ষিপ্ত ফাংশন আছে যেটা একটা সংখ্যাকে তিন দিয়ে গুণ করে আমাদের দিবে।

#[no_mangle]
pub extern fn triple(x: i32) -> i32 {
  return 3 * x;
}

এটাকে আমরা wasm দিয়ে বিল্ড করবো।

cargo +nightly build --target wasm32-unknown-unknown --release

একটা wasm ফাইল পেয়ে গেলাম। vscode এ webassembly এর একটা এক্সটেনশন ‍‍dtsvet.vscode-wasm ইন্সটল করে wasm ফাইলটা চালু করলে সে আমাদের wat নামে একটি ভাষায় ডাটাগুলো দেখাবে।

(module
  (type $t0 (func (param i32) (result i32)))
  (func $triple (type $t0) (param $p0 i32) (result i32)
    local.get $p0
    i32.const 3
    i32.mul)
  (table $T0 1 1 funcref)
  (memory $memory 16)
  (global $g0 (mut i32) (i32.const 1048576))
  (global $__data_end i32 (i32.const 1048576))
  (global $__heap_base i32 (i32.const 1048576))
  (export "memory" (memory 0))
  (export "triple" (func $triple))
  (export "__data_end" (global 1))
  (export "__heap_base" (global 2)))

এটা দেখতে খুব অদ্ভুত না? এটাকে রাস্ট দিয়ে না লিখে অন্যান্য অনেক ল্যাঙ্গুয়েজ দিয়ে লিখা যায়, এমনকি এটা কোন ল্যাঙ্গুয়েজ ছাড়া সরাসরিও লিখা যায়, তবে রাস্ট আর গো এর মত ভাষা থাকতে এখন এত ঝামেলায় কে যাবে?

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

তো, শুরুতে আমরা একটা html ফোল্ডারে এই wasm ফাইলটা নিবো।

mkdir html
cp target/wasm32-unknown-unknown/release/triple_lib.wasm html/

এরপর html ফোল্ডারে index.html নামে একটা ফাইল তৈরি করবো। ওখানে কিছু জাভাস্ক্রিপ্ট কোডও লিখবো।

এখন আমরা এটাকে একটা সার্ভারে রান করতে পারি। ধরে নিলাম আমার নোডজেএস ইন্সটল করা আছে।

npx server

ব্রাউজার চালু করে localhost:5000 এ গেলে আমরা ৩০ দেখতে পাবো যেটার কোড আমরা রাস্ট দিয়ে লিখেছি কিন্তু পরে সেটা ওয়েব এসেমব্লির ফাইলে রূপান্তর হয়েছে।

Techdiary: article-image

আরো কত কিছু যে করা যায় তার শেষ নাই।

রাস্ট কতটা ফাস্ট?

রাস্ট, গো, নিম, ক্রিস্টাল এইসব ল্যাঙ্গুয়েজ সি বা সি++ এর কাছাকাছি পারফরম্যান্স দেয় কিন্তু কোড সিনট্যাক্স সি বা সি++ হতে অনেক বেশি গুণ সহজ।

যেকোন প্রোগ্রাম কতটা ফাস্ট তা চেক করতে অনেক উপায় আছে যার মধ্যে বহুল প্রচলিত একটা উপায় হলো ফিবোনাচি নাম্বার বের করা। নরমাল একটা এলগোরিদম দিয়ে ৪০ পর্যন্ত ফিবোনাচি বের করতে বললে ব্রাউজার ১-২ সেকেন্ডের জন্য হ্যাং হয়ে যায়।

তো প্রথমে আমরা src/lib.rs ফাইলটা এডিট করে ফিবোনাচির ফাংশন যোগ করি।

#[no_mangle]
pub extern fn fib(n: i32) -> i32 {
  if n <= 1 { return 1 }
  fib(n - 1) + fib(n - 2)
}

এরপর src/main.rs ফাইল তৈরি করে ওখানে উপরের lib ফাইলের ফাংশনটা ব্যবহার করি। এটা করবে কি, এটা ফিবোনাচি ৪০ সংখ্যা পর্যন্ত বের করতে কত সময় লেগেছে তা বলবে।

use std::time::Instant;

mod lib;

fn main() {
  let now = Instant::now();

  println!("{}", lib::fib(40));

  println!("{}", now.elapsed().as_millis());
}

এখন এটাকে যদি আমরা রান করি তাহলে কেমন হবে?

cargo +nightly run --release
....Finished release [optimized] target(s) in 0.00s
....Running `target/release/fib`
165580141
217

৪০ তম ফিবোনাচি হলো 165580141, আর এটা বের করতে ওর সময় লেগেছে ২১৭ মিলিসেকেন্ড।

এবার আসি ব্রাউজারে। আমাদের ওই index.html ফাইলে আমরা একটা জাভাস্ক্রিপ্ট ফাংশন এড করি আর রাস্টের ফাংশনের নামটাও চেন্জ করে নিই। অবশ্যই এর আগে আমাদের wasm ফাইলটা বিল্ড করে নিতে হবে যেটা একটু আগে করেছিলাম triple এর জন্য।

var fibJS = function (n) {
  if (n <= 1) {
    return 1;
  }
  return fibJS(n - 1) + fibJS(n - 2);
};

(async () => {
  // অন্যান্য কোড
  const fibRust = exports.fib;

  console.time('Calculate in Rust via WASM');
  console.log(`fibRust(40)`, fibRust(40));
  console.timeEnd('Calculate in Rust via WASM');

  console.time('Calculate in JS');
  console.log(`fibJS(40)`, fibJS(40));
  console.timeEnd('Calculate in JS');
})();

ব্রাউজারে গেলে এবার এটা এক দুই সেকেন্ডের জন্য হ্যাং করতে পারে যেহেতু ওকে একটা বড় কাজ দিয়েছি। কিন্তু কাজটা শেষে ও আমাকে কি বললো?

fibRust(40) 165580141
Calculate in Rust via WASM: 606.658935546875 ms

fibJS(40) 165580141
Calculate in JS: 1261.844970703125 ms

ও বলছে ওয়েব এসেম্বলির সময় লেগেছে ৬০০ মিলিসেকেন্ড, আর জাভাস্ক্রিপ্টের সময় লেগেছে ১২৬১ মিলিসেকেন্ড 😯 ! তো মূল রাস্টে সময় লাগলো ২১৭ মিলিসেকেন্ডের মত, আর জাভাস্ক্রিপ্টের লাগলো তার চেয়ে কয়েক গুণ বেশি সময়? কেনই বা মানুষ রাস্ট, গো এইসবের দিকে ঝুঁকবে না?

রাস্ট শেখা কি কঠিন?

যারা ডাইনামিকালি টাইপড ল্যাঙ্গুয়েজ যেমন জাভাস্ক্রিপ্ট, পাইথন এসব হতে আসছেন, তাদের কাছে যেকোন স্ট্যাটিক টাইপড ল্যাঙ্গুয়েজই কঠিন মনে হবে। প্রোগ্রামিং শেখার শুরুতে এটা নিয়ে মাথা ব্যাথা না হলেও পরবর্তীতে বড় প্রজেক্টে মাথা ব্যাথা ঠিকই শুরু হয়। দুই চারজন একসাথে যখন কাজ করা শুরু করে, একজন অবজেক্ট লিখে আরেকজন স্ট্রিং লিখে, একটা জায়গায় ডাটা দিতে গিয়ে ভুলে আনডিফাইন্ড দিয়ে, বাগ ডিবাগ করতে মাথার চুল ছিড়ে ফেলে একসময় বাধ্য হয় jsdoc, typescript, python type hints এসবের দিকে ঝুঁকতে। স্ট্যাটিক টাইপ ভাষাগুলো কম্পাইল হবার সময়ই অনেক কিছু চেক করে। ডাটা ঠিকমত এলো কিনা, ঠিকমত প্রসেস হবে কিনা, কোথাও ভুল বোঝাবুঝি হবে কিনা ইত্যাদি।

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

যাই হউক। রাস্টে কিছু করতে গেলে আপনাকে None চেক করার একটা সুযোগ দেয়া হয়। ধরেন, আমি একটা ফাংশনে কোন একটা ভ্যালু দিলাম না। না দিলে কি হবে তা হয়তো জাভাস্ক্রিপ্টে try {} catch {} দিয়ে বলা লাগবে। রাস্টে এই কাজটা এমনভাবে করা যেন ওকে যদি বলি আমার ভ্যালুটা স্ট্রিং হতে হবে, ও স্ট্রিং না হলে কি হবে তা বলতে বলবে।

fn hello(name: Option) {
  match name {
    Some(name) => println!("Hello, {}!", name),
    None => println!("Hello Human!"),
  }
}

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

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

রাস্ট ভুল দেখলেই চেঁচানো শুরু করবে। শুরুতে বেশ বিরক্ত লাগবে। কিন্তু একটু দেখেন, ও বলে দিবে কোথায় সমস্যা, কেন সমস্যা, কোন কোন ডকুমেন্টেশন পড়লে সমস্যার সমাধান হবে।

Techdiary: article-image

অনেকে ত এই এরর মেসেজগুলো দিয়েই রাস্ট শিখে ফেলে। মাসখানেক সময় লাগে, কিন্তু একবার শিখে ফেলতে পারলে এ নিয়ে মাতামাতি শুরু করে দেয় 😁 ।

শেষকথা

রাস্টে হ্যালো ওয়ার্ল্ড লিখে আমরা যদি সিভিতে রাস্ট ডেভেলপার কথাটা লিখে ফেলি তাহলে কিন্তু হবে না। যেকোন কিছু শিখতে গেলে সময় দিতে হয়। শুধু একটা ল্যাঙ্গুয়েজ পেলেন আর হুট করে দৌড় দিলেন, এতে হবেনা। আমাদেরকে প্রচুর পড়তে হবে। আমরা Rust By Example আর এটার এক্সটেন্ডেড ভার্সন বইটা পড়তে পারি। এখানে বেশিরভাগ কোড সরাসরি রান করা যায়, তাই পড়বেন আর রান করবেন ঝামেলা ছাড়া।

বেশি বেশি পড়বেন। নতুন নতুন বিষয় শিখবেন। যত শিখবেন তত মজা পাবেন।