Mengapa F # memiliki mode interaktif tetapi tidak C #?

32

F # keluar dari kotak dengan REPL interaktif. C # tidak memiliki hal semacam itu dan pada kenyataannya agak sulit untuk bermain-main tanpa mengatur proyek penuh (meskipun LINQpad bekerja dan juga mungkin dilakukan melalui PowerShell).

Apakah ada sesuatu yang berbeda secara mendasar tentang bahasa yang memungkinkan F # memiliki konsol interaktif tetapi membuatnya sulit untuk mengimplementasikannya untuk C #?


Karena bertahun-tahun kemudian orang masih datang ke pertanyaan ini saya harus perhatikan bahwa sekarang ada banyak pilihan. Anda dapat menggunakan PowerShell (pra-instal pada setiap mesin windows modern) untuk bermain dengan framework .Net. Atau Anda dapat menggunakan LINQpad untuk membuat prototipe kode c # sewenang-wenang . Atau Anda dapat menggunakan ScriptCs atau Anda dapat menggunakan lingkungan tipe jsfiddle online seperti Complify.net atau Jsil . Banyak pilihan.

George Mauer
sumber
4
C # memang memiliki REPL. Ini disebut Jendela Segera dan telah tersedia cukup lama. Ini memiliki keterbatasan tertentu, beberapa di antaranya menjadi semakin terlihat sejak C # 3.0, karena fitur bahasa baru tidak didukung olehnya, tetapi tetap saja REPL yang lengkap.
Allon Guralnek
Saya ingat proyek Roslyn rilis demo sekitar tahun 2012 memiliki REPL di dalamnya untuk VS2010
James
@DanielHakimi: Terima kasih atas komentar ini, saya tidak tahu ini termasuk dalam VS2015, saya hanya berpikir Anda bisa menggunakan jendela langsung saat debugging. VS2015 sekarang berisi jendela alat C # Interactive , dapat diakses melalui View -> Other Windows -> C # Interactive, yang tampaknya merupakan REPL penuh Roslyn, terpisah dari lingkungan debugging.
Lou

Jawaban:

56

Apakah ada sesuatu yang berbeda secara mendasar tentang bahasa yang memungkinkan F # memiliki konsol interaktif tetapi membuatnya sulit untuk mengimplementasikannya untuk C #?

Iya nih.

F # adalah turunan dari bahasa pemrograman ML, yang pada gilirannya sangat dipengaruhi oleh bahasa seperti Lisp dan Skema. Bahasa-bahasa itu dirancang sejak hari pertama untuk memiliki tiga properti bagus.

Pertama, bahasa-bahasa itu tidak benar-benar memiliki pernyataan seperti yang Anda pikirkan dalam bahasa C #. Sebaliknya, hampir semuanya adalah ekspresi yang memiliki nilai , sehingga mekanisme evaluasi-dan-kemudian-cetak-nilai masuk akal di hampir setiap situasi.

Kedua, bahasa-bahasa itu menghambat pemrograman dengan efek samping, sehingga Anda dapat melakukan evaluasi tanpa khawatir Anda akan mengacaukan keadaan global.

Ketiga, sebagian besar pekerjaan yang Anda lakukan dalam bahasa-bahasa itu adalah "di tingkat atas"; biasanya tidak ada "class" atau "namespace" atau konteks lainnya.

Sebaliknya, C # menekankan aliran kontrol pemrograman dengan pernyataan yang menghasilkan efek samping, dan pernyataan itu selalu berada dalam beberapa wadah bersarang - namespace, kelas, metode, dan sebagainya.

Jadi ini semua hal yang membuat C # lebih sulit untuk memiliki REPL, tetapi tentu saja tidak mustahil . Kami hanya perlu mencari tahu apa arti semantik untuk pernyataan dan ekspresi yang muncul di luar konteks yang biasa, dan apa arti semantik dari mutasi yang mengubah binding nama, dan sebagainya.

Mengapa F # memiliki mode interaktif tetapi tidak C #?

Karena tim F # memutuskan bahwa memiliki loop REPL adalah skenario prioritas-satu untuk mereka. Tim C # secara historis belum. Fitur tidak dapat diimplementasikan kecuali mereka adalah fitur prioritas tertinggi yang sesuai dengan anggaran; sampai sekarang, C # REPL belum ada di daftar teratas kami.

Proyek Roslyn memiliki C # REPL (dan akhirnya akan memiliki VB REPL juga, tetapi belum siap.) Anda dapat mengunduh rilis pratinjau untuk melihat bagaimana Anda menyukainya di

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

