ทำไมไวยากรณ์ภาษาที่ใช้งานไม่ได้ใกล้เคียงกับภาษามนุษย์มากกว่า?


14

ฉันสนใจการเขียนโปรแกรมการทำงานและตัดสินใจที่จะเข้าร่วมกับ Haskell หัวของฉันเจ็บ ... แต่ในที่สุดฉันก็จะได้รับ ... ฉันมีความอยากรู้อยากเห็นหนึ่งทำไมทำไมไวยากรณ์ถึงคลุมเครือ (ขาดคำอื่น)

มีเหตุผลทำไมมันไม่แสดงออกเพิ่มเติมใกล้กับภาษามนุษย์?

ฉันเข้าใจว่า FP นั้นเก่งในการสร้างแบบจำลองแนวคิดทางคณิตศาสตร์และมันยืมบางส่วนของวิธีการแสดงออกที่กระชับ แต่ก็ยังไม่ใช่คณิตศาสตร์ ... เป็นภาษา


4
@ วงล้อประหลาด: :) ดังนั้นจะมีการออกแบบโดยคนที่เกลียดสัญลักษณ์โปแลนด์?
JohnDoDo

10
@ratchetfreak ไวยากรณ์ของ Haskell คล้ายกับสัญลักษณ์ขัดเงาในทางใด ตัวดำเนินการ Haskell เป็นมัดเช่นเดียวกับตัวดำเนินการส่วนใหญ่ของภาษาอื่น ๆ (และการเรียกใช้ฟังก์ชั่นเป็นคำนำหน้า - เช่นเดียวกับการเรียกใช้ฟังก์ชั่นภาษาอื่น ๆ ส่วนใหญ่)
sepp2k

9
นั่นเป็นข้อสันนิษฐาน / การก้าวกระโดดครั้งใหญ่ที่คุณ "ใกล้เคียงกับภาษามนุษย์" เท่ากับ "แสดงออกได้มากกว่า"
Matt Ball

7
เคยได้ยิน Cobol และ Fortran หรือไม่?
ott--

7
ด้วยเหตุผลเดียวกับที่นักคณิตศาสตร์แทนที่วลีละตินยาวด้วยการแสดงออกเกี่ยวกับพีชคณิต ด้วยการฝึกฝนเพียงเล็กน้อยสัญกรณ์ที่มีขนาดเล็กกว่านั้นมีประสิทธิผลมากกว่า
วินไคลน์

คำตอบ:


14

ภาษาการทำงานเช่นHaskellและอดีตของมิแรนดางอกออกมาจากแนวความคิดทางคณิตศาสตร์ของแลมบ์ดาแคลคูลัส จากหน้า Wikipedia:

แลมบ์ดาแคลคูลัส (หรือที่เรียกว่า calcul- แคลคูลัสหรือที่เรียกว่า "แลมบ์ดาแคลคูลัส") เป็นระบบที่เป็นทางการในเชิงตรรกะทางคณิตศาสตร์ในการแสดงการคำนวณโดยใช้วิธีการผูกตัวแปรและทดแทน

...

แลมบ์ดาแคลคูลัสมีบทบาทสำคัญในการพัฒนาทฤษฎีภาษาโปรแกรม คู่ที่โดดเด่นที่สุดของแลมบ์ดาแคลคูลัสในวิทยาการคอมพิวเตอร์คือภาษาโปรแกรมที่ใช้งานได้ซึ่งใช้แคลคูลัสเป็นหลัก (เติมด้วยค่าคงที่และประเภทข้อมูลบางส่วน) นอกเหนือจากภาษาการเขียนโปรแกรมแคลคูลัสแลมบ์ดายังมีการประยุกต์ใช้มากมายในทฤษฎีการพิสูจน์ ตัวอย่างที่สำคัญของเรื่องนี้คือการติดต่อกันระหว่างแกงกะหรี่ - ฮาวเวิร์ดซึ่งให้การติดต่อระหว่างระบบแลมบ์ดาลัสพิมพ์และระบบตรรกะอย่างเป็นทางการ

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

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


29

ไวยากรณ์ของ Haskell นั้นใกล้เคียงกับภาษามนุษย์ มันได้รับการออกแบบมาโดยเฉพาะให้มีลักษณะคล้ายกับสัญกรณ์คณิตศาสตร์ซึ่งเป็นภาษาที่มนุษย์ออกแบบ (ดังนั้นภาษามนุษย์ ) เพื่อแสดงแนวคิดเหล่านั้นอย่างแม่นยำที่ Haskell สร้างขึ้น

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

ในทางกลับกันคุณสามารถแสดงชิ้นส่วนของนักคณิตศาสตร์หรือนักตรรกวิทยาได้ดังนี้

x = x + 1

และเขาจะสับสนอย่างเต็มที่พูดว่า: "นี่ไม่ได้ทำให้รู้สึกไม่มีxเช่นนั้นxเท่ากับxบวก1."

