ทำไมบิลด์ที่เพิ่มขึ้นใน“ make” ไม่ใช้อัลกอริทึมการแปลงแป้นพิมพ์


10

ผมเริ่มต้นด้วยและฉันสงสัยเกี่ยวกับเวลาที่จะใช้makemake clean

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

อย่างไรก็ตามฉันได้รับคำตอบสำหรับคำถาม "เมื่อต้องการใช้make clean" จากคำถาม StackExchange อื่น ๆ แต่คำถามอื่นของฉันคือ:

ทำไมบิลด์ที่เพิ่มขึ้นโดยใช้การmakeประทับเวลาของไฟล์และไม่ใช่ SHA-1 เช่น ตัวอย่างเช่น Git แสดงให้เห็นว่าเราสามารถตรวจสอบว่ามีการแก้ไขไฟล์โดยใช้ SHA-1 หรือไม่
สำหรับปัญหาเรื่องความเร็วหรือไม่


5
makeถูกสร้างขึ้นในยุค 70 SHA-1 ถูกสร้างขึ้นใน 90's Git ถูกสร้างขึ้นในยุค 00 สิ่งสุดท้ายที่คุณต้องการสำหรับงานสร้างที่คลุมเครือบางอย่างที่ทำงานมา 30 ปีก็ล้มเหลวทันทีเพราะมีคนตัดสินใจที่จะไปที่ทันสมัยด้วยระบบที่ผ่านการทดลองและทดสอบแล้ว
2559

1
การแฮชไฟล์ทุกครั้งจะช้า ฉันคิดว่า git ยังใช้ metadata ของระบบแฟ้มเพื่อปรับการตรวจสอบไฟล์ที่เปลี่ยนแปลงให้เหมาะสม
CodesInChaos

4
โซลูชันดั้งเดิมตามวันที่ของไฟล์นั้นง่ายมากไม่ต้องใช้ไฟล์เพิ่มเติมสำหรับการจัดเก็บรหัสแฮชและทำงานได้ดีอย่างน่าทึ่งในช่วงหลายทศวรรษที่ผ่านมา เหตุใดจึงมีคนแทนที่โซลูชันที่ใช้งานได้ดีโดยใช้วิธีที่ซับซ้อนกว่า ยิ่งไปกว่านั้น AFAIK ระบบ VCS ส่วนใหญ่กำหนดไฟล์ที่ได้รับการตรวจสอบว่าเป็น "วันที่เช็คเอาต์" ดังนั้นไฟล์ที่ถูกเปลี่ยนแปลงจะทำให้คอมไพล์ซ้ำโดยไม่ต้อง
Doc Brown

@Ordous: สนุก แต่มันเกี่ยวข้องที่นี่ ซอฟต์แวร์ไม่เป็นสนิม มันให้ออกเพราะมีคนเปลี่ยนแปลงบางสิ่งในสภาพแวดล้อมโดยรอบ นอกจากว่าพวกเขาไม่ได้ในกรณีนี้มันยังคงทำงานได้
Robert Harvey

1
@ RobertHarvey แน่นอนมันเป็น! แน่นอนว่าหากคุณไม่ได้อัปเดตmakeซอฟต์แวร์ของคุณจะไม่หยุดยั้งอย่างไรก็ตามmakeพยายามใช้ความเข้ากันได้ย้อนหลังในเวอร์ชันใหม่ การเปลี่ยนแปลงพฤติกรรมหลักโดยไม่มีเหตุผลที่ดีนั้นตรงกันข้ามกับสิ่งนั้นมาก และวันที่แสดงว่าทำไมมันไม่ได้ถูกสร้างขึ้นมาเพื่อใช้ SHA-1 หรือทำไมมันไม่ง่ายในการติดตั้งเพิ่มใหม่เมื่อมีให้ใช้งาน ( makeมีอายุหลายสิบปีแล้ว)
2559

คำตอบ:


7

ปัญหาที่ชัดเจน (และผิวเผิน arguably) จะเป็นว่าระบบการสร้างจะต้องเก็บบันทึกการแฮชของไฟล์ที่ใช้สำหรับการสร้างครั้งล่าสุด ในขณะที่ปัญหานี้สามารถแก้ไขได้อย่างแน่นอนมันจะต้องมีการจัดเก็บข้อมูลด้านข้างเมื่อข้อมูลการประทับเวลาที่มีอยู่แล้วในระบบไฟล์

