Apa kelebihan notasi XML-S-expressions (-ish)?

11

Saya ingin mengajukan pertanyaan tentang notasi XML dan S-expressions (-ish). S-ekspresi cukup tua; mereka juga sangat sederhana. Kita dapat mempertimbangkan dua bentuk yang memiliki arti yang sama, berbeda dalam sintaksisnya:

(kode xml diambil dari wikipedia bahasa Polandia )

<?xml version="1.0" encoding="UTF-8"?>
<ksiazka-telefoniczna kategoria="bohaterowie książek">
 <!-- komentarz -->
  <osoba charakter="dobry">
    <imie>Ambroży</imie>
    <nazwisko>Kleks</nazwisko>
    <telefon>123-456-789</telefon>
  </osoba>
  <osoba charakter="zły">
    <imie>Alojzy</imie>
    <nazwisko>Bąbel</nazwisko>
    <telefon/>
  </osoba>
</ksiazka-telefoniczna>

Versi S-Ekspresi (-ish):

(:version "1.0" :encoding "utf-8")
(ksiazka-telefoniczna :category "bohaterowie książek"
  ; komentarz(a comment)
  (osoba :charakter "dobry"
    (imie Ambroży)
    (nazwisko Kleks)
    (telefon 123-456-789))
  (osoba :charakter "zły"
    (imie Alojzy)
    (nazwisko Bąbel)
    (telefon)))

Versi S-Expression jauh lebih ringkas. Kami menghindari redundansi dengan menggunakan notasi daftar sederhana, namun kami masih dapat mendefinisikan sintaks untuk memasukkan hal-hal yang ingin kami miliki (mis. Properti). Tentu saja, ini hanya sebuah contoh, dan standar aktual bisa saja lebih baik atau hanya berbeda; Namun, ini lebih pendek dan lebih mudah diurai. Mengapa XML menang?

MatthewRock
sumber
3
XML bukan S-Ekspresi
Robert Harvey
5
Untuk downvoters: jangan downvote jika Anda tidak setuju dengan pertanyaan, tetapi jika Anda pikir itu berkualitas buruk (dan kemudian, usulkan perubahan untuk meningkatkan kualitas). @RobertHarvey Jika Anda berpikir itu adalah jawaban, tolong, jawab pertanyaan saya alih-alih memberikan komentar.
MatthewRock
1
Tooltip atas tombol downvote mencakup frasa "pertanyaan ini tidak menunjukkan upaya penelitian apa pun."
Robert Harvey
1
Coba ingat bahwa ini bukan forum diskusi. Pertanyaan nyata memiliki jawaban, dan anggota masyarakat diharapkan memberikan jawaban, bukan pendapat.
Robert Harvey
1
Argumen redundansi untuk XML (seperti memiliki tanda kurung tutup dengan nama braket pembuka) dapat dengan mudah ditiru oleh ekspresi-S. Cukup tulis (para "This is a paragraph " (footnote "(better than the one under there)" "." /footnote) /para).
Andrew

Jawaban:

13

Kita tahu bahwa perancang XML sudah terbiasa dengan ekspresi S, karena XML didasarkan pada SGML, dan SGML memiliki bahasa style sheet, DSSSL, yang menggunakan sintaks ekspresi-S (dan skema sebagai bahasa skrip tertanam).

Namun demikian mereka memilih sintaks yang berbeda dari ekspresi S karena kasus penggunaan untuk XML. XML pada awalnya dirancang untuk mendukung data terstruktur yang dihasilkan mesin dan bahasa markup seperti HTML, yang ditulis secara manual dan berisi konten campuran (teks yang bercampur dengan elemen-elemen dengan metadata).

Redundansi

