YAML

**YAML** (Telafuz: ); insan tarafından okunabilir Programlama dilidir. Genellikle konfigürasyon dosyaları için ve verilerin saklandığı veya iletildiği uygulamalarda kullanılır. YAML, Genişletilebilir İşaretleme Dili (XML) gibi birçok iletişim uygulamasını hedefler ancak Standart Genelleştirilmiş İşaretleme Dili (SGML) ile bilinçli olarak farklı bir minimal sözdizimi kullanır. Yerleşim belirlemek için Python tarzı girinti kullanır ve çoğu dize değeri etrafında alıntı işareti gerektirmez ve aynı dosyada JSON tarzı  ve `}` de desteklemektedir.

Özel veri türlerine de izin verilir, ancak YAML yerleşik olarak skalarları; (örneğin dizeler, tam sayılar, kayan nokta sayıları), listeleri ve ilişkisel dizileri gibi (aynı zamanda haritalar, sözlükler veya hash'ler olarak da bilinir) kodlar. Bu veri türleri Perl programlama diline dayanmaktadır, ancak tüm yaygın kullanılan yüksek seviyeli programlama dilleri çok benzer kavramlara sahiptir. İki nokta üst üste kullanılan sözdizimi, anahtar-değer çiftleri ifadesi için, 'de tanımlanan elektronik posta başlıklarından esinlenmiştir ve belge ayırıcı kodu ()MIME'dan () ödünç alınmıştır. Kaçış dizeleri de C'den alınmıştır ve çok satırlı dizeler için boşlukla sarma HTML'den esinlenilmiştir. Listeler ve hash'ler, iç içe geçmiş listeler ve hash'ler içerebilir. grafikler YAML takma adları kullanılarak temsil edilebilemektedir. Bu da XML'de SOAP'a benzerdir. YAML, SAX'tan esinlenmiş bir özellik olarak akışlarda okunup yazılmak üzere tasarlanmıştır.

YAML okuma ve yazma desteği birçok programlama dilinde mevcuttur. Vim, Emacs, ve çeşitli entegre geliştirme ortamları bulunmaktadır. YAML, Ayrıca düzenlemeyi kolaylaştıran bazı özellikler sunmaktadır. Örneğin; iç içe geçmiş yapıların katlanması veya sözdizimi hatalarının otomatik olarak vurgulanması gibi özellikleri mevcuttur.

YAML dosyaları için resmi olarak önerilen dosya adı uzantısı  ve , 2006'dan beri geçerlidir. 2024'te MIME türü  olarak kesinleşmiştir.

## Tarih ve isim
YAML (,) ilk olarak 2001 yılında Clark Evans tarafından önerilmiştir ve Ingy döt Net ve Oren Ben-Kiki tarafından tasarlanmıştır. Başlangıçta YAML'nın *Yet Another Markup Language* (Yine Bir İşaretleme Dili) anlamına geldiği söyleniyordu, çünkü bu dönem, sunum ve bağlantı için işaretleme dillerinin patladığı bir dönemdi (HTML, XML, SGML, vs.) İlk ismi, dil incelemesi olarak işaretleme dili olduğunu ifade eden (*yet another*) ifadesiyle bir teknoloji manzarasına gönderme yapmayı amaçlıyordu, ancak daha sonra *YAML Ain't Markup Language* (YAML İşaretleme Dili Değildir) olarak yeniden adlandırıldı, bu da özyinelemeli kısaltma olarak veri odaklı amacını ayırt etmek için kullanıldı.

## Sürümler

## Tasarım

### Sözdizimi
Bir başvuru kartı ve tam özellik listesi resmi sitede mevcuttur. Aşağıda, temel öğelerin bir özeti bulunmaktadır.

YAML, bazı kontrol karakterleri hariç, tüm Unicode karakter setini kabul eder ve UTF-8, UTF-16 veya UTF-32 formatlarında kodlanabilir. (UTF-32 zorunlu olmamakla birlikte, bir ayrıştırıcının JSON uyumluluğuna sahip olması için gereklidir.)

* Boşluk girintileme yapı belirtmek için kullanılır; ancak, sekme karakterlerine bu girintilemenin bir parçası olarak izin verilmez.
* Yorumlar, diyez işareti () ile başlar, bir satırın herhangi bir yerinde başlayabilir ve satırın sonuna kadar devam eder. Yorumlar, diğer belirteçlerden boşluk karakterleriyle ayrılmalıdır. Eğer # karakteri bir dizge içinde görünürse, o zaman bu bir diyez () harfi olur.
* Liste üyeleri, her satır başında bir kısa çizgi () ile gösterilir.
** Bir liste ayrıca, köşeli parantez () içine alınarak ve her bir giriş virgül ile ayrılarak belirtilebilir.
* Bir ilişkisel dizi girişi, *?key: value* biçiminde iki nokta üst üste ile temsil edilir ve her satıra bir giriş düşer. YAML, iki noktadan sonra bir boşluk gerektirir, böylece  gibi URL tarzı dizgeler, tırnak içine alınmadan temsil edilebilir.
** Bir anahtarın önüne bir soru işareti konarak, tırnak işaretleri olmadan önünde kısa çizgi, köşeli parantez vb. içeren bir anahtarın "?anahtar: değer" biçiminde olmasına izin verilir.
** Bir ilişkisel dizi ayrıca, metin  içinde kapalı olarak ve anahtarlar iki nokta üst üste ile ayrılmış ve girişler virgülle ayrılmış olarak belirtilebilir (boşluklar JSON ile uyumluluğu korumak için gerekli değildir).
* Dizgeler (YAML'deki bir tür skaler), normalde tırnak işaretsizdir, ancak çift tırnak () veya tek tırnak () içine alınabilir.
** Çift tırnak içinde, özel karakterler bir ters eğik çizgi () ile başlayan C tarzı kaçış dizileriyle temsil edilebilir. Belgelenmiş bilgilere göre desteklenen tek sekizlik kaçış 'dır.
** Tek tırnak içinde desteklenen tek kaçış dizisi,  gibi tek tırnağın kendisini belirten çift tek tırnak ()'dır.
* Blok skalerleri, girinti ile sınırlıdır ve satır sonlarını koruma (`|`) veya katlama () için isteğe bağlı değiştiricilere sahiptir.
* Tek bir akıştaki birden çok belge, üç kısa çizgi () ile ayrılır.
** Üç nokta (), isteğe bağlı olarak bir akış içindeki bir belgeyi sonlandırır.
* Yinelenen düğümler başlangıçta bir ampersand () ile belirtilir ve daha sonra bir yıldız işareti () ile referans alınır.
* Düğümler, bir dize izleyen çift ünlem işareti () kullanılarak bir tür veya etiketle etiketlenebilir ve bu dize bir URI'ye genişletilebilir.
* Bir akıştaki YAML belgeleri, bir yüzde işareti () ardından bir ad ve boşlukla ayrılmış parametrelerden oluşan 'yönergeler' ile başlayabilir. YAML 1.1'de iki yönerge tanımlanmıştır:
** %YAML yönergesi, belirli bir belgede YAML sürümünü tanımlamak için kullanılır.
** %TAG yönergesi, URI önekleri için bir kısayol olarak kullanılır. Bu kısayollar daha sonra düğüm türü etiketlerinde kullanılabilir.

### Temel Bileşenler

Geleneksel blok formatı, listede yeni bir öğeye başlamak için kısa çizgi+boşluk kullanır.

```yaml
--- # Favori filmler
- Casablanca
- Gizli Teşkilat
- Orada Olmayan Adam
```


İsteğe bağlı satır içi format, virgül+boşluk ile ayrılmıştır ve köşeli parantezler JSON'a benzer bir şekilde içine alınmıştır.

```yaml
--- # Alışveriş listesi
[süt, kabaklı turta, yumurta, meyve suyu]
```


Anahtarlar, değerlerden iki nokta+boşluk ile ayrılır. YAML veri dosyalarında yaygın olan girintili bloklar, anahtar/değer çiftlerini ayırmak için girinti ve yeni satır kullanır. YAML veri akışlarında yaygın olan satır içi bloklar, süslü parantezler arasındaki anahtar/değer çiftlerini ayırmak için virgül+boşluk kullanır.

```yaml
--- # Girintili Blok
  isim: John Smith
  yaş: 33
--- # Satır İçi Blok
{isim: John Smith, yaş: 33}
```


Dizgeler tırnak işaretlerine ihtiyaç duymaz. Çok satırlı dizgeler yazmanın iki yolu vardır; biri yeni satırları korur (`|` karakteri kullanarak), diğeri ise yeni satırları katlar ( karakteri kullanarak). Her iki durumda da bir yeni satır karakteri takip eder.


```yaml
veri: |
   Bir zamanlar Ealing'den uzun bir adam vardı.
   Darjeeling'e giden bir otobüse bindi.
   Ve kapıda:
   "Lütfen yere oturmayın" 
   yazıyordu.
   Bu yüzden dikkatlice tavana oturdu.
```


Varsayılan olarak, öndeki girinti (ilk satırın) ve sondaki boşluklar çıkarılır, ancak diğer davranış açıkça belirtilebilir.


```yaml
veri: >
   Katlanmış metin
   tek bir paragraf
   halinde birleştirilecek

   Boş satırlar paragraf
   ayrımı olarak kabul edilir
```

Katlanmış metin, yeni satırları boşluklara dönüştürür ve öndeki boşlukları kaldırır.


```yaml
--- # Smith Ailesi
- {isim: John Smith, yaş: 33}
- isim: Mary Smith
  yaş: 27
- [isim, yaş]: [Rae Smith, 4]   # anahtarlar olarak diziler desteklenir
--- # İnsanlar, cinsiyete göre
erkekler: [John Smith, Bill Jones]
kadınlar:
  - Mary Smith
  - Susan Williams
```


Nesneler ve listeler, yaml'deki önemli bileşenlerdir ve karıştırılabilirler. İlk örnek, Smith ailesinden tüm insanları içeren anahtar-değer nesnelerinin bir listesidir. İkinci örnek, onları cinsiyete göre listeler; bu, iki liste içeren bir anahtar-değer nesnesidir.

### Gelişmiş Bileşenler

YAML'ı diğer veri serileştirme dillerinin yeteneklerinden ayıran iki özellik, yapılar ve veri tipleridir.

YAML yapıları, tek bir dosya içinde birden fazla belgenin saklanmasına, tekrar eden düğümler için referansların kullanılmasına ve key olarak rastgele düğümlerin kullanılmasına olanak tanır.

Açıklık, kompaktlık ve veri giriş hatalarını önlemek için YAML, düğüm çapaları ( kullanarak) ve referanslar ( kullanarak) sağlar. Çapaya yapılan referanslar, tüm veri türleri için geçerlidir (aşağıdaki örnekteki ship-to referansına bakın).

Aşağıda, iki adımın tam olarak tanımlanmadan referans alındığı bir enstrüman dizicisindeki bir kuyruğun bir örneği verilmiştir.


```yaml
--- # Lazer göz ameliyatı için Dizici protokolleri
- step:  &id001                  # çapa etiketi &id001 tanımlar
    instrument:      Lasik 2000
    pulseEnergy:     5.4
    pulseDuration:   12
    repetition:      1000
    spotSize:        1mm

- step: &id002
    instrument:      Lasik 2000
    pulseEnergy:     5.0
    pulseDuration:   10
    repetition:      500
    spotSize:        2mm
- Enstrüman1: *id001   # ilk adıma referans verir (çapa &id001 ile)
- Enstrüman2: *id002   # ikinci adıma referans verir
```


Açık veri tipleri, YAML belgelerinin çoğunda nadiren görülür çünkü YAML basit tipleri otomatik olarak algılar. Veri tipleri üç kategoriye ayrılabilir: çekirdek, tanımlı ve kullanıcı tanımlı. Çekirdek olanlar, herhangi bir ayrıştırıcıda bulunması beklenenlerdir (ör. ondalık sayılar, tam sayılar, dizgeler, listeler, haritalar, ...). İkili veri gibi daha birçok gelişmiş veri türü, YAML spesifikasyonunda tanımlanmıştır, ancak tüm uygulamalarda desteklenmez. Son olarak, YAML, kullanıcı tanımlı sınıflara, yapılar veya ilkelere uyum sağlamak için yerel olarak veri türü tanımlarını genişletmenin bir yolunu tanımlar (ör. dört basamaklı ondalık sayılar).

YAML, varlığın veri türünü otomatik olarak algılar, ancak bazen veri türünü açıkça belirtmek istenir. En yaygın durum, tek kelimelik bir dizenin bir sayı, boolean veya etiket gibi göründüğü ve bu durumu ayırmak için tırnak işaretleri veya açık bir veri tipi etiketi kullanılması gerektiği durumdur.


```yaml
---
a: 123                     # bir tamsayı
b: "123"                   # bir dize, tırnak işaretleri ile ayrılmış
c: 123.0                   # bir ondalık sayı
d: !!float 123             # açık veri tipiyle de bir ondalık sayı (!! ile öneki eklenmiş)
e: !!str 123               # açık tip ile bir dize
f: !!str Evet              # açık tip ile bir dize
g: Evet                    # bir boolean True (yaml1.1), dize "Evet" (yaml1.2)
h: Evet, Hayır muzlarımız var  # bir dize, "Evet" ve "Hayır" bağlama göre ayrılmış.
```


YAML'ın her uygulamasında, spesifikasyonla tanımlanmış her veri türü bulunmaz. Bu yerleşik türler, çift ünlem işaretiyle (sigil) öneki kullanır (). Burada gösterilmeyenler arasında özellikle ilginç olanlar setler, sıralı haritalar, zaman damgaları ve onaltılık sayılardır. İşte base64 ile kodlanmış ikili veriye bir örnek.


```yaml
---
resim: !!binary |
  R0lGODdhDQAIAIAAAAAAANn
  Z2SwAAAAADQAIAAACF4SDGQ
  ar3xxbJ9p0qa7R0YxwzaFME
  1IAADs=
```


YAML'ın birçok uygulaması, nesne serileştirme için kullanıcı tanımlı veri türlerini destekleyebilir. Yerel veri türleri evrensel veri türleri değildir, ancak YAML ayrıştırıcı kitaplığı kullanılarak uygulamada tanımlanır. Yerel veri türleri, tek bir ünlem işareti () kullanır.

## Özellikler

### Girintili Sınırlama

YAML, yapısını esas olarak girintilere dayandırdığı için, özellikle ayraç çarpışmasına karşı dayanıklıdır. YAML'nin skaler değerlerdeki tırnak işaretlerine ve süslü parantezlere karşı duyarsızlığı, bir YAML belgesine yalnızca bir blok literal içinde ( veya  kullanarak) girintileme yaparak XML, JSON veya hatta YAML belgelerini yerleştirmenize olanak tanır:


```yaml
---
example: >
        HTML, değiştirilmeden YAML içine girer
message: |

        <blockquote style="font: italic 1em serif">

"Üç, iki'den her zaman büyüktür,
           büyük iki değerleri için bile"

--Yazar Bilinmiyor

        </blockquote>
date: 2007-06-01
```


YAML, tüm iç tırnak işaretlerini tırnak içine alıp kaçış karakteri kullanarak JSON içine yerleştirilebilir. YAML, ayrılmış karakterleri (, , , , ) kaçış karakteri kullanarak ve boşlukları dönüştürerek veya bir CDATA bölümü içine yerleştirerek XML'e yerleştirilebilir.

### Hiyerarşik Olmayan Veri Modelleri

JSON’un, her bir alt düğümün tek bir ebeveyni olan hiyerarşik bir modelde veri temsil etme yeteneğinin aksine, YAML, aynı verilerin tekrarlanmasını önlemek için ağaçta iki veya daha fazla noktadan referans verilmesine olanak tanıyan basit bir ilişkisel şema sunar. Bu, XML'e yerleşik IDREF işlevine benzer. YAML ayrıştırıcısı daha sonra bu referansları okunduğunda ima ettikleri tam doldurulmuş veri yapılarına genişletir, böylece ayrıştırıcıyı kullanan program, referansları genişletmeyen XML işlemcilerinin aksine, bir ilişkisel kodlama modelinden haberdar olmak zorunda kalmaz. Bu genişletme, yapılandırma dosyalarında veya çok sayıda parametrenin bir dizi ardışık kayıtta aynı kaldığı ve yalnızca birkaçının değiştiği işleme protokollerinde veri giriş hatalarını azaltırken okunabilirliği artırabilir. Örneğin, bir faturadaki "gönderilecek" ve "faturalandırılacak" kayıtların neredeyse her zaman aynı veriler olması gibi.

### Pratik Hususlar

YAML satır yönelimlidir ve bu nedenle, mevcut programların yapılandırılmamış çıktısını YAML formatına dönüştürmek ve orijinal belgenin görünümünün çoğunu korumak genellikle basittir. Kapanış etiketleri, süslü parantezler veya tırnak işaretleri dengelenmediğinden, genellikle basit programlarda dağıtılmış print ifadelerinden doğrudan iyi biçimlendirilmiş YAML oluşturmak kolaydır. Aynı şekilde, boşluk ayraçları, YAML dosyalarını grep, AWK, Perl, Ruby ve Python'daki satır yönelimli komutları kullanarak hızlı ve geçici bir şekilde filtrelemeyi kolaylaştırır.

Özellikle, işaretleme dillerinin aksine, ardışık YAML satırlarından oluşan parçalar genellikle kendi başlarına iyi biçimlendirilmiş YAML belgeleridir. Bu, bir belgedeki belirli kayıtları çıkarmaya başlamadan önce (örneğin açılış ve kapanış etiketlerini dengelemek ve tırnak ve kaçış karakterlerini gezinmek gibi) bir belgenin tamamını işlemeleri gerekmeyen ayrıştırıcılar yazmayı çok kolaylaştırır. Bu özellik, özellikle bir dosyadaki kayıtlar üzerinde tek, durumsuz bir geçişte, dosyanın tüm veri yapısının belleğe sığamayacak kadar büyük olduğu veya yapının tamamını yeniden oluşturarak tek bir öğeyi çıkarmanın aşırı derecede pahalı olacağı durumlarda hızlıdır.

Zıt bir şekilde, girintili sınırlama derin iç içe geçmiş hiyerarşileri karmaşıklaştırıyor gibi görünse de, YAML, tek bir boşluk kadar küçük girintileri işler ve bu, işaretleme dillerinden daha iyi sıkıştırma sağlayabilir. Ayrıca, aşırı derin girintiden tamamen kaçınılabilir: 1) "satır içi stil"e (yani JSON benzeri biçim) geri dönerek girinti olmadan; veya 2) hiyerarşiyi düz bir forma çözmek için ilişkisel çapaları kullanarak, böylece YAML ayrıştırıcı, tam veri yapısına şeffaf bir şekilde yeniden oluşturur.

