คอมไพเลอร์ถูกใช้นอกการพัฒนาหรือไม่?


14

เท่าที่ความเข้าใจของฉันไปแล้วคอมไพเลอร์มีความหมายสำหรับนักพัฒนาในการรวบรวมรหัสของพวกเขาลงในไฟล์ปฏิบัติการ (รหัสเครื่อง) คอมไพเลอร์จะไม่ขยายไปยังเครื่องของลูกค้าหรือระบบผู้ใช้ปลายทาง

นักพัฒนาซอฟต์แวร์เพียงแค่ใช้คอมไพเลอร์เพื่อแปลงรหัสของพวกเขาเป็นรหัสเครื่องซึ่งจะถูกส่งไปยังเครื่องอื่นเพื่อใช้เป็นแอพพลิเคชั่น

คอมไพเลอร์มีฟังก์ชั่นนอกกระบวนการนี้หรือไม่? ถ้าเป็นเช่นนั้นพวกเขาจะใช้เมื่อไหร่?


21
ใช่คอมไพล์เลอร์คอมไพล์แล้ว
Tom Squires

@ ทอม: ฉันอ่านที่ไหนสักแห่งที่คอมไพเลอร์ C ติดตั้งในเครื่องต่าง ๆ รวมถึงเกมคอนโซล นี่หมายความว่าเราเขียนโค้ดใน C จากนั้นส่งไปยังอุปกรณ์เหล่านี้ที่รวบรวมโดยคอมไพเลอร์แล้วดำเนินการโดยล่ามหรือไม่
Pankaj Upadhyay

3
@Pankaj Upadhyay: เป็นไปได้ที่โค้ดจะถูกส่งไปยังเครื่องแล้วเรียบเรียงโดยกระบวนการภายใน ไม่น่าเป็นไปได้ที่ผู้ใช้อุปกรณ์จะเคยเห็นสิ่งนี้เกิดขึ้นหรือรู้เกี่ยวกับมัน อาจทำได้ถ้าต้องรวบรวมส่วนของรหัสสำหรับฮาร์ดแวร์เฉพาะและโซลูชันที่ทดสอบฮาร์ดแวร์ที่รันไทม์ช้าเกินไปทำให้ต้องแจกจ่ายรหัสและคอมไพล์ระหว่างการติดตั้ง อาจจะ ...
FrustratedWithFormsDesigner

3
@Pankaj ไม่มีคอนโซลเกมมาพร้อมคอมไพเลอร์ แต่บางตัวสามารถติดตั้งได้ Sony ได้จัดเตรียมรุ่นของ Linux และ GCC ที่สามารถติดตั้งบน PS2 ได้ คนอื่นถอดรหัส / แฮ็กเพื่อรับ OS และซอฟต์แวร์อื่น ๆ เข้าสู่คอนโซล
IronMensan

4
@Stargazer: คุณหมายถึง: "ไม่คอมไพเลอร์แปลจากภาษาต้นฉบับเป็นภาษาเป้าหมาย" หรือไม่ การเว้นเครื่องหมายจุลภาคทำให้ประโยคของคุณหมายถึงสิ่งที่ตรงกันข้ามกับความหมายที่คุณตั้งใจไว้
Daniel Pryden

คำตอบ:


19

ใช่และไม่. ใช่สถานการณ์คลาสสิคเป็นนักพัฒนาที่ใช้คอมไพเลอร์เพื่อสร้างรหัสเครื่องจากซอร์สโค้ดจากนั้นรหัสเครื่องจะถูกแจกจ่ายให้กับผู้ใช้

แม้ว่าจะมีข้อยกเว้นเล็กน้อยในเรื่องนี้ ครั้งแรกโครงการโอเพนซอร์ซจำนวนมากมีการแจกจ่ายเป็นหลัก (หรือแม้แต่เฉพาะ) ในรูปแบบซอร์สโค้ดและคาดว่าผู้ใช้จะติดตั้งได้โดยพิมพ์คำสั่งสองสามคำสั่งเช่นmakeนั้นmake intall. สิ่งนี้จะเรียกคอมไพเลอร์ตัวเชื่อมโยง ฯลฯ เพื่อสร้างรหัสเครื่องจากซอร์สโค้ดสำหรับคอมพิวเตอร์ของผู้ใช้ ในกรณีเหล่านี้กระบวนการของการสร้างและติดตั้งนั้น (อย่างน้อยตั้งใจให้เป็น) โดยอัตโนมัติจนถึงจุดที่ผู้ใช้ไม่ค่อยต้องการความรู้มากไปกว่าข้อเท็จจริงที่ว่าถ้าพวกเขาไม่เคยติดตั้งแพ็คเกจซอร์สโค้ดเท่านั้น โดยทั่วไปตัวจัดการแพคเกจของพวกเขาจะแสดงรายการแพคเกจ "การพัฒนา" บางอย่างเป็นข้อกำหนดเบื้องต้นสำหรับการติดตั้งแอปพลิเคชันที่พวกเขาสนใจจริง ๆ (แม้ว่าบางคนยังคงเห็นว่านี่ไม่เป็นมิตรกับผู้ใช้ปลายทาง)

