Ruby เป็นภาษาที่ใช้งานได้หรือไม่?


88

Wikipedia บอกว่า Ruby เป็นภาษาที่ใช้งานได้ แต่ฉันไม่มั่นใจ ทำไมหรือทำไมไม่?


4
อาจเป็นเพราะคำถามของคุณสั้นมาก แต่โดยส่วนตัวแล้วฉันไม่มีปัญหาอะไรเลย!
ljs

มีคำตอบที่ดีอยู่แล้วดังนั้นเพื่อเติมเต็มคู่ของเนื้อหาที่กล่าวถึง FP และ Ruby: code.google.com/p/tokland/wiki/RubyFunctionalProgramming slideshare.net/tokland/functional-programming-with-ruby-9975242
tokland

1
หากใครสนใจหัวข้อนี้โปรดดูสิ่งนี้และคุณจะได้เรียนรู้ว่าทับทิมสามารถใช้งานได้อย่างไรรากของการเขียนโปรแกรมเชิงฟังก์ชันคืออะไรทำไมทับทิมจึงไม่ใช่ภาษาที่ใช้งานได้แม้ว่าจะสามารถเขียนโปรแกรมฟังก์ชันได้ก็ตาม: youtube .com / watch? v = 5ZjwEPupybw
maddin2code

คำตอบ:


29

แน่นอนที่สุดฉันคิดว่าคุณสามารถใช้รูปแบบการทำงานใน Ruby ได้

สิ่งที่สำคัญที่สุดอย่างหนึ่งในการเขียนโปรแกรมในรูปแบบการทำงานคือหากภาษารองรับฟังก์ชันลำดับที่สูงขึ้น ... ซึ่ง Ruby ทำ

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

ใช่มันรองรับรูปแบบการใช้งาน แต่ยังช่วยให้คุณตั้งโปรแกรมในรูปแบบที่ไม่ใช้งานได้อีกด้วย


4
เมื่อใช้เกณฑ์นี้คุณจะบอกว่า Smalltalk ใช้งานได้เพราะมีบล็อกหรือไม่?
OscarRyz

คำตอบที่ดี แต่หนึ่ง nitpick - ฟังก์ชันลำดับที่สูงกว่านั้นไม่จำเป็นสำหรับรูปแบบการทำงาน เช่นคุณสามารถบรรลุรูปแบบการทำงานใน Java (ซึ่งไม่มีฟังก์ชันลำดับที่หนึ่ง / ฟังก์ชันลำดับที่สูงกว่า) โดยการกำหนดอ็อบเจ็กต์ฟังก์ชันและเรียบเรียงเพื่อให้ได้ผลเช่นเดียวกับฟังก์ชันลำดับที่สูงขึ้น
mikera

2
เพียงแค่ต้องการระบุว่า @peter ถามIs ruby a functional language?และตอบตรงๆคือไม่ Ruby เป็นภาษาเชิงวัตถุที่มีคุณสมบัติการทำงานบางอย่าง
Elias Perez

58

ไม่ว่าภาษาจะเป็นหรือไม่ใช่ภาษาที่ใช้งานได้ก็ไม่สำคัญ Functional Programming เป็นวิทยานิพนธ์ที่อธิบายได้ดีที่สุดโดย Philip Wadler (The Essence of Functional Programming) และ John Hughes (Why Functional Programming Matters)

คำถามที่มีความหมายคือ 'Ruby สามารถตอบสนองต่อการบรรลุวิทยานิพนธ์ของโปรแกรมเชิงฟังก์ชันได้อย่างไร? คำตอบคือ 'แย่มาก'

ฉันได้พูดคุยเกี่ยวกับเรื่องนี้เมื่อไม่นานมานี้ นี่คือสไลด์


3
สไลด์ที่คุณให้มาไม่ได้กล่าวถึงสาเหตุที่ Ruby "ไม่ค่อยตอบสนองต่อการทำวิทยานิพนธ์ของ FP" เหตุใด C # จึงตอบสนองได้ดีกว่า Java (ตกลงฟังก์ชั่นนิรนามที่ง่ายกว่า?) เป็นเพราะคุณสามารถมีตัวแปรส่วนกลางใน Ruby ได้หรือไม่?
kizzx2

