# Yazılım yaması
Yama, bilgisayar programlarında oluşan bir hatayı ya da programın içeriğindeki hatalı bir fonksiyonu düzelten bir programcıktır. Genelde bilgisayarlardaki en büyük güvenlik sorunlarından olan yazılım açıklarına müdahale amacıyla kullanılır.
Yazılımlarda var olan açıkları kullanan kötü niyetli kişiler, bilgisayarlarda istedikleri kodları çalıştırabilirler. Çalıştırılan bu kodlar sayesinde bilgisayarda kapılar açıp kişisel bilgiler öğrenilebilir, donanımlarda hata oluşturup bilgisayarın yapısı bozulabilir. Verilerin içerikleri de değiştirilebilir.
Yazılım firmaları, açıkları kötü niyetli insanlardan önce bulup, bunu gidermek için yama (patch) yayınlamaya çalışırlar. Her programda açık vardır ve olmaya devam edecektir. Önemli olan, açıkların üreticiler tarafından kısa sürede tespit edilmesi ve bunları giderici programların yani yamaların hızlı bir şekilde yayınlanmasıdır. Bunu da açık kaynak kodlu yazılımlar çok hızlı bir şekilde yapmaktadır.
Programların yamalarının takip edilip ve yüklenmesi önemlidir. Programlardaki “update” veya “live update” kısımlarını aktif halde tutulmalıdır.


## Türler.
### İkili yamalar.
Özel yazılım yamaları genellikle kaynak kodu yerine yürütülebilir dosya olarak dağıtılır. Bu dosyalar yürütüldüğünde, yama kodunun diskteki hedef program(lar)a kurulumunu yöneten bir programı belleğe yükler.
Diğer yazılımlar için yamalar genellikle yama kodunu içeren veri dosyaları olarak dağıtılır. Bunlar, kurulumu gerçekleştiren bir yama yardımcı programı tarafından okunur. Bu yardımcı program, hedef programın yürütülebilir dosyasını (programın makine dilini) genellikle yeni yama kodunu temsil eden baytlarla baytlarının üzerine yazarak değiştirir. Yeni kod, eski kodun kapladığı alana (bayt sayısı) sığarsa, doğrudan eski kodun üzerine yazılarak yerine yerleştirilebilir. Buna satır içi yama denir. Yeni kod eski koddan daha büyükse, yama yardımcı programı yeni kodu içeren yükleme kaydını(kayıtlarını) yama uygulanan hedef programın nesne dosyasına ekler. Yama uygulanan program çalıştırıldığında, yürütme yeni koda yönlendirilir ve dal talimatları (atlamalar veya çağrılar) yeni kodun gerekli olduğu eski koddaki yerin üzerine yamalanır. Örneğin Radio Shack TRS-80 gibi eski 8 bitlik mikro bilgisayarlarda, işletim sistemi bir metin dosyasından yama verilerini kabul eden ve düzeltmeleri hedef programın yürütülebilir ikili dosyasına(dosyalarına) uygulayan bir PATCH/CMD yardımcı programı içerir.
Yama kodunun çalışma zamanında yürütülebilmesi için bellekte yeri(leri) olması gerekir. Satır içi yamalar zor değildir, ancak ek bellek alanına ihtiyaç duyulduğunda programcı doğaçlama yapmalıdır. Doğal olarak, yama programcısı yama uygulanacak kodu ilk oluşturan kişiyse, bu daha kolaydır. Bilgili programcılar, son yinelemelerini üretirken kullanılmadan bırakılan, daha sonraki genişlemeler için bellek ayırarak bu ihtiyaç için önceden plan yaparlar. Orijinal uygulamayla ilgisi olmayan ve daha sonra değişiklikleri dahil etmeye çalışan diğer programcılar, ihtiyaç duyulan ek baytlar için yer bulmalı veya açmalıdır. Bunun için en şanslı olası durum, yama uygulanacak rutinin ayrı bir modül olmasıdır. Bu durumda yama programcısının yalnızca diğer sistem bileşenlerine modül tarafından işgal edilen alanı işaret eden işaretçileri veya uzunluk göstergelerini ayarlaması gerekir; daha sonra bu bellek alanını genişletilmiş yama koduyla doldurmakta özgürdür. Yama uygulanacak rutin ayrı bir bellek modülü olarak mevcut değilse, programcı genişletilmiş yama kodu için yeterli yer açmak amacıyla rutini küçültmenin yollarını bulmalıdır. Tipik taktikler arasında, daha verimli talimat dizileri bularak (veya daha verimli algoritmalarla yeniden tasarlayarak) kodu kısaltmak, mesaj dizilerini ve diğer veri alanlarını sıkıştırmak, program işlevlerini toplu depolamaya aktarmak (disk katmanları gibi) veya yamayla birlikte yüklenecek değişikliklerden daha az önemli olduğu düşünülen program özelliklerini kaldırmaktır.
Küçük bellek içi makine kodu yamaları, CP/M'nin DDT veya MS-DOS'un DEBUG hata ayıklayıcıları gibi sistem hata ayıklama yardımcı programıyla elle girilebilir. Yorumlanmış BASIC'te çalışan programcılar, bir sistem servis rutininin veya yorumlayıcının kendisinin işlevselliğini değiştirmek için genellikle POKE komutunu kullanırdı.


### Kaynak kodu yamaları.
Yamalar ayrıca kaynak kodu değişiklikleri biçiminde de dolaşabilir. Bu durumda, yamalar genellikle iki kaynak kodu dosyası arasındaki metinsel farklılıklardan oluşur ve bunlara "diffs" denir. Bu tür yamalar genellikle açık kaynaklı yazılım projelerinden çıkar. Bu durumlarda, geliştiriciler kullanıcıların yeni veya değiştirilmiş dosyaları kendilerinin derlemesini bekler.


### Büyük yamalar.
"Yama" kelimesi küçük bir düzeltme çağrışımı taşıdığından, büyük düzeltmeler farklı bir adlandırma kullanabilir. Hacimli yamalar veya bir programı önemli ölçüde değiştiren yamalar "servis paketleri" veya "yazılım güncellemeleri" olarak dolaşabilir. Microsoft Windows NT ve halefleri (Windows 2000, Windows XP, Windows Vista ve Windows 7 dahil) "servis paketi" terminolojisini kullanır. Tarihsel olarak, IBM bu güncellemelere atıfta bulunmak için "FixPaks" ve "Düzeltici Hizmet Disketi" terimlerini kullanmıştır.