This blog post originally appeared on azul.com: https://www.azul.com/blog/9-outdated-ideas-about-java/
জাভা প্রথম রিলিজ হয় ১৯৯৫ সালে। তখন থেকে এই সময় পর্যন্ত সফটওয়্যার ও হার্ডওয়্যার জগতে উল্লেখযোগ্য পরিবর্তন এসেছে। হার্ডওয়্যার পরিবর্তন ও সফটওয়্যার পরিবর্তন একে অপরের উপর সামন প্রভাব ফেলে চলেছে। শক্তিশালী প্রসেসরের প্রাপ্যতা এবং সাশ্রয়ী মূল্যের মেমোরি সফটওয়্যার কে আরো দ্রুত গতির ও পূর্বের থেকে আরো অনেক বেশি কাজ করার সক্ষমতা দিয়েছে।
Azul ডেপুটি CTO সাইমন রিটার বলেছেন,
“জাভা নতুন COBOL হওয়ার কোন সম্ভাবনা নেই । কেননা এখন ছয় মাস অন্তর অন্তর রিলিজ ক্যাডেন্সের অধীনে এই প্ল্যাটফর্মে সবসময় নতুন বৈশিষ্ট্য যুক্ত হচ্ছে, আমরা জাভাকে আগের চেয়ে আরো দ্রুত বিকশিত হতে দেখছি। “
এই প্রবন্ধে আমরা জাভা নিয়ে কিছু ভ্রান্ত ও পুরোনো ধারণা নিয়ে আলোকপাত করতে চাই।
১. জাভা সেকেলে এবং এতে তো বিবর্তন লক্ষ্য করা যায় না
অনেকেই মনে করেন যে জাভা অনেক পুরোনো। তবে মজার ব্যাপার হচ্ছে জাভা ও পিএচইপি একই বয়সী এবং পাইথন জাভা থেকে আরো চার বছর আগে রিলিজ পায়।
এই পুরোনো ধারণার কারণ হতে পারে ২০১৮ সালের আগে জাভার কোনো নির্দিষ্ট রিলিজ সাইকেল ছিল না। যখন নির্ধারিত ফিচার এর কাজ শেষ হতো কেবল তখন নতুন জাভা ভার্সন রিলিজ দেওয়া হতো। কিন্তু ২০১৮ সাল থেকে এটির পরিবর্তন ঘটেছে। জাভা ছয় মাসের রিলিজ সাইকেলে মুভ করেছে। নির্দিষ্ট সময়, ছয় মাস অন্তত জাভার সব নতুন নতুন ফিচার রিলিজ দেওয়া হয়। এইসব ফিচার গুলো জাভা কমিউনিটি এর মাধ্যমে প্রচুর পরীক্ষা নিরীক্ষা করে তার পরেই কেবল রিলিজ দেওয়া হয়। সাথে কিছু এক্সপেরিমেন্টাল ফিচার ও যুক্ত করা হয় নতুন রিলিজে। এক্সপেরিমেন্টাল ফিচার প্রোডাকশনে ব্যবহার করতে পরামর্শ দেওয়া হয় না , বরং ডেভলপাররা যাতে আগেই একটু এগুলো নিয়ে ঘাঁটাঘাঁটি করতে পারে, প্রয়োজনে ফিডব্যক দিতে পারে এ জন্য যুক্ত করা হয়।
এই নতুন পদ্ধতি অবশ্যই ধন্যবাদ দাবি করে । কেননা প্রত্যেকটি নতুন সংস্করণ কোডিং এ উন্নতি ও এক্সট্রা পারফরম্যান্স বয়ে আনে। এবং যেহেতু OpenJDK-তে পশ্চাদমুখী সামঞ্জস্যতা(backward compatibility) খুব ভালোভাবে গুরুত্ব দেয়, তাই বেশির ভাগ সময়ই আগের লিখা অ্যাপ্লিকেশনগুলিকে নতুন JDK-এর সাথে কোড পরিবর্তন ছাড়াই চালানো যায়। এর ফলে নতুন করে পরিশ্রম ছাড়াই , স্টার্ট-আপ সময়ের হ্রাস, কম মেমরি ব্যবহার ও JDK এর নতুন সংস্করণের অফার করা আরও ভাল Garbage collection এর সুবিধা নেওয়া যায়।
নিচে OpenJDK সংস্করণের কিছু পরিবর্তনের খুব সংক্ষিপ্ত একটি বিবরণ দেওয়া হলো —
Version | Changes |
OpenJDK 19 | New preview features: - Virtual threads - Pattern matching for switch |
OpenJDK 18 | - Switch expressions further extended |
OpenJDK 17 | - Sealed Types |
OpenJDK 16 | - Record classes - Pattern matching for instanceof |
OpenJDK 15 | - Text blocks |
OpenJDK 14 | - Helpful nullpointerexceptions - Streaming from running application to Flight Recorder - Java Packager (jpackage) - Pattern matching, see “Use Pattern Matching to Simplify Java |
OpenJDK 13 | - Improved versions of preview features |
OpenJDK 12 | - First preview feature of Text blocks |
OpenJDK 11 | - Run single file source code - Flight recorder |
OpenJDK 10 | - Local-Variable Type Inference (introduction of var) |
OpenJDK 9 | - Modularity: how applications work and can be distributed - Java Dependency Analyser (jdeps) - Java Shell (jshell) |
OpenJDK 8 | Lambdas and streams introduced a completely new style of programming - It’s a different thought process - Works functional instead of procedurally - Default methods on Java Interface |
২. কোড রান করার আগে কম্পাইল করতে হয়
প্রকৃতপক্ষে জাভা একটি কম্পাইল্ড ল্যাঙ্গুয়েজে। জাভা কোড রান করার সবচেয়ে সহজ উপায় হচ্ছে এটিকে একটি ক্লাস ফাইলে compile করা। জাভা ফাইলকে কম্পাইল করলে পরে একটি বাইটকোড তৈরি হয়। এই বাইটকোডটি যে ফাইলে অবস্থান করবে তাকে জাভা ভার্চুয়াল মেশিন দ্বারা যেকোনো প্লাটফর্মে চালানো যায়।
তবে জাভা কোড রান করার আরো অন্যান্য উপায় রয়েছে।
জাভা ৯ প্রকাশের সময় এর সাথে জাভা ডেভেলপমেন্ট কিটের অংশ হিসেবে jshell চালু করা হয়েছিল।
jshell একটি কমান্ড লাইন ইন্টারফেস যা দিয়ে কোড রান , পরীক্ষা ও আরো অন্যাদি কাজ করা যায়। যেমন :
% jshell | Welcome to JShell -- Version 18.0.1 | For an introduction type: /help intro jshell> String message = "Hello World"; message ==> "Hello World" jshell> "Test: " + message $2 ==> "Test: Hello World" jshell> 8*9 $3 ==> 72
এছাড়া জাভা ১১ রিলিজের পর ফাইল থেকেই জাভা কোড রান করা যায়। আলাদা করে কম্পাইল করার প্রয়োজন পরে না। যেমন : “HelloWord.java” ফাইল কে চালাতে “ java HelloWord.java” কমান্ডটি যথেষ্ট। অনেকটা পিএইচপি বা ব্যাশ স্ক্রিপ্ট চালানোর মতো। এছাড়াও আরো বেশ কিছু টুলস রয়েছে যেগুলো এ বিষয়ে দুর্দান্ত কাজ করে। যেমনঃ jBang . এটি ব্যবহারে কোড কম্পাইল বা বিভিন্ন ডিপেন্ডেসি যেমন Maven বা Gradle এর প্রয়োজন পরে না। সরাসরি কোড রান করা যায়। আর আপনার মেশিনে জাভা না থাকলে এই টুল দিয়ে ইনস্টল করে নেওয়াও যাবে।
৩.জাভা ধীর
২০০০ দশকের গোড়ার দিকে, ডেস্কটপ কম্পিউটারে-পুরানো ল্যাপটপে,জাভা অ্যাপ্লিকেশনগুলি নেটিভ C++ অ্যাপ্লিকেশনগুলির তুলনায় লক্ষণীয়ভাবে ধীরগতিতে রান করত । এটি হতো প্রধানত জাভা ভার্চুয়াল মেশিন (JVM) এবং জাস্ট-ইন-টাইম (JIT) সংকলনের অতিরিক্ত ওভারহেডের কারণে , যা জাভা অ্যাপ্লিকেশনগুলিকে ধীরগতির প্রতীয়মান করে । ফলস্বরূপ, একটি ব্যাপক ধারণা প্রসার লাভ করে যে জাভা একটি ধীর ভাষা, যা সম্পূর্ণরূপে সঠিক নয়।
জাভা ১৯৯৫ থেকে জাস্ট ইন টাইম (JIT) কম্পাইলাম ব্যবহার করে আসছে। তবে বর্তমান হটস্পট কম্পাইলার , আজুল সিস্টেমের তৈরি ফ্যালকন কম্পাইলার জাভা অ্যাপ্লিকেশন গুলিকে C++ অ্যাপ্লিকেশন মতোই দ্রুত চালাতে সক্ষম করেছে। পাইথন বা জাভাস্ক্রিপ্টের মতো জনপ্রিয় স্ক্রিপ্টেড ভাষার তুলনায় জাভা অনেক উচ্চ গতি সম্পন্ন। জাভা অ্যাপ্লিকেশনগুলি C++ অ্যাপ্লিকেশনের তুলনায় একটু ধীর গতিতে শুরু হয়। কারণ JIT কার্যকর হতে একটু ওয়ার্ম আপ সময় নিয়ে থাকে।
জাভা বর্তমানে ডেস্কটপ অ্যাপ্লিকেশনে জনপ্রিয় না হলেও সার্ভার সাইডে এটি সবথেকে বেশি ব্যাবহৃত ভাষা। ইন্টারনেটের একটি উল্লেখযোগ্য অংশকে চালানোর জন্য জাভা ব্যাপকভাবে ব্যবহার করা হয় এবং এটি কাস্টম ব্যবসায়িক অ্যাপ্লিকেশন তৈরির জন্য সবচেয়ে পছন্দের প্রোগ্রামিং ভাষা।
৪.জাভা অনিরাপদ
১৯৯০ এবং ২০০০ দশকের শেষের দিকে অ্যাপ্লিকেশন ইন্টারনেটে আনতে HTML যথেষ্ট না হলে পরে ফ্ল্যাশ, অ্যাক্টিভএক্স, সিলভারলাইট এবং জাভা অ্যাপলেটের মতো ব্রাউজার প্লাগইনগুলি ব্যবহার করা হতো। এই প্লাগ-ইন ভিত্তিক প্রযুক্তিগুলি এখন বাতিল বলে বিবেচিত হয়। এদের দুর্বল ডেপ্লয়মেন্ট ও নিরাপত্তা মডেলের কারণে কর্পোরেট পরিবেশে নিষিদ্ধ করা হয়। বিশেষ করে ফ্ল্যাশ ডেক্সটপ ও ফোনে অনিরাপত্তার জন্য বিশেষভাবে পরিচিত পায়।
এখানে জাভা আপ্যালেট , ফ্ল্যাশের চেয়ে অনেক নিরাপদ কেননা আপ্যালেট অনেক ভালো স্যান্ডবক্স যুক্ত। তবুও এই প্লাগইন প্রযুক্তির ঘটনা জাভা একটি অনিরাপদ ভাষা এই মিথের ধোঁয়ায় বাতাস জুগিয়েছে। যাইহোক, রক্ষণাবেক্ষণ করা জাভা সংস্করণে (যেমন Java 6, 7, 8, 11, এবং 17) চলমান জাভা অ্যাপ্লিকেশনগুলি অন্যান্য অনেক প্রোগ্রামিং ভাষার তুলনায় নিরাপদ কেননা জাভা রানটাইম অ্যাপ্লিকেশন থেকে স্বাধীনভাবে আপডেট করতে পারা যায়।
স্ট্যান্ডার্ডাইজড জাভাস্ক্রিপ্ট, HTML5 স্ট্যান্ডার্ডের অংশ হিসাবে উপরের সমস্ত প্লাগইন পন্থাগুলিকে ছাড়িয়ে গেছে।
নতুন সংস্করণের ঘন ঘন প্রকাশ (বছরে চারবার) এবং নিরাপত্তা দুর্বলতার শনাক্ত হওয়ায় ডিস্ট্রিবিউটরদের দ্রুত প্রতিক্রিয়ার কারণে জাভা একটি নিরাপদ পরিবেশ হিসেবে বিবেচিত হচ্ছে। কমন ভালনারেবিলিটিস অ্যান্ড এক্সপোজারস (CVE) এর একটি তালিকা প্রকাশিত হওয়ার পর পরই ডিস্ট্রিবিউটররা জাভার আপডেটেড সংস্করণগুলি দ্রুত প্রকাশ দিয়ে থাকে। উদাহরণস্বরূপ, Azul, সাম্প্রতিক সকল CVE এবং জাভা ডেভেলপমেন্ট কীট (JDK) এর সংস্করণগুলির একটি তালিকা প্রদান করেছে।
কোনো সিস্টেমই সম্পূর্ণরূপে সুরক্ষিত হতে পারে না,তবে নিরাপত্তা সংক্রান্ত সমস্যা চিহ্নিতকরণ, নথিভুক্তকরণ এবং সেগুলো ঠিক করার কর্মপ্রবাহ জাভার নিরাপত্তাকে ক্রমাগত উন্নত করে চলছে ।
৫.মেশিনে জাভা ইনস্টল করা চ্যালেঞ্জিং, এবং লাইসেন্স এর জটিল প্রক্রিয়া
OpenJDK একটি ওপেন সোর্স প্রজেক্ট। যার মাধ্যমে যে কেউ চাইলেই একটি JVM তৈরিকরে ফেলতে পারে। OpenJDK এর এই ফায়দা অনেক অলাভজনক ও বাণিজ্যিক সংস্থা নিয়েছে। ফলস্বরূপ ডিস্ট্রিবিউশনে একটি দীর্ঘ তালিকা তৈরি হয়েছে যা হাই এন্ড ডিভাইস থেকে শুরু করে , রাস্পবেরি পাই এর মতো সস্তা বোর্ডেও ব্যবহার করা যায়।
এতসব সংস্করণ থেকে আপনার মেশিনে কোনটি প্রয়োজন তা শুধু নির্বাচন করে নিন , কেননা সবগুলো সংস্করণই OpenJDK এর উপশাখা বা এর উপরে ভিত্তি করে তৈরিকরা হয়েছে। কিছু সংস্থা যেমন Azul – কিছু বাড়তি টুলস ও লাইসেন্স প্রদান করে থাকে। তাই এইসব বাড়তি টুলস বা লাইসেন্স এর জন্য তাদের ওয়েবসাইট ঘুরে দেখতে পারেন।
macOS বা Linux এ SDKMAN এর মাধ্যমে সহজেই নিজের সিস্টেমের জন্য উপযোগী ডিস্ট্রিবিউশনগুলির একটি সম্পূর্ণ তালিকা প্রদর্শন করানো যায় এবং একটি একক কমান্ডের মাধ্যমে সেগুলি ইনস্টল করেও ফেলা যায়। উদাহরণ :
sdk install java 17.0.4-zulu
৬. জাভা রান করতে পিসিতে জাভা রান টাইম ইনস্টল করতে হয়
সাধারণত জাভা প্রোগ্রাম চালাতে হলে আলাদাভাবে একটি রানটাইম এনভায়রনমেন্ট ইনস্টল করে নেবার প্রয়োজন হতো। কিন্তু জাভা ১১ থেকে অ্যাপ্লিকেশনের সাথে জাভা রান টাইম ব্যান্ডল আকারে যুক্ত করা হয়। ফলে আলাদা করে আর JRE ইনস্টল করে নিতে হয় না।
Jlink হলো এমন একটি টুল যা দিয়ে কাস্টম জাভা রানটাইম ইমেজ তৈরি করা যায়। যেখানে শুধু অ্যাপ্লিকেশনের প্রয়োজনীয় মডিউল এবং dependencies-গুলো থাকে। ফলে অ্যাপ্লিকেশন আকার কমে আসে এবং রানটাইম পরিবেশের কর্মক্ষমতা বেড়ে যায়।
OpenJDK 14 থেকে, jlink-এর আউটপুটের উপর ভিত্তি করে একটি নেটিভ এক্সিকিউটেবল তৈরি করতে jpackage যোগ করা হয়েছিল (JEP 343 দেখুন)। jpackage একটি একক এক্সিকিউটেবল তৈরি করে যা ব্যবহারকারীর ইন্টারঅ্যাকশন ছাড়াই স্বয়ংক্রিয়ভাবে আনপ্যাক হতে পারে ।
এছাড়াও আরো অনেক প্যাকেজ রয়েছে। যেমন GluonFX Plugin for Maven দ্বারা Windows, macOS, Linux, Android এবং iOS-এর জন্য নেটিভ অ্যাপ্লিকেশন তৈরি করা যায়। এমনকি মোবাইল অ্যাপ্লিকেশনগুলিও জাভা দিয়ে তৈরি করা যেতে পারে এবং সব ডিভাইসে চালানো যাবে।
৭. মেমরি ক্লিনআপ (Garbase collection) চলমান অবস্থায় আপনার অ্যাপ্লিকেশন বন্ধ হয়ে যায়
কিছু কিছু ক্ষেত্রে মেমোরি ক্লিনআপের সময় অ্যাপ্লিকেশন বন্ধ হয়ে যাওয়াই সবদিক থেকে সুফল বয়ে আনতে পারে। দেখা যাচ্ছে এটিই আসলে আমরা হতে বলতেছি বা চাচ্ছি।
দীর্ঘ-সময় ব্যাচ অপারেশনে গতির চেয়ে ফলাফলের সঠিকতা বেশি গুরুত্ব পায় । ফলে এই সব ক্ষেত্রে, একটি তথাকথিত “স্টপ-দ্য-ওয়ার্ল্ড” গারবেজ কালেক্টর (GC) হল সেরা বিকল্প।
তবে বছরের পর বছর ধরে আরও নানারকম GC তৈরি হয়েছে জাভার অংশ হিসেবে। এদের মধ্যে কোনটি অ্যাপ্লিকেশন থ্রেড থেকে সম্পুর্ণভাবে আলাদা এবং এগুলো যখন চলে,তখন অ্যাপ্লিকেশন কোডের ওপর কোনো রকম ইম্প্যাক্ট ফেলে না। এরকম একটি GC হলো- Azul এর C4 GC (কন্টিনিউয়াসলি কনকারেন্ট কমপ্যাক্টিং কালেক্টর)। এই সংস্করণটি বিশ্বের শীর্ষ 10টি ট্রেডিং কোম্পানি এবং শীর্ষ 10টি মার্কিন আর্থিক সংস্থার মধ্যে ছয়টিই ব্যবহৃত করে থাকে। যে সমস্ত কোম্পানি মিলিসেকেন্ড এরও কম সময়ে লেনদেনের গতি অর্জন করতে চায়, তাদের কখনই একটি GC এর জন্য বন্ধ করা উচিত নয় ৷
ফ্ল্যাগ দিয়ে আমরা আমাদের পছন্দ মতো GC ব্যবহার করতে পারি। এই সম্পর্কে আরো জানতে এই আর্টিকেলটি দেখুন : “What Should I Know About Garbage Collection as a Java Developer?“
৮. জাভা শুধু একক inheritance সমর্থন করে
জাভাতে প্রকৃতপক্ষে কোন একাধিক ইনহেরিটেন্স ছিল না।
তবে JDK ৮ একাধিক ইনহেরিটেন্স প্রবর্তন করেছে যা দিয়ে আমরা কথিত ডায়মন্ড সমস্যা এড়াতে পারি।
দুটি ক্লাস সহ একটি উদাহরণ দেখা যাক – A এবং B এর doSomething() নামে একটি মেথড রয়েছে ।ক্লাস C উভয় A এবং B ইনহেরিট করলে , doSomething() কে কল করায় অস্পষ্টতা দেখা দিবে যেহেতু A এবং B উভয়ই মেথডটি সরবরাহ করতে চাইবে এবং C কোনটি ব্যবহার করবে তা স্পষ্ট নয়।
public class ExampleC implements ExampleA, ExampleB { @Override public void doSomething() { System.out.println("Output of C"); } public static void main(String args[]){ ExampleC example = new ExampleC(); example.doSomething(); } } interface ExampleA { default void doSomething() { System.out.println("Output of A"); } } interface ExampleB { default void doSomething() { System.out.println("Output of B"); } }
উপরের কোডটি নিচের এরর টি দেখাবে :
class ExampleC inherits unrelated defaults for doSomething() from types ExampleA and ExampleB
কিন্তু একাধিক ইনহেরিটেন্স যোগ করার মাধ্যমে কম্পাইলাম বুঝতে পারবে এই ক্ষেত্রে তার ভূমিকা কি হবে এবং ফলাফল দিবে :
Output of C.
৯.ইন্টারফেস বাস্তবায়ন ধারণ করতে পারে না
ডিফল্ট মেথড এবং স্ট্যাটিক মেথড জাভা থেকে এই সীমাবদ্ধতাকে ঝেড়ে ফেলেছে।
তারা একটি ইন্টারফেসের মধ্যে ইমপ্লিমেন্ট করতে দেয়।
আগের উদাহরণে দেখা যাচ্ছে , উভয় ইন্টারফেস ExampleA এবং ExampleB তে মেথড এক্সেকিউটিং কোড রয়েছে।
উপসংহার
জাভা নিয়ে ভ্রান্ত ধারণা গুলো ঝেড়ে ফেলা যাক। ২০১৮ সাল থেকে ছয় মাসের রিলিস সাইলেকের মাধ্যমে জাভা ভাষা এবং টুলস উল্লেখযোগ্য বিবর্তন ও পরিবর্তন সাধিত হতে দেখছে।
এরমধ্যে কিছু পরিবর্তন চোখের আড়ালে হচ্ছে যা জাভাকে উন্নত গতি এবং মেমোরি ব্যবহারে সাশ্রয়ী করেছে আর অন্যান্য পরিবর্তনগুলো ডেভেলপারদের এক্সপেরিয়েন্স, কোড লিখা ও রক্ষণাবেক্ষণ সহজ করার দিকে মনোযোগ দিয়েছে।
অন্যান্য আরো অনেক সংস্কার চলমান রয়েছে এবং সেগুলো ইতিমধ্যে নতুন JDK এর ডেভেলপমেন্টে যুক্ত করা হয়েছে। এরপর , জাভা নিয়ে জাভা কমিউনিটিতে নতুন নতুন আইডিয়ার দীর্ঘ তালিকা রয়েছে। Openjdk.org-এর “ড্রাফ্ট এবং জমা দেওয়া JEPs” বিভাগে দেখা যায় এমন কিছু নতুন ধারণা ইতোমধ্যেই বর্ণনা করা হয়েছে।
Tanvir is a CSE undergraduate student who is currently focusing on Java programming. He has always had a passion for technology, and a fascination for the way software can solve real-world problems. Due to his interests, he pursued his studies in Computer Science, where he is now gaining a comprehensive understanding of Java programming.