Genel web tarayıcılarının çoğu (Firefox, Chrome, Safari) C ++ kullanılarak geliştirilmiştir. Niye öyle?
Genel web tarayıcılarının çoğu (Firefox, Chrome, Safari) C ++ kullanılarak geliştirilmiştir. Niye öyle?
Yanıtlar:
Soruyu sormanın bir başka yolu, bir tarayıcının ne tür bir desteğe ihtiyacı olduğudur? Kısa liste:
Çoğu dilde bir tür ayrıştırma desteği vardır. C, C ++, C #, Java, vb. İçin ayrıştırıcı üreteçleriniz var. Ancak, C ve C ++ alternatiflerin geri kalan kısmında oldukça uzun bir süre başlıyor, bu nedenle algoritmalar ve uygulamalar daha olgunlaşıyor. Java'da hızlandırılmış grafiklere erişmek, çalışması için bazı yerel uzantılara sahip olmadığınız sürece geçerli değildir. C # üzerindeki WPF, hızlandırılmış grafiklere erişim sağlar, ancak teknolojiyle oluşturulmuş ciddi bir tarayıcıya sahip olmak için çok yeni.
Ağ oluşturma aslında Java veya C # ile C ++ 'ı seçme nedenlerinden en az olanıdır. Bunun nedeni, iletişimin sayfayı görüntülemeye devam eden işlemin geri kalanından çok daha yavaş olmasıdır. Telin ham hızı sınırlayıcı faktördür. Hem Java hem de C #, C ++ 'da olduğu gibi engelleyici olmayan IO desteğine sahiptir. Yani bu alanda gerçekten kesin bir kazanan yok.
Neden Java değil? Java ile bir kullanıcı arayüzü oluşturmayı hiç denediniz mi? Orada başka bir şeyle karşılaştırıldığında hantal ve yavaş hissediyor, çünkü öyle. Hızlandırılmış grafik yok burada da büyük bir negatif. Java'nın sanal alanı gerçekten iyidir ve doğru kullanılırsa bir tarayıcının güvenliğini artırmaya yardımcı olabilir, ancak yapılandırılması ve çalışılması acı vericidir. Grafik format desteği bahsetmiyorum bile çoğu modern tarayıcının gerisinde kalıyor.
Neden C # değil? Tek hedefiniz Windows ise, C # aslında iyi bir sunum yapabilir. Başka bir şeyi desteklemek istediğinizde sorun ortaya çıkar. Mono bu görev için yeterli platform olarak kabul edilemeyecek kadar yetmedi - özellikle hızlandırılmış grafik desteği ve WPF ile. Değişimin ne kadar süreceğini kim bilebilir?
Neden C değil? Hemen hemen her platform için (gömülü cihazlar dahil) bir C derleyicisi var. Ancak, C'nin sizin için yapamayacağı kadar fazla dikkatli olmanız gereken çok şey var. API'lerin tüm en düşük seviyelerine erişiminiz vardır, ancak C geliştiricilerin çoğu GUI yapmamaktadır. C GUI kütüphaneleri bile nesne yönelimli biçimde yazılmıştır. UI ile konuşmaya başlar başlamaz, nesne yönelimli bir dil daha iyi anlaşılmaya başlar.
Neden Hedef C değil? Tek hedefiniz Apple ise, çok mantıklı geliyor. Ancak çoğu geliştirici Objective-C'yi tanımıyor ve bunu öğrenmenin tek nedeni NeXT veya Apple kutuları üzerinde çalışmak. Tabii ki herhangi bir C kütüphanesini Objective-C ile kullanabilirsiniz ve birçok platform için derleyiciler vardır, ancak üzerinde çalışacak insanları bulmak daha zor bir dokunuş olacaktır. Kim bilir? Belki de Apple bu algılanan eksikliği tersine çevirebilir.
Neden C ++? Hemen hemen her platform için bir C ++ derleyicisi var. Neredeyse her GUI kütüphanesinin bir C ++ arayüzü var, bazen daha iyi ve bazen sadece farklı. Örneğin, Microsoft’un ATL’si win32 C işlev çağrılarından ve hatta MFC kitaplığından çok daha iyidir. Unix'te GTK için C ++ sarmalayıcılar var ve birinin Apple'ın Objective-C GUI kitaplığının etrafında bir C ++ sarmalayıcısı yoksa şaşırırdım. İşlem yönetimi C ++ 'da Java veya C #' dan daha kolaydır (bu bilgiler sizin için soyutlanmıştır). Algılanan hız, donanım ivmesinden, ham performanstan daha fazla gelir. C ++, sizin için ham C'den (sınırlı dizeler gibi) daha fazla şeyle ilgilenir, ancak yine de size ince ayar yapma özgürlüğü verir.
Şimdilik, C ++ alternatifleri öne çıkarıyor.
Bunun hakkında insanların bir şeyleri parlatacağı ve beni affedeceği umuduyla bir roman yazmaya karar verdim. Hayır, hayır, sadece şaka! Her kelimede acı çektim. Her kelimede sana söylüyorum!
Tüm büyük web tarayıcıları kökenlerini 90'lara kadar izleyebilir. Konqueror, Safari ve Chrome oldu; Netscape Firefox oldu; IE ve Opera hala IE ve Opera. Bu tarayıcıların hepsinde, görevliler için 15 yıllık bir başlangıç var.
Ben bile denemek önermek isim kabul edilebilir bir çapraz platform (Windows / Mac / Unix ve daha da kötüsü) modern tarayıcılar kökenli zaman etrafında 1995 yılında sunulmuştu dili. Çekirdeği C / C ++ dışında bir şey oluşturmak için, muhtemelen bir derleyici ve platform kitaplıkları oluşturmak veya satın almak ve değiştirmek zorunda kalacaktınız.
Sadece eğlence için, bugün problemi düşünelim. Evet, alternatifler var, ancak hala büyük sorunlar var.
Dil seçimi en azından şu problemleri sunar:
Dili tanıyan veya öğrenebilen insanları nereden buluyorsunuz? Bu, OCaml, F #, Haskell, Common Lisp ve D gibi dillerde güzel bir tarayıcı yazmak için yeterince hızlı ve yüksek, ancak liberal olsa bile çok az sayıda takipçisi olan diller için bir engeldir. tüm hobileri ve akademisyenleri sayın.
Yukarıdaki kargo-kült cevabının sonucu:
Modern zamanlarda bile, sayfa oluşturma işleminin yoğun bölümleri ve Javascript'i çalıştırmak için oldukça hızlı bir dile ihtiyacınız var. GUI öğeleri vb. Oluşturmak için üst düzey bir dille (örneğin, C ++ ve Javascript'in Firefox yaklaşımı) tamamlamayı seçebilirsiniz; ancak diller arasında yakın entegrasyona sahip olmanız gerekir; "Tamam, C # ve Lua" diyemezsin. Temel dil olarak C veya C ++ 'ı seçmediğiniz sürece muhtemelen kendiniz bu köprüyü kurmanız ve hata ayıklamanız gerekecektir.
Çapraz platform geliştirme bir başka solucan torbasıdır. Gelecekte C # veya F # 'yu kullanabilir ve GTK #' da ve Mono 'nun hayatta ve iyi durumda olmasını parmaklarınızla çapraz geçebilirsiniz. Sen Common Lisp, Haskell, OCaml deneyebilirsiniz ... Windows ve Mac ve Linux üzerinde çalışan her şeyi almakta iyi şanslar .
Bütün bunlardan sonra, muazzam miktarda bir işlevsellik oluşturmalısınız, bu yüzden düşük seviyeli bir dil seçtiyseniz, öncekinden daha sıkı bir kodlayıcı ordusuna ihtiyacınız var. Hiç kimse gerçekten yaklaşık on beş yıl içinde sıfırdan bir tarayıcı inşa etmedi. Bu kısmen çünkü (sürpriz!) Zor.
Spesifik olarak, bir Javascript yorumlayıcısına sahip olmak sorun 3 (bir tane edinir) veya sorun 4'tür (bir tane oluşturur).
Bugün üç platformlu (Windows / Mac / * nix) bir tarayıcı geliştirdiyseniz (2011 başında), seçeneklerden bazıları nelerdir?
Önümüzdeki birkaç yıl içinde başka bir büyük tarayıcı yükseldiğini görürsek, açık kaynaklı veya özel olsun, C veya C ++ dilinde ve dinamik bir dilde (Firefox gibi) yazılacağına bahse girerim.
Düzenleme (31 Temmuz 2013) : Hacker News’in yorumcuları, belirsizce "çeşitli hızlı" kepçenin içine belirsizce düşen Rust ve Go’dan (özellikle cevabımla bağlantılı değil) bahsediyor gibi görünüyor. Bu dil listesini eşitlikçi ve güncel tutmaya çalışmak kaybedilen bir savaş olacaktır, bu yüzden bunun yerine onu yazma ve yalnız bırakma zamanı olarak temsili bir örnek olarak adlandırıyorum.
hız
Çirkin olduğu gibi, C ++ hala hızlı bir uygulama ve kod üzerinde tam kontrol istediğinizde kullandığınız şeydir.
Bu nedenle, oyunlar, Office'in çekirdek olmayan bölümleri (dosya ithalatçıları gibi) ve daha fazlası hala C ++ ile yazılmıştır.
MSalters'ın yanıtını içerecek şekilde düzenlendi
Sadece tahmin edebilirim ama birden fazla platformu hedef alan yazılım ürünlerinden bahsediyorsunuz ve C ++ herhangi bir platforma derlenebilir.
(Firefox'ta yaklaşık beş yıldır çalışıyorum.)
Sorgu yapan kişi, birçok Firefox kodunun C ++ olduğunu ve aslında kodun satırlarını sayarsanız çoğunluk C ++ olduğunu söylesin (tüm hikayeyi anlatmasa da, çok fazla JavaScript olduğundan ve JS daha fazla olduğundan) C ++ 'dan daha kısa.
Ancak gerçekte, Firefox birçok farklı dilde yazılmıştır:
Bazılarını unutacağımdan eminim.
Bu liste önemlidir, çünkü bir web tarayıcısının arkasındaki inanılmaz karmaşıklığa işaret eder.
Evet, Firefox’un birçok C ++ kodu var ve evet, Netscape’in kurulduğu zaman C ++’ın bu tür şeyler için en iyi dil olduğu gerçeğiyle bir ilgisi var. Ancak, bugün yaptığımız işlerin çoğunda daha iyi bir dil olmadığını da iddia ediyorum.
Başka hiçbir dilde güçlü bir kütüphane ekosistemi yoktur (yoğun olarak dış koda güveniyoruz). Çok az sayıda diğer diller size C ++ gibi tam yığın kontrol sağlar (özel yığın ayırıcımızı düzenli olarak kontrol ediyoruz ve her türden bellek güvenli olmayan şeyi daha hızlı veya daha az bellek kullanmak için yapıyoruz). Birkaç başka dil standart kütüphanenin çoğunu aklı başında bir şekilde yeniden uygulamanıza izin verir (ihtiyaçlarımıza göre ayarlanmış kendi dizgilerimiz ve koleksiyon uygulamalarımız vardır). Çok az sayıda başka dil kendi çöp toplayıcınızı uygulamanıza izin verir. Ve bunun gibi.
Her ne kadar C ++, yaptığımız işlerin birçoğu için bariz bir seçim olsa da, Java'da bir tarayıcı yazabileceğimizi ve gerektiğinde kendi JVM'imizi yazabileceğimizi öneren kişiler bir şeyler yapmalı. Bu esasen yaptığımız şey, fakat Java yerine JavaScript. Tabii ki, tarayıcının çoğu JavaScript’te yazılmamıştır. Ancak şaşırtıcı bir miktar.
Eh, o kadar doğrudan bu ürünlerin geliştiriciler sormalısınız cevabı, ama aşinalık bir arada bulunuyor şüpheli (baytkoduna aksine bir yerli ikili derleme), performansı ve (bu o geliştiricilerin en iyi bildiği var) araçlar (C, C ++ gibi dillerle karşılaştırıldığında, STL gibi emek tasarrufu sağlayan güzel araçlarla doludur).
Tarayıcıların her birinin dil seçimini etkileyen bir geçmişi vardır.
Örneğin, hem Chrome hem de Safari, KDE projesinin KHTML bölümünde kökeni olan WebKit'i temel alır. KDE başlangıçta Qt GUI araç setinin bir gösterimi olarak (kısmen) yaratıldı, bu nedenle KDE, genel olarak bir C ++ projesi. Tüm yeni KDE projeleri o zamanlar tamamen C ++ dilinde yazılmıştı, bu yüzden KHTML için mantıklı bir seçimdi. O zamandan beri diğer GUI araç takımlarını kullanacak şekilde yerleştirildi.
Opera'nın Presto motoru performans ve akılda küçük bir ikili boyutta yazılmıştır: C ++ mantıklı bir seçimdi.
Microsoft'un IE'si, COM bağlamaları olan herhangi bir dilde yazılmış, ancak kod tabanlarının çoğunluğu zaten bu dilde yazılmış olduğu için muhtemelen C ++ alt kümesinde yazılmış olan bir ActiveX bileşenleri koleksiyonu olarak yazılmıştır.
Netscape'in Mozilla'sı C ++ ile yazılmıştır, çünkü taşınabilirlik onların en büyük endişesiydi. C ve C ++ derleyicileri (neredeyse) her yerde bulunur ve bu nedenle mantıklı bir seçimdi.
Bu seçimler için doğal teknik sebep yoktur . Sadece "o zaman iyi bir fikir gibiydi."
C ve C ++ 'da ağ oluşturmak optimize etmek kolaydır, çünkü istemiyorsanız kitaplıkları kullanmak zorunda değilsiniz. C ++ 'ın tercih edilen dil olduğundan şüpheleniyorum çünkü C'nin avantajlarını sağlıyor:
OOP'un avantajları ile birleştiğinde:
İlk tarayıcı turu için ilk kod satırları yazıldığında, C # ve Java yoktu. Ruby de yapmadı. Python buralarda olmuş olabilir, ancak bu noktada hala küçük bir homebrew projesiydi.
Temel olarak, C ++ dışında birisinin hızlı ve çok farklı platformlarda çalışacak bir tarayıcı yapmasına izin verecek başka seçenekler yoktu .
Peki neden C ++ 'da yazdılar? Çünkü yazılabilecek tek dil buydu.
Çünkü, başka dillerde yazılmış olan tarayıcılar (örneğin, HotJava, açık bir şekilde Java'da yeterince açıktır) hiçbir zaman önemli ölçüde pazar kabul / kullanım oranına ulaşılmamıştır.
HotJava'nın mevcut yinelemesi hakkında (ya da en son - bir süredir güncellenmedi) bir şey söyleyemem , ancak denediğimde piyasaya sızma eksikliği (en azından benim için) çok kolay görünüyordu - Çirkin, yavaş ve epeyce web sayfaları ile uyumsuz. Nihayetinde, hiçbir zaman açıklığa kavuşturulamayan bir önceliğe dayanıyor gibiydi: web, öncelikle Java uygulamalarını içerecek, HTML'yi ise hangi uygulamaların nerede görüntüleneceğini söyleyen bir sarıcıdan daha az.
Bunun bir kısmı da muhtemelen tarihidir: büyük web tarayıcılarının çoğu uzun zamandır kullanılıyor. İlk yazıldığında manzara çok farklıydı: C ++ "sıcak" yeni bir dildi, bu yüzden birçok yeni gelişme için kullanılıyordu. Tarayıcılar, en çok kullanılan yazılımlardan bazıları haline geldi, oysa zamanın çoğu unutulmaya başladı.
Bence, dilin sergilenen “tavrı” nın da bir etkisi olduğunu düşünüyorum: C ++ (ondan önce C gibi) pratikliği ve pragmatizmi her zaman vurguladı. Bu temel tutum, aynı zamanda pragmatik olan programcıları da çekme eğilimindedir. Diğer birçok dilde zerafet gibi konulara daha çok vurgu yapılır - ve böylece, aynı şekilde düşünen programcıları çeker. Bununla ilgili sorun “Lisp etkisi” dediğim şey. Belirtiler şunları içerir:
Dahası var, ama genel bir fikir edindiniz (ve evet, bir dereceye kadar abartıyorum - ama sadece bir dereceye kadar). Evet, aldığınız bazı kodlar şaşırtıcı derecede güzel olacak - ancak olasılıklar altı ay geç olması ve çoğunlukla sistemdeki (olması gereken) koddaki diğer tüm kod parçalarıyla uyumsuz olması ve aldığınız zaman Başka hiçbir şeyin kullanamayacağınız kadar değiştiği oldukça adil bir şans.
Hiç kuşkusuz gayet iyi çalışan diller de var, ancak (doğru ya da yanlış) basitçe herhangi bir kimsenin kendilerine bir tarayıcı yazmış olduğu pazar payına sahip değil (ya da önemli bir zamanda sahip değildi). Tam bir tarayıcının boyutu ve karmaşıklığı göz önüne alındığında, bir tanesini geliştirmek çok fazla zaman alır. Bu tür bir yatırımla, çoğu insan geliştirme araçları gibi şeyler konusunda nispeten muhafazakar hale geliyor.
gets
, korkunç bir işlev olan, ancak kaçınılmaz olan (ve dile kesinlikle "temel" olmayan bir terim olan) bir terimden yararlandı . İkincisi, C ++ her durumda C ile aynı dil değildir. Üçüncüsü, OpenBSD, güvenli yazılımın C dilinde yazılabildiğini ve yazıldığını oldukça iyi göstermektedir: C'ye sağlam, güvenli yazılım yazmayı engelleyen "temel dil hatası" yoktur. OpenBSD'nin küçük pazar payı, güvenliğin çoğu için büyük bir endişe olmadığını göstermektedir insanlar.
gets
basit bir sonucudur. Bu dil için temel bir şey yok - aynı şeyi Pascal'da da yapabilirdiniz (ve benim de var). Akıllı bir saldırgana karşı güvenli bir yazılım yazmak dile bakmaksızın kolay değildir. Her üç deneyime dayanarak, Pascal'da C'den biraz daha kolay, C ++ da C'den çok daha kolay
Kargo-kült programlama. "C ++ 'ın hızlı olduğu algısı hala ortadadır, (kötü düşünülmüş dil seviyesi özelliklerine rağmen, işleri yavaşlatan kötü kırılan nesne modeli gibi) ve insanlar tarayıcılarının hızlı olmasını isterler, bu yüzden C ++' da yazarlar. .
Aklı başında bir dünyada, ağa bakan yazılım yazan insanlar, C'nin tüm güvenlik konularıyla iç içe olan bir dili kullanma düşüncesiyle dehşete düşeceklerdi ve aslında bunu yapmak suç ihmali olacaktı. (Sadece son 15 yıl içerisinde çeşitli tarayıcılarda ne kadar tampon taşması kullanımının bulunduğuna bir bakın! Bu kodlayıcılar kaç milyon dolarlık zarardan sorumludur?)
Hızlı ikili dosyalar oluşturabilen başka derlenmiş diller var. Sorun şu ki, C ailesi ile aynı maruz kalmalarına sahip değiller ve hepimiz bunun için acı çekmek zorundayız.
Eğlenceli gerçek: Morris Worm 1988’de İnternet’e girdiğinde, C’de işletim sistemleri ve ağa dönük yazılımlar yazarken ortaya çıkan problemleri kesin olarak ortaya koyuyordu. ,) Apple, bugüne kadar gördüğüm en gelişmiş işletim sistemini, birkaç yıldan beri Pascal'da yazılmış.
Sistem düzeyinde API'lere erişim
Tüm tarayıcıların işletim sistemi ile bir noktada arayüzü olması gerekir ve başlıca işletim sistemlerinin çoğunda köklü C ve C ++ API'leri ve kitaplıkları bulunur. Bu API'lerle çalışmak genellikle sarmalayıcılardan ziyade C veya C ++ ile çalışmak daha kolaydır.
Kontrol ve Taşınabilirlik
Hız argümanlarının çoğu her iki yönde de olabilir, ancak bir şeylerin nasıl yapıldığına dair kesin kontrole ihtiyaç duyduğunuz herhangi bir şeyde, birçok üst seviye dilin birçoğu geçit töreninizde yağmur yağacaktır. Bunun istisnaları var, ancak çoğu tarayıcı gibi bir şeyi saymaya yetecek kadar platform arası değil.
Diğer dillere karşı C ++ 'ın esası ile ilgisi yoktur. Kesinlikle Haskell gibi bir dilde sıfırdan daha iyi bir tarayıcı yazabilirsiniz; Bu önemli bir proje, bazı performans özelliklerini garanti etmek için ihtiyaç duymaları halinde kendi JVM'lerini bile uygulayabilir. Facebook'un kendi PHP derleyicisini / iyileştiricisini nasıl yazdığı gibi.
Standart olmayan işaretlemeyi bozan bir tarayıcı işe yaramazdan daha kötüdür. Eski uyum o kadar kritik ve o kadar karmaşık ki, bir yeniden yazma sadece bir seçenek değil. Savaşta test edilmiş güvenlik vb. İşlere çok fazla para ve zaman harcanıyor. Yine, Facebook'un hala PHP dilinde yazıldığı gibi.