ประโยชน์ของการใช้ C # vs F # หรือ F # vs C # คืออะไร? [ปิด]


93

ฉันทำงานให้กับ บริษัท เทคโนโลยีที่ทำต้นแบบมากกว่าการจัดส่งผลิตภัณฑ์ ฉันเพิ่งถูกถามว่าอะไรคือความแตกต่างระหว่าง C # และ F # ทำไม MS จึงสร้าง F # และสถานการณ์ใดที่จะดีกว่า C #

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

ประโยชน์ของการใช้ C # vs F # หรือ F # vs C # คืออะไร?


4
สำหรับฉันแล้วดูเหมือนว่าจะมีคำถามมากมายเกี่ยวกับ SO ซึ่งอย่างน้อยก็ตอบคำถามของคุณได้บางส่วน คุณได้ลองค้นหาโดยใช้ "[F #] keyword" แทน "f # keyword" หรือยัง? ("[f #] ข้อดี" เป็นต้น)
Benjol

คำตอบ:


86

ประโยชน์ทั่วไปของการเขียนโปรแกรมเชิงฟังก์ชันในภาษาที่จำเป็น:

คุณสามารถกำหนดปัญหาต่างๆได้ง่ายขึ้นใกล้เคียงกับคำจำกัดความและกระชับมากขึ้นในภาษาการเขียนโปรแกรมที่ใช้งานได้เช่น F # และรหัสของคุณมีโอกาสเกิดข้อผิดพลาดน้อยกว่า (ไม่สามารถเปลี่ยนรูปได้, ระบบประเภทที่มีประสิทธิภาพมากขึ้น, อัลกอริธึมซ้ำที่ใช้งานง่าย) คุณสามารถเขียนรหัสสิ่งที่คุณหมายถึงแทนสิ่งที่คอมพิวเตอร์ต้องการให้คุณพูด ;-) คุณจะพบการสนทนามากมายเช่นนี้เมื่อคุณใช้ Google หรือแม้แต่ค้นหาที่ SO

F # พิเศษ - ข้อดี:

  • การเขียนโปรแกรมแบบอะซิงโครนัสนั้นง่ายมากและใช้งานง่ายด้วยasync {}-expressions - แม้จะใช้ ParallelFX แต่ C # -code ที่เกี่ยวข้องก็มีขนาดใหญ่กว่ามาก

  • รวมคอมไพเลอร์คอมไพเลอร์และภาษาเฉพาะโดเมนได้ง่ายมาก

  • ขยายภาษาตามที่คุณต้องการ: LOP

  • หน่วยวัด

  • ไวยากรณ์ที่ยืดหยุ่นมากขึ้น

  • มักจะสั้นและสวยกว่า

ลองดูเอกสารนี้

ข้อดีของ C # คือมักจะมีความแม่นยำในการ "จำเป็น" - แอปพลิเคชัน (อินเทอร์เฟซผู้ใช้อัลกอริทึมที่จำเป็น) มากกว่าภาษาโปรแกรมที่ใช้งานได้ซึ่ง. NET-Framework ที่ใช้นั้นได้รับการออกแบบมาอย่างจำเป็นและแพร่หลายมากขึ้น

นอกจากนี้คุณสามารถมี F # และ C # ร่วมกันในโซลูชันเดียวเพื่อให้คุณสามารถรวมประโยชน์ของทั้งสองภาษาและใช้ในที่ที่ต้องการได้


16
พวกเขารวมกันในรูปแบบที่แปลกมาก ตัวอย่างเช่นคุณสามารถโอเวอร์โหลดตัวดำเนินการ> ใน F # ได้ จากนั้นนักพัฒนา C # สามารถใช้งานได้ อย่างไรก็ตามนักพัฒนา F # ทำไม่ได้ ถูกต้อง F # สามารถปล่อยโอเปอเรเตอร์โอเวอร์โหลดที่ไม่สามารถใช้งานได้
Jonathan Allen

