ทำไมสวิฟต์ไม่ต้องใช้เครื่องหมายอัฒภาค? [ปิด]


20

ปกติฉันเขียนโค้ดใน c # หรือ Objective-C และเมื่อเร็ว ๆ นี้ฉันได้เรียนรู้ภาษาการเขียนโปรแกรมใหม่ของ Apple - Swift

สิ่งแรกที่ฉันสังเกตเห็นคือคุณไม่จำเป็นต้องเพิ่มเครื่องหมายอัฒภาคเพื่อจบบรรทัดใน Swift แต่ถ้าคุณทำอย่างน้อยจากสิ่งที่ฉันทดสอบ - มันไม่รบกวนคอมไพเลอร์

เมื่อฉันเขียน:

int someNumber = 0;

ใน Objective-C เครื่องหมายอัฒภาคจะบอกโปรแกรมว่าบรรทัดนั้นสิ้นสุดลงและจะไม่ผ่านไปยังบรรทัดถัดไป

ด้วย Swift ฉันสามารถประกาศตัวแปรด้วย

var someNumber:Int = 5

และไม่เพิ่มเซมิโคลอนและระบบรู้ว่านี่คือจุดสิ้นสุดของบรรทัด

อะไรทำให้บางภาษาทำสิ่งนี้และคนอื่น ๆ ไม่ได้? ทำไมไม่เก็บระบบที่เป็นรูปแบบเดียวกันของการเพิ่มเครื่องหมายอัฒภาคไว้ที่ท้าย?


ไม่ใช่ทุกคนที่มาจากภาษาอื่น ๆ ดังนั้นพวกเขาจะรู้ได้อย่างไรว่าพวกเขาไม่เหมือนกัน? Apple จะไม่ดึงดูดโปรแกรมเมอร์ใหม่ ๆ ด้วย Swift โดยกำจัดชิ้นส่วน Objective-C ที่หลายคนไม่ชอบหรือไม่
JeffO

2
สัตว์แพทย์ Obj-C จำนวนมากไม่พึงพอใจกับ Swift และชอบ Obj-C เป็นอย่างมาก สามารถดูได้ผ่านฟอรัมของ Apple Swift ออกมาในปี 2014 เท่านั้นและหากมีข้อบกพร่องและการเปลี่ยนแปลงที่สมบูรณ์เกิดขึ้นทุก ๆ สองสามเดือนกับภาษาที่ Swift2.0 ออกมาในฤดูใบไม้ร่วงนี้ Swift นั้นมีพื้นฐานจาก Obj-C แต่มีจุดประสงค์เพื่อให้การเขียนโค้ดง่ายขึ้นในการเรียนรู้ภาษาอังกฤษที่ง่ายขึ้น
Memj

ผู้พัฒนาคอมไพเลอร์รุ่นเก่านั้นขี้เกียจและ / หรือต้องมีประสิทธิภาพมากขึ้นด้วยการแยกวิเคราะห์ที่ง่ายขึ้น ไม่จำเป็นสำหรับสิ่งนี้อีกต่อไป มันเหมือนกับการอนุมานแบบโลคอลคุณไม่ได้มีเฉพาะในกรณีที่ผู้เขียนคอมไพเลอร์ของคุณขี้เกียจและไม่สนใจประสบการณ์ของนักพัฒนา
Ebuall

คำตอบ:


18

อะไรทำให้บางภาษาทำสิ่งนี้และคนอื่น ๆ ไม่ได้? ทำไมไม่เก็บระบบที่เป็นรูปแบบเดียวกันของการเพิ่มเครื่องหมายอัฒภาคไว้ที่ท้าย?

โรเบิร์ตให้คำตอบที่ดีเกี่ยวกับสวิฟต์ฉันจะพยายามเพิ่มอีกเล็กน้อยเกี่ยวกับการแจงทั่วไปและทำไมต้องใช้หรือไม่ใช่อัฒภาค

