Terkadang saat pemrograman dalam berbagai bahasa (C / C ++, C #), pemikiran ini muncul di benak saya:
- Apakah setiap bahasa ditulis dalam bahasa pemrograman C?
- Apakah bahasa C ibu / ayah dari semua bahasa?
- Apakah setiap konsep ( OOP , dll.) Semuanya diimplementasikan dalam C?
Apakah saya ke arah yang benar?
programming-languages
c
FaizanRabbani
sumber
sumber
Jawaban:
Tidak.
OCaml, Haskell, Lisp dialek seperti Skema, dan beberapa bahasa lain sering digunakan dalam pengembangan bahasa hobi.
Banyak bahasa diimplementasikan dalam C karena itu adalah bahasa di mana-mana, dan alat penulisan kompiler seperti generator lexer-parser (seperti yacc dan bison) dipahami dengan baik dan hampir sama di mana-mana.
Tapi C sendiri awalnya tidak bisa dikembangkan di C saat pertama kali dibuat. Itu, pada kenyataannya, awalnya dikembangkan menggunakan bahasa B. Bahasa sebelumnya (seperti Fortran) biasanya bootstrap menggunakan bahasa assembly asli atau bahkan kode mesin jauh sebelum C pernah ada.
Tidak terkait, paradigma bahasa seperti OOP umumnya adalah bahasa-agnostik. Paradigma fungsional, misalnya, dikembangkan (oleh Gereja Alonzo) sebagai dasar matematika jauh sebelum bahasa pemrograman pernah ada. Paradigma pemrograman prosedural dan terstruktur keluar dari karya matematika ahli teori seperti John von Neumann. Orientasi objek dikembangkan oleh beberapa upaya yang berbeda dan tidak terkait , beberapa dari kalkulus lambda (paradigma fungsional) dan beberapa dari sistem pemrograman dinamis seperti SmallTalk di Xerox PARC oleh Alan Kay.
C hanyalah sebagian kecil dari cerita, beberapa dekade setelah ide-ide ini muncul.
sumber
Bahasa adalah seperangkat aturan dan batasan matematika abstrak ("jika saya menulis ini , itu terjadi"). Itu tidak ditulis dalam apa pun, sungguh.
Ini ditentukan, biasanya dalam campuran dari subset resmi bahasa Inggris, notasi matematika, dan mungkin beberapa bahasa spesifikasi khusus. Sintaksis sering ditentukan dalam varian EBNF atau ABNF .
Misalnya, berikut adalah spesifikasi
for
ekspresi dari Spesifikasi Bahasa ISO Ruby:Berikut adalah contoh berbeda dari aturan kesesuaian jenis Scala:
Tidak, bukan. C cukup muda. Ada banyak bahasa lama. Karena perjalanan waktu secara fisik tidak mungkin, maka tidak mungkin bagi C untuk memiliki pengaruh apa pun pada bahasa-bahasa lama tersebut.
Semua itu ada sebelum C bahkan ditemukan. Dan banyak yang lain tidak memiliki pengaruh C di dalamnya, bahkan setelah itu ada. Keluarga bahasa PASCAL (ALGOL-58, ALGOL-60, ALGOL-X, ALGOL-W, PASCAL, Modula-2, Oberon, Oberon-2, Oberon Aktif, Oberon Aktif, Komponen Pascal) adalah garis keturunan yang sepenuhnya terpisah. Seluruh keluarga Lisp (LISP, Franz Lisp, InterLisp, MacLisp, Skema, Flavours, LOOPS, CommonLoops, Dylan, CommonLisp, Arc, Clojure, Racket, dll.) Juga tidak terkait. Bahasa fungsional (ISWIM, KRL, Miranda, ML, SML, CAML, OCaml, F #, Haskell, Gofer, Clean) dan seluruh keluarga tipe-dependen (Agda, Coq, GURU, Idris) sekitar sejauh mungkin dari C. Hal yang sama berlaku untuk keluarga Smalltalk (Smalltalk, Self, Newspeak, Us, Korz), keluarga pemrograman logika (PERENCANAAN, Prolog, Merkuri), SQL, dan banyak lainnya.
Bahasa pertama dengan konsep OO adalah Simula (1960) dan Smalltalk (1972), tetapi sistem berorientasi objek telah dibangun sejauh tahun 1953 (tanpa menyebut mereka itu). Sekali lagi, itu jauh sebelum C ada, jadi OO tidak mungkin memiliki hubungan dengan C.
sumber
x := x + y
sintaks daripada C-like yang lebih akrabx = x + y
. Kritik ini terjadi terlepas dari kenyataan bahwa C belum ditemukan ...Sebagian besar inti dari banyak bahasa penting ditulis dalam C, tetapi banyak hal berubah:
kompiler Java pertama yang dikembangkan oleh Sun Microsystems ditulis dalam C, tetapi sekarang perpustakaan kelas selalu ditulis dalam Java (karena mereka dimaksudkan untuk dijalankan menggunakan Java VM itu sendiri). Perpustakaan tertentu yang menggunakan JNI (Java Native Interface) mungkin sebagian ditulis dalam berbagai bahasa lain, karena mereka dimaksudkan untuk digunakan DI LUAR JVM.
Sun / Oracle VM ditulis dalam C ++. BEA / Weblogic / Oracle VM ditulis dalam C. Tetapi ada JVM yang ditulis dalam Java, Lisp, SmallTalk (IBM) ...
Ada banyak alasan mengapa C sering dipilih: kinerja, portabilitas, pengalaman.
Yang terakhir mungkin yang paling penting: Python dimulai pada tahun 1991, PHP pada tahun 1994/1995, Perl pada tahun 1988, Ruby pada tahun 1995. Pada tahun-tahun itu Jawa baru saja dirilis dan C ++ belum distandarisasi dengan baik.
Agak terkait:
sumber
Tidak, beberapa bahasa sudah ada sebelum C. Dan banyak diimplementasikan secara independen dari C, misalnya lihat http://en.wikipedia.org/wiki/Lisp_%28programming_language%29
sumber
javac
dari Oracle JDK / OpenJDK yang ditulis oleh Martin Odersky (dari Scala fame) di 100% Java, Eclipse Compiler, ditulis dalam 100% Java (berasal dari kompiler Jikes IBM ), kompilator dari IBM J9, juga berasal dari Jikes dan 100% Java. AFAIK, satu-satunya kompiler Java dalam penggunaan agak meluas yang tidak ditulis di Jawa adalah GCJSaya akan berkomentar jika saya bisa, tetapi saya tidak bisa melakukannya:
Salah satu alasan C tampak sangat umum adalah karena ia adalah salah satu bahasa paling awal yang dikembangkan, dan sejumlah besar bahasa modern didasarkan pada strukturnya (Java, Go, PHP, Perl, dll.) - membuatnya tampak seperti itu lebih banyak tempat daripada itu.
Alasan lain yang sering dilupakan adalah bahwa pada tahun 1973 Unix ditulis ulang dalam C dan banyak panggilan sistem Unix juga tersedia sebagai program / fungsi C, membuat keduanya sangat saling terkait. Karena Unix adalah bagian yang kuat dari pengembangan pemrograman modern secara keseluruhan, C diseret ke dalam keburukan dengannya.
Setelah mengatakan semua itu, jawaban untuk pertanyaan Anda adalah "Tidak". C didasarkan dari bahasa yang disebut ALGOL, dan ada banyak pesaing baik dengan ALGOL (FORTRAN, Lisp, COBOL) dan C (tidak ada yang terlintas dalam pikiran). Pemrograman berorientasi objek, bisa dibilang paradigma-pergeseran terbesar dalam desain pemrograman, tidak berasal dengan C - meskipun C ++ menjadi bahasa OOP yang sangat populer (itu muncul pertama kali di Lisp atau Simula 67, tergantung pada siapa Anda bertanya). Pada saat OOP muncul, C adalah bahasa yang begitu populer sehingga tidak perlu menjadi yang pertama - itu sangat populer sehingga "ekspansi" C ++, bisa dikatakan, menjadi salah satu bahasa OOP utama juga. Itu tetap digunakan modern terutama karena fitur kontrol memori yang kuat (Anda dapat langsung mengalokasikan dan membatalkan alokasi memori struktur Anda buat), memungkinkannya untuk membuat program dengan anggaran memori yang ketat (pikirkan video game) dan kompiler yang sangat dioptimalkan (jelas tergantung pada kompiler). Diakui, bahkan fitur-fitur ini kehilangan landasan ketika kompilasi Java JIT dan manajer memori dalam bahasa menjadi lebih maju.
sumber
Tentu saja tidak. Bagaimana kompiler C pertama ditulis dalam C jika C tidak ada sebelumnya? Ini bukan masalah ayam dan telur.
Ada banyak cara untuk menulis kompiler pertama dari suatu bahasa yang disebut bootstrap
Terlebih lagi kebanyakan kompiler mencoba mencapai hosting sendiri , atau mengkompilasi sendiri bahasanya, terutama untuk mempromosikan bahasa dan kompiler itu sendiri
sumber
Berikut adalah daftar dari beberapa bahasa pemrograman yang tidak ditulis dalam C, di samping bahasa mereka yang dilaksanakan di:
Bahasa terbaik untuk mengimplementasikan kompiler mungkin akan cukup jauh dari C. Bahasa fungsional memberi Anda hal-hal seperti skema rekursi dan kombinator pengurai monadik (asalkan Anda memiliki kacamata), yang membuatnya sangat cocok untuk pekerjaan kompiler.
Kedua, untuk menjawab pertanyaan Anda, apakah C adalah "ibu / ayah dari semua bahasa pemrograman" - tidak juga. C adalah bahasa yang dirancang dengan baik pada saat itu muncul, dan tidak diragukan lagi telah mempengaruhi desainer bahasa yang kemudian melakukan hal-hal yang sangat berbeda. Tetapi pada akhirnya, Haskell berangkat dari C pada dasarnya dengan segala cara yang mungkin. C berusia 45 tahun dan tidak mengherankan bahwa kami telah belajar untuk melakukan yang lebih baik sementara itu.
Akhirnya, untuk menjawab pertanyaan ketiga Anda, C tidak mengimplementasikan "semua konsep". Secara khusus, mencoba menerapkan beberapa konsep lanjutan dari pemrograman fungsional (seperti metamorfisme, atau, dilarang, sinkromorfisme) dalam C akan sangat sulit. Saya tidak terlalu akrab dengan pemrograman berorientasi objek, tetapi saya tahu pasti bahwa beberapa bahasa berorientasi objek memiliki tipe penjumlahan.
sumber
Bahasa pemrograman adalah spesifikasi (bukan perangkat lunak!) Yang biasanya ditulis dalam beberapa dokumen bahasa Inggris (dengan beberapa formalisasi, misalnya EBNF untuk sebagian besar sintaksis; terkadang semantik mereka juga sebagian diformalkan).
Misalnya, C11 didefinisikan oleh n1570 (yang harus Anda baca). Beberapa dialek Skema didefinisikan oleh R5RS (yang juga harus Anda baca, ditulis dengan sangat baik).
Bahasa pemrograman dapat diterapkan oleh beberapa perangkat lunak. Terkadang perangkat lunak itu adalah kompiler yang ditulis dalam bahasa pemrograman itu sendiri. Baca tentang kompiler bootstrap .
Seseorang dapat menulis kompiler dalam bahasa pemrograman yang dikompilasi itu sendiri. Jika bahasa XX itu baru, Anda harus melalui langkah sementara yang melibatkan penulisan penerjemah minimal atau kompiler dari subset bahasa tersebut dalam beberapa bahasa implementasi lainnya (mungkin C), dan kemudian Anda dapat membuang kompiler sementara itu atau interpreter (yang tidak harus "baik", cukup untuk mengkompilasi kompiler yang lain). Setelah Anda mengkompilasi kompiler XX Anda yang ditulis dalam XX Anda dapat membuang kompiler sementara Anda.
Seringkali (tetapi tidak selalu) sistem runtime sebagian ditulis dalam C (khususnya pengumpul sampah ).
Perhatikan bahwa tulang adalah kompiler Skema dan runtime yang seluruhnya ditulis dalam dirinya sendiri (dan Anda dapat menemukan banyak contoh implementasi sepenuhnya bootstrapped).
BTW lebih nyaman menggunakan C sebagai bahasa target dari kompiler .
Saat ini, banyak implementasi bahasa pemrograman adalah perangkat lunak bebas atau sumber terbuka . Jangan ragu untuk belajar (dan mungkin berkontribusi untuk) kode sumber mereka!
sumber