Một ngôn ngữ lập trình có thể làm việc tốt mà không cần báo cáo?


9

Khi lập trình bằng JavaScript, tôi nhận thấy mọi thứ có thể được thực hiện bằng các câu lệnh và các khối có thể được thực hiện chỉ bằng các biểu thức. Một ngôn ngữ lập trình có thể hoạt động tốt chỉ với các biểu thức? Và, nếu có, tại sao các câu lệnh được sử dụng ở tất cả?


2
Vâng, có rất nhiều ngôn ngữ biểu hiện mọi thứ, như Ruby và tất cả các phương ngữ của Lisp.
amara

@sparkleshy Tôi thấy, chỉ là một phỏng đoán: tất cả chúng đều có toán tử tương tự như dấu phẩy của JavaScript (nó thực thi hai câu lệnh và trả về giá trị cuối cùng)? Đây có phải là giải pháp để thực hiện hai câu lệnh theo trình tự? Tôi đoán rằng tiên lượng của CL là tương tự, tôi đoán, ngay cả khi nó hoạt động với> 2 biểu thức.
MaiaVictor

1
Mọi thứ là một biểu thức không nhất thiết phải trông khác với ngôn ngữ câu lệnh thông thường, các câu lệnh chỉ ... có giá trị. Nếu bạn đã thực hiện các biểu thức câu lệnh của javascript, tất cả các mã hiện có sẽ hoàn toàn hợp lệ.
amara

1
CoffeeScript là ngôn ngữ mọi thứ là một biểu thức, biên dịch thành JavaScript.
Spoike

1
có liên quan (có thể là một bản sao): Tính biểu cảm hữu ích nào sẽ là không thể trong một ngôn ngữ mà một biểu thức không phải là một tuyên bố? "Tại sao có nhiều ngữ pháp tạo ra sự khác biệt giữa expr và stmt khi như được ghi chú trong các câu trả lời, nó không có ý nghĩa gì."
gnat

Câu trả lời:


14

Chắc chắn rồi. Cách đơn giản nhất là gán giá trị kết quả cho mọi cấu trúc hiện đang là câu lệnh và từ đó biến nó thành biểu thức. Điều đó không nhất thiết phải hữu ích hoặc có ý nghĩa mặc dù. Lợi ích tiềm năng duy nhất là một chút đơn giản về khái niệm. Tuy nhiên, nếu sau đó bạn tiến hành loại bỏ những thứ như dấu chấm phẩy và vòng lặp (yêu cầu xâu chuỗi thông qua các toán tử và hàm khác thay thế), các chương trình sử dụng nhiều câu lệnh trở nên xấu xí.

Một cách triệt để nhưng có ý nghĩa hơn để làm điều này là thiết kế ngôn ngữ sao cho hầu hết mọi thứ đều giá trị có ý nghĩa và sử dụng nó theo cách mà bạn hầu như luôn sử dụng một biểu thức cho giá trị có ý nghĩa đó, không phải cho các hiệu ứng khác. Các ngôn ngữ lập trình hàm thực hiện điều này (ở một mức độ nào đó, ví dụ, Haskell có các khai báo, không phải là biểu thức).

Các câu lệnh được sử dụng vì trong mô hình bắt buộc, có nhiều thao tác phổ biến không có giá trị kết quả hữu ích và vì khái niệm hướng dẫn tuần tự (thay vì tính toán) phù hợp với mô hình đó khá tốt. Nếu một tỷ lệ lớn chương trình của bạn đang thay đổi trạng thái, thay vì tính toán các giá trị mới, thì việc yêu cầu tạo ra một giá trị là gì (kết quả của vòng lặp for là gì?). Ngược lại, khi toàn bộ mô hình (FP) của bạn được xây dựng xung quanh việc tính toán các giá trị, các ngoại lệ không có giá trị kết quả sẽ không đảm bảo một ngoại lệ: Thay vào đó, bạn đưa cho chúng một kết quả trọng tâm không có nghĩa gì.


-1 điều này không thực sự đúng
amara

3
@sparkleshy Phần nào không đúng và như thế nào?

1
đoạn đầu tiên: bạn nghi ngờ ý tưởng rằng các câu lệnh có giá trị trả về hữu ích (nhưng nhiều người làm), đề xuất một điều xấu xí (tại sao?). đoạn thứ hai: tuyên bố rằng tất cả các ngôn ngữ lập trình chức năng sử dụng khái niệm rìa xấu xí này, thật nực cười. đoạn thứ ba: false, chúng ta đã có trong các khối {}, giá trị bị bỏ qua và nó không gây ra bất kỳ vấn đề nào, không chính xác; bạn đã cho họ sự thiếu giá trị của khoảng trống, làm thế nào null có ý nghĩa ít hơn thế? Nhìn chung: điều này không thực sự đúng
amara

