Minggu, 23 Mei 2010

Bahasa C

C(si) merupakan bahasa pemrograman yang dikembangkan antara tahun 1969 dan 1973 oleh Dennis Ritchie di Bell Telephone Laboratories untuk digunakan dengan Unix sistem operasi. Walaupun C dirancang untuk mengimplementasikan perangkat lunak sistem, juga banyak digunakan untuk mengembangkan portabel aplikasi perangkat lunak.

C adalah salah satu bahasa pemrograman paling populer sepanjang masa dan ada sangat sedikit arsitektur komputer yang C compiler tidak ada. C telah sangat mempengaruhi bahasa pemrograman populer lainnya banyak, terutama C + + , yang dimulai sebagai perpanjangan ke C.

Desain

C adalah suatu imperatif ( prosedural ) implementasi sistem bahasa. Hal ini dirancang untuk menjadi dikompilasi menggunakan relatif mudah compiler , untuk memberikan tingkat akses yang rendah ke memori, untuk menyediakan bahasa konstruksi peta yang efisien untuk instruksi mesin, dan membutuhkan minimal waktu dukungan dijalankan . C Oleh karena itu berguna untuk banyak aplikasi yang tadinya dikodekan dalam bahasa assembly .

Meskipun tingkat rendah kemampuannya, bahasa dirancang untuk mendorong cross-platform pemrograman. Sebuah standar-compliant dan portable program C ditulis dapat dikompilasi untuk berbagai macam platform yang sangat komputer dan sistem operasi dengan beberapa perubahan pada kode sumbernya. Bahasa telah menjadi tersedia pada rentang yang sangat luas platform, dari embedded microcontrollers ke superkomputer .

Karakteristik

Seperti bahasa-bahasa imperatif yang paling dalam ALGOL tradisi, C memiliki fasilitas untuk pemrograman terstruktur dan memungkinkan lingkup variabel leksikal dan rekursi , sementara statis tipe sistem operasi yang tidak diharapkan mencegah banyak. Dalam C, semua kode executable yang terkandung dalam fungsi . Fungsi parameter selalu dilewatkan dengan nilai. Pass-by-referensi disimulasikan dalam C dengan eksplisit lewat pointer nilai. Heterogen tipe data agregat ( struct ) memungkinkan terkait data elemen yang akan digabungkan dan dimanipulasi sebagai sebuah unit. Program C sumber teks bebas-format, dengan menggunakan koma sebagai pernyataan terminator.

C juga pameran yang lebih spesifik karakteristik sebagai berikut:
1. Sebagian lemah mengetik , misalnya, karakter dapat digunakan sebagai integer
2. Low-level akses ke memori komputer dengan mengubah alamat mesin untuk diketik pointer
3. Fungsi dan data pointer mendukung ad hoc -waktu polimorfisme menjalankan
4. array pengindeksan sebagai gagasan sekunder, didefinisikan dalam istilah aritmetik pointer
5. Sebuah preprocessor untuk makro definisi, kode sumber inklusi file, dan kompilasi bersyarat
6. fungsi kompleks seperti I / O , string manipulasi, dan fungsi matematika konsisten dilimpahkan ke rutinitas perpustakaan
7. Sejumlah besar operator senyawa, seperti += , -= , *= , ++ , dll

Sejarah

Perkembangan awal

Pengembangan awal K terjadi di AT & T Bell Labs antara tahun 1969 dan 1973; [3] menurut Ritchie, yang kreatif masa paling terjadi pada tahun 1972. Ini dinamakan "C" karena fitur-fiturnya berasal dari bahasa yang sebelumnya disebut " B ", yang menurut Ken Thompson adalah-down versi dilucuti dari BCPL bahasa pemrograman.

Asal usul C terkait erat dengan perkembangan Unix sistem operasi, awalnya diimplementasikan dalam bahasa assembly pada PDP-7 dengan Ritchie dan Thompson, menggabungkan beberapa ide dari rekan-rekan. Akhirnya mereka memutuskan untuk port sistem operasi ke -PDP 11 . B's ketidakmampuan untuk mengambil keuntungan dari beberapa PDP 11-'s fitur, terutama byte addressability, mengarah ke pengembangan versi awal C.

PDP-11 versi asli dari sistem Unix dikembangkan dalam bahasa assembly. Pada 1973, dengan penambahan struct jenis, bahasa C telah menjadi cukup kuat bahwa sebagian dari Unix kernel ditulis ulang dalam C. Ini adalah salah satu dari kernel sistem operasi pertama kali diimplementasikan dalam bahasa lain selain perakitan. (Sebelumnya kasus termasuk Multics sistem (ditulis dalam PL / I ), dan MCP ( Master Control Program ) untuk Burroughs B5000 ditulis dalam ALGOL tahun 1961.)

K & R C

Pada tahun 1978, Brian Kernighan dan Dennis Ritchie menerbitkan edisi pertama dari The C Programming Language . [8] Buku ini, dikenal programmer C sebagai "K & R", melayani selama bertahun-tahun sebagai informal spesifikasi bahasa. Versi C yang menggambarkan sering disebut sebagai K & R C. Edisi kedua dari buku ini [1] meliputi kemudian ANSI C standar.

K & R memperkenalkan beberapa fitur bahasa:

standar I / O perpustakaan
long int tipe data
unsigned int tipe data
operator penugasan senyawa dalam bentuk = op (seperti =- ) diubah ke bentuk op = untuk menghapus ambiguitas semantik diciptakan oleh konstruksi sebagai i=-10 , yang telah ditafsirkan sebagai i =- 10 bukan mungkin dimaksudkan i = -10

Bahkan setelah publikasi standar C 1989, untuk K bertahun-tahun & R C masih dianggap sebagai "lowest common denominator" yang C programmer membatasi diri ketika portabilitas maksimum yang diinginkan, karena kompiler yang lebih tua banyak yang masih digunakan, dan karena K ditulis dengan cermat & R kode C dapat hukum standar C juga.

