Tom’s Obvious Minimal Language หรือที่เราเรียกกันติดปากว่า TOML คือภาษาสำหรับเขียนไฟล์การตั้งค่า ( Configuration file ) ที่เน้นความเรียบง่ายและอ่านง่ายสำหรับมนุษย์ ในขณะที่คอมพิวเตอร์ก็สามารถประมวลผลได้แม่นยำครับ ชื่อนี้มาจากผู้สร้างคือ Tom Preston-Werner ( หนึ่งในผู้ก่อตั้ง GitHub ) โดยเขาตั้งใจออกแบบมาให้ดีกว่า JSON ในแง่ความอ่านง่าย และมีความซับซ้อนน้อยกว่า YAML
รู้จักรูปแบบนี้ครั้งแรกตอน Stalwart mail server: reset admin password เป็นการแก้ config ที่ดูง่ายเลยสนใจมันขึ้นมาว่ามันคืออะไร แล้วก็เจออะไรที่มันต่างจากที่คาดเอาไว้
- Initial Commit: Tom Preston-Werner ได้ทำการ Commit โค้ดครั้งแรกบน GitHub เมื่อวันที่ 24 กุมภาพันธ์ 2013 ซึ่งถือเป็นวันเกิดอย่างเป็นทางการของโปรเจกต์นี้
- Version 1.0.0: แม้จะถูกนำไปใช้อย่างแพร่หลายในเครื่องมือดัง ๆ ( เช่น Rust’s Cargo ) มานานหลายปี แต่ตัว Spec เพิ่งจะประกาศสถานะเสถียร ( Stable ) เป็นเวอร์ชัน 1.0.0 เมื่อเดือน มกราคม 2021 นี่เองครับ
- แรงบันดาลใจ: Tom สร้างมันขึ้นมาเพราะเขารู้สึกขัดใจกับความซับซ้อนของ YAML และความ “ไม่เป็นมิตรต่อมนุษย์” ในการเขียน Config ของ JSON เขาเลยหยิบเอาความเรียบง่ายของไฟล์
.iniมาปัดฝุ่นใหม่ให้มีมาตรฐานที่ชัดเจนขึ้น ก็ว่าทำไมมันคุ้น ๆ เพื่อนเก่านี่เอง
🛠 โครงสร้างและจุดเด่นของ TOML
TOML ถูกออกแบบมาให้ Map เข้ากับ Hash Table ( หรือ Dictionary / Objects ) ได้แบบ 1:1 โดยมีองค์ประกอบหลักดังนี้
- Key-Value Pairs
ใช้เครื่องหมาย=ในการกำหนดค่า เหมือนการเขียนตัวแปรทั่วไปtitle = "TOML Example" enabled = true
- Tables ( Sections )
ใช้เครื่องหมาย[ ]เพื่อแบ่งกลุ่มข้อมูล ( เหมือนส่วนหัวข้อในไฟล์ .ini )[database] server = "192.168.1.1" ports = [ 8000, 8001, 8002 ]
- Arrays of Tables
ใช้[[ ]]สำหรับสร้าง List ของ Object ซึ่งมีประโยชน์มากในการเก็บข้อมูลที่มีโครงสร้างซ้ำ ๆ[[products]] name = "Hammer" sku = 738594937 [[products]] name = "Nail" sku = 284758393
เปรียบเทียบกับ Format อื่น
| คุณสมบัติ | TOML | JSON | YAML |
| ความอ่านง่าย | สูงมาก ( คล้ายภาษาคน ) | ปานกลาง ( วงเล็บเยอะ ) | สูง ( แต่ระวังเรื่องการย่อหน้า ) |
| ความซับซ้อน | ต่ำ | ต่ำ | สูงมาก |
| Comment | รองรับด้วย # | ไม่รองรับ | รองรับด้วย # |
| Data Types | ระบุวันที่/เวลาได้ชัดเจน | จำกัด | หลากหลาย |
💡 ทำไมถึงควรใช้ TOML?
- โครงสร้างชัดเจน: ใช้คู่ลำดับ Key = Value และรองรับการจัดกลุ่มข้อมูลเป็น Table
[table_name]และย่อยลงไปอีก ([sub.table]) - ลดความผิดพลาด: ต่างจาก YAML ตรงที่ TOML ไม่ซีเรียสเรื่องจำนวน Space หรือการย่อหน้า ( Indentation ) ทำให้โอกาสพังเพราะเคาะ Space ผิดมีน้อยกว่า
- เน้นการตั้งค่าโดยเฉพาะ: เหมาะมากกับไฟล์อย่าง
pyproject.toml( Python ),Cargo.toml( Rust ) หรือไฟล์ Config ของโปรแกรมสมัยใหม่ - Strongly Typed: มีการระบุประเภทข้อมูลที่ชัดเจน ทั้ง String, Integer, Float, Boolean, และ Datetime
- รองรับกว้างขวาง: มี Parser รองรับหลายภาษาโปรแกรมมิ่ง ( C, C++, Go, Java, Python, Rust ฯลฯ )
[!CAUTION] ข้อควรระวัง: แม้ TOML จะใช้ง่าย แต่ถ้าโครงสร้างข้อมูลของคุณมีความลึก ( Nested ) หลายชั้นมาก ๆ การเขียน TOML อาจจะดูเยิ่นเย้อกว่า JSON หรือ YAML ได้ครับ
อ่านเพิ่มเติม