İçeriğe atla

YAML

YAML Formatını Anlamak: İnsan Dostu Veri Serileştirme

5 min read

YAML Formatını Anlamak: İnsan Dostu Veri Serileştirme

Modern yazılım geliştirme, bulut altyapısı veya CI/CD boru hatlarıyla (pipelines) çalıştıysanız, şüphesiz YAML ile karşılaşmışsınızdır. Docker Compose dosyalarından ve Kubernetes manifestlerinden GitHub Actions ve Ansible playbook'larına kadar YAML her yerdedir.

Peki YAML tam olarak nedir? Teknoloji endüstrisi, yapılandırma (configuration) dosyaları için neden XML veya JSON gibi daha eski, köklü formatlar yerine ortaklaşa olarak YAML kullanmaya karar verdi?

Bu kapsamlı rehberde, YAML formatını keşfedecek, sözdizimini (syntax) parçalara ayıracak, artılarını ve eksilerini tartışacak ve yapılandırmanın tartışmasız kralı olmasının nedenlerini anlayacağız.


YAML Nedir?

YAML başlangıçta "Yet Another Markup Language" (Yine Başka Bir İşaretleme Dili) anlamına geliyordu. Ancak yaratıcıları daha sonra bu kısaltmayı özyinelemeli bir akronim (backronym) olarak yeniden tanımladılar: "YAML Ain't Markup Language" (YAML Bir İşaretleme Dili Değildir).

Bu isim değişikliği önemliydi. Yaratıcıları, YAML'ın (metin belgelerini biçimlendirmek için kullanılan HTML veya XML gibi) bir belge işaretleme dili olmadığını vurgulamak istediler. Bunun yerine YAML, bir veri serileştirme dilidir (data serialization language). Tek amacı, veri yapılarını (listeler, diziler ve anahtar-değer çiftleri gibi) hem insanlar hem de makineler tarafından kolayca okunabilecek bir şekilde depolamak ve iletmektir.

YAML'ın Temel Felsefesi

YAML'ın arkasındaki tasarım felsefesi tek bir cümleyle özetlenebilir: Her şeyden önce insan okunabilirliği.

XML ve JSON gibi formatlar verileri yapılandırmak için ağır sözdizimi (parantezler {}, etiketler <tag> ve tırnak işaretleri "" gibi) kullanırken, YAML neredeyse tamamen girintilere (indentation) ve yeni satırlara (newlines) güvenir.


YAML Sözdizimi: Temiz ve Basit

Hem JSON hem de YAML ile yazılmış, bir sunucu yapılandırmasını temsil eden basit bir veri yapısına bakalım.

JSON ile:

{
  "server": {
    "host": "localhost",
    "port": 8080,
    "ssl": true,
    "allowed_users": [
      "alice",
      "bob",
      "charlie"
    ]
  }
}

YAML ile:

server:
  host: localhost
  port: 8080
  ssl: true
  allowed_users:
    - alice
    - bob
    - charlie

Farkı fark ettiniz mi? YAML versiyonu çok daha temizdir. Süslü parantezler yok, endişelenecek sondaki virgüller yok ve dize (string) değerlerinin illa tırnak işaretlerine ihtiyacı yok.

