การอภิปรายเกี่ยวกับภาษาโปรแกรมมิ่งในเรื่องไวยากรณ์แบบซ้ายไปขวาเพื่อการสนับสนุน IDE และความสามารถในการอ่านโค้ดที่ดีขึ้น

ทีมชุมชน BigGo
การอภิปรายเกี่ยวกับภาษาโปรแกรมมิ่งในเรื่องไวยากรณ์แบบซ้ายไปขวาเพื่อการสนับสนุน IDE และความสามารถในการอ่านโค้ดที่ดีขึ้น

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

ปัญหาการเติมข้อความอัตโนมัติใน List Comprehensions

List comprehensions ของ Python นำเสนอความท้าทายที่เป็นเอกลักษณ์สำหรับนักพัฒนาและเครื่องมือของพวกเขา เมื่อเขียน [line.split() for line in text.splitlines()] โปรแกรมเมอร์ต้องอ้างอิงตัวแปรก่อนที่จะมีการประกาศ สิ่งนี้สร้างประสบการณ์ที่น่าหงุดหงิดที่ IDE ไม่สามารถให้คำแนะนำที่เป็นประโยชน์ได้จนกว่าการแสดงออกทั้งหมดจะเสร็จสมบูรณ์ ตัวแปร line ปรากฏขึ้นก่อนใน comprehension แต่ไม่ได้ถูกกำหนดจนกว่าจะถึงส่วน for ที่อยู่ภายหลังในคำสั่ง

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

การเปรียบเทียบไวยากรณ์ของภาษาโปรแกรม

ภาษา รูปแบบไวยากรณ์ ตัวอย่าง การสนับสนุนจาก IDE
Python List Comprehension [line.split() for line in text.splitlines()] จำกัดจนกว่าจะเขียนเสร็จ
Rust Method Chaining text.lines().map(|line| line.split_whitespace()) ระบบเติมคำอัตโนมัติเต็มรูปแบบ
JavaScript Method Chaining text.split(" ").map(word => word.length) ระบบเติมคำอัตโนมัติเต็มรูปแบบ
SQL แบบดั้งเดิม SELECT columns FROM table WHERE condition การแนะนำคอลัมน์แบบจำกัด
PRQL แบบ Pipe-based from table | select columns | filter condition ความตระหนักรู้บริบทที่ดีกว่า

Method Chaining ให้การสนับสนุนเครื่องมือที่ดีกว่า

ภาษาที่รองรับ method chaining เช่น Rust และ JavaScript ให้ประสบการณ์การพัฒนาแบบเชิงเส้นมากกว่า ใน Rust ที่เป็น text.lines().map(|line| line.split_whitespace()) แต่ละขั้นตอนสร้างขึ้นอย่างเป็นธรรมชาติจากขั้นตอนก่อนหน้า ทันทีที่นักพัฒนาพิมพ์ชื่อตัวแปร โปรแกรมแก้ไขของพวกเขาสามารถแนะนำเมธอดที่ใช้ได้ทันทีตามประเภทที่ทราบ

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

SQL เผชิญความท้าทายที่คล้ายกัน

การอภิปรายขยายไปเกินกว่าภาษาโปรแกรมมิ่งทั่วไปไปยัง SQL ซึ่งประสบปัญหาคล้ายกัน SQL แบบดั้งเดิมต้องการการเขียนส่วน SELECT ก่อนส่วน FROM ทำให้เป็นไปไม่ได้สำหรับเครื่องมือในการให้คำแนะนำคอลัมน์ที่มีความหมายจนกว่าแหล่งข้อมูลจะถูกระบุในภายหลังในคิวรี

ภาษาคิวรีสมัยใหม่หลายภาษาและส่วนขยาย SQL ได้แก้ไขปัญหานี้โดยอนุญาตไวยากรณ์แบบ FROM-first เครื่องมือเช่น PRQL และส่วนขยายสำหรับฐานข้อมูลเช่น DuckDB ตอนนี้รองรับการเรียงลำดับคิวรีที่เป็นธรรมชาติมากขึ้นซึ่งช่วยให้ IDE ช่วยเหลือได้ดีขึ้น

วิธีแก้ไขด้วย Pipe Operator

ภาษาโปรแกรมมิ่งเชิงฟังก์ชันหลายภาษาได้นำ pipe operators มาใช้เพื่อแก้ปัญหาแบบซ้ายไปขวา ภาษาเช่น F# , Elixir และ R ใช้ไวยากรณ์ pipe เพื่อเชื่อมโยงการดำเนินการในลำดับการอ่าน แนวทางนี้รวมประโยชน์ของการโปรแกรมเชิงฟังก์ชันกับความสามารถในการอ่านและการสนับสนุนเครื่องมือที่ดีขึ้น

ฉันคิดถึง pipe operator ของ F# ในภาษาอื่นๆ มันเป็นธรรมชาติมากที่จะคิดถึงไปป์ไลน์การแปลงฟังก์ชัน

Pipe operator ได้รับการเสนอสำหรับ JavaScript แต่ยังคงติดอยู่ในการอภิปรายของคณะกรรมการ ซึ่งเน้นความท้าทายในการพัฒนาไวยากรณ์ภาษาที่มีอยู่แล้ว

ภาษาโปรแกรมที่มี Pipe Operators

  • F#: ตัวดำเนินการ |> สำหรับการเชื่อมโยงฟังก์ชัน
  • Elixir: |> สำหรับไปป์ไลน์การแปลงข้อมูล
  • R: |> และ %>% ( magrittr ) สำหรับเวิร์กโฟลว์การวิเคราะห์ข้อมูล
  • OCaml: |> สำหรับการประกอบฟังก์ชัน
  • Clojure: มาโครแบบ threading ->และ ->>
  • Haskell: มีไลบรารีไปป์ไลน์หลากหลายรูปแบบ
  • PHP 8.5: กำลังจะรองรับ pipe operator ในอนาคต

เกินกว่าการเติมข้อความอัตโนมัติ: ความเข้าใจโค้ด

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

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

อนาคตของไวยากรณ์การโปรแกรม

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

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

อ้างอิง: Left to Right Programming