Lompat ke konten Lompat ke sidebar Lompat ke footer

Pointer Near, Far, dan Huge Bahasa C Beserta Penjelasannya

Terdapat konsep lama yang digunakan pada arsitektur intel 16 bit pada masa penggunaan MS DOS, namun hal ini sudah tidak terlalu banyak berguna lagi pada masa pemrograman modern saat ini.


Sebelum memahami lebih dalam materi tentang Pointer Near, Far, dan Huge Bahasa C Beserta Penjelasannya, terlebih dahulu pelajari materi tentang: Pointer Ke Fungsi Bahasa C Beserta Penjelasannya, Pointer NULL Bahasa C Beserta Fungsi dan Penjelasannya, dan Pointer Void Bahasa C Beserta Fungsi dan Penjelasannya.

Beberapa konsep tersebut adalah sebagai berikut:
  • Near Pointer: merupakan pointer yang digunakan untuk menyimpan alamat dengan ukuran 16 bit, yang bermakna bahwa suatu alamat saat ini akan disimpan pada mesin komputer dengan kapasitas 16 bit, dengan kata lain hanya bisa dilakukan akses sebesar 16kb dari data dalam satu kali proses program dijalankan.
  • Pointer Far: merupakan konsep pointer 32 bit yang dapat digunakan untuk mengakses memori diluar dari segmen saat ini. Untuk menggunakan pointer far, kompilator harus mengalokasikan sebuah segmen register untuk menyimpan segmen alamat, dan register lainnya untuk dilakukan proses penyimpanan di dalam segmen saat ini.
  • Pointer Huge: juga merupakan bentuk dari pointer yang membutuhkan alokasi memori 32 bit dan dapat diakses di luar dari segmen. Pada pointer far, sebuah segmen adalah bernilai tetap. Pada pointer far, segmen bagian tidak dapat dimodifikasi, tetapi dapat digunakan dalam ukuran besar.

Dalam dunia pemrograman, konsep pointer memiliki peran yang sangat penting, terutama dalam pengelolaan memori. Di antara berbagai jenis pointer, terdapat kategori yang spesifik dikenal sebagai pointer *near*, *far*, dan *huge*. Konsep ini muncul pada era sistem operasi berbasis DOS dan arsitektur prosesor x86. Pada masa itu, pengelolaan memori memainkan peran vital karena keterbatasan ruang memori yang tersedia. Pemahaman terhadap pointer ini memberikan wawasan tentang bagaimana memori dikelola dalam lingkungan yang memiliki segmentasi memori.

Pada arsitektur prosesor x86, memori dibagi menjadi segmen-segmen yang memiliki panjang maksimum 64 kilobyte. Penggunaan segmen ini memungkinkan sistem untuk mengatasi keterbatasan alamat memori 16-bit, yang secara teori hanya dapat mengakses hingga 1 megabyte. Dalam konteks ini, pointer *near*, *far*, dan *huge* dirancang untuk menangani kebutuhan akses memori dengan pendekatan yang berbeda, tergantung pada lokasi data dan kebutuhan aplikasi.

Pointer *near* adalah tipe pointer yang hanya menggunakan alamat offset 16-bit. Dalam model ini, data yang diakses harus berada dalam segmen yang sama dengan segmen data aktif saat itu. Karena keterbatasan ini, penggunaan pointer *near* sangat efisien dalam hal konsumsi memori dan kecepatan, karena hanya membutuhkan satu register untuk menyimpan informasi alamat. Namun, kekurangannya terletak pada keterbatasannya dalam menjangkau data yang berada di luar segmen aktif. Pointer *near* ideal digunakan dalam aplikasi yang hanya memerlukan pengelolaan data di dalam segmen tunggal, seperti program kecil yang tidak membutuhkan banyak ruang memori.

