2 9
2 9
untuk menjalankan program-program aplikasi. Implementasi khusus dari sistem berubah seiring
berjalannya waktu, tapi konsep dasarnya tidak. Semua sistem komputer memiliki kesamaan
komponen perangkat keras dan perangkat lunak yang melakukan fungsi serupa. Buku ini ditulis
untuk programmer yang ingin keahlian mereka lebih baik dengan memahami
bagaimana komponen ini bekerja dan bagaimana cara melakukan kecocokan dan kinerja
dari program mereka.
Anda siap untuk perjalanan yang menyenangkan. Jika Anda mendedikasikan diri untuk
belajar konsep-konsep dalam buku ini, maka anda akan menjadi seorang yang langka kekuatan
programer dengan mendapat pencerahan oleh pemahaman tentang sistem komputer yang
mendasar dan dampaknya terhadap program aplikasi Anda.
Anda akan belajar keterampilan praktis seperti bagaimana menghindari numeric yang
membingungkan disebabkan oleh cara komputer merepresentasikan angka. Anda akan belajar
caranya untuk mengoptimalkan kode C Anda dengan menggunakan trik pintar yang
memanfaatkan desain modern prosesor dan sistem memori. Anda akan belajar bagaimana
compiler mengimplementasikan prosedur panggilan dan bagaimana menggunakan pengetahuan
ini untuk menghindari lubang keamanan penyangga dari luapan kerentanan yang mengganggu
jaringan dan perangkat lunak internet.
Kamu akan belajar bagaimana mengenali dan menghindari kesalahan buruk selama
menghubungkan suatu hal yang membingungkan yang dialami pemrogram rata-rata.
Anda akan belajar bagaimana menulis shell Unix Anda sendiri memiliki paket alokasi
penyimpanan dinamis, dan bahkan server Web Anda sendiri. Kamu akan Pelajari janji dan
perangkap concurrency, topik yang semakin penting sebagai beberapa core prosesor terintegrasi
ke dalam chip tunggal.
Dalam teks klasik mereka pada bahasa pemrograman C , Kernighan dan Ritchie mengenalkan
pembaca kepada C dengan menggunakan program Hello world yang ditunjukkan pada Gambar
1.1. Meskipun Hello world adalah program yang sangat sederhana, setiap bagian utama sistem
harus bekerja di konser agar bisa berjalan sampai selesai. Dalam arti, tujuan buku ini adalah
untuk membantu Anda memahami apa yang terjadi dan mengapa, saat Anda menjalankan
program hello world pada sistem anda.Kami memulai studi tentang sistem dengan menelusuri
masa program hello world, Sejak saat itu diciptakan oleh seorang programmer, sampai berjalan
pada sebuah sistem, mencetak pesan sederhana, dan berakhir. Seiring kita mengikuti masa
program, kita akan lakukan secara singkat dengan memperkenalkan konsep utama, terminologi,
dan komponen yang masuk ke dalamnya memproses. Bab selanjutnya akan memperluas gagasan
ini.
1.1 Informasi Apakah Bits + Konteks
Program hello world kami memulai kehidupan sebagai program sumber (atau sumber file) yang
Dibuat programmer dengan editor dan menyimpan dalam teks hello.c. source programnya adalah
urutan bit, masing-masing dengan nilai 0 atau 1, terorganisir dalam potongan 8 bit yang disebut
byte. Setiap byte mewakili beberapa karakter teks dalam program.
Sebagian besar sistem modern mewakili teks dengan menggunakan standar ASCII yang
mewakili setiap karakter dengan sebuah keunikan ukuran byte nilai integer. Sebagai contoh,
Gambar 1.2 menunjukkan representasi dari program ASCII.
Program hello.c disimpan dalam sebuah file sebagai urutan byte. Setiap byte memiliki
nilai integer yang sesuai dengan beberapa karakter. Misalnya, byte pertama
memiliki nilai integer 35, yang sesuai dengan karakter #. Byte kedua
memiliki nilai integer 105, yang sesuai dengan karakter i, dan seterusnya. Melihat
bahwa setiap baris teks diakhiri dengan karakter newline tak terlihat \n, yaitu
diwakili oleh nilai integer 10. File seperti hello.c yang terdiri secara eksklusif
dari karakter ASCII dikenal sebagai text files. Semua files lainnya dikenal sebagai binary file.
Presentasi dari hello.c menggambarkan secara mendasar : semua informasi
dalam sistem - termasuk disk files, program yang tersimpan dalam memori, data pengguna
tersimpan di dalam memori, dan data yang ditransfer melintasi jaringan - digambarkan sebagai
sekumpulan bit.
Satu-satunya hal yang membedakan objek data berbeda adalah konteksnya
Yang kita lihat. Misalnya, dalam konteks yang berbeda, urutan byte yang sama
mungkin mewakili integer, foating point number, character string, atau petunjuk mesin.
Asprogramer, kita perlu memahami representasi dari angka-angka karena mereka tidak sama
dengan bilangan bulat dan bilangan real. Mereka adalah perkiraan terbatas yang dapat
berperilaku dengan cara yang tak terduga. Ide dasarnya akan dieksplorasi secara rinci dalam Bab
2.
Asal usul bahasa pemrograman C
C dikembangkan dari tahun 1969 sampai 1973 oleh Dennis Ritchie dari Bell Laboratories.
Amerika Nasional Standards Institute (ANSI) menilai standar ANSI C pada tahun 1989, dan
standarisasi ini kemudian menjadi tanggung jawab Organisasi Standar Internasional (ISO).
Standar the C bahasa dan seperangkat fungsi perpustakaan yang dikenal sebagai perpustakaan
standar C. Kernighan dan Ritchie menjelaskan
ANSI C dalam buku klasik mereka, yang dikenal sebagai K & R. Di dalamnya Ritchie berkata
C adalah aneh,cacat, dan sebuah kesuksesan yang luar biasa , Jadi kenapa kesuksesan?
C terkait erat dengan sistem operasi unix. C dikembangkan sejak awal sebagai bahasa
pemrograman sistem untuk Unix Sebagian besar kernel Unix, dan semua alat
pendukungnya dan perpustakaan, ditulis dalam bahasa C. Karena Unix menjadi populer
di universitas pada akhir 1970-an dan awal 1980-an, banyak orang terpapar C dan
menemukan bahwa mereka menyukainya. Sejak Unix ditulis hampir seluruhnya di C,
bisa dengan mudah di porting ke mesin baru, yang menciptakan khalayak yang lebih luas
lagi baik C dan Unix.
C adalah kecil, bahasa sederhana. Desainnya dikontrol oleh satu orang, bukan daripada
komite, dan hasilnya adalah desain yang bersih dan konsisten dengan sedikit bagasi.
Buku K&R menggambarkan bahasa lengkap dan perpustakaan standar, dengan banyak
contoh dan latihan, hanya dalam 261 halaman. Kesederhanaan C membuatnya relatif
mudah dipelajari dan dipasarkan ke komputer yang berbeda.
C dirancang untuk tujuan praktis. C dirancang untuk mengimplementasikan sistem
operasi Unix. Belakangan, orang lain menemukan bahwa mereka bisa menulis program
yang mereka inginkan, tanpa bahasa yang menghalangi.
C adalah bahasa pilihan untuk pemrograman sistem, dan ada basis terinstal besar
program aplikasi juga. Namun, itu tidak sempurna untuk semua programmer dan semua situasi.
C pointer adalah sumber umum kebingungan dan kesalahan pemrograman. C juga tidak memiliki
dukungan eksplisit untuk abstraksi yang berguna seperti kelas, objek, dan pengecualian. Bahasa
yang lebih baru seperti C ++ dan Java alamat isu-isu ini untuk program aplikasi.
1.2 Program Apakah Yang Diterjemahkan oleh Program lain ke Bentuk Yang
Berbeda
Program hello world memulai kehidupan sebagai program C tingkat tinggi karena dapat dibaca
dan dipahami oleh manusia dalam bentuk itu. Namun, untuk menjalankan hello.c pada sistem,
pernyataan C individu harus diterjemahkan oleh program lain ke urutan instruksi bahasa mesin
bertingkat rendah. Instruksi ini kemudian dikemas dalam bentuk yang disebut executable object
files dan disimpan sebagai biner disk file. Program objek juga disebut sebagai metode yang dapat
diverifikasi.
Pada sistem Unix, terjemahan dari file sumber ke file objek dilakukan oleh compiler driver:
Di sini, kompiler Gcc membaca sumber hello.c dan menerjemahkannya menjadi
sebuah objek yang dapat dieksekusi file hello. Terjemahan dilakukan dalam urutan
dari empat fasa yang ditunjukkan pada Gambar 1.3. Program yang melakukan empat fase
(preprocessor, compiler, assembler, dan linker) dikenal secara kolektif sebagai
Compilation system.
Fase Preprocessing. preprocessor (cpp) memodifikasi program C asli sesuai arahan yang
diawali dengan karakter #. Misalnya, #include<stdio.h> adalah perintah di line pertama
yang menjelaskan kepada preprocessor untuk membaca isi dari sistem header stdio.h dan
memasukkannya secara langsung ke dalam teks program , Hasilnya di program C
lainnya,biasanya dengan perintah i.suffix
Fase Compilation . kompilator (cc1)menerjemahkan teks hello.i ke dalam teks hello.s,
yang berisi program bahasa assembly. Setiap pernyataan dalam program bahasa assembly
persis menggambarkan satu level rendah instruksi bahasa mesin dalam bentuk teks
standar. Bahasa assembly adalah berguna karena menyediakan bahasa output yang umum
untuk kompiler yang berbeda untuk bahasa tingkat tinggi yang berbeda. Misalnya,
kompiler C dan Fortran kompiler keduanya menghasilkan output dalam bahasa assembly
yang sama.
Fase Assembly, assembler (as) menerjemahkan hello.s menjadi instruksi bahasa mesin,
paket mereka dalam bentuk yang dikenal sebagai program relocatable object, dan
menyimpan hasilnya di objek hello.o.file hello.o ini adalah sebuah file biner yang bytenya
menyandikan instruksi bahasa mesin daripada karakter. Jika kita melihat hello.o dengan
editor teks, itu akan muncul menjadi omong kosong.
Linking phase. Perhatikan bahwa program hello memanggil fungsi printf, yang adalah
bagian dari library C standar yang disediakan oleh setiap compiler C. fungsi printf berada
pada file object precompliled terpisah yang disebut printf.o, yang pasti bisa digabungkan
dengan program hello.o kami.Linker (id)menangani pengagabungan ini. Hasilnya file
hello, yang adalah executable object fle siap di load ke memori dan dieksekusi oleh
sistem.
Proyek GNU
GCC adalah salah satu dari banyak alat yang berguna yang dikembangkan oleh proyek GNU
(singkatan dari GNUs bukan Unix). Proyek GNU adalah sebuah amal bebas-pajak yang dimulai
oleh Richard Stallman pada tahun 1984, dengan tujuan ambisius
mengembangkan sistem seperti Unix yang lengkap yang kode sumbernya tidak terbebani oleh
batasan bagaimana caranya itu bisa dimodifikasi atau didistribusikan. Proyek GNU telah
mengembangkan lingkungan dengan semua yang utama komponen dari sistem operasi Unix,
kecuali kernel, yang dikembangkan secara terpisah oleh proyek Linux Lingkungan GNU
mencakup editor EmAcs, compiler Gcc, debugger GDb, assembler, linker, utilitas untuk
memanipulasi binari, dan komponen lainnya. Kompiler Gcc memiliki tumbuh untuk mendukung
berbagai bahasa, dengan kemampuan menghasilkan kode untuk banyak hal yang berbeda
mesin. Bahasa yang didukung meliputi C, C ++, Fortran, Java, Pascal, Objective-C, dan Ada.
Proyek GNU merupakan prestasi yang luar biasa, namun seringkali terlewatkan. Buka modern
pergerakan sumber (umumnya terkait dengan Linux) berutang asal intelektualnya ke proyek
GNU Gagasan tentang perangkat lunak bebas (bebas seperti dalam bebas berbicara, not
bebas bir. Selanjutnya, Linux berutang banyak popularitas pada alat GNU, yang menyediakan
lingkungan untuk kernel Linux.
Shell adalah baris perintah yang mencetak secara cepat, menunggu anda untuk mengetikkan
baris perintah , dan kemudian melakukan perintah. Jika kata pertama dari perintah
line tidak sesuai dengan perintah shell built-in, maka shell mengasumsikan itu
itu adalah nama dari sebuah file executable yang harus dimuat dan dijalankan. Jadi dalam kasus
ini, beban shell dan menjalankan program hello dan kemudian menunggu untuk
menghentikannya. Program hello mencetak pesannya ke layar bertingkat dan kemudian berakhir.
Kemudian shell mencetak secara cepat dan menunggu baris perintah masukan berikutnya.