### Güvenlik

YAML tamamen bir veri-temsil dili olup, yürütülebilir komutlara sahip değildir. Herhangi bir veri dilinde doğrulama ve Javascript'te güvenli ayrıştırma doğası gereği mümkün olsa da, uygulama o kadar ünlü bir tuzaktır ki, YAML'nin iliştirilmiş bir komut diline sahip olmaması göreceli bir güvenlik avantajı olabilir.

Ancak, YAML diline özgü etiketlere izin verir, böylece bu etiketleri destekleyen bir ayrıştırıcı tarafından rastgele yerel nesneler oluşturulabilir. Karmaşık nesne örneklemesine izin veren herhangi bir YAML ayrıştırıcısı, bir enjeksiyon saldırısı olasılığını açar. Keyfi sınıfların nesnelerinin yüklenmesine izin veren Perl ayrıştırıcıları, "kutsanmış" değerler olarak adlandırılan değerleri oluşturur. Bu değerleri kullanmak beklenmedik davranışlara neden olabilir, örneğin sınıf aşırı yüklenmiş operatörler kullanıyorsa. Bu, keyfi Perl kodunun yürütülmesine yol açabilir.

Durum, Python veya Ruby ayrıştırıcıları için de benzerdir. PyYAML belgelerine göre:


Bir YAML belgesini İnternet gibi güvenilmeyen bir kaynaktan alırsanız, keyfi bir Python nesnesi oluşturma yeteneğinin tehlikeli olabileceğini unutmayın.  işlevi, bu yeteneği tamsayılar veya listeler gibi basit Python nesneleriyle sınırlar. [...]

