# Pengenalan

Kat Malaysia ni, ada tiga keturunan bahasa pengaturcaran yang duduk dalam kategori majoriti iaitu Java, PHP dan C#. Mungkin ada yang tak setuju, well kenyataan tadi cumalah pendapat dan pengalaman peribadi.

Saya faham, sekarang semakin banyak hipster pengaturcaraan baru muncul dan ada pengikutnya sendiri seperti ruby, node, python, golang, rust dan lain-lain. Artikel ini bukanlah flame-war untuk mengesahkan siapa bahasa pengaturcaraan yang famous. Sekiranya anda berlainan pendapat, sila abaikan statement intro saya.

PHP adalah bahasa pengaturcaraan yang paling ramai programmer Malaysia guna dan kenal. Pada pengalaman saya, PHP ni top kat Malaysia sejak version 5 sehingga kini (waktu PHP version 4, ramai masih guna bahasa pengaturcaraan perl dan bahasa yang lain-lain).

Java pula ialah stack kedua yang glamour di Malaysia, stack ini bagi saya sangat revolusi. Setiap kali perubahan berlaku pasti ialah sangat besar dan memberikan sakit kepala untuk memahami kongsep-kongsep yang baru di perkenalkan itu, tapi setiap revolusi Java memberikan banyak kemudahan dalam teknik menbangunkan sistem.

Java sangat terkenal dengan kongsep OOP - Object Oriented Programming atau dalam bahasa Melayu kita panggil “Pengaturcaraan Berorientasikan Object”. Ya, dalam Java semua ialah object, saya faham Java ada primitif juga tapi dengan teknik autoboxing, yang primitif pun jadi objek (programmer je faham statement ni).

C++ (sebut “C pulas pulas” .. keh keh) telah wujud sebelum Java dan untuk makluman bahasa pengaturcaraan C++ juga boleh menggunakan kongsep OOP tetapi ia terlalu kompleks dan memori komputer perlu digunakan dengan teliti dan kebiasanya menganggu pengaturcara untuk memikirkan cara terbaik untuk mengelakkan masalah seperti overflow memori, platform pembangunan berbeza dan lain-lain isu. Maka pada awal 1990, James Gosling iaitu ketua researchers di Sun Microsystems Inc telah membina Oak (dan kemudiannya menukar nama Oak kepada Java) sebagai bahasa pengaturcaraan yang mempunyai ciri “write once, run anywhere (WORA)” dan lain-lain lagi.

C# (sebut “C sharp”) ialah salah satu bahasa pengaturcaraan yang di bangunkan oleh Microsoft. Terdapat bahasa pengaturcaraan lain seperti Visual Basic (VB), Visual Basic .Net (VB.net), F# dan lain lain.

Perlu saya tekankan VB adalah interpreter based dan VB.net, F# dan C# adalah compiled based melalui dot net CLR. Agak sukar untuk saya jelaskan, pendek kata dot net adalah pembaharuan modern (terkini) dan VB tidak lagi di kembangkan sejak versi 6. Tapi tolong jangan pandang rendah pada VB6, saya pernah bangunan virus remover dan beberapa aplikasi yang lain.

Dalam banyak-banyak bahasa pengaturcaraan melalui dot net (.net), C# adalah paling cemerlang dan lebih banyak digunakan secara umum nya bagi peminat pembangunan berplatformkan Windows. Ia juga berevolusi dan mengambil inspirasi C++ dan Java kedalam kongsep pengaturcaraan. C# juga berkongsepkan OOP - Object Oriented Programming. Dot net di bangunkan sejak 2000 sehingga kini.

Pada perenggan awal, saya mengatakan terdapat 3 bahasa pengaturcaraan majoriti iaitu PHP, Java dan C#. Saya tidak akan membuat perbandingan PHP tetapi cuma akan membandingkan Java dan C#.

Maaf intro agak panjang sebab nak jelaskan beberapa perkara sebelum buat perbandingan.

# JVM dan .Net

Pengaturcaraan Java di operasikan oleh virtual machine environment (JVM) untuk terjemah class kepadabytecode dan memberikan arahan kepada komputer.

Untuk pengaturcaraan C#, ia juga menggunakan kongsep yang sama tapi dioperasikan oleh .NET framework dan CLR runtime.

kata kunci dan konvensi

