อะไรคือความหมายของประโยค“ เราต้องการให้มันถูกคอมไพล์ดังนั้นมันจึงไม่เผาซีพียูทำสิ่งที่ผิด”


10

ผมอ่านนี้บทความ มันมีย่อหน้าต่อไปนี้

และสกาล่ากลายเป็นว่าเร็วหรือไม่? คุณนิยามคำว่า fast อะไร เกี่ยวกับเร็วเท่า Java ไม่จำเป็นต้องเร็วเท่ากับ C หรือ Assembly Python ไม่เร็วกว่า Ruby อย่างมีนัยสำคัญ เราต้องการทำมากขึ้นด้วยเครื่องจักรที่น้อยลงใช้ประโยชน์จากการทำงานพร้อมกันได้ดี เราต้องการที่จะรวบรวมดังนั้นจึงไม่เผาซีพียูทำสิ่งที่ผิด

ฉันกำลังมองหาความหมายของประโยคสุดท้าย ภาษาที่แปลจะทำให้ซีพียูทำสิ่งที่ "ผิด" อย่างไร


3
การเรียกสิ่งที่คอมไพล์ไปยังโค้ดไบต์ JVM ที่ตีความแล้วนั้นค่อนข้างเสรีกับการใช้งาน
Rig

คำตอบ:


47

ถ้ารหัสว่า

A = A + 1

โค้ดที่คอมไพล์ทำสิ่งนี้

add A, 1

รหัสที่แปลแล้วทำสิ่งนี้ (หรือการเปลี่ยนแปลงบางอย่าง)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

รับความคิด?


3
บางครั้งเปลือกจริงๆไม่ทำให้ภาพชัดเจน ;-) (เพียงว่าจะแล้วเสร็จ: หลายล่ามที่รู้จักกันดีเพิ่มประสิทธิภาพบางส่วนของขั้นตอนที่อยู่ห่างออกไปดังนั้นพวกเขาจะอยู่กึ่งกลางระหว่างสองตัวอย่าง "การใช้งาน" ที่นี่)
Joachim Sauer

3
@JoachimSauer: คุณพูดถูก ยังคงเป็นการยากที่จะทำการล่ามที่มีค่าปรับความเร็วต่ำกว่า 10 เท่าเมื่อเปรียบเทียบกับโค้ดที่คอมไพล์แล้ว หากภาษานั้นเป็นภาษาที่ใช้เวลาทั้งหมดในการรวบรวมฟังก์ชั่นย่อยที่ต้องถูกเรียกต่อไปเช่นไลบรารีคณิตศาสตร์หรือ I / O ค่าใช้จ่ายในการตีความจะไม่เป็นปัญหา
Mike Dunlavey

1
นี่เป็นคำอธิบายที่น่าทึ่ง
Jamie Taylor

13

เราต้องการที่จะรวบรวมดังนั้นจึงไม่เผาซีพียูทำสิ่งที่ผิด

ดูเหมือนว่าพวกเขาจะหมายถึงการรวบรวมและตีความตีความ น่าจะเป็นเรื่องราวทั้งหมดของ Twitter ที่ย้ายงานการประมวลผลเบื้องหลังไปยัง Scala (รวบรวม) หลังจากเริ่มพัฒนาใน Ruby On Rails (ตีความ)

คำอธิบายของการรวบรวม VS รหัสตีความที่นี่

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


มีความสุขที่จะให้ +1 แรกของคุณ ยินดีต้อนรับสู่ P.SE!
haylem

4
(อาจจะคุ้มค่าที่จะกล่าวถึงว่าสกาล่า - ในขณะที่มันอยู่ใน JVM - ในทางเทคนิคแล้วจะมีการรวบรวมไบต์เท่านั้น)
haylem

ไม่ทราบว่า Scala เป็นฐาน JVM ความหมายของ JIT อาจจะรวบรวม ในกรณีนี้เหตุใด Twitter จึงไม่ย้ายจาก Ruby on Rails ไปยัง JRuby คุณคิดว่าจะเป็นการโยกย้ายที่ง่ายขึ้นโดยมีข้อดีของการคอมไพล์
KrisG

