Sepertinya sebagian besar browser web umum (Firefox, Chrome, Safari) dikembangkan menggunakan C ++. Kenapa begitu?
Sepertinya sebagian besar browser web umum (Firefox, Chrome, Safari) dikembangkan menggunakan C ++. Kenapa begitu?
Jawaban:
Cara lain untuk mengajukan pertanyaan adalah dukungan apa yang dibutuhkan browser? Daftar singkatnya adalah:
Sebagian besar bahasa memiliki semacam dukungan penguraian. Anda memiliki generator parser untuk C, C ++, C #, Java, dll. Namun, C dan C ++ memiliki beberapa tahun mulai dari sisa alternatif sehingga algoritma dan implementasi lebih matang. Mengakses grafik yang dipercepat di Jawa adalah jalan keluar, kecuali jika Anda memiliki beberapa ekstensi asli untuk membuatnya berfungsi. WPF pada C # menyediakan akses ke grafik yang dipercepat, tetapi terlalu baru untuk memiliki browser yang serius yang dibangun dengan teknologi.
Jaringan sebenarnya adalah alasan paling tidak untuk memilih C ++ daripada Java atau C #. Alasannya adalah bahwa komunikasi berkali-kali lebih lambat daripada sisa pemrosesan yang berlangsung untuk menampilkan halaman. Kecepatan baku kawat adalah faktor pembatas. Baik Java dan C # memiliki dukungan IO non-blocking, seperti halnya C ++. Jadi tidak ada pemenang yang jelas di bidang ini.
Kenapa tidak Jawa? Pernahkah Anda mencoba membangun UI dengan Java? Rasanya rumit dan lambat dibandingkan dengan apa pun di luar sana, karena memang demikian. Tidak ada grafik yang dipercepat juga negatif besar di sini. Sandboxing Java benar-benar bagus, dan dapat membantu meningkatkan keamanan browser jika digunakan dengan benar, tetapi sulit untuk mengkonfigurasi dan membuat pekerjaan. Belum lagi dukungan format grafis tertinggal dari sebagian besar browser modern.
Kenapa tidak C #? Jika satu-satunya target Anda adalah Windows, C # sebenarnya bisa membuat representasi yang baik. Masalahnya muncul ketika Anda ingin mendukung hal lain. Mono belum cukup untuk dianggap cukup lintas platform untuk tugas ini - terutama dengan dukungan grafis dipercepat dan WPF. Siapa yang tahu berapa lama waktu yang dibutuhkan untuk berubah.
Kenapa tidak C? Ada kompiler C untuk hampir semua platform di luar sana (termasuk perangkat tertanam). Namun, ada banyak hal yang tidak dilakukan C untuk Anda sehingga Anda harus ekstra waspada. Anda memiliki akses ke semua level terendah API, tetapi sebagian besar pengembang C tidak melakukan GUI. Bahkan perpustakaan C GUI ditulis dengan cara yang berorientasi objek. Segera setelah Anda mulai berbicara UI, bahasa berorientasi objek mulai lebih masuk akal.
Mengapa tidak Objective C? Jika satu-satunya target Anda adalah Apple, itu sangat masuk akal. Namun, sebagian besar pengembang tidak tahu Objective-C, dan satu-satunya alasan untuk mempelajarinya adalah untuk bekerja di NeXT atau kotak Apple. Tentu Anda dapat menggunakan pustaka C apa pun dengan Objective-C, dan ada kompiler untuk banyak platform, tetapi menemukan orang untuk mengerjakannya akan menjadi sentuhan yang lebih sulit. Siapa tahu? Mungkin Apple dapat mengubah kekurangan yang dirasakan ini.
Kenapa C ++? Ada kompiler C ++ untuk hampir semua platform di luar sana. Hampir setiap pustaka GUI memiliki antarmuka C ++, terkadang lebih baik dan terkadang hanya berbeda. Sebagai contoh, ATL Microsoft jauh lebih baik daripada panggilan fungsi win32 C atau bahkan perpustakaan MFC. Ada pembungkus C ++ untuk GTK di Unix, dan saya akan terkejut jika seseorang tidak memiliki pembungkus C ++ di sekitar perpustakaan Objective-C GUI Apple. Manajemen proses lebih mudah dalam C ++ daripada Java atau C # (detail-detail itu disarikan untuk Anda). Kecepatan yang dirasakan lebih banyak berasal dari akselerasi perangkat keras dibandingkan dengan kinerja mentah. C ++ memang mengurus lebih banyak hal untuk Anda daripada C mentah (seperti string terikat), tetapi masih memberi Anda kebebasan untuk men-tweak hal-hal.
Untuk saat ini, C ++ memang mengesampingkan alternatif.
Saya telah memutuskan untuk menulis sebuah novel tentang ini dengan harapan orang-orang akan mengabaikannya dan membuat saya bersemangat. Tidak, tidak, hanya bercanda! Saya menderita karena setiap kata. Setiap kata, saya katakan!
Semua browser web utama dapat melacak asal mereka kembali ke tahun 90-an. Konqueror menjadi Safari dan Chrome; Netscape menjadi Firefox; IE dan Opera masih IE dan Opera. Semua peramban ini memiliki kepala mulai 15 tahun pada petahana.
Saya sarankan Anda bahkan mencoba untuk menamai bahasa cross-platform yang dapat diterima (Windows / Mac / Unix dan bahkan lebih buruk) yang tersedia di sekitar tahun 1995 ketika browser modern berasal. Untuk membangun inti dalam apa pun selain C / C ++, Anda mungkin harus membangun atau membeli dan memodifikasi kompiler dan pustaka platform.
Hanya untuk bersenang-senang, mari kita pikirkan masalah hari ini. Ya, ada alternatif, tetapi masih ada masalah besar.
Pilihan bahasa menyajikan setidaknya masalah ini:
Di mana Anda mendapatkan orang yang tahu bahasa atau bisa mempelajarinya? Ini merupakan hambatan untuk bahasa seperti OCaml, F #, Haskell, Common Lisp dan D yang cukup cepat dan tingkat tinggi untuk menulis browser dengan baik, tetapi memiliki beberapa pengikut (Dalam kisaran 10k-100k, mungkin) bahkan jika Anda secara bebas hitung semua penghobi dan akademisi.
Jawaban wajar untuk kultus kargo di atas:
Bahkan di zaman modern, Anda memerlukan bahasa yang cukup cepat untuk bagian intensif rendering halaman rendering dan menjalankan Javascript. Anda dapat memilih untuk melengkapi itu dengan bahasa tingkat tinggi untuk membangun elemen GUI, dll. (Mis. Pendekatan Firefox dari C ++ dan Javascript) tetapi Anda harus memiliki integrasi yang erat antara bahasa; Anda tidak bisa mengatakan, "Oke, C # dan Lua." Anda mungkin harus membangun dan men-debug jembatan itu sendiri kecuali Anda memilih C atau C ++ sebagai bahasa dasar.
Pengembangan lintas-platform adalah kantong cacing lainnya. Anda bisa menggunakan C # atau F # dan menyilangkan jari Anda pada GTK # dan Mono menjadi hidup dan sehat di masa depan. Anda dapat mencoba Common Lisp, Haskell, OCaml ... Selamat mencoba semuanya berjalan di Windows dan Mac dan Linux.
Setelah semua itu, Anda harus membangun sejumlah besar fungsionalitas, jadi jika Anda memilih bahasa tingkat rendah, Anda memerlukan pasukan pembuat kode yang lebih besar daripada sebelumnya. Perhatikan bahwa tidak ada yang benar-benar membuat peramban dari awal dalam waktu sekitar lima belas tahun. Itu sebagian karena (kejutan!) Itu sulit.
Secara khusus, memiliki juru bahasa Javascript adalah masalah 3 (memperoleh satu) atau masalah 4 (membangun satu).
Jika Anda mengembangkan browser tiga platform (Windows / Mac / * nix) hari ini (awal 2011), apa sajakah pilihannya?
Jika kita melihat browser besar lainnya naik dalam beberapa tahun ke depan, saya berani bertaruh itu akan ditulis dalam C atau C ++ dan bahasa yang dinamis (Seperti Firefox), apakah open source atau proprietary.
Sunting (31 Juli 2013) : Komentator di Hacker News sepertinya menyebut Rust and Go (tidak secara khusus sehubungan dengan jawaban saya), yang secara samar-samar jatuh ke dalam ember "lain-lain cepat". Mencoba menjadikan daftar bahasa ini egaliter dan mutakhir akan menjadi perjuangan yang sia-sia, jadi alih-alih saya menyebutnya sampel yang representatif pada saat penulisan dan membiarkannya sendiri.
Kecepatan
Seburuk itu, C ++ masih apa yang Anda gunakan ketika Anda ingin aplikasi cepat dan kontrol penuh atas kode.
Inilah sebabnya mengapa game, bagian non-inti (seperti importir file) dari Office, dan masih banyak lagi yang ditulis dalam C ++.
Diedit untuk memasukkan respons dari MSalters
Saya hanya bisa menebak, tetapi Anda menyebutkan produk perangkat lunak yang menargetkan beberapa platform, dan C ++ dapat dikompilasi ke platform apa pun.
(Saya sudah bekerja di Firefox selama sekitar lima tahun.)
Penanya benar bahwa banyak kode Firefox adalah C ++, dan sebenarnya C ++ adalah mayoritas jika Anda menghitung berdasarkan baris kode (meskipun itu tidak menceritakan keseluruhan cerita, karena kami memiliki banyak JavaScript, dan JS lebih ringkas daripada C ++).
Namun kenyataannya, Firefox ditulis dalam banyak bahasa berbeda:
Saya yakin saya lupa beberapa.
Daftar ini penting karena mengisyaratkan kompleksitas luar biasa yang berada di belakang browser web.
Ya, Firefox memiliki banyak kode C ++, dan ya, itu ada hubungannya dengan fakta bahwa C ++ adalah bahasa terbaik untuk hal semacam ini ketika Netscape didirikan. Tetapi saya juga berpendapat bahwa tidak ada bahasa yang lebih baik hari ini untuk banyak hal yang kami lakukan.
Tidak ada bahasa lain yang memiliki ekosistem perpustakaan sekuat (kami sangat bergantung pada kode eksternal). Beberapa bahasa lain memberi Anda kontrol tumpukan penuh seperti C ++ (kami secara teratur mengubah pengalokasi tumpukan kustom kami dan melakukan segala macam hal yang tidak aman memori untuk lebih cepat atau menggunakan lebih sedikit memori). Beberapa bahasa lain memungkinkan Anda menerapkan kembali sebagian besar perpustakaan standar dengan cara yang waras (kami memiliki implementasi string dan koleksi kami sendiri, disesuaikan dengan kebutuhan kami). Beberapa bahasa lain memungkinkan Anda menerapkan pengumpul sampah Anda sendiri. Dan seterusnya.
Meskipun C ++ adalah pilihan yang jelas untuk banyak hal yang kami lakukan, orang-orang yang menyarankan agar kami dapat menulis browser di Java dan menulis JVM kami sendiri jika perlu ada sesuatu. Ini pada dasarnya adalah apa yang kami lakukan, tetapi dengan JavaScript alih-alih Java. Tentu saja, sebagian besar browser tidak ditulis dalam JavaScript. Tetapi jumlah yang mengejutkan adalah.
Nah, Anda harus meminta pengembang produk-produk langsung untuk mendapatkan yang jawaban, tapi saya menduga itu kombinasi dari keakraban (itu apa yang mereka pengembang tahu terbaik), kinerja (kompilasi ke biner asli sebagai lawan bytecode), dan alat (dibandingkan dengan bahasa seperti C, C ++ penuh dengan gadget hemat tenaga kerja yang bagus seperti STL).
Setiap browser memiliki beberapa riwayat yang memengaruhi pilihan bahasa.
Sebagai contoh, baik Chrome dan Safari didasarkan pada WebKit, yang memiliki asal-usulnya di bagian KHTML proyek KDE. KDE awalnya dibuat (sebagian) sebagai demonstrasi dari toolkit Qt GUI, sehingga KDE, secara keseluruhan, adalah proyek C ++. Semua proyek KDE baru, pada saat itu, seluruhnya ditulis dalam C ++, jadi itu adalah pilihan logis untuk KHTML. Sejak itu porting untuk menggunakan toolkit GUI lainnya.
Mesin Presto Opera ditulis dengan kinerja dan ukuran biner kecil dalam pikiran: C ++ adalah pilihan logis.
Microsoft IE ditulis sebagai kumpulan komponen ActiveX, yang bisa ditulis dalam bahasa apa pun yang memiliki ikatan COM, tetapi kemungkinan ditulis dalam subset C ++, karena mayoritas basis kode mereka sudah ditulis dalam bahasa itu.
Mozilla Netscape ditulis dalam C ++ kemungkinan karena portabilitas menjadi perhatian utama mereka. Kompiler C dan C ++ (secara virtual) ada di mana-mana, dan itu merupakan pilihan yang logis.
Tidak ada alasan teknis yang melekat untuk pilihan ini. Itu hanya "sepertinya ide yang bagus saat itu."
Jaringan di C dan C ++ mudah dioptimalkan, karena Anda tidak harus menggunakan perpustakaan jika tidak mau. Saya menduga bahwa C ++ adalah bahasa pilihan karena memungkinkan kelebihan C:
ditambah dengan keunggulan OOP:
Ketika baris pertama kode untuk putaran pertama browser ditulis, C # dan Java tidak ada. Ruby juga tidak. Python mungkin sudah ada, tetapi itu masih merupakan proyek homebrew kecil pada saat itu.
Pada dasarnya, tidak ada pilihan lain selain C ++ yang memungkinkan seseorang untuk membangun browser yang cepat dan berjalan pada banyak platform berbeda.
Jadi mengapa mereka ditulis dalam bahasa C ++? Karena itu adalah satu-satunya bahasa yang tersedia yang dapat mereka tulis
Karena browser (misalnya, HotJava, cukup jelas ditulis dalam Java) yang ditulis dalam bahasa lain tidak pernah mencapai tingkat penerimaan / penetrasi pasar yang substansial.
Saya tidak bisa mengatakan apa-apa tentang iterasi saat ini (atau yang terbaru - belum diperbarui dalam waktu yang cukup lama) dari HotJava, tetapi ketika saya mencobanya, kurangnya penetrasi pasar sepertinya (setidaknya bagi saya) sangat mudah dimengerti - itu jelek, lambat, dan tidak kompatibel dengan beberapa halaman web. Pada akhirnya, tampaknya didasarkan pada premis yang tidak pernah berhasil: bahwa web akan terdiri terutama dari applet Java, dengan HTML sedikit lebih dari pembungkus yang memberitahu applet mana yang akan ditampilkan.
Sebagian darinya mungkin juga historis: sebagian besar browser web besar sudah ada sejak lama. Ketika pertama kali ditulis, lanskapnya jauh berbeda: C ++ adalah bahasa baru yang "panas", jadi bahasa ini digunakan untuk banyak pengembangan baru. Peramban telah menjadi beberapa peranti lunak yang paling banyak digunakan, sementara banyak peramban lain yang sejak saat itu luntur.
Saya pikir "sikap" bahasa yang ditampilkan memiliki efek juga: C ++ (seperti C sebelumnya) selalu menekankan kepraktisan dan pragmatisme. Sikap dasar itu cenderung menarik para programmer yang juga pragmatis. Banyak bahasa lain lebih menekankan pada hal-hal seperti keanggunan - dan dengan demikian, mereka menarik programmer yang berpikir dengan cara yang sama. Masalah dengan itu adalah apa yang saya sebut "efek Lisp". Gejalanya meliputi:
Ada lebih banyak, tetapi Anda mendapatkan ide umum (dan ya, saya melebih-lebihkan sampai taraf tertentu - tetapi hanya sampai taraf tertentu). Ya, beberapa kode yang Anda dapatkan akan sangat indah - tetapi kemungkinan bahwa itu adalah enam bulan terlambat, dan sebagian besar tidak kompatibel dengan setiap bagian kode lainnya (apa yang seharusnya) sistem, dan pada saat Anda menerimanya ada kemungkinan yang cukup adil ada hal lain yang cukup berubah sehingga Anda tidak bisa menggunakannya sama sekali.
Ada juga bahasa yang pasti akan bekerja dengan baik, tetapi (benar atau salah) tidak memiliki (atau pada saat yang penting, tidak memiliki) pangsa pasar bagi siapa pun yang pernah menulis browser di dalamnya. Mengingat ukuran dan kerumitan peramban yang lengkap, dibutuhkan banyak orang dan sedikit waktu untuk mengembangkannya. Dengan investasi semacam itu, banyak orang menjadi relatif konservatif dalam hal-hal seperti alat pengembangan.
gets
, yang merupakan fungsi yang mengerikan, tetapi hampir tidak dapat dihindari (dan tentu saja bukan "mendasar" untuk bahasa, atau sesuatu seperti itu). Kedua, C ++ bukan bahasa yang sama dengan C dalam hal apa pun. Ketiga, OpenBSD menunjukkan dengan sangat baik bahwa perangkat lunak yang aman dapat dan ditulis dalam C. Tidak ada "kelemahan bahasa yang mendasarinya" yang mencegah penulisan perangkat lunak yang kokoh dan aman di C. Pangsa pasar kecil OpenBSD menunjukkan bahwa keamanan bukanlah masalah utama bagi kebanyakan orang. orang-orang.
gets
adalah konsekuensi sederhana dari fakta bahwa Anda tidak memberikannya panjang buffer yang Anda gunakan. Tidak ada yang mendasar pada bahasa itu - Anda bisa melakukan hal yang sama dalam Pascal (dan saya punya). Menulis perangkat lunak yang aman terhadap penyerang cerdas tidak mudah terlepas dari bahasa. Berdasarkan pengalaman di ketiganya, ini sedikit lebih mudah di C daripada di Pascal, dan jauh lebih mudah di C ++ daripada di C.
Pemrograman kargo-kultus. Persepsi bahwa "C ++ cepat" masih ada di luar sana, (meskipun fitur tingkat bahasa yang tidak dipikirkan dengan baik seperti model objek yang rusak parah yang memperlambat segalanya), dan orang-orang ingin browser mereka menjadi cepat, sehingga mereka menulis dalam C ++ .
Dalam dunia yang waras, orang-orang yang menulis perangkat lunak yang berhadapan dengan jaringan akan ngeri dengan pemikiran hanya menggunakan bahasa yang dibebani dengan semua masalah keamanan bawaan C, dan sebenarnya melakukan hal itu akan menjadi tindakan kelalaian kriminal. (Lihat saja berapa banyak buffer overflow exploit yang telah ditemukan terhadap berbagai browser dalam 15 tahun terakhir atau lebih! Berapa banyak jutaan dolar kerusakan yang menjadi tanggung jawab pembuat kode ini?)
Ada bahasa kompilasi lain yang mampu membuat binari cepat. Masalahnya adalah mereka tidak memiliki eksposur yang sama dengan keluarga C, dan kita semua harus menderita karenanya.
Fakta menyenangkan: Pada saat Morris Worm masuk ke Internet pada tahun 1988, secara meyakinkan menunjukkan masalah dengan menulis OS dan perangkat lunak yang menghadapi jaringan di C, (yang masih belum terpecahkan hingga saat ini, karena mereka merupakan kelemahan bawaan dalam bahasa tersebut. ,) Apple telah merilis sistem operasi tercanggih yang pernah dilihat dunia sejauh ini, selama beberapa tahun, ditulis dalam Pascal.
Kontrol dan Portabilitas
sebagian besar argumen kecepatan bisa jalan baik, tetapi dalam apa pun di mana Anda membutuhkan kontrol yang tepat atas bagaimana sesuatu dilakukan banyak bahasa tingkat yang lebih tinggi akan turun hujan di parade Anda. Ada pengecualian untuk ini, tetapi kebanyakan dari mereka tidak cukup lintas platform untuk dihitung dalam sesuatu seperti browser.
Ini tidak ada hubungannya dengan manfaat C ++ vs bahasa lain. Anda pasti dapat menulis peramban yang lebih baik dari awal dalam bahasa seperti Haskell; sebuah proyek yang penting ini bahkan dapat mengimplementasikan JVM mereka sendiri jika mereka perlu menjamin beberapa karakteristik kinerja. Seperti bagaimana Facebook menulis kompiler / optimizer PHP mereka sendiri.
Browser yang memecah markup non-standar lebih buruk daripada tidak berguna. Compat Legacy sangat penting dan sangat kompleks sehingga penulisan ulang bukanlah suatu pilihan. Banyak uang dan waktu diinvestasikan dalam keamanan yang teruji pertempuran dll, Anda tidak bisa begitu saja membuang investasi itu. Sekali lagi, seperti bagaimana Facebook masih ditulis dalam PHP.