ลิงก์ "เอกสารนี้" เสีย ...
Eduardo Brites

36

ก็เหมือนกับการถามว่าค้อนกับไขควงมีประโยชน์อย่างไร ในระดับที่สูงมากทั้งคู่ทำสิ่งเดียวกันเป็นหลัก แต่ในระดับการนำไปใช้สิ่งสำคัญคือต้องเลือกเครื่องมือที่เหมาะสมที่สุดสำหรับสิ่งที่คุณพยายามจะทำให้สำเร็จ มีงานที่ยากและใช้เวลานานใน c # แต่ทำได้ง่ายใน f # เช่นพยายามตอกตะปูด้วยไขควง คุณทำได้แน่นอน - มันไม่เหมาะอย่างยิ่ง

การจัดการข้อมูลเป็นตัวอย่างหนึ่งที่ฉันสามารถชี้ให้เห็นว่า f # ส่องแสงจริงๆและ c # อาจจะเทอะทะได้ ในทางกลับกันฉันจะบอกว่า (พูดโดยทั่วไป) UI แบบ stateful ที่ซับซ้อนนั้นง่ายกว่าใน OO (c #) มากกว่าฟังก์ชัน (f #) (คงมีบางคนที่ไม่เห็นด้วยกับเรื่องนี้เพราะตอนนี้มัน "เจ๋ง" ในการ "พิสูจน์" ว่าการทำอะไรใน F # มันง่ายแค่ไหนแต่ฉันก็ยืนหยัดอยู่ได้) ยังมีอีกมากมายนับไม่ถ้วน


22
ถ้าคุณมีเพียงค้อนทุกอย่างก็ดูเหมือนตะปู -Maslow
Charlie Salts

20
ฉันจะไม่โหวตเรื่องนี้เพราะมันไม่ได้ให้ข้อมูลเฉพาะที่แท้จริงยกเว้นตัวอย่างข้อมูลเดียว ฉันรู้ว่ามันเป็นเครื่องมือที่แตกต่างกัน ฉันกำลังถามว่าเครื่องมือทั้งสองนี้ดีที่สุดและแย่ที่สุดเมื่อเปรียบเทียบกัน ฉันรู้ว่าฟิลิปส์มักจะเป็นเครื่องมือที่ดีที่สุดสำหรับงานแม้ว่าแฟลตเฮดที่เล็กกว่าจะใช้งานได้
gradbot

1
ฮ่า ๆ ขอบคุณ @Spencer;) @gradbot - ไม่มีปัญหา! ขออภัยคำตอบของฉันไม่ตรงกับสิ่งที่คุณกำลังมองหา ... หวังว่าคนอื่นจะพบว่ามีประโยชน์
Rex M

14
ถ้าสิ่งที่คุณมีคือค้อนทุกอย่างก็ดูเหมือนหัวแม่มือ
Ed Power

6
ฉันเห็นด้วยกับ gradbot นี่เป็นคำตอบที่ดีดังนั้นจึงไม่มีการลงคะแนนจากฉัน แต่มันไม่ได้ตอบคำถามเฉพาะของคำถามเดิม คำตอบนี้เป็นเพียงคำอธิบายแนวความคิดที่คลุมเครือ แต่พลาดประเด็นที่จะตอบคำถามนั้นอย่างแน่นอน
สแตนอาร์

27
  • F # มีประสิทธิภาพดีกว่า C # ในวิชาคณิตศาสตร์
  • คุณสามารถใช้โครงการ F # ในโซลูชันเดียวกันกับ C # (และโทรจากกันได้)
  • F # เหมาะสำหรับการเขียนโปรแกรมอัลกอริธึมที่ซับซ้อนแอปพลิเคชันทางการเงินและวิทยาศาสตร์
  • F # มีเหตุผลดีมากสำหรับการดำเนินการแบบขนาน (การรันโค้ด F # บนคอร์ขนานจะง่ายกว่า C #)

