การสร้างเทียบกับการคอมไพล์ (Java)


141

คิดว่าคำตอบนี้ค่อนข้างชัดเจน แต่นี่เป็นไป:

เมื่อฉันทำงานในโครงการขนาดเล็กสำหรับโรงเรียน (ใน java) ฉันรวบรวมมัน

บนสุ่มของฉันเรากำลังใช้มดในการสร้างโครงการของเรา

ฉันคิดว่าการคอมไพล์เป็นส่วนย่อยของการสร้าง ถูกต้องหรือไม่ อะไรคือความแตกต่างระหว่างการสร้างและการรวบรวม?

ที่เกี่ยวข้อง:
ความแตกต่างระหว่างการรวบรวมและการสร้างคืออะไร?

คำตอบ:


232

"สร้าง" คือกระบวนการที่ครอบคลุมขั้นตอนทั้งหมดที่จำเป็นในการสร้างซอฟต์แวร์ของคุณที่ "ส่งมอบได้" ในโลก Java โดยทั่วไปจะรวมถึง:

  1. การสร้างแหล่งที่มา (บางครั้ง)
  2. การรวบรวมแหล่งที่มา
  3. การรวบรวมแหล่งที่มาของการทดสอบ
  4. การดำเนินการทดสอบ (การทดสอบหน่วยการทดสอบการรวม ฯลฯ )
  5. บรรจุภัณฑ์ (ลงในโถ, สงคราม, ขวดโหล, หู)
  6. การตรวจสอบประสิทธิภาพการทำงาน (เครื่องวิเคราะห์แบบคงที่เช่น Checkstyle, Findbugs, PMD, การครอบคลุมการทดสอบ ฯลฯ )
  7. การสร้างรายงาน

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


3
เหตุใดจึงเรียกว่า "Continuous Integration" แทนที่จะเป็น "Continuous Building"?
Quazi Irfan

@Pascal, Re "run the build" .. "the build " หมายถึง?
Pacerier

4
@Pacerier "การสร้าง" หมายถึงขั้นตอนทั้งหมด 1. -7 .; "อย่างต่อเนื่อง" ไม่ได้หมายความว่าคุณจะเริ่มบิลด์ถัดไปทันทีหลังจากที่สร้างครั้งแรกเสร็จสิ้น แต่เฉพาะเมื่อมีการเปลี่ยนแปลงโครงการ
michelek

และเมื่อสร้างแหล่งที่มาตามที่คุณกล่าวถึงในจุดที่ 1 (กำลังสร้างแหล่งที่มา (บางครั้ง))
Deepak Gupta

1
@QuaziIrfan เนื่องจากคุณกำลังตรวจสอบว่ารหัสใหม่หรือที่อัปเดตของคุณรวมเข้ากับฐานรหัสที่มีอยู่ นั่นคือการเปลี่ยนแปลงของคุณรวบรวมว่าสอดคล้องกับมาตรฐานและข้อกำหนดการเข้ารหัสของทีมฟังก์ชันพื้นฐานนั้นดีและไม่ทำลายโครงสร้างที่ดีในปัจจุบัน กล่าวอีกนัยหนึ่งคือการอัปเดตของคุณทำงานร่วมกับฐานรหัสที่มีอยู่ได้เป็นอย่างดี HTH
Rob Wells

43

คำตอบบางส่วนที่ฉันเห็นที่นี่ไม่อยู่ในบริบทและเหมาะสมกว่าหากนี่เป็นคำถาม C / C ++

เวอร์ชั่นสั้น:

  • "การคอมไพล์" กำลังเปลี่ยนไฟล์. java เป็นไฟล์. class
  • "Building" เป็นคำทั่วไปที่รวมถึงการรวบรวมและงานอื่น ๆ

"การสร้าง" เป็นคำทั่วไปที่อธิบายกระบวนการโดยรวมซึ่งรวมถึงการคอมไพล์ ตัวอย่างเช่นกระบวนการสร้างอาจมีเครื่องมือที่สร้างโค้ด Java หรือไฟล์เอกสาร

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


33

การคอมไพล์คือการเปลี่ยนซอร์สโค้ดเป็นอ็อบเจ็กต์โค้ด

การเชื่อมโยงคือการรวมรหัสออบเจ็กต์กับไลบรารีลงในไฟล์ปฏิบัติการดิบ

การสร้างคือลำดับที่ประกอบด้วยการคอมไพล์และการเชื่อมโยงกับงานอื่น ๆ เช่นการสร้างโปรแกรมติดตั้ง

คอมไพเลอร์จำนวนมากจัดการขั้นตอนการเชื่อมโยงโดยอัตโนมัติหลังจากรวบรวมซอร์สโค้ด