แม้ว่าจะมีความเข้มงวดมากขึ้นแฮชจะไม่ถ่ายทอดความหมายแบบเดียวกัน หากคุณรู้ว่าไฟล์Tนั้นสร้างขึ้นจากการพึ่งพาDกับ hash H 1และจากนั้นพบว่าตอนนี้D hash เป็นH 2คุณควรสร้างTอีกครั้งหรือไม่ อาจเป็นไปได้ แต่อาจเป็นไปได้ว่าจริง ๆ แล้วH 2อ้างถึงไฟล์รุ่นเก่ากว่า การประทับเวลาจะกำหนดการสั่งซื้อในขณะที่แฮชนั้นเปรียบได้กับความเสมอภาคเท่านั้น

คุณลักษณะที่การสนับสนุนการประทับเวลาคือคุณสามารถอัปเดตการประทับเวลา (ตัวอย่างเช่นการใช้ยูทิลิตีบรรทัดคำสั่ง POSIX touch) เพื่อหลอกmakeให้คิดว่าการพึ่งพามีการเปลี่ยนแปลงหรือ - น่าสนใจมากขึ้น - เป้าหมายเป็นสิ่งล่าสุด กว่าที่เป็นจริง ในขณะที่เล่นกับนี่เป็นโอกาสที่ดีในการยิงตัวเองเข้าไปในเท้ามันจะมีประโยชน์เป็นครั้งคราว ในระบบที่ใช้แฮชคุณจะต้องได้รับการสนับสนุนจากระบบบิลด์เพื่ออัพเดทฐานข้อมูลภายในของแฮชที่ใช้สำหรับบิลด์ล่าสุดโดยไม่ต้องสร้างอะไรเลย

ในขณะที่การโต้แย้งสามารถทำได้โดยใช้แฮชในการประทับเวลาจุดของฉันคือพวกเขาไม่ใช่ทางออกที่ดีกว่าเพื่อให้บรรลุเป้าหมายเดียวกัน แต่เป็นวิธีแก้ไขปัญหาที่แตกต่างเพื่อบรรลุเป้าหมายที่แตกต่างกัน เป้าหมายข้อใดต่อไปนี้เป็นที่ต้องการมากกว่านั้นอาจเปิดให้มีการอภิปราย


1
ในขณะที่ซีแมนทิกส์แตกต่างกันระหว่างแฮชและการประทับเวลาโดยทั่วไปจะไม่เกี่ยวข้องในกรณีนี้เนื่องจากคุณมักต้องการสร้างจากไฟล์ปัจจุบันไม่ว่าจะอายุเท่าไร
axl

สิ่งที่คุณพูดส่วนใหญ่นั้นถูกต้อง อย่างไรก็ตามระบบการสร้างที่ใช้งานได้ดีซึ่งใช้แฮชเช่น Google blaze / bazel (เวอร์ชั่นภายในของ blaze, โอเพ่นซอร์สหนึ่งคือ bazel) จะทำให้กางเกงออกจากระบบ timestamped เช่น Make ที่กล่าวว่าคุณไม่ต้องใส่มากของความพยายามในการทำซ้ำสร้างเพื่อให้เป็นเสมอปลอดภัยที่จะใช้ในการสร้างสิ่งประดิษฐ์เก่ามากกว่าการสร้างใหม่
btilly

การทำแผนที่ที่นี่มีไม่มากสำหรับคนหนึ่งคนต่อคน ถ้าDตอนนี้ hashes ไปH2และคุณไม่ได้มีการส่งออกบางส่วนT2ที่สร้างขึ้นจากD@H2คุณต้องการในการผลิตและเก็บไว้ หลังจากนั้นไม่ว่าลำดับการDสลับระหว่างH1และH2สถานะจะเป็นอย่างไรคุณจะสามารถใช้เอาต์พุตที่แคชได้
ซาด Saeeduddin

1

