Mengapa Swift tidak membutuhkan titik koma? [Tutup]

20

Saya biasanya kode baik dalam c # atau Objective-C dan baru-baru ini mengambil sendiri untuk belajar bahasa pemrograman baru Apple - Swift.

Hal pertama yang saya perhatikan adalah Anda tidak perlu menambahkan titik koma untuk mengakhiri garis di Swift tetapi jika Anda melakukannya - setidaknya dari apa yang saya uji - itu tidak mengganggu kompiler.

Ketika saya menulis:

int someNumber = 0;

di Objective-C titik koma memberitahu program bahwa garis sudah berakhir dan tidak jatuh ke baris berikutnya.

Dengan Swift saya dapat mendeklarasikan variabel dengan

var someNumber:Int = 5

dan tidak menambahkan titik koma dan sistem tahu bahwa ini adalah akhir dari baris.

Apa yang memungkinkan beberapa bahasa melakukan ini dan yang lain tidak? Mengapa tidak menyimpan sistem seragam untuk menambahkan titik koma di akhir?

Memj
sumber
Tidak semua orang berasal dari bahasa lain, jadi bagaimana mereka tahu mereka tidak seragam? Tidakkah Apple akan menarik lebih banyak programmer baru dengan Swift dengan menyingkirkan bagian Objective-C yang tidak disukai banyak orang?
JeffO
2
Banyak dokter hewan Obj-C tidak senang dengan Swift dan lebih suka Obj-C. Ini bisa dilihat melalui forum Apple. Swift hanya keluar pada 2014 dan jika PENUH bug dan perubahan dilakukan setiap beberapa bulan ke bahasa dengan Swift2.0 keluar musim gugur ini. Swift didasarkan pada Obj-C tetapi bertujuan untuk membuat pengkodean lebih mudah dipelajari dengan bahasa Inggris yang lebih sederhana.
Memj
Implementer kompiler lama hanya malas dan / atau harus lebih efisien dengan penguraian yang lebih sederhana. Tidak perlu untuk ini lagi. Ini sama dengan inferensi tipe lokal, Anda tidak memilikinya hanya jika penulis kompiler Anda malas dan tidak peduli dengan pengalaman pengembang.
Ebuall

Jawaban:

18

Apa yang memungkinkan beberapa bahasa melakukan ini dan yang lain tidak? Mengapa tidak menyimpan sistem seragam untuk menambahkan titik koma di akhir?

Robert memberikan jawaban yang baik mengenai Swift, saya akan mencoba menambahkan sedikit lebih banyak tentang parsing secara umum dan mengapa menggunakan atau tidak titik koma.

Ketika Anda mengkompilasi program, ada beberapa langkah sebelum file sumber Anda diubah menjadi kode yang dapat dieksekusi, salah satu yang pertama adalah membaca dan menguraikan . Selama parsing kode Anda diubah dari urutan karakter menjadi representasi terstruktur sesuai dengan tata bahasa. Untuk ini, elemen-elemen yang menyusun kode Anda (variabel, konstanta, deklarasi, dll.) Perlu diidentifikasi dan dipisahkan. Saat Anda membuat deklarasi seperti:

int someNumber = 0;

Itu hanya urutan karakter yang entah bagaimana perlu diubah ke konsep "buat 'benda' yang disebut someNumbertipe intdan tetapkan 0untuk itu" .

Ini membutuhkan pengidentifikasian di mana tepatnya pernyataan itu dimulai dan berakhir. Bayangkan jika Anda memiliki ini:

int someNumber = 0;
int otherNumber = 1;

Anda perlu tahu bahwa itu adalah dua deklarasi yang berbeda. Dalam ;bahasa seperti C digunakan untuk itu, jadi parser membaca karakter sampai menemukan satu, dan mencoba untuk memahami apa yang baru saja dibaca sebagai pernyataan tunggal. Ini memungkinkan, seperti yang dikatakan Robert, memiliki beberapa pernyataan di baris yang sama, seperti:

int someNumber = 0; int otherNumber = 1;

Yang memiliki efek yang persis sama dengan menuliskannya dalam dua baris.

Dalam bahasa lain, seperti Python , Anda diharapkan untuk menempatkan setiap pernyataan di baris yang berbeda.

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

