Tại sao F # có chế độ tương tác mà không phải là C #?


32

F # đi ra khỏi hộp với REPL tương tác. C # không có gì tương tự và trên thực tế khá khó để chơi xung quanh mà không thiết lập một dự án đầy đủ (mặc dù LINQpad hoạt động và cũng có thể thực hiện thông qua powershell).

Có điều gì đó khác biệt cơ bản về các ngôn ngữ cho phép F # có bảng điều khiển tương tác nhưng gây khó khăn khi triển khai nó cho C #?


Vì nhiều năm sau mọi người vẫn đến với câu hỏi này, tôi nên lưu ý rằng bây giờ có nhiều lựa chọn. Bạn có thể sử dụng powershell (được cài đặt sẵn trên mọi máy windows hiện đại) để chơi với khung .Net. Hoặc bạn có thể sử dụng LINQpad để tạo mẫu mã c # tùy ý . Hoặc bạn có thể sử dụng ScriptC hoặc bạn có thể sử dụng môi trường kiểu jsfiddle trực tuyến như Complify.net hoặc Jsil . Rất nhiều lựa chọn.


4
C # không có REPL. Nó được gọi là Cửa sổ ngay lập tức và đã có sẵn khá lâu. Nó có một số hạn chế nhất định, một số trong đó đã trở nên ngày càng đáng chú ý kể từ C # 3.0, vì các tính năng ngôn ngữ mới không được hỗ trợ bởi nó, tuy nhiên nó vẫn là một REPL chính thức.
Allon Guralnek


Tôi nhớ dự án phát hành bản demo Roslyn vào khoảng năm 2012 đã có REPL trong đó cho VS2010
James

@DanielHakimi: Cảm ơn vì nhận xét này, tôi không có manh mối nào được đưa vào VS2015, tôi chỉ nghĩ bạn có thể sử dụng cửa sổ Ngay lập tức trong khi gỡ lỗi. VS2015 hiện chứa cửa sổ công cụ C # Interactive , có thể truy cập thông qua View -> Windows khác -> C # Interactive, dường như là REPL dựa trên Roslyn đầy đủ, tách biệt với môi trường gỡ lỗi.
Lou

Câu trả lời:


56

Có điều gì đó khác biệt cơ bản về các ngôn ngữ cho phép F # có bảng điều khiển tương tác nhưng gây khó khăn khi triển khai nó cho C #?

Vâng.

F # là hậu duệ của ngôn ngữ lập trình ML, do đó bị ảnh hưởng nặng nề bởi các ngôn ngữ như Lisp và Scheme. Những ngôn ngữ được thiết kế từ ngày đầu tiên để có ba thuộc tính tốt đẹp.

Đầu tiên, những ngôn ngữ đó không thực sự có câu nói theo cách bạn nghĩ về chúng trong C #. Thay vào đó, hầu hết mọi thứ là một biểu thứcgiá trị , do đó, một cơ chế đánh giá và sau đó in giá trị có ý nghĩa trong hầu hết mọi tình huống.

Thứ hai, những ngôn ngữ đó không khuyến khích lập trình với các tác dụng phụ, vì vậy bạn có thể đưa ra các đánh giá mà không phải lo lắng rằng bạn sẽ làm rối tung trạng thái toàn cầu.

Thứ ba, hầu hết các công việc bạn làm trong các ngôn ngữ đó là ở cấp độ cao nhất; thông thường không có không gian tên lớp kèm theo hoặc các khu vực tên khác nhau hoặc bối cảnh khác.

Ngược lại, C # nhấn mạnh luồng điều khiển lập trình với các câu lệnh tạo ra hiệu ứng phụ và các câu lệnh đó luôn nằm trong nhiều thùng chứa lồng nhau - một không gian tên, một lớp, một phương thức, v.v.

Vì vậy, đây là tất cả những điều mà làm cho nó khó khăn hơn cho C # để có một REPL, nhưng chắc chắn không phải bất khả thi . Chúng ta chỉ cần tìm ra ngữ nghĩa của các câu và biểu thức xuất hiện bên ngoài bối cảnh thông thường và ngữ nghĩa của các đột biến thay đổi ràng buộc tên là gì, v.v.

Tại sao F # có chế độ tương tác mà không phải là C #?

Bởi vì nhóm F # đã quyết định rằng có một vòng lặp REPL là một kịch bản ưu tiên cho họ. Nhóm C # trong lịch sử không có. Các tính năng không được triển khai trừ khi chúng là các tính năng ưu tiên cao nhất phù hợp với ngân sách; cho đến bây giờ, REPL C # vẫn chưa đứng đầu danh sách của chúng tôi.

Dự án Roslyn có REPL C # (và cuối cùng cũng sẽ có REP REPL, nhưng nó chưa sẵn sàng.) Bạn có thể tải xuống bản phát hành xem trước của nó để xem bạn thích nó như thế nào tại

http://www.microsoft.com/en-us/doad/details.aspx?id=27746


7
Python có REPL đẹp và nó có các câu lệnh, tác dụng phụ và không gian tên. Và Javascript, Bash, v.v. Nhiều ngôn ngữ vi phạm tiêu chí của bạn cũng có REPL.
Lie Ryan

2
Chào mừng trở lại Eric! Tôi hy vọng chúng tôi sẽ thấy nhiều câu trả lời từ bạn.
SolutionYogi

