it-swarm.asia

Çoğu tarayıcı neden C ++ ile geliştirilir?

Genel web tarayıcılarının (Firefox, Chrome, Safari) çoğu C++ kullanılarak geliştirilmiş gibi görünüyor. Neden böyle?

101
Nipuna

Soruyu sormanın bir başka yolu, bir tarayıcının ne tür desteğe ihtiyacı olduğudur? Kısa liste:

  • Ayrıştırma desteği ([X] HTML, CSS ve [ECMA/Java] Script'i anlamak için gerekir)
  • Ağaç yürüme/yorumlama özellikleri (ayrıştırma ve bina kullanıcı arayüzünün bir parçası)
  • Hızlandırılmış grafik desteği
  • Hızlı ağ iletişimi
  • Daha gelişmiş tarayıcılar için: işlemler üzerinde kontrol ve sayfalar arasında bellek yalıtımı
  • Desteklenen tüm platformlarda çalışmalıdır

Çoğu dilde bir tür ayrıştırma desteği bulunur. C, C++, C #, Java, vb. İçin ayrıştırıcı jeneratörleriniz var. Bununla birlikte, C ve C++ alternatiflerinin geri kalanında birkaç yıl daha başlar, böylece algoritmalar ve uygulamalar daha olgunlaşır. Çalıştırmak için bazı yerel uzantılarınız yoksa Java) hızlandırılmış grafiklere erişmek hiç de kolay değildir. C # üzerindeki WPF hızlandırılmış grafiklere erişim sağlar, ancak ciddi bir tarayıcı oluşturmak için çok yeni teknoloji ile.

Ağ oluşturma aslında Java veya C # üzerinden C++ 'ı seçmenin en az nedenidir. Bunun nedeni, iletişimin sayfayı görüntülemek için devam eden işlemin geri kalanından çok daha yavaş olmasıdır. telin hızı sınırlayıcı faktördür. Hem Java ve C # 'ın bloke olmayan IO destek, C++ gibi). bu alan.

Neden Java olmasın? Hiç Java ile kullanıcı arayüzü oluşturmayı denediniz mi? Orada başka bir şeyle karşılaştırıldığında hantal ve yavaş hissediyor, çünkü öyle. Hiçbir hızlandırılmış grafik de burada büyük bir negatif değil. Java'nın korumalı alanı gerçekten iyidir ve doğru kullanılırsa tarayıcının güvenliğini artırmaya yardımcı olabilir, ancak yapılandırmak ve çalışmak için bir acıdır. Çoğu modern tarayıcının arkasındaki grafik formatı destek gecikmelerinden bahsetmiyorum bile.

Neden C #? Tek hedefiniz Windows ise, C # aslında iyi bir sunum yapabilir. Sorun, başka bir şeyi desteklemek istediğinizde ortaya çıkar. Mono, özellikle hızlandırılmış grafik desteği ve WPF ile bu görev için yeterince çapraz platform olarak kabul edilecek kadar yakalanmadı. Değişmenin ne kadar süreceğini kim bilebilir.

Neden C değil? Hemen hemen her platform için bir C derleyicisi var (gömülü cihazlar dahil). Bununla birlikte, C'nin yapamayacağı sizin için fazladan uyanık olmanız gereken çok şey var. API'lerin en düşük düzeylerine erişebilirsiniz, ancak C geliştiricilerinin çoğu GUI yapmaz. C GUI kütüphaneleri bile nesne yönelimli bir şekilde yazılmıştır. Kullanıcı arayüzünden konuşmaya başlar başlamaz, nesne yönelimli bir dil daha anlamlı olmaya başlar.

Neden Objektif C değil? Tek hedefiniz Apple ise, çok mantıklı. Ancak, çoğu geliştirici Objective-C bilmiyor ve bunu öğrenmenin tek nedeni NeXT veya Apple kutuları. Objective-C ile herhangi bir C kütüphanesini kullanabilirsiniz. birçok platform için derleyiciler vardır, ancak üzerinde çalışacak insanları bulmak daha zor olacaktır. Kim bilir? Belki Apple bu algılanan eksikliği tersine çevirebilir.

Neden C++? Hemen hemen her platform için bir C++ derleyicisi var. Hemen hemen her GUI kütüphanesi bir C++ arayüzüne sahiptir, bazen daha iyidir ve bazen sadece farklıdır. Ö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 kütüphanesinin etrafında bir C++ sarmalayıcısı yoksa şaşırırdım. Süreç yönetimi C++ içinde Java veya C # 'dan daha kolaydır (bu ayrıntılar sizin için soyutlanır) Algılanan hız, donanım hızlandırmasından ham performanstan daha fazla gelir. sizin için ham C (sınırlı dizeler gibi), ama yine de size Tweak şeyler özgürlüğü verir.Web sayfalarını oluşturmak için gerekli bir dizi kütüphaneden bahsetmemek gerekirse C veya C++ ile yazılmıştır.

Şimdilik, C++ alternatifleri ortaya çıkarıyor.

165
Berin Loritsch

Bu konuda bir roman yazmaya karar verdim, insanların üzerinde parlayacak ve beni oylayacakları umuduyla. Hayır, hayır, sadece şaka yapıyorum! Her Sözün acısını çektim. Her Söz, sana söylüyorum!

'Ne zaman' önce 'neden' diye sorun

Tüm büyük web tarayıcıları kökenlerini 90'lara kadar takip edebilir. Konqueror Safari ve Chrome oldu; Netscape Firefox oldu; IE ve Opera hala IE ve Opera'dır. Bu tarayıcıların tümünde görev başında 15 yıllık bir başlangıç ​​vardır).