Dokumen teks markup seringkali lebih panjang dari satu layar penuh. Jika Anda melihat a )dan Anda tidak dapat melihat awal struktur, Anda sangat tersesat; Anda tidak tahu apakah itu bab atau bilah sisi yang baru saja berakhir. Redundansi pengulangan tagname dalam endtags dalam XML seperti </sidebar>membuat ini jauh lebih mudah bagi penulis manusia. Itu juga membuatnya lebih kuat: jika Anda secara tidak sengaja menghapus tag akhir, Anda sering dapat menyimpulkan tag akhir mana yang hilang.

SGML (pendahulu ke XML) memungkinkan Anda untuk secara singkat mempersingkat tag-akhir menjadi satu karakter, tetapi fitur ini tidak disertakan dalam XML untuk kesederhanaan.

Jadi singkatnya, XML lebih berdasarkan desain, karena dirancang untuk mendukung dokumen yang dapat diedit manusia. Hari ini XML digunakan untuk berbagai keperluan, juga untuk komunikasi mesin-ke-mesin murni, di mana redundansi ini tidak diperlukan.

Konten campuran

Sintaks yang Anda sarankan tidak akan mendukung konten campuran dengan baik. Ambil contoh ini dalam HTML:

<p>Hi! <a href="example.com">Click here</a>!</p>

Bagaimana Anda mengungkapkan ini dalam sintaksis Anda? Anda membutuhkan pembatas tambahan untuk membedakan antara atribut dan konten teks. Tiba-tiba itu tidak begitu ringkas lagi.

Karakter spesial

Kurung sudut jauh lebih jarang dalam teks biasa daripada tanda kurung dan titik dua.

Kesesuaian

HTML sudah sangat sukses pada saat XML dirancang, dan masuk akal untuk memilih sintaksis yang sama.

Mengapa XML menang?

S-expressions tidak pernah menjadi alternatif untuk XML. Spesifikasi XML lebih dari sekadar kurung sudut; Ini mendefinisikan sintaks untuk elemen dan atribut dan konten campuran, melarikan diri, pengkodean karakter, sintaksis DTD dan validasi dan sebagainya. Tidak ada yang serupa untuk ekspresi-s. Tentu saja Anda dapat mendefinisikan standar yang sama, seperti yang Anda usulkan di sini, tetapi tidak ada yang melakukan ini pada saat itu. XML diberkati oleh W3C dan karenanya diadopsi oleh pemain utama dan menjadi standar defacto untuk pertukaran data.

JacquesB
sumber
3
Dalam contohnya, bukankah titik dua digunakan untuk atribut? E. g. (halo! (a: href "example.com" Klik di sini)!)? (Atau apakah dia baru mengeditnya setelah jawaban Anda diposting?)
Headcrab
Meskipun tidak mengambil apa pun dari jawaban Anda (luar biasa), siapa yang waras secara manual membuat dokumen XML?
Jared Smith
Hai Jacques, terima kasih atas jawaban yang luar biasa ini! Saya setuju dengan Headcrab bahwa konten campuran tidak menjadi masalah. Saya juga setuju dengan Jared, meskipun saya kira XML kadang-kadang dibaca / ditulis secara manual.
MatthewRock
@ Headcrab: Sulit untuk mengatakan karena tidak ada spesifikasi aktual, hanya sebuah contoh hipotetis. Tapi menurut saya mewakili teks sebagai simbol daripada string yang dikutip akan menyebabkan ambiguitas dengan spasi putih. S-expressions tidak mendukung spasi kosong yang signifikan antara atom AFAIK, tetapi Anda memerlukan ini untuk mendukung misalnya <PRE>elemen dalam HTML. Jadi saya berasumsi bahwa kutipan akan diperlukan.
JacquesB
2
Jadi sepertinya XML dibuat dengan semua lonceng dan peluit ini dan sintaksis mirip HTML yang membantunya memenangkan ekspresi-s pada saat itu. Pada saat banyak pengembang memutuskan bahwa, dalam kasus penggunaan mereka, semua fitur ini tidak benar-benar diperlukan untuk komunikasi mesin-ke-mesin, ada alternatif ringan yang berbeda dalam bentuk JSON.
kamilk
9

