ไวยากรณ์ของภาษาโปรแกรมขึ้นอยู่กับการนำไปใช้หรือไม่


12

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

การตีความ (byte-ตีความแล้ว?) ภาษาเช่น Python, Lua ฯลฯ มักจะมีรูปแบบที่ผ่อนปรนและง่ายและโดยทั่วไปจะพิมพ์น้อยกว่าหรือไม่ต้องการให้ผู้พัฒนาเขียนประเภทตัวแปรในซอร์สโค้ดอย่างชัดเจน

ภาษาที่คอมไพล์เช่น C, C ++, Pascal ฯลฯ มักจะมีไวยากรณ์ที่เข้มงวดโดยทั่วไปมีประเภทและส่วนใหญ่ต้องการรหัส / เวลาในการพัฒนามากขึ้น

ภาษาที่มีการใช้งานอย่างเป็นทางการคือJIT-Compiledเช่น Java / C # มักจะเป็นการประนีประนอมระหว่างสองคนข้างต้นกับคุณสมบัติที่ดีที่สุดของทั้งสองอย่าง

ภาษาโปรแกรมคอมไพล์ที่ทันสมัยกว่าบางภาษาเช่น D และ Vala (และการนำ GNU GJC ไปใช้ของ Java) อาจเป็นข้อยกเว้นของกฎนี้และคล้ายกับไวยากรณ์และคุณลักษณะของภาษาที่รวบรวม JIT เช่น Java และ C #

คำถามแรกของฉันคือสิ่งนี้เกี่ยวข้องกันจริงหรือ? หรือนี่เป็นเรื่องบังเอิญที่ภาษาที่ถูกตีความส่วนใหญ่มีไวยากรณ์ง่าย ๆ JIT-Compiled มีไวยากรณ์และคุณสมบัติในระดับปานกลางเป็นต้น

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


@YannisRizos ขอโทษมันไม่ใช่คำพูด ฉันแค่อยากจะเน้นมัน ฉันจะแก้ไข
ApprenticeHacker

1
เยี่ยมฉันคิดว่ามันไม่ใช่ใบเสนอราคา แต่มันอาจนำไปสู่การตอบว่าคิดว่ามันเป็นหนึ่งและไม่พยายามที่จะปฏิเสธ (หรือเห็นด้วยกับมัน) ... ฉันสังเกตเห็นรูปแบบที่คล้ายกัน แต่โชคไม่ดี ตอบ.
yannis

@ R.MartinhoFernandes ขอโทษฉันไม่ทราบว่า ฉันจะแก้ไข (อีกครั้ง)
ApprenticeHacker

4
Perl ถูกพิมพ์แบบไดนามิกสำหรับประเภทที่ผู้ใช้กำหนดแบบคงที่เกี่ยวกับการจำแนกอาร์เรย์, แฮช, สเกลาร์, และรูทีนย่อยและพิมพ์อย่างมากผ่านการใช้อย่างเข้มงวดตีความและรวบรวม JIT (ไม่แน่นอนในเวลาเดียวกัน) ... เพื่อให้เข้าใจถึงการออกแบบภาษาการขว้างปาใน Perl ก็สนุกเสมอ ...
yannis

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

คำตอบ:


17

ไม่มีการเชื่อมต่อใด ๆ ระหว่างความหมายและไวยากรณ์ ภาษาที่คอมไพล์ Homoiconic เช่น Scheme มาพร้อมกับซินแทกซ์ที่เรียบง่าย เมตา - คอมไพล์ระดับต่ำเช่น Forth นั้นเรียบง่ายกว่านั้น ภาษาที่รวบรวมไว้อย่างเคร่งครัดบางภาษานั้นสร้างขึ้นจากไวยากรณ์ที่น่ารำคาญ (คิดว่า ML, Haskell) OTOH, Python syntax มีน้ำหนักมากมากในแง่ของกฎไวยากรณ์จำนวนหนึ่ง

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

แนวโน้มทั่วไปคือภาษาที่พัฒนามานานเกินไปและไม่ได้มีการป้องกันการออกแบบใด ๆ กับการเบี่ยงเบนทางไวยากรณ์ไม่ช้าก็เร็วจะพัฒนาเป็นสิ่งที่น่ารังเกียจทางไวยากรณ์


