ภาษาการเขียนโปรแกรมกลายเป็นภาษาธรรมชาติมากกว่าหรือเปล่า?


27

เราสามารถศึกษาภาษาการเขียนโปรแกรมในบริบทของภาษาศาสตร์ได้หรือไม่? ภาษาการเขียนโปรแกรมมีวิวัฒนาการตามธรรมชาติในรูปแบบที่คล้ายคลึงกับภาษาธรรมชาติ

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

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

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

คุณคิดอย่างไร? ภาษาการเขียนโปรแกรมมีลักษณะคล้ายกับภาษาธรรมชาติมากขึ้นและสามารถนำไปใช้กับกฎหมายภาษาศาสตร์ได้หรือไม่?

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

มีการเชื่อมต่อระหว่างการแยก (Babel Tower effect) ของภาษามนุษย์และภาษาคอมพิวเตอร์หรือไม่? พวกเขามีความหลากหลายมากขึ้นด้วยเหตุผลเดียวกัน (เช่นการแก้ปัญหาที่แตกต่างกันภายในระบบคอมพิวเตอร์ / วัฒนธรรม - ระบบ ฯลฯ )?


3
คำตอบสั้น ๆ : ใช่ใช่พวกเขาเป็น

17
คำตอบสั้น ๆ : ไม่พวกเขาไม่ได้

คำถามนี้เป็นคำถามที่ถูกกล่าวถึงใน Meta
Robert Harvey

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

@ryanOptini: C #, JavaScript, Python หรือ SQL มีลักษณะเป็นภาษาธรรมชาติหรือไม่ แม้ว่าพวกเขาทั้งหมดจะใช้คำหลักจากภาษาอังกฤษ แต่ก็ไม่มีคำใดที่แปลงเป็นรูปแบบภาษาธรรมชาติ COBOL อาจจะใกล้เคียงที่สุด แต่ฉันไม่คิดว่าคนจำนวนมากกำลังใช้ COBOL สำหรับโครงการกรีนฟิลด์
จิมจี

คำตอบ:


32

ไม่จริงไม่ ภาษาการเขียนโปรแกรมมีมากขึ้นเช่นภาษาธรรมชาติเฉพาะในแง่ของ "คำที่เรามีในภาษาอังกฤษ" ( sic )

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

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

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

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

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


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

การเปรียบเทียบระหว่างสถาปัตยกรรมซีพียูและการเขียนโปรแกรมค่อนข้างไม่ตรงไปตรงมาการออกแบบฮาร์ดแวร์มักไม่ใช่แบบข้อความเป็นหลักเพราะมันมีปัญหาที่แตกต่างกันอย่างสิ้นเชิงในการแก้ปัญหาเช่นการจัดวาง 2D และปัญหาการกำหนดเส้นทาง (หากการออกแบบฮาร์ดแวร์ใด ๆ เคลื่อนไปสู่การออกแบบที่เน้นข้อความมากขึ้นด้วย HDL)
jk

2

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

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

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


2

กรณีศึกษาที่น่าสนใจในพื้นที่นี้คือPerl vs Ruby (และ Python ) Perl เป็นภาษาสคริปต์ที่พัฒนาขึ้นในช่วงต้นยุค 90 ที่เพิ่มความสามารถมากเมื่อเทียบกับภาษาสคริปต์ Unix ก่อนหน้า (เช่นทุบตี) Larry Wallผู้เขียนบันทึกไว้ว่าภูมิหลังของเขาในภาษาศาสตร์เป็นแรงบันดาลใจบางประการของภาษา