PyYAML, her türlü Python nesnesini oluşturmanıza olanak tanır. Hatta Python sınıflarının örnekleri,  etiketi kullanılarak oluşturulabilir.


### Veri İşleme ve Temsil

YAML spesifikasyonu bir *örnek belgeyi* bir "Sunum" veya "karakter akışı" olarak tanımlar. YAML örnek belgelerinde ana mantıksal yapılar skalerler, diziler ve eşlemelerdir. YAML spesifikasyonu ayrıca bu birincil mantıksal yapılar için bazı temel kısıtlamalar belirtir. Örneğin, spesifikasyona göre, eşleme anahtarlarının bir sırası yoktur. Düğüm sırasının önemli olduğu her durumda bir dizi kullanılmalıdır.

Ayrıca, YAML işlemcileri için uyumluluk tanımlarken, YAML spesifikasyonu iki birincil işlem tanımlar: *dump* ve *load*. Tüm YAML uyumlu işlemciler *en az bir* bu işlemlerden birini sağlamalıdır ve isteğe bağlı olarak her ikisini de sağlayabilir. Son olarak, YAML spesifikasyonu bir *bilgi modeli* veya "temsil grafiği" tanımlar, bu grafik hem *dump* hem de *load* işlemleri sırasında oluşturulmalıdır, ancak bu temsil, bir API aracılığıyla kullanıcıya sunulmak zorunda değildir.

