นี่คือพอร์ตสคริปต์ VIM ของ 8cc ที่สร้างขึ้นบน ELVM กล่าวอีกนัยหนึ่งนี่คือคอมไพเลอร์ C ที่สมบูรณ์ซึ่งเขียนในสคริปต์ VIM
8cc เป็นคอมไพเลอร์ขนาดเล็กที่เขียนขึ้นอย่างดีสำหรับ x86_64 linux มันเป็น C11 ที่รับรู้และโฮสต์ตัวเอง
elvm เป็น e ดังนั้น l ang v irtual m achine ELVM retargets 8cc เพื่อปล่อยการเป็นตัวแทนระดับกลางของตัวเอง EIR ELVM รวบรวมรหัส C ลงใน EIR ด้วยการกำหนดเป้าหมาย 8CC เป็นส่วนหน้า จากนั้นแปล EIR เป็นเป้าหมายต่าง ๆ (Python, Ruby, C, Brainfxxk, Piet, Befunge, Emacs Lisp, ... ) ในแบ็กเอนด์ สถาปัตยกรรมคล้ายกับ LLVM งานนำเสนอนี้เป็นสิ่งที่ดีที่จะรู้สถาปัตยกรรม ELVM เพิ่มเติม (แม้ว่าเป็นภาษาญี่ปุ่น)
ELVM สามารถรวบรวมตัวเองเป็นเป้าหมายต่าง ๆ ดังนั้นฉันจึงเพิ่มแบ็กเอนด์ 'Vim Script' ใหม่และใช้เพื่อแปลรหัส C ของ 8cc เป็นสคริปต์ VIM
ตอนนี้ 8cc.vim เขียนด้วยสคริปต์ Vim บริสุทธิ์ 8cc.vim ประกอบด้วยส่วนหน้า (กำหนดเอง 8cc) และแบ็กเอนด์ (ELC) มันสามารถรวบรวมรหัส C ลงในสคริปต์ VIM และแน่นอนว่า VIM สามารถประเมินรหัสสคริปต์ VIM ที่สร้างขึ้นได้
โปรดทราบว่านี่เป็นโครงการของเล่น 8cc.vim ช้ากว่ามาก ใช้เวลา 824 (ส่วนหน้า: 430 + แบ็กเอนด์: 396) วินาทีในการรวบรวมโปรแกรม putchar() ที่ง่ายที่สุดใน MacBook Pro ต้นปี 2558 (2.7 GHz Intel Core i5) แต่จริงๆแล้วมันใช้งานได้!
เมื่อ VM ทำงานบน VIM Script, 8cc.vim ทำงานบน Windows Linux, OS X และ (หวังว่า)
โปรดโคลนที่เก็บนี้และ :packadd (โปรดดู :help pack-add )
หรือโปรดใช้ Plugin Manager ที่คุณชื่นชอบ (vim-plug, dein.vim และอื่น ๆ )
:EccCompile:EccRuneightcc#compile()eightcc#run()เตรียมรหัส C ของคุณในบัฟเฟอร์ปัจจุบัน ต่อไปนี้เป็นตัวอย่าง 'Hello World'
int putchar ( int x );
int main () {
const char * p = "Hello, world!n" ;
for (; * p ; p ++ )
putchar ( * p );
return 0 ;
} จากนั้นดำเนินการ :EccCompile โปรดทราบว่าคุณสามารถใช้หลายตัวเลือกเช่น --verbose สำหรับสิ่งนี้ โปรดดู :EccCompile --help ช่วยเหลือรายละเอียดเพิ่มเติม
ใช้เวลานาน 20 นาทีขึ้นไป มาพักผ่อนกันเถอะและได้รับ☕
เป็นผลให้บัฟเฟอร์ใหม่ถูกเปิดด้วยรหัสสคริปต์ VIM ซึ่งรวบรวมจากรหัส C โหลดโดย :w putchar.vim และ :source putchar.vim
ในที่สุดเรียกใช้รหัสสคริปต์ VIM ด้านล่างด้วยมือของคุณ โค้ดที่รวบรวมจะทำงานบน VM บนสคริปต์ VIM ฟังก์ชั่น SetupVM() สร้างอินสแตนซ์ VM
:let vm = SetupVM()
:call vm.run()
หากคุณต้องการดูเฉพาะผลลัพธ์ของการเรียกใช้สคริปต์ VIM คุณสามารถใช้ :EccRun เพื่อข้ามกระบวนการด้านบน
สอดคล้องกับ :EccCompile และ :EccRun คุณสามารถใช้ฟังก์ชั่น eightcc#compile() และ eightcc#run() พวกเขาสามารถใช้พจนานุกรมหนึ่งตัวสำหรับตัวเลือกการดำเนินการ
ใบอนุญาต MIT
ลิขสิทธิ์ (c) 2016 Rhysd
ได้รับอนุญาตโดยไม่ต้องเสียค่าใช้จ่ายสำหรับบุคคลใด ๆ ที่ได้รับสำเนาซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") เพื่อจัดการในซอฟต์แวร์โดยไม่มีการ จำกัด รวมถึง แต่ไม่ จำกัด เฉพาะสิทธิ์ในการใช้สำเนาดัดแปลงผสานเผยแพร่เผยแพร่
ประกาศลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ ไม่ว่าโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เฉพาะการรับประกันความสามารถในการค้าการออกกำลังกายสำหรับวัตถุประสงค์เฉพาะและการไม่เข้าร่วม ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดชอบต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นการกระทำของสัญญาการละเมิดหรืออื่น ๆ ที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือการติดต่ออื่น ๆ ในซอฟต์แวร์