it-swarm-id.com

Mengapa sebagian besar browser dikembangkan di C ++

Sepertinya sebagian besar browser web umum (Firefox, Chrome, Safari) dikembangkan menggunakan C++. Kenapa begitu?

101
Nipuna

Cara lain untuk mengajukan pertanyaan adalah dukungan apa yang dibutuhkan browser? Daftar singkatnya adalah:

  • Dukungan untuk penguraian (diperlukan untuk memahami Script [X] HTML, CSS, dan [ECMA/Java])
  • Fitur penafsiran pohon berjalan (bagian dari penguraian dan pembangunan UI)
  • Dukungan untuk grafik dipercepat
  • Jaringan yang cepat
  • Untuk browser yang lebih canggih: kontrol atas proses dan isolasi memori antara halaman
  • Harus bekerja di semua platform yang didukung

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 Java adalah jalan, kecuali 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 dibangun dengan teknologinya.

Jaringan sebenarnya adalah alasan paling tidak untuk memilih C++ lebih dari Java atau C #. Alasannya adalah bahwa komunikasi jauh lebih lambat daripada sisa pemrosesan yang berlangsung untuk menampilkan halaman. kecepatan kawat adalah faktor pembatas. Keduanya Java dan C # memiliki non-blocking IO dukungan, seperti halnya C++. Jadi benar-benar tidak ada pemenang yang jelas dalam area ini.

Kenapa tidak Java? Apakah Anda pernah 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 yang disematkan). Namun, ada banyak yang C lakukan tidak lakukan untuk Anda bahwa Anda harus ekstra waspada. Anda memiliki akses ke semua level terendah API, tetapi mayoritas 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 Apple kotak. 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 tersebut disarikan untuk Anda). Kecepatan yang dirasakan lebih banyak berasal dari akselerasi perangkat keras daripada kinerja mentah. C++ memang mengurus lebih banyak hal untuk Anda daripada mentah C (seperti string terbatas), tetapi masih memberi Anda kebebasan untuk hal-hal Tweak. Belum lagi sejumlah perpustakaan yang diperlukan untuk membuat halaman web juga ditulis dalam C atau C++.

Untuk saat ini, C++ tidak Edge alternatif.

165
Berin Loritsch

Saya telah memutuskan untuk menulis sebuah novel tentang ini dengan harapan bahwa orang-orang akan mengabaikannya dan mendukung saya. Tidak, tidak, hanya bercanda! Saya menderita karena setiap Firman. Setiap kata, saya katakan!

Tanyakan 'kapan' sebelum 'mengapa'

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. Browser ini semuanya memiliki 15 tahun masa depan untuk petahana).

Saya sarankan Anda mencoba nama bahasa lintas 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 kecuali C/C++, Anda mungkin harus membangun atau membeli dan memodifikasi kompiler dan pustaka platform.

Bagaimana dengan hari ini? Apa alternatifnya?

Hanya untuk bersenang-senang, mari kita pikirkan masalah hari ini. Ya, ada alternatif, tetapi masih ada masalah besar.

Pilihan bahasa menyajikan setidaknya masalah ini:

  1. Masalah pengetahuan - Mempekerjakan/melatih pengembang atau menarik kontributor
  2. Masalah organisasi/sosial - Penerimaan bahasa
  3. Implementasi bahasa: Kecepatan, dukungan platform, tooling
  4. Kekuatan bahasa

1: Masalah pengetahuan

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.

2: Masalah Sosial/Organisasi

Jawaban wajar untuk kultus kargo di atas:

  • Peramban sumber terbuka yang tidak menggunakan C, C++, C # atau Java akan seharusnya mengalami kesulitan dengan kontributor.
  • Peramban berpemilik yang tidak menggunakan C, C++, C # atau Java akan membuat manajer proyek dibentak dengan keras di sebagian besar organisasi.

3. Masalah teknis

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 membuat 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 di GTK # dan Mono menjadi hidup dan sehat di masa depan. Anda dapat mencoba Common LISP, Haskell, OCaml ... Semoga semuanya berhasil di Windows dan Mac dan Linux.

4. Kekuatan Bahasa

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).

Kesimpulan:

