“ ภาษา A เขียนด้วยภาษา B” หมายความว่าอะไร?


31

ผมมักจะได้ยินคำว่าภาษาเป็นสิ่งที่เขียนในภาษา B. ตัวอย่างเช่นPHPได้รับการเขียนC , C #จะถูกเขียนในภาษา C ++

ใครช่วยกรุณาอธิบายสิ่งนั้นหมายความว่าและถ้ามันถูกต้อง? สิ่งนี้เกี่ยวข้องกับการแปลของล่ามที่ใช้โดยภาษาหรือไม่?

นอกจากนี้ปัจจัยอะไรบ้างที่ทำให้ภาษาที่ใช้ในการเลือกใช้ถูกสร้างขึ้น


19
การพูดอย่างเคร่งครัด "PHP เขียนเป็นภาษา C" ผิด ภาษาเป็นคำนิยามที่เป็นทางการดังนั้นจึงไม่ได้เขียนในภาษาโปรแกรมเมอร์อื่น (แต่เป็นภาษาอังกฤษ) เฉพาะคอมไพเลอร์, ล่ามและ / หรือไลบรารีเท่านั้นที่สามารถเขียนเป็น C, C ++ หรืออะไรก็ได้ ในทางปฏิบัติสำหรับหลาย ๆ ภาษามีผู้แปลหรือล่ามที่โดดเด่นคนหนึ่งและความแตกต่างระหว่างการกำหนดภาษาและการใช้งานไม่ได้เกิดขึ้น
281377

BCPL ที่น่าสนใจส่วนใหญ่เขียนใน BCPL
OldCurmudgeon

7
PHP "ต่อ se" ไม่ใช่คำจำกัดความที่เป็นทางการ มันเป็นโปรแกรม C
Kaz

8
s/written/implemented/และชัดเจนยิ่งขึ้น
TMN

2
@ugoren มีคอมไพเลอร์ C จำนวนมากเขียนอยู่ในชุดประกอบ ไม่มากนักในศตวรรษนี้
Ross Patterson

คำตอบ:


30

ภาษาการเขียนโปรแกรมส่วนใหญ่แบ่งออกเป็นสองประเภท: การตีความและภาษาที่รวบรวม

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

PHP เป็นภาษาที่ตีความ คุณต้องมีโปรแกรมแยกต่างหากเพื่อใช้งานโค้ด PHP คอมพิวเตอร์ไม่ได้รันโปรแกรมโดยตรง โปรแกรมที่แยกต่างหากนั่นคือตัวแปล PHP นั้นเขียนด้วยตัวเองใน C

C # เป็นภาษาที่รวบรวม แต่ไม่ได้รวบรวมไปยังรหัสเครื่อง แต่จะรวบรวมเป็นภาษาผู้เชี่ยวชาญรหัสไบต์ที่จะทำงานบนเครื่องเสมือน Java เป็นอีกตัวอย่างหนึ่งของการตั้งค่าดังกล่าว คุณสามารถเห็นมันเป็นลูกผสมระหว่างการรวบรวมและการตีความที่ซึ่งเครื่องเสมือนเป็นล่าม เครื่องเสมือนสำหรับ C # (CLI หรือโครงสร้างพื้นฐานภาษาทั่วไป ) เขียนด้วย C ++

ตัวอย่างอื่น ๆ :

  • Python: Python interpreter รวบรวมรหัส Python เป็น Python bytecode จากนั้นตีความ bytecode ล่ามตัวเองจะถูกเขียนใน C. การใช้งานใหม่ได้ตั้งแต่รับการเพิ่มรวมทั้งคนหนึ่งที่รวบรวมหลามเพื่อให้ทำงานบน CLI เดียวกับที่ใช้สำหรับ C # เรียกว่าIronPythonและคนที่วิ่งบนเครื่องเสมือน Java, Jython ให้เสร็จสมบูรณ์วงกลมที่มีรุ่นหลามเขียนใน (ส่วนหนึ่งของ) งูหลามPyPy
  • Ruby: Ruby เริ่มต้นจากการตีความภาษาล้วนๆ แต่เวอร์ชั่นล่าสุดเปลี่ยนเป็นการใช้ bytecode สำหรับทับทิมเกินไปมีโครงการที่รวบรวมเพื่อ CLI ชื่อIronRuby , และหนึ่งสำหรับ Java VM, JRuby