Pada versi awal C, hanya fungsi yang kembali non- int nilai harus dinyatakan jika digunakan sebelum definisi fungsi, sebuah fungsi yang digunakan tanpa ada deklarasi sebelumnya diasumsikan mengembalikan tipe int , jika nilai digunakan.

Sebagai contoh:

panjang some_function ();
/ * Int * / other_function ();

/ * Int * / calling_function ()
{
lama test1;
register / * * int / test2;

test1 = some_function ();
if (test1> 0)
test2 = 0;
lain
test2 = other_function ();
kembali test2;
}

Semua di atas komentar-out int deklarasi bisa dihilangkan di K & R C.
Karena K & R deklarasi fungsi tidak mencakup informasi tentang argumen fungsi, parameter fungsi cek jenis tidak dilakukan, meskipun beberapa kompiler akan mengeluarkan pesan peringatan jika fungsi setempat disebut dengan jumlah argumen yang salah, atau jika beberapa panggilan ke fungsi eksternal menggunakan nomor yang berbeda atau jenis argumen. alat terpisah seperti Unix's serabut utilitas dikembangkan bahwa (antara lain) dapat memeriksa konsistensi penggunaan fungsi di file sumber beberapa.

Pada tahun-tahun setelah publikasi K & R C, beberapa fitur tidak resmi ditambahkan ke dalam bahasa, yang didukung oleh kompiler dari AT & T dan beberapa vendor lainnya. Ini termasuk:

void fungsi (fungsi yaitu dengan tidak ada nilai kembali)
fungsi kembali struct atau union jenis (daripada pointer)
tugas untuk struct tipe data
disebutkan jenis

Jumlah besar ekstensi dan kurangnya kesepakatan pada perpustakaan standar , bersama dengan popularitas bahasa dan kenyataan bahwa tidak bahkan compiler Unix justru menerapkan spesifikasi K & R, menyebabkan perlunya standardisasi.

ANSI C dan ISO C

Artikel utama: ANSI C

Selama 1970-an dan 1980-an, versi C dilaksanakan untuk berbagai macam komputer mainframe , minicomputer , dan mikrokomputer , termasuk IBM PC , sebagai popularitasnya mulai meningkat secara signifikan.

Pada tahun 1983, American National Standards Institute (ANSI) membentuk komite, X3J11, untuk mendirikan sebuah spesifikasi standar C. Pada tahun 1989, standar ini disahkan sebagai ANSI X3.159-1989 "Bahasa Pemrograman C". Versi bahasa sering disebut sebagai ANSI C , Standar C, atau kadang-kadang C89.

Pada tahun 1990, standar ANSI C (dengan perubahan format) diadopsi oleh Organisasi Internasional untuk Standarisasi (ISO) sebagai ISO / IEC 9899:1990, yang kadang-kadang disebut C90. Oleh karena itu, istilah "C89" dan "C90" mengacu pada bahasa pemrograman yang sama.

ANSI, seperti lain badan standar nasional, tidak lagi mengembangkan standar C independen, namun menunda ke standar C ISO. adopsi Nasional tentang perbaruan untuk standar internasional biasanya terjadi dalam waktu satu tahun publikasi ISO.

Salah satu tujuan dari proses standarisasi C untuk menghasilkan superset K & R C, menggabungkan banyak fitur yang tidak resmi kemudian diperkenalkan. Komite standar juga termasuk berbagai fitur tambahan seperti prototipe fungsi (dipinjam dari C + +), void pointer, dukungan untuk internasional rangkaian karakter dan locales , dan perangkat tambahan preprocessor. Sintaks untuk deklarasi parameter juga ditingkatkan untuk menyertakan gaya yang digunakan dalam C + +, meskipun antarmuka K & R terus diizinkan, untuk kompatibilitas dengan kode sumber yang ada.

C89 didukung oleh kompiler C saat ini, dan sebagian besar kode C ditulis saat ini didasarkan pada itu. Setiap program yang ditulis hanya pada Standard C dan tanpa bergantung pada asumsi perangkat keras akan berjalan dengan benar pada setiap platform dengan implementasi C sesuai, dalam batas sumber dayanya. Tanpa tindakan pencegahan seperti itu, program dapat mengumpulkan hanya pada platform tertentu atau dengan sebuah kompiler tertentu, karena, misalnya, untuk penggunaan non-standar perpustakaan, seperti GUI perpustakaan, atau untuk ketergantungan pada-atau platform-khusus atribut kompiler seperti sebagai ukuran yang tepat dari tipe data dan byte endianness .

Dalam kasus di mana kode harus compilable baik oleh standar-sesuai atau K & C berbasis kompiler R, __STDC__ makro dapat digunakan untuk memisahkan kode ke dan K & R bagian Standar untuk mencegah menggunakan di K & C berbasis kompiler R fitur yang tersedia hanya dalam Standar C .

C99

Artikel utama: C99
Setelah proses / standarisasi ANSI ISO, spesifikasi bahasa C tetap relatif statis untuk beberapa waktu. Pada tahun 1995 Normatif Perubahan 1 dengan standar C 1990 diterbitkan, untuk memperbaiki beberapa detail dan untuk menambahkan dukungan yang lebih luas untuk set karakter internasional. Standar C selanjutnya direvisi pada akhir 1990-an, yang mengarah ke publikasi ISO / IEC 9899:1999 pada tahun 1999, yang umumnya disebut sebagai " C99 ". Sejak saat itu telah diubah tiga kali oleh Teknis daftar kesalahan dlm tulisan. Standar C internasional dipertahankan oleh kelompok kerja ISO / IEC JTC1/SC22 / WG14.