อย่างไรก็ตาม Perl มีไวยากรณ์ที่น่าอึดอัดใจและกรณีพิเศษมากมายที่ทำให้ภาษาค่อนข้างเหมือนภาษาอังกฤษในทุก ๆ การวิจารณ์ ภาษาสคริปต์ในเวลาต่อมาเช่น Ruby และ Python พัฒนาโดยนักวิทยาศาสตร์คอมพิวเตอร์มีความสอดคล้องกันมากในไวยากรณ์ของพวกเขา ปัญหาหลักคือภาษาธรรมชาติมีความคลุมเครือจำนวนมาก (นี่คือการศึกษาในสาขาภาษาศาสตร์) ดังนั้นภาษาธรรมชาติจะมีสถานที่สำคัญสำหรับอินเทอร์เฟซคอมพิวเตอร์มนุษย์ในอนาคตเช่นSiriแต่อินเตอร์เฟสเหล่านั้นจะมีปัญหาความกำกวม

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


คุณมีวันที่ที่ไม่ถูกต้อง: Perl เปิดตัวในปี 1987, ทุบตีในปี 1989 นอกจากนี้ยังเป็นเรื่องยากที่จะอ่านการโพสต์ของคุณเนื่องจากข้อผิดพลาดการใช้อักษรตัวใหญ่
tchrist

1

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

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

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

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

งานและเป้าหมายที่แตกต่างกันทุกอย่างมีภาษาเป็นของตัวเองนั่นไม่ใช่ "วิวัฒนาการของภาษาเดียว" ที่เรียบง่าย แต่ก็มีภาษาอีกมากมาย งานที่แม่นยำต้องการภาษาที่แม่นยำและงานที่ผ่อนคลายต้องใช้ภาษาที่ผ่อนคลาย

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


1

หลายปีที่ผ่านมาลูกชายคนโตของฉันและฉันได้พัฒนาระบบการเขียนโปรแกรมแบบธรรมดาภาษาอังกฤษและพัฒนาขึ้นเพื่อตอบคำถามต่อไปนี้:

  1. โปรแกรมระดับล่าง (เช่นคอมไพเลอร์) สามารถเขียนได้อย่างสะดวกและมีประสิทธิภาพในภาษาระดับสูง (เช่นภาษาอังกฤษ) หรือไม่?

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

  3. การเขียนโปรแกรมง่ายขึ้นหรือไม่เมื่อคุณไม่ต้องแปลความคิดทางภาษาธรรมชาติของคุณเป็นไวยากรณ์ทางเลือก

ตอนนี้เราสามารถตอบคำถามสามข้อนี้จากประสบการณ์ตรงด้วย "ใช่" ดังก้อง

โปรแกรมแยกวิเคราะห์ของเราทำงานเราคิดว่าคล้ายกับสมองของมนุษย์ พิจารณา. พ่อพูดกับลูกชายลูกของเขา:

"ต้องการที่จะดูดขวดนี้คนตัวเล็ก?"

และเด็กได้ยิน

"blah, blah, SUCK, blah, blah, ขวด, blah, blah."

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

นิยามประเภททั่วไปมีลักษณะเช่นนี้:

รูปหลายเหลี่ยมเป็นสิ่งที่มีจุดยอด

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

รูทีนทั่วไปมีลักษณะดังนี้:

ในการผนวก x coord และ ay coord ให้กับรูปหลายเหลี่ยม: สร้างจุดสุดยอดที่กำหนดให้ x และ y ผนวกจุดยอดเข้ากับจุดยอดของรูปหลายเหลี่ยม

โปรดทราบว่าไม่จำเป็นต้องใช้ชื่อทางการ (คำนามที่เหมาะสม) สำหรับพารามิเตอร์และตัวแปร เราเชื่อว่านี่เป็นข้อมูลเชิงลึกที่สำคัญ เก้าอี้และโต๊ะในโลกแห่งความเป็นจริงของฉันไม่เคยเรียกว่า "c" หรือ "myTable" (ในการสนทนาปกติ) - ฉันเรียกพวกเขาว่า "เก้าอี้" และ "โต๊ะ" เช่นเดียวกันที่นี่: "จุดสุดยอด" และ "รูปหลายเหลี่ยม" เป็นชื่อธรรมชาติสำหรับสิ่งต่าง ๆ

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

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