Jika Anda mengembangkan browser tiga platform (Windows/Mac/* nix) hari ini (awal 2011), apa sajakah pilihannya?

  • C: Lihat (2). Semua orang akan menuntut C++. Bersenang-senang memilih toolkit lintas-platform atau membuat satu (1, 2, 3 dan 4). Lihat juga (4); bersenang-senang membangun peramban yang stabil dan aman di dalamnya.
  • C++: Bersenang-senang memilih toolkit lintas-platform atau membangun satu (1, 2, 3 dan 4). Selamat bersenang-senang (4) membangun browser yang stabil dan aman di dalamnya.
  • C atau C++ dan HLL: Taruhan terbaik Anda. Pilih racun Anda pada bahasa dinamis; Lihat (1) dan (2). Terlalu banyak bahasa yang baik, terlalu sedikit pengikut masing-masing. (1, 2, 3 dan 4) pada toolkit.
  • Java: Taruhan terbaik kedua, jika Anda harus menyenangkan manajemen menengah. Lihat (4); membangun hal-hal besar di Java membutuhkan lebih banyak kode daripada yang lainnya dalam daftar ini, tetapi mungkin C.
  • Scala: Ketukan Java pada (4); (1) dan (2) tetapi terus berlanjut.
  • C dan Javascript: Sebagai kasus khusus, ini menarik karena Anda sudah harus membangun atau memperoleh dan mengasimilasi penerjemah Javascript. (Karenanya Firefox.) (1, 2, 3 dan 4) pada toolkit; orang-orang Mozilla membangun IIRC mereka sendiri.
  • C #: Bersenang-senang di (3). Anda mungkin terjebak dengan GTK #, betapapun baiknya itu, atau membuat layer dan renderer Anda sendiri di atas GTK # dan Windows Forms.
  • Ruby/Python/Perl/Racket/Lua/Erlange dll .: Anda telah mendapatkan (3) perpustakaan dan platform widget lintas platform. Hukum Moore ada pada Anda pada (4); meningkatnya permintaan di browser melawan Anda.
  • OCaml, Haskell, Common LISP, Smalltalk: (1) dan (2) dalam sekop. Tidak ada masalah kecepatan, mungkin, tetapi (3) untuk pengembangan lintas-platform, dan Anda harus membangun segalanya sendiri atau menjembatani ke pustaka C/C++.
  • Objective-C: (3) Saya tidak yakin bagaimana pengembangan lintas-platform akan bekerja di sini.

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 tampaknya menyebutkan Rust dan Go (tidak secara khusus sehubungan dengan jawaban saya), yang jatuh secara samar ke dalam Ember "miscellaneous fast". Mencoba mempertahankan daftar bahasa ini agar tetap egaliter dan terbaru akan menjadi perjuangan yang sia-sia, jadi alih-alih, saya menyebutnya sampel yang representatif pada saat penulisan dan membiarkannya sendiri.

89
Jesse Millikan

Kecepatan

Seburuk itu, C++ masih apa yang Anda gunakan ketika Anda menginginkan 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

36
Ryan Hayes

Portabilitas

Saya hanya bisa menebak, tetapi Anda menyebutkan produk perangkat lunak yang menargetkan beberapa platform, dan C++ dapat dikompilasi ke platform apa pun.

17
Pete

(Saya telah bekerja di Firefox selama sekitar lima tahun.)

Penanya benar bahwa banyak kode Firefox adalah C++, dan sebenarnya C++ adalah mayoritas jika Anda menghitung dengan 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:

  • C++
  • C (NSS, NSPR, various libraries we've imported)
  • x86 dan ARM Majelis
  • JavaScript
  • XUL (bahasa markup mirip HTML) dan CSS
  • Objective C (kode khusus MacOS)
  • Java (kode khusus Android)
  • Beberapa bahasa antarmuka-definisi kustom (XPIDL, IPDL)
  • WebIDL (bahasa antarmuka-definisi lain, tetapi yang ini tidak khusus, meskipun pembuat kode adalah)
  • Python (pembuat kode)

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 men-tweak pengalokasi tumpukan kustom kami dan melakukan segala macam hal yang tidak aman memori menjadi 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 kita lakukan, orang-orang yang menyarankan agar kita dapat menulis browser di Java dan menulis JVM kita sendiri jika perlu ada sesuatu. Ini pada dasarnya apa yang kita lakukan, tetapi dengan JavaScript, bukan Java. Tentu saja, sebagian besar browser tidak ditulis dalam JavaScript. Tetapi jumlah yang mengejutkan adalah.

13
Justin L.

Nah, Anda harus meminta pengembang produk-produk itu secara langsung untuk mendapatkan the jawaban, tapi saya menduga itu adalah kombinasi dari keakraban (itulah yang paling dikenal oleh para pengembang), kinerja (kompilasi ke biner asli sebagai lawan bytecode), dan alat (dibandingkan dengan bahasa seperti C, C++ penuh dengan gadget hemat tenaga kerja bagus seperti STL).

12
John Bode

Sejarah

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. Awalnya KDE dibuat (sebagian) sebagai demonstrasi dari toolkit Qt GUI, jadi Secara keseluruhan, KDE adalah proyek C++. Semua proyek KDE baru, pada saat itu, seluruhnya ditulis dalam C++, jadi itu adalah pilihan logis untuk KHTML. Sejak saat itu, porting digunakan 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 dapat ditulis dalam bahasa apa pun yang memiliki ikatan COM, tetapi kemungkinan ditulis dalam subset C++, karena mayoritas basis kode mereka adalah 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 yang melekat teknis alasan untuk pilihan ini. Itu hanya "sepertinya ide yang bagus saat itu."

10
greyfade

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:

  • Kecepatan
  • Optimasi
  • Sejumlah portabilitas tertentu
  • Bahasa yang dikompilasi, tidak ditafsirkan

ditambah dengan keunggulan OOP:

  • Kemungkinan diperpanjang
  • Visualisasi yang lebih mudah
  • Dukungan pustaka yang lebih baik untuk tugas-tugas yang tidak penting seperti pemrosesan string dan struktur data
8
Michael K

Ketika baris pertama kode untuk putaran pertama browser ditulis, C # dan Java tidak ada. Ruby juga tidak. Python mungkin sudah ada, tapi itu masih proyek homebrew kecil pada saat itu.

Pada dasarnya, ada benar-benar tidak ada pilihan lain selain C++ yang akan memungkinkan seseorang untuk membangun browser yang akan cepat dan berjalan di berbagai platform.

Jadi mengapa mereka ditulis dalam bahasa C++? Karena itu adalah satu-satunya bahasa yang tersedia yang dapat mereka gunakan untuk menulis.

4
GrandmasterB

Karena browser (mis., HotJava, jelas cukup ditulis dalam bahasa Jawa) 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 paling baru - belum diperbarui cukup lama) dari HotJava, tetapi ketika saya mencobanya, kurangnya penetrasi pasar tampak (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 terutama terdiri dari Java applet, dengan HTML sedikit lebih dari bungkus yang memberitahu applet mana yang akan ditampilkan di mana.

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 itu 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 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:

  1. Argumen tak berujung atas kebanyakan implementasi elegan dari hal-hal yang paling sepele.
  2. Ketidakmampuan untuk membekukan fitur dan menyelesaikan sesuatu yang dapat dikirim (bahkan dengan cacat)
  3. Ketidakmampuan untuk berkompromi. Siapa pun yang tidak setuju dengan saya tidak hanya salah, tetapi juga harus bodoh atau jahat.

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 berfungsi 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.

4
Jerry Coffin

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.

3
Mason Wheeler

Akses ke API tingkat sistem

Semua browser harus berinteraksi dengan OS di beberapa titik, dan sebagian besar OS utama memiliki API dan pustaka C dan C++ yang telah mapan. Biasanya lebih mudah untuk bekerja dengan API tersebut di C atau C++ daripada menulis wrappers.

2
TMN

Kompatibilitas lama - tidak dapat membuang kode lama

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 cara Facebook menulis compiler/optimizer PHP) mereka sendiri.

Browser yang memecah markup non-standar lebih buruk daripada tidak berguna. Compat legacy sangat penting dan 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.

0
Dustin Getz

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.

0
Bill