เหตุใด F # จึงมีโหมดโต้ตอบ แต่ไม่ใช่ C #


32

F # ออกมาพร้อมกับ REPL แบบโต้ตอบ C # ไม่มีการเรียงลำดับและจริง ๆ แล้วเป็นเรื่องยากที่จะเล่นโดยไม่ต้องตั้งค่าโปรเจ็กต์เต็มรูปแบบ (แม้ว่า LINQpad จะใช้งานได้

มีบางสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับภาษาที่อนุญาตให้ F # มีคอนโซลการโต้ตอบ แต่ทำให้ยากต่อการปรับใช้สำหรับ C # หรือไม่


ตั้งแต่หลายปีต่อมาผู้คนยังคงมาที่คำถามนี้ฉันควรทราบว่าตอนนี้มีตัวเลือกมากมาย คุณสามารถใช้ PowerShell (ติดตั้งล่วงหน้าในเครื่อง windows สมัยใหม่ทุกรุ่น) เพื่อเล่นกับ. Net framework หรือคุณสามารถใช้LinqPad ต้นแบบพลรหัส หรือคุณสามารถใช้ScriptCsหรือคุณสามารถใช้สภาพแวดล้อม jsfiddle ประเภทออนไลน์เช่นComplify.netหรือJsil ตัวเลือกมากมาย


4
C # จะมี REPL มันเรียกว่าหน้าต่างทันทีและเปิดให้ใช้งานมาระยะหนึ่งแล้ว มันมีข้อ จำกัด บางอย่างซึ่งบางอย่างก็สังเกตเห็นได้มากขึ้นตั้งแต่ C # 3.0 เนื่องจากคุณสมบัติภาษาใหม่ไม่ได้รับการสนับสนุน แต่มันก็เป็น REPL แบบเต็มรูปแบบ
Allon Guralnek


ฉันจำได้ว่าโครงการ Roslyn demo demo circa 2012 มี REPL อยู่ในนั้นสำหรับ VS2010
James

@DanielHakimi: ขอบคุณสำหรับความคิดเห็นนี้ฉันไม่มีเงื่อนงำที่รวมอยู่ใน VS2015 ฉันแค่คิดว่าคุณสามารถใช้หน้าต่างทันทีในขณะที่การดีบัก ขณะนี้ VS2015 มีหน้าต่างเครื่องมือC # Interactiveซึ่งสามารถเข้าถึงได้ผ่านทางมุมมอง -> Windows อื่น ๆ -> C # Interactive ซึ่งดูเหมือนว่าจะเป็น REPL ที่ยึดตาม Roslyn ทั้งหมดโดยแยกออกจากสภาพแวดล้อมการดีบัก
Lou

คำตอบ:


56

มีบางสิ่งที่แตกต่างกันโดยพื้นฐานเกี่ยวกับภาษาที่อนุญาตให้ F # มีคอนโซลการโต้ตอบ แต่ทำให้ยากต่อการปรับใช้สำหรับ C # หรือไม่

ใช่.

F # เป็นผู้สืบทอดของภาษาโปรแกรม ML ซึ่งได้รับอิทธิพลอย่างมากจากภาษาเช่น Lisp และ Scheme ภาษาเหล่านั้นได้รับการออกแบบตั้งแต่วันแรกที่มีคุณสมบัติที่ดีสามประการ

ครั้งแรกที่ภาษาเหล่านั้นไม่ได้มีงบในแบบที่คุณคิดใน C # แต่เกือบทุกอย่างเป็นนิพจน์ที่มีค่าดังนั้นกลไกการประเมินและพิมพ์ค่าจึงสมเหตุสมผลในเกือบทุกสถานการณ์

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

ประการที่สามงานส่วนใหญ่ที่คุณทำในภาษาเหล่านั้นคือ“ ที่ระดับสูงสุด”; โดยทั่วไปจะไม่มี“ คลาส” หรือ“ เนมสเปซ” ล้อมรอบหรือบริบทอื่น ๆ

ในทางตรงกันข้าม C # เน้นการควบคุมการเขียนโปรแกรมด้วยข้อความที่สร้างผลข้างเคียงและข้อความเหล่านั้นมักจะอยู่ในหลาย ๆ คอนเทนเนอร์ที่ซ้อนกัน - เนมสเปซ, คลาส, วิธีการและอื่น ๆ

