YAML

YAML
ParadigmasıVeri serileştirme
İlk çıkışı11 Mayıs 2001
TasarımcıClark Evans, Ingy döt Net, Oren Ben-Kiki
GeliştiriciYAML.org
Kararlı sürüm1.2 (Revizyon 1.2.2) (1 Ekim 2021)
Tür disipliniVeri değişimi
Önemli uygulamalarıKonfigürasyon dosyaları, veri serileştirme
LehçeleriYok
EtkilendikleriJSON, XML
Uygulama diliMetin tabanlı
PlatformuÇapraz platform
İşletim sistemiHerhangi bir
LisansAçık kaynak
Olağan dosya uzantıları.yaml, .yml
Web sitesihttps://yaml.org

YAML (Telafuz: Listeni/ˈjæməl/); 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.[1] Yerleşim belirlemek için Python tarzı girinti kullanır[1] ve çoğu dize değeri etrafında alıntı işareti gerektirmez ve aynı dosyada JSON tarzı ​[...]​ ve } de desteklemektedir.[2]

Ö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.[3][4][5] İki nokta üst üste kullanılan sözdizimi, anahtar-değer çiftleri ifadesi için, RFC 822'de tanımlanan elektronik posta başlıklarından esinlenmiştir ve belge ayırıcı kodu (​---​)MIME'dan (RFC 2046) ö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.[1]

YAML okuma ve yazma desteği birçok programlama dilinde mevcuttur.[6] Vim,[7] Emacs,[8] ve çeşitli entegre geliştirme ortamları bulunmaktadır.[9][10][11] 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ı ​.yaml​ ve ​.yml​, 2006'dan beri geçerlidir.[12] 2024'te MIME türü ​application/yaml​ olarak kesinleşmiştir.[13]

Tarih ve İsim

YAML (/ˈjæməl/,[2]) 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.[14] Başlangıçta YAML'nın Yet Another Markup Language (Yine Bir İşaretleme Dili) anlamına geldiği söyleniyordu,[15] çü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

Sürüm Yayın tarihi
YAML 1.0 29 Ocak 2004
YAML 1.1 18 Ocak 2005
YAML 1.2.0 21 Temmuz 2009
YAML 1.2.1 1 Ekim 2009
YAML 1.2.2 1 Ekim 2021

Tasarım

Sözdizimi

Bir başvuru kartı ve tam özellik listesi resmi sitede mevcuttur.[16] 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.)[17]

  • Boşluk girintileme yapı belirtmek için kullanılır; ancak, sekme karakterlerine bu girintilemenin bir parçası olarak izin verilmez.[18]
  • 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.[19] 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 ​http://www.wikipedia.org​ 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çış ​\0​'dır.
    • Tek tırnak içinde desteklenen tek kaçış dizisi, ​'don''t'​ 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.

--- # 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.[20]

--- # 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.

--- # 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.

veri: |
   Bir zamanlar Ealing'den uzun bir adam vardı
   Darjeeling'e giden bir otobüse bindi
       Kapıda yazıyordu
       "Lütfen yere oturmayın"
   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.

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.

--- # 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[21] 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.[21]

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.

--- # 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, tamsayı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.

---
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ı sayılardır. İşte base64 ile kodlanmış ikili veriye bir örnek.

---
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:

---
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.[22] 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.[23]

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.[24]

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

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. ​yaml.safe_load​ 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, ​!!python/object​ etiketi kullanılarak oluşturulabilir.

Veri İşleme ve Temsil

YAML spesifikasyonu bir örnek belgeyi bir "Sunum" veya "karakter akışı" olarak tanımlar.[26] YAML örnek belgelerinde ana mantıksal yapılar skalerler, diziler ve eşlemelerdir.[27] 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.[28]

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.[29] 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.[30]

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.[2] Önceki YAML sürümleri tam olarak uyumlu olmasa da,[31] 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.[32] 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.[33][34]

TOML ile Karşılaştırma

