อะไรทำให้ Lisp พิเศษ

«ภาษาโปรแกรมที่ยิ่งใหญ่ที่สุดที่เคยสร้างมา«
— อลัน เคย์ จาก "on Lisp"

อะไรทำให้ Lisp พิเศษ

เมื่อ McCarthy พัฒนา Lisp ในช่วงปลายทศวรรษ 1950 มันแตกต่างอย่างสิ้นเชิงจากภาษาที่มีอยู่ในปัจจุบัน โดยภาษาที่สำคัญที่สุดคือ ฟอร์แทรน.

Lisp นำเสนอแนวคิดใหม่เก้าประการ:

1. เงื่อนไข. คำสั่งแบบมีเงื่อนไขคือโครงสร้างแบบ if-then-else ตอนนี้เราถือว่าพวกเขาได้รับ พวกเขาเป็น ประดิษฐ์ McCarthy ระหว่างการพัฒนา Lisp (ในขณะนั้น Fortran มีเพียงคำสั่ง goto เท่านั้น ซึ่งเชื่อมโยงอย่างใกล้ชิดกับคำสั่งสาขาเกี่ยวกับฮาร์ดแวร์พื้นฐาน) McCarthy ในขณะที่อยู่ในคณะกรรมการ Algol ได้มีส่วนสนับสนุนเงื่อนไขให้กับ Algol จากที่ที่พวกมันแพร่กระจายไปยังภาษาอื่น

2. ประเภทของฟังก์ชัน. ใน Lisp ฟังก์ชันถือเป็นอ็อบเจ็กต์ชั้นหนึ่ง ซึ่งเป็นประเภทข้อมูล เช่นเดียวกับตัวเลข สตริง ฯลฯ และมีการแสดงค่าตามตัวอักษร สามารถเก็บไว้ในตัวแปร สามารถส่งผ่านเป็นอาร์กิวเมนต์ได้ ฯลฯ

3. การเรียกซ้ำ. แน่นอนว่าการเรียกซ้ำนั้นมีอยู่ในแนวคิดทางคณิตศาสตร์ก่อน Lisp แต่ Lisp เป็นภาษาโปรแกรมแรกที่รองรับ (นี่อาจบอกเป็นนัยในการสร้างฟังก์ชันเป็นวัตถุชั้นหนึ่ง)

4. แนวคิดใหม่ของตัวแปร. ใน Lisp ตัวแปรทั้งหมดเป็นตัวชี้ที่มีประสิทธิภาพ ค่าคือสิ่งที่ประเภทมี ไม่ใช่ตัวแปร และการกำหนดหรือการผูกตัวแปรหมายถึงการคัดลอกพอยน์เตอร์ ไม่ใช่สิ่งที่พวกเขาชี้ไป

5. เก็บขยะ.

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

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

ข้อจำกัดดังกล่าวถูกยกเลิกพร้อมกับการกำเนิดของภาษาที่มีโครงสร้างแบบบล็อก แต่เมื่อถึงตอนนั้นมันก็สายเกินไป ความแตกต่างระหว่างสำนวนและข้อความได้ถูกกำหนดไว้แล้ว มันส่งต่อจาก Fortran ไปยัง Algol และส่งต่อไปยังลูกหลานของพวกเขา

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

(if foo (= x 1) (= x 2))

หรือ

(= x (if foo 1 2))

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

8. สัญกรณ์สำหรับรหัส โดยใช้สัญลักษณ์ต้นไม้

9. มีภาษาทั้งหมดอยู่เสมอ. ไม่มีความแตกต่างที่ชัดเจนระหว่างเวลาในการอ่าน เวลาคอมไพล์ และเวลารัน คุณสามารถคอมไพล์หรือรันโค้ดในขณะที่คุณอ่าน หรืออ่านหรือรันโค้ดในขณะที่คุณคอมไพล์ หรืออ่านหรือคอมไพล์โค้ดในขณะที่รัน

การรันโค้ดในขณะที่อ่านทำให้ผู้ใช้สามารถตั้งโปรแกรมไวยากรณ์ของ Lisp ใหม่ได้ การรันโค้ด ณ เวลาคอมไพล์เป็นพื้นฐานสำหรับมาโคร การคอมไพล์รันไทม์เป็นพื้นฐานสำหรับการใช้ Lisp เป็นภาษาส่วนขยายในโปรแกรมเช่น Emacs; และสุดท้าย การอ่านรันไทม์ทำให้โปรแกรมสามารถสื่อสารโดยใช้ s-expressions ซึ่งเป็นแนวคิดที่เพิ่งถูกคิดค้นใหม่ใน XML

ข้อสรุป

เมื่อ Lisp ถูกประดิษฐ์ขึ้นครั้งแรก แนวคิดเหล่านี้แตกต่างจากแนวทางปฏิบัติในการเขียนโปรแกรมแบบเดิมๆ ที่กำหนดโดยฮาร์ดแวร์ที่มีอยู่ในช่วงปลายทศวรรษ 1950

เมื่อเวลาผ่านไป ภาษาเริ่มต้นซึ่งรวบรวมมาจากความสำเร็จของภาษายอดนิยม ค่อยๆ พัฒนาไปสู่ ​​Lisp ตอนนี้คะแนน 1-5 ได้รับการยอมรับอย่างกว้างขวางแล้ว จุดที่ 6 เริ่มปรากฏในกระแสหลักแล้ว ใน Python มี clause 7 ในบางรูปแบบ แม้ว่าจะไม่มีไวยากรณ์ที่เหมาะสมก็ตาม รายการที่ 8 (พร้อมรายการที่ 9) ทำให้มาโครเป็นไปได้ใน Lisp แต่ยังคงอยู่ใน Lisp เท่านั้น อาจเป็นเพราะ (a) ต้องใช้วงเล็บเหล่านั้นหรือบางอย่างที่แย่พอๆ กัน และ (b) ถ้าคุณเพิ่มพลังที่เพิ่มขึ้นล่าสุดนี้ คุณสามารถ ไม่อ้างว่าได้คิดค้นภาษาใหม่อีกต่อไป แต่เพียงเพื่อพัฒนาภาษาถิ่นใหม่ของ Lisp เท่านั้น -)

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

ที่มา: will.com

เพิ่มความคิดเห็น