Lompat ke konten Lompat ke sidebar Lompat ke footer

Internal dan Eksternal Linkage Bahasa C Beserta Fungsinya

Terkadang sangat sulit untuk membedakan antara scope dan linkage, dan bagian dari perannya masing-masing. Pada artikel ini akan memfokuskan bahasan pada scope dan linkage, dan bagaimana menggunakannya pada bahasa pemrograman C.


Sebelum mempelajari materi tentang Internal dan Eksternal Linkage Bahasa C Beserta Fungsinya, terlebih dahulu pelajari materi tentang: Linker Bahasa C dan Fungsinya, Deklarasi Kompleks Bahasa C dan Fungsinya, dan Variabel Global Bahasa C dan Fungsinya.

Catatan: Semua program C telah dikompilasi dalam 64 bit 4.9.2. Juga, istilah "identifier" dan "name" digunakan secara bergantian pada artikel ini.

Definisi:
  • Scope: scope dari identifier adalah bagian dari program dimana identifier dapat diakses secara langsung. Pada bahasa c, semua identifier adalah scope lexical (atau static).
  • Linkage: linkage mendenskripsikan bagaimana nama dapat mengacu entitas yang sama terhadap seluruh program atau unit translasi tunggal. Pengertian tersebut terdengar sama seperti scope, namun definisi tersebut berbeda. Untuk memahami maksud dari definisi tersebut, dapat dipahami dari pengertian proses kompilasi program.
  • Unit translasi: sebuah translasi unit adalah sebuah file yang mengandung kode program, file header, dan dependencies. Semua sumber kode program tersebut dikelompokkan bersama dalam sebuah file agar dapat digunakan untuk menghasilkan object eksekusi tunggal. Adalah suatu hal yang penting untuk menghubungkan sumber program yang berarti secara bersamaan. Contohnya, kompilator harus mengetahui definisi printf terhadap file header dalam stdio.

Pada bahasa C dan C++, sebuah program yang terdiri dari banyak file kode program dikompilasi dalam saat yang bersamaan. Hingga tahapan kompilasi, sebuah variabel akan dideskripsikan oleh scope-nya. Hal ini dilakukan ketika proses linking dimulai, dan properti linkage dijalankan. Jadi, scope adalah properti yang menangani compiler, dimana linkage adalah properti yang menangani linker-nya.

Linker menghubungkan kode program secara bersamaan dalam stage linking dari proses kompilasi. Linker program mengambil multi file kode mesin sebagai input, dan menghasilkan eksekusi kode object yang memberikan simbol dan pengaturan object dalam ruang alamat.

Linkage adalah sebuah properti yang mendeskripsikan bagaimana variabel harusnya dihubungkan oleh linker. Apakah sebuah variabel tersedia untuk file lain yang digunakan? Atau apakah sebuah file hanya digunakan untuk deklarasi file? Keduanya ditentukan menggunakan linkageLinkage memungkinkan beberapa pasang nama diletakkan pada file basis yang ditentukan berdasarkan scope-nya.

Terdapat dua tipe dari linkage:
satu, Internal Linkage: identifier menerapkan internal linkage untuk tidak dapat diakses dari luar unit translasi yang telah di deklarasikan pada bagian dalam. Setiap identifier yang bersama dengan unit dapat mengakses identifier yang memiliki internal linkage. Hal ini diterapkan dengan menggunakan keyword staticInternal linkage identifier disimpan dalam bagian inisialisasi dan uninisialisasi dari RAM.

Catatan: static juga memiliki makna dalam referensi scope, tetapi tidak dibahas pada materi ini.

Contoh: Animals.cpp

// Ilustrasi link internal 

// pada bahasa C

#include <stdio.h>

 

static int animals = 8;

const int i = 5;

 

int call_me(void)

{

printf("%d %d", i, animals);

}

Kode program diatas mengimplementasikan hubungan statis pada animal identifier. Pertimbangkan Feed.cpp terletak diunit terjemahan yang sama.

Contoh: Feed.cpp

// Ilustrasi link internal 

// pada bahasa C

#include <stdio.h>

 

int main()

{

call_me();

animals = 2;

printf("%d", animals);

return 0;

}

Ketika animal.cpp dikompilasi bersamaan dengan Feed.cpp, maka hasil yang didapat adalah sebagai berikut
Output: 5 8 2

Baca Juga:

Sekarang, perhatikan bahwa Feed.cpp diletakkan pada lokasi yang berbeda dari unit translasi. Maka akan kompilasi dan running program seperti program sebelumnya hanya jika menggunakan #include "Animals.cpp".

Perhatikan jika Wash.cpp diletakkan pada lokasi ketiga pada unit translasi.

Contoh: Wash.cpp

// Ilustrasi link internal

// pada bahasa C

#include <stdio.h>

#include "animal.cpp" 

// catatan: animal.cpp 

// di include dari file lain

 

int main()

{

call_me();

printf("\n selamat mencuci baju!");

animals = 10;

printf("%d\n", animals);

return 0;

}

Pada hasil kompilasi program didapatkan hasil:
Output:
having fun washing! 10

