Google ปิดเป็นคอมไพเลอร์จริงหรือไม่?


19

คำถามนี้เป็นคำถามแรงบันดาลใจจากการอภิปรายในการแสดงความคิดเห็นในคำถามนี้กองมากเกิน Google ปิดคอมไพเลอร์เอกสารระบุต่อไปนี้ (เน้นเพิ่ม):

Closure Compiler เป็นเครื่องมือสำหรับการดาวน์โหลด JavaScript และทำงานได้เร็วขึ้น มันเป็นคอมไพเลอร์ที่แท้จริงสำหรับ JavaScript แทนที่จะรวบรวมจากภาษาต้นฉบับเป็นรหัสเครื่องจะรวบรวมจาก JavaScript เป็น JavaScript ที่ดีกว่า

อย่างไรก็ตามWikipediaให้คำจำกัดความของ "compiler" ดังต่อไปนี้:

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

จากนั้นฉันก็จะบอกว่า Google Closure ไม่ใช่คอมไพเลอร์ แต่ความจริงที่ว่า Google ระบุอย่างชัดเจนว่าที่จริงแล้วมันเป็น "คอมไพเลอร์ที่แท้จริง" ทำให้ฉันสงสัยว่ามีอะไรมากกว่านั้น Google Closure เป็นคอมไพเลอร์ JavaScript จริงๆหรือ


2
ฉันเดิมพัน JS มันเป็นส่วนย่อยที่เหมาะสมของกฎหมาย JS; ในแง่นี้ภาษาเอาท์พุทของมันคือภาษา"อีก"
AakashM

คำตอบ:


23

การปิดสมุดคอมไพเลอร์เป็นminifierการเพิ่มประสิทธิภาพและตรวจสอบทั้งหมดในหนึ่งเดียว ชนิดของการทำให้มันอยู่ในหมวดหมู่ของตัวเองว่าเพราะคุณถูกต้องที่เรียบเรียงอย่างน้อยควรจะใช้สิ่งที่จะไม่ทำงานในรูปแบบปัจจุบันและทำให้มันกลายเป็นสิ่งที่จะ (ใช้typescriptสำหรับตัวอย่าง ECMAScript-based)

แต่คุณตำหนิ Google ในการยืดคำศัพท์หรือไม่? พวกเขาจะเรียกอะไรอีก Google Minifier ไม่มันเป็นมากกว่านั้นและมีอยู่หลายร้อยรายการ Google Optimizer มันเป็นมากกว่านั้น Google Validator หรือไม่ ไม่มันเป็นมากกว่านั้นเช่นกัน

ดังนั้นทางเลือกคือ

  • เรียกว่า Google Closure Foogle และแนะนำคำศัพท์ใหม่ที่ไม่มีความหมายในพจนานุกรม
  • เรียกว่า Google Closure Minoptivalidator ซึ่งชัดเจนกว่าในความตั้งใจ แต่จำยากกว่า
  • เรียกว่า Google Closure Compiler ซึ่งค่อนข้างใกล้เคียงกับความจริง

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

หรือเพื่อกลับมาดูตัวอย่างก่อนหน้านี้คุณสามารถค้นพบสิ่งสำคัญเกี่ยวกับ TypeScript ที่อนุญาตให้เรียกว่า "คอมไพเลอร์ที่แท้จริง" ในขณะที่ Google Closure Compiler ควรถูก จำกัด ให้เป็น "คอมไพเลอร์เกือบ" หรือไม่


ประเด็นของคำถามก็คือเพื่อดูว่าผู้คนมองว่า "คอมไพเลอร์" จริงๆ ตามที่ระบุไว้โดย 0A0D มันเป็นเพียงความหมาย แต่ฉันเพิ่งพบว่าตัวเองสงสัยว่าทำไม Google รู้สึกถึงความต้องการที่จะชี้แจงว่ามันเป็น "คอมไพเลอร์ที่แท้จริง" +1 สำหรับ "Minoptivalidator"!
James Allardice

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

1
ฉันไม่รู้ฉันชอบ "Google Foogle" :-)
GrandmasterB

9
Minoptivalการลงคะแนนเสียงสำหรับฉัน ดูเหมือนไดโนเสาร์ ทุกคนชอบไดโนเสาร์ใช่มั้ย
Izkata

2
@Izkata: หากมีสิ่งหนึ่งที่ประวัติศาสตร์วิวัฒนาการได้สอนเรานั่นคือจาวาสคริปต์ที่จะไม่มี Javascript หยุดพักฟรีมันขยายไปสู่ดินแดนใหม่และเกิดปัญหาผ่านอุปสรรคอย่างเจ็บปวดอาจเป็นอันตรายได้
สาธารณรัฐประชาธิปไตยประชาชนลาว

9

จากนั้นฉันก็จะบอกว่า Google Closure ไม่ใช่คอมไพเลอร์

ใช่แล้ว ... แต่นั่นถือว่า Wikipedia มีสิทธิ์ในประเด็นนี้

และเพื่อให้เป็นไปตามข้อกำหนดของวิกิพีเดียให้พิจารณาคำจำกัดความของพจนานุกรม (จากhttp://www.thefreedictionary.com/compiler ):

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

2) (Electronics & Computer Science / Computer Science)โปรแกรมคอมพิวเตอร์ที่ภาษาโปรแกรมระดับสูงเช่น COBOL หรือ FORTRAN ถูกแปลงเป็นภาษาเครื่องที่สามารถใช้งานได้กับคอมพิวเตอร์

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

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