อีกข้อยกเว้น (นั่นคือการพาดพิงถึง แต่ไม่ได้อธิบายอย่างดีในคำตอบอื่น ๆ ที่ฉันเคยเห็น) คือคอมไพเลอร์ทันเวลา (JIT) ตัวอย่างที่ชัดเจนของคอมไพเลอร์ JIT คือ Microsoft Common Language Runtime (CLR) และ Java Virtual Machine (JVM) ในกรณีเหล่านี้ปกติจะมีคอมไพเลอร์สองตัวที่เกี่ยวข้องกับการแปลซอร์สโค้ดเป็นรหัสเครื่อง ส่วนหนึ่งถูกใช้โดยผู้พัฒนา อย่างไรก็ตามแทนที่จะสร้างรหัสเครื่องโดยตรงจะสร้างรหัสไบต์ที่ไม่ขึ้นกับเครื่อง จากนั้น CLR / JVM จะมีคอมไพเลอร์ตัวที่สองแยกจากตัวแรกอย่างสิ้นเชิงซึ่งจะแปลงรหัสไบต์เหล่านั้นเป็นรหัสเครื่องสำหรับคอมพิวเตอร์เป้าหมาย

ฉันควรเพิ่มว่าคอมไพเลอร์ที่สองไม่จำเป็นอย่างเคร่งครัด JVM เวอร์ชันก่อนหน้า (ตัวอย่างหนึ่ง) จะตีความรหัสไบต์แทนการคอมไพล์รหัสเหล่านั้น สิ่งนี้มักมีโทษประสิทธิภาพที่ร้ายแรงพอสมควรดังนั้น JVMs ล่าสุดที่มีเหตุผลมากที่สุดสำหรับการใช้งานจริงรวมถึง JIT compiler


24

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


4
ถ้าเราต้องจำกัดความหมายของ "คอมไพเลอร์" ให้หมายถึงโปรแกรมที่สร้างไฟล์ที่ปฏิบัติการได้นี่จะเป็นคำตอบที่ดี อย่างไรก็ตามนั่นเป็นเพียงส่วนหนึ่งของคำจำกัดความที่แท้จริงของ "คอมไพเลอร์"
riwalk

16
@Jan Soltis: ฉันไม่เห็นด้วย ฉันรวบรวมเคอร์เนล Linux จากแหล่งที่มา: หมายความว่าฉันเป็นผู้พัฒนาเคอร์เนล Linux หรือไม่ ฉันไม่เคยแก้ไขโค้ดเคอร์เนล Linux หรือส่งแพตช์ - ฉันจะบอกว่านั่นหมายความว่าฉันไม่ใช่นักพัฒนาเคอร์เนล นอกจากนี้เป็นเวลาหลายปีที่ฉันใช้ Gentoo เป็นระบบปฏิบัติการหลักของฉันฉันรวบรวมซอฟต์แวร์ทุกชิ้นในเครื่อง อย่างไรก็ตามส่วนใหญ่นั้นถูกรวบรวมโดยอัตโนมัติด้วยระบบการจัดการแพคเกจพอร์เทจ ฉันจะยืนยันว่าในกรณีที่ผมทำหน้าที่เป็นผู้ใช้แต่ไม่ได้เป็นนักพัฒนา
Daniel Pryden

8
@Jan Soltis: ฉันรู้ว่านั่นเป็นความคิดเห็นของคุณ ฉันไม่เห็นด้วยอย่างเคารพ ฉันให้การโต้เถียงเพื่อสนับสนุนตำแหน่งของฉันในขณะที่คุณดำเนินการยืนยันอย่างต่อเนื่อง คุณดูเหมือนจะคิดว่ามีเส้นแบ่งที่ชัดเจนระหว่าง "นักพัฒนา" และ "ผู้ใช้ปลายทาง" ซึ่งฉันไม่เชื่อว่ามีอยู่
Daniel Pryden

6
การดาวน์โหลดแหล่งที่มาจากนั้นเรียกใช้ "ทำการติดตั้ง" ไม่ได้เป็นนักพัฒนา เป็นการดำเนินการของผู้ใช้อย่างแน่นอน
Kristopher Johnson

