CPython'un içi: bayt kodu, bellek ve yorumlayıcı
Python kodunun bayt koduna nasıl dönüştüğünü, nesnelerin bellekte nasıl tutulduğunu ve yorumlayıcının nasıl çalıştığını kendi deneylerinle görürsün.
Seviye 501 · 17 ders · 21 pratik lab
Dersler
Derleme hattı
- Sözcük birimleri ve soyut sözdizimi ağacı
- ast ile kod incelemek ve dönüştürmek
- Bayt kodu: dis ile okumak
- Kod nesneleri ve .pyc dosyaları
- Kısa görev: ast ile kendi denetim kuralını yaz
Çalışma zamanı
- Değerlendirme döngüsü ve çerçeveler
- Referans sayımı ve çöp toplayıcı
- Nesnelerin bellekteki düzeni
- Küçük tamsayılar ve dizgi interning
- GIL ve serbest iş parçacıklı derleme
- Kısa görev: döngüsel referans sızıntısını bul
Yorumlayıcıyı genişletmek
- İçe aktarma kancaları
- Denetim kancaları: sys.addaudithook
- Python'u kum havuzuna almanın sınırları
- CPython'u kaynaktan derlemek ve hata ayıklamak
- Kısa görev: şüpheli çağrıları kaydeden denetim kancası
Bitirme
- Bitirme görevi: .pyc dosyalarını inceleyen analiz aracı
Pratik lablar
- Kaynak dosyadaki fonksiyonları ast ile saymak: Bir kaynak dosyayı ast ile ayrıştırıp fonksiyon ve sınıf adlarını satır numaralarıyla listeleyen aracı yaz.
- Değişebilir varsayılan için lint kuralı: Varsayılan değeri liste, sözlük ya da küme olan parametreleri ast ile bulan kuralı yaz; iç içe fonksiyonlar ve lambda testlerini geç.
- NodeTransformer ile eski çağrıları dönüştürmek: Kod tabanındaki kullanımdan kalkmış fonksiyon çağrılarını argüman sırası değişen yenisine çeviren dönüştürücüyü yaz ve çıktının derlenip aynı sonucu verdiğini göster.
- İki döngünün bayt kodunu karşılaştırmak: Aynı işi yapan iki fonksiyonun dis çıktısından komut sayılarını çıkar ve hangi işlemin fazladan yapıldığını raporlayan betiği yaz.
- Kod nesnesinden sabitleri ve adları çıkarmak: Derlenmiş bir fonksiyonun iç içe kod nesnelerini gezerek dizgi sabitlerini ve küresel adları toplayan özyinelemeli aracı yaz.
- pyc başlığını doğrulayıp içeriğini listelemek: Bir .pyc dosyasının sihirli sayısını, bayraklarını ve kaynak zaman damgasını çözüp sürüm uyuşmazlığını bildiren, kodu çalıştırmadan içe aktarılan modülleri listeleyen aracı tamamla.
- Başvuru sayısının değişimini gözlemek: Bir nesnenin başvuru sayısının atama, kaba ekleme ve silme adımlarında nasıl değiştiğini ölçen ve beklenen değerlerle karşılaştıran testleri tamamla.
- Önbellekteki sızıntıyı zayıf başvuruyla gidermek: Nesneleri sonsuza dek canlı tutan kayıt defterini WeakValueDictionary'ye çevir ve nesnelerin toplandığını gc ile doğrula.
- Başvuru döngüsü sızıntısını avlamak: Uzun süre çalışan işte biriken nesneleri gc.get_referrers ile izleyip döngüyü kuran geri çağrıyı bul, döngüyü kır ve belleğin sabit kaldığını ölç.
- is ile == karışıklığını düzeltmek: Küçük sayılarda çalışıp büyüklerde bozulan kimlik karşılaştırmasını değer karşılaştırmasına çevir ve nedenini gösteren testi yaz.
- Çağrı zincirini çerçevelerden okumak: sys._getframe ile çağıran fonksiyonların adını ve satırını toplayan hafif izleyiciyi yaz; çerçeve başvurularını bırakıp sızıntı oluşturma.
- GIL etkisini ölçüp doğru aracı seçmek: CPU ağırlıklı ve G/Ç ağırlıklı iki işi iş parçacığı ve süreçlerle ölç; iş parçacığıyla yavaşlayan işi süreç havuzuna taşı ve hızlanmayı raporla.
- Dosya açılışlarını denetim kancasıyla kaydetmek: sys.addaudithook ile open olaylarını yakalayıp yolu ve kipi kaydeden kancayı yaz ve kendi kayıt dosyasında döngüye girmediğini göster.
- İçe aktarma kancasıyla modül kısıtlamak: Bir meta yol bulucusu yazarak yasaklı listedeki modüllerin içe aktarılmasını anlaşılır bir hatayla durdur ve kancanın kaldırılabildiğini test et.
- Kısıtlı eval tabanlı kum havuzunu emekliye ayırmak: Yerleşikleri silerek güvenli sandığı varsayılan formül değerlendiricisinin neden yetersiz kaldığını testlerle belgeleyip ast tabanlı izin listeli bir yorumlayıcıyla değiştir.
- Paylaşılan değişmez nesneleri gözlemlemek: Küçük tam sayıların, kısa metinlerin ve çalışma anında üretilen metinlerin aynı nesne olup olmadığını id ile ölçen bir rapor fonksiyonu yaz ve sonuçları açıkla.
- sys.intern ile bellek kazancını ölçmek: Aynı etiketlerin yüz binlerce kez yinelendiği kayıt yüklemesinde metinleri sys.intern ile paylaştır, bellek farkını ölç ve karşılaştırmaların eşitlikle doğru kaldığını testle göster.
- Çalışan fonksiyonun adını çerçeveden okumak: sys._getframe ile bulunduğu fonksiyonun adını ve satır numarasını döndüren yardımcıyı yaz ve kayıt iletilerinde kullan.
- sys.settrace ile küçük bir kapsam ölçer: sys.settrace kullanarak bir fonksiyon çalışırken yürütülen satır numaralarını topla ve hiç çalışmayan satırları raporla; izleme bitince eski iz fonksiyonu geri yüklensin.
- İş parçacıklarının hesap işini hızlandırmadığını ölçmek: Aynı hesap işini bir ve dört iş parçacığıyla çalıştırıp sürelerini ölç ve sonucu bir tabloya yaz.
- Geçiş aralığının etkisini gözlemlemek: sys.setswitchinterval değerini değiştirerek hesap yapan bir iş parçacığının yanında çalışan kısa işlerin yanıt süresini ölç ve değeri eski haline getir.
Kurs hakkında
Python kodunun bayt koduna nasıl dönüştüğünü, nesnelerin bellekte nasıl tutulduğunu ve yorumlayıcının nasıl çalıştığını kendi deneylerinle görürsün.
Ne öğreneceksin
- Derleme hattı
- Çalışma zamanı
- Yorumlayıcıyı genişletmek
- Bitirme
Ön koşullar
Aynı yolun 401 düzeyine kadar olan konularında deneyimli olmalısın.
Lab ortamı
Dersler, tarayıcında açılan sana özel bir Kali Linux terminalinde geçer. Kurulum gerekmez; lab her derste temiz başlar.
Sık sorulan sorular
- Bu kurs benim düzeyime uygun mu?
- Kurs 501 düzeyindedir; daha düşük düzeydeki kursların konularını bildiğin varsayılır.
- Kurulum gerekir mi?
- Hayır. Her ders tarayıcında açılan sana özel bir lab ortamında geçer.
- Dersler nasıl işleniyor?
- Her ders 8 ile 10 adımdan ve bir kısa sınavdan oluşur. İlk adımlarda yazman gereken komut gösterilir, sonraki adımlarda yardım azalır; iki denemede takılırsan çözüm açılır.
- Ücretsiz deneyebilir miyim?
- Evet. Her kursun ilk üç dersi ücretsizdir.