คำถามติดแท็ก compilers

คำถามเกี่ยวกับโปรแกรมที่อ่านโค้ดในภาษาหนึ่ง (ภาษาต้นฉบับ) และแปลเป็นโปรแกรมที่เทียบเท่าในภาษาอื่น (ภาษาเป้าหมาย)

10
ภาษาที่คอมไพเลอร์เขียนใน C จะเร็วกว่า C ได้อย่างไร?
ลองดูที่หน้าเว็บของ Juliaคุณสามารถดูเกณฑ์มาตรฐานของหลายภาษาในหลาย ๆ อัลกอริทึม (การกำหนดเวลาที่แสดงด้านล่าง) ภาษาที่คอมไพเลอร์เขียนด้วยภาษา C ได้ดีกว่าโค้ด C อย่างไร รูป: เวลามาตรฐานเทียบกับ C (เล็กกว่าดีกว่า, ประสิทธิภาพ C = 1.0)

5
เหตุใดภาษาการเขียนโปรแกรมบางภาษาจึง“ เร็วกว่า” หรือ“ ช้ากว่า” กว่าภาษาอื่น
ฉันสังเกตเห็นว่าบางแอปพลิเคชันหรืออัลกอริทึมที่สร้างขึ้นด้วยภาษาการเขียนโปรแกรมกล่าวว่า C ++ / Rust ทำงานได้เร็วขึ้นหรือเร็วกว่าแอปพลิเคชันที่สร้างขึ้นบน Java / Node.js ที่ทำงานบนเครื่องเดียวกัน ฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้: ทำไมสิ่งนี้ถึงเกิดขึ้น อะไรคือสิ่งที่ควบคุม "ความเร็ว" ของภาษาการเขียนโปรแกรม? สิ่งนี้เกี่ยวข้องกับการจัดการหน่วยความจำหรือไม่? ฉันจะซาบซึ้งจริงๆถ้ามีคนทำลายมันลงสำหรับฉัน

9
คุณสมบัติของภาษาการเขียนโปรแกรมที่ทำให้การรวบรวมเป็นไปไม่ได้?
คำถาม: "คุณสมบัติบางอย่างของภาษาการเขียนโปรแกรมอาจต้องการวิธีเดียวที่จะทำให้โค้ดที่ถูกเขียนนั้นถูกเรียกใช้งานโดยการตีความกล่าวอีกนัยหนึ่งไม่สามารถคอมไพล์ไปยังรหัสเครื่องดั้งเดิมของ CPU แบบดั้งเดิมได้คุณสมบัติเหล่านี้คืออะไร" ผู้เรียบเรียง: หลักการและการปฏิบัติโดย Parag H. Dave และ Himanshu B. Dave หนังสือเล่มนี้ไม่มีเงื่อนงำเกี่ยวกับคำตอบ ฉันพยายามค้นหาคำตอบเกี่ยวกับแนวคิดการเขียนโปรแกรมภาษา (SEBESTA) แต่ก็ไม่มีประโยชน์ การค้นหาเว็บก็มีประโยชน์เล็กน้อยเช่นกัน คุณมีเงื่อนงำอะไรบ้าง

10
ภาษาไดนามิกเช่น Ruby / Python สามารถเข้าถึง C / C ++ เหมือนประสิทธิภาพได้หรือไม่?
ฉันสงสัยว่าเป็นไปได้ไหมที่จะสร้างคอมไพเลอร์สำหรับภาษาไดนามิกเช่น Ruby เพื่อให้มีประสิทธิภาพที่คล้ายกันและเทียบเท่ากับ C / C ++? จากสิ่งที่ฉันเข้าใจเกี่ยวกับคอมไพเลอร์ใช้ Ruby เช่นการคอมไพล์โค้ด Ruby นั้นไม่สามารถมีประสิทธิภาพได้เพราะวิธีที่ Ruby จัดการกับการสะท้อนคุณสมบัติต่าง ๆ เช่นการแปลงชนิดอัตโนมัติจากจำนวนเต็มเป็นจำนวนเต็มใหญ่และการขาดการพิมพ์แบบคงที่ สำหรับทับทิมยากมาก เป็นไปได้ไหมที่จะสร้างคอมไพเลอร์ที่สามารถรวบรวม Ruby หรือภาษาไดนามิกอื่น ๆ ไปยังไบนารีที่ทำงานใกล้ชิดกับ C / C ++ มากขึ้น? มีเหตุผลพื้นฐานที่ทำให้คอมไพเลอร์ JIT เช่น PyPy / Rubinius ในที่สุดจะหรือไม่จะไม่ตรงกับ C / C ++ ในการทำงาน? หมายเหตุ: ฉันเข้าใจว่า "ประสิทธิภาพ" อาจคลุมเครือดังนั้นเพื่อล้างสิ่งนั้นฉันหมายความว่าถ้าคุณสามารถทำ X ใน C / C ++ ด้วยประสิทธิภาพ …

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