Eric Lippert
sumber
7
Python memiliki REPL yang bagus, dan memiliki pernyataan, efek samping, dan ruang nama. Demikian juga Javascript, Bash, dll. Banyak bahasa yang melanggar kriteria Anda memiliki REPL.
Lie Ryan
2
Selamat datang kembali Eric! Saya harap kami akan melihat lebih banyak jawaban dari Anda.
SolutionYogi
16
@ LieRyan Saya pikir Anda melewatkan seluruh poin. Satu-satunya "Kriteria" untuk loop REPL interaktif adalah bahwa seseorang duduk dan menulis satu; di F # itu adalah prioritas tinggi dan relatif mudah, di C # itu adalah prioritas rendah dan relatif sulit, sehingga F # mendapat satu sejak awal dan C # tidak.
KutuluMike
Menarik. Saya akan menambahkan bahwa pengalaman yang diperoleh membangun begitu banyak kompiler untuk .NET framework sebelum rilis VS2010 (saya hitung empat C #, empat VB.NET, dua J # dan dua C ++ / CLI) harus memengaruhi bagaimana kompiler baru untuk bahasa .NET baru dibangun. Saya yakin itu dibangun dalam gaya Roslyn-esque dengan banyak pemikiran tentang cara mengaktifkan skenario Compiler-as-a-Service, yang sepertinya arah Anda akan mengembangkan semua .NET kompiler dan revisi kompiler. Bagi saya tampaknya era di mana F # lahir pasti memainkan peran dalam bagaimana kompilernya ditulis.
Allon Guralnek
Jawaban yang bagus Tentang bahasa sintaksis Python vs C #: {} tidak cocok untuk REPL, bahasa berbasis indentasi memiliki kemajuan besar di sini. Tidak pernah terpikir oleh saya untuk berpikir atau mengatakannya: sintaks indentasi lebih baik daripada sintaks {}. Untuk REPLs serta untuk keterbacaan kode. Jadi selama tidak ada C # metasyntax yang menggantikan indentasi dengan {}, pengalaman REPL tidak akan pernah semulus misalnya dalam F # atau Python.
citykid
22

Mono memiliki C # repl: http://www.mono-project.com/CsharpRepl

Bahkan memiliki versi GUI yang memungkinkan Anda untuk secara langsung memanipulasi objek grafis, atau membuat widget Gtk #:

masukkan deskripsi gambar di sini

Lee
sumber
Tentu, dan itu pasti mungkin, tetapi apakah ada sesuatu tentang C # yang membuatnya lebih sulit?
George Mauer
2

Saya percaya itu sebagian besar merupakan hal bersejarah. Lingkungan REPL selalu dikaitkan dengan bahasa fungsional, termasuk bahasa keluarga ML, dan F # tetap setia pada tradisi itu. Perlu diingat bahwa lingkungan interaktif adalah sesuatu yang diterima oleh pengguna dari latar belakang fungsional, kurangnya fitur seperti itu akan menempatkan VS dan - dengan ekstensi - F #, pada posisi yang kurang menguntungkan.

Di sisi lain, tidak ada fitur seperti itu yang biasa di komunitas OOP.

Namun ada REPL tersedia untuk banyak bahasa non-fungsional, termasuk C, Java atau C #. Juga sementara itu jauh dari REPL yang lengkap, fitur Autos di VS menunjukkan bahwa itu pasti bisa dilakukan dengan C #.

scrwtp
sumber
1
Ini adalah penjelasan paling masuk akal yang pernah saya lihat. Pada awalnya, ada Fortran dan ada Lisp, dan Lisps telah diganti. Dasar begat ... yah, Anda mengerti. Bahasa garis keturunan Lisp telah diganti, dan garis keturunan Fortran tidak.
Aaron
@ Harun LISP adalah tahun 1959 tetapi REPL dikaitkan dengan mesin LISP, 1973. Saat itu, ada banyak, banyak bahasa sudah ada. Khususnya PASCAL dan Smalltalk.
Sprague
1

Saya percaya C # terutama berorientasi objek. Untuk menulis kode yang paling sederhana, Anda harus membaginya menjadi beberapa kelas. Untuk menggunakan REPL, Anda harus menulis banyak kode.

F # menjadi fungsional utamanya tidak memiliki masalah ini dan Anda dapat dengan mudah menulis kode kompleks bahkan dalam fasshion langsung dan mengubahnya menjadi objek / s nanti.

Lebih mudah untuk menulis satu baris fungsi daripada menulis kelas, yang mencakup banyak baris.

Euforia
sumber
1
Tidak ada yang menghentikan Anda dari menggunakan fungsi / kelas yang ditentukan dalam file eksternal dalam pernyataan REPL. Fakta bahwa OOP lebih bertele-tele tidak menghalangi fungsi REPL dengan sendirinya.
scrwtp
1
Python, yang sangat berorientasi objek dan menampilkan linebreaks yang signifikan secara sintaksis, memang memiliki REPL yang layak. Scala, yang diketik secara statis, dikompilasi, dan agak berorientasi objek, memang memiliki REPL. REPL paling berguna untuk hal-hal pendek seperti mengimpor kelas yang ada dan memanggil beberapa metode; verbositas bahasa tidak menjadi perhatian. Misalnya SQL cukup bertele-tele tetapi setiap database SQL dilengkapi dengan REPL ('alat permintaan').
9000