3
@Jan: ฉันสามารถที่จะยอมรับว่าการใช้ distro เช่น Gentoo ที่แพคเกจ compiles ทำให้คุณอย่างน้อยอำนาจของผู้ใช้ แต่ที่ยังคงเห็นได้ชัดว่าประเภทของผู้ใช้ การคอมไพล์รหัสของคนอื่นโดยไม่ต้องดัดแปลงเพิ่มหรือแม้แต่การอ่านมันไม่ได้ทำให้คุณเป็นนักพัฒนาซอฟต์แวร์
Carson63000

10

ใช่

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

ตัวอย่างเช่น Python สร้างรหัสไบต์เมื่อมันนำเข้าโมดูลและเหมาะสมภายในคำจำกัดความของคอมไพเลอร์ (เพราะมันแปลงจากภาษาต้นฉบับ Python ไปเป็นภาษาเป้าหมาย, Python รหัสไบต์)

อีกตัวอย่างหนึ่งคือเอ็นจิ้น V8 JavaScript มันจะแปลงจาวาสคริปต์เป็นรหัสเครื่อง x86และเหมาะสมกับนิยามของคอมไพเลอร์เช่นกัน ไม่เพียง แต่ V8 จะเหมาะสมกับคำจำกัดความของคอมไพเลอร์เท่านั้น แต่ยังรวมอยู่ใน Chrome และใช้กันอย่างแพร่หลายในเครื่องไคลเอ็นต์


4

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

แก้ไข: มีข้อยกเว้นอื่น ๆ แต่พวกเขาถูกกล่าวถึงแล้วในคำตอบอื่น ๆ


+1 แค่พูดว่าJIT
gnat

1
เอ็นจิ้น V8 ใน Chrome ไม่ใช่ข้อผิดพลาดที่แปลก
riwalk

อัปเดตเพื่อชี้แจง ฉันรู้ว่ามีข้อยกเว้นอื่น ๆ
Morgan Herlocker

3

คอมไพเลอร์มีความหมายเฉพาะสำหรับนักพัฒนาสำหรับการรวบรวมรหัสภาษาการเขียนโปรแกรมของพวกเขาไปยังไฟล์ที่เรียกใช้งานได้ (แมชชีนโค้ด)

ฉันจะพูดว่า "คอมไพเลอร์มีความหมายหลักสำหรับนักพัฒนา ... " แต่ฉันได้เห็นตัวอย่างที่โปรแกรมสร้างโค้ดภาษาโปรแกรมใหม่แบบ on-the-fly และดังนั้นจึงจำเป็นต้องมีคอมไพเลอร์ที่จะติดตั้งบนเครื่องผู้ใช้ปลายทาง นั่นไม่ได้หมายความว่าผู้ใช้ปลายทางจะต้องทำงานกับคอมไพเลอร์ด้วยตัวเอง

สาเหตุที่เป็นไปได้สำหรับการออกแบบโปรแกรมนี้:

  • ประสิทธิภาพการทำงาน: ลองนึกถึงแอปพลิเคชันที่ควบคุมกฎซึ่งจัดเก็บกฎไว้ในแหล่งข้อมูลผู้ใช้ปลายทางบางประเภทและคุณมีข้อมูลจำนวนมากที่ต้องประมวลผลโดยกฎเหล่านั้น แทนที่จะตีความกฎซ้ำแล้วซ้ำอีกโปรแกรมจะสร้างรหัสการประมวลผลก่อนรวบรวมและเรียกใช้กับข้อมูลที่จะประมวลผล

  • ให้นึกถึงโปรแกรมที่ผู้ใช้สามารถเพิ่มสูตรคณิตศาสตร์ได้และผู้พัฒนาโปรแกรมไม่ต้องการใช้โปรแกรมแยกวิเคราะห์ / ล่ามของเขาสำหรับสิ่งนี้ แต่โปรแกรมจะใช้สูตรนี้ทำให้มีการเพิ่มเติมบางส่วนเพื่อแปลงมันเป็นชิ้นส่วนของรหัสโปรแกรมที่ถูกต้องปล่อยให้คอมไพเลอร์รวบรวมและเรียกใช้หลังจากนั้น


อืม .... ไม่ได้หมายความว่าผู้ใช้ปลายทางจะต้องมีการทำงานร่วมกับคอมไพเลอร์ด้วยตัวเอง นั่นเป็นคำอธิบายที่ชัดเจนมาก
Pankaj Upadhyay

2