## Diğer Serileştirme Formatlarıyla Karşılaştırma

### JSON ile Karşılaştırma

JSON söz dizimi, YAML sürüm 1.2'nin temelini oluşturur. Bu sürüm, YAML'yi "JSON ile resmi bir alt küme olarak uyumlu hale getirmek" amacıyla yayımlanmıştır. Önceki YAML sürümleri tam olarak uyumlu olmasa da, bu farklılıklar nadiren fark edilirdi ve çoğu JSON belgesi, Syck gibi bazı YAML ayrıştırıcıları tarafından ayrıştırılabilir. Bu, JSON'un semantik yapısının YAML'nin isteğe bağlı "satır içi stili" ile eşdeğer olmasından kaynaklanmaktadır. JSON gibi satır içi stilde genişletilmiş hiyerarşiler yazılabilir, ancak bu, netliği artırmadıkça önerilen bir YAML stili değildir.

YAML, JSON'da bulunmayan birçok ek özelliğe sahiptir; bunlar arasında yorumlar, genişletilebilir veri türleri, ilişkisel sabitler, tırnaksız dizgiler ve anahtar sırasını koruyan eşleme türleri bulunur.

YAML'nin anlaşılır olması, JSON serileştirme ve ayrıştırmanın, YAML'ye göre çok daha hızlı olmasını sağlar.