การแฮชโครงการทั้งหมดช้ามาก คุณต้องอ่านทุก ๆ ไบต์ของไฟล์ทุกไฟล์ Git ไม่สับทุกไฟล์ทุกครั้งที่คุณเรียกใช้git statusอย่างใดอย่างหนึ่ง การชำระเงินด้วย VCS และไม่ทำตามปกติจะกำหนดเวลาการแก้ไขของไฟล์เป็นเวลาที่เขียนขึ้นดั้งเดิม การคืนค่าข้อมูลสำรองจะทำถ้าคุณระมัดระวัง ระบบไฟล์เหตุผลทั้งหมดมีการประทับเวลาสำหรับกรณีการใช้งานเช่นนี้

โดยทั่วไปนักพัฒนาซอฟต์แวร์จะทำงานmake cleanเมื่อการอ้างอิงที่ไม่ได้ติดตามโดยตรงจากการเปลี่ยนแปลง Makefile กระแทกแดกดันซึ่งมักจะรวมถึง Makefile เอง มันมักจะรวมถึงรุ่นคอมไพเลอร์ ขึ้นอยู่กับว่า Makefile ของคุณเขียนได้ดีแค่ไหนมันอาจรวมรุ่นไลบรารี่ภายนอก

สิ่งเหล่านี้คือสิ่งต่าง ๆ ที่มีแนวโน้มที่จะได้รับการอัพเดตเมื่อคุณทำการอัพเดทตัวควบคุมเวอร์ชันดังนั้นนักพัฒนาส่วนใหญ่จะเริ่มทำงานmake cleanในเวลาเดียวกันดังนั้นคุณจะรู้ว่าคุณเริ่มต้นจากกระดานชนวนใหม่ทั้งหมด คุณสามารถหนีไปได้โดยไม่ต้องทำอะไรมากมาย แต่เป็นการยากที่จะคาดเดาเวลาที่คุณไม่สามารถทำได้


คุณสามารถใช้ระบบไฟล์เช่น ZFS ซึ่งค่าใช้จ่ายของการแฮชจะถูกตัดจำหน่ายในช่วงเวลาที่มีการแก้ไขไฟล์แทนที่จะจ่ายทั้งหมดในครั้งเดียวเมื่อคุณสร้าง
ซาด Saeeduddin

1

จุดสองสามข้อเกี่ยวกับแฮชและการประทับเวลาในระบบสร้าง:

  1. เมื่อคุณเช็คเอาต์ไฟล์การประทับเวลาควรได้รับการอัปเดตเป็นเวลาปัจจุบันซึ่งก่อให้เกิดการสร้างใหม่ สิ่งที่เพื่อนร่วมงานของคุณอธิบายไม่ได้เป็นโหมดความล้มเหลวของระบบบันทึกเวลา
  2. Timestamps เร็วกว่าแฮชเล็กน้อย ระบบการประทับเวลาจะต้องตรวจสอบการประทับเวลาเท่านั้นในขณะที่ระบบแฮชจะต้องตรวจสอบการประทับเวลาจากนั้นจึงอาจแฮช
  3. ทำให้ถูกออกแบบมาให้มีน้ำหนักเบาและอยู่ในตัวเอง ในการเอาชนะ (2) ระบบที่ใช้แฮชมักจะใช้กระบวนการพื้นหลังเพื่อตรวจสอบแฮช (เช่นWatchmanของ Facebook ) นี่คือสิ่งที่ตรงกันข้ามกับเป้าหมายการออกแบบ (และประวัติ) ของ Make
  4. แฮชป้องกันการสร้างใหม่ที่ไม่จำเป็นเมื่อมีการเปลี่ยนแปลงเวลา แต่ไม่ใช่เนื้อหา บ่อยครั้งสิ่งนี้จะชดเชยค่าใช้จ่ายในการคำนวณแฮช
  5. Hashes ช่วยให้แคชสิ่งประดิษฐ์สามารถใช้ร่วมกันระหว่างโครงการและผ่านเครือข่าย อีกครั้งนี้มากกว่าชดเชยค่าใช้จ่ายของการคำนวณแฮช
  6. ระบบสร้างแบบแฮชที่ทันสมัย ​​ได้แก่Bazel (Google) และBuck (Facebook)
  7. นักพัฒนาส่วนใหญ่ควรพิจารณาการใช้ระบบแฮชเนื่องจากพวกเขาไม่มีข้อกำหนดเหมือนกับที่ Make ได้รับการออกแบบ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.