Java C#
“Projects” “Solutions”
“Package” “Namespace”
Menamakan pemboleh ubah atau fungsi menggunakan notasi lowerCamelCase seperti foo.thingTodo() Menamakan pembolehubah atau fungsi menggunakan notasi PascalCase seperti bar.ThingTodo
Penamaan interface biasanya menggunakan tanpa notasi seperti UserService<T> Pengunaan interface biasanya menggunakan notasi yang bermula dengan I contohnya IUserService<T>. Teknik ini hampir sama dengan notasi Hungarian
pemboleh ubah rentetan (string) adalah String pemboleh ubah rentetan (string) adalah string
class yang berdikari dikenali sebagai “POJO” “POCO”

Java package

package com.robbinespu;

import java.util.List;
import com.google.common.base.Function;
// Code goes here

C# namespace

using System;
using System.Collections.Generic;

namespace RobbiNespu
{
  // Code goes here
}

# Sintaks

Dalam pengaturcaraan java terdapat pembolehubah final dan C# pula ialah readonly. Dua dua ada aplikasi yang sama (iatu menghalang subclassing, menghalang overriding method dan pemalar pembolehubah) cuma dalam java anda hanya boleh assign pembolehubah final sekali sahaja di dalam class, manakala C# pula sekali sahaja di dalam konstructor

Keperluan Java C#
menghalang subclassing final sealed
menghalang overriding method final sealed
pemalar pemboleh ubah final readonly

Nota: Perbandingan ini di buat dengan membandingkan JDK8 dan .net Core 3.1

Mulai JDK15 Sealed Types telah diperkenalkan sebagai preview feature daripada JEP 360 iaitu sebahagian daripada projek Amber

Java - Menghalang subclassing menggunakan final

C# - Menghalang subclassing menggunakan sealed

Rujukan (reference) dan nilai (value)

Dalam Java, kita cuma boleh terima parameters berbentuk nilai sahaja. Pening ayat bahasa Melayu ni..hrmm kalau dalam bahasa mat salleh “In Java, we can only pass parameters by value”

Pengaturcara java tak perlu nak ubah references data tu, hal ni berkait rapat dengan pengurusan pointer pada memory (nanti saya cerita kat bawah).

Dalam pengaturcaraan C# pula, anda boleh menggunakan out dan ref untuk override reference data tersebut.

Ini boleh dianggap kelebihan pada C# sebab boleh “pass parameter by value” dan juga “pass parameter by references”.

Metadata - Annotations (Java) == attributes (C#)

Ok sejujurnya aku sentiasa panggil metadata ni sebagai Annotations tapi rupaya C# panggil ia sebagai attributes. Ini pun aku baru tahu waktu menulis artikel ini.

Java annotation:

@PersonallyIdentifiable
private String fullName;

C# attribute:

[PersonallyIdentifiable]
private string fullName;

Getters and setters

Pengaturcara java perlu menulis sendiri atau autogenerate dengan IDE untuk membuat getter dan setter. Sebab itu ramai pengaturcara Java mengaplikasikan “Project Lombok” untuk menggunakan metadata (annotation) @Getter @Setter dalam pengaturcaraan.

Tapi C# pula ada ciri-ciri built-in properties untuk getter dan setter tanpa perlukan attribute

public class MakhlukHalus 
{
  public string Nama { get; set; }     
  public int Umur { get; set; }
}

Pointer

Fuh berasap kepala nak faham kongsep pointer ni. Bahasa pengaturcaraan C# masih membenarkan anda untuk mengira arithmetic dan manipulasi pointer dalam pengaturcaraan

using System;
namespace Robbi
{
    class Hello
    {
        static void Main(string[] args)
        {
            unsafe
            {
                int a = 25;
                int* ptr = &a;
                Console.WriteLine($"Value of pointer is {*ptr}");
            }
        }
    }
}

Tetapi anda perlu memberikan kebenaran kepada solution build

Untuk Java pula tiada pointer seperti yang kita faham dengan kongsep general iaitu daripada C++ tapi dengan kongsep Java semua Object boleh di gunakan sebagai pointer tapi anda tidak boleh melakukan operasi arithmetic atau dereference pada spesifik memory. Semua di uruskan oleh JVM. So, bagi saya.. ermm lebih baik kita pegang “Java tiada kebolehan mengubahsuai pointer”.

…bersambung

Rasa macam panjang sangat artikel ni. Saya akan sambung penulisan pada masa akan datang. Terima kasih!

Edit