### TOML ile Karşılaştırma
TOML, .ini dosya formatının bir geliştirmesi olarak tasarlanmıştır. YAML'ın minimum gösterge karakteri kullanımı, TOML'un tırnak işareti ve köşeli parantez gereksinimleriyle kıyaslandığında daha avantajlı olarak görülür. YAML'ın önemli girinti kullanımı, TOML'un anahtar ve tablo adları için nokta gösterimi ile karşılaştırılmıştır ve hangi yöntemin daha okunabilir yapılandırma dosyalarına yol açtığı konusunda farklı görüşler vardır.

### XML ile Karşılaştırma
YAML, XML'de bulunan etiket özniteliklerine sahip değildir. Bunun yerine YAML, genişletilebilir tür bildirimlerine (nesneler için sınıf türleri dahil) sahiptir.

YAML'nin kendisi, örneğin bir belgenin kendini doğrulamasına izin veren XML'nin dil tanımlı belge şeması tanımlayıcılarına sahip değildir. Bununla birlikte, YAML için dışarıdan tanımlanmış birkaç şema tanımlayıcı dili vardır (örneğin, Doctrine, Kwalify ve Rx) ve bu rolü yerine getirir. Ayrıca, YAML veri yapılarını XML'de temsil eden YAXML, XML şema içe aktarıcıları ve XSLT gibi çıktı mekanizmalarının YAML'ye uygulanmasına izin verir.

