YAML - YAML

YAML
YAML Logosu.svg
Dosya adı uzantıları .yaml, .yml
İnternet medya türü Kayıtlı değil
İlk sürüm 11 Mayıs 2001 ; 20 yıl önce ( 2001-05-11 )
En son sürüm
1.2 (Üçüncü Baskı)
(1 Ekim 2009 ; 12 yıl önce ) ( 2009-10-01 )
Biçim türü veri değişimi
Açık biçim ? Evet
İnternet sitesi yaml .org

YAML ( bkz. § Tarih ve ad ) insan tarafından okunabilen bir veri serileştirme dilidir . Genellikle yapılandırma dosyaları için ve verilerin depolandığı veya iletildiği uygulamalarda kullanılır. YAML, Genişletilebilir İşaretleme Dili (XML) ile aynı iletişim uygulamalarının çoğunu hedefler, ancak SGML'den kasıtlı olarak farklı olan minimal bir sözdizimine sahiptir . İç içe yerleştirmeyi belirtmek için hem Python stili girintiyi hem de [...]listeler ve {...}haritalar için kullanılan daha kompakt bir biçim kullanır , bu nedenle JSON dosyaları geçerli YAML 1.2'dir.

Özel veri türlerine izin verilir, ancak YAML yerel olarak skalerleri ( dizeler , tamsayılar ve kayan noktalar gibi ), listeleri ve ilişkisel dizileri (haritalar, sözlükler veya karmalar olarak da bilinir ) kodlar . Bu veri türleri Perl programlama dilini temel alır , ancak yaygın olarak kullanılan tüm yüksek seviyeli programlama dilleri çok benzer kavramları paylaşır. Anahtar/değer çiftlerini ifade etmek için kullanılan iki nokta üst üste merkezli sözdizimi, RFC 822'de tanımlanan elektronik posta başlıklarından esinlenmiştir ve belge ayırıcı MIME'den ( RFC 2046 ) ödünç alınmıştır . Kaçış dizileri C'den yeniden kullanılır ve çok satırlı dizeler için boşluk sarma, HTML'den esinlenmiştir . Listeler ve karmalar, bir ağaç yapısı oluşturan iç içe listeler ve karmalar içerebilir ; rasgele grafikler (XML benzer YAML takma kullanılarak temsil edilebilir SOAP ). YAML esinlenerek bir özellik okumak ve akarsularda yazılacak amaçlanmıştır SAX .   --- 

YAML okuma ve yazma desteği birçok programlama dili için mevcuttur. Emacs ve çeşitli entegre geliştirme ortamları gibi bazı kaynak kodu düzenleyicileri , iç içe geçmiş yapıları katlama veya sözdizimi hatalarını otomatik olarak vurgulama gibi YAML'yi düzenlemeyi kolaylaştıran özelliklere sahiptir.

YAML dosyaları için önerilen resmi dosya adı uzantısı.yaml 2006'dan beridir.

Tarih ve isim

YAML ( / j æ m əl / , ile kafiyeli deve ) ilk net nokta Ingy ve Oren Ben-Kiki ile birlikte tasarlanmış, 2001 yılında Clark Evans tarafından önerilmişti. Başlangıçta YAML'nin Yet Another İşaretleme Dili anlamına geldiği söyleniyordu , çünkü sunum ve bağlantı için işaretleme dillerinin (HTML, XML, SGML, vb.) çoğalmasının görüldüğü bir çağda piyasaya sürüldü. İlk adı, teknoloji ortamına bir dil-yanak referansı olarak tasarlanmıştı ve amacına başka bir yapı ile bir işaretleme dili olarak atıfta bulundu , ancak daha sonra ayırt etmek için özyinelemeli bir kısaltma olan YAML Ain't Markup Language olarak yeniden amaçlandı. amacı, belge işaretlemesi yerine veri odaklıdır.

Tasarım

Sözdizimi

Resmi sitede bir hile sayfası ve tam özellikler mevcuttur. Aşağıdaki, temel unsurların bir özetidir.

