Ders 01 / 10
Gösterim Ailesi ve Kayıp
Bir gösterim, sistemin bilgi atan bir izdüşümüdür: beş bağlı bir bakım atölyesinin 31 olgusundan 20'sini yazan yapı gösterimi 2048 ayrı sistemi tek diyagrama düşürür ve atılan 11 alan gösterimden geri getirilemez.
İçindekiler
İşletim Sistemi Kavramları kursu on beş derste bir makinenin soyutlamalarını saydı: her soyutlamanın ödettiği adım ölçüldü ve hiçbir olumsuz sonuç saklanmadı. O ölçümlerin ortak yanı şuydu — hepsi çalıştırılabilir bir metnin çıktısıydı, doğruluğunu koşumun kendisi taşıyordu. Bir sistemi başkasına anlatmak bu değildir. Anlatmak, sistemi daha az bilgiyle göstermektir; gösterim sistemin tamamı olsaydı anlatı değil kopya olurdu.
Az bilgiyle göstermenin bir bedeli var ve bu kurs onu sayıyor. Bakım atölyesi modelinde beş bağ ve otuz bir olgu duruyor; bunların yirmisini yazan bir yapı gösterimi, aynı çizimi üreten 2047 başka sistemden ayırt edilemez hâle geliyor. Diyagram yanlış değil; eksik, ve eksikliği kendisi üzerinde görünmüyor.
Sistem Veridir, Gösterim Onun İzdüşümüdür
Kurs boyunca tek bir kurgu alan kullanılıyor: bir bakım atölyesi. İş emri açılıyor, kalemlere bölünüyor, kalemler parça istiyor, bir usta atanıyor, usta tezgâh kullanıyor, iş emri belge üretiyor. Bu alanın kendisi bir diyagram değil, veridir: bağlar, akışlar, önkoşullar, durumlar ve varlıklar birer Python yapısıdır. Gösterim, o verinin bir izdüşümüdür ve her izdüşüm bilgi atar.
Bu derste ölçülen izdüşüm en dar olanıdır: bağların yalnız kaynağını, hedefini, yönünü ve çokluğunu yazan bir yapı gösterimi.
- YD1 — Sistem beş bağdan oluşur ve her bağ yedi alan taşır. Dördü gösterime çıkar (kaynak, hedef, yön, çokluk (multiplicity)), üçü çıkmaz (yaşam, sıralı, benzersiz).
- YD2 — Çokluğu bir olan tarafta sıralılık ve benzersizlik tanımsızdır. N:1 bağın tek gizli alanı, 1:N ve N:M bağların üç gizli alanı vardır; beş bağda toplam on bir.
- YD3 — Gizli alanların hepsi ikili değer alır: yaşam bağımsız ya da bağımlı, sıralı ve benzersiz doğru ya da yanlış.
- YD4 — Sayım tam sayımdır. Gizli alanların bütün birleşimleri üretilir ve gösterimi değişmeyenler sayılır; tahmin, örneklem ya da rastgelelik yoktur.
"""M01/K06 ortak tanim (kesit): sistem VERIDIR , gosterim o verinin bir izdusumudur. Kurgu alan bir bakim atolyesi. Her bag gosterime CIKAN ve CIKMAYAN alanlar tasir.""" from itertools import product BAGLAR = [ {"ad": "b1", "kaynak": "IsEmri", "hedef": "Usta", "yon": "tek", "cokluk": "N:1", "yasam": "bagimsiz", "sirali": False, "benzersiz": True}, {"ad": "b2", "kaynak": "IsEmri", "hedef": "Kalem", "yon": "tek", "cokluk": "1:N", "yasam": "bagimli", "sirali": True, "benzersiz": False}, {"ad": "b3", "kaynak": "Kalem", "hedef": "Parca", "yon": "tek", "cokluk": "N:1", "yasam": "bagimsiz", "sirali": False, "benzersiz": True}, {"ad": "b4", "kaynak": "Usta", "hedef": "Tezgah", "yon": "cift", "cokluk": "N:M", "yasam": "bagimsiz", "sirali": False, "benzersiz": True}, {"ad": "b5", "kaynak": "IsEmri", "hedef": "Belge", "yon": "tek", "cokluk": "1:N", "yasam": "bagimli", "sirali": True, "benzersiz": True}, ] def gizli_alanlar(bag): """Cokluk 1 olan tarafta sirililik ve benzersizlik yoktur.""" alanlar = ["yasam"] if bag["cokluk"] in ("1:N", "N:M"): alanlar += ["sirali", "benzersiz"] return alanlar def yapi_gosterimi(baglar, ayrinti=0): """ayrinti 0: kaynak , hedef , yon , cokluk. 1: + yasam. 2: + sirali ve benzersiz.""" simge = [] for b in baglar: s = {"kaynak": b["kaynak"], "hedef": b["hedef"], "yon": b["yon"], "cokluk": b["cokluk"]} if ayrinti >= 1: s["yasam"] = b["yasam"] if ayrinti >= 2: for a in gizli_alanlar(b): s[a] = b[a] simge.append(s) return simge def simge_sayisi(gosterim): return sum(len(s) for s in gosterim) def ayni_gosterime_dusen(baglar, ayrinti=0): """Ayni gosterimi ureten kac ayri sistem var. Sayim tam sayimdir.""" secenek = {"yasam": ("bagimsiz", "bagimli"), "sirali": (False, True), "benzersiz": (False, True)} hedef = yapi_gosterimi(baglar, ayrinti) uzaylar = [] for b in baglar: alanlar = gizli_alanlar(b) uzaylar.append([dict(zip(alanlar, d)) for d in product(*[secenek[a] for a in alanlar])]) sayi = 0 for secim in product(*uzaylar): aday = [dict(b, **s) for b, s in zip(baglar, secim)] if yapi_gosterimi(aday, ayrinti) == hedef: sayi += 1 return sayi G = yapi_gosterimi(BAGLAR, 0) gizli = sum(len(gizli_alanlar(b)) for b in BAGLAR) print("sistem : bag", len(BAGLAR), "| gorunur alan", simge_sayisi(G), "| gizli alan", gizli, "| toplam olgu", simge_sayisi(G) + gizli) print("gosterim:", simge_sayisi(G), "simge") print("bedel :", ayni_gosterime_dusen(BAGLAR, 0), "sistem ayni gosterime dusuyor") print() print("yazilan satirlar:") for s in G: print(" ", s["kaynak"], s["yon"], s["hedef"], s["cokluk"]) print() print("b2 (IsEmri -> Kalem) icin yazilmayan alanlarin butun secenekleri:") for yasam in ("bagimsiz", "bagimli"): for sirali in (False, True): for benzersiz in (False, True): aday = [dict(b) for b in BAGLAR] aday[1].update(yasam=yasam, sirali=sirali, benzersiz=benzersiz) print(f" yasam={yasam:9s} sirali={str(sirali):5s} benzersiz={str(benzersiz):5s}" f" ayni gosterim: {yapi_gosterimi(aday, 0) == G}")
sistem : bag 5 | gorunur alan 20 | gizli alan 11 | toplam olgu 31 gosterim: 20 simge bedel : 2048 sistem ayni gosterime dusuyor yazilan satirlar: IsEmri tek Usta N:1 IsEmri tek Kalem 1:N Kalem tek Parca N:1 Usta cift Tezgah N:M IsEmri tek Belge 1:N b2 (IsEmri -> Kalem) icin yazilmayan alanlarin butun secenekleri: yasam=bagimsiz sirali=False benzersiz=False ayni gosterim: True yasam=bagimsiz sirali=False benzersiz=True ayni gosterim: True yasam=bagimsiz sirali=True benzersiz=False ayni gosterim: True yasam=bagimsiz sirali=True benzersiz=True ayni gosterim: True yasam=bagimli sirali=False benzersiz=False ayni gosterim: True yasam=bagimli sirali=False benzersiz=True ayni gosterim: True yasam=bagimli sirali=True benzersiz=False ayni gosterim: True yasam=bagimli sirali=True benzersiz=True ayni gosterim: True
Üç sayı yan yana duruyor ve bundan sonraki her derste duracak. Sistem: beş bağ, otuz bir olgu. Gösterim: yirmi simge. Bedel: aynı gösterime düşen 2048 sistem — yani yazılan diyagram, birbirinden gerçekten farklı 2048 sistemin ortak resmidir.
Yazılmayan Alan Geri Getirilemez
Çıktının son bloğu bedeli tek bir bağ üzerinde gösteriyor. b2 bağı, bir iş emrinin
kalemlerini taşıyor ve gösterimde tek satır olarak duruyor: iş emrinden kaleme tek yönlü,
çokluk 1:N. Bu satırın söylemediği üç şey var. Kalemler iş emriyle birlikte mi yaşıyor,
yoksa iş emri kapandıktan sonra da duruyor mu. Kalemlerin bir sırası var mı, yoksa küme mi.
Aynı kalem iki kez geçebilir mi.
Üç ikili soru sekiz seçenek yapıyor ve sekizinin de gösterimi birebir aynı. Diyagrama bakan biri bu üç soruyu yanıtlayamaz; sorabileceği tek yer sistemin kendisidir. Beş bağın on bir gizli alanı birlikte alındığında sayı oluyor.
Asıl nokta sayının büyüklüğü değil, yönü. İzdüşüm tek yönlüdür: sistemden gösterime giden yol tektir, gösterimden sisteme dönen yol 2048 tanedir. Diyagramı okuyan kişi bu 2048 sistemden birini seçmek zorundadır ve hangisini seçtiğini fark etmez, çünkü diyagram bir seçim yapıldığını söylemez. Kaybın en pahalı yanı budur: kaybın kendisi gösterimde görünmez.
Gösterim Ailesi: Yapı, Davranış, Veri
Bu derslerde kullanılan gösterim ailesi bir belirtimde tanımlıdır ve adı UML (Unified Modeling Language)’dir. Belirtim bir aracın değil bir gösterimin tanımıdır: hangi ögenin hangi anlamı taşıdığını sabitler. Kursun konusu belirtimin kendisi değil, izin verdiği izdüşümlerin ne kadar bilgi attığıdır.
Aile üç öbeğe ayrılır ve üçü de aynı sistemin üç ayrı izdüşümüdür. Yapı gösterimleri sistemin durağan bağlarını taşır: hangi tür neyle ilişkilidir, kaç tanedir, hangi çalışma zamanı birimindedir. Davranış gösterimleri sistemin zaman içindeki işleyişini taşır: iletiler, sıralar, durumlar, geçişler. Veri gösterimleri saklanan olguyu taşır: varlıklar, öznitelikler, ilişkiler, kısıtlar.
Aşağıdaki tablo üç öbeğin kaybını yan yana koyuyor. Yapı satırı bu derste ölçüldü; diğer iki satır ortak tanımın doğrulanmış okumalarındandır ve ilgili konularda ayrıntısıyla ölçülecektir.
| Aile | Sistemdeki olgu | Gösterimin taşıdığı | Geri getirilemeyen |
|---|---|---|---|
| Yapı | 5 bağ, 31 alan | 20 simge | 11 alan; 2048 sistem tek diyagrama düşüyor |
| Davranış | 24 iz | bir sıra gösterimi 1 iz | 23 iz; kapsam 0,0417 |
| Veri | 26 olgu (5 varlık, 12 öznitelik, 4 ilişki, 5 kısıt) | ilişkisel yapıya taşınan 3 kısıt | 2 kısıt düşüyor, 114 karar modelde yazmıyor |
Üç satırın hiçbiri diğerini kapsamıyor ve üçü birleştirildiğinde de sistem geri gelmiyor. Aile bir bütünün parçaları değil, aynı bütünün üç ayrı kaybıdır.
Yazılım Mimarlığı müfredatındaki Mimari Dokümantasyon kursu bu türleri başka bir eksende ölçtü: on sekiz soruyu dört türe eşledi, yanlış türün bıraktığı eksik bilgi ögesini ve her türün bakım maliyetini saydı. O kursun sorusu hangi türün seçileceğiydi. Bu kursun sorusu başkadır ve tür seçildikten sonra başlar: seçilen tür, kaç sistemi birbirinden ayırt edemiyor. Soru–tür eşlemesi burada yeniden kurulmaz.
Gösterim Doğrusal, Belirsizlik Üstel Büyür
Ortak tanımın çözünürlük kuralı gereği her ders sayısını ikinci bir yapılandırmayla sınar. Buradaki sınama şudur: sisteme altıncı bir bağ eklendiğinde gösterim ile belirsizlik aynı hızda mı büyüyor.
- YD5 — Eklenen bağ gösterime dört simge ekler; bu, çokluğundan bağımsızdır.
- YD6 — Eklenen bağın gizli alan sayısı çokluğuna bağlıdır: N:1 ise bir, 1:N ya da N:M ise üç.
"""Ikinci yapilandirma: bir bag eklenince gosterim ile belirsizlik ayni hizda buyumuyor. Gizli alan kurali ortak tanimdandir: cokluk 1:N ya da N:M ise yasam , sirali ve benzersiz , degilse yalniz yasam. Gorunur alanlar sabit oldugu icin ayni gosterime dusen sistem sayisi , gizli alan seceneklerinin tam sayimidir.""" from itertools import product def gizli_alanlar(cokluk): return ["yasam", "sirali", "benzersiz"] if cokluk in ("1:N", "N:M") else ["yasam"] def tam_sayim(cokluklar): uzaylar = [list(product(*[(False, True)] * len(gizli_alanlar(c)))) for c in cokluklar] return sum(1 for _ in product(*uzaylar)) TEMEL = ["N:1", "1:N", "N:1", "N:M", "1:N"] DURUM = [("bes bag (ortak tanim)", TEMEL), ("+ Usta-Belge N:1", TEMEL + ["N:1"]), ("+ Tezgah-Parca 1:N", TEMEL + ["1:N"]), ("+ Kalem-Tezgah N:M", TEMEL + ["N:M"])] print("yapilandirma bag simge gizli alan ayni gosterime dusen") for ad, c in DURUM: print(f"{ad:24s}{len(c):4d}{4 * len(c):7d}" f"{sum(len(gizli_alanlar(x)) for x in c):12d}{tam_sayim(c):22d}") print() temel = tam_sayim(TEMEL) for ad, c in DURUM[1:]: print(f"{ad:24s} simge x{4 * len(c) / 20:.2f} belirsizlik x{tam_sayim(c) // temel}")
yapilandirma bag simge gizli alan ayni gosterime dusen bes bag (ortak tanim) 5 20 11 2048 + Usta-Belge N:1 6 24 12 4096 + Tezgah-Parca 1:N 6 24 14 16384 + Kalem-Tezgah N:M 6 24 14 16384 + Usta-Belge N:1 simge x1.20 belirsizlik x2 + Tezgah-Parca 1:N simge x1.20 belirsizlik x8 + Kalem-Tezgah N:M simge x1.20 belirsizlik x8
Üç eklemenin üçü de gösterime aynı sayıda simge koyuyor: dört. Diyagram her durumda yüzde yirmi büyüyor. Belirsizlik ise ikiye, sekize ve sekize katlanıyor. Aynı çizim emeği, hangi bağın eklendiğine göre 2048’i 4096 ya da 16384 yapıyor.
Farkın kaynağı çokluk. Bir N:1 bağın karşı tarafında tek nesne durur; orada sıralılık ve benzersizlik sorulamaz, dolayısıyla saklanan tek şey yaşam alanıdır. Bir 1:N ya da N:M bağın karşı tarafında bir topluluk durur ve topluluğun sırası ile tekrar kabul edip etmediği ayrı iki olgudur. Çokluk simgesi bu yüzden diyagramın en yüklü simgesidir: kendisi bir olgu söylerken iki olgunun daha var olduğunu da haber verir ve o iki olguyu yazmaz.
Gösterim bağ başına sabit sayıda simgeyle, yani doğrusal büyür; belirsizlik gizli alan sayısının üssü kadar. Sistem büyüdükçe diyagramın anlattığı payın küçülmesi bir dikkatsizlik değil, iki büyüme hızı arasındaki farkın sonucudur.
Simge Çıkarmanın Bedeli
Aynı ölçü ters yönde de işler. Yirmi simgelik gösterim, çokluk yazmayan on beş simgelik bir gösterime indirilebilir; bağların kim kime bağlı olduğu durur, kaç tane olduğu düşer.
- YD7 — Çokluk yazılmadığında bir bağın çokluğu dört seçenekten biri olabilir: 1:1, N:1, 1:N ya da N:M. Çokluk bilinmediği için ona bağlı gizli alanların kaç tane olduğu da bilinmez.
"""Daha dar bir gosterim: cokluk simgesi hic yazilmazsa ne oluyor. Cokluk yazilmayinca hem coklugun kendisi hem de ona bagli gizli alanlar bilinmez olur ; bir bag icin gecerli sistem sayisi , dort coklugun her birinin gizli alan seceneklerinin toplamidir.""" from itertools import product COKLUKLAR = ("1:1", "N:1", "1:N", "N:M") def gizli_alanlar(cokluk): return ["yasam", "sirali", "benzersiz"] if cokluk in ("1:N", "N:M") else ["yasam"] def bag_secenegi(cokluk_yazili, cokluk): """Bir bag icin gosterimi degistirmeyen sistem sayisi , tam sayim.""" sayi = 0 for c in ([cokluk] if cokluk_yazili else list(COKLUKLAR)): for _ in product(*[(False, True)] * len(gizli_alanlar(c))): sayi += 1 return sayi TEMEL = ["N:1", "1:N", "N:1", "N:M", "1:N"] sonuc = {} for yazili, bag_simge in ((True, 4), (False, 3)): toplam = 1 for c in TEMEL: toplam *= bag_secenegi(yazili, c) sonuc[yazili] = toplam print(f"cokluk yazili {str(yazili):5s} | simge {bag_simge * len(TEMEL):3d}" f" | ayni gosterime dusen {toplam:9d}") print("5 simge cikarmanin bedeli: x", sonuc[False] / sonuc[True], sep="")
cokluk yazili True | simge 20 | ayni gosterime dusen 2048 cokluk yazili False | simge 15 | ayni gosterime dusen 3200000 5 simge cikarmanin bedeli: x1562.5
Beş simge eksiliyor, belirsizlik 1562,5 katına çıkıyor. Oran, çıkarılan simge başına ikiden fazla bit demektir; oysa gizli alanların her biri ikili olduğu için simge başına en çok bir bit beklenirdi. Fark çokluğun ikili olmamasından geliyor: dört değer alabilen bir alanın yazılmaması iki bit götürür, üstüne o alan başka alanların var olup olmadığını belirlediği için bir de yapıyı belirsizleştirir.
Bir gösterimden simge çıkarmak onu okunaklı yapabilir, ama okunaklılık ölçülmüş bir kazanç değildir; 1562,5 ise ölçülmüş bir bedeldir. İkisi aynı tabloya yazılmadıkça sadeleştirme bir iyileştirme sayılamaz.
Kursun Kuralı
Bu ders kursun ölçüsünü kuruyor: bir gösterimin sayısı taşıdığı simge değil, aynı gösterime düşen sistem sayısıdır. Kaç sistemi birbirinden ayıramadığı yazılmayan bir gösterim ölçülmemiş sayılır. Yirmi simge bir diyagramın büyüklüğüdür; 2048 onun bedelidir ve ikisi birlikte yazılmadıkça diyagram hakkında hiçbir şey söylenmiş olmaz.
Ölçünün çözünürlüğü de burada belirlenir. Sayım tamdır, örneklem değildir: 2048’in etrafında bir ölçüm bandı yoktur ve iki gösterim karşılaştırılırken bir sistemlik fark bile anlamlıdır.
Özet
- Gösterim, sistemin bilgi atan bir izdüşümüdür; sistemden gösterime giden yol tek, gösterimden sisteme dönen yol çoktur ve kaybın kendisi gösterim üzerinde görünmez.
- Bakım atölyesinin beş bağı 31 olgu taşıyor. Yirmi simgelik ayrıntısız yapı gösterimi bunun 20’sini yazıyor, 11’ini atıyor ve ayrı sistemi tek diyagrama düşürüyor.
- Tek bir bağın yazılmayan üç alanı sekiz seçenek üretiyor ve sekizinin gösterimi birebir aynı; diyagramı okuyan kişi seçim yapmak zorundadır ve seçim yaptığını fark etmez.
- Gösterim ailesinin üç öbeği aynı sistemin üç ayrı kaybıdır: yapı 11 alanı, davranış 24 izin 23’ünü, veri düzeyi 5 kısıttan 2’sini atıyor ve üçü birleştirildiğinde de sistem geri gelmiyor.
- Altıncı bir bağ eklemek gösterimi her durumda 4 simge büyütüyor, belirsizliği ise çokluğa göre 2 ya da 8 katına çıkarıyor: gösterim doğrusal, belirsizlik üstel büyür.
- Çokluk hiç yazılmazsa gösterim 20 simgeden 15’e iner ve aynı gösterime düşen sistem 2048’den 3.200.000’e çıkar: 1562,5 kat. Sadeleştirmenin kazancı ölçülmemiş, bedeli ölçülmüştür.
Sonraki Adım
Bu derste yalnız en dar izdüşüm ölçüldü ve 2048 sayısı tek başına duruyor. Diyagrama simge eklemek bu sayıyı düşürür — ama ne kadar düşürdüğü ölçülmedi. Bir simge belirsizliği yarıya mı indiriyor, daha fazlasını mı alıyor, yoksa hiç almayan simgeler de var mı.
Sonraki ders sınıf gösterimini alıp bunu simge simge sayar: yaşam döngüsü simgesi eklendiğinde 20 simge 25’e çıkarken 2048 kaça iner, sıralılık ve benzersizlik notları da yazıldığında geriye kaç sistem kalır. Aynı derste sıkı ve gevşek bileşim ayrımının hangi olguyu taşıdığı ölçülecek: bir iş emri silindiğinde kaç nesnenin gittiğini belirleyen şey, diyagramda tek bir simgedir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.