ฉันขอโทษเครื่องเสมือนต่างจากล่ามอย่างไร ฉันไม่เห็นว่าการใช้อย่างใดอย่างหนึ่งเป็นจุดกึ่งกลางในการรวบรวม คุณกำลังบอกว่า bytecode รวบรวมครึ่ง
ฟิลิป

1
@Philip: รหัสไบต์ไม่ใช่รหัสเครื่อง ดังนั้นแทนที่จะให้ซีพียูด้วยคำสั่งโดยตรงคุณยังคงต้องการล่ามเพื่อรับโค้ดไบต์และแปลว่าแปลมันเป็นคำแนะนำของเครื่อง ข้อดีคือเครื่องเสมือนจะง่ายที่จะพอร์ตไปสถาปัตยกรรมอื่น ๆ และคุณสามารถใช้เทคนิคเช่นJIT รวบรวม
Martijn Pieters

ไม่มีใครรู้สึกเหมือนคำว่า "รวบรวม" ได้รับการเจือจางเพื่อวัตถุประสงค์ทางการตลาดหรือไม่
ฟิลิป

2
โว้ว! ฉันเอามันกลับมา ฉันกำลังเดินไปบนถนนที่ผิดที่นั่นครู่หนึ่ง ฉันสันนิษฐานว่า "รวบรวม" หมายถึงเปลี่ยนเป็นรหัสเครื่องและรหัสเครื่องเท่านั้นซึ่งไม่จริง มันเป็นเพียงคำศัพท์สำหรับการแปลโค้ดเป็นรหัสอื่น เป็นรหัสเครื่องรหัสไบต์หรือภาษาที่คุณต้องการ นอกจากนี้ยังมี PHP คอมไพเลอร์อยู่ด้วยดังนั้นคุณสามารถพูดได้ว่า "โดยทั่วไป" ตีความ
ฟิลิป

ยังเป็นแหล่งข้อมูลที่ดีอีกด้วย: youtube.com/watch?v=e4ax90XmUBc
อดัม

34

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

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

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

ปัจจัยสำหรับการตัดสินใจอาจเหมือนกับแอพพลิเคชั่นที่ซับซ้อนอื่น ๆ ประสิทธิภาพเป็นหนึ่งเดียว ความสามารถในการเขียนโค้ดที่สามารถเข้าถึงทรัพยากรของระบบได้โดยตรงอีกด้วย ดังนั้นในกรณีส่วนใหญ่จะต้องเป็นภาษาที่รวบรวม (แม้ว่าในทางทฤษฎีคุณสามารถเขียน Ruby interpreter ใน Python ได้) ความพร้อมใช้งานในระบบต่าง ๆ เป็นสิ่งสำคัญหากคุณต้องการให้ภาษาของคุณทำงานบน Linux, Win, OS X และอื่น ๆ


ไม่มีใครรู้ว่าทำไมฉันเห็น upvotes สามคำตอบในขณะที่โพสต์
thorsten müller

1
ฉันเห็นสี่ตอนนี้ แต่ฉันไม่แน่ใจว่าสิ่งที่คุณถาม? upvotes ปรากฏเร็วเกินไปหรือไม่ ถ้าเป็นเช่นนั้นตาจำนวนมากในคำถาม (สามคำตอบพร้อมกันเกือบ) และคำตอบของคุณเป็นสิ่งที่ดี
yannis

อืมใช่ บางทีฉันอาจบันทึกและแก้ไขแล้วบันทึกอีกครั้งและลืมเกี่ยวกับการบันทึกครั้งแรก (ฉันอายุมากขึ้น) สำหรับฉันมันดูเหมือนว่าฉันได้รับ upvotes สามครั้งแรกเมื่อฉันโพสต์
thorsten müller

@ thorstenmüller +1 สำหรับ "ไม่มีอะไรที่จะขัดขวางไม่ให้คุณเขียนล่ามใน C และไลบรารี่ใน C ++" ฉันแค่ถามคุณเกี่ยวกับเรื่องนี้ มีการใช้งานที่มีชื่อเสียงสำหรับสิ่งนี้ที่ล่าม / คอมไพเลอร์เป็นภาษาหนึ่งในขณะที่ห้องสมุดหลักอยู่ในภาษาอื่น?
Songo