+1 สำหรับทำให้ฉันเงยหน้าขึ้นมอง "homoiconic" ... และสำหรับพยักหน้าที่บอบบางไปยัง PHP ...
yannis

1
+1 ภาษาที่พัฒนามานานเกินไปและไม่มีการป้องกันการออกแบบใด ๆสิ่งนี้ยังอ้างถึง Delphi / Object-Pascal ด้วยหรือไม่
ApprenticeHacker

1
@ThomasEding คุณคิดผิด ความหมายเดียวกันสามารถนำมาใช้ด้านบนของรูปแบบไวยากรณ์ที่หลากหลายมากแม้จะมีภาษาที่ไม่มีไวยากรณ์ (เช่น Lisp หรือ Forth) ไวยากรณ์เดียวกันสามารถใช้กับซีแมนทิกส์ต่าง ๆ ได้หลากหลายเช่นไวยากรณ์ของ C และ Verilog นิพจน์นั้นเกือบจะเหมือนกัน แต่ความหมายแตกต่างกันอย่างมาก
SK-logic

1
@ SK-logic - เพียงเพราะมันซับซ้อนและทัวริงที่สมบูรณ์ไม่ได้หมายความว่าอย่างน้อยส่วนใหญ่ของไวยากรณ์ของโปรแกรม การแยกภาษาต่าง ๆ เป็นทัวริงสมบูรณ์ซึ่งไม่ได้ทำการแยกวิเคราะห์อย่างน่าอัศจรรย์บางอย่างที่ไม่มีอะไรเกี่ยวข้องกับไวยากรณ์ ไวยากรณ์ไม่ได้เกี่ยวกับ "ขอบเขต" มันเกี่ยวกับกฎสำหรับโครงสร้างของข้อความในภาษา - โดยไม่พูดอะไรเกี่ยวกับความหมายของข้อความเหล่านั้น การตรวจสอบชนิดและการอนุมานประเภททำงานบนแผนผังต้นไม้ของโปรแกรมโดยไม่ต้องดำเนินการ - จะกำหนดสิ่งต่าง ๆ เกี่ยวกับโครงสร้างของโปรแกรมโดยไม่พูดอะไรเลย ...
Jack

1
@ แจ็คคุณกำลังพยายามที่จะกำหนดว่าไวยากรณ์คืออะไร ไม่มีภาษาที่ใช้งานได้จริงซึ่งต้องการเครื่องมือแยกวิเคราะห์แบบทัวริงที่สมบูรณ์แบบส่วนใหญ่ไม่มีอะไรมากไปกว่าบริบทที่ไม่มี และนี่คือที่ที่ไวยากรณ์ควรอยู่ โปรดอย่าขยายแนวคิดนี้ (ยืดเกินไปแล้ว) ที่อื่นใด และฉันได้พูดถึงมอร์ฟิซึ่มเคอร์รี่ - โฮเวิร์ดแล้วมันเกี่ยวกับความหมายมากกว่ากฎความถูกต้องเพียงอย่างเดียว ฉันคิดว่าคำว่า " type checking" นั้นมีประโยชน์มากและไม่ควรใช้มันเป็นสิ่งที่ทำให้เข้าใจผิดมาก แต่ไม่ได้สะท้อนถึงลักษณะของระบบประเภท
SK-logic

6

ส่วนใหญ่เป็นเรื่องบังเอิญ

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

ไวยากรณ์ภาษาจะมีผลกระทบ - ตัวอย่างเช่นปาสคาลได้รับการออกแบบอย่างระมัดระวังเพื่อที่จะสามารถใช้คอมไพเลอร์ผ่านเดียว - คือผ่านมากกว่าหนึ่งแหล่งที่มาและคุณมีรหัสเครื่อง excutable ในทางกลับกัน Ada ไม่สนใจเรื่องนี้และ Ada คอมไพเลอร์ก็ยากที่จะเขียน - ซึ่งส่วนใหญ่ต้องการมากกว่าหนึ่งรอบ (คอมไพเลอร์ Ada ที่ดีมากที่ฉันใช้เมื่อหลายปีก่อนคือคอมไพเลอร์ 8 รอบอย่างที่คุณอาจจินตนาการว่ามันช้ามาก)

