ภาษาคำสั่งแตกต่างจากภาษาที่ใช้งานได้อย่างไร


17

ฉันกำลังอ่าน Simon Peyton Jones เรื่องการใช้งานฟังก์ชั่นการเขียนโปรแกรมภาษาและมีข้อความหนึ่งที่ทำให้ฉันประหลาดใจเล็กน้อย (หน้า 39):

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

ตอนนี้เขียนในปี 1987 และความคิดของฉันในเรื่องนี้อาจได้รับอิทธิพลจากภาษาการเขียนโปรแกรมที่ทันสมัยมากขึ้นซึ่งไม่ได้อยู่ใกล้หรือเป็นที่นิยม อย่างไรก็ตามฉันพบว่ามันยากที่จะเชื่อ ตัวอย่างเช่นฉันคิดว่าภาษามิแรนดาที่ได้อธิบายไว้ (ผู้บุกเบิกยุคแรกของ Haskell) มีความหมายที่แตกต่างกันมากเมื่อเทียบกับภาษาที่เข้มงวดเช่น ML มากกว่าคำว่า C ถึง Pascal หรือบางทีแม้แต่ C C ++ ให้การตรวจสอบจุดของเขาบางอย่าง :-)

แต่จากนั้นอีกครั้งฉันกำลังใช้ความเข้าใจอย่างถ่องแท้ Simon Peyton Jones ส่วนใหญ่ถูกต้องในการพูดแบบนี้หรือว่าเป็นประเด็นที่ถกเถียงกันอยู่?

คำตอบ:


19

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

V

แต่เพื่อไปยังหมวดหมู่ที่เหมาะสมสำหรับการตีความภาษาที่ใช้งานได้จริงสิ่งต่าง ๆ น่ากลัวมาก โดยพื้นฐานแล้วคุณจะสร้างหมวดหมู่ที่มีความอุดมสมบูรณ์ของ ultrametric ของความสัมพันธ์ความเท่าเทียมกันบางส่วนบนโดเมนนี้ (เป็นตัวอย่างให้ดู Birkedal, Stovring และ Thamsborg ของ "ความหมายของความแปรปรวนของตัวแปร, การอ้างอิงทั่วไปและประเภทการเรียกซ้ำ") ของ Thamsborg (ตัวอย่างเช่นดู Ahmed, Dreyer และ Rossberg ของ "ความเป็นอิสระของรัฐขึ้นอยู่กับการเป็นตัวแทน") ทั้งสองวิธีเทคนิคที่ใช้นั้นค่อนข้างใหม่

a -> baTaT(A)aa

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

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

หากคุณต้องการใช้คุณสมบัติเชิงมิติอย่างจริงจังยิ่งขึ้น ML และ Haskell จะเริ่มแสดงความแตกต่างที่รุนแรงยิ่งขึ้น มันยังคงอาจจะเป็นไปได้ที่จะประดิษฐ์ metalanguage เรื่องธรรมดาสำหรับพวกเขา แต่ความหมายของประเภทจะแตกต่างกันในทางที่เป็นระบบมากขึ้นมากที่เกี่ยวข้องกับความคิดที่พิสูจน์ทฤษฎีของการมุ่งเน้น หนึ่งในสถานที่ที่ดีในการเรียนรู้เกี่ยวกับเรื่องนี้คือวิทยานิพนธ์ปริญญาเอกของ Noam Zeilberger


10