ไม่ว่าสัญกรณ์บางอย่างจะเป็น "ความลับ" หรือไม่ก็ตามเป็นเรื่องของความเห็นและความคุ้นเคย


8
มีเพียงปัญหาเดียวกับคำตอบนี้: ฉันไม่ใช่นักคณิตศาสตร์
JohnDoDo

6
@ sepp2k: ฉันไม่เห็นด้วย สำหรับคนส่วนใหญ่ w / o การสัมผัสก่อนที่จะเขียนโปรแกรมภาษาและบางพื้นหลังพื้นฐานทางคณิตศาสตร์ Haskell ไวยากรณ์จะง่ายมากที่จะเข้าใจกว่ารหัส procedual ทั่วไปกับทุกผลข้างเคียงและสภาพแวดล้อมที่ซับซ้อนงบจะดำเนินการใน. ไวยากรณ์เช่นwhereอนุญาตให้มีการรวมตัวสรุปสาระสำคัญของ ฟังก์ชั่นในหนึ่งบรรทัด
Benjamin Bannier

17
-1: คำตอบนี้ดูเหมือนอวดรู้เป็นส่วนใหญ่ ฉันค่อนข้างมั่นใจว่า OP หมายถึงภาษาพูด
Steven Evers

6
อันที่จริงฉันค่อนข้างแน่ใจว่าx = infinityจริง ๆ แล้วแก้สมการ
DeadMG

6
ภาษาการเขียนโปรแกรมได้รับการออกแบบโดยมนุษย์ .... ดังนั้นตามนิยามของคุณ
marco-fiset

13

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

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

ตัวอย่างเช่นฉันสามารถเขียนได้อย่างไม่แน่นอน:

for each (Person person in people)
    print(person.name)

ซึ่งอ่านได้อย่างสมบูรณ์ว่าเป็นภาษาอังกฤษ

รุ่น Haskell อาจเป็น (และนี่ไม่ใช่ Haskell ที่ถูกต้อง แต่ใช้สำหรับการเปรียบเทียบทางไวยากรณ์):

map (print . name) people

ซึ่งต้องใช้รหัสน้อยลงและการถกเถียงรายละเอียดน้อยลง - ฉันไม่จำเป็นต้องแยกสิ่งต่าง ๆ ออกเป็นลูปและตัวแปร (s) ( for each (...)) mapฟังก์ชันจะดูแลสิ่งนั้นให้ฉัน

การทำงานในระดับนั้นอาจทำให้คุณคุ้นเคย ถ้าช่วยได้ Haskell อาจเป็นเวลาที่ยากลำบากที่สุดที่ฉันได้เรียนรู้ภาษาใหม่ตั้งแต่ฉันเริ่มเขียนโปรแกรมและฉันรู้ว่า> 10 ภาษา (รวมถึง Lisp) มันคุ้มค่าที่จะเรียนรู้


8

ขณะนี้ฉันกำลังจะจับกับสกาล่าในขณะนี้ดังนั้นฉันสามารถเห็นอกเห็นใจ อย่างน้อยที่สุดใน Scala ฉันสามารถย้อนกลับไปสู่รูปแบบที่จำเป็นเมื่อการไปยากเกินไป

ฉันคิดว่ามีกองกำลังหลายอย่างที่เล่นที่นี่:

  • นักออกแบบของภาษาที่ใช้งานจำเป็นต้องมีพื้นฐานทางคณิตศาสตร์ที่แข็งแกร่งดังนั้นพวกเขาจึงยืมสัญกรณ์ทางคณิตศาสตร์ซึ่งเป็นธรรมชาติสำหรับพวกเขา

  • ความชัดเจนมากขึ้น (เช่นพลังของข้อความมากกว่าความใกล้เคียงกับภาษาอังกฤษ) ของภาษาใด ๆ ที่มี (IMO) ราคาที่สอดคล้องกันในความชันของเส้นโค้งการเรียนรู้ ความทรหดเป็นคุณภาพที่มีค่าสูงในสกาล่าโดยมีหลายสิ่งให้เลือก

  • ภาษาที่ใช้งานได้ทำสิ่งที่แตกต่างกันมากดังนั้นการทำงานพื้นฐานไม่ได้จับคู่กับโครงสร้างที่จำเป็น


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

1
@jk ใช่ตกลง! ในเวลาเดียวกันมันเป็นเหตุผลที่พวกเขามีช่วงการเรียนรู้ที่สูงชันสำหรับโปรแกรมเมอร์ที่มีพื้นฐานที่จำเป็นและคณิตศาสตร์เล็ก ๆ (เช่นฉัน) และทำไมพวกเขาถึงคุ้มค่า
Richard ปิด

3

หากฉันเข้าใจความคิดเห็นสุดท้ายของคุณถูกต้องคำถามของคุณคือเหตุผลที่แฮสเค็ลมักใช้ตัวดำเนินการเชิงสัญลักษณ์ในสถานที่ที่สามารถใช้คำหลักที่เป็นตัวอักษรและตัวเลข (หรือชื่อฟังก์ชัน) ได้