Comparison of data-serialization formats daha kapsamlı bir YAML ve diğer serileştirme formatlarının karşılaştırmasını sağlar.

## Yazılım (emitter'lar ve parser'lar)

Sabit veri yapıları için, YAML dosyaları sadece veriyi ve YAML'ye özgü süslemeleri yazan *print* komutları kullanılarak kolayca oluşturulabilir. Ancak, değişken veya karmaşık, hiyerarşik verileri dökebilmek için, özel bir YAML *emitter* (yayımcı) tercih edilir. Benzer şekilde, basit YAML dosyaları (örneğin, anahtar-değer çiftleri) düzenli ifadelerle kolayca ayrıştırılabilir. Daha karmaşık veya değişken veri yapıları için ise, resmi bir YAML *parser* (ayrıştırıcı) önerilir.

YAML emitter'ları ve parser'ları birçok popüler dil için mevcuttur. Çoğu, kendi yerel dillerinde yazılmıştır. Bazıları ise C kütüphanesi *libyaml*nin dil bağlamalarıdır; bu, onların daha hızlı çalışmasını sağlayabilir. Bir zamanlar, *Syck* adında başka bir C kütüphanesi vardı, bu kütüphane why the lucky stiff tarafından yazılmış ve sonrasında yetim bırakılmıştır: bu kütüphane artık bakımsız durumdadır, resmi bir kaynak paketi yoktur ve web sitesi ele geçirilmiştir. Bu nedenle önerilebilecek tek C kütüphanesi *libyaml*dir. Başlangıçta Kirill Simonov tarafından geliştirilmiştir. 2018'de, yeni bakıcılar Ian Cordasco ve Ingy döt Net tarafından geliştirmeye devam edilmiştir.

