Tại sao Swift không yêu cầu dấu chấm phẩy? [đóng cửa]


20

Tôi thường viết mã bằng c # hoặc Objective-C và gần đây tôi đã tự mình học ngôn ngữ lập trình mới của Apple - Swift.

Điều đầu tiên tôi nhận thấy là bạn không cần thêm dấu chấm phẩy để kết thúc một dòng trong Swift nhưng nếu bạn làm - ít nhất là từ những gì tôi đã kiểm tra - nó không can thiệp vào trình biên dịch.

Khi tôi viết:

int someNumber = 0;

trong Objective-C, dấu chấm phẩy cho chương trình biết rằng dòng kết thúc và không rơi vào dòng tiếp theo.

Với Swift tôi có thể khai báo một biến với

var someNumber:Int = 5

và không thêm dấu chấm phẩy và hệ thống biết rằng đây là phần cuối của dòng.

Điều gì cho phép một số ngôn ngữ để làm điều này và những ngôn ngữ khác không? Tại sao không giữ một hệ thống thống nhất thêm dấu chấm phẩy vào cuối?


Không phải ai cũng đến từ các ngôn ngữ khác, vậy làm sao họ biết họ không đồng nhất? Apple sẽ không thu hút nhiều lập trình viên mới với Swift bằng cách loại bỏ các phần Objective-C mà nhiều người không thích?
JeffO

2
Rất nhiều bác sĩ Obj-C không hài lòng với Swift và thích Obj-C hơn nhiều. Điều này có thể được nhìn thấy thông qua các diễn đàn của Apple. Swift chỉ xuất hiện vào năm 2014 và nếu FULL các lỗi và thay đổi được thực hiện vài tháng một lần đối với ngôn ngữ với Swift2.0 sẽ ra mắt vào mùa thu này. Swift dựa trên Obj-C nhưng nhằm mục đích giúp mã hóa dễ học hơn với tiếng Anh đơn giản hơn.
Memj

Những người triển khai trình biên dịch cũ chỉ lười biếng và / hoặc phải hiệu quả hơn với việc phân tích cú pháp đơn giản hơn. Không cần điều này nữa. Nó giống như suy luận kiểu cục bộ, bạn không có nó chỉ khi trình soạn thảo trình biên dịch của bạn lười biếng và không quan tâm đến trải nghiệm của nhà phát triển.
Ebuall

Câu trả lời:


18

Điều gì cho phép một số ngôn ngữ để làm điều này và những ngôn ngữ khác không? Tại sao không giữ một hệ thống thống nhất thêm dấu chấm phẩy vào cuối?

Robert đã đưa ra một câu trả lời hay về Swift, tôi sẽ cố gắng thêm một chút về phân tích cú pháp nói chung và lý do nên sử dụng hay không sử dụng dấu chấm phẩy.

Khi bạn biên dịch chương trình, có một số bước trước khi tệp nguồn của bạn được chuyển thành mã thực thi, một trong những bước đầu tiên là đọc và phân tích cú pháp . Trong quá trình phân tích cú pháp, mã của bạn được chuyển đổi từ một chuỗi các ký tự thành một biểu diễn có cấu trúc theo ngữ pháp của ngôn ngữ. Đối với điều này, điều cần thiết là các yếu tố cấu thành mã của bạn (biến, hằng, khai báo, v.v.) bằng cách nào đó được xác định và tách biệt. Khi bạn khai báo như:

int someNumber = 0;

Đó chỉ là một chuỗi các ký tự mà bằng cách nào đó cần phải được chuyển sang khái niệm "tạo ra một" thứ "được gọi là someNumberloại intvà gán 0cho nó" .

Điều này đòi hỏi xác định chính xác nơi tuyên bố bắt đầu và kết thúc. Hãy tưởng tượng nếu bạn có điều này:

int someNumber = 0;
int otherNumber = 1;

Bạn sẽ cần phải biết rằng đó là hai tuyên bố khác nhau. Các ;ngôn ngữ giống như C được sử dụng cho điều đó, vì vậy trình phân tích cú pháp đọc các ký tự cho đến khi tìm thấy một ký tự và cố gắng hiểu những gì vừa đọc dưới dạng một câu lệnh. Điều này cho phép, như Robert nói, có một số câu trong cùng một dòng, như:

int someNumber = 0; int otherNumber = 1;

Mà có tác dụng chính xác như viết chúng thành hai dòng.

Trong các ngôn ngữ khác, như Python , bạn sẽ đặt mỗi câu lệnh vào một dòng khác nhau.

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

Vì vậy, không cần phải thêm một ; , vì chính ngôn ngữ ngăn bạn thêm các câu trong cùng một dòng!