เมื่อคุณรวบรวมโปรแกรมที่มีหลายขั้นตอนก่อนที่จะแฟ้มแหล่งที่มาของคุณจะกลายเป็นรหัสปฏิบัติการซึ่งเป็นหนึ่งในการอ่านเป็นครั้งแรกและการแยก ในระหว่างการแยกวิเคราะห์รหัสของคุณจะถูกเปลี่ยนจากลำดับของตัวละครเป็นรูปแบบที่มีโครงสร้างตามไวยากรณ์ของภาษา สำหรับสิ่งนี้จำเป็นที่องค์ประกอบที่เขียนรหัสของคุณ (ตัวแปรค่าคงที่การประกาศ ฯลฯ ) จะถูกระบุและแยกออกจากกัน เมื่อคุณประกาศเช่น:

int someNumber = 0;

มันเป็นเพียงลำดับของตัวอักษรที่ใดจะต้องมีการหันกลับมาหาแนวคิด"สร้าง 'สิ่ง' ที่เรียกว่าsomeNumberประเภทintและกำหนด0ให้กับมัน"

สิ่งนี้ต้องระบุว่าคำสั่งเริ่มต้นและสิ้นสุดตรงไหน ลองนึกภาพถ้าคุณมีสิ่งนี้:

int someNumber = 0;
int otherNumber = 1;

คุณจำเป็นต้องรู้ว่าสิ่งเหล่านั้นเป็นคำประกาศสองแบบที่แตกต่างกัน ;ใน C-เช่นภาษาที่ใช้สำหรับการที่ดังนั้น parser อ่านตัวอักษรจนกว่าจะพบหนึ่งและพยายามที่จะเข้าใจสิ่งที่อ่านเพียงแค่เป็นคำเดียว สิ่งนี้อนุญาตให้โรเบิร์ตพูดได้หลายข้อความในบรรทัดเดียวกันเช่น:

int someNumber = 0; int otherNumber = 1;

ซึ่งมีผลเหมือนกับการเขียนในสองบรรทัด

ในภาษาอื่นเช่นPythonคุณคาดว่าจะวางแต่ละคำสั่งในบรรทัดที่แตกต่างกัน

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

ดังนั้นไม่จำเป็นต้องเพิ่ม a ;เนื่องจากภาษานั้นป้องกันคุณจากการเพิ่มคำสั่งในบรรทัดเดียวกัน!

ภาษาอื่น ๆ เช่นLISPหรือSchemeมีวิธีการจัดกลุ่มข้อความที่แตกต่างกันมาก (ตกลงพวกเขาไม่ได้เป็นประโยคจริงๆ แต่ลองเพิกเฉยต่อตอนนี้) ดังนั้นคุณมีวงเล็บสำหรับทุกสิ่ง:

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

อีกครั้งคุณไม่จำเป็นต้อง;เพียงเพราะคุณใช้สัญลักษณ์เดียวกัน ( ), () สำหรับสิ่งที่ในภาษาอื่น ๆ{, }, :ฯลฯ คนที่รู้เพียงไวยากรณ์ชัดอาจขอให้คุณ: ทำไมคุณต้อง;ในตอนท้ายของงบของคุณ ?

เพียงเพื่อเพิ่มตัวอย่างคนแปลกหน้า: OCamlไม่เพียง แต่มีเครื่องหมายอัฒภาคในตอนท้ายของคำสั่ง ... มันมีสอง!

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

ทำไม? ฉันไม่รู้ :)

ภาษาที่แตกต่างได้รับการออกแบบโดยมีวัตถุประสงค์ที่แตกต่างและปรัชญาที่แตกต่างกัน หากทุกภาษาใช้ไวยากรณ์และแบบแผนเดียวกันร่วมกันพวกเขาอาจจะอนุญาตให้คุณทำสิ่งเดียวกันในแบบเดียวกันเท่านั้น


4
ประโยคปิดที่ดี
Thomas Eding

ตัวอย่างที่ดี แต่คุณไม่ได้ตอบคำถาม
Robo Robok