YAML'ın Temel Sözdizimi Kuralları

  1. Girinti (Indentation) Her Şeydir: Python programlama dili gibi, YAML da yapıyı ve iç içe geçmeyi belirtmek için boşluk (whitespace) girintilerini kullanır.
  2. Sekme (Tab) Değil, Boşluk (Space): Girinti için boşluk kullanmak zorundasınız. Farklı metin editörleri sekmeleri farklı şekilde işlediği ve bu durum veri yapısını bozabileceği için YAML spesifikasyonunda sekmeler kesinlikle yasaktır.
  3. Anahtar-Değer Çiftleri: Veriler anahtar: değer (key: value) şeklinde temsil edilir. İki noktadan sonra bir boşluk olması gerektiğine dikkat edin.
  4. Listeler/Diziler: Listeler, bir tire ve ardından gelen bir boşluk (- öğe) kullanılarak oluşturulur.
  5. Yorumlar: YAML, yorum satırlarını (JSON'un aksine) doğal olarak destekler. # sembolünden sonra gelen her şey ayrıştırıcı (parser) tarafından yok sayılır, bu da onu karmaşık yapılandırma dosyalarını belgelemede mükemmel kılar.

YAML DevOps'u Neden Kazandı? (YAML vs. JSON vs. XML)

YAML neden DevOps ve bulut yapılandırması için fiili (de facto) standart haline geldi?

  1. Yorumlar (Comments) Çok Önemlidir: Kubernetes veya CI/CD boru hatları gibi araçlar için yapılandırma dosyaları yüzlerce satır uzunluğunda olabilir. Ekipler için yorum yazabilmek (# Bu veritabanını açar) kesinlikle şarttır. JSON yorumları desteklemez, bu da onu karmaşık yapılandırmalar için anında kötü bir seçim haline getirir.
  2. Minimum Görsel Gürültü: Bir insan gece saat 2:00'de bozulan bir dağıtımı (deployment) düzeltmeye çalışırken 500 satırlık bir yapılandırma dosyasını okuduğunda, her süslü parantez ve virgül görsel yorgunluk ekler. YAML'ın minimalist sözdizimini görsel olarak taramak çok daha kolaydır.
  3. Çok Satırlı Dizeler (Multi-line Strings): YAML, çok satırlı metin dizeleri için (| veya > operatörlerini kullanarak) mükemmel, yerleşik bir desteğe sahiptir. Bu, kabuk (shell) betiklerini doğrudan bir yapılandırma dosyasının içine yerleştirmek için (GitHub Actions veya GitLab CI'da yaygın bir uygulama) inanılmaz derecede kullanışlıdır. Bunu JSON'da yapmak, betiği tek bir satıra yazmayı ve her yeni satır karakterinden (\n) manuel olarak kaçmayı (escape) gerektirir ki bu, okuması ve düzenlemesi tam bir kabustur.

YAML'ın Karanlık Yüzü (Dezavantajları)

Devasa popülaritesine rağmen, YAML eleştirilerden de muaf değildir. En büyük gücü (girinti yoluyla insanın okuyabilmesi) aynı zamanda en büyük zayıflığıdır.

1. Boşluk (Whitespace) Tuzağı

Yapı tamamen görünmez boşluklara dayandığından, eksik tek bir boşluk veya kazara atılmış bir sekme (tab) karakteri bir YAML dosyasını tamamen bozabilir. Devasa bir YAML dosyasındaki bir girinti hatasının izini sürmek inanılmaz derecede sinir bozucu olabilir.

2. "Norveç Problemi" (Norway Problem)

YAML veri türlerini otomatik olarak tahmin ederek akıllı olmaya çalışır. Örneğin, true değerinin bir boolean, 123'ün ise bir tam sayı olduğunu tahmin eder. Ancak bu durum kötü şöhretli hatalara yol açmıştır. Eğer bir ülke kodları listeniz varsa ve Norveç'i (NO) eklerseniz, YAML otomatik olarak NO'yu boolean false (Hayır/Yok) değeri olarak ayrıştırabilir. Bir yazılım sürümünüz 2.0 ise YAML bunu kayan noktalı bir sayı (float) olarak ayrıştırabilir, ancak 2.1.0 olarak güncellediğinizde aniden bir metin dizesine (string) dönüşür. Bunu düzeltmek için geliştiriciler genellikle şüpheli değerleri tırnak içine almak ("NO") zorunda kalırlar.

3. Karmaşık Ayrıştırıcılar (Parsers)

YAML'ın insanlar tarafından okunması kolay olsa da, resmi YAML spesifikasyonu devasa derecede karmaşıktır. YAML için bir ayrıştırıcı oluşturmak JSON için oluşturmaktan çok daha zordur ve farklı ayrıştırıcılar bazen uç (edge) durumları farklı yorumlar.


Sonuç

YAML, modern yapılandırma dosyalarının tartışmasız standardıdır. XML ve JSON'un katı, makine dostu katılığını temiz, minimalist, insan tarafından okunabilen bir tasarımla takas etti. Boşluklara dayanması zaman zaman baş ağrısına neden olabilse de, yorumları ve çok satırlı dizeleri destekleme yeteneği onu dünya çapındaki DevOps mühendisleri, sistem yöneticileri ve yazılım geliştiricileri için vazgeçilmez bir araç haline getirmektedir.

Veri yapılarını çevirmeniz gerekirse, yerleşik araçlarımız YAML'ı JSON'a veya tam tersine anında dönüştürerek size her iki dünyanın da en iyisini sunabilir.

Buy me a coffee