ในระดับต่ำสุดสิ่งต่าง ๆ เช่นนี้:

ในการเพิ่มหมายเลขไปยังหมายเลขอื่น: Intel $ 8B85080000008B008B9D0C0000000103

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

คุณสามารถรับระบบการพัฒนาของเราได้ที่นี่: www.osmosian.com/cal-3040.zip มันเป็นโปรแกรม Windows ขนาดเล็กน้อยกว่าเมกะไบต์ หากคุณเริ่มต้นด้วย PDF ในไดเรกทอรี "เอกสาร" ก่อนที่คุณจะไปสิบหน้าคุณจะต้องรวบรวมข้อมูลทั้งหมดในตัวเองอีกครั้ง (ภายในเวลาไม่ถึงสามวินาทีบนเครื่องด้านล่างสุดของวอลมาร์ท)

คำถามและความเห็นควรส่งถึง gerry.rzeppa@pobox.com


คุณรู้หรือไม่ว่าtryo.ifi.uzh.ch/site/descriptionควบคุมภาษาอังกฤษ? คุณดูเหมือนจะนั่งอยู่ระหว่างนั้นกับ Inform7 en.wikipedia.org/wiki/Inform#Example_game_2
Pete Kirkham

ฉันชอบความคิดนี้ แต่ดูเหมือนว่ายังมีห่วงไวยากรณ์ที่จะข้ามไปได้ ตัวอย่างเช่นฉันไม่คิดว่าฉันหรือใครก็ตามที่สร้างแบบจำลองสิ่งเรขาคณิตจะพิจารณาพิกัด X และ Y ที่เพิ่มแยกกันดังนั้น "การผนวก x coord และ ay coord ... " ฟังดูแปลกสำหรับฉัน เช่นเดียวกับ "สร้างจุดสุดยอดที่ได้รับ x และ y" เกือบลืมไปแล้วเพราะส่วนใหญ่อ่านแล้วเหมือนภาษาอังกฤษ แต่ก็ดูเหมือนเข้มงวดเกินไป บางทีฉันอาจเคยชินกับการไม่คิดเหมือนมนุษย์หรืออะไรบางอย่างฉันไม่รู้
cHao

1

การแยกภาษามนุษย์มาจากวิวัฒนาการ (ดาร์วิน?) ในชุมชนที่แยกได้ การแยกภาษาการเขียนโปรแกรมมาจากการเปลี่ยนแปลงในความต้องการด้านเทคนิคอุดมการณ์ทางเทคนิคจากการเปลี่ยนแปลงในความเข้าใจด้านเทคนิคและทฤษฎีจากการเปลี่ยนแปลงในความสามารถทางเทคนิคของเราในการใช้งาน ฉันคิดว่าเป็นกระบวนการที่ค่อนข้างมีสติ

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

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

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

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

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

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

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

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

เมื่อมองย้อนกลับไปในประวัติศาสตร์ภาษาระดับสูงเริ่มจากความพยายามครั้งแรกที่จะเข้าใกล้รูปแบบที่เป็นธรรมชาติมากขึ้นเพื่อแสดงงานการคำนวณ แต่งานเหล่านี้ถูกเข้าใจว่าเป็นคณิตศาสตร์หรือตรรกะ (Fortran 1957, Algol 1958, Lisp 1958 ) หรือเชิงธุรกิจมากขึ้น (Cobol 1959) ภายใน 10 ปีที่ผู้คนกังวลเกี่ยวกับภาษาที่จะเข้าใกล้มากขึ้นปรับตัวเข้ากับปัญหาได้ดีขึ้นและมีการวิจัยที่สำคัญในสิ่งที่เรียกว่าextensible languagesครอบคลุมทั้งไวยากรณ์และความหมาย หนึ่งในเส้นทางสำคัญในการแสดงปัญหาอย่างเป็นธรรมชาติมากขึ้นคือการเกิดขึ้นของobject orientation(บางครั้งภายใต้ชื่ออื่น) แม้ว่ามันจะยากที่จะกำหนดความเป็นพ่อแม่ แต่มันก็อาจจะเกิดจากการทำงานของปัญญาประดิษฐ์ส่วนใหญ่ใน Lisp และจากภาษาSimula 67(ตระกูลอัลกอล) ซึ่งตัวมันเองตั้งใจที่จะแสดงออกถึงปัญหาที่เกิดขึ้นจริงในโลกแห่งความเป็นจริงที่จะถูกจำลองขึ้นบนคอมพิวเตอร์ ทุกอย่างดูเหมือนจะสอดคล้องกันในอดีต