การโต้วาทีว่าคอมไพเลอร์ปิดเป็น "คอมไพเลอร์จริง" หรือไม่ (IMO) ไม่ใช่กิจกรรมที่เกิดผล มันจะมีประโยชน์มากกว่าที่จะเข้าใจความหมายของผู้ใช้ Googleโดย "ผู้แปลที่แท้จริง" ... ในบริบทนั้น


2
+1, แดกดัน, JS เป็นทั้ง 'ภาษาเครื่อง' สำหรับเว็บและ 'ภาษาโปรแกรมระดับสูง'
K.Steff

3
+1 และอีกรายการหนึ่งสำหรับ 'สมมติว่า Wikipedia มีสิทธิ์ในจุดนี้' มีคนจำนวนมากเกินไปที่ยอมรับสิ่งที่เกิดขึ้นกับการเขียนที่นั่น
Marjan Venema

6

ฉันคิดว่าเหตุผลที่เรียกได้ว่า "คอมไพเลอร์ตัวจริง" เพราะมันสร้าง AST (abstract semantic tree) ที่สมบูรณ์จากโปรแกรมของคุณและใช้มันเพื่อสร้างข้อความใหม่

ความจริงที่ว่าทั้งข้อความต้นฉบับและผลลัพธ์เป็น JavaScript ที่ถูกต้องเป็นเรื่องบังเอิญ

สิ่งนี้มีความสำคัญเนื่องจากมีเครื่องมือมากมายที่ทำเฉพาะการปรับเปลี่ยนข้อความของรหัส (minifiers, prettifiers เป็นต้น) แต่ไม่ได้ทำการจัดการ AST ใด ๆ และมีการสร้างรหัสใหม่น้อยกว่ามาก แม้ว่าเครื่องมือเหล่านั้นจะมีประสิทธิภาพมากขึ้น แต่ก็ไม่ใช่ซอฟต์แวร์ชนิดเดียวกันและข้อ จำกัด ต่างกัน


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

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

ฉันไม่ได้อ่านข้อมูลอ้างอิงนั้น แต่ฉันยอมรับว่า AST ที่ชัดเจนไม่จำเป็นสำหรับการรวบรวมอย่างชัดเจน อย่างไรก็ตามในกรณีส่วนใหญ่มีโครงสร้างที่เทียบเท่าไม่ว่าจะเป็นข้อมูลหรือโดยนัยในการดำเนินการ (อาจเป็น call stack (หรือวิวัฒนาการในเวลา) สะท้อนการวิเคราะห์ไวยากรณ์) ประเด็นหลักของฉันคือการรวบรวมไม่ใช่การจัดการข้อความ แต่สร้างรหัสจากการวิเคราะห์รหัสต้นฉบับบางส่วน
Javier

4

มันเป็นความหมายในความคิดของฉัน ในความหมายดั้งเดิมมันไม่ได้เป็นคอมไพเลอร์ อย่างไรก็ตามในลิงค์ Wikipedia เดียวกันมันบอกว่า

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

การปิดทำการดำเนินการบางส่วนหรือทั้งหมด

ไกลออกไปเล็กน้อยในบทความ Wikipedia

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

ที่ถูกกล่าวว่าฉันเดาว่ามันง่ายกว่าที่จะเรียกมันว่า " Closure Compiler " แทนที่จะเป็น "เครื่องมือเพิ่มประสิทธิภาพการปิด" เพราะจริงๆแล้วมันเป็นเพียงการเพิ่มประสิทธิภาพ JavaScript สำหรับเบราว์เซอร์ไม่จำเป็นต้องแปลเป็นภาษาอื่นหรือ bytecode

การปิดคอมไพเลอร์เป็นคำนามไม่ใช่ภาคต่อ


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

3

ก่อนอื่นให้กำจัดคอมไพเลอร์ source-to-source นี้ คุณไม่สามารถพูดอะไรที่ไม่ใช่คอมไพเลอร์เพราะผลลัพธ์สุดท้ายไม่ใช่รหัสระดับล่าง

ในขณะที่มันถูกต้องที่ Closure Compiler สร้าง AST และมีวลีการสร้างรหัส Javascript minimizer จำนวนมากออกมาทำเช่นนั้นและฉันอาจจะไม่เรียกพวกมันว่าคอมไพเลอร์

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

ระบบประเภท:

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

การเพิ่มประสิทธิภาพระหว่างกระบวนการ

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

การเพิ่มประสิทธิภาพ intraprocedural

ตัวรวบรวมการปิดปรับให้เหมาะสม Javascript โดยใช้การวิเคราะห์การไหลของการควบคุมที่แตกต่างกันเช่นเดียวกับการวิเคราะห์การไหลของข้อมูล เทคนิคคอมไพเลอร์คลาสสิคเช่น: Inlining, Register Allocation, Live Variable Analysis .. และอื่น ๆ อีกมากมายที่ใช้ในการบีบที่ไบต์สุดท้ายออกมาจาก Javascript เอาท์พุท

ระบบโมดูล

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

คอมไพเลอร์และเทคนิคการวิเคราะห์แบบคงที่ทั้งหมดนี้คือสิ่งที่กำหนดให้ปิดคอมไพเลอร์นอกเหนือจาก Javascript minimizer อื่น ๆ จากข้อเท็จจริงที่ว่าภาษาอินพุทและเอาท์พุทเป้าหมายเหมือนกันฉันไม่เห็นว่าทำไมมันจึงไม่จัดอยู่ในประเภท "ผู้แปลที่แท้จริง"

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