16
@LieRyan Tôi nghĩ bạn đã bỏ lỡ toàn bộ điểm. "Tiêu chí" duy nhất cho một vòng lặp REPL tương tác là ai đó ngồi xuống và viết một; trong F #, nó có mức độ ưu tiên cao và tương đối dễ dàng, trong C # thì mức độ ưu tiên thấp và tương đối khó, do đó F # đã có một sớm và C # thì không.
KutuluMike

Hấp dẫn. Tôi sẽ nói thêm rằng kinh nghiệm thu được khi xây dựng rất nhiều trình biên dịch cho khung .NET trước khi phát hành VS2010 (tôi đếm bốn C #, bốn VB.NET, hai J # và hai C ++ / CLI) đã ảnh hưởng đến cách trình biên dịch hoàn toàn mới một ngôn ngữ .NET hoàn toàn mới đã được xây dựng. Tôi chắc chắn rằng nó được xây dựng theo phong cách Roslyn-esque với nhiều suy nghĩ về cách kích hoạt kịch bản Trình biên dịch dưới dạng dịch vụ, có vẻ như là hướng bạn sẽ phát triển tất cả các trình biên dịch và biên dịch .NET trong tương lai. Đối với tôi có vẻ như thời đại mà F # được sinh ra chắc chắn đã đóng một vai trò trong cách trình biên dịch của nó được viết.
Allon Guralnek

Câu trả lời chính xác. Giới thiệu về Python vs C #: {} ngôn ngữ cú pháp không uốn cong độc đáo cho REPL, các ngôn ngữ dựa trên thụt lề có một bước tiến lớn ở đây. Không bao giờ nghĩ rằng tôi sẽ nghĩ hay nói nó: cú pháp thụt lề tốt hơn cú pháp {}. Đối với REPL cũng như khả năng đọc mã. Vì vậy, miễn là không có C # metasyntax thay thế thụt lề bằng {}, trải nghiệm REPL sẽ không bao giờ suôn sẻ như trong F # hoặc Python.
citykid

22

Mono có C # thay thế: http://www.mono-project.com/CsharpRepl

Nó thậm chí còn có phiên bản GUI cho phép bạn thao tác trực tiếp với các đối tượng đồ họa hoặc tạo các widget Gtk #:

nhập mô tả hình ảnh ở đây


Chắc chắn, và chắc chắn là có thể, nhưng có điều gì về C # khiến nó khó hơn không?
George Mauer

2

Tôi tin rằng nó chủ yếu là một điều lịch sử. Môi trường REPL luôn được liên kết với các ngôn ngữ chức năng, bao gồm các ngôn ngữ gia đình ML và F # vẫn đúng với truyền thống đó. Hãy nhớ rằng môi trường tương tác là thứ mà người dùng đến từ nền tảng chức năng được coi là thiếu, tính năng như vậy sẽ khiến VS và - bởi tiện ích mở rộng - F #, gặp bất lợi.

Mặt khác, không có tính năng như vậy đã phổ biến trong cộng đồng OOP.

Tuy nhiên, có REPL cho nhiều ngôn ngữ phi chức năng, bao gồm C, Java hoặc C #. Ngoài ra, mặc dù khác xa so với REPL chính thức, tính năng Autos trong VS cho thấy rằng nó chắc chắn có thể thực hiện được với C #.


1
Đây là lời giải thích hợp lý nhất mà tôi từng thấy. Ban đầu, có Fortran và có Lisp, và Lisps đã thay thế. Lisp begat ... tốt, bạn hiểu ý. Ngôn ngữ dòng Lisp đã thay thế, và dòng Fortran thì không.
Aaron

@Aaron LISP là năm 1959 nhưng REPL được quy cho các máy LISP, năm 1973. Đến lúc đó, có rất nhiều, rất nhiều ngôn ngữ đã xuất hiện. Đáng chú ý là PASCAL và Smalltalk.
Sprague

1

Tôi tin rằng C # chủ yếu hướng đối tượng. Để viết mã thậm chí đơn giản nhất, bạn nên chia nó thành nhiều lớp. Để sử dụng REPL, bạn sẽ cần phải viết nhiều mã.

F # chủ yếu là chức năng không có vấn đề này và bạn có thể dễ dàng viết mã thậm chí phức tạp trong fasshion đơn giản và chuyển đổi nó thành đối tượng sau này.

Dễ dàng viết một dòng hàm hơn là viết lớp, kéo dài nhiều dòng.


1
Không có gì ngăn bạn sử dụng các hàm / lớp được xác định trong các tệp bên ngoài trong các câu lệnh REPL. Thực tế là OOP dài dòng hơn không cản trở chức năng REPL.
Scrwtp

1
Python, khá hướng đối tượng và có tính năng ngắt dòng có ý nghĩa cú pháp, có REPL khá. Scala, được gõ tĩnh, biên dịch và khá hướng đối tượng, có REPL. REPL hữu ích nhất cho những thứ ngắn như nhập các lớp hiện có và gọi một số phương thức; tính dài dòng của ngôn ngữ không phải là một mối quan tâm. Ví dụ: SQL khá dài dòng nhưng mọi cơ sở dữ liệu SQL đều có REPL (một 'công cụ truy vấn').
9000
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.