Sejarah bahasa pengaturcaraan C
|
Perkembangan awal
Perkembangan awal bahasa pengaturcaraan C berlaku di Makmal Bell AT&T antara tahun-tahun 1969-1973. Menurut Dennis Ritchie, pereka bahasa tersebut, tempoh yang paling kreatif berlaku pada tahun 1972. Bahasa ini dinamai "C" kerana banyak cirinya berasal daripada sebuah bahasa yang lebih awal yang dipanggil "B". Menurut Ken Thompson, bahasa pengaturcaraan B merupakan versi termudah bahasa pengaturcaraan BCPL.
Adanya banyak legenda tentang asal-usul C serta sistem pengendalian Unix yang amat berkait, termasuknya:
- Pembangunan Unix ialah hasil daripada keinginan para pengaturcara untuk bermain permainan komputer Pengembaraan Angkasa Lepas.[1] Mereka telah bermain permainan itu dengan menggunakan komputer kerangka utama yang dimiliki oleh syarikat mereka. Oleh sebab komputer itu tidak cukup berkuasa kerana perlu mendukung sekitar 100 orang pengguna, Thompson dan Ritchie mendapati bahawa mereka tidak dapat memiliki kawalan kapal angkasa lepas mereka yang mencukupi untuk mengelakkan pelanggaran dengan asteroid-asteroid yang bergerak secara rawak. Ini menyebabkan keputusan mereka untuk memportkan permainan itu pada komputer PDP-7 yang terbiar di pejabat mereka. Oleh sebab mesin itu tidak mempunyai sebarang sistem pengendalian, kedua-dua mereka itu mula membangunkannya, berdasarkan sebilangan gagasan yang dikemukakan oleh rakan-rakan sekerja mereka. Bagaimanapun sistem pengendalian mereka akhirnya diputuskan untuk diportkan pada komputer PDP-11 di pejabat mereka. Walaupun demikian, mereka menghadapi tugas yang menggentarkan untuk menterjemahkan sebahagian besar kod bahasa himpunan terlanggan dan oleh itu, kedua-dua pengaturcara itu mula mempertimbangkan penggunaan sebuah bahasa pengaturcaraan peringkat tinggi yang mudah alih supaya sistem pengendalian mereka boleh diportkan dengan mudah kepada mana-mana komputer. Mereka mempertimbangkan penggunaan bahasa pengaturcaraan B, tetapi ia tidak mempunyai kefungsian untuk memanfaatkan diri dengan sesetengah ciri PDP-11 yang maju. Ini menyebabkan pembangunan versi bahasa pengaturcaraan C yang awal.
- Justifikasi yang diberikan oleh mereka kepada syarikat untuk memperoleh komputer yang asal bagi tujuan membangunkan sistem pengendalian Unix adalah untuk mencipta sebuah sistem untuk mengautomatikkan pemfailan paten. Versi sistem Unix yang asal dibangun dengan menggunakan bahasa himpunan. Hampir semua sistem pengendalian yang kemudian ditulis semula dalam bahasa C, suatu langkah yang tidak pernah berlaku dahulu, dengan semua sistem pengendalian ketika itu ditulis dalam bahasa himpunan.
Menjelang tahun 1973, bahasa C telah menjadi cukup berkuasa sehingga kebanyakan inti Unix yang pada asalnya ditulis dalam bahasa himpunan untuk komputer PDP-11 ditulis semula dalam bahasa C. Ini merupakan salah satu inti sistem pengendalian yang awal yang dilakukan dalam bahasa komputer yang bukannya bahasa himpunan. Contoh-contoh lain yang awal termasuk sistem Multics (ditulis untuk komputer PL/I), dan MCP (Atur Cara Kawalan Induk (MCP)) yang ditulis dalam bahasa ALGOL untuk komputer Burroughs B5000 pada tahun 1961.)
K&R C
Pada tahun 1978, Dennis Ritchie dan Brian Kernighan menerbitkan edisi pertama Bahasa Pengaturcaraan C. Buku ini dikenali sebagai "K&R" oleh para pengaturcara C, dan bertindak sebagai spesifikasi tak formal bagi bahasa itu selama banyak tahun. Versi C yang dihuraikan dalam buku itu biasanya dirujuk sebagai "K&R C". Edisi kedua buku itu merangkumi piawai ANSI C yang kemudian.
K&R memperkenalkan banyak ciri bahasa:
- jenis data
struct - jenis data
long int - jenis data
unsigned int
dengan pengendali =- digantikan dengan -= untuk mengatasi kekaburan semantik yang diwujudkan oleh binaan i=-10 yang boleh ditafsirkan, baik sebagai i =- 10 mahupun sebagai i = -10.
Selama banyak tahun selepas pengenalan ANSI C, K&R C masih dianggap sebagai "penyebut sepunya terendah" yang para pengaturcara C mengehadkan diri apabila kemudahalihan maksimum diingini. Ini adalah kerana banyak penyusun yang lebih lama masih digunakan, serta juga kerana kod K&R C yang ditulis dengan teliti boleh juga merupakan kod ANSI C yang sah.
Dalam versi-versi C yang awal, hanya fungsi-fungsi yang mengembalikan nilai bukan integer perlu diisytiharkan sebelum pentakrifan fungsi, dengan fungsi yang digunakan tanpa sebarang perisytiharan yang lebih dahulu dianggap sebagai fungsi yang mengembalikan integer.
Misalnya:
long int SomeFunction();
int OtherFunction();
int CallingFunction()
{
long int test1;
int test2;
test1 = SomeFunction();
if (test1 > 0)
test2 = 0;
else
test2 = OtherFunction();
return test2;
}
Dalam contoh di atas, kedua-dua SomeFunction dan OtherFunction diisytiharkan sebelum digunakan. Versi K&R tidak memerlukan perisytiharan OtherFunction.
Oleh sebab perisytiharan fungsi K&R tidak merangkumi sebarang maklumat tentang argumen fungsi, penyemakan jenis parameter fungsi tidak dilakukan. Walaupun demikian, sesetengah penyusun akan memberikan pesanan amaran jika sesuatu fungsi setempat dipanggil dengan bilangan argumen yang salah, atau jika panggilan berbilang kepada sebuah fungsi luaran menggunakan bilangan argumen yang berbeza. Alat-alat yang berasingan seperti utiliti lint bagi Unix kemudian dibangun yang antara lain, boleh menyemak ketekalan penggunaan fungsi oleh berbagai-bagai fail sumber.
Pada tahun-tahun yang menyusuli penerbitan K&R C, banyak ciri tak rasmi telah ditambahkan kepada bahasa pengaturcaraan C (kerana tiadanya piawai), didukung oleh penyusun-penyusun daripada syarikat AT&T dan sesetengah penjual yang lain. Ini termasuk:
- fungsi
void - fungsi-fungsi yang mengembalikan jenis-jenis
structatauunion(dan bukannya penuding) - umpukan untuk jenis data
struct - pelayak
constuntuk menjadikan sesuatu objek sebagai objek baca sahaja - jenis bernombor.
Jumlah perluasan yang besar, ketiadaan perpustakaan piawai, kepopularan bahasa, dan fakta bahawa penyusun Unix juga tidak melaksanakan spesifikasi K&R dengan persis, akhirnya mewujudkan keperluan untuk pemiawaian.
ANSI C dan ISO C
Pada akhir dekad 1970-an, C mula menggantikan bahasa pengaturcaraan BASIC sebagai bahasa pengaturcaraan mikrokomputer. Kemudian pada dekad 1980-an, ia diterima untuk digunakan dalam IBM PC, dan kepopularannya mula meningkat dengan ketara. Pada waktu yang sama, Bjarne Stroustrup dan rakan-rakan sekerjanya di Makmal Bell memulakan kerja untuk menambah binaan bahasa pengaturcaraan berorientasi objek yang kemudian menghasilkan bahasa yang kini dikenali sebagai C++.
Pada tahun 1983, Institut Piawai Nasional Amerika (ANSI) membentuk jawatankuasa X3J11 untuk mengasaskan sebuah spesifikasi piawai untuk C. Piawai itu diratifikasi sebagai ANSI X3.159-1989: Bahasa Pengaturcaraan C pada tahun 1989, dengan versi bahasa ini seringnya dirujuki sebagai ANSI C, C Piawai, atau kekadangnya C89. Pada tahun 1990 pula, piawai ANSI C (dengan sedikit pengubahsuaian kecil) diterima oleh Pertubuhan Piawai Antarabangsa (ISO) sebagai ISO/IEC 9899:1990, dengan versi ini kekadangnya dikenali sebagai C90. Justera itu, istilah-istilah "C89" dan "C90" pada dasarnya merujuk kepada bahasa yang sama.
Salah satu tujuan proses pemiawaian C adalah untuk menghasilkan suatu superset untuk K&R C yang merangkumi banyak ciri tak rasmi yang telah diperkenalkan kemudian. Bagaimanapun, jawatankuasa piawai juga memasukkan banyak ciri yang baru, seperti prototaip fungsi (dipinjam daripada C++), penuding void, dukungan untuk set aksara antarabangsa dan locale, serta sebuah prapemproses yang lebih berupaya. Sintaksis untuk pengisytiharan parameter juga ditambah untuk merangkumi gaya C++:
int main(int argc, char **argv)
{
...
}
walaupun antara muka K&R
int main(argc, argv)
int argc;
char **argv;
{
...
}
masih dibenarkan untuk memastikan keserasian dengan sumber kod yang sedia ada.
C89 masih didukung oleh penyusun C pada masa ini, dengan kebanyakan kod C sekarang ditulis berdasarkannya. Mana-mana atur cara yang ditulis hanya dalam C Piawai tanpa sebarang andaian yang bergantung kepada perkakasan akan berjalan dengan betul pada sebarang pelantar yang menepati pelaksanaan C dalam lingkungan sumbernya. Tanpa langkah mencegah sebegini, atur-atur cara hanya akan dapat disusun pada pelantar ataupun dengan penyusun yang tertentu disebabkan misalnya, oleh penggunaan perpustakaan tak piawai seperti perpustakan GUI, atau kerana kebergantungannya kepada atribut-atribut penyusun atau pelantar yang khusus, seperti saiz jenis data yang tepat dan bait keendianan.
Dalam kes-kes yang kod harus boleh disusun, baik oleh penyusun yang menepati piawai ataupun berdasarkan K&R C, makro __STDC__ boleh digunakan untuk membahagikan kod menjadi bahagian-bahagian Piawai dan K&R agar dapat mempergunakan ciri-ciri yang hanya terdapat dalam C Piawai.
#ifdef __STDC__ extern int getopt(int,char * const *,const char *); #else extern int getopt(); #endif
Dalam contoh di atas, sebuah penyusun yang telah mentakrifkan makro __STDC__ (seperti diwajibkan oleh piawai C) hanya akan mentafsirkan garis yang mengikuti perintah ifdef. Bagi penyusun-penyusun tak piawai yang tidak mentakrifkan makro, hanya garis yang mengikuti perintah else akan ditafsirkan.
C99
- Nota: C99 juga merupakan nama penyusun C untuk TI-99/4A, komputer rumah yang dicipta oleh Texas Instruments. Selain daripada merupakan suatu penyusun C, ia adalah tidak berkait.
Selepas proses pemiawaian ANSI, spesifikasi bahasa C menjalani suatu tempoh yang agak statik, manakala C++ terus berkembang, sebahagian besarnya semasa usaha pemiawaian sendiri. Pindaan Normatif 1 mencipta sebuah piawai yang baru untuk bahasa C pada tahun 1995, tetapi hanya untuk membetulkan sesetengah perincian piawai C89 serta untuk menambah dukungan yang lebih meluas untuk set aksara antarabangsa. Bagaimanapun, piawai itu menjalani lebih banyak semakan pada akhir dekad 1990-an yang menyebabkan penerbitan ISO 9899:1999 pada tahun 1999. Piawai ini biasa dirujuki sebagai "C99" dan diterima sebagai salah satu piawai ANSI pada bulan Mac 2000.
Ciri-ciri baru
C99 memperkenalkan banyak ciri yang baru, dengan banyaknya yang pernah dilakukan sebagai perluasan oleh banyak penyusun:
- Fungsi dalam baris
- Pemboleh ubah boleh diisytiharkan di mana-mana sahaja (sebagaimana dengan C++), berbanding dengan hanya selepas lagi satu perisytiharan atau pada permulaan pernyataan majmuk.
- Banyak jenis data yang baru, termasuk
long long int, jenis integer panjang yang tidak wajib, jenis data Boolean yang eksplisit, dan jeniscomplexuntuk mewakili nombor kompleks - Tatasusunan panjang boleh ubah
- Dukungan untuk komen segaris yang bermula dengan
//, sebagaimana dengan BCPL atau C++ - Fungsi perpustakaan yang baru, seperti
snprintf - Kepala fail yang baru, seperti
stdbool.hdaninttypes.h - Fungsi matematik jenis generik (
tgmath.h) - Dukungan yang diperbaik untuk titik apung IEEE
- Pengawal tentuan
- Harafiah majmuk
- Dukungan untuk makro variadik (makro bagi ariti boleh ubah)
- Pembatasan
restrictuntuk membenarkan pengoptimuman kod yang lebih agresif.
Perincian
C99, kebanyakannya, serasi ke atas dengan C90, tetapi adalah lebih ketat tentang sesetengah cara yang lain. Khususnya, perisytiharan yang tidak mempunyai penentu jenis tidak akan lagi mempunyai int yang diandaikan secara tersirat. Jawatankuasa piawai C memutuskan bahawa adalah lebih berbaloi bagi penyusun mendiagnosis ketinggalan penentu jenis yang tidak disengajakan, berbanding dengan memproses kod legasi yang bergantung kepada int yang tersirat dengan senyap. Pada praktiknya, penyusun lebih mungkin akan mendiagnosis ketinggalan tersebut tetapi juga akan mengandaikan int dan meneruskan penterjemahan atur cara.
Dukungan oleh penyusun utama
Koleksi Penyusun GNU (GCC) dan penyusun-penyusun C yang lain kini mendukung banyak ciri C99 yang baru. Walaupun demikian, ia tidak mendapat banyak dukungan daripada penjual-penjual seperti Microsoft dan Borland yang menumpukan perhatian mereka kepada bahasa pengaturcaraan C++ kerana C++ memberikan perbaikan kefungsian yang serupa.
Walaupun GCC mempunyai dukungan C99 yang meluas, ia masih bukannya suatu pelaksanaan yang benar-benar menepati piawai, dengan banyak ciri utama yang tidak disediakan atau tidak berjalan dengan betul. [2]
Pengesanan versi
Makro piawai __STDC_VERSION__ ditakrifkan dengan nilai 199901L untuk menunjukkan bahawa dukungan C99 disediakan. Sebagaimana dengan makro __STDC__ untuk C90, __STDC_VERSION__ boleh digunakan untuk menulis kod yang akan disusun dengan cara yang berlainan oleh penyusun C90 dan C99, sebagaimana ditunjukkan oleh contoh yang berikut yang memastikan bahawa inline disediakan dalam kedua-dua kes.
#if __STDC_VERSION__ >= 199901L /* "inline" ialah kata kunci */ #else # define inline /* tiada */ #endif