TOML, .ini dosya formatının bir geliştirmesi olarak tasarlanmıştır. YAML'nin minimum gösterge karakteri kullanımı, TOML'nin tırnak işareti ve köşeli parantez gereksinimleriyle kıyaslandığında daha avantajlı olarak görülür. YAML'nin önemli girinti kullanımı, TOML'nin 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.[35][36]

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 libyamlnin 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 libyamldir. 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.[37]

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.[38]

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.[39]

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:[40][41][42]

  • Yapılandırma dosyaları, kullanıcılar farkında olmadan komutları çalıştırabilir veya içerikleri yükleyebilir.[40]
  • Büyük YAML dosyalarını düzenlemek zordur, çünkü girinti hataları fark edilmeyebilir.[40]
  • Otomatik tür belirleme bir hata kaynağıdır. Örneğin, tırnak içine alınmamış ​Yes​ ve ​No​ boolean'a dönüştürülür; yazılım sürüm numaraları float'a dönüştürülebilir.[40][43]
  • 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ı.[40][44]

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

Kaynakça

  1. ^ a b c "Yet Another Markup Language (YAML) 1.0 / Working Draft". 10 Ara 2001. 10 Tem 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Mayıs 2019. 
  2. ^ a b c "YAML Ain't Markup Language (YAML) Version 1.2". YAML.org. 24 Oca 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  3. ^ "Built-in Types — Python 3.9.6 documentation". docs.python.org. 14 Haziran 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Ağustos 2021. 
  4. ^ "Standard built-in objects - JavaScript | MDN". developer.mozilla.org (İngilizce). 19 Ocak 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Ağustos 2021. 
  5. ^ corob-msft (17 Ağustos 2021). "Built-in types (C++)". docs.microsoft.com (İngilizce). 13 Haziran 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 19 Ağustos 2021. 
  6. ^ "The Official YAML Web Site". yaml.org. 18 Mart 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Şubat 2019. 
  7. ^ "Setting up Vim for YAML editing". arthurkoziel.com. 23 Kasım 2021 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Aralık 2021. 
  8. ^ "Yaml Mode". EmacsWiki. 12 Haziran 2015. 8 Kasım 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Aralık 2016. 
  9. ^ aukaost. "Pretty YAML - Packages - Package Control". Packagecontrol.io. 8 Kasım 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Aralık 2016. 
  10. ^ "yaml | Eclipse Plugins, Bundles and Products - Eclipse Marketplace". Marketplace.eclipse.org. 8 Kasım 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Aralık 2016. 
  11. ^ Ruth Kusterer. "NetBeans IDE - Ruby and Ruby on Rails Development". Netbeans.org. 19 Kasım 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 5 Aralık 2016. 
  12. ^ "YAML Ain't Markup Language". 24 Eylül 2006. 24 Eylül 2006 tarihinde kaynağından arşivlendi. 
  13. ^ Kaynak hatası: Geçersiz <ref> etiketi; rfc9512 isimli refler için metin sağlanmadı (Bkz: Kaynak gösterme)
  14. ^ Evans, Clark (11 Mayıs 2001). "YAML Taslağı 0.1". Yahoo! Tech grupları: sml-dev. 3 Haziran 2001 tarihinde kaynağından arşivlendi. Erişim tarihi: 21 Mart 2019. 
  15. ^ "Yet Another Markup Language (YAML) 1.0". YAML.org. 14 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  16. ^ "YAML 1.1 Başvuru Kartı". YAML.org. 14 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  17. ^ "YAML Markup Language (YAML) Sürüm 1.2". YAML.org. 24 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  18. ^ "YAML specification v1.2.2 Section 6.1. Indentation Spaces". 12 Mart 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 12 Mart 2023. 
  19. ^ "YAML Ain't Markup Language (YAML) Sürüm 1.2". YAML.org. 24 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  20. ^ "Bulut Tabanlı Yönetim uygulamaları". JigoCloud.com. 17 Eylül 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Eylül 2016. 
  21. ^ a b "YAML 1.2 Yapıların Spesifikasyonu". YAML.org. 24 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  22. ^ "Extensible Markup Language (XML) 1.0 (İkinci Baskı)". W3.org. 15 Mayıs 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 27 Mayıs 2015. 
  23. ^ "Ücretsiz Kurslar | YAML'ye Giriş - Uygulamalı bir kurs". Insidelearn (İngilizce). 26 Ağustos 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ağustos 2022. 
  24. ^ "YAML". Teknik Informatika. 4 Ağustos 2022. 26 Aralık 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 4 Ağustos 2022. 
  25. ^ "PyYAML Documentation, Loading YAML". Pyyaml.org. 24 Eylül 2016 tarihinde kaynağından arşivlendi. Erişim tarihi: 28 Eylül 2016. 
  26. ^ "Ain't Markup Language (YAML) Version 1.1". YAML.org. 14 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  27. ^ Ek, isteğe bağlı kullanım, mantıksal yapılar YAML türleri deposunda listelenmiştir."Language-Independent Types for YAML Version 1.1". YAML.org. 14 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  28. ^ "YAML Ain't Markup Language (YAML) Version 1.1". YAML.org. 13 Haziran 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  29. ^ "Ain't Markup Language (YAML) Version 1.1". YAML.org. 13 Haziran 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  30. ^ "YAML Ain't Markup Language (YAML) Version 1.1". YAML.org. 14 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  31. ^ Uyumsuzluklar şunlardı: JSON, UTF-32 gibi genişletilmiş karakter setlerine izin veriyor ve YAML'ye göre uyumsuz Unicode karakter kaçış sözdizimine sahipti; YAML, virgül, eşittir ve iki nokta üst üste gibi ayırıcıların ardından bir boşluk gerektiriyordu, ancak JSON bunu gerektirmiyordu. JSON'un bazı standart olmayan uygulamaları, JavaScript'in ​/*...*/​ yorumlarını içerecek şekilde grameri genişletir. Bu tür sınır durumlarını ele almak, JSON'u satır içi YAML olarak ayrıştırmadan önce hafif bir ön işleme gerektirebilir. Daha fazla bilgi için bkz. [1] 29 Ağustos 2013 tarihinde Wayback Machine sitesinde arşivlendi..
  32. ^ Parsing JSON with SYCK 17 Eylül 2016 tarihinde Wayback Machine sitesinde arşivlendi.. Not that e.g. Symfony's YAML parser does not support line breaks inside [] or {} structures, which is a major incompatibility with JSON.
  33. ^ "YAML vs JSON vs XML in Go"Ücretli abonelik gerekli. Medium. 15 Haziran 2021. 24 Ocak 2024 tarihinde kaynağından arşivlendi. Erişim tarihi: 31 Ocak 2024. 
  34. ^ "Differences Between YAML and JSON". Baeldung. 9 Temmuz 2020. 7 Mart 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Mart 2023. 
  35. ^ Siebenmann, Chris (30 Nisan 2019). "My problem with YAML's use of whitespace". 1 Aralık 2023 tarihinde kaynağından arşivlendi. Erişim tarihi: 6 Ekim 2023. 
  36. ^ What is wrong with TOML?
  37. ^ [email protected], 27 Haziran 2018 tarihli e-posta.
  38. ^ "YAML Grammar for Lexepars". GitHub. 17 Eylül 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 20 Şubat 2020. 
  39. ^ "YAML Ain't Markup Language (YAML) Version 1.2 # 9.1.2 Document Markers". YAML.org. 24 Ocak 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 29 Mayıs 2019. 
  40. ^ a b c d e Tournoij, Martin (4 Eylül 2016). "YAML: probably not so great after all". 10 Mayıs 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Mayıs 2019. 
  41. ^ "That's a lot of YAML". 2 Mart 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Mayıs 2019. 
  42. ^ com/cblp/yaml-sucks "YAML sucks" |url= değerini kontrol edin (yardım). GitHub. 7 Nisan 2019 tarihinde kaynağından arşivlendi. Erişim tarihi: 16 Mayıs 2019. 
  43. ^ a b com/strictyaml/why/implicit-typing-removed/ "The Norway Problem - why StrictYAML refuses to do implicit typing and so should you" |url= değerini kontrol edin (yardım). 21 Şubat 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Haziran 2020. 
  44. ^ "YAML Test Matrix". 16 Temmuz 2020 tarihinde kaynağından arşivlendi. Erişim tarihi: 3 Nisan 2020. 

Dış Bağlantılar

  • Resmî site
  • YAMLScript
  • g
  • t
  • d
  • Karşılaştırma
  • Zaman Çizelgesi
  • Tarihçe
  • Liste Listeler: Alfabetik
  • Kategoriik
  • Nesilsel
  • İngilizce temelli olmayan
  • Kategori Kategori