2
@sparkleshy - Không có câu lệnh nào có giá trị trả về hữu ích, đó là lý do tại sao chúng là câu lệnh . Chúng có thể có tác dụng phụ hữu ích (như chuyển nhượng), nhưng đó không phải là điều tương tự. Đây không thực sự là một khái niệm bên lề. Nó được biết đến nếu không hoàn toàn thực tế nếu được đưa đến mức độ thứ N. Và giá trị sentinel đó không phải là null hoặc void, nó là đơn vị khác biệt tinh tế với cả hai. +1 cho delnan để bù đắp cho điều này.
Telastyn

4
@sparkleshy (1) Bạn có thể nhầm lẫn các biểu thức (có thể là thành phần duy nhất của câu lệnh) với câu lệnh (không biểu thức và không có giá trị kết quả). (2) Cái gì? Bất kỳ người ủng hộ FP nào cũng sẽ xác nhận điều đó (và cho rằng đó là một điều tốt). Hay đó chỉ là phần "tất cả" mà bạn phản đối? (3) Các khối {} là những gì tôi đang nói ("khái niệm về các hướng dẫn tuần tự"). Và tôi nói bất cứ điều gì gây ra bất kỳ vấn đề? Sự khác biệt giữa voidnull/ unitlà cái sau là các giá trị và có thể được truyền xung quanh, trong khi điều voidđặc biệt là không có giá trị của loại đó.

5

Phụ thuộc vào cách bạn định nghĩa "tuyên bố" và "biểu thức".

Một định nghĩa rất nghiêm ngặt sẽ phân biệt giữa các câu lệnh là "những thứ có tác dụng phụ và có thể là giá trị trả về" và biểu thức là "những thứ có giá trị trả về, nhưng không thể có tác dụng phụ". Với định nghĩa như vậy, không có chương trình có ý nghĩa nào có thể được viết mà không có ít nhất một câu lệnh (sẽ phải đánh giá một biểu thức và đưa ra giá trị trả về của nó) - một mình các biểu thức thuần túy không thể tương tác với thế giới bên ngoài chương trình. Một ngôn ngữ vẫn có thể hoàn toàn thuần túy (nghĩa là không có bất kỳ tuyên bố nào), nếu phần không tinh khiết được chuyển ra khỏi ngôn ngữ và vào hệ sinh thái hỗ trợ (đó chính xác là những gì Haskell làm, mặc dù ngôn ngữ có định nghĩa cũng như biểu thức) .

Tuy nhiên, nếu bạn cho phép các hiệu ứng phụ trong biểu thức, thì sự khác biệt giữa các câu lệnh và biểu thức trở nên tùy ý và ít thú vị hơn - tất nhiên bạn có thể phát minh ra một ngôn ngữ lập trình chỉ bao gồm các biểu thức; hầu hết các phương ngữ Lisp hoạt động nhiều như thế. Trong tình huống như vậy, việc đánh giá một biểu thức cho các tác dụng phụ của nó hoàn toàn giống với việc thực hiện một tuyên bố và người ta có thể lập luận rằng trong một ngôn ngữ như vậy, các biểu thức và tuyên bố là giống nhau. Sự khác biệt giữa một tuyên bố và một biểu thức, sau đó, chỉ là cú pháp.

Nhiều ngôn ngữ vẫn tạo ra sự khác biệt cú pháp này, bởi vì nó hữu ích không phải vì lý do kỹ thuật, mà vì khả năng đọc. Làm cho một cái gì đó một biểu thức báo hiệu rằng bạn quan tâm đến giá trị trả về của nó, ít hơn vì vậy tác dụng phụ của nó; làm cho nó trở thành một tuyên bố cho người đọc biết rằng bạn dự định gây ra tác dụng phụ và giá trị trả về có thể hoặc không thú vị.


1 để lấy ý kiến về khả năng đọc ... Cuối cùng, con người cần phải hiểu nó ...
mattnz

1

ATLXtend là các ngôn ngữ lập trình hoạt động kém tuyên bố. Nhiều ngôn ngữ chức năng cũng không có tuyên bố. Vì vậy, có một ngôn ngữ lập trình có thể hoạt động tốt mà không cần báo cáo. Tôi nghĩ rằng các tuyên bố trong nhiều ngôn ngữ là một từ bỏ lập trình bắt buộc. Chúng vẫn được sử dụng vì chúng được biết đến rộng rãi và trong một số trường hợp, chúng làm cho mã dễ đọc hơn.


1

Đúng.

Các ngôn ngữ chức năng (và các ngôn ngữ gán đơn) mọi thứ đều là một biểu thức. Ví dụ là Haskal (và SISAL). Trong đó cả hai câu lệnh if và vòng lặp trả về giá trị.

Có nhiều loại ngôn ngữ khác: Loại ngôn ngữ dễ hiểu là ngôn ngữ khai báo (tôi chắc chắn có nhiều ngôn ngữ khác không phụ thuộc vào câu lệnh). Những ngôn ngữ này thậm chí không cần biểu thức (theo cùng nghĩa như bạn thường nghĩ). Bạn tuyên bố điều gì là đúng và bạn có thể nhận được nhiều kết quả. Cái dễ ở đây là prolog.


Haskell có khai báo, chúng không phải là biểu thức.
Janus Troelsen
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.