ดังนั้นเหล่านี้เป็นทุกสิ่งที่ทำให้มันยากสำหรับ C # จะมี REPL แต่ไม่แน่นอนเป็นไปไม่ได้ เราแค่ต้องคิดออกว่าซีแมนทิกส์นั้นมีไว้สำหรับข้อความและนิพจน์ที่ปรากฏนอกบริบทปกติและอะไรที่ความหมายของการกลายพันธุ์ที่เปลี่ยนการผูกชื่อเป็นต้น

เหตุใด F # จึงมีโหมดโต้ตอบ แต่ไม่ใช่ C #

เนื่องจากทีม F # ตัดสินใจว่าการวนซ้ำ REPL เป็นสถานการณ์ที่มีลำดับความสำคัญเดียวสำหรับพวกเขา ในอดีตทีม C # ยังไม่มี คุณลักษณะจะไม่ถูกนำไปใช้นอกเสียจากว่ามันจะเป็นคุณสมบัติที่มีความสำคัญสูงสุดที่เหมาะสมกับงบประมาณ จนถึงตอนนี้ C # REPL ยังไม่ได้อยู่ในอันดับต้น ๆ ของรายการของเรา

โครงการ Roslyn มี C # REPL (และในที่สุดจะมี VB REPL เช่นกัน แต่ยังไม่พร้อม) คุณสามารถดาวน์โหลดรุ่นตัวอย่างเพื่อดูว่าคุณชอบมันได้ที่

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


7
Python มี REPL ที่ดีและมันมีคำสั่งผลข้างเคียงและเนมสเปซ เช่นเดียวกับ Javascript, Bash เป็นต้นภาษาที่ละเมิดหลักเกณฑ์ของคุณก็มี REPL อยู่ดี
โกหกไรอัน

2
ยินดีต้อนรับกลับสู่ Eric! ฉันหวังว่าเราจะได้เห็นคำตอบเพิ่มเติมจากคุณ
SolutionYogi

16
@LieRyan ฉันคิดว่าคุณพลาดจุดทั้งหมด "เกณฑ์" เพียงอย่างเดียวสำหรับลูป REPL แบบอินเทอร์แอคทีฟคือมีใครบางคนนั่งลงและเขียนมัน ใน F # มันมีลำดับความสำคัญสูงและค่อนข้างง่ายใน C # มันมีลำดับความสำคัญต่ำและค่อนข้างยากดังนั้น F # จึงมีหนึ่งช่วงต้นและ C # ไม่ได้
KutuluMike