C99 memperkenalkan beberapa fitur baru, termasuk fungsi inline , beberapa baru tipe data (termasuk long long int dan complex tipe untuk mewakili bilangan kompleks ), panjang variabel array , dukungan untuk macro variadic (macro variabel arity ) dan dukungan untuk satu baris Komentar dimulai dengan // , seperti pada BCPL atau C + +. Banyak dari ini sudah diimplementasikan sebagai ekstensi di beberapa compiler C.

C99 adalah untuk sebagian besar kompatibel dengan C90, tetapi ketat dalam beberapa hal, khususnya, sebuah deklarasi yang tidak memiliki sebuah penspesifikasi tipe tidak lagi memiliki int secara implisit diasumsikan. Sebuah makro standar __STDC_VERSION__ didefinisikan dengan nilai 199901L untuk menunjukkan bahwa dukungan C99 tersedia. GCC , Sun Studio dan compiler C lainnya sekarang mendukung banyak atau semua fitur baru dari C99.

C1X

Artikel utama: C1X
Pada tahun 2007, bekerja mulai mengantisipasi pembetulan standar C, informal yang disebut "C1X". C standar Komite telah mengadopsi pedoman untuk membatasi penerapan fitur baru yang belum diuji oleh implementasi yang ada.

Penggunaan

C sering digunakan untuk " sistem pemrograman ", termasuk menerapkan sistem operasi dan sistem embedded aplikasi, karena kombinasi karakteristik yang diinginkan seperti portabilitas kode dan efisiensi, kemampuan untuk mengakses alamat hardware tertentu, kemampuan untuk pun jenis yang cocok dikenakan akses data eksternal persyaratan, dan rendah run-time permintaan pada sumber daya sistem. C juga dapat digunakan untuk pemrograman website menggunakan CGI sebagai "gateway" untuk informasi antara aplikasi Web, server, dan browser. [9] Beberapa alasan untuk memilih C di atas bahasa ditafsirkan adalah kecepatan, stabilitas, dan dekat-universal ketersediaan. [10]

Satu konsekuensi dari penerimaan luas's C dan efisiensi adalah bahwa kompiler, perpustakaan, dan interpreter bahasa pemrograman lain sering diimplementasikan dalam C. Implementasi utama dari Python ( CPython ), Perl 5, dan PHP semua ditulis dalam C.

Karena lapisan tipis abstraksi dan overhead rendah, C memungkinkan implementasi yang efisien algoritma dan struktur data, yang berguna untuk program yang melakukan banyak perhitungan. Sebagai contoh, GNU Multi-Precision Library , yang GNU Ilmiah Perpustakaan , Mathematica dan MATLAB sebagian atau seluruhnya ditulis dalam C.

C kadang-kadang digunakan sebagai bahasa perantara oleh implementasi dari bahasa lain. Pendekatan ini dapat digunakan untuk mudah dibawa atau kenyamanan; dengan menggunakan C sebagai bahasa perantara, tidak perlu untuk mengembangkan generator kode mesin khusus. Beberapa bahasa dan compiler C yang telah menggunakan cara ini BITC , C + + , COBOL , Eiffel , Gambit , GHC , mencicit , dan Vala . Namun, C dirancang sebagai bahasa pemrograman, bukan sebagai bahasa target compiler, dan dengan demikian kurang ideal untuk digunakan sebagai bahasa perantara. Hal ini mengakibatkan pengembangan berdasarkan menengah bahasa-C seperti C - .

C juga telah banyak digunakan untuk mengimplementasikan pengguna akhir aplikasi, namun banyak pembangunan yang telah bergeser ke bahasa yang lebih baru.

Sintaks

Artikel utama: sintaks C
C memiliki tata bahasa resmi yang ditetapkan oleh standar C. [11] Tidak seperti bahasa seperti FORTRAN 77 , kode sumber C dalam bentuk-bebas yang memungkinkan penggunaan sewenang-wenang spasi dengan kode format, bukan berbasis atau teks-line berbasis pembatasan kolom . Komentar dapat tampak baik antara pembatas /* dan */ , atau (di C99) berikut // sampai akhir baris.

file sumber C berisi deklarasi dan definisi fungsi. definisi Fungsi, pada gilirannya, berisi deklarasi dan pernyataan . Deklarasi baik mendefinisikan tipe baru dengan menggunakan kata kunci seperti struct , union , dan enum , atau menetapkan jenis dan mungkin penyimpanan cadangan untuk variabel baru, biasanya dengan menulis jenis diikuti dengan nama variabel. Kata kunci seperti char dan int menetapkan built-in jenis. Bagian kode yang diapit oleh kurung ( { dan } , kadang-kadang disebut "kurung kurawal") untuk membatasi ruang lingkup deklarasi dan untuk bertindak sebagai pernyataan tunggal untuk struktur kontrol.

Sebagai bahasa imperatif, C menggunakan laporan untuk menentukan tindakan. Yang umum pernyataan yang paling adalah pernyataan ekspresi, yang terdiri dari sebuah ekspresi untuk dievaluasi, diikuti dengan titik koma, sebagai efek samping dari evaluasi, fungsi dapat disebut dan variabel dapat diberikan nilai-nilai baru. memodifikasi urutan normal pelaksanaan laporan, C menyediakan beberapa laporan diidentifikasi aliran kontrol reserved. kata kunci Untuk pemrograman terstruktur didukung oleh if (- else ) eksekusi kondisional dan dengan do - while , while , dan for eksekusi berulang (looping). Ini for pernyataan memiliki inisialisasi terpisah, pengujian, dan ekspresi reinitialization, salah satu atau semua yang dapat dihilangkan. break dan continue dapat digunakan untuk meninggalkan terdalam melampirkan pernyataan loop atau melompat ke reinitialization nya. Ada juga non-terstruktur goto pernyataan yang langsung ke cabang yang ditunjuk label dalam fungsi. switch memilih case akan dieksekusi berdasarkan nilai dari sebuah ekspresi integer.