4
ความซับซ้อนของเวลาของคอมไพเลอร์
ฉันสนใจเวลาที่ซับซ้อนของคอมไพเลอร์ เห็นได้ชัดว่านี่เป็นคำถามที่ซับซ้อนมากเนื่องจากมีคอมไพเลอร์ตัวเลือกคอมไพเลอร์และตัวแปรที่ต้องพิจารณาจำนวนมาก โดยเฉพาะฉันสนใจ LLVM แต่จะสนใจในความคิดใด ๆ ที่ผู้คนมีหรือสถานที่เพื่อเริ่มการวิจัย ดูเหมือนว่า google ค่อนข้างจะนำความสว่างมาให้ ฉันเดาว่าจะมีขั้นตอนการเพิ่มประสิทธิภาพบางอย่างที่อธิบายแทนได้ แต่มีผลกระทบเพียงเล็กน้อยต่อเวลาจริง เช่นเลขชี้กำลังเป็นเลขชี้กำลังเป็นอาร์กิวเมนต์ของฟังก์ชัน จากด้านบนของหัวฉันจะบอกว่าการสร้างต้นไม้ AST จะเป็นเส้นตรง รุ่น IR จะต้องก้าวผ่านต้นไม้ในขณะที่มองค่าในตารางที่เคยเติบโตดังนั้นหรือlog) การสร้างรหัสและการเชื่อมโยงจะเป็นการดำเนินการที่คล้ายกัน ดังนั้นฉันเดาว่าจะเป็นถ้าเราลบเลขยกกำลังของตัวแปรที่ไม่เติบโตตามจริงO ( n log n ) O ( n 2 )O(n2)O(n2)O(n^2)O(nlogn)O(nlog⁡n)O(n\log n)O(n2)O(n2)O(n^2) ฉันอาจผิดอย่างสมบูรณ์แม้ว่า ไม่มีใครมีความคิดเกี่ยวกับมัน?
54 compilers 

8
อะไรเป็นตัวกำหนด“ ความเร็ว” ของภาษาการเขียนโปรแกรม
สมมติว่าโปรแกรมเขียนในสองภาษาที่แตกต่างกันปล่อยให้พวกเขาเป็นภาษา X และภาษา Y หากคอมไพเลอร์ของพวกเขาสร้างรหัสไบต์เดียวกันทำไมฉันควรใช้ภาษา X แทนภาษา Y? อะไรคือสิ่งที่กำหนดว่าภาษาใดภาษาหนึ่งเร็วกว่าภาษาอื่น? ฉันถามสิ่งนี้เพราะบ่อยครั้งที่คุณเห็นผู้คนพูดว่า: "C เป็นภาษาที่เร็วที่สุด ATS เป็นภาษาที่รวดเร็วเหมือน C" ฉันพยายามเข้าใจความหมายของคำว่า "เร็ว" สำหรับการเขียนโปรแกรมภาษา

5
คอมพิวเตอร์จำได้อย่างไรว่าพวกเขาเก็บของไว้ที่ไหน
เมื่อคอมพิวเตอร์จัดเก็บตัวแปรเมื่อโปรแกรมต้องการรับค่าของตัวแปรคอมพิวเตอร์จะทราบได้อย่างไรว่าจะค้นหาหน่วยความจำสำหรับค่าของตัวแปรนั้นได้อย่างไร

5
พิสูจน์ได้ว่าคอมไพเลอร์ไม่สามารถตรวจพบโค้ดที่ตายแล้ว
ฉันวางแผนที่จะสอนหลักสูตรฤดูหนาวในหัวข้อที่หลากหลายซึ่งหนึ่งในนั้นจะเป็นคอมไพเลอร์ ตอนนี้ฉันเจอปัญหานี้ขณะที่คิดถึงงานมอบหมายที่จะมอบให้ตลอดทั้งไตรมาส แต่มันทำให้ฉันนิ่งงันดังนั้นฉันจึงอาจใช้มันเป็นตัวอย่างแทน public class DeadCode { public static void main(String[] args) { return; System.out.println("This line won't print."); } } returnในโปรแกรมข้างต้นจะเห็นได้ชัดว่าคำสั่งพิมพ์จะไม่ดำเนินการเพราะ คอมไพเลอร์บางครั้งให้คำเตือนหรือข้อผิดพลาดเกี่ยวกับรหัสที่ตายแล้ว ตัวอย่างเช่นรหัสข้างต้นจะไม่รวบรวมใน Java อย่างไรก็ตามคอมไพเลอร์ javac จะไม่ตรวจจับอินสแตนซ์ทั้งหมดของรหัสที่ตายแล้วในทุกโปรแกรม ฉันจะพิสูจน์ได้อย่างไรว่าคอมไพเลอร์ไม่สามารถทำได้?

6
ทำไมไวยากรณ์ที่ไม่ชัดเจนนั้นไม่ดี
ฉันเข้าใจว่าหากมีต้นไม้ 2 ต้นขึ้นไปทางซ้ายหรือทางขวาไวยากรณ์ก็ไม่ชัดเจน แต่ฉันไม่สามารถเข้าใจได้ว่าทำไมมันถึงแย่มากที่ทุกคนต้องการกำจัดมัน