หากคุณดูที่ภาษาเก่า ๆ เช่น Fortran (เรียบเรียง) และ BASIC (ตีความหรือเรียบเรียง) พวกเขามี / มีไวยากรณ์ที่เข้มงวดมากและกฎความหมาย [ในกรณีของ BASIC นั่นไม่ใช่ตั๋วเงินแบบเก่าคุณต้องย้อนกลับไปก่อนหน้านั้นกับต้นฉบับ]

ในอีกทางหนึ่งการดูสิ่งที่มีอายุมากกว่าอื่น ๆ เช่น APL (ความสนุกมากมาย) สิ่งนี้มีการพิมพ์แบบไดนามิกและแปลก ๆ มันถูกตีความโดยทั่วไปเช่นกัน แต่สามารถรวบรวมได้เช่นกัน

ไวยากรณ์แบบผ่อนปรนเป็นวิธีที่ยากหากหมายความว่าคุณมีสิ่งที่เป็นทางเลือกหรือสามารถอนุมานได้ก็หมายความว่าภาษานั้นมีความสมบูรณ์เพียงพอที่จะถูกเลือกสรร จากนั้นอีกครั้ง BASIC มีหลายปีที่ผ่านมาเมื่อคำสั่ง "LET" กลายเป็นทางเลือก!

หลายแนวคิดที่คุณเห็นในขณะนี้ (ตัวอย่างเช่นการพิมพ์แบบไม่พิมพ์หรือแบบไดนามิก) นั้นเก่ามาก - ปรากฏครั้งแรกในปี 1970 หรือต้นปี 1980 วิธีที่พวกเขาใช้และภาษาที่ความคิดเหล่านี้ถูกใช้มีการเปลี่ยนแปลงและเติบโตขึ้น แต่โดยพื้นฐานแล้วสิ่งใหม่ ๆ ส่วนใหญ่เป็นของเก่าที่สวมใส่ในเสื้อผ้าใหม่

นี่คือตัวอย่างจากส่วนบนของหัวของฉัน:

  • APL: การพิมพ์แบบไดนามิก ตีความโดยทั่วไป มาจาก 1960's / 1970's
  • พื้นฐาน: การพิมพ์ที่แข็งแกร่งหรือไดนามิก ตีความหรือเรียบเรียง 1970 และอีกมากมาย
  • Fortran: การพิมพ์ที่แข็งแกร่ง รวบรวม ปี 1960 หรือก่อนหน้า
  • Algol68: การพิมพ์ที่แข็งแกร่ง รวบรวม ปี 1960
  • PL / 1: การพิมพ์ที่แข็งแกร่ง รวบรวม ปี 1960
  • ปาสกาล: การพิมพ์ที่แข็งแกร่ง รวบรวม ปี 1970 (แต่ในปี 1980 มีคอมไพเลอร์ P-System คล้ายกับคอมไพเลอร์ JIT!)
  • การใช้งานของ Fortran และอื่น ๆ โดย DEC ในวันแรกได้รวบรวมและตีความบางส่วน
  • Smalltalk: การพิมพ์แบบไดนามิก แปลเป็น bytecode ซึ่งแปลความหมาย ปี 1980
  • อารัมภบท: ความแปลกประหลาดมากขึ้น การทำงาน. เรียบเรียง (Turbo Prolog ทุกคน?) ปี 1980
  • C: การพิมพ์ที่แข็งแกร่ง (ฮ่าฮ่า) รวบรวม 1960's..today
  • Ada: การพิมพ์ที่แข็งแกร่ง uber รวบรวม ปี 1980
  • Perl: การพิมพ์แบบไดนามิก (ไวยากรณ์ที่แข็งแกร่ง) ตีความ ปี 1990 (?)

ฉันสามารถไปต่อ

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

Update: เพราะฉันยังไม่ชัดเจนพอ

