เมื่อมีคนเขียนภาษาการเขียนโปรแกรมใหม่สิ่งที่พวกเขาเขียนมันคืออะไร?


162

โปรดแก้ตัวด้วยความเขลาของฉัน ฉันกำลังเล่นน้ำใน PHP และทำให้เท้าของฉันเปียกหมาด ๆ ดังนั้นฉันรู้สึกถูกบังคับให้ถามคำถามที่ฉันสงสัยมาหลายปีแล้ว:

เมื่อคุณเขียนภาษาโปรแกรมใหม่ทั้งหมดคุณจะเขียนภาษาอะไร

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

ด้วยสติปัญญาที่อ่อนแอของฉันฉันพบว่าสิ่งนี้น่าทึ่ง ... ได้โปรดสอนฉันด้วย!

คำตอบ:


193

มันไม่ใช่คำถามที่โง่ มันเป็นคำถามที่ยอดเยี่ยม

ดังที่ได้ตอบไปแล้วคำตอบสั้น ๆ คือ "ภาษาอื่น"

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

แต่คุณสามารถผลักมันกลับไปได้อีก เกี่ยวกับโปรแกรมแรกที่เคยเขียน?

ตัวแปลภาษาตัวแรกสำหรับ "ภาษาระดับสูง" จะถูกเขียนในภาษาที่เรียกว่า "ภาษาแอสเซมบลี" ภาษาแอสเซมบลีเป็นภาษาที่แต่ละคำสั่งในภาษาสอดคล้องกับคำสั่งเดียวกับ CPU มันเป็นภาษาระดับต่ำมากและ verbose มากและใช้แรงงานมากในการเขียน

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

แต่มันก็ยังไม่จบ แม้แต่ไฟล์ที่มีตัวเลขเพียงดิบก็ยังต้องการการแปล คุณยังคงต้องรับตัวเลขดิบเหล่านั้นในไฟล์ลงในคอมพิวเตอร์

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

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


20
+1 ฉันคิดว่าคำตอบนี้เหมาะกับวิญญาณของคำถาม
stderr

30
ฉันเคยเข้าชั้นเรียน Assembler II และศาสตราจารย์ถามว่าทำไมเราถึงเลือกวิชาเลือก ฉันไปเพื่อคำตอบที่ตลก: "เพราะฉันต้องการ A. ง่าย" คิดว่าฉันมีคำตอบที่ดีที่สุด แต่เรามีโรงงาน Honeywell ในเมืองและคนต่อไปบอกว่า "ฉันเขียนไมโครโค้ดทุกวันและฉันต้องการเรียนรู้ภาษาระดับสูง"
T.Rob

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

คอมพิวเตอร์มีการพัฒนาเช่นเดียวกับมนุษย์แม้ว่าจะมีเวลาน้อยมาก
Gaurav Ojha

ตอนนี้จะเป็นความคิดเห็นที่ไม่เป็นรูปธรรม แต่มันจะต้องมีการเขียน ... นี่คือคำตอบที่ยอดเยี่ยมในทุกรูปแบบและข้อมูล :-)
LukášŘádek

23

Cคำตอบที่พบมากที่สุดคือ ภาษาส่วนใหญ่จะดำเนินการใน C หรือไฮบริดของ C ที่มีการเรียกกลับและ "lexer" เช่นFlexและเครื่องกำเนิดไฟฟ้า parser เช่นYACC เหล่านี้เป็นภาษาที่ใช้สำหรับวัตถุประสงค์เดียว - เพื่ออธิบายไวยากรณ์ของภาษาอื่น บางครั้งเมื่อพูดถึงภาษาที่คอมไพล์พวกเขาจะถูกนำมาใช้ครั้งแรกในซีจากนั้นเวอร์ชันแรกของภาษาจะถูกใช้เพื่อสร้างเวอร์ชันใหม่และอื่น ๆ (เช่นHaskell )