6
เกี่ยวกับ F # มีประสิทธิภาพที่ดีกว่า C # สำหรับคณิตศาสตร์: เห็นได้ชัดว่านั่นไม่เป็นความจริง ดูthoughtfulcode.wordpress.com/2010/12/30/...
โจ้

3
@Joh: inlineเป็นตัวอย่างที่ชัดเจนของสิ่งที่สามารถปรับปรุงประสิทธิภาพการทำงานได้อย่างมากใน F # ที่ C # ไม่สามารถแสดงออกได้
JD

@ จอนฮาร์ร็อป: ฉันอ้างถึงรายการบล็อกของ Rinat โดยเฉพาะ ดูเหมือนว่าการกำหนดเวลาจะเป็นไปตาม F # ที่เขาได้รับนั้นมาจากรหัส C # ที่ไม่เหมาะสม
โจ้

27

เพื่อตอบคำถามของคุณตามที่ฉันเข้าใจ: ทำไมต้องใช้ C #? (คุณบอกว่าคุณขายแล้วบน F #)

ก่อนอื่น ไม่ใช่แค่ "ฟังก์ชันเทียบกับ OO" มันคือ "Functional + OO กับ OO" คุณสมบัติการทำงานของ C # ค่อนข้างเป็นพื้นฐาน F # ไม่ใช่ ในขณะเดียวกัน F # ก็ทำหน้าที่ OO ของ C # เกือบทั้งหมด ส่วนใหญ่แล้ว F # จะกลายเป็นส่วนเหนือของฟังก์ชันการทำงานของ C #

อย่างไรก็ตามมีบางกรณีที่ F # อาจไม่ใช่ทางเลือกที่ดีที่สุด:

  • การทำงานร่วมกัน มีห้องสมุดมากมายที่จะไม่สะดวกสบายเกินไปจาก F # บางทีพวกเขาอาจใช้ประโยชน์จากสิ่ง C # OO บางอย่างที่ F # ไม่ได้ทำเหมือนกันหรือบางทีพวกเขาอาจอาศัยภายในของคอมไพเลอร์ C # ตัวอย่างเช่น Expression ในขณะที่คุณสามารถเปลี่ยนใบเสนอราคา F # ให้เป็นนิพจน์ได้อย่างง่ายดาย แต่ผลลัพธ์ก็ไม่ใช่สิ่งที่ C # จะสร้างขึ้นเสมอไป ห้องสมุดบางแห่งมีปัญหาในเรื่องนี้

    • ใช่การทำงานร่วมกันเป็นเครือข่ายที่ค่อนข้างใหญ่และอาจส่งผลให้เกิดความขัดแย้งกับห้องสมุดบางแห่ง

    • ฉันถือว่า interop รวมอยู่ด้วยหากคุณมี codebase ขนาดใหญ่ที่มีอยู่ อาจไม่สมเหตุสมผลที่จะเริ่มเขียนส่วนต่างๆใน F #

  • ออกแบบเครื่องมือ F # ไม่มีเลย ไม่ได้หมายความว่ามันไม่มีเลย แต่ตอนนี้คุณไม่สามารถสร้างแอป WinForms ด้วย F # codebehind ได้ แม้ว่าจะรองรับในที่ใดเช่นในเพจ ASPX คุณยังไม่ได้รับ IntelliSense ดังนั้นคุณต้องพิจารณาอย่างรอบคอบว่าขอบเขตของคุณจะอยู่ที่ใดสำหรับโค้ดที่สร้างขึ้น ในโปรเจ็กต์เล็ก ๆ ที่แทบจะใช้นักออกแบบหลาย ๆ คนเท่านั้นการใช้ F # สำหรับ "กาว" หรือตรรกะอาจไม่คุ้มค่า ในโครงการขนาดใหญ่สิ่งนี้อาจกลายเป็นปัญหาน้อยกว่า

    • นี่ไม่ใช่ปัญหาที่แท้จริง ไม่เหมือนคำตอบของ Rex M ฉันไม่เห็นอะไรที่เป็นเนื้อแท้เกี่ยวกับ C # หรือ F # ที่ทำให้พวกเขาทำ UI ได้ดีขึ้นโดยมีฟิลด์ที่เปลี่ยนแปลงได้มากมาย บางทีเขาอาจหมายถึงค่าใช้จ่ายพิเศษที่ต้องเขียน "ไม่แน่นอน" และใช้ <- แทน =

    • ยังขึ้นอยู่กับไลบรารี / ผู้ออกแบบที่ใช้ เราชอบใช้ ASP.NET MVC กับ F # สำหรับคอนโทรลเลอร์ทั้งหมดจากนั้นจึงสร้างโครงการเว็บ C # เพื่อรับนักออกแบบ ASPX เราผสม ASPX "โค้ดในบรรทัด" จริงระหว่าง C # และ F # ขึ้นอยู่กับสิ่งที่เราต้องการในหน้านั้น (IntelliSense เทียบกับประเภท F #)

  • เครื่องมืออื่น ๆ พวกเขาอาจจะคาดหวัง C # เท่านั้นและไม่รู้ว่าจะจัดการกับโครงการ F # หรือโค้ดที่คอมไพล์อย่างไร นอกจากนี้ไลบรารีของ F # ไม่ได้จัดส่งเป็นส่วนหนึ่งของ. NET ดังนั้นคุณจึงมีอะไรเพิ่มเติมเล็กน้อยในการจัดส่ง

  • แต่ประเด็นที่หนึ่ง? คน. หากนักพัฒนาของคุณไม่ต้องการเรียนรู้ F # หรือแย่กว่านั้นคือมีปัญหาอย่างมากในการทำความเข้าใจบางแง่มุมคุณก็อาจจะเป็นขนมปังปิ้ง (แม้ว่าฉันจะเถียงว่าคุณกำลังปิ้งขนมปังก็ตามในกรณีนั้น) อ้อและถ้าฝ่ายบริหารบอกว่าไม่นั่นอาจเป็นปัญหา