Ekspresi dapat menggunakan berbagai built-in operator (lihat di bawah) dan mungkin berisi pemanggilan fungsi. Urutan argumen untuk fungsi dan operand dengan operator kebanyakan dievaluasi adalah tidak ditentukan. Evaluasi bahkan mungkin disisipkan. Namun, efek samping semua (termasuk penyimpanan untuk variabel) akan terjadi sebelum "berikutnya titik urutan "; poin urutan meliputi akhir setiap pernyataan ekspresi, dan masuk ke dan kembali dari setiap pemanggilan fungsi. Urutan poin juga terjadi selama evaluasi ekspresi mengandung operator tertentu ( && , || , ?: dan operator koma ). Hal ini memungkinkan tingkat tinggi optimasi kode obyek oleh kompilator, tetapi membutuhkan C programmer lebih berhati-hati untuk memperoleh hasil yang dapat diandalkan daripada yang dibutuhkan untuk bahasa pemrograman lainnya.

Meskipun menirukan oleh banyak bahasa karena keakraban secara luas, sintaks C sering dikritik. Sebagai contoh, Kernighan dan Ritchie mengatakan dalam Pendahuluan The C Programming Language, "C, seperti bahasa lainnya, memiliki cacat tersebut;. Beberapa operator telah salah prioritas yang beberapa bagian syntax bisa lebih baik."

Beberapa masalah khusus perlu diperhatikan adalah:

Tidak memeriksa jumlah dan jenis argumen sebelum C99 ketika deklarasi fungsi memiliki daftar parameter kosong. (Ini menyediakan kompatibilitas dengan K & R C , yang tidak memiliki prototipe.)
Beberapa dipertanyakan pilihan diutamakan operator, seperti yang disebutkan oleh Kernighan dan Ritchie di atas, seperti == mengikat lebih erat dari & dan | dalam ekspresi seperti x & 1 == 0 , yang perlu ditulis (x & 1) == 0 harus benar dievaluasi.
Penggunaan = operator, yang digunakan dalam matematika untuk kesetaraan, untuk menunjukkan tugas, mengikuti preseden dari Fortran dan PL / I , tapi tidak seperti ALGOL dan turunannya. Ritchie membuat keputusan ini sintaks desain sadar, terutama didasarkan pada argumen bahwa tugas terjadi lebih sering daripada perbandingan.
Kesamaan dan kesetaraan operator penugasan ( = dan == ), sehingga mudah untuk sengaja mengganti satu untuk yang lain. Dalam banyak kasus, masing-masing dapat digunakan dalam konteks yang lain tanpa kesalahan kompilasi (meskipun beberapa compiler menghasilkan peringatan). Misalnya, ekspresi kondisional dalam if (a=b) adalah benar jika a tidak nol setelah penugasan tersebut. [12]
Kurangnya infiks operator untuk benda yang kompleks, terutama untuk operasi string, membuat program-program yang sangat bergantung pada operasi ini (diimplementasikan sebagai fungsi sebagai gantinya) agak sulit untuk dibaca.
Sebuah sintaks deklarasi bahwa beberapa menemukan unintuitive, khususnya untuk fungsi pointer . (Ide Ritchie adalah untuk mendeklarasikan pengenal dalam konteks menyerupai menggunakan mereka: " deklarasi mencerminkan menggunakan ".)

Kata kunci

C89 memiliki 32 kata kunci (reserved kata dengan arti khusus): auto , break , case , char , const , continue , default , do , double , else , enum , extern , float , for , goto , if , int , long , register , return , short , signed , sizeof , static , struct , switch , typedef , union , unsigned , void , volatile , dan while .

C99 menambahkan lima kata kunci yang lebih: inline , restrict , _Bool , _Complex , dan _Imaginary .

Operator

Artikel utama: Operator di C dan C + +
C mendukung kaya set operator , yang simbol yang digunakan dalam suatu ekspresi untuk menentukan manipulasi yang dilakukan saat mengevaluasi ekspresi itu. C memiliki operator untuk:

aritmatika : + , - , * , / , %
tugas : =
ditambah tugas : += , -= , *= , /= , %= , &= , |= , ^= , <<= , >>=
bitwise logika : ~ , & , | , ^
bitwise pergeseran : << , >>
logika boolean : ! , && , ||
bersyarat evaluasi : ? : ? :
kesetaraan pengujian: == , !=
memanggil fungsi : ( )
penambahan dan pengurangan: ++ dan --
seleksi anggota : . , ->
ukuran objek: sizeof
Agar hubungan : < , <= , > , >=
referensi dan dereference : & , * , [ ]
sequencing: ,
subexpression pengelompokan : ( )
jenis konversi : ( typename )

"Halo, dunia" contoh

The " halo, dunia "misalnya, yang muncul dalam edisi pertama K & R , telah menjadi model bagi program pengantar dalam buku pelajaran pemrograman paling, tanpa memandang bahasa pemrograman. Program mencetak "halo, dunia" ke output standar , yang biasanya satu atau tampilan layar terminal.

Versi asli adalah: [13]

main ()
{
printf ("hello, dunia \ n");
}

Sebuah standar-sesuai "hello, world" program adalah: [nb 1]

# Include

int main (void)
{
printf ("hello, dunia \ n");
return 0;
}

Baris pertama dari program ini berisi direktif preprocessing , ditandai dengan #include . Hal ini menyebabkan-alat pertama preprocessor untuk memeriksa kode sumber seperti yang dikompilasi-untuk mengganti baris dengan teks seluruh stdio.h header standar, yang berisi deklarasi untuk standard input dan output fungsi seperti printf . kurung sudut yang mengelilingi stdio.h menunjukkan bahwa stdio.h terletak menggunakan strategi pencarian yang lebih memilih header standar ke header lain yang memiliki nama yang sama. tanda kutip ganda juga dapat digunakan untuk menyertakan file header lokal atau proyek tertentu.