2
คอมไพเลอร์แบทช์คืออะไร?
ฉันมีใบเสนอราคาต่อไปนี้จากหลักสูตรของคอมไพเลอร์ (ในบริบทของการระบายสีกราฟ): เนื่องจากช้าการทำกราฟสีจึงมีแนวโน้มที่จะใช้ในคอมไพเลอร์แบบแบทช์ในขณะที่การสแกนเชิงเส้นมีแนวโน้มที่จะใช้ในคอมไพเลอร์ JIT ฉันไม่พบคำจำกัดความที่ชัดเจนทางออนไลน์ ดังนั้นสิ่งที่ทำให้คอมไพเลอร์เป็นชุดคอมไพเลอร์?
28 compilers 

2
เหตุใด C ประเภทโมฆะจึงไม่คล้ายกับประเภทที่ว่าง / ด้านล่าง
Wikipedia ตลอดจนแหล่งข้อมูลอื่น ๆ ที่ฉันได้พบรายการvoidประเภทC เป็นหน่วยประเภทซึ่งตรงข้ามกับประเภทที่ว่างเปล่า ฉันพบว่ามันสับสนเพราะฉันคิดว่าvoidเหมาะกับนิยามของประเภทที่ว่าง / ล่าง ไม่มีค่านิยมใด ๆ อยู่voidเท่าที่ฉันจะบอกได้ ฟังก์ชั่นที่มีประเภทคืนค่าเป็นโมฆะระบุว่าฟังก์ชั่นจะไม่ส่งคืนสิ่งใดดังนั้นจึงสามารถทำงานได้เพียงผลข้างเคียงเท่านั้น ตัวชี้ชนิดvoid*เป็นชนิดย่อยของชนิดตัวชี้อื่นทั้งหมด นอกจากนี้การแปลงไปยังและจากvoid*ใน C นั้นเป็นนัย ผมไม่แน่ใจว่าถ้าจุดสุดท้ายมีบุญใด ๆ ที่เป็นข้อโต้แย้งสำหรับvoidการเป็นประเภทที่ว่างเปล่าเป็นมากหรือน้อยเป็นกรณีพิเศษที่มีความสัมพันธ์ไม่มากที่จะvoid*void ในทางกลับกันvoidตัวมันเองไม่ใช่ประเภทย่อยของประเภทอื่นทั้งหมดซึ่งเท่าที่ฉันสามารถบอกได้ว่าเป็นข้อกำหนดสำหรับประเภทที่จะเป็นประเภทด้านล่าง
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

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

2
คอมไพเลอร์ JIT แตกต่างจากคอมไพเลอร์ธรรมดาอย่างไร
มีหลาย hype เกี่ยวกับคอมไพเลอร์ JIT สำหรับภาษาเช่น Java, Ruby และ Python คอมไพเลอร์ JIT แตกต่างจากคอมไพเลอร์ C / C ++ อย่างไรและทำไมคอมไพเลอร์ที่เขียนขึ้นสำหรับ Java, Ruby หรือ Python เรียกว่าคอมไพเลอร์ JIT ในขณะที่คอมไพเลอร์ C / C ++ จะเรียกว่าคอมไพเลอร์?
22 compilers 

1
มีการปรับแต่งคอมไพเลอร์อย่างเต็มที่เพื่อยุติโปรแกรมหรือไม่?
ในหนังสือของแอนดรูวแตะของโมเดิร์นคอมไพเลอร์ดำเนินการใน MLเขากล่าวว่าภายใต้บทที่ 17 ว่าComputability ทฤษฎีแสดงให้เห็นว่ามันจะเป็นไปได้ที่จะคิดค้นแปลงเพิ่มประสิทธิภาพใหม่และวิธีการที่จะพิสูจน์ว่าคอมไพเลอร์เพิ่มประสิทธิภาพอย่างเต็มที่จะแก้ปัญหาที่เกิดขึ้นเป็นง่อย: โปรแกรมQที่ไม่สร้างเอาต์พุตและไม่สามารถหยุดได้โดยง่ายด้วยการแทนค่าที่เหมาะสมที่สุดOpt (Q)คือ "L: goto L" คอมไพเลอร์ที่ปรับให้เหมาะสมที่สุดสามารถแก้ปัญหาการหยุดชะงักได้ ดังนั้นคำถามของฉันคือ: คอมไพเลอร์ปรับแต่งอย่างเต็มที่มีอยู่สำหรับการยกเลิกโปรแกรมหรือไม่? ความคิดเดียวของฉันมีดังต่อไปนี้: แม้ว่าโปรแกรมจะรับประกันว่าจะยุติมันก็ยังคงมีความซับซ้อนโดยพลการและสำหรับคอมไพเลอร์การเพิ่มประสิทธิภาพที่เป็นรูปธรรม, C, หนึ่งอาจสร้างโปรแกรมที่ใช้ C เป็นอินพุท เคสชนิดมุม นอกจากนี้อะไรคือความหมายของการ จำกัด ตัวเองให้ยกเลิกโปรแกรม?

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