Berbeda dengan pointer *near*, pointer *far* menggunakan dua register untuk menyimpan informasi alamat, yaitu segment dan offset. Dengan menggunakan segment 16-bit dan offset 16-bit, pointer *far* memungkinkan akses ke data di luar segmen aktif saat ini. Ini memberikan fleksibilitas yang lebih besar dibandingkan pointer *near*, karena data dapat diakses di berbagai lokasi dalam ruang memori 1 megabyte. Namun, fleksibilitas ini datang dengan harga berupa peningkatan konsumsi memori dan sedikit penurunan performa. Hal ini disebabkan oleh kebutuhan untuk memuat dua bagian alamat dan melakukan kalkulasi tambahan untuk menentukan lokasi fisik data. Pointer *far* sangat cocok untuk aplikasi yang memerlukan pengelolaan memori lintas segmen, terutama pada program yang lebih kompleks.

Pointer *huge* merupakan evolusi dari konsep pointer *far*. Sama seperti pointer *far*, pointer *huge* juga menggunakan segment dan offset untuk menentukan alamat memori. Namun, yang membedakan adalah kemampuannya untuk melakukan normalisasi alamat. Normalisasi berarti bahwa setiap kombinasi segment dan offset yang menunjuk ke lokasi memori yang sama akan dikonversi ke format standar. Hal ini membuat pointer *huge* lebih andal dalam mengakses memori lintas segmen, terutama dalam operasi seperti pengurutan atau manipulasi data besar yang melibatkan berbagai segmen. Pointer *huge* memastikan bahwa akses ke data dilakukan tanpa risiko kesalahan akibat kombinasi alamat yang tidak normal. Kekurangannya adalah pointer ini lebih lambat dibandingkan pointer *far* karena proses normalisasi tambahan.

Keberadaan ketiga jenis pointer ini sangat erat kaitannya dengan model memori yang digunakan oleh aplikasi. Pada masa itu, model memori dalam pemrograman C dibagi menjadi beberapa jenis, yaitu *tiny*, *small*, *medium*, *compact*, *large*, dan *huge*. Model *tiny* dan *small* biasanya menggunakan pointer *near* karena semua data berada dalam satu segmen. Model *medium* dan *large* sering memanfaatkan pointer *far*, sedangkan model *huge* mengandalkan pointer *huge* untuk memberikan fleksibilitas maksimal dalam mengelola data besar.

Pada era modern, penggunaan pointer *near*, *far*, dan *huge* telah menjadi kurang relevan. Hal ini disebabkan oleh perubahan arsitektur komputer yang meninggalkan segmentasi memori dan beralih ke model memori linear. Pada sistem 32-bit dan 64-bit yang digunakan saat ini, seluruh memori dapat diakses dengan alamat linier, sehingga tidak lagi diperlukan pengelompokan data ke dalam segmen-segmen terpisah. Namun, memahami konsep ini tetap penting, terutama bagi yang ingin mendalami sejarah pemrograman dan pengelolaan memori pada masa awal perkembangan komputer pribadi.

Selain itu, konsep ini memberikan wawasan tentang tantangan yang dihadapi oleh pengembang perangkat lunak pada masa lalu. Pada saat itu, efisiensi memori menjadi prioritas utama, mengingat keterbatasan perangkat keras. Setiap byte memori harus dimanfaatkan secara optimal, dan keputusan seperti jenis pointer yang digunakan dapat memengaruhi performa aplikasi secara signifikan. Kesadaran akan keterbatasan ini membantu para pengembang menciptakan solusi inovatif yang pada akhirnya membentuk dasar-dasar sistem modern.


Dalam konteks pembelajaran, memahami pointer *near*, *far*, dan *huge* memberikan gambaran tentang bagaimana sebuah sistem bekerja di bawah permukaan. Pointer bukan sekadar alat untuk mengakses data, tetapi juga merupakan bagian dari strategi yang lebih besar dalam pengelolaan sumber daya. Meskipun konsep ini tidak lagi digunakan secara langsung dalam pengembangan perangkat lunak modern, ide-ide di baliknya masih relevan. Pengelolaan memori, optimalisasi performa, dan efisiensi sumber daya tetap menjadi prinsip utama yang harus diperhatikan dalam pemrograman.