ฉันเขียนเกี่ยวกับเรื่องนี้เมื่อไม่นานมานี้: ทำไมไม่ F #?


6

คุณกำลังต้องการเปรียบเทียบระหว่างภาษาขั้นตอนและภาษาที่ใช้งานได้ดังนั้นฉันคิดว่าคำถามของคุณสามารถตอบได้ที่นี่: อะไรคือความแตกต่างระหว่างการเขียนโปรแกรมขั้นตอนและการเขียนโปรแกรมเชิงฟังก์ชัน?

เหตุใด MS จึงสร้าง F # คำตอบก็คือการสร้างภาษาที่ใช้งานได้พร้อมการเข้าถึงไลบรารี. Net ช่วยขยายฐานตลาดของพวกเขา และเมื่อเห็นว่าไวยากรณ์นั้นเกือบจะเหมือนกับ OCaml แต่ก็ไม่ต้องใช้ความพยายามมาก


1
แม้ว่าฉันคิดว่าคำตอบทั่วไปของคุณถูกต้องว่าคำถามที่แท้จริงเกี่ยวกับการเปรียบเทียบกระบวนทัศน์การเขียนโปรแกรมไม่ใช่ภาษา แต่ฉันรู้สึกว่าคำตอบในคำถามที่คุณอ้างถึงนั้นค่อนข้างตื้น
Jeroen Huinink

อย่าลังเลที่จะแนะนำคำถามอื่นหากคุณมีคำถามที่ดีกว่า นั่นคืออันดับสูงสุดที่ฉันพบจากการค้นหาโดย Google
Spencer Ruport

1
ฉันคิดว่าเขาพยายามที่จะใจดีกับคุณที่ฟังดูเหมือนตูดเพราะการพูดว่า F # ไม่ต้องใช้ความพยายามมากนักในส่วนของ Micrsoft
Matthew Whited

