Saat ini C dianggap sebagai bahasa tingkat rendah , tetapi kembali di tahun 70-an apakah itu dianggap tingkat rendah? Apakah istilah itu bahkan digunakan?
Banyak bahasa tingkat tinggi populer tidak ada sampai pertengahan 80-an dan seterusnya jadi saya ingin tahu apakah dan bagaimana sifat tingkat rendah telah berubah selama bertahun-tahun.
programming-languages
c
history
joeyfb
sumber
sumber
Jawaban:
Untuk menjawab aspek historis dari pertanyaan:
Filosofi desain dijelaskan dalam Bahasa Pemrograman C yang ditulis oleh Brian Kernighan dan perancang C Dennis Ritchie, "K&R" yang mungkin pernah Anda dengar. Kata pengantar untuk edisi pertama mengatakan
dan kata pengantar
Daftar berjalan selama beberapa saat sebelum teks berlanjut:
(Saya hanya memiliki edisi kedua dari tahun 1988, tetapi komentar di bawah ini menunjukkan bahwa teks yang dikutip adalah sama di edisi pertama 1978).
Jadi, ya, istilah "tingkat tinggi" dan "tingkat rendah" sedang digunakan saat itu, tetapi C dirancang untuk jatuh di suatu tempat di spektrum di antaranya. Itu mungkin untuk menulis kode dalam C yang portabel di seluruh platform perangkat keras, dan itu adalah kriteria utama untuk apakah suatu bahasa dianggap tingkat tinggi pada saat itu. Namun, C tidak memiliki beberapa fitur yang menjadi ciri khas bahasa tingkat tinggi, dan ini adalah keputusan desain yang mendukung kesederhanaan.
sumber
Ini tergantung pada definisi Anda tentang bahasa tingkat tinggi dan tingkat rendah. Ketika C dikembangkan, apa pun yang tingkatnya lebih tinggi daripada perakitan dianggap sebagai bahasa tingkat tinggi. Itu bar rendah untuk dihapus. Kemudian, terminologi ini bergeser ke titik di mana beberapa saat ini akan menganggap Jawa sebagai bahasa tingkat rendah.
Bahkan dalam lanskap bahasa tingkat tinggi tahun 70-an, perlu ditunjukkan bahwa C adalah tingkat yang cukup rendah. Bahasa C pada dasarnya adalah B ditambah sistem tipe sederhana, dan B tidak lebih dari lapisan sintaks prosedural / terstruktur yang nyaman untuk perakitan. Karena sistem tipe adalah retro-fit di atas bahasa B yang tidak diketik, Anda masih dapat meninggalkan anotasi jenis di beberapa tempat dan
int
akan dianggap.C secara sadar menghilangkan fitur mahal atau sulit untuk mengimplementasikan yang sudah mapan pada saat itu, seperti
C memang memiliki beberapa fitur menarik:
Pada saat C dikembangkan, bahasa inovatif lainnya seperti COBOL, Lisp, ALGOL (dalam berbagai dialek), PL / I, SNOBOL, Simula, dan Pascal telah diterbitkan dan / atau digunakan secara luas untuk domain masalah tertentu. Tetapi sebagian besar bahasa yang ada dimaksudkan untuk pemrograman mainframe, atau proyek penelitian akademik. Misalnya ketika ALGOL-60 pertama kali dirancang sebagai bahasa pemrograman universal, teknologi dan ilmu komputer yang diperlukan untuk mengimplementasikannya belum ada. Beberapa di antaranya (beberapa dialek ALGOL, PL / I, Pascal) juga dimaksudkan untuk pemrograman tingkat rendah, tetapi mereka cenderung memiliki kompiler yang lebih kompleks atau terlalu aman (misalnya, tidak ada pointer yang tidak dibatasi). Pascal terutama tidak memiliki dukungan yang baik untuk array panjang variabel.
Dibandingkan dengan bahasa-bahasa itu, C menolak fitur "elegan" dan mahal agar lebih praktis untuk pengembangan tingkat rendah. C tidak pernah terutama proyek penelitian desain bahasa. Alih-alih, itu adalah pengembangan Unix kernel pada minicomputer PDP-11 yang relatif terbatas sumber daya. Untuk niche-nya (bahasa tingkat rendah minimalis untuk menulis Unix dengan kompiler satu-pass yang mudah untuk port) C benar-benar unggul - dan lebih dari 45 tahun kemudian masih merupakan bahasa pemrograman sistem bahasa.
sumber
%r10
sebagai "penunjuk rantai statis", yang persis seperti yang Anda bicarakan. Untuk C, itu hanyalah register awal yang berantakan, tapi kurasa Pascal akan menggunakannya. (GNU C fungsi bersarang menggunakannya untuk melewatkan pointer ke lingkup luar ketika fungsi seperti itu tidak inline (misalnya jika Anda membuat pointer fungsi ke sana sehingga kompiler membuat trampolin kode mesin pada stack): Acceptability of regular penggunaan r10 dan r11 )a = b;
untuk menyalin seluruh struct seperti yang Anda bisa dalam ISO C89. Jadi pada awal C, tipe yang ditentukan pengguna jelas merupakan kelas dua dan hanya bisa dilewatkan dengan referensi sebagai argumen fungsi. Keengganan C untuk array dan juga Mengapa C ++ mendukung penugasan array di dalam struct, tetapi tidak secara umum?Pada awal 1970-an, C menghirup udara segar yang menggunakan konstruksi modern dengan sangat efektif sehingga seluruh sistem UNIX dapat ditulis ulang dari bahasa assembly menjadi C dengan ruang yang dapat diabaikan atau penalti performa. Pada saat itu banyak orang sezaman menyebutnya sebagai bahasa tingkat tinggi.
Para penulis C, terutama Dennis Ritchie, lebih berhati-hati dan dalam artikel Jurnal Sistem Bell mengatakan "C bukan bahasa tingkat yang sangat tinggi." Dengan senyum masam dan ingin menjadi provokatif, Dennis Ritchie akan mengatakan itu adalah bahasa tingkat rendah. Kepala di antara tujuan desainnya untuk C adalah untuk menjaga bahasa tetap dekat dengan mesin namun memberikan portabilitas, yaitu kemandirian mesin.
Untuk info lebih lanjut, baca artikel BSTJ asli:
Dennis terima kasih Semoga Anda beristirahat dengan tenang.
sumber
Seperti yang saya tulis di tempat lain di situs ini ketika seseorang menyebut malloc / pola manajemen memori bebas sebagai "pemrograman tingkat rendah,"
Untuk konteks, ini di awal 90-an, jauh setelah C keluar.
sumber
malloc()
dengan langsung meneleponbrk(2)
ataummap(2)
dan mengelola memori yang dihasilkan sendiri. Ini adalah PITA besar tanpa manfaat yang mungkin (kecuali Anda menerapkan hal seperti malloc), tetapi Anda bisa melakukannya.Banyak jawaban sudah merujuk ke artikel awal yang mengatakan hal-hal seperti "C bukan bahasa tingkat tinggi".
Saya tidak bisa menahan tiang pancang, namun: banyak, jika tidak sebagian besar atau semua HLL pada saat itu - Algol, Algol-60, PL / 1, Pascal - menyediakan batas array yang disediakan dan deteksi limpahan numerik.
Terakhir saya memeriksa buffer dan integer overflow adalah penyebab utama dari banyak kerentanan keamanan. ... Yap, masih demikian ...
Situasi untuk manajemen memori dinamis lebih rumit, tetapi tetap saja, gaya C malloc / gratis merupakan langkah mundur dalam hal keamanan.
Jadi, jika definisi Anda tentang HLL termasuk "secara otomatis mencegah banyak bug tingkat rendah", well, keadaan cybersecurity yang menyedihkan akan sangat berbeda, mungkin lebih baik, jika C dan UNIX tidak terjadi.
sumber
popcnt
.Pertimbangkan bahasa lama dan jauh lebih tinggi yang ada sebelum C (1972):
Fortran - 1957 (level tidak lebih tinggi dari C)
Gangguan - 1958
Cobol - 1959
Fortran IV - 1961 (level tidak lebih tinggi dari C)
PL / 1 - 1964
APL - 1966
Ditambah bahasa tingkat menengah seperti RPG (1959), sebagian besar bahasa pemrograman untuk menggantikan sistem catatan unit berbasis plugboard.
Dari perspektif ini, C tampak seperti bahasa tingkat yang sangat rendah, hanya sedikit di atas assembler makro yang digunakan pada mainframe pada saat itu. Dalam kasus mainframe IBM, macro assembler digunakan untuk akses basis data seperti BDAM (metode akses disk dasar), karena antarmuka basis data belum porting ke Cobol (pada waktu itu) menghasilkan warisan campuran campuran dan Program Cobol masih digunakan sampai sekarang di mainframe IBM.
sumber
Jawaban untuk pertanyaan Anda tergantung pada bahasa C yang ditanyakan.
Bahasa yang dijelaskan dalam Manual Referensi C 1974 Dennis Ritchie adalah bahasa tingkat rendah yang menawarkan beberapa kenyamanan pemrograman bahasa tingkat tinggi. Dialek yang berasal dari bahasa itu juga cenderung menjadi bahasa pemrograman tingkat rendah.
Namun, ketika Standar C 1989/1990 diterbitkan, ia tidak menggambarkan bahasa tingkat rendah yang telah menjadi populer untuk pemrograman mesin yang sebenarnya, tetapi sebaliknya menggambarkan bahasa tingkat yang lebih tinggi yang bisa - tetapi tidak diharuskan untuk menjadi- -diimplementasikan dalam istilah tingkat yang lebih rendah.
Seperti yang dicatat oleh penulis Standar C, salah satu hal yang membuat bahasa ini berguna adalah bahwa banyak implementasi dapat diperlakukan sebagai perakit tingkat tinggi. Karena C juga digunakan sebagai alternatif untuk bahasa tingkat tinggi lainnya, dan karena banyak aplikasi tidak memerlukan kemampuan untuk melakukan hal-hal yang tidak bisa dilakukan oleh bahasa tingkat tinggi, para penulis Standar mengizinkan implementasi untuk berperilaku secara sewenang-wenang jika program mencoba menggunakan konstruksi tingkat rendah. Akibatnya, bahasa yang dijelaskan oleh Standar C tidak pernah menjadi bahasa pemrograman tingkat rendah.
Untuk memahami perbedaan ini, pertimbangkan bagaimana Bahasa Ritchie dan C89 akan melihat potongan kode:
pada platform di mana "char" adalah 8 bit, "int" adalah 16 bit big-endian, "float" adalah 32 bit, dan struktur tidak memiliki persyaratan padding atau alignment khusus sehingga ukuran "struct foo" adalah 8 byte.
Pada Bahasa Ritchie, perilaku pernyataan terakhir akan mengambil alamat yang disimpan dalam "p", tambahkan 3 * 8 + 2 [yaitu 26] byte ke dalamnya, dan mengambil nilai 16-bit dari byte pada alamat di alamat itu dan selanjutnya , tambahkan satu ke nilai itu, dan kemudian tulis kembali nilai 16 bit itu ke dua byte yang sama. Perilaku akan didefinisikan sebagai bertindak pada byte 26 dan 27 mengikuti satu di alamat p tanpa memperhatikan jenis objek apa yang disimpan di sana.
Dalam bahasa yang didefinisikan oleh Standar C, jika * p mengidentifikasi elemen "struct foo []" yang diikuti oleh setidaknya tiga elemen lebih lengkap dari tipe itu, pernyataan terakhir akan menambahkan satu ke anggota y dari elemen ketiga setelah * p. Perilaku tidak akan didefinisikan oleh Standar dalam keadaan lain apa pun.
Bahasa Ritchie adalah bahasa pemrograman tingkat rendah karena, sementara itu memungkinkan seorang programmer untuk menggunakan abstraksi seperti array dan struktur ketika nyaman, itu mendefinisikan perilaku dalam hal tata letak objek di dalam memori yang mendasarinya. Sebaliknya, bahasa yang dijelaskan oleh C89 dan standar yang lebih baru mendefinisikan hal-hal dalam hal abstraksi tingkat yang lebih tinggi, dan hanya mendefinisikan perilaku kode yang konsisten dengan itu. Implementasi kualitas yang sesuai untuk pemrograman tingkat rendah akan berperilaku bermanfaat dalam lebih banyak kasus daripada yang diamanatkan oleh Standar, tetapi tidak ada dokumen "resmi" yang menentukan apa yang harus dilakukan suatu implementasi agar sesuai untuk tujuan tersebut.
Bahasa C yang ditemukan oleh Dennis Ritchie dengan demikian adalah bahasa tingkat rendah, dan diakui demikian. Bahasa yang ditemukan oleh Komite Standar C, bagaimanapun, tidak pernah menjadi bahasa tingkat rendah dengan tidak adanya jaminan yang diberikan implementasi yang melampaui mandat Standar.
sumber