Tuy nhiên, các ngôn ngữ khác, như LISP hoặc Scheme , có cách phân nhóm các câu lệnh rất khác nhau (ok, chúng không thực sự là câu lệnh, nhưng bây giờ hãy bỏ qua điều đó). Vì vậy, bạn chỉ có dấu ngoặc đơn cho tất cả mọi thứ:

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

Một lần nữa, bạn không cần ;chỉ vì bạn sử dụng cùng một biểu tượng ( ), () cho những điều mà các ngôn ngữ khác là {, }, :vv Một người chỉ biết cú pháp Lisp có thể hỏi bạn: Tại sao bạn cần ;ở phần cuối của báo cáo của bạn ?

Chỉ cần thêm một ví dụ lạ: OCaml không chỉ có dấu chấm phẩy ở cuối câu ... nó có hai!

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

Tại sao? Tôi không biết. :)

Các ngôn ngữ khác nhau được thiết kế với các mục đích khác nhau và triết lý khác nhau. Nếu tất cả các ngôn ngữ chia sẻ cùng một cú pháp và quy ước, có lẽ chúng chỉ cho phép bạn thực hiện những điều tương tự theo cùng một cách.


4
Câu kết thúc hay.
Thomas Eding

Ví dụ hay, nhưng bạn đã không trả lời câu hỏi.
Robo Robok

Điểm dữ liệu bổ sung: Một số ngôn ngữ có cách tiếp cận ngược với gia đình kiểu C: Ví dụ: HyperTalk sử dụng ngắt dòng làm đầu cứng của dòng (thay vì dấu chấm phẩy) và yêu cầu thoát ngắt dòng nếu bạn muốn tiếp tục câu lệnh qua nhiều dòng Vui thay, bộ tiền xử lý rất riêng của C cũng hoạt động theo cách đó.
uliwitness

11

Ngắt dòng được sử dụng thay vì dấu chấm phẩy để phân định kết thúc của câu lệnh.

Trong hướng dẫn ngôn ngữ: Khái niệm cơ bản :

Không giống như nhiều ngôn ngữ khác, Swift không yêu cầu bạn viết dấu chấm phẩy (;) sau mỗi câu lệnh trong mã của bạn, mặc dù bạn có thể làm như vậy nếu muốn. Tuy nhiên, dấu chấm phẩy là bắt buộc nếu bạn muốn viết nhiều câu lệnh riêng biệt trên một dòng.

Tại sao? Bởi vì đó là cách các nhà thiết kế ngôn ngữ muốn làm điều đó.

Câu thứ hai ở trên gợi ý lý do tại sao bạn không cần dấu chấm phẩy; hầu hết các báo cáo là dòng đơn. Quan sát ví dụ Bubble Sort này; sự kết hợp của các câu lệnh đơn và không có dấu chấm phẩy tạo nên cú pháp rất rõ ràng giống như VB, nhưng ít dài dòng hơn:

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
            }
        }
    }
}

Vì các câu lệnh trong Swift thường kết thúc khi ngắt dòng, nên nhu cầu về dấu chấm phẩy để đánh dấu kết thúc câu lệnh sẽ giảm. Các ngôn ngữ khác sử dụng dấu chấm phẩy không hoạt động theo cách này; bạn có thể tự do viết các câu lệnh nhiều dòng, nhưng cách duy nhất trình biên dịch biết rằng câu lệnh đã kết thúc là khi bạn đặt dấu chấm phẩy của bạn ở cuối của nó.

Khi các câu lệnh không kết thúc khi ngắt dòng, bạn phải đặt ngắt dòng tại một nơi mà trình biên dịch Swift có thể nhận ra là phần tiếp theo của dòng trước đó:

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

2
Tuyên bố cuối cùng là sai, không có vị trí cụ thể để đặt ngắt dòng. Nó là tốt để giữ cho dòng mã của bạn thụt lề và căn chỉnh để cải thiện khả năng đọc.
Eneko Alonso

Sự thật thú vị: Điều này có tác dụng gõ cửa trong báo cáo lỗi. Nhiều trình biên dịch C (clang đặc biệt tốt ở đó) sử dụng dấu chấm phẩy để tìm phần cuối của câu lệnh có lỗi cú pháp và có thể sử dụng thông tin đó để báo cáo thiếu dấu ngoặc đơn đóng gần với nơi chúng thực sự bị thiếu. Thiếu dấu chấm phẩy, gây ra lỗi trong Swift thường có thể khiến dòng sau bị ký hợp đồng với người tiền nhiệm có lỗi và dẫn đến các thông báo lỗi thực sự kỳ lạ.
uliwitness
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.