สิ่งนี้คือมีการเข้ารหัสฟังก์ชันไม่มากนัก นี่คือตัวเลือกหลัก:
การเขียนคำศัพท์ใหม่: คุณเก็บฟังก์ชั่นเป็นแผนผังต้นไม้แบบนามธรรม (หรือการเข้ารหัสบางส่วนเมื่อคุณเรียกใช้ฟังก์ชั่นคุณจะสำรวจแผนผังไวยากรณ์ด้วยตนเองเพื่อแทนที่พารามิเตอร์ด้วยอาร์กิวเมนต์ซึ่งทำได้ง่าย แต่ไม่มีประสิทธิภาพมากในแง่ของเวลาและพื้นที่ .
การปิด: คุณมีวิธีในการแสดงฟังก์ชั่น, อาจเป็นโครงสร้างต้นไม้, รหัสเครื่องจักรที่เป็นไปได้มากกว่า และในฟังก์ชั่นเหล่านี้คุณอ้างถึงข้อโต้แย้งของคุณโดยการอ้างอิงในทางใดทางหนึ่ง มันอาจเป็นตัวชี้ - ชดเชยมันอาจเป็นจำนวนเต็มหรือดัชนี De Bruijn มันอาจเป็นชื่อ จากนั้นคุณจะแสดงถึงฟังก์ชั่นเป็นการปิด : ฟังก์ชั่น "คำแนะนำ" (ต้นไม้รหัส ฯลฯ ) จับคู่กับโครงสร้างข้อมูลที่มีตัวแปรอิสระทั้งหมดของฟังก์ชั่น เมื่อฟังก์ชั่นถูกนำไปใช้จริงมันก็จะรู้วิธีการค้นหาตัวแปรอิสระในโครงสร้างข้อมูลของมันโดยใช้สภาพแวดล้อมการคำนวณทางคณิตศาสตร์เป็นต้น
ฉันแน่ใจว่ามีตัวเลือกอื่น ๆ แต่สิ่งเหล่านี้เป็นตัวเลือกพื้นฐานและฉันสงสัยว่าตัวเลือกอื่น ๆ เกือบทุกตัวจะเป็นตัวแปรหรือการเพิ่มประสิทธิภาพของโครงสร้างการปิดพื้นฐาน
ดังนั้นในแง่ของประสิทธิภาพการปิดเกือบจะทำงานได้ดีกว่าการเขียนคำซ้ำ ของรูปแบบที่ดีกว่า? ขึ้นอยู่กับภาษาและสถาปัตยกรรมของคุณเป็นอย่างมาก แต่ฉันสงสัยว่า "รหัสเครื่องที่มีโครงสร้างที่มี vars ฟรี" นั้นมีประสิทธิภาพที่สุด มันมีทุกอย่างที่ฟังก์ชั่นต้องการ (คำแนะนำและค่านิยม) และไม่มีอะไรเพิ่มเติมและการโทรไม่ได้จบลงที่การสำรวจระยะยาว
ฉันสนใจทั้งอัลกอริทึมการเข้ารหัสปัจจุบันใช้งานฟังก์ชั่นภาษายอดนิยม (Haskell, ML)
ฉันไม่ได้เป็นผู้เชี่ยวชาญ แต่ฉันเป็น 99% ของรสชาติ ML ส่วนใหญ่ใช้รูปแบบของการปิดที่ฉันอธิบายถึงแม้ว่าจะมีการเพิ่มประสิทธิภาพบางอย่าง ดูสิ่งนี้สำหรับมุมมอง (อาจล้าสมัย)
Haskell ไม่สิ่งบิตซับซ้อนมากขึ้นเพราะขี้เกียจของการประเมินผล: จะใช้ใจเสาะ Tagless กราฟการเขียนใหม่
และยังมีประสิทธิภาพมากที่สุดที่สามารถทำได้
มีประสิทธิภาพมากที่สุดคืออะไร ไม่มีการนำไปใช้งานที่จะมีประสิทธิภาพมากที่สุดในทุกอินพุตดังนั้นคุณจะได้รับการใช้งานที่มีประสิทธิภาพโดยเฉลี่ย แต่แต่ละจะเก่งในสถานการณ์ที่แตกต่างกัน ดังนั้นจึงไม่มีการจัดอันดับที่ชัดเจนว่ามีประสิทธิภาพมากที่สุดหรือน้อยที่สุด
ไม่มีเวทย์มนตร์ที่นี่ ในการจัดเก็บฟังก์ชั่นคุณจะต้องเก็บค่าว่างไว้ไม่เช่นนั้นคุณจะเข้ารหัสข้อมูลน้อยกว่าฟังก์ชั่นที่มี บางทีคุณสามารถเพิ่มประสิทธิภาพของค่าฟรีบางส่วนด้วยการประเมินบางส่วนแต่มีความเสี่ยงต่อประสิทธิภาพและคุณต้องระวังเพื่อให้แน่ใจว่าสิ่งนี้จะหยุดทำงาน
และบางทีคุณอาจใช้การบีบอัดบางส่วนหรืออัลกอริทึมที่ชาญฉลาดเพื่อเพิ่มประสิทธิภาพของพื้นที่ แต่แล้วคุณก็ถึงเวลาซื้อขายพื้นที่หรือคุณอยู่ในสถานการณ์ที่คุณปรับให้เหมาะสมสำหรับบางกรณีและชะลอตัวลงสำหรับผู้อื่น
คุณสามารถเพิ่มประสิทธิภาพสำหรับกรณีทั่วไป แต่สิ่งที่กรณีทั่วไปคือสามารถเปลี่ยนภาษาที่พื้นที่ของแอพลิเคชันอื่น ๆ ประเภทของรหัสที่รวดเร็วสำหรับวิดีโอเกม (หมายเลขกระทืบห่วงแน่นกับข้อมูลขนาดใหญ่) น่าจะแตกต่างกว่า มีอะไรเร็วสำหรับคอมไพเลอร์ (ทราเวิร์ททรี, รายการงาน ฯลฯ )
จุดโบนัส: มีการเข้ารหัสดังกล่าวที่แมปฟังก์ชั่นการเข้ารหัสจำนวนเต็มกับจำนวนเต็ม (สั้น int ฯลฯ ใน C) เป็นไปได้ไหม
ไม่เป็นไปไม่ได้ ปัญหาคือแคลคูลัสแลมบ์ดาไม่อนุญาตให้คุณใคร่ครวญคำศัพท์ เมื่อฟังก์ชั่นใช้การโต้เถียงที่มีประเภทเดียวกับตัวเลขในโบสถ์มันจะต้องสามารถเรียกมันได้โดยไม่ต้องตรวจสอบคำจำกัดความที่แน่นอนของตัวเลขนั้น นั่นคือสิ่งที่มีการเข้ารหัสของคริสตจักร: สิ่งเดียวที่คุณสามารถทำได้กับพวกเขาคือเรียกพวกเขาและคุณสามารถจำลองทุกอย่างที่เป็นประโยชน์กับสิ่งนี้ แต่ไม่ได้โดยไม่มีค่าใช้จ่าย
ที่สำคัญกว่านั้นเลขจำนวนเต็มมีการเข้ารหัสแบบไบนารี่ที่เป็นไปได้ทั้งหมด ดังนั้นหาก lambdas แสดงเป็นจำนวนเต็มคุณจะไม่มีทางเป็นตัวแทนของ lambdas ที่ไม่ใช่โบสถ์! หรือคุณจะแนะนำธงเพื่อแสดงว่าแลมบ์ดาเป็นตัวเลขหรือไม่ แต่จากนั้นประสิทธิภาพใด ๆ ที่คุณต้องการอาจหายไปนอกหน้าต่าง
แก้ไข: ตั้งแต่เขียนนี้ผมได้ตระหนักถึงตัวเลือกที่สามสำหรับการใช้ฟังก์ชั่นขั้นสูง: defunctionalization ที่นี่การเรียกใช้ฟังก์ชั่นทุกครั้งจะกลายเป็นswitch
คำสั่งขนาดใหญ่ขึ้นอยู่กับสิ่งที่เป็นนามธรรมแลมบ์ดาให้เป็นฟังก์ชั่น ข้อดีของการแลกเปลี่ยนคือการเปลี่ยนแปลงโปรแกรมทั้งหมด: คุณไม่สามารถรวบรวมชิ้นส่วนแยกจากกันและเชื่อมโยงเข้าด้วยกันด้วยวิธีนี้เนื่องจากคุณต้องมีชุดแลมบ์ดา abstractions ล่วงหน้า