Mengapa CSS tidak mengizinkan komentar single-line? [Tutup]

13

Saya mengerti bahwa CSS hanya mendukung komentar multi-line seperti itu

/* foobar */

Mengapa tidak ada dukungan untuk komentar satu baris.

// foobar

Mereka sama umum dalam pemrograman dan tampaknya sangat berguna untuk bahasa seperti CSS di mana setiap aturan ada pada baris itu sendiri.

Jika tidak ada alasan historis khusus untuk keputusan ini, apa yang mencegah browser bergerak mendukungnya?

Angsa
sumber
3
Itu keputusan yang buruk. Mereka harus mengizinkan komentar satu baris.
Tulains Córdova
1
@ Goose: apakah Anda sudah melihat sass-lang.com ?
kevin cline
1
@ TulainsCórdova Saya tidak menganjurkan jawaban, hanya menunjukkan bahwa diskusi ini sudah ada.
Eric King
2
Pertanyaan itu memang mendapatkan jawaban yang lebih teknis daripada jawaban di sini. "CSS memperlakukan baris baru seperti semua spasi putih lainnya, dan tidak akan dapat menentukan akhir dari komentar tanpa pembatas penghentian."
Angsa

Jawaban:

8

Kompatibilitas mundur

Memperkenalkan komentar baris tunggal ke sintaks CSS dapat mengubah arti file yang saat ini menggunakan token //. Vendor browser sangat enggan untuk memperkenalkan perubahan yang berpotensi memecah halaman yang ada.