Terdapat tiga unit translasi (Animals, Feed, Wash) yang ketiganya menggunakan kode animals. Hal ini mengarahkan pada kesimpulan bahwa translasi unit mengakses copy-nya sendiri dari animals. Inilah kenapa didapatkan hasil animals = 8 Animals.cpp, animals = 2 untuk Feed.cpp dan animals = 10 untuk Wash.cpp file. Proses tersebut akan meningkatkan aktifitas memori dan mengurangi kemampuan performa komputer.

Properti lain dari internal linkage adalah hanya jika diimplementasikan ketika variabel memiliki global scope, dan semua konstanta secara otomatis dihubungkan secara internal.

Kegunaan:  Seperti yang diketahui, variabel internal link dilewatkan melalui copy. Jadi, Jika sebuah header file memiliki sebuah fungsi fun1() dan kode program tersebut juga mengandung fun1() tetapi dengan sebuah definisi berbeda, maka dua fungsi tidak akan bertabrakan satu sama lain. Jadi, pada umumnya kegunaan dari internal linkage adalah untuk menyembunyikan fungsi unit lokal translasi yang mengandung method untuk membaca input dari user. Kedua fungsi adalah independen dari setiap fungsi ketika dihubungkan.

dua, Eksternal linkage: sebuah identifier mengimplementasikan eksternal linkage visible terhadap setiap unit translasi. Identifier eskternal linkage dibagi antara unit translasi dan dianggap berada ditingkat terluar program. Dalam praktiknya, hal ini bermakna bahwa harus dilakukan pendefinisian identifier dalam sebuah tempat yang visible terhadap semua, untuk hal tersebut hanya dapat dilakukan dengan hanya satu definisi visible. Hal ini merupakan linkage default untuk variabel dan fungsi scope global. Jadi, semua instance dari sebuah identifier khusus dengan linkage eksternal mengacu pada identifier sama dalam suatu program. Keyword extern berfungsi untuk mengimplementasikan eksternal linkage. Ketika keyword extern digunakan, maka linker akan diberitahu untuk melihat definisi dibagian manapun. Jadi, deklarasi dari identifier eksternal linked tidak mengambil ruang apapun dari identifier extern yang secara umum disimpan dalam inisialisasi dan uninisialisasi atau teks segmen dari RAM.

Sangat mungkin menggunakan variabel extern pada variabel scope lokal. Berikut ini akan dipahami lebih jauh perbedaan antara linkage dan scope.

Contoh:

// Ilustrasi link eksternal

// pada bahasa C

#include <stdio.h>

 

void foo()

{

int a;

extern int b; // baris 1

}

 

void bar()

{

int c;

c = b; // error

}

 

int main()

{

foo();

bar();

}

Error: 'b' was not declared in this scope

Penjelasan: variabel b memiliki scope lokal dalam fungsi foo, meskipun variabel b adalah variabel extern. Perlu dicatat bahwa kompilasi dilakukan sebelum proses linking atau penghubungan; dengan kata lain scope adalah konsep yang digunakan hanya selama fase kompilasi. Setelah program selesai dikompilasi sudah tidak terdapat lagi konsep variabel scope.

Selama proses kompilasi, kompilator yang sama akan melalui fungsi bar() dan mencoba untuk menemukan variabel b. Ketika variabel b telah dideklarasikan extern, maka tidak akan dialokasikan memori oleh compiler, atau dengan kata lain variabel tersebut tidak ada. Kompilator akan membiarkan linker menemukan definisi dari b pada unit translasi, dan linker akan menandai b dengan nilai spesifik dalam definisi. Hanya dengan cara demikian variabel b akan dapat mengalokasikan memori. Namun demikian, karena tidak terdapat deklarasi yang diberikan pada waktu kompilasi program pada scope dari bar(), atau pada global scope, maka kompilator akan memberikan pesan error.

Adalah tugas dari kompilator untuk memastikan semua variabel digunakan pada scope-nya masing-masing. Program yang telah dideklarasikan sebelumnya dapat dikoreksi sebagai berikut.

Contoh:

// Ilustrasi link eksternal

// pada bahasa C

#include <stdio.h>

 

int x = 10;

int z = 5;

 

int main()

{

 

extern int y; // baris 2

extern int z;

 

printf("%d %d %d", x, y, z);

}

 

int y = 2;

Output:
10 2 5

5 komentar untuk "Internal dan Eksternal Linkage Bahasa C Beserta Fungsinya"

  1. Terima kasih akhirnya menemukan blog belajar pemrograman dengan menggunakan bahasa indonesia yang gampang dipahami,,

    BalasHapus
  2. Apa fungsi linkage pada bahasa pemrograman C?

    BalasHapus
    Balasan
    1. Dalam bahasa pemrograman, terutama pada bahasa pemrograman yang dikompilasi dengan bahsa C, C++, dan D, linkage digunakan untuk menjelaskan bagaimana 'nama' dapat atau tidak dapat digunakan untuk merujuk ke suatu entitas yang sama pada seluruh program atau pada satu unit penerjemahan tunggal.

      Hapus
  3. ada berapa tipe linkage atau tautan pada bahasa C?

    BalasHapus
    Balasan
    1. Ada tiga jenis linkage pada bahasa C, yaitu: Linkage eksternal, linkage internal, dan no linkage.

      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 -
- Big things start from small things -