1
บางภาษาเขียนด้วยแอสเซมเบลอร์เช่น picolisp ( blog.kowalczyk.info/article/picoLisp-Arc-before-Arc.html )
Prof. Falken

1
โปรแกรมเกี่ยวกับ lex / yacc (flex / bison) คืออะไร? สิ่งเหล่านี้ถือเป็นข้อมูลเพิ่มเติมสำหรับการสร้างภาษาใน C หรือไม่
เดฟ

1
คุณมีอะไรที่จะพิสูจน์คำตอบที่พบบ่อยที่สุดคือ C หรือไม่?
RichardOD

ฉันเริ่มอ่านรายการที่นี่: google.com/Top/Computers/Programming/Language/Open_Source จากนั้นฉันปิดหน้าต่างตัวแก้ไขโดยไม่ได้ตั้งใจที่ภาษาประมาณ 10 โดยไม่ตั้งใจและขาดแรงจูงใจที่จะผ่าน อย่างไรก็ตามประมาณครึ่งหนึ่งถูกนำมาใช้ใน C และส่วนที่เหลือส่วนใหญ่ bootstrapping กับตัวเอง
ศ. Falken

3
ฉันคิดว่าคุณต้องพูดถึง Lex / Yacc (หรือทางเลือก) โดยทั่วไปแล้วจะไม่เริ่มเขียนภาษาใน C แต่ใช้ตัว lexer และ parser ซึ่งรองรับด้วยรหัส C
Steve Rowe

14

จำนวนมากของภาษา bootstrapped- ที่เขียนในตัวเอง ว่าทำไมคุณต้องการที่จะทำเช่นนี้ก็มักจะเป็นความคิดที่ดีที่จะกินลองใช้ของคุณเอง

บทความวิกิพีเดียผมหมายถึงการกล่าวถึงในไก่ไข่และปัญหา ฉันคิดว่าคุณจะพบว่ามันน่าสนใจมาก


5
ซึ่งเป็นไปไม่ได้เมื่อคุณเพิ่งเริ่ม
Michael Borgwardt

1
ใช่แน่นอน แต่หลายภาษาเขียนด้วยวิธีนี้เมื่อเป็นไปได้ ฉันต้องการชี้ให้เห็นว่าไม่มีใครมีและฉันรู้สึกว่ามันเป็นจุดสำคัญ
RichardOD

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

@ Les- ใช่ bootstrapping เป็นแนวคิดที่น่าสนใจ
RichardOD

2
แสดงความคิดเห็นแบบสุ่มที่นี่ คำตอบสำหรับคำถามเก่าที่ว่าใครมาก่อน (ไก่หรือไข่) คือไก่มาก่อน เหตุผลคือการทำซ้ำ / ทำซ้ำบางสิ่งคุณต้องมีตัวจำลอง / ตัวจำลองก่อนแล้วจึงจะทำซ้ำ / ทำซ้ำ
SpicyWeenie

10

แทบทุกภาษา แต่การใช้ภาษาที่เหมาะสมกับการทำงานกับกราฟและโครงสร้างข้อมูลที่ซับซ้อนอื่น ๆ จะทำให้ง่ายขึ้น คอมไพเลอร์การผลิตมักจะเขียนใน C หรือ C ++ ด้วยเหตุผลด้านประสิทธิภาพ แต่ภาษาเช่น OCaml, SML, Prolog และ Lisp นั้นดีกว่าสำหรับการสร้างต้นแบบภาษา

นอกจากนี้ยังมี "ภาษาเล็ก ๆ น้อย ๆ " จำนวนมากที่ใช้ในการออกแบบภาษา Lex และ yacc ใช้สำหรับระบุไวยากรณ์และไวยากรณ์เช่นและรวบรวมเป็น C (มีพอร์ตสำหรับภาษาอื่นเช่น ocamllex / ocamlyacc และเครื่องมืออื่นที่คล้ายคลึงกัน)