Jadi tidak perlu menambahkan ;, karena bahasa itu sendiri mencegah Anda menambahkan pernyataan di baris yang sama!

Namun bahasa lain, seperti LISP atau Skema , memiliki cara pengelompokan pernyataan yang sangat berbeda (ok, mereka bukan benar-benar pernyataan, tapi mari kita abaikan itu untuk saat ini). Jadi Anda hanya memiliki kurung untuk semuanya:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

Sekali lagi, Anda tidak perlu ;hanya karena Anda menggunakan simbol-simbol yang sama ( ), () untuk hal-hal yang dalam bahasa lain adalah {, }, :, dll Seseorang yang hanya tahu sintaks Lisp mungkin bertanya: Mengapa Anda perlu ;pada akhir pernyataan Anda ?

Sebagai contoh tambahan: OCaml tidak hanya memiliki titik koma di akhir pernyataan ... ia memiliki dua!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

Mengapa? Saya tidak tahu :)

Bahasa yang berbeda dirancang dengan tujuan dan filosofi yang berbeda pula. Jika semua bahasa berbagi sintaks dan konvensi yang sama, mereka mungkin hanya akan memungkinkan Anda untuk melakukan hal yang sama dengan cara yang sama.

Sebastian
sumber
4
Kalimat penutup yang bagus.
Thomas Eding
Contoh yang bagus, tetapi Anda tidak menjawab pertanyaan itu.
Robo Robok
Poin data tambahan: Beberapa bahasa mengambil semacam pendekatan balik ke keluarga gaya-C: Misalnya HyperTalk menggunakan jeda baris sebagai akhir garis (bukan titik koma), dan mengharuskan untuk keluar jeda baris jika ingin melanjutkan pernyataan lebih dari beberapa baris. Lucunya, preprocessor C sendiri juga bekerja seperti itu.
uliwitness
11

Jeda baris digunakan alih-alih titik koma untuk membatasi akhir pernyataan.

Dalam panduan Bahasa: Dasar-Dasar dikatakan:

Tidak seperti banyak bahasa lain, Swift tidak mengharuskan Anda untuk menulis titik koma (;) setelah setiap pernyataan dalam kode Anda, meskipun Anda dapat melakukannya jika Anda mau. Namun, titik koma diperlukan jika Anda ingin menulis beberapa pernyataan terpisah dalam satu baris.

Mengapa? Karena begitulah perancang bahasa ingin melakukannya.

Kalimat kedua di atas mengisyaratkan mengapa Anda tidak perlu titik koma; kebanyakan pernyataan adalah satu baris. Lihat contoh Bubble Sort ini; kombinasi pernyataan baris tunggal dan tanpa titik koma menghasilkan sintaks yang sangat bersih yang mirip-VB, tetapi kurang verbose:

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

Karena pernyataan dalam Swift biasanya berakhir pada jeda baris, kebutuhan titik koma untuk menandai akhir pernyataan berkurang. Bahasa lain yang menggunakan titik koma tidak berfungsi seperti ini; Anda dapat dengan bebas menulis pernyataan multi-baris, tetapi satu-satunya cara kompiler mengetahui bahwa pernyataan tersebut telah berakhir adalah ketika Anda menempatkan titik koma di akhir.

Ketika pernyataan tidak berakhir pada jeda baris, Anda harus meletakkan jeda baris di tempat yang dapat dikenali oleh kompiler Swift sebagai kelanjutan dari baris sebelumnya:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")
Robert Harvey
sumber
2
Pernyataan terakhir salah, tidak ada lokasi spesifik untuk menempatkan jeda baris. Adalah baik untuk menjaga baris kode Anda diindentasi dan disejajarkan untuk meningkatkan keterbacaan
Eneko Alonso
Fakta menyenangkan: Ini memiliki efek langsung pada pelaporan kesalahan. Banyak kompiler C (dentang sangat bagus) menggunakan titik koma untuk menemukan akhir dari pernyataan dengan kesalahan sintaks dan dapat menggunakan informasi itu untuk misalnya melaporkan tanda kurung tutup yang hilang lebih dekat ke tempat mereka sebenarnya hilang. Kurangnya titik koma, membuat kesalahan dalam Swift sering dapat menyebabkan baris berikut dikontrak menjadi pendahulunya yang mengandung kesalahan dan menyebabkan pesan kesalahan yang sangat aneh.
uliwitness