1
ฉันไม่ซื้อในลิงค์อื่นที่ตอบคำถามของฉัน C # รองรับโครงสร้างการทำงานจำนวนมากในเวอร์ชันที่ใหม่กว่า
gradbot

C # vs F #! = ขั้นตอนและฟังก์ชัน
JD

5

F # ยังไม่ใช่ภาษาการเขียนโปรแกรมอื่นหากคุณกำลังเปรียบเทียบกับ C #, C ++, VB C #, C, VB เป็นภาษาการเขียนโปรแกรมที่จำเป็นหรือขั้นตอนทั้งหมด F # เป็นภาษาโปรแกรมที่ใช้งานได้

ประโยชน์หลักสองประการของภาษาโปรแกรมที่ใช้งานได้ (เมื่อเทียบกับภาษาที่จำเป็น) คือ 1. ภาษาเหล่านี้ไม่มีผลข้างเคียง ทำให้การให้เหตุผลทางคณิตศาสตร์เกี่ยวกับคุณสมบัติของโปรแกรมของคุณง่ายขึ้นมาก 2. หน้าที่นั้นเป็นพลเมืองชั้นหนึ่ง คุณสามารถส่งผ่านฟังก์ชันที่เป็นพารามิเตอร์ไปยังฟังก์ชันอื่นได้เช่นเดียวกับค่าอื่น ๆ

ทั้งภาษาโปรแกรมที่จำเป็นและใช้งานได้มีประโยชน์ แม้ว่าฉันจะยังไม่ได้ทำงานจริงจังใน F # แต่เรากำลังใช้ส่วนประกอบการตั้งเวลาในผลิตภัณฑ์ของเราตาม C # และกำลังจะทำการทดลองโดยการเข้ารหัสตัวกำหนดตารางเวลาเดียวกันใน F # ด้วยเพื่อดูว่าความถูกต้องของ การใช้งานสามารถตรวจสอบได้ง่ายกว่าการเทียบเท่า C #


4
-1. F # เป็นภาษาหลายกระบวนทัศน์ (OO + FP) เพียงอย่างหมดจดภาษาการทำงานไม่ได้มีผลข้างเคียง (เช่น Haskell) แต่ F # ไม่บริสุทธิ์
Mauricio Scheffer

5

F # คือ C ++ ของภาษาโปรแกรมที่ใช้งานได้ พวกเขาเก็บเกือบทุกอย่างจาก Objective Caml รวมถึงชิ้นส่วนที่โง่จริงๆและโยนมันไว้บนรันไทม์. NET ในลักษณะที่นำสิ่งเลวร้ายทั้งหมดจาก. NET มาด้วย

ตัวอย่างเช่นด้วย Objective Caml คุณจะได้รับ null ประเภทหนึ่งตัวเลือก <T> ด้วย F # คุณจะได้ค่า null สามประเภทตัวเลือก <T> Nullable <T> และค่าว่างอ้างอิง ซึ่งหมายความว่าหากคุณมีตัวเลือกที่คุณต้องตรวจสอบก่อนว่าเป็น "ไม่มี" หรือไม่คุณต้องตรวจสอบว่าเป็น "บางส่วน (null)" หรือไม่

F # ก็เหมือนกับ Java clone J # ซึ่งเป็นเพียงภาษาที่ไม่เหมาะสมเพียงเพื่อดึงดูดความสนใจ บางคนจะชอบมันบางคนจะใช้มันด้วยซ้ำ แต่ในท้ายที่สุดมันก็ยังคงเป็นภาษาที่มีอายุ 20 ปีที่ติดอยู่ใน CLR


หวังว่ามวลชนจะเอาชนะความรู้สึกบางอย่างในตัวพวกเขาและ F # 5 จะเป็นประโยชน์มากขึ้น
Jonathan Allen

