ระดับปริญญาตรีของฉันอยู่ในวิทยาศาสตร์ความรู้ความเข้าใจและปัญญาประดิษฐ์ จากนั้นฉันมีช่วงแนะนำหนึ่งคอร์สกับ LISP ฉันคิดว่าภาษาน่าสนใจ (เหมือนใน "หรูหรา") แต่ไม่ได้คิดอะไรมากมายจนกระทั่งฉันได้พบกับกฎข้อที่สิบของ Greenspun ในภายหลัง:
โปรแกรม C หรือ Fortran ที่ซับซ้อนเพียงพอใด ๆ มี ad hoc ที่ระบุอย่างไม่เป็นทางการระบุข้อผิดพลาดและการใช้งานช้าของครึ่งหนึ่งของ Common LISP
ประเด็นของ Greenspun คือ (บางส่วน) ที่โปรแกรมที่ซับซ้อนจำนวนมากมีล่ามในตัว แทนที่จะสร้างล่ามให้เป็นภาษาเขาแนะนำว่ามันอาจเหมาะสมกว่าที่จะใช้ภาษาอย่าง Lisp ที่มีตัวแปล (หรือคอมไพเลอร์) อยู่แล้ว
ตอนนั้นฉันทำงานกับแอพที่ค่อนข้างใหญ่ซึ่งทำการคำนวณที่ผู้ใช้กำหนดโดยใช้ล่ามที่กำหนดเองสำหรับภาษาที่กำหนดเอง ฉันตัดสินใจลองเขียน core ใน Lisp ใหม่อีกครั้งเพื่อทดลองขนาดใหญ่
ใช้เวลาประมาณหกสัปดาห์ รหัสเดิมคือ ~ 100,000 บรรทัดของ Delphi (ตัวแปร Pascal) ใน Lisp ที่ลดลงเหลือ 10,000 บรรทัด ที่น่าแปลกใจมากขึ้นคือความจริงที่ว่า Lisp engine เร็วกว่า 3-6 เท่า และโปรดจำไว้ว่านี่เป็นผลงานของ Neophyte Lisp! ประสบการณ์ทั้งหมดนั้นค่อนข้างเปิดตาสำหรับฉัน เป็นครั้งแรกที่ฉันเห็นความเป็นไปได้ของการรวมการแสดงและการแสดงออกในภาษาเดียว
ต่อมาเมื่อฉันเริ่มทำงานในโครงการที่ทำเว็บฉันได้คัดเลือกภาษาหลายภาษา ฉันรวม Lisp และ Scheme ไว้ด้วยกัน ในที่สุดผมเลือกโครงการ implementation-- Chez โครงการ ฉันมีความสุขมากกับผลลัพธ์
โครงการ Web-based เป็นที่มีประสิทธิภาพสูง"เครื่องยนต์ตัวเลือก" เราใช้ Scheme ในหลากหลายวิธีตั้งแต่การประมวลผลข้อมูลไปจนถึงการสืบค้นข้อมูลไปจนถึงการสร้างหน้า ในหลาย ๆ จุดเราเริ่มต้นด้วยภาษาที่แตกต่างกัน แต่จบลงด้วยการย้ายไปที่ Scheme ด้วยเหตุผลที่ฉันจะอธิบายสั้น ๆ ด้านล่าง
ตอนนี้ฉันสามารถตอบคำถามของคุณได้ (อย่างน้อยก็ในบางส่วน)
ในระหว่างการออดิชั่นเราได้พิจารณาการใช้งาน Lisp และ Scheme ที่หลากหลาย ในด้านเสียงกระเพื่อมเราดู (ฉันเชื่อว่า) Allegro CL, CMUCL, SBCL และ LispWorks ในด้านโครงการเรามองไปที่ (ฉันเชื่อ) Bigloo, Chicken, Chez, Gambit (การเลือกภาษาเป็นเวลานานมาแล้วนั่นเป็นเหตุผลว่าทำไมฉันถึงค่อนข้างขุ่นมัวฉันสามารถขุดโน้ตได้ถ้ามันสำคัญ)
ทันทีที่เรากำลังมองหา a) เธรดพื้นฐานและ b) การสนับสนุน Linux, Mac และ Windows สองเงื่อนไขนี้รวมกันทำให้ทุกคนล้มเหลว แต่ (ฉันคิดว่า) Allegro และ Chez ออกมาดังนั้นเพื่อที่จะดำเนินการประเมินผลต่อไปเราต้องคลายข้อกำหนดหลายเธรด
เรารวบรวมชุดโปรแกรมขนาดเล็กและใช้พวกมันสำหรับการประเมินและทดสอบ ที่เปิดเผยจำนวนปัญหา ตัวอย่างเช่นการใช้งานบางอย่างมีข้อบกพร่องที่ทำให้การทดสอบบางอย่างไม่สามารถทำงานจนเสร็จ การใช้งานบางอย่างไม่สามารถรวบรวมรหัสในเวลาทำงาน การใช้งานบางอย่างไม่สามารถรวมรหัสที่คอมไพล์แบบรันไทม์เข้ากับโค้ดที่คอมไพล์ล่วงหน้าได้ การใช้งานบางอย่างมีนักสะสมขยะซึ่งดีกว่า (หรือแย่กว่า) อย่างชัดเจนกว่าของผู้อื่น เป็นต้น
สำหรับความต้องการของเรามีเพียงสามการใช้งานเชิงพาณิชย์ - Allegro, Chez และ Lispworks - ผ่านการทดสอบเบื้องต้นของเรา ในสาม Chez เท่านั้นที่ผ่านการทดสอบทั้งหมดด้วยสีที่บินได้ ในขณะที่ฉันคิดว่า Lispworks ไม่มีเธรดดั้งเดิมบนแพลตฟอร์มใด ๆ (ฉันคิดว่าพวกเขาทำในตอนนี้) และฉันคิดว่า Allegro มีเธรดพื้นฐานในบางแพลตฟอร์มเท่านั้น นอกจากนี้อัลเลโกรมีค่าธรรมเนียมการ "เรียกใช้" แบบเรียกใช้งานซึ่งฉันไม่ชอบมาก ฉันเชื่อว่า Lispworks ไม่มีค่าธรรมเนียมรันไทม์และ Chez มีการจัดการที่ตรงไปตรงมา (และสมเหตุสมผลมาก) (และมันจะเตะเท่านั้นถ้าคุณใช้คอมไพเลอร์ในเวลาทำงาน)
มีการผลิตชิ้นส่วนของรหัสที่ค่อนข้างสำคัญทั้ง Lisp และ Scheme ที่นี่มีบางจุดเปรียบเทียบและความคมชัด:
สภาพแวดล้อมเสียงกระเพื่อมเป็นผู้ใหญ่มากขึ้น คุณได้รับมากกว่าสำหรับเจ้าชู้ (ต้องบอกว่ารหัสเพิ่มเติมก็เท่ากับข้อบกพร่องมากขึ้น)
สภาพแวดล้อม Lisp ยากต่อการเรียนรู้ คุณต้องใช้เวลามากขึ้นในการมีความเชี่ยวชาญ Common Lisp เป็นภาษาที่ยิ่งใหญ่ - และนั่นคือก่อนที่คุณจะไปถึงห้องสมุดที่การติดตั้งเชิงพาณิชย์เพิ่มเข้ามานั้น (ต้องบอกว่ากรณีไวยากรณ์ของ Scheme นั้นลึกซึ้งและซับซ้อนกว่าสิ่งใด ๆ ใน Lisp)
สภาพแวดล้อมเสียงกระเพื่อมอาจค่อนข้างยากในการสร้างระบบไบนารีคุณจำเป็นต้อง "เขย่า" รูปภาพของคุณเพื่อลบบิตที่ไม่ต้องการและหากคุณไม่ออกกำลังกายโปรแกรมของคุณอย่างถูกต้องในระหว่างขั้นตอนนั้น . ในทางตรงกันข้ามกับ Chez เรารวบรวมไฟล์ระดับบนสุดที่รวมไฟล์อื่น ๆ ทั้งหมดที่มันต้องการและเราเสร็จแล้ว
ฉันพูดก่อนหน้านี้ว่าเราลงเอยด้วยการใช้ Scheme ในหลาย ๆ ที่ที่เราไม่ได้ตั้งใจ ทำไม? ฉันนึกถึงเหตุผลสามข้อที่อยู่บนหัวของฉัน
อันดับแรกเราเรียนรู้ที่จะไว้วางใจ Chez (และผู้พัฒนาของ Cadence) เราถามมากจากเครื่องมือและมันก็ส่งมอบอย่างสม่ำเสมอ ตัวอย่างเช่น Chez มีข้อบกพร่องเล็กน้อยในอดีตและตัวจัดการหน่วยความจำนั้นดีมาก
ประการที่สองเราเรียนรู้ที่จะรักการแสดงที่เราได้รับจากเชซ เราใช้บางสิ่งที่รู้สึกเหมือนภาษาสคริปต์ - และเราได้รับความเร็วโค้ดเนทีฟจากภาษานั้น สำหรับบางสิ่งที่ไม่สำคัญ - แต่มันไม่เคยเจ็บและบางครั้งมันช่วยได้มาก
สามเราเรียนรู้ที่จะรักสิ่งที่เป็นนามธรรม ฉันไม่ได้หมายถึงมาโคร แต่อย่างใด ฉันหมายถึงสิ่งต่าง ๆ เช่นการปิด, lambdas, tail-call, เป็นต้นเมื่อคุณเริ่มคิดในแง่เหล่านั้นภาษาอื่น ๆ ดูเหมือนจะค่อนข้าง จำกัด โดยการเปรียบเทียบ
โครงการสมบูรณ์แบบหรือไม่ ไม่มี มันเป็นการแลกเปลี่ยน ประการแรกมันช่วยให้นักพัฒนาแต่ละคนมีประสิทธิภาพมากขึ้น - แต่มันยากขึ้นสำหรับนักพัฒนาที่จะงงโค้ดของกันและกันเพราะป้ายบอกทางที่ภาษาส่วนใหญ่มี (เช่นสำหรับลูป) หายไปใน Scheme (เช่นมีวิธีการนับล้านที่ต้องทำ สำหรับห่วง) ประการที่สองมีกลุ่มนักพัฒนาที่เล็กกว่ามากที่จะพูดคุยจ้างจากยืมจาก ฯลฯ
สรุปแล้วฉันคิดว่าฉันพูดว่า: Lisp และ Scheme มีความสามารถบางอย่างที่ไม่สามารถใช้งานได้จากที่อื่น ความสามารถนั้นคือการแลกเปลี่ยนดังนั้นจึงควรมีความสามารถที่เหมาะสมในกรณีของคุณโดยเฉพาะ ในกรณีของเราปัจจัยที่กำหนดว่าจะไปกับ Lisp หรือ Scheme นั้นเกี่ยวข้องกับคุณลักษณะพื้นฐานมากเพียงใด (การสนับสนุนแพลตฟอร์ม, เธรดแพลตฟอร์ม, การรวบรวมเวลาทำงาน, การให้สิทธิ์ใช้งานเวลา) มากกว่าที่ทำกับคุณสมบัติภาษาหรือไลบรารี อีกครั้งในกรณีของเราที่เป็นการแลกเปลี่ยนด้วย Chez เราได้รับคุณสมบัติหลักที่เราต้องการ แต่เราสูญเสียห้องสมุดที่กว้างขวางในสภาพแวดล้อม Lisp เชิงพาณิชย์
นอกจากนี้เพื่อกล่าวย้ำอีกครั้ง: เรามองดู Lisps และ Schemes ต่างๆเมื่อนานมาแล้ว พวกเขาทั้งหมดได้รับการพัฒนาและปรับปรุงตั้งแต่