จุดข้อมูลเพิ่มเติม: บางภาษาใช้วิธีย้อนกลับในตระกูล C: เช่น HyperTalk ใช้ตัวแบ่งบรรทัดเป็นจุดสิ้นสุดของบรรทัด (แทนเครื่องหมายอัฒภาค) และต้องการให้ตัวแบ่งบรรทัดหนีหากคุณต้องการดำเนินการต่อ มากกว่าหลายบรรทัด ตลกตัวประมวลผลล่วงหน้าของ C เองก็ทำงานเช่นนั้น
uliwitness

11

ใช้ตัวแบ่งบรรทัดแทนเซมิโคลอนเพื่อกำหนดขอบเขตของคำสั่ง

ในคู่มือภาษา: พื้นฐานมันบอกว่า:

แตกต่างจากภาษาอื่น ๆ มากมาย Swift ไม่ต้องการให้คุณเขียนเครื่องหมายอัฒภาค (;) หลังจากแต่ละคำสั่งในรหัสของคุณถึงแม้ว่าคุณสามารถทำได้ถ้าคุณต้องการ อย่างไรก็ตามจำเป็นต้องใช้เครื่องหมายอัฒภาคหากคุณต้องการเขียนหลาย ๆ คำสั่งแยกกันในบรรทัดเดียว

ทำไม? เพราะนั่นคือวิธีที่นักออกแบบภาษาต้องการทำ

ประโยคที่สองด้านบนบอกเป็นนัย ๆ ว่าทำไมคุณไม่ต้องการใช้เครื่องหมายอัฒภาค ข้อความส่วนใหญ่เป็นบรรทัดเดียว สังเกตตัวอย่างการเรียงฟองนี้ การรวมกันของคำสั่งบรรทัดเดียวและไม่มีเครื่องหมายอัฒภาคทำสำหรับไวยากรณ์ที่สะอาดมากที่ VB - เหมือน แต่น้อย 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
            }
        }
    }
}

เนื่องจากคำสั่งใน Swift มักจะสิ้นสุดในการแบ่งบรรทัดความต้องการเซมิโคลอนเพื่อทำเครื่องหมายจุดสิ้นสุดของคำสั่งจะลดลง ภาษาอื่นที่ใช้เครื่องหมายอัฒภาคไม่ทำงาน คุณสามารถเขียนคำสั่งหลายบรรทัดได้อย่างอิสระ แต่วิธีเดียวที่คอมไพเลอร์รู้ว่าคำสั่งนั้นจบลงคือเมื่อคุณวางเซมิโคลอนไว้ที่ท้าย

เมื่อคำสั่งไม่สิ้นสุดในการขึ้นบรรทัดใหม่คุณต้องวางตัวแบ่งบรรทัดในที่ที่คอมไพเลอร์ Swift สามารถจดจำได้ว่าเป็นความต่อเนื่องของบรรทัดก่อนหน้า:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")

2
คำสั่งสุดท้ายเป็นเท็จไม่มีตำแหน่งที่เฉพาะเจาะจงสำหรับวางตัวแบ่งบรรทัด มันเป็นการดีที่จะทำให้บรรทัดของรหัสเยื้องและสอดคล้องเพื่อปรับปรุงการอ่าน
Eneko Alonso

สนุกจริง: สิ่งนี้มีผลแบบเคาะบนการรายงานข้อผิดพลาด คอมไพเลอร์ C จำนวนมาก (เสียงดังกังวานที่ดีโดยเฉพาะ) ใช้เครื่องหมายอัฒภาคเพื่อค้นหาจุดสิ้นสุดของคำสั่งที่มีข้อผิดพลาดทางไวยากรณ์และสามารถใช้ข้อมูลนั้นเช่นรายงานวงเล็บปิดที่หายไปใกล้กับที่พวกเขาหายไปจริง การขาดเครื่องหมายอัฒภาคการสร้างข้อผิดพลาดใน Swift มักทำให้บรรทัดต่อไปนี้ถูกทำสัญญากับตัวควบคุมที่มีข้อผิดพลาดและนำไปสู่ข้อความแสดงข้อผิดพลาดแปลก ๆ
uliwitness
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.