Sebagai kesimpulan, pointer *near*, *far*, dan *huge* adalah representasi dari pendekatan segmentasi memori pada arsitektur prosesor x86. Setiap jenis pointer memiliki kelebihan dan kekurangannya masing-masing, yang dirancang untuk memenuhi kebutuhan spesifik aplikasi. Meskipun penggunaan langsungnya telah tergantikan oleh teknologi yang lebih modern, pemahaman terhadap konsep ini memberikan landasan yang kuat bagi siapa pun yang ingin mendalami dunia pemrograman tingkat rendah dan pengelolaan memori.

Untuk memahami lebih jauh pentingnya pointer *near*, *far*, dan *huge*, perlu diselami lebih dalam tentang segmentasi memori itu sendiri. Segmentasi memori adalah metode pembagian ruang alamat fisik menjadi segmen-segmen kecil, masing-masing dengan ukuran maksimum 64 kilobyte. Pendekatan ini digunakan untuk memanfaatkan ruang memori secara lebih efisien dalam lingkungan sistem operasi dan perangkat keras yang terbatas. Dalam sistem berbasis x86, register segment seperti CS (Code Segment), DS (Data Segment), SS (Stack Segment), dan ES (Extra Segment) digunakan untuk menunjuk segmen tertentu, sementara register offset menentukan lokasi spesifik dalam segmen tersebut. Pointer-pointers ini bekerja berdasarkan prinsip tersebut untuk menangani data yang tersebar di berbagai segmen.

Pointer *near*, yang hanya menyimpan alamat offset, sangat bergantung pada segment register aktif untuk menentukan lokasi data. Efisiensinya membuatnya ideal untuk aplikasi kecil atau rutinitas yang sering kali beroperasi dalam segmen data tunggal, seperti variabel lokal atau struktur data sederhana. Namun, dalam aplikasi yang lebih besar, penggunaan eksklusif pointer *near* akan menjadi penghalang, karena terbatasnya kemampuan untuk menjangkau data yang terletak di luar segmen tersebut. Oleh karena itu, aplikasi besar membutuhkan alternatif yang lebih fleksibel, yang kemudian disediakan oleh pointer *far* dan *huge*.

Pointer *far* memberikan solusi untuk tantangan ini dengan menggunakan dua komponen: segment dan offset. Kombinasi keduanya memungkinkan pointer *far* untuk menunjuk lokasi memori di luar batas segmen saat ini. Ketika aplikasi membutuhkan akses ke berbagai segmen, seperti dalam kasus struktur data yang besar atau file yang dipecah menjadi beberapa bagian, pointer *far* menjadi alat yang sangat berguna. Namun, ada biaya tambahan dalam hal performa, karena akses memori melibatkan penghitungan alamat fisik berdasarkan segment dan offset, serta pergantian segment register jika diperlukan.

Pointer *huge* memperluas kemampuan pointer *far* dengan menyediakan normalisasi alamat. Proses normalisasi memastikan bahwa alamat yang menunjuk lokasi memori tertentu selalu dikonversi ke bentuk yang konsisten, terlepas dari bagaimana segment dan offset disusun. Hal ini menjadi sangat penting dalam operasi seperti perbandingan pointer, pengurutan array besar, atau algoritma yang membutuhkan navigasi yang andal melintasi batas segmen. Sebagai contoh, dalam konteks perbandingan pointer, ketidaknormalan alamat pada pointer *far* dapat menyebabkan hasil yang tidak konsisten, sedangkan pointer *huge* mengeliminasi kemungkinan ini dengan memastikan bahwa setiap alamat dalam ruang memori 1 megabyte memiliki representasi unik.

Selain itu, penggunaan pointer *huge* sering dikaitkan dengan program yang dirancang untuk memanfaatkan ruang memori secara maksimal, terutama dalam pengolahan data yang memerlukan manipulasi dataset besar. Dalam sistem operasi berbasis DOS, dimana ruang memori sangat terbatas, kemampuan untuk memanfaatkan seluruh ruang 1 megabyte menjadi keunggulan signifikan. Pointer *huge* memungkinkan pengembang mengakses dan memanipulasi data dalam jumlah besar tanpa terjebak pada batasan yang dimiliki pointer *near* dan *far*.