เป็นกรณีพิเศษภาษา Lisp ใหม่มักจะถูกสร้างขึ้นในการใช้งาน Lisp ที่มีอยู่เนื่องจากพวกเขาสามารถ piggyback บนโครงสร้างพื้นฐานส่วนใหญ่เดียวกัน การเขียนล่าม Scheme สามารถทำได้ใน Scheme ในหน้ารหัสซึ่งจุดหนึ่งสามารถเพิ่มคุณสมบัติใหม่ได้อย่างง่ายดาย

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


4

จริงๆแล้วคุณสามารถเขียนได้เกือบทุกภาษาที่คุณต้องการ ไม่มีอะไรที่ป้องกันคุณจากการเขียนคอมไพเลอร์ C ใน Ruby "ทั้งหมด" ที่คุณต้องทำคือแยกวิเคราะห์โปรแกรมและปล่อยรหัสเครื่องที่เกี่ยวข้อง หากคุณสามารถอ่าน / เขียนไฟล์ภาษาการเขียนโปรแกรมของคุณอาจพอเพียง

หากคุณเริ่มต้นจากศูนย์ในแพลตฟอร์มใหม่คุณสามารถทำการคอมไพล์ข้าม: เขียนคอมไพเลอร์สำหรับแพลตฟอร์มใหม่ของคุณที่ทำงานใน Java หรือตามปกติบน x86 พัฒนาบนพีซีของคุณจากนั้นโอนย้ายโปรแกรมไปยังแพลตฟอร์มเป้าหมายใหม่ของคุณ

คอมไพเลอร์พื้นฐานที่สุดน่าจะเป็น Assembler และ C


อย่างไรก็ตามภาษา "any" นี้ควรรองรับการโทรซ้ำ มิฉะนั้นการใช้ตัววิเคราะห์ไวยากรณ์และตัวแยกวิเคราะห์จะเป็นความท้าทายที่แท้จริง

2
หากคุณเลือกภาษาที่ไม่เหมาะสมสำหรับงานนั่นเป็นความผิดของคุณเอง สิ่งนี้สามารถเกิดขึ้นได้สำหรับโครงการใด ๆ ไม่ใช่เพียงแค่คอมไพเลอร์ / ล่าม
ziggystar

4

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

นักแปลป้อนโปรแกรมในภาษาหนึ่งและส่งเอาต์พุตโปรแกรมที่เทียบเท่าในภาษาอื่น ล่ามป้อนข้อมูลโปรแกรมในบางภาษาและเรียกใช้

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

หลายภาษามีการใช้งานที่แตกต่างกัน ตัวอย่างเช่นjavacเป็นนักแปลที่แปลงซอร์สโค้ด Java เป็น JVM bytecode JVM เป็นล่าม [1] ที่รัน Java bytecode หลังจากที่คุณเรียกใช้javacและรับ bytecode คุณไม่ต้องการjavacอีกต่อไป อย่างไรก็ตามเมื่อใดก็ตามที่คุณต้องการเรียกใช้โปรแกรมของคุณคุณจะต้องมี JVM

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

[1] JVM ส่วนใหญ่ทำการแปลเบื้องหลัง แต่จริงๆแล้วพวกเขาไม่ใช่นักแปลเพราะอินเตอร์เฟสกับ JVM ไม่ใช่ "ภาษาอินพุต -> ภาษาเอาต์พุต"


3

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


2
คุณไม่จำเป็นต้องรวบรวมรหัสเครื่อง มันเป็นภาษาพื้นเมืองของ CPU โดยการกำหนด
Stu Thompson

1
จริง สิ่งที่ฉันหมายถึงคือ "รวบรวมรหัสเครื่องจากภาษาแอสเซมบลีหรือสิ่งที่คล้ายกันด้วยมือ" ฉันอาจจะผิด แต่ฉันเดาว่ามีเพียงไม่กี่คนที่พิมพ์รหัสเป็นเลขฐานสอง / ฐานสิบหกทันที
Kaivosukeltaja

2