Modern tarayıcıların ortaya çıktığı 1995'te mevcut olan kabul edilebilir bir çapraz platform (Windows/Mac/Unix ve daha da kötüsü) bir ad adını bile denemenizi öneririm. Çekirdeği C/C++ dışında bir şeyde oluşturmak için muhtemelen bir derleyici ve platform kitaplıkları oluşturmanız veya satın almanız ve değiştirmeniz gerekirdi.

Peki ya bugün? Alternatifleri nelerdir?

Sadece eğlence için, bugün sorunu düşünelim. Evet, alternatifler var, ama hala büyük sorunlar var.

Dil seçimi en azından şu sorunları ortaya koymaktadır:

  1. Bilgi sorunları - Geliştiricileri işe alma/eğitme veya katkıda bulunanları cezbetme
  2. Örgütsel/sosyal sorunlar - Dil kabulü
  3. Dil uygulaması: Hız, platform desteği, kalıp
  4. Dil gücü

1: Bilgi sorunları

Dili bilen ya da öğrenebilen insanlara nereden ulaşırsınız? Bu, OCaml, F #, Haskell, Common LISP ve D gibi güzel bir tarayıcı yazmak için yeterince hızlı ve yüksek seviyeli, ancak liberal olarak bile az takipçiniz (belki 10k-100k aralığında, belki) olan diller için bir engeldir. tüm hobileri ve akademisyenleri sayın.

2: Sosyal/Örgütsel sorunlar

Yukarıdaki kargo kült cevabı sonucu:

  • C, C++, C # veya Java (sözde ) sözde katkıda bulunmayanlarla açık bir tarayıcı kullanmıyor.
  • C, C++, C # veya Java) kullanmayan özel bir tarayıcı, proje yöneticilerinin çoğu kuruluşta ciddi şekilde bağırmasını sağlar.

3. Teknik sorunlar