0

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

บางทีช่องว่างระหว่างภาษาธรรมชาติและภาษาโปรแกรมจะลดลงหากช่องว่างระหว่างนักวิทยาศาสตร์คอมพิวเตอร์และคน "ธรรมชาติ" ลดลง


0

ในปีที่ผ่านมาความสนใจในอินเทอร์เฟซDSL (E) DSLและความคล่องแคล่วเพิ่มขึ้นอย่างต่อเนื่องในภาษาที่หลากหลาย: Haskell, ภาษาสคริปต์ต่าง ๆ , C #, Java และแม้แต่ C ++ (คิดถึงการโอเวอร์โหลดของoperator<<สำหรับการทำผลลัพธ์)

ในระดับหนึ่งรหัสเหล่านี้อนุญาตให้อ่านได้อย่างเป็นธรรมชาติมากขึ้น ฉันจะอธิบายด้วยตัวอย่าง EDSL เป็น Groovy groovy.timeแพคเกจช่วยให้คุณเขียน

use ( TimeCategory ) {
    // application on numbers:
    println 1.minute.from.now
    println 10.days.ago

    // application on dates
    def someDate = new Date()
    println someDate - 3.months 
}

หากคุณต้องทำเช่นนี้ผ่านคลาส java.util.Calendarคุณจะต้องเขียนสิ่งนี้เป็นตัวอย่างแรก:

void demo() {
    Calendar date = new GregorianCalendar();
    date.add(Calendar.MINUTE, 1);
    System.out.println(date);
}

0

ภาษาคอมพิวเตอร์ (แม้แต่ภาษาเครื่องขั้นพื้นฐานของวันที่ผ่านมานาน) เป็นภาษามนุษย์เป็นหลักสำหรับการสื่อสารกับมนุษย์เพื่อนถูกกำหนดโดยมนุษย์และมีการใช้เพียงครั้งที่สองเพื่อถ่ายทอดคำแนะนำไปยังเครื่อง ดังนั้นพวกเขาจึงพัฒนาวิธีการเดียวกันกับภาษา "ธรรมชาติ" ที่พัฒนาขึ้น (เพียงแค่ค้นหา "สำนวน" สำหรับภาษาที่คุณชื่นชอบตรวจสอบว่า C มีวิวัฒนาการมาจาก K&R C เป็น ISO-C 2011 ปัจจุบัน แต่พวกเขาอยู่ในสภาพแวดล้อมที่แตกต่างกัน ต้องสื่อความหมายที่แม่นยำ (คอมพิวเตอร์ยังโง่เกินไปที่จะเข้าใจและแก้ไขสิ่งที่ถูกถาม) และมีความสะดวกในการประมวลผลระดับพรีเมียม (ดังนั้นไวยากรณ์และคำศัพท์ของภาษา C ++, PL / 1 หรือ APL นั้นเรียบง่ายกว่ามากมากกว่าเช่นภาษาอังกฤษซึ่งเป็นภาษาธรรมชาติไปค่อนข้างง่าย)

สิ่งเดียวกันมากมายสามารถพูดได้ว่าเป็นทางการของคณิตศาสตร์หรือวิทยาศาสตร์ทั่วไปหรือแม้แต่พิมพ์เขียว (โดยเนื้อแท้ 2D ไม่ใช่ 1D เหมือนคนอื่น)

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