Meskipun saat ini konsep pointer *near*, *far*, dan *huge* jarang ditemukan dalam pengembangan perangkat lunak modern, pengaruhnya tetap terlihat. Pada zaman ketika memori komputasi merupakan sumber daya yang sangat mahal, solusi seperti ini adalah bentuk inovasi teknis untuk mengatasi keterbatasan perangkat keras. Bahkan dalam sistem modern, prinsip-prinsip pengelolaan memori yang efisien tetap menjadi inti dari banyak keputusan desain perangkat lunak, baik pada tingkat sistem operasi maupun aplikasi.

Dalam konteks arsitektur modern, transisi dari model memori segmentasi ke model memori linier membuat penggunaan konsep segmentasi menjadi tidak relevan. Prosesor dengan arsitektur 32-bit atau 64-bit mengeliminasi kebutuhan untuk bekerja dengan segment dan offset secara eksplisit, karena semua alamat memori dirancang untuk diakses secara langsung melalui alamat linier. Namun, pengaruh segmentasi tetap ada dalam beberapa kasus, seperti dalam virtualisasi memori dan pengelolaan memori oleh kernel sistem operasi.

Sebagai bahan pembelajaran, eksplorasi pointer *near*, *far*, dan *huge* mengajarkan pentingnya memahami kebutuhan aplikasi dan kemampuan perangkat keras yang digunakan. Pada masa itu, setiap keputusan dalam memilih jenis pointer bukan hanya masalah teknis, tetapi juga strategis, terutama karena berdampak langsung pada efisiensi aplikasi. Dengan memahami bagaimana pengembang generasi sebelumnya menghadapi tantangan teknis ini, wawasan yang diperoleh dapat diaplikasikan untuk memecahkan masalah yang serupa dalam konteks teknologi masa kini.

Selain itu, konsep ini juga menggambarkan bagaimana batasan teknologi memicu inovasi. Pada akhirnya, pengetahuan tentang pointer ini lebih dari sekadar penguasaan teknis; ia merupakan jendela untuk memahami sejarah perkembangan komputasi dan evolusi pengelolaan sumber daya perangkat keras. Oleh karena itu, mempelajari pointer *near*, *far*, dan *huge* bukan hanya relevan bagi yang tertarik dengan arsitektur komputer klasik, tetapi juga memberikan perspektif yang lebih luas tentang bagaimana prinsip-prinsip pemrograman dasar tetap relevan di tengah perubahan teknologi yang pesat.

Artikel ini akan dibaca oleh: Ulil Amri, Wahyu Isnaini Hutami, Adam Yanuar Rizky, Agus Wulansari, dan Ahmad Choirul Umam.

5 komentar untuk "Pointer Near, Far, dan Huge Bahasa C Beserta Penjelasannya"

  1. Apa yang dimaksud dengan pointer near pada bahasa C?

    BalasHapus
    Balasan
    1. Pointer near pada bahasa C merupakan pointer yang digunakan untuk alamat bit hingga 16 bit pada bagian tertentu dari memori komputer yang diaktifkan sebesar 16 bit. Pointer ini hanya dapat mengakses data berukuran kecil sekitar 64 kb dalam periode waktu tertentu, yang merupakan kelemahan utama dari pointer ini.

      Hapus
  2. Apa yang dimaksud dengan pointer far pada bahasa C?

    BalasHapus
    Balasan
    1. Pointer far merupakan pointer berukuran 32 bit, yang dapat digunakan untuk mengakses informasi yang berada di luar memori komputer dalam segmen tertentu.

      Hapus
    2. Pointer far dapat digunakan dengan cara mengalokasikan register sektornya untuk menyimpan alamat data pada segmen tersebut dan juga register sektor lain harus disimpan di dalam sektor terbaru tersebut.

      Hapus

Hubungi admin melalui Wa : +62-896-2414-6106

Respon komentar 7 x 24 jam, mohon bersabar jika komentar tidak langsung dipublikasi atau mendapatkan balasan secara langsung.

Bantu admin meningkatkan kualitas blog dengan melaporkan berbagai permasalahan seperti typo, link bermasalah, dan lain sebagainya melalui kolom komentar.

- Ikatlah Ilmu dengan Memostingkannya -