Baris berikutnya menunjukkan bahwa fungsi bernama main sedang didefinisikan. Yang main fungsi melayani tujuan khusus dalam program C, sedangkan lingkungan jangka waktu memanggil main fungsi untuk memulai eksekusi program. Jenis specifier int menunjukkan bahwa nilai kembalian, nilai yang dikembalikan ke Invoker (dalam hal ini waktu-run lingkungan) sebagai akibat mengevaluasi main fungsi, adalah bilangan bulat. Kata kunci void sebagai daftar parameter menunjukkan bahwa main fungsi tanpa argumen apapun.

Pembukaan kurung kurawal menunjukkan awal definisi main fungsi.

Panggilan baris berikutnya (mengalihkan eksekusi ke) fungsi bernama printf , yang dinyatakan dalam stdio.h dan disuplai dari sistem perpustakaan . Dalam panggilan ini, printf fungsi dilewatkan (disediakan dengan) sebuah argumen tunggal, alamat dari karakter pertama dalam string literal "hello, world\n" . String literal adalah disebutkan namanya array dengan elemen tipe char , diatur secara otomatis oleh compiler dengan-0 bernilai karakter terakhir untuk menandai akhir array ( printf perlu tahu ini). The \n adalah urutan escape bahwa C diterjemahkan ke dalam sebuah baris baru karakter, yang pada output menandakan akhir baris saat ini. Nilai kembali dari printf fungsi adalah tipe int , tetapi diam-diam dibuang karena tidak digunakan. (Sebuah program lebih hati-hati mungkin menguji nilai kembali untuk menentukan apakah atau tidak printf fungsi berhasil.) titik koma ini ; berakhir pernyataan itu.

Pernyataan kembali berakhir pelaksanaan main fungsi dan menyebabkannya untuk mengembalikan nilai integer 0, yang diinterpretasikan oleh-waktu sistem dijalankan sebagai kode keluar menunjukkan keberhasilan pelaksanaan.

Penutupan kurung kurawal menunjukkan akhir kode untuk main fungsi.

Jenis data

Artikel utama: tipe variabel C dan deklarasi
C memiliki statis mengetik lemah sistem tipe yang saham beberapa persamaan dengan yang lain ALGOL keturunan seperti Pascal . Ada built-in jenis untuk bilangan bulat dengan berbagai ukuran, baik dan ditandatangani, menandatangani angka floating-point , karakter, dan tipe enumerated ( enum ). C99 menambahkan boolean datatype . Ada juga berasal tipe, termasuk array , pointer , catatan ( struct ), dan ditandai serikat ( union ).

C sering digunakan dalam sistem pemrograman tingkat rendah di mana keluar dari sistem tipe mungkin diperlukan. Compiler berusaha untuk memastikan ketepatan jenis ekspresi paling, tapi programmer dapat mengganti pemeriksaan dalam berbagai cara, baik dengan menggunakan tipe cast untuk secara eksplisit mengkonversi nilai dari satu tipe ke yang lain, atau dengan menggunakan pointer atau serikat pekerja untuk menafsirkan kembali bit-bit yang mendasari dari nilai dalam beberapa cara lain.
[ edit ] Pointers

C mendukung penggunaan pointer, jenis yang sangat sederhana dari referensi yang mencatat, pada dasarnya, alamat atau lokasi dari suatu obyek atau fungsi dalam memori. Pointer dapat dereferenced untuk mengakses data yang disimpan di alamat yang ditunjuk, atau untuk memohon sebuah menunjuk-berfungsi. Pointer dapat dimanipulasi menggunakan tugas dan juga pointer arithmetic . Representasi run-time dari nilai pointer biasanya alamat memori baku (mungkin ditambah oleh offset-dalam bidang-kata), tetapi karena jenis pointer ini termasuk jenis hal yang ditunjuk, ekspresi termasuk pointer dapat tipe diperiksa pada waktu kompilasi. Pointer aritmatika secara otomatis skala oleh ukuran menunjuk ke tipe data. (Lihat -pointer pertukaran Array di bawah ini.) Pointer digunakan untuk berbagai tujuan dalam C. string Teks umumnya dimanipulasi menggunakan pointer ke array karakter. Dinamis alokasi memori , yang dijelaskan di bawah, ini dilakukan dengan menggunakan pointer. Banyak jenis data, seperti pohon , biasanya diimplementasikan sebagai dialokasikan secara dinamis struct benda dihubungkan dengan menggunakan pointer. Pointer ke fungsi yang berguna untuk callback dari event handler.

Sebuah pointer null adalah pointer yang secara eksplisit tidak menunjuk ke lokasi yang valid. Meskipun dibuat dengan menetapkan pointer ke literal nol '0 ', itu belum tentu nol. [14] dereferencing pointer null karena itu undefined, biasanya menghasilkan kesalahan run-time . Null pointer berguna untuk menunjukkan kasus-kasus khusus seperti tidak ada pointer berikutnya pada node akhir dari sebuah linked list , atau sebagai indikasi kesalahan dari fungsi kembali pointer. Dalam kode, null pointer biasanya diwakili oleh 0 atau NULL , dan logis bernilai false.

pointer Void ( void * ) menunjuk ke objek dari tipe tidak diketahui, dan karena itu dapat digunakan sebagai "generik" pointer data. Karena ukuran dan jenis menunjuk-ke ​​objek tidak dikenal, pointer void tidak dapat dereferenced, juga aritmatika pointer pada mereka diperbolehkan, meskipun mereka dapat dengan mudah (dan dalam banyak konteks implisit adalah) dikonversi ke dan dari pointer objek lain tipe.

