Berapa banyak baris kode dalam program berikut?
#include <iostream>
int main()
{
std::cout << "Hello, world!\n";
return 0;
}
Anda mungkin menjawab 7 (atau 6 jika Anda tidak menghitung garis kosong, atau 4 jika Anda tidak menghitung kawat gigi).
Namun kompiler Anda melihat sesuatu yang sangat berbeda:
~$ cpp hello.cpp | wc
18736 40822 437015
Ya, itu 18,7 KLOC hanya untuk "Halo, dunia!" program. Kompilator C ++ harus menguraikan semua itu. Ini adalah alasan utama mengapa kompilasi C ++ memakan waktu begitu lama dibandingkan dengan bahasa lain, dan mengapa bahasa modern menghindari file header.
Pertanyaan yang lebih baik adalah
Mengapa tidak C ++ memiliki file header?
C ++ dirancang untuk menjadi superset dari C, jadi ia harus menyimpan file header untuk kompatibilitas.
OK, jadi mengapa C memiliki file header?
Karena model kompilasi terpisah yang primitif. File objek yang dihasilkan oleh kompiler C tidak menyertakan informasi tipe apa pun, jadi untuk mencegah kesalahan tipe Anda perlu memasukkan informasi ini dalam kode sumber Anda.
~$ cat sqrtdemo.c
int main(void)
{
/* implicit declaration int sqrt(int) */
double sqrt2 = sqrt(2);
printf("%f\n", sqrt2);
return 0;
}
~$ gcc -Wall -ansi -lm -Dsqrt= sqrtdemo.c
sqrtdemo.c: In function ‘main’:
sqrtdemo.c:5:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
sqrtdemo.c:5:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
~$ ./a.out
2.000000
Menambahkan deklarasi tipe yang tepat memperbaiki bug:
~$ cat sqrtdemo.c
#undef printf
#undef sqrt
int printf(const char*, ...);
double sqrt(double);
int main(void)
{
double sqrt2 = sqrt(2);
printf("%f\n", sqrt2);
return 0;
}
~$ gcc -Wall -ansi -lm sqrtdemo.c
~$ ./a.out
1.414214
Perhatikan bahwa tidak ada #include
s. Tetapi ketika Anda menggunakan sejumlah besar fungsi eksternal (yang sebagian besar program akan), secara manual menyatakan mereka menjadi membosankan dan rentan kesalahan. Jauh lebih mudah menggunakan file header.
Bagaimana bahasa modern dapat menghindari file header?
Dengan menggunakan format file objek berbeda yang menyertakan informasi jenis. Misalnya, format file Java * .class menyertakan "deskriptor" yang menentukan jenis bidang dan parameter metode.
Ini bukan penemuan baru. Sebelumnya (1987), ketika Borland menambahkan "unit" yang dikompilasi secara terpisah ke Turbo Pascal 4.0, ia memilih untuk menggunakan *.TPU
format baru daripada Turbo C *.OBJ
untuk menghapus kebutuhan file header.