ความรู้สึกของฉันอยู่ที่ SPJ หมายถึงหมดจดภาษาทำงาน - ภาษา IE ที่มีความโปร่งใส referentially ซึ่งรวมถึงเช่น Haskell, Miranda, Clean แต่ไม่ใช่ ML เมื่อคุณมีภาษาที่ใช้งานได้อย่างหมดจดโดยทั่วไปคุณสามารถให้ความหมายเชิงลบที่ชัดเจนและชัดเจนได้ โดยทั่วไปความหมายนี้จะคล้ายกับแคลคูลัสแลมบ์ดาโดยมีการปรับแต่งที่นี่และที่นั่น โดยทั่วไปคุณจะมีระบบแบบที่แยกสิ่งที่คล้ายกับตัวแปรของ System F - อาจมีประสิทธิภาพมากกว่าในบางกรณีและมีข้อ จำกัด มากขึ้น นี่คือสาเหตุที่การแยกรหัสไปที่ / การรวบรวมไปยัง Haskell, O'Caml และอื่น ๆ นั้นค่อนข้างตรงไปตรงมาจากผู้ช่วยที่มีความซับซ้อนในการพิมพ์เช่น Agda

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

คำพูดของไซม่อนสอดคล้องกับบริบททางประวัติศาสตร์ที่สำคัญมากเช่นกัน ในช่วงเวลาที่เกิดของ Haskell (1987) มีภาษาที่ใช้งานไม่เข้มงวดไม่เพียง แต่มีมิแรนดาเท่านั้น แต่ Lazy ML, Orwell, Clean และอื่น ๆ อีกมากมาย นอกเหนือจากความหลากหลายของวากยสัมพันธ์ไวยากรณ์พวกเขาทั้งหมดเป็นภาษาเดียวกันมาก ซึ่งเป็นแรงบันดาลใจอย่างแม่นยำสำหรับคณะกรรมการ Haskell สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ดู "ประวัติศาสตร์ของ Haskell: ขี้เกียจกับชั้น": http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/


5

ฉันคิดว่า SPJ พูดถูกต้องสำหรับความหมายหลัก

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

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

ในทางตรงกันข้ามการใช้งาน C กับการใช้ Smalltalk ของฟังก์ชั่นเดียวกันน่าจะมีโครงสร้างที่แตกต่างกัน (ฟังก์ชั่นและโครงสร้างข้อมูลระดับต่ำกับวัตถุ) มุ่งเน้นไปที่รายละเอียดในระดับต่างๆ (ตัวอย่างเช่นการจัดการหน่วยความจำด้วยตนเอง ) และดำเนินการในระดับต่าง ๆ ของสิ่งที่เป็นนามธรรม

มุมมองโลกของพื้นที่การออกแบบภาษาเชิงฟังก์ชั่นนั้นมีความเฉพาะเจาะจงและเชื่อมโยงกันมากกว่าพื้นที่ "การเขียนโปรแกรมที่จำเป็น" ซึ่งรวมเข้าด้วยกันในการประกอบ C, Smalltalk, Forth และภาษาอื่น ๆ อีกมากมายในหมวด catchall


4

ฉันคิดว่าคำพูดของ Simon PJ เป็นคำพูดนอกคอกจริง ๆ

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

ภาษาที่ใช้งานได้เกือบทั้งหมดใช้การจัดการหน่วยความจำที่เก็บขยะและโครงสร้างข้อมูลแบบเรียกซ้ำ (กำเนิดโดย Lisp) ส่วนใหญ่ใช้ชนิดข้อมูล "พีชคณิต" และการจับคู่รูปแบบ (ต้นกำเนิดโดย Hope) ส่วนใหญ่ใช้ฟังก์ชันลำดับสูง มีต้นกำเนิดจาก ML) นอกจากนั้นฉันทามติก็หายไป พวกเขาแตกต่างกันในระบบโมดูลที่ใช้วิธีการดำเนินการเปลี่ยนสถานะและผลกระทบการคำนวณอื่น ๆ ควรได้รับการจัดการอย่างไรและลำดับการประเมินผล (call-by-name เทียบกับ call-by-value) เป็นต้น

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

ดังนั้นฉันไม่ชัดเจนว่าความแตกต่างระหว่างสองภาษาของภาษาในความเท่าเทียมกันของพวกเขาเป็นสิ่งที่ดีมาก

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


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