อะไรคือความแตกต่างระหว่างรหัสคอมไพล์และโค้ดปฏิบัติการ?


งานอื่น ๆ ที่เป็นไปได้: การเพิ่มประสิทธิภาพ (JDO), Javadoc-ing, บรรจุภัณฑ์และการลงนาม นอกจากนี้สภาพแวดล้อมบางอย่างรวมถึงการเรียกใช้การทดสอบหน่วย / การถดถอยอัตโนมัติซึ่งเป็นส่วนหนึ่งของ "build"
Bert F

โดยปกติไม่มีขั้นตอนการเชื่อมโยงเมื่อสร้างโปรเจ็กต์ Java และไม่มีการสร้างไฟล์ปฏิบัติการดิบ แต่คลาสที่คอมไพล์จะถูกรวมเข้าด้วยกันเป็นไฟล์. jar ซึ่งเป็นส่วนหนึ่งของบิลด์ (หรือ. war หรือ. ear ขึ้นอยู่กับสภาพแวดล้อมเป้าหมายของคุณ)
markusk

1
"ไฟล์ปฏิบัติการดิบ" คืออะไร?
ealeon

กระเป๋าของบิตที่โดยพื้นฐานแล้วไม่มีประโยชน์ในตัวมันเองโดยไม่ต้องปะปนกับไลบรารีอื่น ๆ ที่ต้องการ มันเหมือนเค้กช็อคโกแลตมาก หากไม่มีแป้งและไข่เป็นต้นโกโก้ก็เป็นเพียงโกโก้ดิบ
Kaili

9

พูดง่ายๆ

การคอมไพล์จะแปลโค้ดจาวา (มนุษย์อ่านได้) เป็นรหัสไบต์ดังนั้นเครื่องเสมือนจึงเข้าใจ

สิ่งปลูกสร้างรวบรวมส่วนที่คอมไพล์ทั้งหมดเข้าด้วยกันและสร้าง (สร้าง) ปฏิบัติการ


สิ่งที่คุณกำลังพูดถึงคือ "การตีความ" ... การรวบรวมกำลังเปลี่ยนรหัสที่มนุษย์อ่านได้ให้เป็นรหัสเครื่อง
mortsahl

@ ทอมคุณหมายถึง "ปฏิบัติการ" หรือ " jar ที่เรียกใช้งานได้"?
Pacerier

5
  • Buildเป็นเวอร์ชันที่คอมไพล์ของโปรแกรม
  • วิธีการคอมไพล์แปลง (โปรแกรม) เป็นรหัสเครื่องหรือรูปแบบระดับล่างซึ่งโปรแกรมสามารถทำงานได้

ใน Java : Build เป็นวงจรชีวิตมีลำดับของเฟสที่ตั้งชื่อ

ตัวอย่างเช่น maven มีวงจรชีวิตสามแบบวงจรชีวิตต่อไปนี้คือdefaultสร้างวงจรชีวิต

◾validate - validate the project is correct and all necessary information is available
◾compile - compile the source code of the project
◾test - test the compiled source code using a suitable unit testing framework. These tests should not require the code be packaged or deployed
◾package - take the compiled code and package it in its distributable format, such as a JAR.
◾integration-test - process and deploy the package if necessary into an environment where integration tests can be run
◾verify - run any checks to verify the package is valid and meets quality criteria
◾install - install the package into the local repository, for use as a dependency in other projects locally
◾deploy - done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

4

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

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

ค้นหาAntและMavenสำหรับรายละเอียดเพิ่มเติม


คุณยังสามารถดูว่ามดกำลังทำอะไรอยู่โดยดูที่ buildfile (ส่วนใหญ่เรียกว่า build.xml) แม้ว่าคุณจะไม่คุ้นเคยกับไวยากรณ์ แต่คุณสามารถดูได้ว่าเกิดอะไรขึ้น <javac> หมายถึงกำลังรวบรวมโค้ด Java <java> หมายถึงกำลังรันโค้ดที่คอมไพล์แล้ว อาจเป็นการสร้างไดเร็กทอรีเพื่อใส่ไฟล์. class รวบรวมโค้ดอาจสร้าง Javadoc ฯลฯ
MatrixFrog

1

ใน Eclipse และ IntelliJ กระบวนการสร้างประกอบด้วยขั้นตอนต่อไปนี้: การทำความสะอาดแพ็กเกจก่อนหน้าตรวจสอบความถูกต้องคอมไพล์ทดสอบแพ็กเกจ
รวมตรวจสอบติดตั้งปรับใช้


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