น่าสนใจ ฉันจะเพิ่มว่าประสบการณ์ที่ได้รับการสร้างคอมไพเลอร์จำนวนมากสำหรับ. NET Framework ก่อนการเปิดตัว VS2010 (ฉันนับสี่ C # สี่ VB.NET สี่ J # และ C ++ / CLI สอง) ต้องได้รับผลกระทบวิธีคอมไพเลอร์ใหม่สำหรับ สร้าง. NET ภาษาใหม่เอี่ยม ฉันแน่ใจว่ามันถูกสร้างขึ้นในสไตล์ Roslyn-esque ที่มีความคิดมากมายเกี่ยวกับวิธีการเปิดใช้งานสถานการณ์ของ Compiler-as-a-Service ซึ่งดูเหมือนว่าทิศทางที่คุณจะพัฒนาคอมไพเลอร์. NET สำหรับฉันดูเหมือนว่ายุคที่ F # เกิดมามีบทบาทอย่างหลีกเลี่ยงไม่ได้ในการเขียนคอมไพเลอร์
Allon Guralnek

คำตอบที่ดี เกี่ยวกับ Python vs C #: {} ภาษาไวยากรณ์ไม่ได้โค้งงออย่างมีนัยสำคัญสำหรับ REPLs ภาษาที่ใช้การเยื้องมีความก้าวหน้าอย่างมากที่นี่ ไม่เคยคิดว่าฉันจะคิดหรือพูดว่า: ไวยากรณ์การเยื้องนั้นดีกว่า {} ไวยากรณ์ สำหรับ REPLs เช่นเดียวกับความสามารถในการอ่านรหัส ดังนั้นตราบใดที่ไม่มี C # metasyntax ที่แทนที่การเยื้องด้วย {} ประสบการณ์ REPL จะไม่ราบรื่นเหมือนใน F # หรือ Python
citykid

22

Mono มีแบบจำลอง C #: http://www.mono-project.com/CsharpRepl

มันยังมีเวอร์ชัน GUI ที่ให้คุณจัดการกับวัตถุกราฟิกโดยตรงหรือสร้าง Gtk # widgets:

ป้อนคำอธิบายรูปภาพที่นี่


แน่นอนและเป็นไปได้แน่นอน แต่มีบางอย่างเกี่ยวกับ C # ที่ทำให้ยากขึ้นหรือไม่
George Mauer

2

ฉันเชื่อว่าส่วนใหญ่เป็นเรื่องทางประวัติศาสตร์ สภาพแวดล้อม REPL มักจะเกี่ยวข้องกับภาษาที่ใช้งานได้รวมภาษาตระกูล ML และ F # ยังคงอยู่กับประเพณีนั้น โปรดทราบว่าสภาพแวดล้อมแบบอินเทอร์แอคทีฟนั้นเป็นสิ่งที่ผู้ใช้ที่มาจากพื้นหลังของฟังก์ชั่นใช้งานเพื่อรับสิทธิ์การขาดคุณสมบัติดังกล่าวจะทำให้ VS และ - โดยส่วนขยาย - F # เสียเปรียบ

ในทางตรงกันข้ามไม่มีคุณสมบัติดังกล่าวเป็นเรื่องธรรมดาในชุมชน OOP

อย่างไรก็ตามมี REPLs สำหรับภาษาที่ไม่สามารถใช้งานได้หลายภาษารวมถึง C, Java หรือ C # ในขณะที่มันเป็นหนทางไกลจาก REPL ที่เต็มเปี่ยมคุณลักษณะของรถยนต์ใน VS แสดงให้เห็นว่ามันสามารถใช้งานได้กับ C #


1
นี่เป็นคำอธิบายที่น่าเชื่อถือที่สุดที่ฉันเคยเห็น ในการเริ่มต้นมี Fortran และมี Lisp และ Lisps มี repls เสียงกระเพื่อมต้นกำเนิด ... ดีคุณจะได้รับความคิด ภาษาตระกูลเสียงกระเพื่อมมีตัวแทนและเชื้อสายฟอร์แทรนไม่ได้
แอรอน

@Aaron LISP คือ 1959 แต่ REPL มีสาเหตุมาจากเครื่องจักร LISP ในปี 1973 จากนั้นมีหลายภาษาหลายภาษาอยู่แล้ว PASCAL และ Smalltalk โดยเฉพาะ
Sprague

1

ฉันเชื่อว่า C # เป็นวัตถุเชิง ในการเขียนโค้ดที่ง่ายที่สุดคุณควรแบ่งมันเป็นหลาย ๆ คลาส ในการใช้ REPL คุณจะต้องเขียนโค้ดจำนวนมาก

F # เป็นฟังก์ชันหลักที่ไม่มีปัญหานี้และคุณสามารถเขียนรหัสที่ซับซ้อนได้อย่างง่ายดายใน fasshion ที่ตรงไปตรงมาและแปลงเป็นวัตถุ / s ในภายหลัง

มันง่ายกว่าที่จะเขียนฟังก์ชั่นบรรทัดเดียวมากกว่าเขียนคลาสที่ครอบคลุมหลายบรรทัด


1
ไม่มีอะไรหยุดคุณจากการใช้ฟังก์ชัน / คลาสที่กำหนดในไฟล์ภายนอกในคำสั่ง REPL ความจริงที่ว่า OOP เป็น verbose มากกว่านั้นไม่ได้ขัดขวางการทำงานของ REPL ด้วยตัวเอง
scrwtp

1
Python ค่อนข้างเชิงวัตถุและมีการกระจายบรรทัดที่มีความสำคัญทาง syntactically มี REPL ที่เหมาะสม Scala ถูกพิมพ์รวบรวมและค่อนข้างเชิงวัตถุจะมี REPL REPL มีประโยชน์มากที่สุดสำหรับสิ่งสั้น ๆ เช่นการนำเข้าคลาสที่มีอยู่และเรียกวิธีการบางอย่าง การใช้คำฟุ่มเฟื่อยของภาษาไม่ได้เป็นความกังวล เช่น SQL ค่อนข้างละเอียด แต่ฐานข้อมูล SQL ทุกอันมาพร้อมกับ REPL ('เครื่องมือสืบค้น')
9000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.