Ceroboh menggunakan pointer berpotensi berbahaya. Karena mereka biasanya dicentang, sebuah variabel pointer dapat dibuat untuk menunjuk ke setiap lokasi sewenang-wenang, yang dapat menyebabkan efek yang tidak diinginkan. Meskipun benar-point digunakan pointer ke tempat-tempat yang aman, mereka dapat dibuat untuk menunjuk ke tempat-tempat yang tidak aman dengan menggunakan valid pointer arithmetic , objek yang menunjuk ke mungkin deallocated dan digunakan kembali ( pointer menggantung ), mereka dapat digunakan tanpa harus telah diinisialisasi ( liar pointer ), atau mereka mungkin langsung diberikan sebuah nilai yang tidak aman menggunakan cor, serikat, atau melalui pointer lain korup. Secara umum, C permisif dalam memungkinkan manipulasi dan konversi antara tipe pointer, kompiler walaupun biasanya memberikan pilihan untuk berbagai tingkat pemeriksaan. Beberapa bahasa pemrograman lain mengatasi masalah ini dengan menggunakan lebih ketat referensi jenis.

Array

Array jenis dalam C secara tradisional dari statis, ukuran tetap tertentu pada waktu kompilasi. (The C99 standar yang lebih baru juga memungkinkan bentuk-panjang array variabel.) Namun, juga memungkinkan untuk mengalokasikan blok memori (ukuran sewenang-wenang) pada saat run-time, menggunakan perpustakaan standar itu malloc fungsi, dan memperlakukannya sebagai array. penyatuan C array dan pointer (lihat di bawah) berarti benar dan ini array, array dinamis dialokasikan simulasi yang hampir dipertukarkan. Karena array selalu diakses (yang berlaku) melalui pointer, akses array biasanya tidak diperiksa terhadap ukuran array yang mendasarinya, meskipun compiler dapat memberikan batas pemeriksaan sebagai pilihan. Array batas pelanggaran karena itu mungkin dan agak umum secara tertulis kode sembarangan, dan dapat mengakibatkan berbagai dampak, termasuk mengakses memori ilegal, korupsi data, buffer overruns , dan-waktu pengecualian dijalankan.

C tidak memiliki ketentuan khusus untuk mendeklarasikan array multidimensi, melainkan bergantung pada rekursi dalam sistem tipe untuk mendeklarasikan array dari array, yang secara efektif menyelesaikan hal yang sama. Nilai Indeks dari "dihasilkan multidimensi" array dapat dianggap sebagai peningkatan besar-urutan baris .

Array multidimensi umum digunakan dalam algoritma numerik (terutama dari diterapkan aljabar linear ) untuk menyimpan matriks. Struktur dari array C cocok untuk tugas tertentu. array Namun, karena array dilewatkan hanya sebagai pointer, batas-batas array harus diketahui nilai tetap atau secara eksplisit diberikan kepada setiap sub rutin yang membutuhkan mereka, dan dinamis ukuran dari array tidak dapat diakses menggunakan indeks ganda. (Sebuah solusi untuk ini adalah untuk mengalokasikan array dengan "vektor baris" tambahan pointer ke kolom.)

C99 memperkenalkan "variable-length array" yang meliputi beberapa, tapi tidak semua, dari masalah dengan array C biasa.
Lihat juga: string C

-pointer pertukaran Array

Sebuah fitur (tapi berpotensi membingungkan) khas dari C adalah perlakuan terhadap array dan pointer. The-Subskrip notasi array x[i] juga dapat digunakan ketika x adalah pointer, interpretasi (menggunakan pointer arithmetic) adalah untuk mengakses (i + 1) dari beberapa objek ke objek data yang berdekatan ditunjuk oleh x , menghitung objek bahwa x menunjuk ke (yang x[0] ) sebagai elemen pertama dari array.

Secara formal, x[i] adalah setara dengan *(x + i) . Karena jenis pointer yang terlibat diketahui compiler pada waktu kompilasi, alamat bahwa x + i poin bukan alamat yang ditunjuk oleh x bertambah oleh i byte, melainkan bertambah oleh i dikalikan dengan ukuran unsur yang x poin. Ukuran elemen-elemen ini dapat ditentukan dengan operator sizeof dengan mengaplikasikannya kepada elemen dereferenced dari x , seperti dalam n = sizeof *x atau n = sizeof x[0] .

Selanjutnya, dalam konteks ekspresi yang paling (sebuah pengecualian adalah sebagai operan dari sizeof ), nama array secara otomatis dikonversi ke pointer untuk pertama elemen array, hal ini menyiratkan bahwa array tidak pernah disalin secara keseluruhan ketika bernama sebagai argumen ke fungsi, melainkan hanya alamat dari elemen pertama adalah berlalu. Oleh karena itu, meskipun fungsi panggilan digunakan C pass-by-value semantik, array berlaku lewat referensi .

Jumlah elemen dalam array dideklarasikan x dapat ditentukan sebagai sizeof x / sizeof x[0] .

Sebuah demonstrasi yang menarik dari pertukaran pointer dan array ditampilkan di bawah. Keempat tugas adalah setara dan masing-masing kode C berlaku.

/ * X adalah array ATAU pointer. i adalah integer. * /

x [i] = 1; * setara dengan * / (x + i) * /
* (X + i) = 1;
* (I + x) = 1;
i [x] = 1; / * setara dengan * (i + x) * /

Perhatikan bahwa meskipun semua empat tugas yang setara, hanya yang pertama mewakili gaya pengkodean yang baik. Baris terakhir bisa ditemukan di C dikaburkan kode.

Meskipun ini jelas kesetaraan antara variabel array dan pointer, masih ada perbedaan harus dibuat antara mereka. Meskipun nama array adalah, dalam konteks ekspresi paling, dikonversi menjadi pointer (untuk elemen pertama), pointer ini tidak sendiri menempati penyimpanan apapun, tidak seperti sebuah variabel pointer. Akibatnya, apa array "menunjuk ke" tidak dapat diubah, dan tidak mungkin untuk memberikan nilai pada sebuah variabel array. (Nilai Array dapat disalin, bagaimanapun, misalnya, dengan menggunakan memcpy fungsi.)