YAML, bazı kontrol karakterleri dışında tüm Unicode karakter setini kabul eder ve UTF-8 , UTF-16 veya UTF-32'den herhangi birinde kodlanabilir . (UTF-32 zorunlu olmasa da bir ayrıştırıcının JSON uyumluluğuna sahip olması gerekir .)

  • Yapıyı belirtmek için boşluk girintisi kullanılır; ancak, bu girintinin parçası olarak sekme karakterlerine izin verilmez.
  • Yorumlar sayı işareti ( #) ile başlar, bir satırda herhangi bir yerden başlayabilir ve satırın sonuna kadar devam edebilir. Yorumlar, diğer belirteçlerden boşluk karakterleriyle ayrılmalıdır. Bir dizenin içinde # karakter görünüyorsa, bunlar sayı işareti ( #) değişmezleridir.
  • Liste üyeleri, her satırda bir üye olacak şekilde baştaki kısa çizgi ( -) ile gösterilir .
  • Bir ilişkisel dizi giriş kullanılarak temsil edilmektedir kolon alanı form değeri: anahtar hattı her bir giriş ile. YAML, iki nokta üst üste http://www.wikipedia.orgişaretinin ardından bir boşluk olmasını gerektirir, böylece skaler değerler genellikle tırnak içine alınmaya gerek kalmadan temsil edilebilir.
    • Anahtarın başında tire, köşeli parantez vb. tırnak işaretleri olmadan içermesine izin vermek için bir anahtarın önünde "?key: value" biçiminde bir soru işareti kullanılabilir.
    • Bir ilişkisel dizi, değerlerden iki nokta üst üste ve virgülle ayrılmış girişlerle (JSON ile uyumluluğu korumak için boşluklar gerekli değildir) küme parantezleri ( {...}) içine alınmış metinle de belirtilebilir .
  • Yaylı (bir tür skalar YAML olarak) genellikle işlem görmeyen, fakat içine edilebilir çift tırnak ( ") ya da tek-tırnak ( ').
    • Çift tırnak içinde, özel karakterler ters eğik çizgi ( ) ile başlayan C tarzı kaçış dizileriyle gösterilebilir . Belgelere göre desteklenen tek sekizli kaçış .\\0
    • Tek tırnak içinde desteklenen tek kaçış dizisi, tek tırnak işaretinin ''kendisini 'don''t'.
  • Blok skalerler, yeni satırları korumak ( ) veya katlamak ( ) için isteğe bağlı değiştiricilerle girinti ile sınırlandırılır .|>
  • Tek bir akış içindeki birden çok belge, üç tire ( ---) ile ayrılır .
    • Üç nokta ( ...) isteğe bağlı olarak bir akış içindeki bir belgeyi sonlandırır.
  • Tekrarlanan düğümler başlangıçta bir ve işareti ( &) ile gösterilir ve daha sonra bir yıldız işareti ( *) ile belirtilir.
  • Düğümler, çift ünlem işareti ( !!) ve ardından bir URI'ye genişletilebilen bir dize kullanılarak bir tür veya etiketle etiketlenebilir .
  • Bir akıştaki YAML belgelerinin başında, yüzde işareti ( %) ve ardından bir ad ve boşlukla ayrılmış parametrelerden oluşan 'yönergeler' gelebilir . YAML 1.1'de iki yönerge tanımlanmıştır:
    • %YAML yönergesi, belirli bir belgedeki YAML sürümünü belirlemek 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 tipi etiketlerde kullanılabilir.

İki ek desen karakterler ileride spesifikasyonu için YAML içinde ayrılmıştır: işaretini ( @) ve backtick ( `).

Temel bileşenler

YAML, ilişkisel dizileri ve listeleri belirtmek için "satır içi" bir stil sunar. İşte bileşenlerin bir örneği.

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

--- # Favorite movies
- Casablanca
- North by Northwest
- The Man Who Wasn't There

İsteğe bağlı satır içi biçim, virgül+boşluk ile sınırlandırılır ve parantez içine alınır ( JSON'a benzer ).

--- # Shopping list
[milk, pumpkin pie, eggs, juice]

Anahtarlar, değerlerden iki nokta üst üste+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ırlar kullanır. YAML veri akışlarında yaygın olan Satır İçi Bloklar, anahtar/değer çiftlerini ayraçlar arasında ayırmak için virgül+boşluk kullanır.

--- # Indented Block
  name: John Smith
  age: 33
--- # Inline Block
{name: John Smith, age: 33}

Dizeler tırnak işaretleri gerektirmez. Çok satırlı dizeler yazmanın iki yolu vardır, biri yeni satırları koruyarak ( |karakteri kullanarak ) ve biri yeni satırları katlayarak ( >karakteri kullanarak ), her ikisinin de ardından yeni satır karakteri gelir.

data: |
   There once was a tall man from Ealing
   Who got on a bus to Darjeeling
       It said on the door
       "Please don't sit on the floor"
   So he carefully sat on the ceiling

Varsayılan olarak, baştaki girinti (ilk satırın) ve sondaki boşluk kaldırılır, ancak diğer davranışlar açıkça belirtilebilir.

data: >
   Wrapped text
   will be folded
   into a single
   paragraph

   Blank lines denote
   paragraph breaks

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

--- # The Smiths
- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27
- [name, age]: [Rae Smith, 4]   # sequences as keys are supported
--- # People, by gender
men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams

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

Gelişmiş bileşenler

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

YAML yapıları, birden çok belgenin tek bir dosya içinde depolanmasını, tekrarlanan düğümler için referansların kullanılmasını ve anahtar olarak rastgele düğümlerin kullanılmasını sağlar.

Netlik, kompaktlık ve veri girişi hatalarından kaçınmak için YAML, düğüm çapaları (kullanarak &) ve referanslar (kullanarak *) sağlar. Tüm veri türleri için ankraj çalışmasına referanslar (aşağıdaki örnekte sevkıyat referansına bakın).

Aşağıda, her seferinde tam olarak tanımlanmadan iki adımın tekrar tekrar kullanıldığı bir alet sıralayıcısındaki bir sıra örneği verilmiştir.

--- # Sequencer protocols for Laser eye surgery
- step:  &id001                  # defines anchor label &id001
    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
- step: *id001                   # refers to the first step (with anchor &id001)
- step: *id002                   # refers to the second step
- step: *id002

YAML basit türleri otomatik olarak algıladığından, YAML belgelerinin çoğunda açık veri yazma nadiren görülür. Veri türleri üç kategoriye ayrılabilir: çekirdek, tanımlı ve kullanıcı tanımlı. Çekirdek, herhangi bir ayrıştırıcıda bulunması beklenenlerdir (örneğin, kayan noktalar, int'ler, dizeler, listeler, haritalar, ...). İkili veriler gibi daha birçok gelişmiş veri türü, YAML belirtiminde tanımlanmıştır ancak tüm uygulamalarda desteklenmez. Son olarak YAML, kullanıcı tanımlı sınıfları, yapıları veya ilkelleri (örn.

YAML, varlığın veri türünü otomatik olarak algılar, ancak bazen veri türünü açıkça yayınlamak ister. En yaygın durum, sayı, boole veya etiket gibi görünen tek kelimelik bir dizenin, tırnak işaretleri içine alınarak veya açık bir veri türü etiketi kullanılarak belirsizliğin giderilmesini gerektirmesidir.

---
a: 123                     # an integer
b: "123"                   # a string, disambiguated by quotes
c: 123.0                   # a float
d: !!float 123             # also a float via explicit data type prefixed by (!!)
e: !!str 123               # a string, disambiguated by explicit type
f: !!str Yes               # a string via explicit type
g: Yes                     # a boolean True (yaml1.1), string "Yes" (yaml1.2)
h: Yes we have No bananas  # a string, "Yes" and "No" disambiguated by context.

YAML'nin her uygulaması, spesifikasyon tanımlı her veri türüne sahip değildir. Bu yerleşik türler, çift ünlem işareti ön eki ( !!) kullanır. Burada gösterilmeyen özellikle ilginç olanlar kümeler, sıralı haritalar, zaman damgaları ve onaltılık sayılardır. İşte base64 ile kodlanmış ikili veri örneği .

---
picture: !!binary |
  R0lGODdhDQAIAIAAAAAAANn
  Z2SwAAAAADQAIAAACF4SDGQ
  ar3xxbJ9p0qa7R0YxwzaFME
  1IAADs=

YAML'nin 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 uygulamada YAML ayrıştırıcı kitaplığı kullanılarak tanımlanır. Yerel veri türleri tek bir ünlem işareti ( !) kullanır.

---
myObject: !myClass { name: Joe, age: 15 }

Örnek

Veri yapısı hiyerarşisi, anahat girintisi ile korunur.

---
receipt:     Oz-Ware Purchase Invoice
date:        2012-08-06
customer:
    first_name:   Dorothy
    family_name:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      size:      8
      price:     133.7
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Centerville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.
...

Dizelerin tırnak içine alınması gerekmediğine dikkat edin. Girintideki belirli boşluk sayısı, paralel öğeler aynı sola yaslamaya sahip olduğu ve hiyerarşik olarak iç içe yerleştirilmiş öğeler daha fazla girintili olduğu sürece önemsizdir. Bu örnek belge, 7 üst düzey anahtarlı bir ilişkisel diziyi tanımlar: anahtarlardan biri, "öğeler", her bir öğesinin kendisi farklı anahtarlara sahip bir ilişkisel dizi olan 2 öğeli bir liste içerir. İlişkisel veriler ve artıklığın kaldırılması görüntülenir: "gönderim" ilişkisel dizi içeriği, bağlantı ( &) ve başvuru ( *) etiketleriyle belirtildiği gibi "fatura" ilişkisel dizisinin içeriğinden kopyalanır . Okunabilirlik için isteğe bağlı boş satırlar eklenebilir. Tek bir dosyada/akışta birden çok belge bulunabilir ve ile ayrılır ---. Bir ...dosyanın sonunda bir isteğe bağlı kullanılabilir (akışlı iletişimlerde boruyu kapatmadan bir bitiş sinyali vermek için kullanışlıdır).

Özellikleri

girintili sınırlama

YAML, yapı için öncelikle anahat girintisine dayandığından, özellikle sınırlayıcı çarpışmasına karşı dirençlidir . YAML'nin skaler değerlerdeki tırnak işaretleri ve parantezlere karşı duyarsızlığı, XML, JSON ve hatta YAML belgelerinin bir YAML belgesinin içine basitçe bir blok değişmezinde girintilenerek ( |veya kullanılarak >) yerleştirilebileceği anlamına gelir:

---
example: >
        HTML goes into YAML without modification
message: |

        <blockquote style="font: italic 1em serif">
        <p>"Three is always greater than two,
           even for large values of two"</p>
        <p>--Author Unknown</p>
        </blockquote>
date: 2007-06-01

YAML, tüm iç tırnak işaretlerinden alıntı yapılarak ve bunlardan kaçınılarak JSON'a yerleştirilebilir. YAML, ayrılmış karakterlerden ( <, >, &, ', ") kaçarak ve boşlukları dönüştürerek veya bir CDATA bölümüne yerleştirerek XML'e yerleştirilebilir .

Hiyerarşik olmayan veri modelleri

Verileri yalnızca her bir alt düğümün tek bir ebeveyne sahip olduğu hiyerarşik bir modelde temsil edebilen JSON'dan farklı olarak, YAML ayrıca, aynı verinin tekrarlarının ağaçta fazladan girilmek yerine ağaçtaki iki veya daha fazla noktadan referans alınmasına izin veren basit bir ilişkisel şema sunar. o noktalar. Bu, XML'de yerleşik olarak bulunan IDREF tesisine benzer. YAML ayrıştırıcısı daha sonra bu referansları, okunduklarında ima ettikleri tam olarak doldurulmuş veri yapılarına genişletir, böylece ayrıştırıcıyı hangi program kullanırsa kullansın, referansları genişletmeyen XML işlemcilerinin aksine ilişkisel bir kodlama modelinden haberdar olmak zorunda değildir. Bu genişletme, yapılandırma dosyalarındaki veri girişi hatalarını veya yalnızca birkaçı değişirken birçok parametrenin sıralı bir dizi kayıtta aynı kaldığı işlem protokollerini azaltırken okunabilirliği artırabilir. Bir faturadaki "hedef" ve "fatura adresi" kayıtlarının neredeyse her zaman aynı veriler olması buna bir örnektir.

pratik düşünceler

YAML satır yönelimlidir ve bu nedenle, orijinal belgenin görünümünün çoğunu korurken mevcut programların yapılandırılmamış çıktısını YAML formatına dönüştürmek genellikle basittir. Dengelenecek kapanış etiketleri, parantezler veya tırnak işaretleri olmadığından, karmaşık olmayan programlarda doğrudan dağıtılmış baskı ifadelerinden iyi biçimli YAML oluşturmak genellikle kolaydır. Benzer şekilde, boşluk sınırlayıcılar, grep, AWK, Perl, Ruby ve Python'daki satır yönelimli komutları kullanarak YAML dosyalarının hızlı ve kirli filtrelenmesini kolaylaştırır.

Özellikle, biçimlendirme dillerinden farklı olarak, ardışık YAML satırlarının parçaları iyi biçimlendirilmiş YAML belgeleri olma eğilimindedir. Bu, bir belgeyi bütünüyle işlemesi gerekmeyen ayrıştırıcılar yazmayı çok kolaylaştırır (örneğin, açılış ve kapanış etiketlerinin dengelenmesi ve alıntılanan ve kaçan karakterler arasında gezinme), bunlar içindeki belirli kayıtları çıkarmaya başlamadan önce. Bu özellik, tüm veri yapısı bellekte tutulamayacak kadar büyük olan veya bir öğeyi çıkarmak için tüm yapıyı yeniden oluşturmanın aşırı derecede pahalı olacağı bir dosyadaki kayıtlar üzerinde tek, durumsuz geçişte yineleme yaparken özellikle uygundur.

Sezgisel olarak, girintili sınırlandırması derinlemesine iç içe hiyerarşileri karmaşıklaştırıyor gibi görünse de, YAML girintileri tek bir boşluk kadar küçük işler ve bu, biçimlendirme dillerinden daha iyi sıkıştırma sağlayabilir. Ek olarak, aşırı derin girintilerden aşağıdakilerden biri ile tamamen önlenebilir: 1) girinti olmadan "satır içi stile" (yani JSON benzeri biçime) dönülmesi; veya 2) hiyerarşiyi, YAML ayrıştırıcısının şeffaf bir şekilde tam veri yapısında yeniden oluşturacağı düz bir forma gevşetmek için ilişkisel çapalar kullanmak.

Güvenlik

YAML tamamen bir veri temsil dilidir ve bu nedenle yürütülebilir komutları yoktur. Herhangi bir veri dilinde doğrulama ve güvenli ayrıştırma doğal olarak mümkün olsa da , uygulama o kadar kötü bir tuzaktır ki, YAML'nin ilişkili bir komut dili eksikliği göreceli bir güvenlik avantajı olabilir.

Ancak, YAML dile özgü etiketlere izin verir, böylece bu etiketleri destekleyen bir ayrıştırıcı tarafından rastgele yerel nesneler oluşturulabilir. Karmaşık nesne somutlaştırmanın yürütülmesine izin veren herhangi bir YAML ayrıştırıcısı, bir enjeksiyon saldırısı potansiyelini açar. Rastgele sınıfların nesnelerinin yüklenmesine izin veren Perl ayrıştırıcıları, "kutsanmış" değerler olarak adlandırılır. Bu değerlerin kullanılması, örneğin, sınıf aşırı yüklenmiş operatörler kullanıyorsa, beklenmeyen davranışları tetikleyebilir. Bu, keyfi Perl kodunun yürütülmesine neden olabilir.

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

İnternet gibi güvenilmeyen bir kaynaktan bir YAML belgesi alırsanız, rastgele bir Python nesnesi oluşturma yeteneğinin tehlikeli olabileceğini unutmayın. İşlev, yaml.safe_loadbu yeteneği tamsayılar veya listeler gibi basit Python nesneleri ile sınırlar. [...]

PyYAML, herhangi bir türde bir Python nesnesi oluşturmanıza olanak tanır. Hatta Python sınıflarının örnekleri bile !!python/objectetiket kullanılarak oluşturulabilir .

Veri işleme ve temsil

YAML belirtimi, bir örnek belgeyi "Sunum" veya "karakter akışı" olarak tanımlar . Bir YAML örneği belgesindeki birincil mantıksal yapılar skalerler, diziler ve eşlemelerdir. YAML belirtimi, bu birincil mantıksal yapılara uygulanan bazı temel kısıtlamaları da belirtir. Örneğin, şartnameye göre eşleme tuşları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 uygunluğu tanımlarken, YAML belirtimi iki temel işlemi tanımlar: dump ve load . Tüm YAML uyumlu işlemciler bu işlemlerden en az birini sağlamalıdır ve isteğe bağlı olarak her ikisini de sağlayabilir. Son olarak, YAML spesifikasyon, bir tanımlayan bir bilgi modeli hem de işleme sırasında oluşturulmalıdır ya da "temsili grafiği", döküm ve yük Bu temsili bir API üzerinden kullanıcıya yapılmasına gerek yoktur, ancak, operasyon.

Diğer serileştirme biçimleriyle karşılaştırma

JSON ile karşılaştırma

JSON sözdizimi, YAML'yi "resmi bir alt küme olarak JSON ile uyumlu hale getirmek" amacıyla yayınlanmış olan YAML sürüm 1.2'nin temelidir. YAML'nin önceki sürümleri tam olarak uyumlu olmasa da, tutarsızlıklar nadiren fark edilirdi ve çoğu JSON belgesi, Syck gibi bazı YAML ayrıştırıcıları tarafından ayrıştırılabilir. Bunun nedeni, JSON'un anlamsal yapısının, YAML yazmanın isteğe bağlı "satır içi stiline" eşdeğer olmasıdır. Genişletilmiş hiyerarşiler JSON gibi satır içi tarzda yazılabilirken, bu, netliğe yardımcı olduğu durumlar dışında önerilen bir YAML stili değildir.

YAML, yorumlar, genişletilebilir veri türleri, ilişkisel çapalar, tırnak işareti içermeyen dizeler ve anahtar sırasını koruyan eşleme türleri dahil olmak üzere JSON'da eksik olan birçok ek özelliğe sahiptir.

TOML ile karşılaştırma

Bir yandan, YAML, TOML'ye kıyasla çok daha karmaşıktır - YAML spesifikasyonunun 23.449 kelimeye sahip olduğu belirtilirken, TOML spesifikasyonunun sadece 3.339 kelimeye sahip olduğu belirtilmiştir. Öte yandan, YAML daha az ayrıntılı, daha fazla DRY , sözdizimsel olarak daha az gürültülü ve bir belgenin hiyerarşisi girintiden açıkça görülüyor.

XML ile karşılaştırma

YAML, XML'de bulunan etiket nitelikleri kavramından yoksundur. Bunun yerine YAML, genişletilebilir tür bildirimlerine sahiptir (nesneler için sınıf türleri dahil).

YAML'nin kendisi, örneğin bir belgenin kendi kendini doğrulamasını sağlayan XML'in dil tanımlı belge şeması tanımlayıcılarına sahip değildir. Ancak, bu rolü yerine getiren YAML için (örneğin Doctrine , Kwalify ve Rx) harici olarak tanımlanmış birkaç şema tanımlayıcı dili vardır . Ayrıca, YAML'nin YAML belgesindeki dil tanımlı tür bildirimleri tarafından sağlanan anlambilim, genellikle basit, yaygın durumlarda bir doğrulayıcı ihtiyacını giderir. Ek olarak, XML'deki YAML veri yapılarını temsil eden YAXML , XML şeması içe aktarıcılarının ve XSLT gibi çıktı mekanizmalarının YAML'ye uygulanmasına izin verir .

Veri serileştirme biçimlerinin karşılaştırılması, YAML'nin diğer serileştirme biçimleriyle daha kapsamlı bir karşılaştırmasını sağlar.

Yazılım (yayıcılar ve ayrıştırıcılar)

Sabit veri yapıları için, YAML dosyaları, hem verileri hem de YAML'ye özgü dekorasyonu yazan yazdırma komutları kullanılarak kolayca oluşturulabilir . Bununla birlikte, değişen veya karmaşık hiyerarşik verileri boşaltmak için özel bir YAML yayıcı tercih edilir. Benzer şekilde, basit YAML dosyaları (ör. anahtar/değer çiftleri) düzenli ifadelerle kolayca ayrıştırılır. Daha karmaşık veya değişken veri yapıları için resmi bir YAML ayrıştırıcısı önerilir.

YAML yayıcıları ve ayrıştırıcıları birçok popüler dil için mevcuttur. Bunların çoğu ana dilin kendisinde yazılmıştır. Bazıları C kitaplığının libyaml dil bağlamalarıdır ; daha hızlı koşabilirler. Eskiden Syck adında başka bir C kütüphanesi vardı, neden şanslı katının yazdığı ve yetim kaldığı : bakımsız, yetkili bir kaynak paketi yok ve web sitesi ele geçirildi. Bu nedenle önerilen tek C kütüphanesi libyaml'dir . İlk olarak Kirill Simonov tarafından geliştirilmiştir. 2018'de, yeni bakımcılar Ian Cordasco ve Ingy döt Net tarafından geliştirme yeniden başlatıldı .

C++ programcıları, C kitaplığı libyaml ve C++ kitaplığı libyaml-cpp arasında seçim yapabilir . Her ikisi de tamamen bağımsız kod tabanlarına ve tamamen farklı API'lere sahiptir . libyaml-cpp kitaplığının ana sürüm numarası hala 0'dır, bu da API'nin 0.3 sürümünden sonra olduğu gibi her an değişebileceğini gösterir. İç içe öğeler için uzantıları hedefleyen, C# ile yazılmış dilbilgisi odaklı bir uygulama vardır.

Perl'in YAML.pm gibi bazı YAML uygulamaları, bir dosyanın tamamını (akım) yükler ve onu toplu halde ayrıştırır . PyYaml gibi diğer uygulamalar tembeldir ve yalnızca istek üzerine sonraki belge üzerinde yinelenir. Belgeleri bağımsız olarak ele almayı planlayan çok büyük dosyalar için, tüm dosyanın işlenmeden önce somutlaştırılması yasaklayıcı olabilir. Bu nedenle YAML.pm'de bazen bir dosyayı belgelere bölmek ve bunları ayrı ayrı ayrıştırmak gerekir. YAML bunu kolaylaştırır, çünkü bu, bir satırda kendi başlarına üç nokta olarak tanımlanan belge bitiş işaretçisini bölmeyi gerektirir. Bu işaretleyici içerikte yasaktır.

eleştiri

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

  • Konfigürasyon dosyaları, kullanıcılar farkında olmadan komutları yürütebilir veya içerik yükleyebilir.
  • Girinti hataları fark edilmeyebileceğinden büyük YAML dosyalarını düzenlemek zordur.
  • Tür otomatik algılama, bir hata kaynağıdır. Örneğin, alıntı yapılmaz Yesve NObooleanlara dönüştürülür; yazılım sürüm numaraları kayan noktalara dönüştürülebilir.
  • Kesilen dosyalar, sonlandırıcıların olmaması nedeniyle genellikle geçerli YAML olarak yorumlanır.
  • Standardın karmaşıklığı, tutarsız uygulamalara ve dili taşınabilir olmaktan çıkardı.

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

Ayrıca bakınız

Referanslar

Dış bağlantılar