7
ไม่มีสไลด์ที่ไม่ได้ลงรายละเอียดนี้เนื่องจากเป็นหัวข้อที่ค่อนข้างครอบคลุม เมื่อเสี่ยงต่อการทำให้เข้าใจง่ายเกินไปตัวอย่างเช่น Ruby บังคับใช้รูปแบบการประเมิน (การเรียกตามค่า) ที่ทำให้มั่นใจได้ว่าไม่มีองค์ประกอบของโปรแกรม ผลกระทบของสิ่งนี้สามารถประเมินได้ง่าย Ruby ยังแต่งงานกับความคิดที่ว่าโปรแกรมเป็นลำดับของเอฟเฟกต์ กล่าวคือ Ruby ออกนอกเส้นทางที่จะทำให้การใช้โมเดลการคำนวณอื่น ๆ ทำได้ยาก / ไม่สามารถทำได้ ฉันหวังว่าความคิดเห็นสั้น ๆ นี้จะช่วยได้
Tony Morris

2
+1 สำหรับชี้ให้เห็นความคลุมเครือในการจำแนกภาษาว่าใช้งานได้ นรกฉันเขียนฟังก์ชัน C!
เอลี

1
ทำไม C # จึงคล้อยตาม Ruby?
dan_l

1
คำตอบที่เชื่อมโยงอย่างเดียวได้อย่างมีประสิทธิภาพเนื่องจากเป็นการดึงส่วนสำคัญของคำอธิบาย (คำอธิบายทั้งหมดในความเป็นจริง) ไปยังลิงก์ภายนอก ตอนนี้ลิงค์เสียชีวิตคำตอบก็ไร้ประโยชน์
ivan_pozdeev

34

Ruby รองรับฟังก์ชันระดับสูงกว่า (ดู Array # map, injection, & select) แต่ก็ยังคงเป็นภาษาที่มีความจำเป็นเชิงวัตถุ

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

ลักษณะสำคัญอีกประการหนึ่งของภาษาที่ใช้งานได้คือเน้นที่การกำหนดโปรแกรมในรูปแบบของ "อะไร" แทนที่จะเป็น "อย่างไร" เมื่อเขียนโปรแกรมด้วยภาษา OO เราจะเขียนคลาสและวิธีการเพื่อซ่อนการนำไปใช้งาน ("how") จาก "what" (ชื่อคลาส / วิธีการ) แต่ในที่สุดวิธีการเหล่านี้ก็ยังคงเขียนโดยใช้ลำดับของคำสั่ง ในภาษาที่ใช้งานได้คุณไม่ได้ระบุลำดับของการดำเนินการแม้ว่าจะอยู่ในระดับต่ำสุดก็ตาม


3
ฉันเห็นด้วยกับข้อความส่วนใหญ่ของคุณอย่างไรก็ตามฉันไม่เห็นด้วยกับ "ภาษาที่ใช้งานได้ไม่มีแนวคิดของตัวแปรเหมือนที่คุณมีใน Java เป็นต้น" ใน haskell คุณสามารถใช้ตัวแปรในฟังก์ชันบริสุทธิ์คุณยังสามารถกำหนดฟังก์ชันให้กับตัวแปรได้อีกด้วยความแตกต่างที่ใหญ่ที่สุดคือเมื่อกำหนดตัวแปรแล้วจะไม่สามารถแก้ไขได้ในภายหลัง
HHC

6
HHC ตามความหมายตัวแปรคือค่าที่สามารถเปลี่ยนแปลงได้ สิ่งที่คุณกำลังพูดถึงคือค่านิยม
Scala Newb

"ตัวแปรที่ไม่สามารถแก้ไขได้" ของ Haskell เป็นเพียงฟังก์ชันคงที่โดยไม่มีพารามิเตอร์ (คำจำกัดความ)
raindev

16

ฉันส่งว่าการสนับสนุนหรือมีความสามารถในการเขียนโปรแกรมในภาษาในรูปแบบการทำงานนั้นไม่ใช่ภาษาที่ใช้งานได้

ฉันยังสามารถเขียนโค้ด Java ในสไตล์การทำงานถ้าผมต้องการที่จะทำร้ายร่วมงานของผมและตัวผมเองไม่กี่เดือนสัปดาห์

มีภาษาทำงานไม่เพียงเกี่ยวกับสิ่งที่คุณสามารถทำเช่นฟังก์ชั่นขั้นสูงฟังก์ชั่นชั้นแรกและ currying นอกจากนี้ยังเกี่ยวกับสิ่งที่คุณไม่สามารถทำได้เช่นผลข้างเคียงในฟังก์ชันบริสุทธิ์

นี่เป็นสิ่งสำคัญเนื่องจากเป็นส่วนสำคัญของเหตุผลที่ว่าทำไมโปรแกรมที่ใช้งานได้หรือรหัสการทำงานใน generel จึงเป็นเหตุผลที่ง่ายกว่า และเมื่อรหัสง่ายต่อการให้เหตุผลข้อบกพร่องจะตื้นขึ้นและลอยไปที่พื้นผิวแนวความคิดซึ่งสามารถแก้ไขได้ซึ่งจะทำให้โค้ดบั๊กน้อยลง

Ruby เป็นแกนหลักในเชิงวัตถุดังนั้นแม้ว่าจะมีการสนับสนุนที่ดีพอสมควรสำหรับรูปแบบการทำงาน แต่ก็ไม่ใช่ภาษาที่ใช้งานได้

นั่นคือความคิดเห็นที่ไม่ใช่วิทยาศาสตร์ของฉันอยู่ดี

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

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

ตอนนี้นั่นคือความคิดเห็นที่ไม่ใช่วิทยาศาสตร์ของฉัน


ฉันคิดว่าคุณสามารถสร้างกรณีที่ดีกว่าในการเรียก Ruby ที่ใช้งานได้ดีกว่า Java .... ไม่ Ruby ไม่ได้ทำงานอย่างเคร่งครัด แต่มันค่อนข้างง่ายที่จะใช้รูปแบบการทำงานในนั้น ... และเพื่อนร่วมงานสไตล์ที่ไม่ใช้งานสามารถทำได้ เปลี่ยนกลับเป็นใช้งานไม่ได้อย่างง่ายดาย
Mike Stone

1
ใช่ไมค์หากคุณต้องการเขียนโค้ดในรูปแบบการใช้งาน Ruby คือการปรับปรุง Java อย่างมาก ฉันใช้ Java เพื่อพูดเกินจริงและตอกประเด็นกลับบ้าน
Chris Vest

ดังนั้นเนื่องจาก D มีฟังก์ชันที่แท้จริงคุณจึงเรียก D ว่าเป็นภาษาที่ใช้งานได้หรือไม่? digitalmars.com/d/2.0/function.html#pure-functions
Peter Burns

3
หลายคนพิจารณาภาษาที่ใช้งานได้ของ Lisp และ Scheme ส่วนใหญ่เกิดจากการใช้ฟังก์ชันที่ไม่ระบุตัวตนอย่างแพร่หลาย แต่ถึงกระนั้นพวกเขาก็ยังขาดการรับประกันฟังก์ชันที่บริสุทธิ์ การ จำกัด คำศัพท์เฉพาะภาษาที่รองรับฟังก์ชั่นบริสุทธิ์ดูเหมือนจะ จำกัด เกินไป
skymt

13

Ruby จะต้องเป็นไปตามข้อกำหนดต่อไปนี้จึงจะสามารถใช้งานได้ "จริง"

ค่าที่ไม่เปลี่ยนรูป:เมื่อตั้งค่า "ตัวแปร" แล้วจะไม่สามารถเปลี่ยนแปลงได้ ใน Ruby หมายความว่าคุณต้องปฏิบัติกับตัวแปรเช่นค่าคงที่อย่างมีประสิทธิภาพ ภาษาไม่ได้รับการสนับสนุนอย่างสมบูรณ์คุณจะต้องหยุดแต่ละตัวแปรด้วยตนเอง

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

ฟังก์ชันลำดับที่สูงกว่า:เป็นฟังก์ชันที่อนุญาตให้ใช้ฟังก์ชันเป็นอาร์กิวเมนต์หรือใช้ฟังก์ชันเป็นค่าส่งกลับ นี่คือหนึ่งในคุณสมบัติที่สำคัญที่สุดของภาษาที่ใช้งานได้

Currying:เปิดใช้งานโดยฟังก์ชันลำดับที่สูงขึ้นการแกงเป็นการเปลี่ยนฟังก์ชันที่รับอาร์กิวเมนต์หลายตัวให้เป็นฟังก์ชันที่ใช้อาร์กิวเมนต์เดียว สิ่งนี้ไปพร้อมกับแอปพลิเคชันฟังก์ชันบางส่วนซึ่งเปลี่ยนฟังก์ชันหลายอาร์กิวเมนต์ให้เป็นฟังก์ชันที่ใช้อาร์กิวเมนต์น้อยกว่าเดิม

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

Lazy-evaluation หรือการประเมินล่าช้า:การประมวลผลค่าต่างๆล่าช้าไปจนถึงช่วงเวลาที่จำเป็นจริงๆ ตัวอย่างเช่นหากคุณมีโค้ดบางรายการที่สร้างรายการหมายเลข Fibonacci โดยเปิดใช้งาน lazy-evaluation จะไม่ได้รับการประมวลผลและคำนวณจริงจนกว่าฟังก์ชันอื่นจะต้องการค่าใดค่าหนึ่งในผลลัพธ์เช่น puts

ข้อเสนอ (เป็นเพียงความคิด) ฉันจะดีมากที่มีคำจำกัดความบางอย่างที่จะมีmodeคำสั่งในการประกาศไฟล์ที่มีกระบวนทัศน์การทำงานเช่น

โหมด 'functional'


2
ยินดี. ฉันอยากเชิญคุณให้อ่านเกี่ยวกับภาษาที่ใช้งานได้ Lisp เป็นปู่ย่าของภาษาที่ใช้งานได้ทั้งหมด ML (CAML) และ Erlang / Elixir มันเปลี่ยนมุมมองของคุณที่มีต่อสิ่งต่างๆจริงๆ ฉันไม่มีความเชี่ยวชาญ แต่เป็นนักเรียนที่เรียนด้านวิทยาการคอมพิวเตอร์มาโดยตลอดชอบอ่านและเรียนรู้สิ่งใหม่
Elias Perez

คำตอบที่จัดไว้อย่างดี คงจะชอบการสำรวจเพิ่มเติมว่าทับทิมรองรับสิ่งเหล่านี้ได้ดีเพียงใด ฉันเชื่อว่าฟังก์ชันการสั่งซื้อที่สูงขึ้นการแกงและการเรียกซ้ำทั้งหมดรองรับ / เป็นไปได้ในทับทิมโปรดแก้ไขฉันหากฉันผิด
Michael Dorst

9

Ruby เป็นภาษาหลายกระบวนทัศน์ที่สนับสนุนรูปแบบการเขียนโปรแกรมเชิงฟังก์ชัน


4

Ruby เป็นภาษาเชิงวัตถุที่สามารถรองรับกระบวนทัศน์อื่น ๆ ได้ (functional, imperative, etc) อย่างไรก็ตามเนื่องจากทุกอย่างใน Ruby เป็นวัตถุจึงเป็นภาษา OO เป็นหลัก

ตัวอย่าง:

"hello" .reverse () = "olleh" ทุกสตริงคืออินสแตนซ์ออบเจ็กต์สตริงและอื่น ๆ

อ่านได้ที่นี่หรือที่นี่


ฉันไม่เคยเข้าใจจริงๆว่า "ทุกอย่างเป็นวัตถุ" ทำให้ Ruby มี OO มากขึ้นได้อย่างไร ฉันยอมรับว่า Ruby เป็น OO เป็นหลัก แต่ "ทุกอย่างเป็นวัตถุ" จริงๆหมายความว่าไม่มีประเภท "ดั้งเดิม" ซึ่งมีผลต่อความสามารถของผู้พัฒนาในการเขียนโปรแกรมในรูปแบบ OO น้อยมากเนื่องจากการมีอยู่ของดั้งเดิม ประเภทโดยทั่วไปหมายความว่ามีสี่หรือห้าประเภทที่ไม่มีวิธีการใด ๆ
Michael Dorst

4

ขึ้นอยู่กับคำจำกัดความของ "ภาษาที่ใช้งานได้" โดยส่วนตัวแล้วฉันคิดว่าคำนี้ค่อนข้างมีปัญหาเมื่อใช้เป็นค่าสัมบูรณ์ มีแง่มุมอื่น ๆ ในการเป็น "ภาษาที่ใช้งานได้" มากกว่าคุณลักษณะของภาษาเพียงอย่างเดียวและส่วนใหญ่ขึ้นอยู่กับว่าคุณกำลังมองหาจากที่ใด ตัวอย่างเช่นวัฒนธรรมที่อยู่รอบ ๆ ภาษามีความสำคัญมากในเรื่องนี้ มันสนับสนุนรูปแบบการทำงานหรือไม่? แล้วห้องสมุดที่มีอยู่ล่ะ? พวกเขาสนับสนุนให้คุณใช้มันอย่างมีประโยชน์หรือไม่?

คนส่วนใหญ่จะเรียก Scheme ว่าเป็นภาษาที่ใช้งานได้เช่น แต่ Common Lisp ล่ะ? นอกเหนือจากปัญหาหลายเนมสเปซ / เนมสเปซเดียวและการกำจัดการโทรหางที่รับประกัน (ซึ่งการใช้งาน CL บางอย่างรองรับเช่นกันขึ้นอยู่กับการตั้งค่าคอมไพเลอร์) มีไม่มากที่ทำให้ Scheme เป็นภาษาที่เหมาะกับการเขียนโปรแกรมเชิงฟังก์ชันมากกว่าทั่วไป Lisp และถึงกระนั้น Lispers ส่วนใหญ่จะไม่เรียก CL ว่าเป็นภาษาที่ใช้งานได้ ทำไม? เนื่องจากวัฒนธรรมที่อยู่รอบ ๆ นั้นขึ้นอยู่กับคุณสมบัติที่จำเป็นของ CL เป็นอย่างมาก (เช่นมาโคร LOOP เป็นต้นซึ่ง Schemers ส่วนใหญ่อาจจะขมวดคิ้ว)

ในทางกลับกันโปรแกรมเมอร์ C อาจพิจารณา CL เป็นภาษาที่ใช้งานได้ โค้ดส่วนใหญ่ที่เขียนด้วยภาษา Lisp นั้นใช้งานได้ดีกว่ารหัส C ปกติของคุณมาก ในทำนองเดียวกัน Scheme เป็นภาษาที่จำเป็นมากเมื่อเทียบกับ Haskell ดังนั้นฉันไม่คิดว่าจะมีคำตอบใช่ / ไม่ใช่ที่แน่นอน การจะเรียกภาษาที่ใช้งานได้หรือไม่ขึ้นอยู่กับมุมมองของคุณ


Haskell ไม่ใช่ภาษาที่ใช้งานได้จริงในทางใด แล้วมิแรนดา (ภาษาการเขียนโปรแกรมเชิงฟังก์ชันที่ไม่ค่อยมีคนรู้จัก) ล่ะ? courses.cs.washington.edu/courses/cse505/99au/functional/… "Haskell เป็นภาษาที่ใช้งานได้จริงมาตรฐาน"
barlop

2

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

ฉันจะอธิบายว่า Ruby เป็นภาษาสคริปต์เชิงวัตถุ ใช่ฟังก์ชันเป็นออบเจ็กต์ชั้นหนึ่ง (เรียงลำดับ) แต่นั่นไม่ได้ทำให้เป็นภาษาที่ใช้งานได้จริง IMO ฉันอาจเพิ่ม


4
ประเภทของภาษาถูกกำหนดโดยรูปแบบการเขียนโปรแกรมที่รองรับ ในทางกลับกันจะถูกตัดสินโดยคุณสมบัติที่มี ฟังก์ชันชั้นหนึ่งและฟังก์ชันที่ไม่ระบุชื่อ = การเขียนโปรแกรมเชิงฟังก์ชันขั้นต่ำ Ruby รองรับการเขียนโปรแกรม OO แต่ไม่ต้องการ: คุณไม่จำเป็นต้องกำหนดคลาส ดังนั้นหลายกระบวนทัศน์
skymt

2

การเรียกซ้ำเป็นเรื่องปกติในการเขียนโปรแกรมเชิงฟังก์ชัน เกือบทุกภาษารองรับการเรียกซ้ำ แต่อัลกอริทึมแบบเรียกซ้ำมักจะใช้ไม่ได้ผลหากไม่มีการเพิ่มประสิทธิภาพการโทรหาง (TCO)

ภาษาโปรแกรมที่ใช้งานได้มีความสามารถในการเพิ่มประสิทธิภาพการเรียกซ้ำหางและสามารถรันโค้ดดังกล่าวในพื้นที่คงที่ การใช้งาน Ruby บางอย่างช่วยเพิ่มประสิทธิภาพการเรียกซ้ำส่วนท้าย แต่อย่างอื่นไม่ได้ แต่โดยทั่วไปการใช้งาน Ruby ไม่จำเป็นต้องทำ TCO ดูRuby ทำการเพิ่มประสิทธิภาพการโทรหางหรือไม่

ดังนั้นหากคุณเขียนรูปแบบการทำงานของ Ruby และพึ่งพา TCO ของการนำไปใช้งานบางอย่างโค้ดของคุณอาจใช้ไม่ได้ผลในตัวแปล Ruby อื่น ฉันคิดว่านี่คือสาเหตุที่ Ruby ไม่ใช่ภาษาที่ใช้งานได้ (ไม่ใช่ Python)


TCO เป็นสิ่งที่น่าสนใจเพราะมันเปลี่ยนพฤติกรรมของโปรแกรมเป็นหลัก ในบางกรณีโปรแกรมจะมองไม่เห็น แต่ในกรณีอื่น ๆ ก็เป็นเช่นข้อยกเว้นการย้อนกลับ ดังนั้นจึงไม่ใช่การเพิ่มประสิทธิภาพที่เหมาะสมเสมอไป
ioquatix

2

พูดอย่างเคร่งครัดมันไม่สมเหตุสมผลที่จะอธิบายภาษาว่า "ใช้งานได้"; ภาษาส่วนใหญ่สามารถเขียนโปรแกรมเชิงฟังก์ชันได้ แม้แต่ C ++ ก็คือ

รูปแบบการทำงานเป็นส่วนย่อยของคุณลักษณะภาษาที่จำเป็นไม่มากก็น้อยรองรับด้วย syntactic sugar และการเพิ่มประสิทธิภาพของคอมไพเลอร์บางอย่างเช่นการไม่เปลี่ยนรูปแบบและการแบนซ้ำของ tail-recursion

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

โดยปกติน้ำตาลซินแทคติคสามารถทำงานได้ในระดับหนึ่งหรืออย่างอื่นโดยเฉพาะอย่างยิ่งถ้าภาษานั้นมีพรีคอมไพเลอร์ที่ตั้งโปรแกรมได้ (เช่น #define ของ C)

อาจมีความหมายมากกว่าเล็กน้อยที่จะถามว่า "ภาษา __ รองรับการเขียนโปรแกรมที่จำเป็นหรือไม่" และคำตอบเช่น Lisp คือ "ไม่"


1

กรุณาดูได้ที่จุดเริ่มต้นของหนังสือเล่มนี้: "A-ที่ดี-ทับทิม eBook" จะกล่าวถึงหัวข้อเฉพาะที่คุณกำลังถาม คุณสามารถเขียนโปรแกรมประเภทต่างๆได้ใน Ruby หากคุณต้องการตั้งโปรแกรมให้เหมือนฟังก์ชันคุณสามารถทำได้ หากคุณต้องการตั้งโปรแกรมอย่างจำเป็นคุณสามารถทำได้ เป็นคำถามเกี่ยวกับคำจำกัดความว่า Ruby ทำงานอย่างไรในท้ายที่สุด โปรดดูการตอบกลับโดยผู้ใช้ camflan

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