Manajemen memori

Salah satu fungsi yang paling penting dari sebuah bahasa pemrograman adalah untuk menyediakan fasilitas untuk mengelola memori dan objek yang disimpan dalam memori. C menyediakan tiga cara yang berbeda untuk mengalokasikan memori untuk objek:

Statis alokasi memori : ruang untuk objek disediakan dalam biner pada waktu kompilasi, objek ini memiliki tingkat (atau seumur hidup) selama biner yang mengandung mereka dimuat ke memori. variabel statis secara otomatis diinisialisasi dengan nol pada alokasi memori.
Alokasi memori otomatis : objek sementara dapat disimpan pada stack , dan ruang ini secara otomatis dibebaskan dan dapat digunakan kembali setelah blok di mana mereka dinyatakan adalah keluar
Dynamic alokasi memori : blok memori ukuran sewenang-wenang dapat diminta pada saat run-time dengan menggunakan fungsi pustaka seperti malloc dari daerah memori yang disebut tumpukan ; blok ini bertahan sampai kemudian dibebaskan untuk digunakan kembali dengan memanggil fungsi library free

Ketiga pendekatan yang tepat dalam situasi yang berbeda dan memiliki berbagai pengorbanan. Sebagai contoh, alokasi memori statis tidak memiliki overhead alokasi, alokasi otomatis mungkin melibatkan sejumlah kecil biaya overhead, dan alokasi memori dinamis berpotensi dapat memiliki banyak overhead baik untuk alokasi dan dealokasi. Di sisi lain, ruang stack biasanya jauh lebih terbatas dan sementara dari baik memori statis atau ruang tumpukan, dan alokasi memori dinamis memungkinkan alokasi objek yang ukurannya hanya diketahui pada saat run-time. Kebanyakan C program membuat ekstensif menggunakan ketiga.

Dimana alokasi mungkin, otomatis atau statis biasanya disukai karena penyimpanan dikelola oleh compiler, membebaskan programmer dari tugas berpotensi rawan kesalahan manual mengalokasikan dan melepaskan penyimpanan. Namun, banyak struktur data dapat tumbuh dalam ukuran saat runtime, dan karena alokasi statis (dan alokasi otomatis di C89 dan C90) harus memiliki ukuran yang tetap pada waktu kompilasi, ada banyak situasi di mana alokasi dinamis harus digunakan. Sebelum standar C99, berukuran variabel array adalah contoh umum ini (lihat malloc untuk contoh array dialokasikan secara dinamis).

dan dialokasikan secara dinamis hanya objek secara otomatis diinisialisasi jika nilai awal secara eksplisit ditentukan, kalau mereka awalnya memiliki nilai tak tentu (biasanya, apa pun pola bit yang terjadi untuk hadir dalam penyimpanan , yang tidak mungkin bahkan merupakan nilai yang valid untuk tipe itu). Jika program mencoba mengakses nilai terinisialisasi, hasilnya tidak terdefinisi. Banyak kompiler modern mencoba untuk mendeteksi dan memperingatkan tentang masalah ini, namun kedua positif palsu dan negatif palsu terjadi.

Masalah lain adalah bahwa tumpukan alokasi memori harus disinkronkan secara manual dengan penggunaan aktual dalam program apapun dalam rangka untuk itu untuk digunakan kembali sebanyak mungkin. Sebagai contoh, jika pointer hanya untuk alokasi memori tumpukan keluar dari ruang lingkup atau telah ditimpa yang nilai sebelum free() telah disebut, maka memori tidak dapat dipulihkan untuk digunakan kembali nanti dan pada dasarnya hilang program, sebuah fenomena yang dikenal sebagai sebuah kebocoran memori . Sebaliknya, adalah mungkin untuk melepaskan memori terlalu cepat dan terus untuk mengaksesnya, namun, karena sistem alokasi dapat kembali mengalokasikan atau sendiri menggunakan memori dibebaskan, perilaku tak terduga yang mungkin terjadi. Biasanya, gejala akan muncul di sebagian dari program jauh dari kesalahan yang sebenarnya, sehingga sulit untuk melacak masalah. Isu tersebut adalah diperbaiki dalam bahasa dengan pengumpulan sampah otomatis .

Perpustakaan


Bahasa pemrograman C menggunakan pustaka sebagai metode utama perpanjangan. Dalam C, perpustakaan adalah satu set fungsi yang terdapat dalam satu file "arsip". Masing-masing perpustakaan biasanya memiliki file header , yang berisi prototipe dari fungsi yang terdapat dalam perpustakaan yang dapat digunakan oleh program, dan deklarasi tipe data khusus dan simbol makro digunakan dengan fungsi tersebut. Agar program untuk menggunakan perpustakaan, ia harus menyertakan file header itu perpustakaan, dan perpustakaan harus dikaitkan dengan program, yang dalam banyak kasus memerlukan flag-flag compiler (misalnya, -lm , singkatan untuk "perpustakaan matematika").

C perpustakaan umum sebagian besar adalah standar C library , yang ditentukan oleh ISO dan ANSI C standar dan dilengkapi dengan setiap implementasi C ("berdiri sendiri" [embedded] C implementasi dapat memberikan hanya sebagian dari perpustakaan standar). Perpustakaan ini mendukung input stream dan output, alokasi memori, matematika, string karakter, dan nilai waktu.

Lain seperangkat fungsi pustaka C yang digunakan oleh aplikasi khusus ditargetkan untuk Unix dan Unix-seperti sistem, terutama fungsi yang menyediakan antarmuka ke kernel . Fungsi-fungsi ini dijelaskan dalam berbagai standar seperti POSIX dan Single UNIX Specification .