เกี่ยวกับคำหลักหนึ่งคำตอบก็คือคำหลักป้องกันไม่ให้คุณใช้คำบางคำเป็นชื่อตัวแปร ตัวอย่างเช่นฉันรำคาญเสมอเมื่อฉันต้องการเรียกตัวแปรของฉันfromและtoในภาษาที่หนึ่งในนั้นคือคำหลัก - เช่นใน Python

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

อีกเหตุผลคืออ่านง่าย นั่นอาจดูเหมือนเคาน์เตอร์ง่ายเนื่องจากตัวดำเนินการเชิงสัญลักษณ์มักจะยากที่จะเรียนรู้เนื่องจาก "ชื่อ" ของพวกเขาไม่ได้บอกอะไรคุณเกี่ยวกับสิ่งที่พวกเขาทำ (ในขณะที่ชื่อฟังก์ชั่นมักจะ) แต่เมื่อคุณรู้ว่า การแสดงออกด้วยตัวดำเนินการสัญลักษณ์ infix มักจะง่ายต่อการแยกวิเคราะห์สำหรับมนุษย์มากกว่าหนึ่งที่มีฟังก์ชั่นคำนำหน้าตัวเลขและตัวอักษรจำนวนมากเรียกตั้งแต่ผู้ประกอบการที่มีความแตกต่างทางสายตาได้ง่ายขึ้นจากตัวถูกดำเนินการทาง ตัวอย่างเช่นคนส่วนใหญ่จะยอมรับว่า2 * 3 + 4เป็นได้ง่ายขึ้นอ่านกว่าหรือadd (mult 2 3) 4add(mult(2, 3), 4)


@PeterTaylor Nope เพียงฉันกำลังงี่เง่า ;-) แก้ไขทันที
sepp2k

3

ภาษาคอมพิวเตอร์ที่มีความจำเป็นส่วนใหญ่ไม่ได้ใกล้เคียงกับภาษาธรรมชาติมากกว่า Haskell

อย่างไรก็ตามบางส่วนได้รับการออกแบบให้มีลักษณะใกล้เคียงกับภาษาอังกฤษมากขึ้นเช่น Cobol และ Hypercard บทเรียนที่ฉันจะทำจากตัวอย่างเหล่านี้คือ:

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

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


3

ฉันคิดว่า Haskell มีความคล้ายคลึงกับภาษามนุษย์อย่างที่ไม่เคยมีมาก่อน มันมีความยาวขนาดใหญ่มากสำหรับเรื่องนี้เช่นส่วนwhereคำสั่งที่จะเลื่อนการกำหนดและไวยากรณ์รายการความเข้าใจซึ่งเป็นสิ่งที่ฉันจะเขียนบนกระดานดำ นอกจากนี้ยังหลีกเลี่ยงอักขระที่ไม่เกี่ยวข้องเช่นเครื่องหมายปีกกาและมีการใช้การเยื้องอย่างเสรี ตัวอย่างทั่วไปคือ quicksort:

qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
               where lesser = [x | x <- xs, x <= p] 
                     greater = [x | x <- xs, x > p]

ยอมรับว่าเป็นตัวอย่างง่ายๆ แต่ฉันไม่ทราบว่าภาษาอื่นใดที่สามารถอ่านได้อย่างที่เป็นอยู่

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

ถ้ามีอะไรฉันจะบอกว่า Haskell ได้เสียสละความเรียบง่ายทางไวยากรณ์เพื่อรองรับไวยากรณ์ที่คล้ายกับภาษามนุษย์ ภาษาเช่นรูปแบบมีไวยากรณ์ที่อยู่ไกลจากสิ่งที่มนุษย์จะเขียน แต่มันง่ายมากที่จะอธิบายกฎของมัน


3
ฉันไม่ค่อยจะเรียกมันว่ามนุษย์อ่านได้ ฉันรู้จัก quicksort ฉันคุ้นเคยกับวิธีการตั้งค่าในหลายภาษาฉันรู้ว่าควรทำอย่างไรและฉันก็ยังไม่สามารถทำหัวหรือก้อยจากครึ่งล่างของข้อมูลโค้ดนั้นได้
Mason Wheeler

ฉันเดาว่ามันขึ้นอยู่กับพื้นหลังของคุณ นี่เป็นเรื่องธรรมดาอย่างที่ฉันคิดว่าจะเป็น ...
Andrea

2
ไม่ว่าในกรณีใดมันควรจะคล้ายกับสัญกรณ์นี้: purplemath.com/modules/setnotn.htm
Andrea

4
คุณแน่ใจหรือว่าไม่ควรเป็นเช่นนั้น++ [p] ++?
Peter Taylor

1
@ Mason: ฉันค่อนข้างชัดเจนและฉันไม่เคยเขียน Haskell
วินไคลน์

2

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

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


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