1
ฉันยอมรับว่า Nullable <T> ควรให้คอมไพเลอร์ทำนามแฝงมายากลให้เรา ฉันไม่แน่ใจว่าการทำให้ "บางค่าว่าง" เทียบเท่ากับ "ไม่มี" จะใช้ได้ผลเสมอไป - รหัสการทำงานร่วมกันบางรหัสอาจอาศัยอยู่ แต่อ้างอิงโมฆะ? คุณจะแก้ไขปัญหาสำคัญใน. NET ได้อย่างไร รวมข้อมูลอ้างอิงทุกประเภทในตัวเลือกหรือไม่ ในทางปฏิบัติดูเหมือนว่าจะเป็นปัญหากับสถานการณ์การทำงานร่วมกันบางอย่างเท่านั้น
MichaelGG

12
FWIW ฉันเขียนโค้ดอย่างมืออาชีพใน F # มาหลายปีแล้ว (นานกว่าคนอื่น ๆ ในโลก) และฉันไม่เคยเห็นปัญหานี้หรือรหัสSome nullในรหัสF # ที่ไหนเลย ของทุกสิ่งที่คนอาจจะจับเรื่องนี้จะต้องมีwaaayลงในรายการ ...
JD

1
การเปรียบเทียบ F # กับ C ++ เป็นเรื่องที่เข้าใจยาก หลายส่วนของ C ++ มีความหมายที่ไม่ได้กำหนดหรือไม่ชัดเจน F # นั้นเรียบง่ายและมีความหมายชัดเจน คุณภาพของรันไทม์. NET ไม่สามารถเทียบกับ F # ได้เนื่องจากภาษา. NET ใด ๆ ก็จะมีปัญหาเดียวกัน
Joh

1
ในการเขียนโปรแกรม F # แบบมืออาชีพกว่า 2 ปีเช่น @Jon ฉันไม่เคยเห็นปัญหาใด ๆ ที่เกี่ยวข้องกับ 'Some null' ในทางกลับกันฉันได้รับประโยชน์อย่างมากจากคุณสมบัติของ. Net framework
Marc Sigrist

5

หนึ่งในแง่มุมของ. NET ที่ฉันชอบมากที่สุดคือเรื่องทั่วไป แม้ว่าคุณจะเขียนโค้ดขั้นตอนใน F # คุณจะยังคงได้รับประโยชน์จากการอนุมานประเภท ทำให้การเขียนโค้ดทั่วไปเป็นเรื่องง่าย

ใน C # คุณเขียนโค้ดที่เป็นรูปธรรมโดยค่าเริ่มต้นและคุณต้องทำงานพิเศษบางอย่างเพื่อเขียนโค้ดทั่วไป

ใน F # คุณเขียนโค้ดทั่วไปตามค่าเริ่มต้น หลังจากใช้เวลานานกว่าหนึ่งปีในการเขียนโปรแกรมทั้งใน F # และ C # ฉันพบว่ารหัสไลบรารีที่ฉันเขียนใน F # นั้นทั้งกระชับและกว้างกว่าโค้ดที่ฉันเขียนใน C # ดังนั้นจึงสามารถใช้ซ้ำได้มากกว่าด้วย ฉันพลาดโอกาสมากมายในการเขียนโค้ดทั่วไปใน C # อาจเป็นเพราะฉันไม่เข้าใจคำอธิบายประกอบประเภทบังคับ

อย่างไรก็ตามมีสถานการณ์ที่ควรใช้ C # ขึ้นอยู่กับรสนิยมและรูปแบบการเขียนโปรแกรม

  • C # ไม่ได้กำหนดลำดับของการประกาศตามประเภทและไม่ไวต่อลำดับการคอมไพล์ไฟล์
  • C # มีการแปลงโดยนัยบางอย่างที่ F # ไม่สามารถจ่ายได้เนื่องจากการอนุมานประเภท
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.