@ thorstenmüllerฉันเคยเกิดขึ้นในบางครั้ง หากมีใครบางคนกำลังดูคำถามขณะที่คุณโพสต์จะมีข้อความเล็ก ๆ ว่า "คำตอบใหม่ได้รับการโพสต์" ภายในหนึ่งหรือสองวินาทีที่คุณกดปุ่มส่งเพื่อให้พวกเขาสามารถอ่านคำตอบทั้งหมดและอัปโหลดภายใน 10 วินาที จากการโพสต์ของคุณ นอกจากนี้การแก้ไขภายใน 5 นาทีหลังจากโพสต์คำตอบจะไม่ปรากฏในประวัติการแก้ไขซึ่งอาจทำให้คุณสับสนเล็กน้อยในส่วนของคุณ
Izkata

10

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

ที่กล่าวว่า "ภาษา A เขียนด้วยภาษา B" เป็นการใช้งานที่มากเกินไปสำหรับภาษาที่ทันสมัยที่สุด ถ้าเราใช้ Python เป็นตัวอย่างในขณะที่การใช้งานอ้างอิงCPythonนั้นถูกเขียนใน C มีการใช้งานที่เขียนในภาษาอื่นเช่นJython (เขียนใน Java), IronPython (เขียนใน C #), PyPy (writen ใน Python) CLPython (เขียนด้วย Common LISP), Stackless Python (เขียนด้วยภาษา C และ Python) และUnladen Swallow (เขียนด้วยภาษา C ++)

ภาษาการเขียนโปรแกรมเป็นคำจำกัดความและตามตัวอย่างของ Python แสดงว่าไม่มีข้อ จำกัด ใด ๆ เกี่ยวกับภาษาที่สามารถคอมไพเลอร์, ล่ามและไลบรารี่และแน่นอนว่ามันเป็นไปได้ที่ภาษาจะเขียนด้วยตัวเอง ผ่านกระบวนการที่เรียกว่าความร่วมมือ


2
ฉันจะไม่เรียก Psyco อีกการติดตั้งเนื่องจากมันทำงานเป็นส่วนเสริมของ CPython
Martijn Pieters

@MartijnPieters นอกจากนี้ยังเป็นโครงการที่ตายแล้วตามเว็บไซต์ของตน ลบออก
yannis

@YannisRizos ไม่ได้รับ Unladen Swallow ตายด้วยเช่นกัน ?
Andres F.

1
@Songo: นอกเหนือจากนั้นstring.lower(s)เป็นฟังก์ชั่นของ python ที่มอบหมายให้return s.lower()นั่นถูกต้อง การดำเนินการตัวพิมพ์เล็กของ CPython 3.3ถูกนำมาใช้ใน C.
Martijn Pieters


3

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

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


จุดที่น่าสนใจ ดังนั้นโดยทั่วไปถ้าฉันมีฟังก์ชั่นบิวท์อินใน PHP explodeซึ่งรับ a Stringและคืนค่าArrayมันการใช้งาน (เช่นโค้ดที่จะทำงานบนสตริงเพื่อสร้างอาร์เรย์) เขียนในCใช่ไหม?
Songo

@Songo: ถูกต้อง อีกครั้ง PHP เป็นเพียงโปรแกรมไม่แตกต่างจาก Word หรือ Apache หรือ Notepad หรือ vi หรือ emacs มันอ่านข้อมูลและวิเคราะห์ข้อมูลตามข้อกำหนดของภาษาจากนั้นทำทุกสิ่งที่ข้อกำหนดภาษาบอกว่าควรทำ
Bryan Oakley

คำตอบนี้ทำให้ภาษาสับสนเมื่อใช้งาน
Russell Borogove

ฉันคิดว่านี่เป็นคำตอบที่ง่ายที่สุดและตรงที่สุดและฉันไม่เห็นว่ามันสับสนอะไร มันยังชี้ให้เห็นว่าอาจมีการใช้งาน PHP มากกว่าหนึ่งครั้ง ในความเป็นจริงมีอยู่หลายอย่างที่เป็น PHP ดั้งเดิมและสิ่งที่ Facebook และอาจมีคนอื่น
Warren P

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

3

ประโยคที่คล้ายกันมากที่มีความหมายแตกต่างกันอย่างสิ้นเชิงคือ "การเขียนภาษา A ในภาษา B" เช่น "การเขียน C ใน Java"

สิ่งนี้อธิบายรหัสที่ถูกต้องทางไวยากรณ์ในภาษาหนึ่ง แต่ใช้โครงสร้างสำนวนและการประชุมจากภาษาอื่น ในตัวอย่าง "การเขียน C ใน Java" เครื่องหมายของสิ่งนี้จะประกาศตัวแปรท้องถิ่นทั้งหมดที่ด้านบนของแต่ละวิธีโดยใช้ค่าคงที่จำนวนเต็มแทน enums โดยใช้ identifiers_with_underscores เป็นต้น

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


"CPython เขียนด้วยภาษา C" ไม่ได้แปลว่า "ผู้ใช้รายนี้เขียนเป็น Python เหมือนกับ C" หมายความว่า CPython (Python.exe บน windows / usr / bin / python บน Unix) เขียนเป็น C
Warren P

@Warren P: แน่นอน แต่วลีนั้นคล้ายกันมากดังนั้นคนที่ไม่คุ้นเคยกับสิ่งใดสิ่งหนึ่งอาจจบลงที่นี่โดยมองหาคำอธิบาย
Michael Borgwardt

3

เทคโนโลยีเป็นกระบวนการที่เกิดขึ้นซ้ำ ๆ เราเริ่มต้นด้วยเครื่องมือง่ายๆแล้วใช้เครื่องมือเหล่านั้นเพื่อสร้างสิ่งที่ดีกว่า ภาษาแอสเซมบลีแรกนั้นแปลได้ค่อนข้าง 1: 1 ของคำสั่งมาตรฐานสำหรับชิป; สถาปัตยกรรม 8086 และแอสเซมเบลอร์ของมันโดดเด่นเหนือสถาปัตยกรรมอื่น ๆ เช่น Z80, RISC เป็นต้นดังนั้นเราจึงเริ่มพัฒนาภาษาที่สามารถย่อยได้เป็น 8086 แอสเซมบลีเช่น FORTRAN, COBOL, Pascal และ C. โปรแกรมที่ตีความซอร์สโค้ดของ ภาษาเหล่านี้จะต้องมีการเขียนในสิ่งดั้งเดิมมากขึ้นมิฉะนั้นคุณจะจบลงด้วยการโต้เถียงไก่และไข่; หากซอร์สโค้ดสำหรับคอมไพเลอร์ C ตัวแรกถูกเขียนด้วย C ดังนั้นอะไรที่คอมไพล์ซอร์สโค้ด C นั้นและโดยที่ไม่นิยามว่าจะเป็นคอมไพเลอร์ C ตัวแรก?

โดยทั่วไปควรเขียน "C # เป็น C ++" เพื่อแปลว่าคอมไพเลอร์ตัวแรกและ / หรือที่นิยมมากที่สุดและ runtime / core library ที่เชื่อฟังข้อกำหนดของภาษา C # (เหล่านั้นเป็น. NET Framework ของ Microsoft และคอมไพเลอร์บรรทัดคำสั่ง โปรแกรม CSC.exe) เขียนด้วยภาษา C ++


0

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


ไม่มีการนำ C ++ ไปใช้อย่างเป็นทางการ ในกรณีของ C ++ ข้อมูลจำเพาะนั้นถูกต้องและพฤติกรรมที่ไม่ได้กำหนดไว้ในข้อมูลจำเพาะอาจทำอะไรก็ได้ในการใช้งานของคุณ ดังนั้นไม่ถูกต้อง
Warren P

ฉันไม่เห็นความคิดเห็นก่อนหน้านี้เกี่ยวกับคำตอบของฉัน ฉันไม่ได้สร้างคำแถลงเชิงปริมาณที่ครอบคลุมเกี่ยวกับทุกภาษาดังนั้น C ++ counterexample จึงไม่สามารถใช้ได้ คำแถลงของแบบฟอร์ม "A ถูกเขียนใน B" โดยที่ A คือ "C ++" ไม่สมเหตุสมผลยกเว้นเมื่อ B คือ "อังกฤษ"
Kaz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.