Karena banyak program telah ditulis dalam C, ada berbagai macam perpustakaan lain yang tersedia. Perpustakaan sering ditulis dalam C karena C compiler efisien menghasilkan kode obyek ; programmer kemudian membuat interface ke perpustakaan sehingga rutinitas dapat digunakan dari bahasa tingkat tinggi seperti Jawa , Perl , dan Python .

Peralatan Bahasa

Alat telah diciptakan untuk membantu C programmer menghindari beberapa masalah yang melekat dalam bahasa, seperti laporan dengan perilaku terdefinisi atau pernyataan yang bukan merupakan praktek yang baik karena mereka lebih cenderung menghasilkan perilaku yang tidak disengaja atau kesalahan run-time.

Otomatis memeriksa kode sumber dan audit yang bermanfaat dalam bahasa apapun, dan untuk C banyak alat-alat seperti ada, seperti Lint . Praktek yang umum adalah dengan menggunakan Lint untuk mendeteksi kode dipertanyakan ketika sebuah program yang pertama kali ditulis. Setelah program melewati Lint, itu kemudian dikompilasi menggunakan compiler C. Juga, banyak kompiler opsional dapat memperingatkan tentang sintaksis valid konstruksi yang mungkin benar-benar menjadi kesalahan. Misra C adalah seperangkat hak milik pedoman untuk menghindari kode dipertanyakan tersebut, yang dikembangkan untuk embedded system.

Ada juga kompiler, perpustakaan dan tingkat mekanisme sistem operasi untuk array melakukan pengecekan batas, buffer overflow deteksi, serialisasi dan pengumpulan sampah otomatis , yang bukan merupakan bagian standar dari C.

Alat seperti Purify , Valgrind , dan menghubungkan dengan perpustakaan yang berisi versi khusus dari alokasi fungsi memori dapat membantu mengungkap memori error runtime.

bahasa Terkait

C telah langsung maupun tidak langsung dipengaruhi bahasa banyak kemudian seperti Java , Perl , Python , PHP , JavaScript , LPC , C # dan Unix's C Shell . Pengaruh yang paling meresap telah sintaksis: semua bahasa yang disebutkan menggabungkan laporan dan (lebih kurang dikenali) ekspresi sintaks C dengan sistem tipe, model data dan / atau struktur program berskala besar yang berbeda dari C, kadang-kadang secara radikal .

Saat-bahasa berorientasi objek menjadi populer, C + + dan Objective-C adalah dua ekstensi yang berbeda C yang menyediakan kemampuan berorientasi objek. Kedua bahasa pada awalnya diimplementasikan sebagai -to-source source compiler ; source code diterjemahkan ke dalam C, kemudian dikompilasi dengan kompiler C.

The C + + bahasa pemrograman ditemukan oleh Bjarne Stroustrup sebagai salah satu pendekatan untuk menyediakan berorientasi objek dengan fungsi-mirip dengan sintaks C. C + + menambahkan kekuatan mengetik yang lebih besar, scoping dan alat-alat lainnya yang berguna dalam pemrograman berorientasi obyek dan izin pemrograman generik melalui template. Hampir superset dari C, C + + sekarang mendukung sebagian besar C, dengan beberapa pengecualian (lihat Kompatibilitas C dan C + + untuk daftar lengkap perbedaan).

Objective-C awalnya sangat "tipis" pada lapisan atas, dan tetap menjadi superset ketat C yang memungkinkan pemrograman berorientasi obyek menggunakan dinamis hibrida / paradigma mengetik statis. Objective-C berasal sintaks dari kedua C dan Smalltalk : sintaks yang melibatkan preprocessing, ekspresi, deklarasi fungsi dan pemanggilan fungsinya adalah warisan dari C, sedangkan sintaks untuk berorientasi objek fitur pada awalnya diambil dari Smalltalk.

C # ini dirancang dalam rangka memberikan Microsoft NET. Framework dengan bahasa pemrograman yang dapat dengan mudah dipelajari oleh programmer sudah akrab dengan C atau C + +. Konvensi seperti titik koma pada akhir pernyataan dan tanda kurung kurawal yang digunakan untuk memisahkan komponen-komponen dalam hirarki kode adalah bukti dari C # 's warisan C-based.

Ini bahasa pemrograman D membuat istirahat bersih dengan C tetap menjaga sintaks yang umum yang sama, tidak seperti C + +, yang mempertahankan hampir lengkap kompatibilitas mundur dengan C. D meninggalkan sejumlah fitur dari C yang Walter Bright (perancang D) dianggap tidak diinginkan, termasuk yang C preprocessor dan trigraphs . Beberapa, tetapi tidak semua, dari D's ekstensi untuk C tumpang tindih dengan C + +.

Limbo adalah bahasa yang dikembangkan oleh sebuah tim di Bell Labs, dan sementara itu mempertahankan beberapa sintaks dan gaya umum C, itu juga mencakup pengumpulan sampah dan CSP berbasis-concurrency.

The Go bahasa pemrograman, sedang dikembangkan di Google , arus's sintaks C dengan menghilangkan titik koma dan tanda kurung yang tidak perlu. Ini mendukung bentuk yang lebih sederhana dari pemrograman berorientasi obyek daripada C + + atau Java, dan juga menambah pengumpulan sampah dan fitur concurrency.

Python memiliki jenis yang berbeda dari warisan C. Sementara sintaks dan semantik Python sangat berbeda dari C, yang digunakan secara luas yang paling Python pelaksanaan, CPython , merupakan open source program C. Hal ini memungkinkan pengguna untuk memperpanjang C Python dengan C, atau embed Python ke dalam program C. Hubungan yang erat adalah salah satu faktor utama keberhasilan Python sebagai penggunaan-umum bahasa dinamis.

Perl adalah contoh lain sebuah bahasa pemrograman populer yang berakar dalam C. Struktur keseluruhan luas Perl berasal dari C. Penerapan standar Perl ditulis dalam C dan mendukung ekstensi ditulis dalam C.

Sumber: Wikipedia.org

Tidak ada komentar: