Wikipedia บอกว่า Ruby เป็นภาษาที่ใช้งานได้ แต่ฉันไม่มั่นใจ ทำไมหรือทำไมไม่?
Wikipedia บอกว่า Ruby เป็นภาษาที่ใช้งานได้ แต่ฉันไม่มั่นใจ ทำไมหรือทำไมไม่?
คำตอบ:
แน่นอนที่สุดฉันคิดว่าคุณสามารถใช้รูปแบบการทำงานใน Ruby ได้
สิ่งที่สำคัญที่สุดอย่างหนึ่งในการเขียนโปรแกรมในรูปแบบการทำงานคือหากภาษารองรับฟังก์ชันลำดับที่สูงขึ้น ... ซึ่ง Ruby ทำ
กล่าวได้ว่ามันง่ายที่จะตั้งโปรแกรมใน Ruby ในรูปแบบที่ไม่ใช้งานได้เช่นกัน ลักษณะสำคัญอีกประการหนึ่งของรูปแบบการทำงานคือการไม่มีสถานะและมีฟังก์ชันทางคณิตศาสตร์จริงที่ส่งคืนค่าเดียวกันสำหรับชุดอินพุตที่กำหนดเสมอ สิ่งนี้สามารถทำได้ใน Ruby แต่ไม่ได้บังคับใช้ในภาษาเช่นสิ่งที่ใช้งานได้อย่างเคร่งครัดกว่าเช่น Haskell
ใช่มันรองรับรูปแบบการใช้งาน แต่ยังช่วยให้คุณตั้งโปรแกรมในรูปแบบที่ไม่ใช้งานได้อีกด้วย
Is ruby a functional language?
และตอบตรงๆคือไม่ Ruby เป็นภาษาเชิงวัตถุที่มีคุณสมบัติการทำงานบางอย่าง
ไม่ว่าภาษาจะเป็นหรือไม่ใช่ภาษาที่ใช้งานได้ก็ไม่สำคัญ Functional Programming เป็นวิทยานิพนธ์ที่อธิบายได้ดีที่สุดโดย Philip Wadler (The Essence of Functional Programming) และ John Hughes (Why Functional Programming Matters)
คำถามที่มีความหมายคือ 'Ruby สามารถตอบสนองต่อการบรรลุวิทยานิพนธ์ของโปรแกรมเชิงฟังก์ชันได้อย่างไร? คำตอบคือ 'แย่มาก'
ฉันได้พูดคุยเกี่ยวกับเรื่องนี้เมื่อไม่นานมานี้ นี่คือสไลด์
Ruby รองรับฟังก์ชันระดับสูงกว่า (ดู Array # map, injection, & select) แต่ก็ยังคงเป็นภาษาที่มีความจำเป็นเชิงวัตถุ
ลักษณะสำคัญประการหนึ่งของภาษาที่ใช้งานได้คือหลีกเลี่ยงสถานะที่ไม่แน่นอน ภาษาที่ใช้งานได้ไม่มีแนวคิดของตัวแปรเหมือนที่คุณมีใน Ruby, C, Java หรือภาษาที่จำเป็นอื่น ๆ
ลักษณะสำคัญอีกประการหนึ่งของภาษาที่ใช้งานได้คือเน้นที่การกำหนดโปรแกรมในรูปแบบของ "อะไร" แทนที่จะเป็น "อย่างไร" เมื่อเขียนโปรแกรมด้วยภาษา OO เราจะเขียนคลาสและวิธีการเพื่อซ่อนการนำไปใช้งาน ("how") จาก "what" (ชื่อคลาส / วิธีการ) แต่ในที่สุดวิธีการเหล่านี้ก็ยังคงเขียนโดยใช้ลำดับของคำสั่ง ในภาษาที่ใช้งานได้คุณไม่ได้ระบุลำดับของการดำเนินการแม้ว่าจะอยู่ในระดับต่ำสุดก็ตาม
ฉันส่งว่าการสนับสนุนหรือมีความสามารถในการเขียนโปรแกรมในภาษาในรูปแบบการทำงานนั้นไม่ใช่ภาษาที่ใช้งานได้
ฉันยังสามารถเขียนโค้ด Java ในสไตล์การทำงานถ้าผมต้องการที่จะทำร้ายร่วมงานของผมและตัวผมเองไม่กี่เดือนสัปดาห์
มีภาษาทำงานไม่เพียงเกี่ยวกับสิ่งที่คุณสามารถทำเช่นฟังก์ชั่นขั้นสูงฟังก์ชั่นชั้นแรกและ currying นอกจากนี้ยังเกี่ยวกับสิ่งที่คุณไม่สามารถทำได้เช่นผลข้างเคียงในฟังก์ชันบริสุทธิ์
นี่เป็นสิ่งสำคัญเนื่องจากเป็นส่วนสำคัญของเหตุผลที่ว่าทำไมโปรแกรมที่ใช้งานได้หรือรหัสการทำงานใน generel จึงเป็นเหตุผลที่ง่ายกว่า และเมื่อรหัสง่ายต่อการให้เหตุผลข้อบกพร่องจะตื้นขึ้นและลอยไปที่พื้นผิวแนวความคิดซึ่งสามารถแก้ไขได้ซึ่งจะทำให้โค้ดบั๊กน้อยลง
Ruby เป็นแกนหลักในเชิงวัตถุดังนั้นแม้ว่าจะมีการสนับสนุนที่ดีพอสมควรสำหรับรูปแบบการทำงาน แต่ก็ไม่ใช่ภาษาที่ใช้งานได้
นั่นคือความคิดเห็นที่ไม่ใช่วิทยาศาสตร์ของฉันอยู่ดี
แก้ไข: เมื่อพิจารณาย้อนหลังและพิจารณาถึงความคิดเห็นที่ดีฉันได้รับคำตอบนี้แล้วฉันคิดว่าการเปรียบเทียบเชิงวัตถุกับการใช้งานเป็นหนึ่งในแอปเปิ้ลและส้ม
ความแตกต่างที่แท้จริงคือความไม่สมเหตุสมผลในการดำเนินการหรือไม่ ภาษาที่ใช้งานได้มีนิพจน์เป็นโครงสร้างทางภาษาหลักและลำดับของการดำเนินการมักไม่ได้กำหนดหรือกำหนดว่าเป็นภาษาขี้เกียจ การดำเนินการที่เข้มงวดสามารถทำได้ แต่จะใช้เมื่อจำเป็นเท่านั้น ในภาษาที่สื่อความหมายการดำเนินการที่เข้มงวดเป็นค่าเริ่มต้นและในขณะที่การดำเนินการแบบขี้เกียจเป็นไปได้ แต่ก็มักจะทำไม่ได้และอาจให้ผลลัพธ์ที่คาดเดาไม่ได้ในหลายกรณี
ตอนนี้นั่นคือความคิดเห็นที่ไม่ใช่วิทยาศาสตร์ของฉัน
Ruby จะต้องเป็นไปตามข้อกำหนดต่อไปนี้จึงจะสามารถใช้งานได้ "จริง"
ค่าที่ไม่เปลี่ยนรูป:เมื่อตั้งค่า "ตัวแปร" แล้วจะไม่สามารถเปลี่ยนแปลงได้ ใน Ruby หมายความว่าคุณต้องปฏิบัติกับตัวแปรเช่นค่าคงที่อย่างมีประสิทธิภาพ ภาษาไม่ได้รับการสนับสนุนอย่างสมบูรณ์คุณจะต้องหยุดแต่ละตัวแปรด้วยตนเอง
ไม่มีผลข้างเคียง:เมื่อส่งผ่านค่าที่กำหนดฟังก์ชันจะต้องส่งคืนผลลัพธ์เดียวกันเสมอ สิ่งนี้ไปพร้อมกับการมีค่าที่ไม่เปลี่ยนรูป ฟังก์ชันไม่สามารถรับค่าและเปลี่ยนแปลงได้เนื่องจากจะทำให้เกิดผลข้างเคียงที่เป็นเชิงสัมผัสในการส่งคืนผลลัพธ์
ฟังก์ชันลำดับที่สูงกว่า:เป็นฟังก์ชันที่อนุญาตให้ใช้ฟังก์ชันเป็นอาร์กิวเมนต์หรือใช้ฟังก์ชันเป็นค่าส่งกลับ นี่คือหนึ่งในคุณสมบัติที่สำคัญที่สุดของภาษาที่ใช้งานได้
Currying:เปิดใช้งานโดยฟังก์ชันลำดับที่สูงขึ้นการแกงเป็นการเปลี่ยนฟังก์ชันที่รับอาร์กิวเมนต์หลายตัวให้เป็นฟังก์ชันที่ใช้อาร์กิวเมนต์เดียว สิ่งนี้ไปพร้อมกับแอปพลิเคชันฟังก์ชันบางส่วนซึ่งเปลี่ยนฟังก์ชันหลายอาร์กิวเมนต์ให้เป็นฟังก์ชันที่ใช้อาร์กิวเมนต์น้อยกว่าเดิม
การเรียกซ้ำ: การวนซ้ำโดยการเรียกใช้ฟังก์ชันจากภายในตัวมันเอง เมื่อคุณไม่สามารถเข้าถึงข้อมูลที่เปลี่ยนแปลงได้ระบบจะใช้การเรียกซ้ำเพื่อสร้างและเชื่อมโยงการสร้างข้อมูล เนื่องจากการวนซ้ำไม่ใช่แนวคิดเชิงฟังก์ชันเนื่องจากต้องมีการส่งผ่านตัวแปรไปรอบ ๆ เพื่อเก็บสถานะของลูปในเวลาที่กำหนด
Lazy-evaluation หรือการประเมินล่าช้า:การประมวลผลค่าต่างๆล่าช้าไปจนถึงช่วงเวลาที่จำเป็นจริงๆ ตัวอย่างเช่นหากคุณมีโค้ดบางรายการที่สร้างรายการหมายเลข Fibonacci โดยเปิดใช้งาน lazy-evaluation จะไม่ได้รับการประมวลผลและคำนวณจริงจนกว่าฟังก์ชันอื่นจะต้องการค่าใดค่าหนึ่งในผลลัพธ์เช่น puts
ข้อเสนอ (เป็นเพียงความคิด)
ฉันจะดีมากที่มีคำจำกัดความบางอย่างที่จะมีmode
คำสั่งในการประกาศไฟล์ที่มีกระบวนทัศน์การทำงานเช่น
โหมด 'functional'
Ruby เป็นภาษาหลายกระบวนทัศน์ที่สนับสนุนรูปแบบการเขียนโปรแกรมเชิงฟังก์ชัน
ขึ้นอยู่กับคำจำกัดความของ "ภาษาที่ใช้งานได้" โดยส่วนตัวแล้วฉันคิดว่าคำนี้ค่อนข้างมีปัญหาเมื่อใช้เป็นค่าสัมบูรณ์ มีแง่มุมอื่น ๆ ในการเป็น "ภาษาที่ใช้งานได้" มากกว่าคุณลักษณะของภาษาเพียงอย่างเดียวและส่วนใหญ่ขึ้นอยู่กับว่าคุณกำลังมองหาจากที่ใด ตัวอย่างเช่นวัฒนธรรมที่อยู่รอบ ๆ ภาษามีความสำคัญมากในเรื่องนี้ มันสนับสนุนรูปแบบการทำงานหรือไม่? แล้วห้องสมุดที่มีอยู่ล่ะ? พวกเขาสนับสนุนให้คุณใช้มันอย่างมีประโยชน์หรือไม่?
คนส่วนใหญ่จะเรียก Scheme ว่าเป็นภาษาที่ใช้งานได้เช่น แต่ Common Lisp ล่ะ? นอกเหนือจากปัญหาหลายเนมสเปซ / เนมสเปซเดียวและการกำจัดการโทรหางที่รับประกัน (ซึ่งการใช้งาน CL บางอย่างรองรับเช่นกันขึ้นอยู่กับการตั้งค่าคอมไพเลอร์) มีไม่มากที่ทำให้ Scheme เป็นภาษาที่เหมาะกับการเขียนโปรแกรมเชิงฟังก์ชันมากกว่าทั่วไป Lisp และถึงกระนั้น Lispers ส่วนใหญ่จะไม่เรียก CL ว่าเป็นภาษาที่ใช้งานได้ ทำไม? เนื่องจากวัฒนธรรมที่อยู่รอบ ๆ นั้นขึ้นอยู่กับคุณสมบัติที่จำเป็นของ CL เป็นอย่างมาก (เช่นมาโคร LOOP เป็นต้นซึ่ง Schemers ส่วนใหญ่อาจจะขมวดคิ้ว)
ในทางกลับกันโปรแกรมเมอร์ C อาจพิจารณา CL เป็นภาษาที่ใช้งานได้ โค้ดส่วนใหญ่ที่เขียนด้วยภาษา Lisp นั้นใช้งานได้ดีกว่ารหัส C ปกติของคุณมาก ในทำนองเดียวกัน Scheme เป็นภาษาที่จำเป็นมากเมื่อเทียบกับ Haskell ดังนั้นฉันไม่คิดว่าจะมีคำตอบใช่ / ไม่ใช่ที่แน่นอน การจะเรียกภาษาที่ใช้งานได้หรือไม่ขึ้นอยู่กับมุมมองของคุณ
ฉันคิดว่า Ruby ไม่ใช่ภาษาที่มีหลายกระบวนทัศน์มากนัก หลายกระบวนทัศน์มักจะถูกใช้โดยผู้คนที่ต้องการติดป้ายกำกับภาษาที่พวกเขาชื่นชอบว่าเป็นสิ่งที่มีประโยชน์ในหลาย ๆ ด้าน
ฉันจะอธิบายว่า Ruby เป็นภาษาสคริปต์เชิงวัตถุ ใช่ฟังก์ชันเป็นออบเจ็กต์ชั้นหนึ่ง (เรียงลำดับ) แต่นั่นไม่ได้ทำให้เป็นภาษาที่ใช้งานได้จริง IMO ฉันอาจเพิ่ม
การเรียกซ้ำเป็นเรื่องปกติในการเขียนโปรแกรมเชิงฟังก์ชัน เกือบทุกภาษารองรับการเรียกซ้ำ แต่อัลกอริทึมแบบเรียกซ้ำมักจะใช้ไม่ได้ผลหากไม่มีการเพิ่มประสิทธิภาพการโทรหาง (TCO)
ภาษาโปรแกรมที่ใช้งานได้มีความสามารถในการเพิ่มประสิทธิภาพการเรียกซ้ำหางและสามารถรันโค้ดดังกล่าวในพื้นที่คงที่ การใช้งาน Ruby บางอย่างช่วยเพิ่มประสิทธิภาพการเรียกซ้ำส่วนท้าย แต่อย่างอื่นไม่ได้ แต่โดยทั่วไปการใช้งาน Ruby ไม่จำเป็นต้องทำ TCO ดูRuby ทำการเพิ่มประสิทธิภาพการโทรหางหรือไม่
ดังนั้นหากคุณเขียนรูปแบบการทำงานของ Ruby และพึ่งพา TCO ของการนำไปใช้งานบางอย่างโค้ดของคุณอาจใช้ไม่ได้ผลในตัวแปล Ruby อื่น ฉันคิดว่านี่คือสาเหตุที่ Ruby ไม่ใช่ภาษาที่ใช้งานได้ (ไม่ใช่ Python)
พูดอย่างเคร่งครัดมันไม่สมเหตุสมผลที่จะอธิบายภาษาว่า "ใช้งานได้"; ภาษาส่วนใหญ่สามารถเขียนโปรแกรมเชิงฟังก์ชันได้ แม้แต่ C ++ ก็คือ
รูปแบบการทำงานเป็นส่วนย่อยของคุณลักษณะภาษาที่จำเป็นไม่มากก็น้อยรองรับด้วย syntactic sugar และการเพิ่มประสิทธิภาพของคอมไพเลอร์บางอย่างเช่นการไม่เปลี่ยนรูปแบบและการแบนซ้ำของ tail-recursion
เนื้อหาหลังเป็นเทคนิคเฉพาะการใช้งานเล็กน้อยและไม่มีส่วนเกี่ยวข้องกับภาษาจริง คอมไพเลอร์ x64 C # 4.0 ทำการปรับแต่ง tail-recursion ในขณะที่ x86 นั้นไม่ได้มีเหตุผลอะไรที่โง่เขลา
โดยปกติน้ำตาลซินแทคติคสามารถทำงานได้ในระดับหนึ่งหรืออย่างอื่นโดยเฉพาะอย่างยิ่งถ้าภาษานั้นมีพรีคอมไพเลอร์ที่ตั้งโปรแกรมได้ (เช่น #define ของ C)
อาจมีความหมายมากกว่าเล็กน้อยที่จะถามว่า "ภาษา __ รองรับการเขียนโปรแกรมที่จำเป็นหรือไม่" และคำตอบเช่น Lisp คือ "ไม่"
กรุณาดูได้ที่จุดเริ่มต้นของหนังสือเล่มนี้: "A-ที่ดี-ทับทิม eBook" จะกล่าวถึงหัวข้อเฉพาะที่คุณกำลังถาม คุณสามารถเขียนโปรแกรมประเภทต่างๆได้ใน Ruby หากคุณต้องการตั้งโปรแกรมให้เหมือนฟังก์ชันคุณสามารถทำได้ หากคุณต้องการตั้งโปรแกรมอย่างจำเป็นคุณสามารถทำได้ เป็นคำถามเกี่ยวกับคำจำกัดความว่า Ruby ทำงานอย่างไรในท้ายที่สุด โปรดดูการตอบกลับโดยผู้ใช้ camflan