Modern zamanlarda bile, sayfa oluşturma ve Javascript çalıştırmanın yoğun hesaplama bölümleri için oldukça hızlı bir dile ihtiyacınız vardır. Bunu GUI öğeleri vb. Oluşturmak için üst düzey bir dille tamamlamayı seçebilirsiniz (örn. C++ ve Javascript'in Firefox yaklaşımı), ancak diller arasında yakın entegrasyonunuz olmalıdır; "Tamam, C # ve Lua" diyemezsiniz. Temel dil olarak C veya C++ seçmediğiniz sürece muhtemelen bu köprüyü kendiniz oluşturup hata ayıklamanız gerekir.

Platformlar arası geliştirme başka bir solucan torbasıdır. C # veya F # kullanabilir ve parmaklarınızı GTK # ve Mono'nun hayatta ve gelecekte iyi olmasını sağlayabilirsiniz. Ortak LISP, Haskell, OCaml ... deneyebilirsiniz Windows ve Mac ve Linux üzerinde her şeyi elde etmek için iyi şanslar.

4. Dil Gücü

Tüm bunlardan sonra, muazzam miktarda işlevsellik inşa etmelisiniz, bu yüzden düşük seviyeli bir dil seçerseniz, öncekinden daha da büyük bir kodlayıcı ordusuna ihtiyacınız vardır. On beş yıl içinde hiç kimsenin sıfırdan bir tarayıcı oluşturmadığını unutmayın. Bunun nedeni kısmen (sürpriz!) Zor.

Özellikle, bir Javascript yorumlayıcısına sahip olmak problem 3 (bir tane edinin) veya problem 4'tür (bir tane oluşturun).

Sonuç:

Bugün üç platformlu (Windows/Mac/* nix) bir tarayıcı geliştirdiyseniz (2011 başı), bazı seçenekler nelerdir?

  • C: Bkz. (2). Herkes C++ için istila edecek. Bir platformlar arası araç seti seçerek veya bir (1, 2, 3 ve 4) oluştururken eğlenin. Ayrıca bakınız (4); içinde istikrarlı, güvenli bir tarayıcı oluşturmak eğlenin.
  • C++: Bir platformlar arası araç seti seçerek veya bir (1, 2, 3 ve 4) oluştururken eğlenin. İçinde istikrarlı, güvenli tarayıcı oluşturma (4) eğlenin.
  • C veya C++ ve HLL: En iyi bahsiniz. Dinamik dilde zehirinizi seçin; Bkz. (1) ve (2). Çok fazla iyi dil, her birinin çok az takipçisi. (1, 2, 3 ve 4).
  • Java: İkinci yönetimi memnun etmek istiyorsanız ikinci en iyi bahis. Bkz. (4); Java) içinde büyük şeyler oluşturmak, bu listedeki herhangi bir şeyden çok daha fazla kod alır, ancak belki de C'dir.
  • Scala: Beats Java (4); (1) ve (2) üzerinde ama yakalanıyor.
  • C ve Javascript: Özel bir durum olarak, bu zaten caziptir çünkü Javascript yorumlayıcısını derlemek veya almak ve asimile etmek zorundasınız. (Bu nedenle Firefox.) (1, 2, 3 ve 4) araç setinde; Mozilla halkı kendi IIRC'sini kurdu.
  • C #: (3) 'te iyi eğlenceler. Muhtemelen GTK # ile sıkışıp kaldınız, ya da GTK # ve Windows Formlarının üstünde kendi katmanınızı ve oluşturucunuzu oluşturuyorsunuz.
  • Ruby/Python/Perl/Raket/Lua/Erlange vb .: Platformlar arası widget kütüphaneleri ve hızınızda (3) var. Moore yasası (4) 'de sizinle; tarayıcılara olan artan talep size karşı.
  • OCaml, Haskell, Ortak LISP, Smalltalk: (1) ve (2) maça. Muhtemelen hız sorunu yok, ancak (3) platformlar arası geliştirme için ve her şeyi kendi oluşturmanız veya bir şekilde C/C++ kütüphanelerine köprü kurmanız gerekecek.
  • Objective-C: (3) Platformlar arası geliştirmenin burada nasıl işleyeceğinden emin değilim.

Önümüzdeki birkaç yıl içinde başka bir büyük tarayıcı artışı görürsek, C veya C++ ve dinamik bir dilde (Firefox gibi) yazılır, ister açık kaynaklı ister tescilli olsun.

Edit (31 Temmuz 2013): Hacker News hakkındaki yorumcular, belirsiz bir şekilde düşen Rust ve Go (özellikle cevabımla bağlantılı değil)) "çeşitli hızlı" kova. eşitlikçi ve güncel dil bu listesini tutmak için kaybetme bir savaş olacak, bu yüzden bunun yerine yazma ve yalnız bırakma zamanı temsili bir örnek olarak adlandırıyorum.

89
Jesse Millikan

Hız

Oldukça çirkin olduğu gibi, C++ 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 içe aktarıcılar gibi) ve daha fazlası C++ ile yazılmıştır.

MSalters'ın yanıtını içerecek şekilde düzenlendi

36
Ryan Hayes

Taşınabilirlik

Sadece tahmin edebilirim, ancak birden fazla platformu hedefleyen yazılım ürünlerinden bahsediyorsunuz ve C++ herhangi bir platforma derlenebilir.

17
Pete

(Yaklaşık beş yıldır Firefox üzerinde çalışıyorum.)

Sorgulayan, Firefox'un kodunun birçoğunun C++ olduğu doğrudur ve aslında kod satırlarına göre saydığınızda C++ çoğunluktur (her ne kadar bu hikayenin tamamını söylemese de, çok fazla JavaScript'e sahibiz ve JS daha fazla C++ 'dan daha kısa).

Ancak gerçekte, Firefox birçok farklı dilde yazılmıştır:

  • C++
  • C (NSS, NSPR, various libraries we've imported)
  • x86 ve ARM Montaj
  • JavaScript
  • XUL (HTML benzeri bir biçimlendirme dili) ve CSS
  • Hedef C (yalnızca MacOS kodu)
  • Java (yalnızca Android kodu)
  • Birden çok özel arayüz tanımı dili (XPIDL, IPDL)
  • WebIDL (başka bir arayüz tanımı dili, ancak kod üreticisi olmasına rağmen bu dil özel değil)
  • Python (kod üreteçleri)

Eminim bazılarını unutuyorum.

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 sürü C++ kodu var ve evet, bu C++ 'ın Netscape kurulduğunda bu tür şeyler için en iyi dil olduğu gerçeğiyle ilgisi var. Ancak bugün yaptığımız birçok şey için daha iyi bir dil olmadığını da iddia ediyorum.

Başka hiçbir dilde güçlü bir kütüphane ekosistemi yoktur (büyük ölçüde dış koda dayanıyoruz). Birkaç diğer dil size C++ gibi tam yığın kontrolü sağlar (özel yığın ayırıcımızı düzenli olarak düzenleriz ve her türlü güvenli olmayan şeyi daha hızlı veya daha az bellek kullanırız). Birkaç başka dil, standart kütüphanenin çoğunu aklı başında bir şekilde yeniden uygulamanıza izin veriyor (ihtiyaçlarımıza göre ayarlanmış kendi dizelerimiz ve koleksiyon uygulamalarımız var). Birkaç başka dil, kendi çöp toplayıcınızı uygulamanıza izin verir. Ve bunun gibi.

Her ne kadar C++ yaptığımız şeylerin çoğu için bariz bir seçim olsa da, Java) içinde bir tarayıcı yazabileceğimizi ve gerekirse kendi JVM'imizi yazabileceğimizi öneren insanlar bir şeye bağlıdır. yaptığımız, ancak Java yerine JavaScript ile.Tabii ki, tarayıcının çoğu JavaScript ile yazılmış değil, ama şaşırtıcı bir miktar.

13
Justin L.

Eh, bu ürünlerin geliştiricilerinden doğrudan the cevap almasını istemelisiniz, ancak bunun bir aşinalık (bu geliştiricilerin en iyi bildikleri şey) kombinasyonu, performans (yerel bir ikili dosyaya derleme) olduğunu düşünüyorum. bayt kodun aksine) ve araçlar (C gibi dillerle karşılaştırıldığında, C++ STL gibi emek tasarrufu sağlayan güzel araçlarla doludur).

12
John Bode

Tarih

Tarayıcıların her birinin dil seçimini etkileyen bir geçmişi vardır.

Örneğin, hem Chrome ve Safari, kökenleri KDE projesinin KHTML bölümünde yer alan WebKit'e dayanmaktadır. KDE başlangıçta (kısmen) Qt GUI araç takımının bir gösterimi olarak yaratılmıştır. KDE, genel olarak bir C++ projesidir.Tüm yeni KDE projeleri o zamanlar tamamen C++ ile yazılmıştır, bu nedenle KHTML için mantıklı bir seçimdi ve o zamandan beri diğer GUI araç takımlarını kullanmak için taşınmıştır.

Opera'nın Presto motoru performans ve küçük bir ikili boyut düşünülerek yazılmıştır: C++ mantıklı bir seçimdi.

Microsoft'un IE, COM bağlamaları olan herhangi bir dilde yazılmış olabilir, ancak büyük olasılıkla C++ alt kümesinde yazılmış olan ActiveX bileşenlerinin bir koleksiyonu olarak yazılmıştır, çünkü kod tabanlarının çoğunluğu zaten o dilde yazılmış.

Netscape Mozilla, taşınabilirlik onların büyük bir endişesi olduğu için muhtemelen C++ ile yazılmıştır. C ve C++ derleyicileri (neredeyse) her yerde bulunur ve bu nedenle mantıklı bir seçimdi.

Bu seçeneklerin doğasında teknik bir sebep yoktur. Sadece "o zamanlar iyi bir fikir gibi görünüyordu".

10
greyfade

C ve C++ 'da ağ iletişimi optimize etmek kolaydır, çünkü istemiyorsanız kitaplıkları kullanmak zorunda değilsiniz. C + 'nın C'nin avantajlarına izin verdiği için tercih edilen dil olduğundan şüpheleniyorum:

  • Hız
  • Optimizasyon
  • Belli miktarda taşınabilirlik
  • Derlenmiş dil, yorumlanmamış

oOP avantajları ile birleştiğinde:

  • Uzayabilirlik
  • Daha kolay görselleştirme
  • Dize işleme ve veri yapıları gibi kritik olmayan görevler için daha iyi kütüphane desteği
8
Michael K

Tarayıcıların ilk turu için ilk kod satırları yazıldığında, C # ve Java yoktu. Ruby de yoktu. Python bulunmamış olabilir, ama bu noktada hala küçük bir homebrew projesiydi.

Temel olarak, gerçekten başka herhangi bir seçenek werent C++ dışında bir kişinin hızlı ve birçok farklı platformda çalışacak bir tarayıcı oluşturmasına izin verecek.

Peki neden C++ ile yazıldılar? Çünkü yazılabilecek tek dil buydu.

4
GrandmasterB

Çünkü diğer dillerde yazılmış tarayıcılara (ör. HotJava, açıkça Java ile yazılmış) hiçbir zaman önemli ölçüde piyasa kabulü/penetrasyonu sağlanamamıştır.

HotJava'nın şu anki yinelemesi (veya en son - bir süredir güncellenmedi) hakkında bir şey söyleyemem, ancak denediğimde, pazar penetrasyonu eksikliği göründü (en azından benim için) son derece kolay - çirkin, yavaş ve birkaç web sayfasıyla uyumsuzdu. Nihayetinde, hiç kaydırılmayan bir önermeye dayanıyor gibi görünüyordu: web, esas olarak Java applet'lerden oluşacak ve HTML, hangi uygulamaların nerede görüntüleneceğini söyleyen bir sarıcıdan biraz daha fazla olacaktır.

Bir kısmı da muhtemelen tarihi: büyük web tarayıcılarının çoğu uzun zamandır var. İlk yazıldıkları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 gelmişken, o zamanlar birçok kişi unutulmaya başlamıştır.

Görüntülenen dilin "tutumu" nun da bir etkisi olduğunu düşünüyorum: C++ (ondan önceki C gibi) her zaman pratikliği ve pragmatizmi vurguladı. Bu temel tutum aynı zamanda pragmatik olan programcıları çekme eğilimindedir. Diğer birçok dil, zarafet gibi şeylere çok daha fazla önem verir ve böylece aynı şekilde düşünen programcıları çeker. Sorun "LISP etkisi" olarak adlandırdığım şeydir. Belirtiler şunları içerir:

  1. En önemsiz şeylerin zarif uygulaması çoğ üzerinde sonsuz argümanlar.
  2. Özelliklerin dondurulması ve gönderilebilecek bir şeyin bitirilememesi (kusurlarla bile)
  3. Taviz verememe. Benimle aynı fikirde olmayan herkes sadece yanlış değil, aynı zamanda aptal ya da kötü olmalıdır.

Dahası var, ama genel fikri anlıyorsunuz (ve evet, bir dereceye kadar abartıyorum - ama sadece bir dereceye kadar). Evet, aldığınız kodlardan bazıları şaşırtıcı derecede güzel olacak - ancak şansın altı ay geç olması ve çoğunlukla sistemdeki (olması gereken) diğer tüm kodlarla uyumsuz olması ve bunu aldığınız zaman Oldukça adil bir şans, onu kullanamayacağınız başka bir şey yeterince değişti.

Kuşkusuz gayet iyi çalışan diller de vardır, ancak (doğru veya yanlış), hiç kimsenin tarayıcı yazmamış olması için pazar payına sahip değildir (veya önemli zamanda, sahip olamamıştır). Tam bir tarayıcının boyutu ve karmaşıklığı göz önüne alındığında, çok sayıda insan ve bir tane geliştirmek biraz zaman alır. Bu tür bir yatırımla, birçok insan geliştirme araçları gibi şeyler hakkında nispeten muhafazakar hale gelir.

4
Jerry Coffin

Yük kült programlama. "C++ hızlı" algısı hala var (kötü düşünülmüş kötü nesne modeli gibi kötü düşünülmüş dil seviyesi özelliklerine rağmen) ve insanlar tarayıcılarının hızlı olmasını istiyorlar, bu yüzden C++ 'da yazıyorlar .

Aklı başında bir dünyada, ağa dönük yazılım yazan insanlar, sadece C'nin tüm güvenlik sorunlarıyla eyerlenmiş bir dili kullanma düşüncesinde dehşete düşecek ve aslında bunu yapmak bir suç ihmali eylemi olacaktı. (Son 15 yılda çeşitli tarayıcılara karşı kaç tane arabellek taşması istismarının bulunduğuna bakın! Bu kodlayıcılardan kaç milyon dolar hasar sorumlu?)

Hızlı ikili dosyalar oluşturabilen başka derlenmiş diller de vardır. Sorun şu ki, C ailesi ile aynı maruziyete sahip değiller ve hepimiz bunun için acı çekmeliyiz.

Eğlenceli gerçek: Morris Worm 1988'de İnternet'e çarptığında, C'de işletim sistemleri ve ağa dönük yazılım yazmayla ilgili sorunları kesin olarak gösteriyor (bu güne kadar hala çözülmedi, çünkü bunlar dilde doğal kusurlar oldukları için) ,) Apple dünyanın şimdiye kadar gördüğü en gelişmiş işletim sistemini, birkaç yıldır Pascal'da yazılmış olarak yayınlamıştı.

3
Mason Wheeler

Sistem düzeyi API'lara erişim

Tüm tarayıcılar bir noktada işletim sistemi ile arayüz kurmalıdır ve büyük işletim sistemlerinin çoğunda iyi kurulmuş C ve C++ API'leri ve kütüphaneleri vardır. Bu API'lerle çalışmak, sarmalayıcılar yerine C veya C++ ile çalışmak genellikle daha kolaydır.

2
TMN

Eski uyumluluk - eski kodu alamaz

C++ 'ın diğer dillere karşı üstünlüğü yoktur. Haskell gibi bir dilde sıfırdan daha iyi bir tarayıcı yazabilirsiniz; bu önemli bir proje, bazı performans özelliklerini garanti altına almaları gerektiğinde kendi JVM'lerini bile uygulayabilir. Facebook'un kendi PHP derleyici/optimize edici) yazdığı gibi.

Standart olmayan biçimlendirmeyi bozan bir tarayıcı işe yaramaz. Eski uyumluluk o kadar kritik ve karmaşık ki bir yeniden yazma sadece bir seçenek değil. Savaşta test edilmiş güvenlik vb. İçin çok fazla para ve zaman yatırılıyor, sadece bu yatırımı atamazsınız. Yine, Facebook'un PHP'de nasıl yazıldığı hala gibi.

0
Dustin Getz

Kontrol ve Taşınabilirlik

hız argümanlarının çoğu her iki yöne de gidebilir, ancak bir şeyin nasıl yapıldığı üzerinde kesin kontrole ihtiyaç duyduğunuz herhangi bir şeyde, üst düzey dillerin çoğu geçit töreninizde yağmur yağacaktır. Bunun istisnaları vardır, ancak çoğu tarayıcı gibi bir şeyde sayılabilecek çapraz platform değildir.

0
Bill