CSS didefinisikan dengan aturan parsing "toleransi-kesalahan" yang sangat tepat yang berarti bahkan jika Anda menulis sesuatu yang ilegal secara sintaksis ada aturan yang tepat untuk bagaimana parse harus dilanjutkan. Jika urutan karakter ilegal (seperti //) terdeteksi di dalam deklarasi, deklarasi saat ini akan dibuang dan semuanya sampai tanda titik koma berikutnya dilewati.

CSS dirancang seperti ini untuk memungkinkan pengenalan sintaks baru tanpa merusak browser lama. Browser lama hanya akan melewatkan deklarasi yang mengandung sintaks yang tidak didukung, dan melanjutkan setelah itu.

Tetapi logika ini mengasumsikan "unit" untuk diproses atau dilewati adalah deklarasi. Jika komentar single-line diperkenalkan, itu berarti parse after //harus melewati hingga baris berikutnya, bukan sampai titik koma berikutnya, yang mengubah aturan mana yang diuraikan dan yang dilewati. Ini berpotensi mengubah arti file CSS yang ada dengan cara yang mengejutkan.

Sebuah contoh:

P { font: 12px//16px; }
... hundreds of additional lines of CSS...

Di sini saya keliru menggandakan tebasan. Konsekuensinya adalah deklarasi font diabaikan, tetapi semua yang lain berfungsi dengan baik. Jika support untuk //-comments diperkenalkan, tiba-tiba brace penutup akan dikomentari, berpotensi menghancurkan semua sisa style sheet.

Sekarang Anda bisa mengatakan itu adalah kesalahan saya sendiri karena saya melakukan kesalahan, tetapi ini tidak mengubah bahwa jumlah halaman yang tidak diketahui di internet mungkin rusak atau membuat aneh karena alasan yang tidak jelas.

Perubahan apa pun yang merusak kompatibilitas ke belakang harus dipertimbangkan dengan sangat hati-hati, dan komentar satu baris mungkin tidak cukup menarik untuk risiko, karena satu-satunya manfaat adalah menghemat beberapa penekanan tombol.

Jadi, jika CSS harus memiliki komentar garis tunggal itu mungkin seharusnya sudah diperkenalkan dari awal. Tetapi CSS dimulai sebagai bahasa yang sangat sederhana dan memiliki dua sintaks komentar yang berbeda akan dilihat sebagai kompleksitas yang tidak perlu pada saat itu. (Bahkan ANSI C tidak memiliki komentar satu baris.)

JacquesB
sumber
Oh, // apakah token di CSS? Katakan.
Michael Blackburn
Saat ini //akan diuraikan menjadi dua "delim token" dengan pada gilirannya tidak diizinkan di mana pun dalam tata bahasa. Lihat w3.org/TR/css-syntax-3/#tokenization untuk detailnya.
JacquesB
+1 untuk MainMa untuk alasan dimulainya /**/, tetapi menerima yang ini karena juga membahas mengapa tidak berubah.
Angsa
8

Mendukung elemen sintaks lain tidak semudah itu: ada banyak alat yang seharusnya dapat menangani gaya komentar tambahan. Sebenarnya, saya tidak akan terkejut melihat bahwa kebanyakan tokenizers / parser mengabaikan baris baru, mungkin menggantikannya ;.

Jika itu penting untuk bahasa, yaitu membuat hidup pengembang lebih mudah, ini bisa dilakukan. Misalnya, tidak memiliki apapun dari komentar di CSS akan mengisap, dan itu akan menjadi layak usaha untuk menambahkan elemen sintaks khusus yang membatasi komentar. //Komentar-gaya di sisi lain? ... Saya tidak mengerti intinya. Lihat /* Hello, World! */,: komentar satu baris.

Sebenarnya, Anda mungkin mengharapkan //komentar gaya karena Anda terbiasa menggunakannya dalam bahasa C ++ atau sejenisnya. Namun, CSS tidak mewarisi dari C ++, jadi mengharapkan fitur sintaksis yang serupa agak aneh.

Demikian pula, seorang programmer Python akan mengklaim bahwa CSS juga harus memiliki #komentar-gaya; jadi sekarang, apakah kita perlu mendukung kedua gaya? Kemudian seorang pria dari dunia Haskell akan meminta untuk memasukkan --dan {- -}juga, dan Anda akan bertanya pada diri sendiri mengapa Anda tidak mengenali kode CSS lagi.

Manfaat kecilnya //adalah Anda tidak perlu mengetik tiga karakter lagi di akhir komentar satu baris Anda (sebenarnya, jika kita mulai menghitung karakter, CSS harus menggunakan komentar gaya Python). Namun, jika Anda menggunakan editor teks yang layak, Anda mengomentari / menghapus komentar teks hanya dengan menekan pintasan.

Mereka [...] tampaknya sangat berguna untuk bahasa seperti CSS di mana setiap aturan ada di barisnya sendiri.

Seperti yang saya jelaskan, mereka hanya sedikit berguna, untuk sebagian kecil programmer, menggunakan sebagian kecil editor teks. Adapun komentar Anda tentang masing-masing aturan pada jalurnya sendiri (saya tidak setuju dengan komentar Anda, ngomong-ngomong), ini membuat saya berpikir tentang poin lain: bagaimana komentar itu sebenarnya digunakan.

Inilah penggunaan komentar CSS yang dapat saya pikirkan:

  • Sebagai header file (info hak cipta, item batil, dll.)
  • Sebagai pembatas dari sekelompok gaya.
  • Sebagai penjelasan tentang retas.
  • Sebagai detail tentang gaya atau properti tertentu.

Dalam tiga kasus pertama, Anda akan tetap menggunakan komentar gaya multiline. Ini jelas untuk header file dan penjelasan peretasan (kebanyakan peretasan membutuhkan setidaknya satu kalimat dan hyperlink ke StackOverflow atau artikel blog); Adapun pembatas:

/**
 * Footer and sitemap styles.
 */

Komentar gaya-C jauh lebih terlihat daripada:

// Footer and sitemap styles.

terkubur dalam teks.

Arseni Mourzenko
sumber
JavaScript juga mendukung //komentar satu baris .
Tulains Córdova
Saya berpendapat bahwa //ini sangat umum dalam banyak bahasa dan konsep di baliknya adalah lebih dari sintaks, juga fungsinya berbeda. Yang mengatakan, ini adalah jawaban yang paling mendalam.
Angsa
Saya tidak berpikir itu bagian kecil sama sekali. Hampir semua orang yang menulis CSS di raw akan merasa lebih mudah untuk menambahkan komentar dengan //. Tetapi titik kompatibilitas mundur membuatnya bisa diperdebatkan.
O'Rooney
-5

Masalahnya adalah bahwa sebagian besar bahasa dengan komentar (yaitu C #, Java) adalah bahasa yang dikompilasi, dan kompiler menghapus SEMUA komentar sebelum menyajikan konten kepada konsumen (CPU). CSS tidak dikompilasi; umumnya file dikirim tidak berubah ketika perancang mengembangkannya, sehingga tidak ada peluang untuk menghapus komentar. Maka komentar // style memerlukan simbol // DAN umpan baris untuk mempertahankan kebenaran sintaksis.

Ya, minifiers ada, dan ya, javascript memungkinkan jenis komentar ini. Javascript juga memungkinkan eval () jadi saya tidak berpikir kita ingin menganggapnya sebagai model.

Michael Blackburn
sumber
3
Jawaban ini sama sekali tidak masuk akal. "Tidak ada kesempatan untuk menghapus komentar" - tentu saja ada, komentar dilucuti oleh pengurai persis seperti dalam bahasa lain. Kalau tidak, bagaimana CSS bisa memberikan /* */komentar?
JacquesB
Maksud saya perantara pihak ketiga antara desainer dan konsumen. Kompiler adalah perantara ini dalam bahasa yang dikompilasi. "Pengurai" yang Anda rujuk adalah subsistem peramban, konsumen utama konten.
Michael Blackburn
Jadi mengapa parser tidak bisa menghapus //komentar ketika itu bisa dihapus /* */?
JacquesB
1
Bisa, tetapi kemudian harus mencari // dan umpan baris, dan umpan baris didominasi konten semantik, bukan sintaksis. CSS seperti yang dirancang memperlakukan semua spasi putih sama. Untuk mendukung // Anda sekarang memiliki spasi khusus "khusus" dan lebih jauh lagi, spasi khusus "khusus" itu mungkin satu karakter (\ n) dan mungkin dua (\ r \ n).
Michael Blackburn
3
@MichaelBlackburn: DSSSL (yang merupakan pendahulu untuk CSS menggunakan sintaks ekspresi S) juga memiliki komentar single-line. Ini tidak ada hubungannya dengan bahasa imperatif versus deklaratif.
JacquesB