Secara pribadi, saya pikir bagian terbaik tentang XML adalah kemampuan skema yang terdefinisi dengan baik, daripada sintaksinya. Mekanisme skema memungkinkan pengguna untuk mempublikasikan format dokumen mereka untuk membagikan apa yang mereka anggap dokumen yang valid. Ada juga validator otomatis. Plus, jenis dan skema yang dibuat oleh satu pengguna dapat diperluas oleh pengguna lain.

Sejauh yang saya tahu tidak ada yang membuat upaya mendekati untuk membakukan mekanisme tujuan umum skema untuk ekspresi-s, kecuali untuk bahasa LISP itu sendiri (yang sampel dalam pertanyaan OP tidak menggunakan).

Erik Eidt
sumber
1
Meskipun saya tidak suka verbositas XML, +1 untuk menyebutkan kemampuan skema yang hampir membuatnya layak. :-)
user949300
1

Berikut adalah dua alasan mengapa saya akan memilih XML daripada sesuatu "S-ekspresi-ish":

Model sintaksis dan semantik yang terdefinisi dengan baik

XML bukan hanya pohon node, tetapi pohon node yang dikategorikan yang memiliki representasi sintaksis yang berbeda dan perilaku yang berbeda. Misalnya, atribut dengan nama yang diberikan hanya dapat muncul sekali untuk node yang diberikan, sedangkan node anak dapat muncul beberapa kali.

Anda bisa mendefinisikan model seperti itu di atas ekspresi S umum. Contoh Anda menunjukkan skema untuk mengelompokkan atribut dan elemen anak. Tambahkan semantik untuk teks, komentar, dan instruksi pemrosesan, dan Anda akan memiliki sesuatu yang isomorfik dengan XML.

Alat

Dari model sintaksis dan semantik standar, Anda dapat membuat alat - dan banyak orang memilikinya. Anda dapat menemukan beberapa bentuk parser XML / serializer, XPath, dan prosesor XSLT untuk setiap bahasa / platform umum. Dan Anda tahu bahwa mereka semua akan berperilaku sama di setiap platform.


Dan berikut ini beberapa hal lain yang perlu dipertimbangkan:

Dalam skema besar, XML bukanlah kata yang tepat

Dalam contoh Anda, apa yang sebenarnya telah Anda hilangkan? Saat saya membacanya, Anda sudah:

  • Hilangkan tag penutup untuk setiap ekspresi.
  • Menghilangkan tanda >yang biasanya memisahkan tag pembuka dari anak-anaknya.
  • Mengganti =yang memisahkan nama atribut dan nilai dengan a :untuk menunjukkan bahwa anak adalah atribut; tidak ada tabungan.

Saya pikir penting juga untuk mengenali bahwa representasi XML internal dan eksternal sangat berbeda. Secara internal, pohon XML sangat kompak. Dan karena berbagai elemen sudah dikategorikan, itu sangat efisien untuk memanipulasi. Secara eksternal, yah, Anda mendapatkan semua tag penutup, tetapi kompresnya baik.

Apakah "verbal" adalah masalah sebenarnya?

Saya pikir pertanyaan sebenarnya bukanlah apakah XML "verbose", tetapi apakah itu lebih ekspresif daripada yang diperlukan untuk tujuan tertentu. Beberapa contoh:

  • Kemampuan suatu elemen untuk memegang atribut, yang secara semantik berbeda dari elemen anak. Berguna untuk informasi out-of-band, seperti menggambarkan tipe data asli, konten elemen. Tetapi mungkin Anda tidak membutuhkannya, karena spesifikasi eksternal Anda menentukan konten.
  • Konten campuran, di mana suatu elemen dapat menampung elemen anak dan teks (serta komentar dan instruksi pemrosesan). Berguna untuk markup, tapi mungkin tidak untuk representasi data sederhana.
kdgregory
sumber