หลายภาษาถูกเขียนครั้งแรกในภาษาอื่นที่มีอยู่แล้วนำมาใช้ใหม่ในตัวเองและ bootstrapped ด้วยวิธีนั้น (หรือเพียงแค่ทำให้การใช้งานในภาษาต่างประเทศเช่น PHP และ Perl) แต่บางภาษาเช่นแอสเซมเบลอร์แรกถูกคอมไพล์ คอมไพเลอร์ C แรกถูกคอมไพล์ไปยังแอสเซมบลี

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

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

Edmund Grimley Evans ทำสิ่งที่คล้ายกับ ภาษา HEX ของเขา

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


1

โดยทั่วไปจะมีภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไปที่เหมาะสมสำหรับการพัฒนาระบบเช่น C, Haskell, ML, Lisp เป็นต้น แต่รายการตัวเลือกนั้นยาว นอกจากนี้มักจะมีภาษาเฉพาะโดเมนบางอย่างสำหรับการใช้ภาษาเช่นตัวแยกวิเคราะห์และตัวสร้างคำศัพท์ภาษากลางเช่นLLVMเป็นต้นและอาจเป็นเชลล์สคริปต์บางตัวกรอบการทดสอบและระบบกำหนดค่าการสร้างเช่น autoconf


1

คอมไพเลอร์ส่วนใหญ่เป็น wriiten C หรือ ac เช่นโปรแกรมถ้าไม่ใช่ c ดังนั้นแอสเซมบลี lang เป็นวิธีที่จะไปอย่างไรก็ตามเมื่อเขียน lang ใหม่จากศูนย์และคุณไม่มี lib lib หรือซอร์สโค้ดจากภาษาต้นแบบคุณต้องกำหนดฟังก์ชันของคุณเอง ตอนนี้ในภาษาใด คุณสามารถเขียน Form "ของซอร์สโค้ดที่เรียกว่า psedocode ไปยังเครื่องที่ดูเหมือนไวยากรณ์ bnf จาก object oriented Structured lang spec เช่น Fortran Basic algo lisp ดังนั้นภาพการเขียนรหัสไขว้คล้ายกับไวยากรณ์ภาษาเหล่านี้นั่นคือรหัส psedo


1
ฉันไม่เชื่อว่ารหัส psedo ควรอ่านได้จากเครื่อง
Richard Tingle

0

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


0

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

สิ่งพื้นฐานที่คุณควรรู้คือคอมไพเลอร์ทำงานอย่างไรเมื่อมีการเรียกใช้โค้ดขนาดสั้น คอมไพเลอร์มีเฟสจำนวนมากเช่นการวิเคราะห์คำ, การวิเคราะห์ความหมาย, AST (Abstract Syntax Tree) เป็นต้น

สิ่งที่ฉันทำในภาษาใหม่ของฉันสามารถพบได้ที่นี่ - http://www.singhajit.com/writing-a-new-programming-language/

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


0

ภาษาการเขียนโปรแกรมทั่วไปคืออะไร

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

เช่นถ้าเรามีคำสั่งเช่น:

11001101

ในการชุมนุมมันจะถูกเรียกว่า:

LOAD_A 15

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

แต่เมื่อคอมพิวเตอร์ได้รับการปรับปรุงทุกวันมีที่ว่างสำหรับโปรแกรมที่ซับซ้อนมากขึ้นพร้อมคำแนะนำเพิ่มเติมพูด 10,000

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

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

ดังนั้นสมมติว่าคุณบรรจุรหัสที่แตกต่างกันจำนวนมากในไพ ธ อนและสร้างโมดูล (libray, แพ็คเกจหรือสิ่งใดก็ตามที่คุณต้องการเรียกใช้) และคุณเรียกโมดูลนั้นว่า mgh (แค่ชื่อของฉัน) ตอนนี้สมมติว่าเราได้สร้าง mgh นี้อย่างใดที่ผู้ใดพูดว่า:

import mgh
mgh.connect(ip,port.data)...

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

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

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

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

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