การพิมพ์อาจแตกต่างกันอย่างกว้างขวาง

การพิมพ์แบบคงที่เวลาคอมไพล์คงเป็นเรื่องปกติ (เช่น C, Ada, C ++, Fortan, ฯลฯ ) นี่คือที่ที่คุณประกาศสิ่งประเภทและเป็นวิธีที่ตลอดไป

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

แล้วมีการพิมพ์หลวม ๆ เช่น PHP ที่คุณสามารถทำสิ่งที่แปลกประหลาดอย่างแท้จริงเช่นกำหนดจำนวนเต็ม (อ้างถึงดังนั้นสตริงของมัน) ให้กับตัวแปรแล้วเพิ่มตัวเลขลงไป (เช่น '5' + 5 จะส่งผลให้ 10) นี่คือดินแดนแห่งที่แปลกประหลาด แต่บางครั้งก็มีประโยชน์มาก

อย่างไรก็ตามคุณสมบัติเหล่านี้ได้รับการออกแบบเป็นภาษา การนำไปปฏิบัตินั้นทำให้เกิดขึ้น


13
การพิมพ์ที่แข็งแกร่งไม่ใช่การพิมพ์แบบไดนามิก มันคือการพิมพ์ที่อ่อนแอ คู่ของการพิมพ์แบบไดนามิกคือการพิมพ์แบบคงที่: ในหนึ่งประเภทของการแสดงออกในโปรแกรมสามารถเป็นที่รู้จักแบบคงที่ (เช่นโดยไม่ต้องเรียกใช้โปรแกรม); ในประเภทอื่นสามารถรู้แบบไดนามิกเท่านั้น (เช่นโปรแกรมจะต้องเรียกใช้)
R. Martinho Fernandes

ใช่และทั้งสองสายพันธุ์ของ BASIC และ APL กำลังทำสิ่งนี้ในช่วงปลายปี 1970 ประเภท APL ไม่ค่อยเป็นอย่างที่เราเข้าใจพวกเขาในวันนี้ (เป็นสิ่งที่เหมือนจำนวนเต็ม / ลอยพิมพ์ในระดับสากล แต่อาจเป็นเวกเตอร์, สตริง, และการฝึกอบรมหลายมิติ)
quick_now

ล่าม Fortran ยังคงใช้กันอย่างแพร่หลาย (ดู Cernlib และ PAW) และลูกหลานของมัน ROOT ถูกสร้างขึ้นบนล่าม C ++
SK-logic

ฉันไม่ชัดเจนว่าการพิมพ์ที่แข็งแกร่ง / อ่อนแอและคงที่ / ไดนามิกเกี่ยวข้องกับไวยากรณ์อย่างไร แต่คุณภาพของคำตอบนั้นค่อนข้างดีดังนั้นฉันจึงหลีกเลี่ยงการ upvoting ฉันพิมพ์ C คลาสว่า "คงที่ / อ่อนแอ" (เป็นเรื่องเล็กน้อยที่จะดูค่าที่เก็บไว้ราวกับว่าเป็นประเภทอื่นอาจได้รับค่าที่ไม่ถูกต้อง)
Vatine

@Vatine - จริง ๆ แล้วฉันว่าแข็งแรงในเวลารวบรวมไม่มีอยู่จริงในขณะใช้งาน - ถ้าคุณต้องการมันแบบนั้น คุณสามารถทำได้โดยใช้พอยน์เตอร์และเทียบเท่าในหลายภาษา มันเป็นไปได้แม้ในปาสกาลแบบดั้งเดิมโดยใช้เร็กคอร์ดที่ผันแปรและใน Ada ที่ใช้ UNCHECKED_CONVERSION (แม้ว่าจะยากอาจเป็นไปได้)
quick_now

2

ฉันคิดว่ามันเป็นวิธีอื่น: การใช้งานขึ้นอยู่กับไวยากรณ์ ตัวอย่างเช่นหากไวยากรณ์ของคุณอนุญาตให้มีการสะท้อนการดำเนินการจะต้องระบุรันไทม์ที่สนับสนุน


@IntermediateHacker: แต่มันก็เป็นใน java ดังนั้นฉันควรจะน่ากลัว
sehe

