YAML（YAML Ain't Markup Language）は、人間にとって読み書きが容易で、機械にとっても解析しやすいフォーマットであり、データのシリアライズや構造化、設定ファイルやメッセージ交換など、様々な用途に利用されます。YAMLは、XMLやJSONと同様に、コンピューターシステム間でデータを交換する際の共通のフォーマットの1つです。この記事では、YAMLの基本的な概念やシンタックス、データ構造などについて解説します。
YAML (YAML Ain't Markup Language) は、人間にとって読みやすく、理解しやすいデータシリアライゼーション言語です。XML や JSON と同様に、データの表現に使用されます。YAML は、Tom Preston-Werner、Oren Teich、Clark Evans によって開発され、2001年に最初にリリースされました。YAML はフリーでオープンソースの規格であり、Ruby on Rails や Python などの多くのプログラミング言語で使用されています。
[YAMLがどのようなものか、誕生経緯やバージョンの歴史を紹介]
YAMLは、元々はテストデータや設定ファイルを表現するためのデータシリアライゼーション言語として開発されました。YAMLは、XMLやJSONの代替手段として設計され、プログラマーや非プログラマーの両方が使いやすくすることを目的としています。
初めてのYAML仕様は2001年にリリースされ、その後数多くの改訂版がリリースされてきました。現在、YAMLはRuby on RailsやPythonなどの多くのプログラミング言語で使用されています。最新のYAML仕様はYAML 1.2です。
[JSONやXMLに比べて、どのような利点があるかを紹介]
YAMLは、JSONやXMLに比べていくつかの利点があります。以下にその一部を紹介します。
読みやすさと書きやすさ
YAMLは、人間が読み書きしやすい構文を持っています。ネストされたデータ構造を表現する場合にも、インデントによって視覚的に分かりやすくなっています。そのため、設定ファイルやデータファイルなど、人間が読むことが多いデータを扱う場合に非常に有効です。
柔軟性
YAMLは、JSONやXMLに比べて柔軟な表現ができます。例えば、JSONではできない、複数行にまたがる文字列や複数のデータ構造の組み合わせなどが可能です。また、JSONやXMLでは、データの型が制限されていますが、YAMLでは、ほぼすべてのデータ型を表現することができます。
多言語対応
YAMLは、多言語に対応しています。Unicode文字集合を使用しているため、世界中の言語を表現することができます。
拡張性
YAMLは、独自の拡張を定義することができます。これにより、特定のアプリケーションに合わせた独自のデータ型や構文を定義することができます。また、既存の拡張を再利用することも可能です。
以上が、YAMLの主な利点です。これらの利点により、YAMLは、設定ファイルやデータファイルのような、人間が読み書きすることが多いデータを扱う場合に非常に有効なフォーマットとなっています。
YAMLの文法的な特徴は以下のようになります。
インデントを用いたネスト表現：インデント（空白文字）を使用することで、データのネストを表現します。インデントにより、ネストされた構造を視覚的に分かりやすく表現できます。
コメント：#を用いたコメントを記述することができます。コメントは、解説やメモなどを記述するために使用されます。
シンプルなデータ型の表現：文字列、数値、真偽値、nullなどのシンプルなデータ型を表現することができます。これらのデータ型は、特別な表現方法を必要とせず、そのまま記述することができます。
複合データ型の表現：配列やマップなどの複合データ型を表現することができます。配列は、[ ]内にカンマ区切りで要素を記述し、マップは、{ }内にキーと値をコロン区切りで記述します。
マージ機能：&と*を用いて、同じ構造を持つデータの一部を共通化することができます。&を用いて、共通化したい部分に名前を付け、*を用いて、その名前を参照することで、共通化を実現します。
折り返し：長い文字列やリストの要素を複数行にまたがって表現することができます。これは、文字列の途中で改行する場合や、リストの要素が多数存在する場合などに有用です。
これらの文法的な特徴により、YAMLは、人間にとって読みやすく理解しやすい表現をすることができます。
YAMLは、以下の基本的なデータ型を扱うことができます。
スカラー：文字列や数値、ブール値、nullなどの基本的なデータ型を表現する方法です。
コメント：YAMLでのコメントの書き方と、コメントの使い方を紹介します。
シーケンス：配列のようなデータ構造を扱う方法を紹介します。
マッピング：キーと値のペアを扱う方法を紹介します。
[文字列や数値、ブール値、nullなどの基本的なデータ型を紹介]
YAMLでは、次のような基本的なデータ型をスカラーと呼びます。
文字列：シングルクォートやダブルクォートでくくった文字列を表します。ダブルクォートでくくった文字列では、エスケープシーケンスを使って、特殊文字を表すことができます。
数値：整数や浮動小数点数を表します。負の数も表現できます。
ブール値：trueとfalseを表します。
null：何も値がないことを表します。
例えば、次のYAMLは、上記のスカラー型を使って、値を表現しています。
name: 'John Smith'
age: 30
is_student: true
nickname: null
注意点としては、スカラーの値を表現するとき、必ずしもクォートで囲う必要はありません。例えば、次のYAMLも同じように解釈されます。
name: John Smith
age: 30
is_student: true
nickname: null
[YAMLでのコメントの書き方と、コメントの使い方を紹介]
YAMLでは、# を用いてコメントを書くことができます。# の後ろに書かれたテキストは、行の終わりまでがコメントとして扱われます。
key: value # ここにもコメントを書くことができます
[配列のようなデータ構造を扱う方法を紹介]
シーケンスは、配列のようなデータ構造を扱う方法です。- を用いて要素を記述します。
- apple
- orange
- banana
シーケンスは、配列だけでなく、オブジェクトのリストとしても使用することができます。
- name: John
  age: 25
- name: Jane
  age: 30
[キーと値のペアを扱う方法を紹介]
マッピングは、キーと値のペアを扱う方法です。キーと値は、: を用いて区切ります。
key1: value1
key2: value2
マッピングの値には、スカラー値だけでなく、シーケンスやネストしたマッピングを含めることができます。
key1: [value1, value2]
key2:
  subkey1: subvalue1
  subkey2: subvalue2
[同じオブジェクトを参照する方法を紹介]
同じオブジェクトを複数の場所で使いたい場合、アンカーを使って参照することができます。アンカーは「&」を使って定義し、「*」を使って参照します。
例えば、以下のように、同じリストを二箇所で使用する場合、アンカーを使って同じリストを定義しています。
list1: &mylist [apple, banana, orange]
list2: *mylist
[アンカーで定義したオブジェクトを参照する方法を紹介]
アンカーで定義したオブジェクトを参照する場合、エイリアスを使用することができます。エイリアスは「*」を使って定義します。
例えば、以下のように、アンカーで定義したオブジェクトをエイリアスで参照しています。
list1: &mylist [apple, banana, orange]
list2: *mylist
list3: *mylist
[データ型を指定する方法を紹介]
YAMLでは、データ型を指定することができます。この機能をタグと呼びます。タグは「!」を使って指定します。
例えば、以下のように、int型として指定している例です。
age: !int 20
[長い文字列を複数行に分けて書く方法を紹介]
長い文字列を複数行に分けて書く場合、折り返しを使って書くことができます。折り返しは、文字列の最後に「>」を付けて記述し、次の行から続けて書くことができます。
例えば、以下のように、折り返しを使った例です。
description: >
  This is a long description.
  It is too long to fit on one line,
  so we use the folded style instead.
YAMLには、「ブロックスタイル」と「インラインスタイル」という2つの書式があります。インラインスタイルは、ブロックスタイルで書かれたデータの一部分をコンパクトに表現するために使用されます。以下に、インライン構文の例を示します。
シンプルなスカラーの表現
name: John Smith
age: 25
married: true
hobbies: null
配列の表現
fruits: [apple, banana, orange]
values: [1, true, "three"]
マップの表現
person: { name: John Smith, age: 25, married: true }
person2: { name: John Smith, age: 25, hobbies: null }
オブジェクトの参照
person1: &anchor { name: John Smith, age: 25 }
person2: *anchor
折り返し
description: >
  This is a long description that
  spans multiple lines. YAML
  allows you to write it in a
  compact form and still have it
  interpreted as a single string.
YAMLは、様々な用途で利用されることができます。ここでは、その中でも代表的な3つの使用例を紹介します。
[設定ファイルとしてのYAMLの利用方法を紹介]
YAMLは、設定ファイルの記述に利用されることがあります。設定ファイルは、ソフトウェアの動作に必要な設定値を記述するファイルで、一般的にはテキストファイルとして保存されます。例えば、Webアプリケーションの設定ファイルには、データベースの接続情報やログの保存先などが記述されます。YAMLは、設定値をキーと値のペアで表現することができるため、設定ファイルの記述に適しています。
[プログラムのデータ構造をYAMLで表現する方法を紹介]
YAMLは、プログラムのデータ構造をYAML形式で保存することができます。このような使い方を「データシリアライゼーション」と呼びます。データシリアライゼーションを利用することで、プログラムで扱うデータをファイルに保存したり、ネットワークを通じて他のプログラムに送信することができます。YAMLは、データの可読性が高く、構造化された形式で表現されるため、データシリアライゼーションに適しています。
[HTMLやXMLに代わるマークアップ言語としてのYAMLの利用方法を紹介]
HTMLやXMLは、Webページの記述に利用されるマークアップ言語です。YAMLは、このようなマークアップ言語の代替として利用することができます。YAMLを利用することで、Webページの構造を表現することができます。また、YAMLは、HTMLやXMLに比べて構文が簡単で、記述量も少なくなるため、開発の効率化につながります。ただし、YAMLは、Webブラウザで直接解釈することはできないため、HTMLやXMLと同様に変換が必要となります。
YAMLの実装には、様々なライブラリやツールが存在します。
YAMLライブラリ：YAMLのパースやシリアライズを行うためのライブラリ。多くのプログラミング言語で利用可能であり、一般的には標準ライブラリやサードパーティライブラリとして提供されています。
YAMLパーサー：YAMLファイルを解析するためのツール。YAMLライブラリには、一部の言語ではパーサーが内蔵されている場合もありますが、独立したパーサーツールも存在します。
YAMLエディター：YAMLファイルを編集するためのツール。テキストエディターとしても利用可能ですが、YAMLの構造を視覚的に表現するエディターや、YAMLのスキーマを定義して入力を補完するエディターなどもあります。
例えば、Pythonで利用可能なYAMLライブラリとしては、PyYAMLが有名です。また、Rubyでは、標準ライブラリとしてYAMLがサポートされています。YAMLパーサーとしては、Node.jsのyaml-jsや、JavaのSnakeYAMLなどがあります。YAMLエディターとしては、Visual Studio CodeのYAML Supportや、IntelliJ IDEAのYAML/Ansible supportなどがあります。
{{コラム|YAMLとJSON|2=YAMLとJSONは、どちらも人間に読み書きしやすいデータ形式で、データの構造化や交換に広く使われています。YAMLはJSONに比べていくつかの利点がありますが、JSONとの互換性も高く、両方を使い分けることができます。
まず、YAMLとJSONの違いについて考えてみましょう。YAMLは、人間にとって読み書きしやすく、自然な表現を提供します。JSONは、コンピュータにとって読み書きしやすく、シンプルな表現を提供します。そのため、JSONはプログラミング言語でよく使用されますが、YAMLは設定ファイルやドキュメントなど、より人間中心の用途に向いています。
ただし、YAMLはJSONの上位互換であるため、JSONで表現できるデータはすべてYAMLでも表現できます。さらに、YAMLではJSONよりも多くのデータ型をサポートしています。例えば、日付、正規表現、バイナリデータ、マルチラインの文字列などがあります。
また、YAMLではJSONと同様に、ネストされた構造を持つことができますが、YAMLの方が柔軟性が高いです。YAMLでは、複数のオブジェクトをまとめて表現することができる「フロー・スタイル」という表現方法があります。フロー・スタイルを使用することで、より簡潔なコードを記述できます。
以上のように、YAMLとJSONはそれぞれ長所と短所がありますが、互換性が高く、両方を使い分けることができます。YAMLが提供する機能を活用しながら、JSONとの互換性も保つことで、より柔軟かつ効率的なデータ処理を行うことができます。
key1: value1
key2: 'value2'
key3: 123
key4: true
key5: null
seq1:
  - item1
  - item2
  - item3
seq2: ['item4', 'item5', 'item6']
map1:
  key1: value1
  key2: value2
map2: {'key3': 'value3', 'key4': 'value4'}
&anchor1
key1: &anchor2 value1
key2: *anchor2
folded_scalar: >
  This is a very long string
  that will be folded across
  multiple lines.
int_value: !!int '123'
date_value: !!timestamp '2023-04-13T12:34:56Z'
YAMLのEBNFは以下のようになります。
stream         ::= document*
document       ::= directive? node
directive      ::= "%YAML" version | "%TAG" handle prefix
version        ::= "1." [0-9]+
handle         ::= [A-Za-z0-9]+
prefix         ::= URI
node           ::= alias | scalar | sequence | mapping
alias          ::= "*" anchor
anchor         ::= name
scalar         ::= plain-scalar | quoted-scalar
plain-scalar   ::= chars-without-blank*
quoted-scalar  ::= double-quoted | single-quoted
double-quoted  ::= '"' (quoted-text | (backslash special))* '"'
single-quoted  ::= "'" (quoted-text | (backslash "'"))* "'"
quoted-text    ::= chars-without-quote | "'"
backslash      ::= "\\"
special        ::= [0x00-0x19] | '"' | '\' | '{' | '}' | '[' | ']' | '&' | '*' | '#' | '?' | '|' | '-' | '<' | '>' | '=' | ':' | ',' | '+' | '~' | '!'
sequence       ::= "[" node ("," node)* "]"
mapping        ::= "{" (map-entry ("," map-entry)*)? "}"
map-entry      ::= scalar ':' node
chars-without-blank ::= [^\x09\x0a\x0d ]+
chars-without-quote ::= [^\x22\x27\x5c]+
EBNFは、Extended Backus-Naur Formの略称であり、プログラミング言語やマークアップ言語の文法を表現するためによく使用されます。上記のEBNFは、YAMLの文法をフォーマルな規則で表現しています。YAMLのEBNFを知っていると、YAMLの文法を理解するのに役立ちます。
YAML（YAML Ain't Markup Language）：XMLやJSONなどと同じくデータの表現形式の一つで、構造化されたデータを人間が読みやすい形式で表現するためのフォーマット。拡張子は「.yml」または「.yaml」。
スカラー（scalar）：文字列や数値、ブール値、nullなどの基本的なデータ型。
シーケンス（sequence）：配列のようなデータ構造を扱う方法。ハイフン（-）で表現し、各要素は改行で区切る。
マッピング（mapping）：キーと値のペアを扱う方法。コロン（:）で表現し、各要素は改行で区切る。
アンカー（anchor）：同じオブジェクトを参照するための方法。アンカー名は「&」に続いて名前を指定する。
エイリアス（alias）：アンカーで定義したオブジェクトを参照するための方法。エイリアス名は「*」に続いてアンカー名を指定する。
タグ（tag）：データ型を指定するための方法。値の先頭に「!」をつけて指定する。
折り返し（folded style）：長い文字列を複数行に分けて書く方法。改行コードを空白に変換し、インデントのレベルを維持することで実現する。
設定ファイル（configuration file）：アプリケーションの設定情報を記述するファイル形式。YAMLが利用されることがある。
データシリアライゼーション（data serialization）：プログラムのデータ構造をファイルやネットワークを通じて送受信するための処理。YAMLが利用されることがある。
マークアップ言語（markup language）：文書を構造化して表示するための言語。HTMLやXMLが代表的。YAMLもマークアップ言語として利用されることがある。
YAMLライブラリ（YAML library）：YAMLを扱うためのライブラリ。各プログラミング言語には、YAMLライブラリが用意されている。
YAMLパーサー（YAML parser）：YAMLファイルを読み込んで解析するプログラムのこと。