ความแตกต่างระหว่างรหัสที่แปลและเรียบเรียงอาจเป็นนิยายตามที่ขีดเส้นใต้โดยความเห็นของราฟาเอล :
the claim seems to be trivially wrong without further assumptions: if there is
an interpreter, I can always bundle interpreter and code in one executable ...
ความจริงก็คือรหัสถูกตีความโดยซอฟต์แวร์โดยฮาร์ดแวร์หรือการรวมกันของทั้งสองและกระบวนการรวบรวมไม่สามารถบอกได้ว่ามันจะเป็น
สิ่งที่คุณเห็นว่าเป็นการรวบรวมเป็นกระบวนการแปลจากภาษาหนึ่ง (สำหรับต้นฉบับ) ไปยังภาษาอื่นT (สำหรับเป้าหมาย) และล่ามสำหรับSมักจะแตกต่างจากล่ามสำหรับTSTST
โปรแกรมที่คอมไพล์ถูกแปลจากรูปแบบวากยสัมพันธ์ไปเป็นรูปแบบวากยสัมพันธ์อื่นP Tเช่นนั้นเนื่องจากความหมายที่ตั้งใจไว้ของภาษาSและT , P SและP Tมีพฤติกรรมการคำนวณเหมือนกันจนถึงสองสามสิ่งที่คุณ มักจะพยายามเปลี่ยนอาจจะปรับให้เหมาะสมเช่นความซับซ้อนหรือประสิทธิภาพที่เรียบง่าย (เวลาพื้นที่พื้นผิวการใช้พลังงาน) ฉันพยายามที่จะไม่พูดถึงความเท่าเทียมในการใช้งานเพราะมันจะต้องมีคำจำกัดความที่แม่นยำPSPTSTPSPT
คอมไพเลอร์บางตัวมีการใช้งานจริงเพียงเพื่อลดขนาดของรหัสไม่ใช่เพื่อการทำงาน "ปรับปรุง" นี่เป็นกรณีของภาษาที่ใช้ในระบบ Plato (แม้ว่าพวกเขาจะไม่ได้เรียกมันว่าคอมไพล์)
คุณอาจพิจารณาว่าโค้ดของคุณถูกคอมไพล์อย่างสมบูรณ์หากหลังจากกระบวนการรวบรวมแล้วคุณไม่จำเป็นต้องใช้ล่ามสำหรับอีกต่อไป อย่างน้อยนั่นเป็นวิธีเดียวที่ฉันสามารถอ่านคำถามของคุณในฐานะที่เป็นวิศวกรรมมากกว่าคำถามเชิงทฤษฎี (เนื่องจากในทางทฤษฎีแล้วฉันสามารถสร้างล่ามขึ้นมาใหม่ได้เสมอ)S
สิ่งหนึ่งที่อาจก่อให้เกิดปัญหา AFAIK เป็นอภิวัฏจักร นั่นคือเมื่อโปรแกรมจะจัดการโครงสร้างวากยสัมพันธ์ในภาษาต้นฉบับของตัวเองสร้างชิ้นส่วนของโปรแกรมที่จะถูก intepreted ราวกับว่าพวกเขาได้เป็นส่วนหนึ่งของโปรแกรมต้นฉบับ เนื่องจากคุณสามารถสร้างชิ้นส่วนโปรแกรมโดยพลการในภาษาSอันเป็นผลมาจากการคำนวณโดยพลการจัดการกับชิ้นส่วนวากยสัมพันธ์ที่ไม่มีความหมายฉันเดาว่าคุณสามารถทำให้มันเป็นไปไม่ได้เกือบ (จากมุมมองทางวิศวกรรม) เพื่อรวบรวมโปรแกรมเป็นภาษาTดังนั้น ตอนนี้สร้างชิ้นส่วนของT ดังนั้นจำเป็นต้องใช้ล่ามSหรืออย่างน้อยก็แปลจากSถึงSSTTSSสำหรับการรวบรวมชิ้นส่วนที่ถูกสร้างขึ้นใน S (ดูเอกสารนี้)TS
แต่ฉันไม่แน่ใจว่าวิธีการนี้จะเป็นทางการได้อย่างถูกต้อง (และไม่มีเวลาตอนนี้) และเป็นไปไม่ได้เป็นคำที่ยิ่งใหญ่สำหรับปัญหาที่ไม่เป็นทางการ
หมายเหตุเพิ่มเติม
เพิ่มหลังจาก 36 ชั่วโมง คุณอาจต้องการข้ามภาคต่อที่ยาวมากนี้
ความคิดเห็นจำนวนมากสำหรับคำถามนี้แสดงสองมุมมองของปัญหา: มุมมองเชิงทฤษฎีที่มองว่าไม่มีความหมายและมุมมองด้านวิศวกรรมที่น่าเสียดายที่ไม่เป็นทางการได้ง่าย
มีหลายวิธีในการดูการตีความและการรวบรวมและฉันจะพยายามวาดภาพเล็กน้อย ฉันจะพยายามอย่างไม่เป็นทางการเท่าที่จะทำได้
แผนภาพหลุมฝังศพ
หนึ่งใน formalization ต้น (ต้นปี 1960 ที่จะปลายปี 1990) เป็น T หรือ
หลุมแผนภาพ ไดอะแกรมเหล่านี้นำเสนอในองค์ประกอบกราฟิกที่รวมกันได้คือภาษาการนำไปปฏิบัติของล่ามหรือผู้แปลภาษาต้นฉบับที่ถูกตีความหรือเรียบเรียงและภาษาเป้าหมายในกรณีของคอมไพเลอร์ เวอร์ชันที่ซับซ้อนยิ่งขึ้นสามารถเพิ่มคุณสมบัติได้ ภาพกราฟิกเหล่านี้สามารถมองเห็นได้เป็นสัจพจน์กฎการอนุมานใช้งานได้กับการสร้างตัวประมวลผลเชิงกลไกจากการพิสูจน์การมีอยู่ของพวกเขาจากสัจพจน์à la Curry-Howard (แม้ว่าฉันไม่แน่ใจว่าทำในยุคหกสิบเศษ :)
การประเมินบางส่วน
มุมมองที่น่าสนใจอีกประการหนึ่งคือกระบวนทัศน์การประเมินบางส่วน ฉันกำลังดูมุมมองที่เรียบง่ายของโปรแกรมในฐานะของการใช้งานฟังก์ชั่นที่คำนวณคำตอบที่ได้รับจากข้อมูลอินพุต แล้วล่าม
สำหรับภาษาSเป็นโปรแกรมที่ใช้โปรแกรมP S
เขียนในSและข้อมูลdสำหรับโปรแกรมที่และคำนวณผลตามความหมายของS การประเมินผลบางส่วนเป็นเทคนิคสำหรับโปรแกรมที่เชี่ยวชาญของทั้งสองมีปากเสียงเป็น1และ2เมื่อเพียงหนึ่งอาร์กิวเมนต์พูด1ผมSSพีSSdSa1a2a1เป็นที่รู้จักกัน เจตนาคือจะมีการประเมินผลได้เร็วขึ้นเมื่อคุณจนได้รับอาร์กิวเมนต์ที่สอง2 มันจะมีประโยชน์โดยเฉพาะอย่างยิ่งถ้า2เปลี่ยนแปลงบ่อยกว่า1เป็นค่าใช้จ่ายของการประเมินผลบางส่วนกับ1สามารถตัดจำหน่ายคำนวณทั้งหมดที่มีเพียง2มีการเปลี่ยนแปลงa2a2a1a1a2
นี่เป็นสถานการณ์ที่บ่อยครั้งในการออกแบบอัลกอริทึม (มักจะเป็นหัวข้อของความคิดเห็นแรกใน SE-CS) เมื่อมีการประมวลผลข้อมูลส่วนคงที่เพิ่มเติมก่อนเพื่อให้ต้นทุนของการประมวลผลล่วงหน้าสามารถตัดจำหน่ายในทุกการใช้งาน ของอัลกอริทึมที่มีส่วนต่าง ๆ ของข้อมูลอินพุตมากขึ้น
นี่เป็นสถานการณ์ของล่ามเนื่องจากอาร์กิวเมนต์แรกคือโปรแกรมที่จะดำเนินการและมักจะดำเนินการหลายครั้งด้วยข้อมูลที่แตกต่างกัน (หรือมีส่วนย่อยดำเนินการหลายครั้งด้วยข้อมูลที่แตกต่างกัน) ดังนั้นจึงเป็นความคิดตามธรรมชาติที่จะต้องมีผู้เชี่ยวชาญด้านล่ามสำหรับการประเมินผลที่รวดเร็วของโปรแกรมที่กำหนดโดยการประเมินบางส่วนในโปรแกรมนี้เป็นอาร์กิวเมนต์แรก สิ่งนี้อาจถูกมองว่าเป็นวิธีการรวบรวมโปรแกรมและมีงานวิจัยที่สำคัญเกี่ยวกับการรวบรวมโดยการประเมินบางส่วนของล่ามในข้อโต้แย้งแรก (โปรแกรม)
ทฤษฎีบท Smn
จุดที่ดีเกี่ยวกับวิธีการประเมินผลบางส่วนก็คือว่ามันจะใช้รากของมันในทางทฤษฎี (แม้ว่าทฤษฎีสามารถโกหก) สะดุดตาใน
Kleene ทฤษฎีบทของ ฉันพยายามที่นี่เพื่อให้การนำเสนอที่เข้าใจง่ายโดยหวังว่ามันจะไม่ทำให้นักทฤษฎีบริสุทธิ์
กำหนดเลขGödel ของฟังก์ชัน recursive คุณสามารถดูφเป็นฮาร์ดแวร์ของคุณเพื่อให้ได้รับจำนวนGödel P
(อ่านรหัสวัตถุ ) ของโปรแกรมการφ พีเป็นฟังก์ชั่นที่กำหนดโดยP (เช่นคำนวณโดยรหัสวัตถุกับฮาร์ดแวร์ของคุณ )φφพีφพีพี
ในรูปแบบที่ง่ายที่สุดทฤษฎีบทดังกล่าวระบุไว้ในวิกิพีเดียดังต่อไปนี้ (ขึ้นอยู่กับการเปลี่ยนแปลงเล็ก ๆ ของสัญกรณ์):
กำหนดเลขGödel ของฟังก์ชัน recursive มีความเป็นดั้งเดิมฟังก์ชันเวียนσของทั้งสองมีปากเสียงกับคุณสมบัติดังต่อไปสำหรับทุกจำนวนGödel คิวของบางส่วนคำนวณฟังก์ชั่นFมีสองข้อโต้แย้งการแสดงออกφ σ ( Q , x ) ( Y )และf ( x , y )ถูกกำหนดไว้สำหรับการรวมกันของตัวเลขธรรมชาติxและyและค่าของมันจะเท่ากันสำหรับการรวมกันใด ๆ กล่าวอีกนัยหนึ่งความเสมอภาคในมิติของฟังก์ชั่นมีไว้สำหรับทุกคนφσQฉφσ( q, x )( y)ฉ( x , y)xY :
xφσ(q, x )≃ λ Y. φQ( x , y) .
ตอนนี้การรับเป็นล่ามI S , xเป็นซอร์สโค้ดของโปรแกรมp Sและyเป็น data dสำหรับโปรแกรมนั้นเราสามารถเขียน:
QผมSxพีSYdφσ( ฉันS, pS)≃ λ d. φผมS( หน้าS, d) .
อาจจะเห็นเป็นการดำเนินการของล่ามที่ฉันS
บนฮาร์ดแวร์เช่นเป็นกล่องดำพร้อมที่จะตีความโปรแกรมที่เขียนในภาษาSφผมSผมSS
ฟังก์ชันอาจถูกมองว่าเป็นฟังก์ชันที่เชี่ยวชาญล่ามI SสำหรับโปรแกรมP Sเช่นเดียวกับการประเมินผลบางส่วน ดังนั้นจำนวนGödel σ ( ฉันS , P S )อาจจะเห็นมีรหัสวัตถุที่เป็นรุ่นที่รวบรวมของโปรแกรมP SσผมSPSσ( ฉันS, pS)พีS
ดังนั้นฟังก์ชั่น อาจถูกมองว่าเป็นฟังก์ชั่นที่รับอาร์กิวเมนต์ซอร์สโค้ดของโปรแกรม q S ที่
เขียนด้วยภาษา Sและส่งคืนเวอร์ชันรหัสวัตถุสำหรับโปรแกรมนั้นดังนั้น C Sคือสิ่งที่มักจะเรียกว่า คอมไพเลอร์CS= λ qS. σ( (ฉันS,คิวS)QSSCS
ข้อสรุปบางอย่าง
อย่างไรก็ตามอย่างที่ฉันพูดว่า: "ทฤษฎีอาจเป็นคนโกหก" หรือที่จริงแล้วดูเหมือนจะเป็นหนึ่ง ปัญหาคือว่าเรารู้อะไรของฟังก์ชันσมีฟังก์ชั่นมากมายจริง ๆ และฉันเดาว่าการพิสูจน์ทฤษฎีบทอาจใช้คำจำกัดความง่าย ๆ สำหรับมันซึ่งอาจไม่ดีขึ้นจากมุมมองทางวิศวกรรมมากกว่าโซลูชันที่เสนอโดยราฟาเอล: เพื่อรวม แหล่งที่มาของรหัสQ Sกับล่ามฉัน S สิ่งนี้สามารถทำได้เสมอเพื่อให้เราสามารถพูดได้ว่า: การรวบรวมเป็นไปได้เสมอσQSผมS
การทำให้แนวคิดที่เข้มงวดมากขึ้นเกี่ยวกับสิ่งที่คอมไพเลอร์จะต้องใช้วิธีการทางทฤษฎีที่ลึกซึ้งยิ่งขึ้น ฉันไม่ทราบว่าสิ่งที่อาจเกิดขึ้นในทิศทางนั้น งานที่ทำจริงมากในการประเมินบางส่วนนั้นเหมือนจริงมากขึ้นจากมุมมองทางวิศวกรรม และแน่นอนว่ามีเทคนิคอื่น ๆ สำหรับการเขียนคอมไพเลอร์รวมถึงการแยกโปรแกรมออกมาจากข้อพิสูจน์ของสเปคของพวกเขาซึ่งได้รับการพัฒนาในบริบทของทฤษฎีแบบพิมพ์อิง Curry-Howard isomorphism (แต่ฉันอยู่นอกขอบเขตความสามารถ) .
จุดประสงค์ของฉันที่นี่คือการแสดงให้เห็นว่าคำพูดของราฟาเอลไม่ได้ "บ้า" แต่เป็นการเตือนความจำอย่างมีสติว่าสิ่งต่าง ๆ ไม่ชัดเจนและไม่ง่ายแม้แต่น้อย บอกว่าสิ่งที่เป็นไปไม่ได้เป็นคำสั่งที่แข็งแกร่งที่จะต้องมีคำจำกัดความที่แม่นยำและหลักฐานถ้าเพียง แต่จะมีความเข้าใจที่ถูกต้องของวิธีการและเหตุผลที่มันเป็นไปไม่ได้ แต่การสร้างระเบียบแบบแผนที่เหมาะสมในการแสดงหลักฐานดังกล่าวอาจเป็นเรื่องยาก
สิ่งนี้กล่าวว่าแม้ว่าคุณสมบัติเฉพาะจะไม่สามารถรวบรวมได้ แต่ในแง่ที่เข้าใจโดยวิศวกรเทคนิคการรวบรวมมาตรฐานสามารถนำไปใช้กับบางส่วนของโปรแกรมที่ไม่ได้ใช้คุณสมบัติดังกล่าวได้ตามที่ Gilles ได้รับคำตอบ
ในการติดตามข้อสังเกตสำคัญของ Gilles นั้นขึ้นอยู่กับภาษาบางสิ่งอาจทำได้ในเวลารวบรวมขณะที่สิ่งอื่น ๆ ต้องทำในเวลาทำงานดังนั้นต้องใช้รหัสเฉพาะเราจะเห็นว่าแนวคิดของการรวบรวมนั้นจริง ๆ แล้ว ไม่ชัดเจนและอาจไม่แน่นอนในทางที่น่าพอใจ การรวบรวมเป็นเพียงกระบวนการเพิ่มประสิทธิภาพอย่างที่ฉันพยายามแสดงในส่วนการประเมินผลบางส่วนเมื่อฉันเปรียบเทียบกับการประมวลผลข้อมูลแบบคงที่ในบางอัลกอริทึม
ในฐานะที่เป็นกระบวนการเพิ่มประสิทธิภาพที่ซับซ้อนแนวคิดของการคอมไพล์จริงเป็นของต่อเนื่อง ข้อมูลบางอย่างอาจพร้อมใช้งานแบบสแตติกและอนุญาตให้มีการปรับให้เหมาะสมที่สุดทั้งนี้ขึ้นอยู่กับลักษณะของภาษาหรือของโปรแกรม สิ่งอื่น ๆ จะต้องได้รับการเลื่อนออกไปเป็นเวลาทำงาน เมื่อสิ่งต่าง ๆ ไม่ดีจริง ๆ ทุกอย่างต้องทำในเวลาทำงานอย่างน้อยสำหรับบางส่วนของโปรแกรมและการรวมซอร์สโค้ดกับล่ามเป็นสิ่งที่คุณทำได้ ดังนั้นการรวมกลุ่มนี้เป็นเพียงจุดต่ำสุดของการรวบรวมต่อเนื่อง งานวิจัยเกี่ยวกับคอมไพเลอร์ส่วนใหญ่เกี่ยวกับการหาวิธีการทำสิ่งที่เคยทำแบบไดนามิก การรวบรวมขยะในเวลารวบรวมนั้นเป็นตัวอย่างที่ดี
โปรดทราบว่าการระบุว่ากระบวนการรวบรวมควรสร้างรหัสเครื่องนั้นไม่ได้ช่วยอะไร นั่นคือสิ่งที่ bundling สามารถทำได้อย่างที่ล่ามคือรหัสเครื่อง (เอาล่ะสิ่งต่าง ๆ จะซับซ้อนขึ้นเล็กน้อยด้วยการคอมไพล์ข้าม)