Rabu, November 06, 2019

internal linkage dan eksternal linkage pada bahasa C

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.

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

Definisi
satu, Scope: scope dari identifier adalah bagian dari program dimana identifier dapat diakses secara langsung. Pada bahasa c, semua identifier adalah scope lexical (atau static).

dua, 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.

tiga, 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 linkage. Linkage 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 static. Internal linkage identifier disimpan dalam bagian inisialisasi dan uninisialisasi dari RAM.

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

beberapa contoh:
Animals.cpp


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

Feed.cpp


Ketika animal.cpp dikompilasi bersamaan dengan Feed.cpp, maka hasil yang didapat adalah sebagai berikut

Output: 5 8 2

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.

Wash.cpp

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 inisiaalisasi 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.

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. Compiler 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 compiler akan memberikan pesan error.

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

Output:
10 2 5





Related Posts

internal linkage dan eksternal linkage pada bahasa C
Oleh

"semoga yang memberikan komentar diberikan berkah kebaikan dari Allah, dijauhkan dari kejahatan, dan diberikan pahala ilmu dan amal jariyah dari sepenggal kata yang ia tinggalkan amiin :) "