C++ programcıları, C kütüphanesi *libyaml* ve C++ kütüphanesi *libyaml-cpp* arasında seçim yapabilirler. Her ikisi de tamamen bağımsız kod tabanlarına ve tamamen farklı API'lere sahiptir. *libyaml-cpp* kütüphanesinin hala 0 olan bir ana sürüm numarası vardır, bu da API'nin herhangi bir anda değişebileceğini gösterir; nitekim, 0.3 sürümünden sonra da bu gerçekleşmiştir. İç içe geçmiş elemanlar için uzantılar hedefleyen, C# dilinde yazılmış bir gramer odaklı bir uygulama da mevcuttur.

YAML'nin bazı uygulamaları, örneğin Perl'in YAML.pm, bir dosyanın (akışın) tamamını yükler ve onu toplu olarak ayrıştırır. PyYaml gibi diğer uygulamalar ise tembel ayrıştırma yapar ve sadece istek üzerine bir sonraki belgeyi işler. Çok büyük dosyalar için, belgeleri bağımsız olarak işlemek planlandığında, tüm dosyayı işlemden önce oluşturmak engelleyici olabilir. Bu nedenle, YAML.pm'de bazen bir dosyayı belgelere bölmek ve her birini ayrı ayrı ayrıştırmak gerekebilir. YAML bunu kolaylaştırır, çünkü bu sadece satır başında üç nokta ve ardından bir boşluk (ve olası bir yorum) ile tanımlanan belge sonu ayıracına bölmeyi gerektirir. Bu ayıraç içerikte yasaklanmıştır.

## Eleştiri
YAML, önemli boşluk, kafa karıştırıcı özellikleri, güvenli olmayan varsayılanları ve karmaşık ve belirsiz spesifikasyonu nedeniyle eleştirilmiştir:

* Yapılandırma dosyaları, kullanıcılar farkında olmadan komutları çalıştırabilir veya içerikleri yükleyebilir.
* Büyük YAML dosyalarını düzenlemek zordur, çünkü girinti hataları fark edilmeyebilir.
* Otomatik tür belirleme bir hata kaynağıdır. Örneğin, tırnak içine alınmamış  ve  boolean'a dönüştürülür; yazılım sürüm numaraları float'a dönüştürülebilir.
* Sonlandırıcıların olmaması nedeniyle kesilmiş dosyalar genellikle geçerli YAML olarak yorumlanır.
* Standardın karmaşıklığı tutarsız uygulamalara yol açtı ve dili taşınabilir olmaktan çıkardı.

YAML'ın algılanan kusurları ve karmaşıklığı, StrictYAML ve NestedText gibi daha katı alternatiflerin ortaya çıkmasına neden olmuştur.

## Kaynakça

## Dış Bağlantılar
* 
* YAMLScript