ถูกต้อง - คอมไพล์เลอร์คอมไพล์ซอร์สโค้ดในรูปแบบที่ปฏิบัติการได้ซึ่งจะถูกลิงค์ไปยังไฟล์ไบนารี่ที่สามารถเรียกใช้งานได้โดย linker ซอร์สโค้ดยังสามารถเรียกใช้งานได้โดยตรงโดยล่ามเช่นหนึ่งในเชลล์บรรทัดคำสั่งจำนวนมาก (C-shell, bash, zsh, ฯลฯ ), awk, sed และอื่น ๆ

อาจเป็นการยากที่จะวาดเส้นที่ชัดเจนระหว่าง "นักพัฒนา" และ "ผู้ใช้ปลายทาง" เว้นแต่คุณจะ จำกัด การอภิปรายของคุณไว้เฉพาะผลิตภัณฑ์ นักพัฒนาคือ "ผู้ใช้ปลายทาง" ของเครื่องมือที่พวกเขาใช้และ "ผู้ใช้ปลายทาง" อาจมีเครื่องมือในการพัฒนาเช่นคอมไพเลอร์และล่ามที่ติดตั้งในเครื่องของพวกเขา


2
ตกลงฉันจะ -1 อันนี้เพราะมีความเข้าใจผิดมากมายเกี่ยวกับคอมไพเลอร์ คอมไพเลอร์แปลรหัสจากภาษาต้นฉบับเป็นภาษาเป้าหมาย สมมติว่าพวกเขาสร้างรหัสเครื่องจักรคล้ายกับที่บอกว่ายานพาหนะมี 4 ล้อ (ใช่ยานพาหนะส่วนใหญ่มี 4 ล้อ แต่รถจักรยานยนต์ก็เป็นยานพาหนะด้วยในทำนองเดียวกันคอมไพเลอร์ส่วนใหญ่จะสร้างรหัสเครื่อง แต่ตัวแปลง VB คือ คอมไพเลอร์ด้วย)
riwalk

1
@ Stargazer712 ฉันขอยืนยันว่าไม่มีความเข้าใจผิด - ฉันรู้ดีว่าคอมไพเลอร์ทำอย่างไรขอบคุณ แต่ถ้าคนที่ไม่ทราบถามฉันว่ารถคือผมอาจจะพูดได้ว่าเป็นรถที่มีสี่ล้อแม้จะมีความจริงที่ว่าบางคนไม่ได้ คำจำกัดความที่หยาบคายมักสร้างความสับสนมากกว่าที่จะอธิบายต่อบุคคลที่พยายามเข้ามามีแนวคิด "คอมไพเลอร์" สามารถเป็นคำบรรยายลักษณะงานได้ แต่การระบุว่าไม่ช่วยอะไร
คาเลบ

1

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


1

บางโปรแกรมเป็นเมตาโปรแกรม : ในขณะที่ใช้งานพวกเขาอาจสร้างโปรแกรมอื่น ๆ (หรือซอร์สโค้ด) และคอมไพล์มันจากนั้นก็รันมันอย่างใด อ่านยังเกี่ยวกับการเขียนโปรแกรมแบบหลายขั้นตอน

ดังนั้นการใช้โปรแกรมประเภทนี้จึงจำเป็นต้องมีคอมไพเลอร์แม้ว่าผู้ใช้จะไม่ทราบวิธีการตั้งโปรแกรมเอง (เพราะคอมพิวเตอร์จะสร้างโค้ดบางอย่างที่จำเป็นต้องรวบรวม)

ตัวอย่างเช่นดูMELT (ซึ่งสร้างรหัส C ++ เพื่อขยายGCC ) หรือระบบปัญญาประดิษฐ์ของCAIAของ J.Pitrat (ซึ่งสร้างรหัส C - โดยเฉพาะอย่างยิ่งรหัสของตัวเอง - เพื่อแก้ปัญหา combinatorial)

นอกจากนี้บางภาษาและการใช้งานบางอย่างเกือบจะต้องมีคอมไพเลอร์ที่จะนำเสนอทุกที่ (ในทุกโปรแกรมรหัสในภาษานั้นและการใช้งาน) ก่อนอื่นเว็บเบราว์เซอร์หลายตัวมีเครื่องมือ Javascript JIT (เช่นV8 ) นอกจากนี้การใช้งานLisp ทั่วไปส่วนใหญ่-eg SBCL - มีคอมไพเลอร์ (แม้มีประโยชน์สำหรับแอปพลิเคชันที่กำลังทำงานซึ่งอาจสร้างและประเมินนิพจน์) อ่านยังเกี่ยวกับภาษา homoiconicและโปรแกรม Qine

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