2

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

The more modern a language is, the more comfortable it should be to use.

(ไม่พูดจริงๆเพียงแค่สูตรของตัวเอง.) เมื่อผมเขียนนี่ผมหมายถึงสิ่งที่คุณเรียกว่าcomfortable best features of bothแม่นยำยิ่งขึ้นฉันไม่ต้องการพูดหรือต่อต้านการพิมพ์สแตติก / ไดนามิกหรือไวยากรณ์เข้มงวด / ผ่อนปรน แต่เป็นสิ่งสำคัญที่จะต้องเห็นจุดเน้นของนักพัฒนาและเพิ่มระดับความสะดวกสบายเมื่อทำงานกับภาษา

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

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

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

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

ดังนั้นโดยทั่วไปภาษาการเขียนโปรแกรมและคอมไพเลอร์ได้เห็นการพัฒนาคล้ายกับแอพพลิเคชั่นผู้ใช้ทั่วไป:

  1. ขั้นตอนแรก: มันเป็นสิ่งที่ยอดเยี่ยมที่จะมี แต่เทคโนโลยีล้ำสมัยที่ทำให้เลือดไหลออกมานั้นแทบจะทำให้ค่าใช้จ่ายด้านความสะดวกสบาย / ความสามารถในการใช้งาน / สิ่งที่ไม่ดี
  2. การปรับปรุงเทคโนโลยี: เราสามารถสร้างสิ่งเหล่านี้ได้อย่างแข็งแกร่งเร็วขึ้นและง่ายขึ้น
  3. โฟกัสหันไปหาผู้ใช้: เช่นเดียวกับการเคลื่อนไหว Web2.0 ที่เน้นประสบการณ์ของผู้ใช้ภาษาการเขียนโปรแกรมใหม่จะมุ่งเน้นไปที่มุมมองของนักพัฒนา

(Not a quote really, just my own formulation.)ดีที่คุณจัดรูปแบบเป็นรหัสที่ไม่เป็น blockquote ดังนั้นผมไม่คิดว่าทุกคนคิดว่ามันเป็นคำพูดที่ :)
Yannis

3
ความสะดวกสบายชัดเจนขึ้นอยู่กับรสนิยม (ซึ่งเป็นอัตวิสัยทั้งหมด) ภาษาที่ฉันรู้สึกสะดวกสบายที่สุดได้รับการออกแบบในปี 1959 และฉันไม่สามารถรับมือกับบางภาษาที่ปรากฏในศตวรรษนี้
SK-logic

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

0

ภาษาการเขียนโปรแกรมที่กำหนดอาจหรือไม่เปิดเผยหรือ จำกัด ข้อมูลความหมายที่เพียงพอสำหรับคอมไพเลอร์เพื่ออนุมานวิธีการลดรหัสลงในโค้ดที่ปฏิบัติการได้โดยไม่ต้องเพิ่มการตัดสินใจรันไทม์ ("ตัวแปรนี้คืออะไร?" ฯลฯ ) บางภาษาได้รับการออกแบบ ข้อ จำกัด นี้บังคับหรือง่ายต่อการตรวจสอบ

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

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

ในอดีตภาษาการเขียนโปรแกรมและการใช้งานอาจมีการพัฒนาเพื่อให้เหมาะสมกับข้อ จำกัด ของฮาร์ดแวร์เช่นล่ามอาจพอดีใน 4k หรือ 16k หรือว่าคอมไพเลอร์อาจเสร็จสิ้นในเวลาน้อยกว่าหนึ่งนาทีของ CPU เมื่อเครื่องทำงานได้เร็วขึ้นก็เป็นไปได้ที่จะรวบรวมโปรแกรมที่เคยตีความใหม่บางโปรแกรมให้เร็วที่สุดเท่าที่โปรแกรมเมอร์สามารถกดปุ่มส่งคืนหรือตีความซอร์สโค้ดโปรแกรมที่คอมไพล์ไว้ก่อนหน้านี้เร็วกว่าฮาร์ดแวร์ที่เก่ากว่าเล็กน้อย

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