3
พวกเขากำลังมองหาโมเดลการทำงานพร้อมกันที่ดีขึ้นและพวกเขามีปัญหากับการเก็บขยะของรูบี้ บทความอธิบายในรายละเอียด
scrwtp

9

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

  • การรวบรวมพื้นเมือง - ซอร์สโค้ดรวบรวมโดยตรงในรหัสเครื่อง ประสิทธิภาพที่ดีที่สุดด้วยค่าใช้จ่ายในการพกพา โดยทั่วไปเกี่ยวข้องกับ C และ C ++
  • การรวบรวมระดับกลาง - ซอร์สโค้ดถูกรวบรวมเป็นภาษาตัวกลางแบบง่าย (bytecode) ซึ่งต่อมาถูกตีความหรือเรียบเรียง (การคอมไพล์แบบทันเวลาพอดี) ในรหัสเครื่องระหว่างการดำเนินการ พกพาได้ดีกว่ารหัสเนทีฟประสิทธิภาพที่ดีกว่าการตีความที่บริสุทธิ์ในขณะที่ยังคงมีอัพไซด์การตีความบางอย่าง (เช่นการรวมล่าช้า) ตัวอย่างเช่น C #, Java และภาษาอื่น ๆ ที่กำหนดเป้าหมาย JVM และ. NET CLR
  • การตีความ - ซอร์สโค้ดไม่ได้แปลเป็นรหัสเครื่องโดยตรง แต่จะแปลและดำเนินการโดยโปรแกรมล่ามเฉพาะ ล่ามแตกต่างกันไปในความซับซ้อนในการใช้งานไร้เดียงสา แต่มัน boils ลงไปที่การแยกวิเคราะห์และรันบรรทัดซอร์สโค้ดทีละบรรทัด การตีความช่วยให้มีความยืดหยุ่นมากกว่าการรวบรวมดังนั้นภาษาที่ตีความทำให้ใช้การพิมพ์หรือการสะท้อนแบบไดนามิกได้กว้างขึ้น ภาษาที่ถูกตีความมักถูกมองว่าเป็นการเพิ่มผลผลิตของนักพัฒนาเนื่องจากพวกเขาต้องการรหัสสำเร็จรูปที่น้อยกว่าและให้พวกเขาสร้างต้นแบบอย่างรวดเร็ว ข้อเสียคือประสิทธิภาพลดลง ที่เกี่ยวข้องทั่วไปกับ JavaScript, Ruby หรือ Python

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


-1 วิธีที่คำตอบเป็นคำพูดดูง่ายเกินไป มันไม่สนใจสิ่งต่าง ๆ เช่น JIT ( การรวบรวมแบบทันเวลา ) - ซึ่งเป็นวิธีที่ Scala ทำงานมากกว่า JVM / CLR
gnat

จริง เขียนใหม่คำตอบมันเพิ่มเล็กน้อยในหัวข้อเดิม
ตรวจสอบ

-3

ในกรณีนี้ฉันใช้the wrong stuffเพื่อหมายถึงการขาดความปลอดภัยประเภทในรหัสที่ไม่ได้รวบรวม

ดังนั้นไม่เพียง แต่แปลรหัสช้าลง แต่ยังมีประโยชน์มากกว่า ...


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

1
การกำหนด "ไม่พิมพ์ปลอดภัย" กับ "รถบักกี้เพิ่มเติม" นั้นถูกผลักดันโดยคนที่มีผลิตภัณฑ์ขาย
user16764

1
@ user16764: ไม่ใช่ FUD ถ้าเป็นจริง IME คนที่ผลักดันเรื่องไร้สาระในเรื่องการขายผลิตภัณฑ์คือคนที่พยายามดาวน์ลิงก์ระหว่างการพิมพ์แบบไดนามิกและข้อผิดพลาด ("เป็นข้อผิดพลาดประเภทเดียวเท่านั้น" ฯลฯ )
Mason Wheeler
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.