Web Browser Engineering (2021)
(browser.engineering)- Web Browser Engineering, ağ iletişiminden JavaScript’e kadar uzanan konuları ele alan ve Python’da birkaç bin satır kodla temel ama eksiksiz bir web tarayıcısını bizzat geliştirmenizi sağlayan bir kitap
- Öğrenme akışı, sayfa yüklemeden belge görüntülemeye, uygulama çalıştırmaya ve modern tarayıcı özelliklerine uzanır; HTTP, HTML, CSS, DOM, güvenlik, rendering pipeline konularını sırayla birbirine bağlar
- İlk bölümler URL ve HTTP isteği, pencere oluşturma ve canvas çizimi, metin satır kırma ve satır aralığı gibi tarayıcı temellerinin uygulanmasına odaklanır
- Orta ve ilerleyen bölümler HTML ağacı oluşturma, layout, stil uygulama, form gönderimi, olaylara tepki verme, çerezler ve oturum açma ile XSS ve CSRF konularını da kapsar
- Son bölümler compositing, event loop, GPU animasyonları, erişilebilirlik ağacı, iframe, invalidation ve düzenleme doğruluğuna uzanarak modern tarayıcı uygulama bileşenlerini geniş kapsamda inceleme olanağı sunar
Uygulayarak öğrenilen tarayıcı mimarisi
- Web Browser Engineering, web tarayıcılarının nasıl çalıştığını anlamak için temel ama eksiksiz bir tarayıcıyı bizzat geliştirme yaklaşımıyla hazırlanmıştır
- Uygulama dili Python’dır ve toplam uygulama boyutu birkaç bin satır düzeyindedir
- Kapsam, ağ iletişiminden JavaScript’e kadar uzanır
- Basılı kitap Bookshop, B&N, Amazon üzerinden satın alınabilir
- Çeviri baskıları Korece sürüm olarak Hanbit, Japonca sürüm olarak O’Reilly tarafından yayımlanmıştır
- Güncellemeler blog, Mastodon, Twitter üzerinden takip edilebilir; ayrıca GitHub’da bir discussion forum da vardır
İçindekiler akışı
-
Giriş
-
Part 1: Loading Pages
- Downloading Web Pages: URL ve HTTP isteği
- Drawing to the Screen: pencere oluşturma ve canvas çizimi
- Formatting Text: sözcük satır kırma ve satır aralığı
-
Part 2: Viewing Documents
- Constructing an HTML Tree: HTML parsing ve düzeltme
- Laying Out Pages: inline ve block layout
- Applying Author Styles: CSS parsing ve uygulama
- Handling Buttons and Links: hyperlink’ler ve tarayıcı chrome’u
-
Part 3: Running Applications
- Sending Information to Servers: form gönderimi ve web sunucusu
- Running Interactive Scripts: DOM değişiklikleri ve olaylara tepki
- Keeping Data Private: çerezler, oturum açma, XSS, CSRF
-
Part 4: Modern Browsers
- Adding Visual Effects: blending, clipping, compositing
- Scheduling Tasks and Threads: event loop ve rendering pipeline
- Animating and Compositing: GPU kullanarak akıcı animasyonlar
- Making Content Accessible: klavye girişi, yakınlaştırma/uzaklaştırma, erişilebilirlik ağacı
- Supporting Embedded Content: görseller, iframe, scripting
- Reusing Previous Computation: invalidation, düzenleme, doğruluk
-
Kapanış ve ekler
1 yorum
Hacker News yorumları
Bu kitapta iyi olan noktalardan biri, “yapılmayan şeyleri” ayrıca ele alması.
Yerleşim gerçekten zor; CSS olmadan yalnızca tabloları ele almak bile zor. CSS de işin içine girince yerleşim neredeyse imkânsız derecede karmaşıklaşıyor.
CSS spesifikasyonunun tamamını ve ilgili davranışları kafasında tutabilen biri var mı, merak ediyorum. Günümüzün CSS+HTML+JavaScript’i dinamik sayfa teknolojisi diline (PDL) yakınlaştı ve bugün en karmaşık yazılımlardan biri olması muhtemel.
Ek olarak, video çözme donanıma aktarıldığı için eskisi kadar pil tüketmiyor.
Örneğin bu dosya yalnızca blok/inline bağlamını uyguluyor; biraz Rust boilerplate’i var ama büyük kısmı spesifikasyonun çeşitli bölümlerini ele alan gerçek mantık. Böyle dosyalarla dolu bir klasör var: https://github.com/servo/servo/blob/main/components/layout/f...
Yine de bir yerleşim motoru uygulamak mümkün. CSS sihir değil; titizlikle koda aktarılabilecek bir spesifikasyonu var. CSS’in keyfî göründüğünden yakınan insanlara böyle kodları göstermek, çalışma ortamının da bir mantığı olduğunu anlamalarına yardımcı oluyor.
Elbette bir kütüphane implementasyonuna bakar gibi sık sık tıklayıp inceleyeceğimiz bir şey değil; ama bu açıdan React gibi şeylerden de pek farklı olmadığını düşünüyorum.
Birincisi, CSS 2 gibi yerleşimin en temel kısımları oldukça dağınık tasarlanmış ve tuhaf özellikler birbirleriyle tuhaf biçimde etkileşiyor. float ve clearance, margin collapse gibi şeyler. Bu çekirdek parçaların bir kısmı tüm yerleşim modlarında genel olarak kullanılmak üzere tasarlanmıştı, ama diğer modlara pek uymuyor. Örneğin margin ve padding, grid öğelerinde amaç açısından net değil.
İkincisi, JavaScript API’leri gibi iyi modülerleştirilmiş değil. JavaScript API’leri çoğu zaman bağımsız uygulanır; yerleşim modülleri ise çeşitli şekillerde iç içe geçebildiği için hepsi birbirini etkiliyor. grid gibi daha yeni spesifikasyonlar daha sıkı olmaya çalışıyor, fakat gerçek 2D ekran denen ortak kaynağı birden fazla yerleşim modunun paylaşmak zorunda olması gibi temel bir güçlük var.
CSS’ten daha basit, ama son 20 yılın derslerini yansıtıp basitlik ile ifade gücünün çarpımını en üst düzeye çıkaran bir yerleşim dili isteyen tek kişi ben olamam. Böyle bir şeyi ciddi şekilde tasarlayan bir proje var mı, yoksa herkes CSS3’ü kabullenip LLVM backend’ini mi bekliyor ya da sadece düz metne mi dönüyor, merak ediyorum.
https://github.com/facebook/yoga
Yerleşimin bu kadar karmaşık olması gerekmiyor. Daha basit yerleşim sistemlerine sahip onlarca GUI framework’ü var ve insanların kullandığı uygulamalar için bunlar yeterli.
Harika görünüyor. Yaklaşık 15 yıl önce bir headless browser yapmaya başlamış ve birkaç yıl boyunca sürdürmüştüm.
JavaScript yorumlayıcısı olarak SpiderMonkey kullanıp DOM’u kendim uygulamıştım. O dönemin en yeni JavaScript’ini, AJAX’i vb. çalıştırıyordu; daha sonra özel bir Flash runtime da ekledim. Ekrana çizme kısmı hariç neredeyse her şeyi yapan bir projeydi, bu yüzden gerçekten eğlenceliydi.
Bu kitabı mutlaka okumak istiyorum.
Tarayıcı mühendisliğinin artık bir trend hâline gelmesi sevindirici
Ekosistem fiilen yalnızca Google, Apple ve Mozilla tarafından tanımlanan oldukça zayıf bir durumda. Gelecekte daha fazla bağımsız tarayıcı motorunun olduğu bir gelecek görmek isterim
İlginç alan HTML-sonrası UI/belge teknolojileri. Diğer başlıktaki Typst, daha iyi bir LaTeX gibi; Markdown da büyük etki yarattı. “HTML ama daha iyisi”ni yapmak için çok alan var. Mutlaka bir işaretleme formatı olması da gerekmiyor. Typst ve React HTML, kod ile veri arasındaki sınırı bulanıklaştırıyor; Jetpack Compose ise Kotlin’in DSL özellikleriyle UI açıklaması gibi görünen ama aslında kod olan şeyler üretmenin yolunu gösteriyor
Elbette bunun için o formata yönelik bir ‘tarayıcı’ dağıtmanız ya da mevcut tarayıcılarda göstermenin bir yolunu bulmanız gerekir. Yine de JavaScript/HTML/WASM’e derlemek mümkün. JavaFX gibi taşınabilir bir GUI araç takımı da kullanabilirsiniz ve erişilebilirlik de elde edebilirsiniz. İkisi birden de yapılabilir
Kendi UI dilinizi tanımlarsanız HTML’in iyi yapamadığı pek çok şeyi deneyebilirsiniz. Bunun en tipik örneği içerik ile stilin ayrılmasıdır. HTML bunu denedi ama hiçbir zaman düzgün başaramadı; XSL:T daha da ciddi denedi ama XML söz dizimi kullanan garip, saf fonksiyonel bir dildi. React, JSON’ı kutulara dönüştürmekte oldukça iyi, fakat alttaki protokol hep sonradan eklenmiş geçici çözümlerden oluştuğu için onun üzerinde faydalı araçlar geliştirmek zor
Bir başka fikir olarak, temelden XSS’e bağışık bir format da mümkün
Yine de HTML’e bir alternatif istiyorum. Ben bir tarayıcı yapsaydım, HTML’e katlanamadığım için onu değiştirmeye odaklanırdım; JavaScript’i de çalışma zamanı ağır olduğu için değiştirmek isterdim
Örneğin neredeyse hiç JavaScript runtime’ı olmayan ve yalnızca WASM çalıştıran bir tarayıcı epey komik olurdu
Bu kitabın yazarlarından biriyim. Güzel sözler için teşekkürler; sorularınız varsa yanıtlayabilirim
Tarayıcı uygulama dili olarak Python seçmenizin sürecini merak ediyorum. Node üzerinden JavaScript’in daha ilgili bir programlama deneyimi sağlayabileceği de düşünülebilir
Yazarın neden Python’u seçtiğini anlattığı yazı: https://browserbook.substack.com/p/why-python
Görünüşe göre bunun bir kısmı Python’u JavaScript’e derliyor ve artık tarayıcının içinde, yani “kitabın kendi içinde” de çalışıyor
https://browserbook.substack.com/p/compiling-python-to-js
Okuduktan sonra geri gelip daha anlamlı şeyler konuşabilmeyi umuyorum
Böyle kaynakların üretildiğini görmek gerçekten heyecan verici
Tarayıcılar gizemli ve çözülemez kara kutular gibi görünüyor; muhtemelen Google da böyle algılanmalarını istiyor olabilir. Ama Ladybird gibi projelerin çabalarına ve sonuçlarına bakınca o duvarın çatladığını görüyorsunuz
Bir gün bizzat işe koyulup o hendeği yıkmaya katkıda bulunmak istiyorum; bu kitap da harika bir başlangıç noktası gibi görünüyor
Firefox zaten var. Sadece neredeyse kimse kullanmıyor ve kullanıcılar Firefox’ta çalışmayan bir web sitesiyle karşılaşınca Chrome’u açmayı öğrenmiş durumda
Hendeğin yıkılmasını umarak Ladybird gibi tarayıcı motorlarına katkıda bulunmak eğlenceli olabilir, ama bunun tek başına hendeği yıkmaya katkı sağladığını söylemek zor. Gerçekte neyin yardımcı olacağını bilmek isterdim
Aksine Chrome, Firefox, Safari ve Ladybird üzerinde çalışan herkes, tarayıcıları ve nasıl çalıştıklarını konuşmaktan çok heyecan duyuyor gibi. Tarayıcı geliştirme dünyası sanıldığından küçük ve mühendisler de şirketler arasında sıkça geçiş yapıyor; bu yüzden herhangi bir “komployu” sürdürmek zor olurdu
Yine de eğitim materyallerinin gerçekten eksik olduğu doğru. Bu kitabı bu yüzden yazdık; özellikle layout ve rasterization gibi temel aşamalarda tarayıcı iç yapılarını tartışmak için ortak bir söz dağarcığı da eksik. Chris ve ben bu kitapla böyle bir temel oluşturmak istedik
Başlayacak eğlenceli bir proje arıyordum; bu kitabı şimdiden gerçekten keyifle okuyorum. Yazımının özellikle ilgi çekici olması hoşuma gitti
Chrome’un nasıl çalıştığını anlatan şu çizgi kitap da başlamak için iyi bir kaynak: https://www.google.com/googlebooks/chrome/med_00.html
Tarayıcı iç yapısını öğreniyorum ve bu kitap harika
Milyonlarca satırlık Chrome koduna dalmak zorunda kalmadan, tarayıcının nasıl çalıştığına dair sezgi geliştirmeye yardımcı oluyor
HN için promosyon kodu olup olmadığını merak ediyorum
Eskiden Jython [2] ile birlikte HTMLUnit'i [1] memnuniyetle kullanmıştım; ileride kod üretimi ve doğrulama teknikleriyle tarayıcı kodunun bazı bölümlerinin otomatik üretilebildiği bir gelecek ilgimi çok çekiyor. Playwright/Cypress/Selenium gibi araçlara saygım var ama hiçbiri bana HTMLUnit kadar rahat gelmemişti
[1] https://htmlunit.sourceforge.io/
[2] https://www.jython.org/
İyi bir kitap. 9. bölümü iki bölüme ayırmayı öneririm
JavaScript'i Duktape ile çalıştırma kısmı bir bölüm olarak kalırsa, DOM ve olaylarla etkileşim kısmı daha sonra ayrı bir bölüm olsa iyi olur
İlerledikçe bölümler uzuyor ve daha ileri düzey konular ele alınıyor; kitabı okurken kodu da birlikte takip etmenizi öneririm