อ่าน 5 นาที
ไบต์โค้ด
ไบต์โค้ด (เรียกอีกอย่างว่าโค้ดพกพาหรือp-code ) คือชุดคำสั่งที่ออกแบบมาเพื่อการประมวลผลที่มีประสิทธิภาพโดยตัวแปล ซอฟต์แวร์ ต่างจากซอร์สโค้ดที่มนุษย์อ่านได้ ไบต์โค้ดเป็นรหัสตัวเลข...
ไบต์โค้ด
| การดำเนินการตามโปรแกรม |
|---|
| แนวคิดทั่วไป |
| ประเภทของโค้ด |
| กลยุทธ์การรวบรวม |
| ระยะเวลาการวิ่งที่น่าสนใจ |
|
| คอมไพเลอร์และชุดเครื่องมือที่โดดเด่น |
ไบต์โค้ด (เรียกอีกอย่างว่าโค้ดพกพาหรือp-code ) คือชุดคำสั่งที่ออกแบบมาเพื่อการประมวลผลที่มีประสิทธิภาพโดยตัวแปล ซอฟต์แวร์ ต่างจากซอร์สโค้ดที่มนุษย์อ่านได้[ 1 ] ไบต์โค้ดเป็นรหัสตัวเลข ค่าคงที่ และการอ้างอิง (โดยปกติคือที่อยู่ตัวเลข) ที่กระชับ ซึ่งเข้ารหัสผลลัพธ์ของ การแยกวิเคราะห์ของ คอมไพเลอร์และดำเนินการวิเคราะห์ความหมายของสิ่งต่างๆ เช่น ประเภท ขอบเขต และระดับความลึกของการซ้อนของวัตถุโปรแกรม
ชื่อไบต์โค้ด (bytecode)มาจากชุดคำสั่งที่มี โอเปอเร ชันโค้ด (opcode) ขนาดหนึ่ง ไบต์ ตามด้วยพารามิเตอร์เสริมการแสดงผลระดับกลางเช่น ไบต์โค้ด อาจถูกสร้างขึ้นโดย การใช้งาน ภาษาโปรแกรม เพื่อช่วยให้ การตีความง่ายขึ้นหรืออาจใช้เพื่อลดการพึ่งพาฮาร์ดแวร์และระบบปฏิบัติการโดยอนุญาตให้โค้ดเดียวกันทำงานได้ข้ามแพลตฟอร์มบนอุปกรณ์ต่างๆ ไบต์โค้ดมักจะถูกประมวลผลโดยตรงบนเครื่องเสมือน ( เครื่อง p-codeหรือตัวแปลภาษา) หรืออาจถูกคอมไพล์เพิ่มเติมเป็นโค้ดเครื่องเพื่อประสิทธิภาพที่ดีขึ้น
เนื่องจากคำสั่งไบต์โค้ดได้รับการประมวลผลโดยซอฟต์แวร์ จึงอาจมีความซับซ้อนได้ตามอำเภอใจ แต่โดยทั่วไปแล้วมักจะคล้ายกับคำสั่งฮาร์ดแวร์แบบดั้งเดิม: เครื่องสแต็ก เสมือน เป็นประเภทที่พบได้บ่อยที่สุด แต่ก็มีการสร้างเครื่องรีจิสเตอร์ เสมือนขึ้นมาด้วยเช่นกัน [ 2 ] [ 3 ]ส่วนต่างๆ มักจะถูกจัดเก็บไว้ในไฟล์แยกต่างหาก คล้ายกับโมดูลออบเจ็กต์แต่จะถูกโหลดแบบไดนามิกในระหว่างการดำเนินการ
การประหารชีวิต
โปรแกรมไบต์โค้ดอาจถูกเรียกใช้งานโดยการแยกวิเคราะห์และ เรียกใช้คำสั่ง โดยตรงทีละคำสั่งตัวแปลไบต์โค้ด ประเภทนี้ พกพาได้ดีมาก ระบบบางระบบที่เรียกว่าตัวแปลแบบไดนามิก หรือ คอม ไพเลอร์แบบทันที (JIT) จะแปลไบต์โค้ดเป็นรหัสเครื่องตามความจำเป็นในขณะรันไทม์ซึ่งทำให้ฮาร์ดแวร์ของเครื่องเสมือนมีความเฉพาะเจาะจง แต่ไม่สูญเสียความสามารถในการพกพาของไบต์โค้ด ตัวอย่างเช่น โค้ด JavaและSmalltalkมักจะถูกจัดเก็บในรูปแบบไบต์โค้ด ซึ่งโดยทั่วไปจะถูกคอมไพล์แบบ JIT เพื่อแปลไบต์โค้ดเป็นรหัสเครื่องก่อนการเรียกใช้งาน ซึ่งจะทำให้เกิดความล่าช้าก่อนที่โปรแกรมจะทำงาน เมื่อไบต์โค้ดถูกคอมไพล์เป็นรหัสเครื่องดั้งเดิม แต่จะช่วยเพิ่มความเร็วในการทำงานอย่างมากเมื่อเทียบกับการตีความโค้ดต้นฉบับโดยตรง โดยปกติแล้วจะเร็วขึ้นประมาณหนึ่งลำดับ (10 เท่า) [ 4 ]
เนื่องจากข้อได้เปรียบด้านประสิทธิภาพ ปัจจุบันภาษาโปรแกรมหลายภาษาจึงประมวลผลโปรแกรมในสองขั้นตอน ขั้นแรกคือการคอมไพล์ซอร์สโค้ดเป็นไบต์โค้ด จากนั้นจึงส่งไบต์โค้ดไปยังเครื่องเสมือน มีเครื่องเสมือนแบบใช้ไบต์โค้ดสำหรับJava , Raku , Python , PHP , Tcl , mawk และ Forth ( อย่างไรก็ตาม Forth มักไม่ถูกคอมไพล์ผ่านไบต์โค้ดในลักษณะนี้ และเครื่องเสมือนของ Forthจึงเป็นแบบทั่วไปมากกว่า) การใช้งานของPerl และ Ruby 1.8ทำงานโดยการสำรวจ โครงสร้าง ต้นไม้ไวยากรณ์นามธรรมที่ได้มาจากซอร์สโค้ด
เมื่อไม่นานมานี้ ผู้เขียนV8 [ 1 ]และDart [ 7 ]ได้ท้าทายแนวคิดที่ว่าจำเป็นต้องมีไบต์โค้ดระดับกลางสำหรับการใช้งาน VM ที่รวดเร็วและมีประสิทธิภาพ การใช้งานภาษาทั้งสองนี้ในปัจจุบันทำการคอมไพล์ JIT โดยตรงจากซอร์สโค้ดเป็นโค้ดเครื่องโดยไม่มีไบต์โค้ดระดับกลาง[ 8 ]
ตัวอย่าง
- ActionScriptทำงานใน ActionScript Virtual Machine (AVM) ซึ่งเป็นส่วนหนึ่งของ Flash Player และAIR โดยทั่วไป แล้ว โค้ด ActionScript จะถูกแปลงเป็นรูปแบบไบต์โค้ดโดยคอมไพเลอร์ตัวอย่างของคอมไพเลอร์ ได้แก่ คอมไพเลอร์ที่ติดตั้งมาใน Adobe Flash Professional และคอมไพเลอร์ที่ติดตั้งมาใน Adobe Flash Builder และมีอยู่ในAdobe Flex SDK
- วัตถุAdobe Flash
- BANCStarเดิมทีเป็นไบต์โค้ดสำหรับเครื่องมือสร้างอินเทอร์เฟซ แต่ก็ถูกนำมาใช้เป็นภาษาโปรแกรมด้วยเช่นกัน
- ตัวกรองแพ็กเก็ตเบิร์กลีย์
- อีบีเอฟเอฟ
- เบิร์กลีย์ ปาสคาล[ 9 ]
- ไลบรารีวิศวกรรมไบต์โค้ด
- คอมไพเลอร์C เป็นJava เครื่องเสมือน
- CLISPซึ่งเป็นการใช้งานCommon Lispนั้น เคยคอมไพล์ได้เฉพาะไบต์โค้ดมานานหลายปี แต่ปัจจุบันนี้รองรับการคอมไพล์เป็นเนทีฟโค้ดได้ด้วยความช่วยเหลือของGNU Lightning
- CMUCLและ Scieneer ซึ่งเป็นโปรแกรม Common Lisp สามารถคอมไพล์ได้ทั้งเป็นโค้ดเนทีฟหรือไบต์โค้ด ซึ่งมีขนาดกะทัดรัดกว่ามาก
- ภาษา Common Intermediate Language (CIL)ทำงานโดยใช้Common Language Runtime (CLRUNC ) ซึ่งใช้ใน ภาษา .NETเช่นC#
- ไบต์โค้ด Dalvikซึ่งออกแบบมาสำหรับ แพลตฟอร์ม Androidจะถูกประมวลผลโดยเครื่องเสมือน Dalvik
- ไบต์โค้ด Dis ซึ่งออกแบบมาสำหรับระบบปฏิบัติการ Infernoจะถูกประมวลผลโดยเครื่องเสมือน Dis
- EiffelStudioสำหรับภาษาการเขียนโปรแกรมEiffel
- EM คือ เครื่องเสมือน Amsterdam Compiler Kitที่ใช้เป็นภาษาคอมไพล์ระดับกลางและเป็นภาษาไบต์โค้ดสมัยใหม่
- Emacsเป็นโปรแกรมแก้ไขข้อความที่มีฟังก์ชันส่วนใหญ่เขียนด้วยEmacs Lisp ซึ่งเป็นภาษา Lispที่ติดตั้งมาในตัวฟังก์ชันเหล่านี้ถูกคอมไพล์เป็นไบต์โค้ด สถาปัตยกรรมนี้ช่วยให้ผู้ใช้สามารถปรับแต่งโปรแกรมแก้ไขด้วยภาษาโปรแกรมระดับสูง ซึ่งหลังจากคอมไพล์เป็นไบต์โค้ดแล้วจะให้ประสิทธิภาพการทำงานที่เหมาะสม
- การใช้งาน Common Lisp แบบฝังตัวสามารถคอมไพล์เป็นไบต์โค้ดหรือโค้ดภาษาซี ได้
- Common Lispมี
disassembleฟังก์ชัน[ 10 ]ซึ่งพิมพ์โค้ดพื้นฐานของฟังก์ชันที่ระบุไปยังเอาต์พุตมาตรฐาน ผลลัพธ์ขึ้นอยู่กับการใช้งานและอาจแปลงเป็นไบต์โค้ดหรือไม่ก็ได้ การตรวจสอบสามารถนำไปใช้เพื่อวัตถุประสงค์ในการดีบักและการเพิ่มประสิทธิภาพ[ 11 ] ตัวอย่างเช่นSteel Bank Common Lisp ผลิตผลลัพธ์ดังนี้:
( disassemble ' ( lambda ( x ) ( print x ))) ; การแยกส่วนประกอบสำหรับ (LAMBDA (X)) ; 2436F6DF: 850500000F22 TEST EAX, [#x220F0000] ; จุดเริ่มต้นการแยกวิเคราะห์แบบไม่มีอาร์กิวเมนต์; E5: 8BD6 MOV EDX, ESI ; E7: 8B05A8F63624 MOV EAX, [#x2436F6A8] ; #<FDEFINITION object for PRINT> ; ED: B904000000 MOV ECX, 4 ; F2: FF7504 PUSH DWORD PTR [EBP+4] ; F5: FF6005 JMP DWORD PTR [EAX+5] ; F8: CC0A BREAK 10 ; กับดักข้อผิดพลาด; FA: 02 ไบต์ #X02 ; FB: 18 ไบต์ #X18 ; ข้อผิดพลาดจำนวนอาร์กิวเมนต์ไม่ถูกต้อง; FC: 4F ไบต์ #X4F ; ECX
- การใช้งาน Erlangของ Ericsson ใช้ไบต์โค้ด BEAM
- เครื่องเสมือนของEthereum (EVM) คือสภาพแวดล้อมการทำงานที่ใช้ไบต์โค้ดของตัวเองในการประมวลผลธุรกรรมใน Ethereum (สัญญาอัจฉริยะ)
- ภาษาการเขียนโปรแกรมIcon [ 12 ]และUnicon [ 13 ]
- Infocomใช้เครื่อง Zเพื่อทำให้แอปพลิเคชันซอฟต์แวร์ของตนพกพาได้สะดวกยิ่งขึ้น
- ไบต์โค้ดของ Javaซึ่งถูกประมวลผลโดยเครื่องเสมือน Java
- ไบต์โค้ด Keikoถูกใช้โดย ภาษาโปรแกรม Oberon-2เพื่อทำให้ภาษาโปรแกรมและระบบปฏิบัติการ Oberonพกพาได้สะดวกยิ่งขึ้น
- KEYBซึ่ง เป็นไดรเวอร์แป้นพิมพ์ MS-DOS / PC DOSพร้อมไฟล์ทรัพยากรKEYBOARD.SYSที่มีข้อมูลเค้าโครงและ ลำดับ p-code สั้นๆ ที่ดำเนินการโดยตัวแปลภายในไดรเวอร์ที่อยู่ภายใน[ 14 ] [ 15 ]
- LLVM IR
- LSL เป็นภาษาสคริปต์ที่ใช้ในโลกเสมือนจริง โดยจะคอมไพล์เป็นไบต์โค้ดที่ทำงานบนเครื่องเสมือน Second Life ใช้เวอร์ชัน Mono ดั้งเดิม ส่วน Inworldz พัฒนาเวอร์ชัน Phlox ขึ้นมา
- ภาษา Luaใช้เครื่องเสมือนไบต์โค้ดแบบใช้รีจิสเตอร์
- รหัส m ของภาษาMATLAB [ 16 ]
- Malbolgeเป็นภาษาเครื่องเฉพาะทาง สำหรับเครื่องเสมือนแบบไตรภาค (ternary virtual machine)
- โค้ด P ของ Microsoftที่ใช้ในVisual C++และVisual Basic
- แผนหลายแผน[ 17 ]
- รหัส OของภาษาโปรแกรมBCPL
- ภาษา OCamlสามารถคอมไพล์เป็นรูปแบบไบต์โค้ดขนาดกะทัดรัดได้ (โดยเลือกได้)
- p-codeของการใช้งานภาษาปาสคาล ใน UCSD Pascal
- เครื่องเสมือน Parrot
- Pick BASICหรือที่รู้จักกันในชื่อ Data BASIC หรือMultiValue BASIC
- สภาพแวดล้อม R สำหรับการคำนวณทางสถิติมีคอมไพเลอร์ไบต์โค้ดผ่านแพ็คเกจคอมไพเลอร์ ซึ่งปัจจุบันเป็นมาตรฐานใน R เวอร์ชัน 2.13.0 สามารถคอมไพล์ R เวอร์ชันนี้ได้เพื่อให้แพ็คเกจพื้นฐานและแพ็คเกจที่แนะนำใช้ประโยชน์จากสิ่งนี้[ 18 ]
- เกมผจญภัยพีระมิด 2000
- สคริปต์ Pythonจะถูกคอมไพล์เป็นภาษาไบต์โค้ดของ Python เมื่อถูกเรียกใช้งาน และไฟล์ที่คอมไพล์แล้ว (.pyc) จะถูกแคชไว้ในโฟลเดอร์ของสคริปต์นั้น
- สามารถวิเคราะห์และตรวจสอบโค้ดที่คอมไพล์แล้วได้โดยใช้เครื่องมือในตัวสำหรับการดีบักไบต์โค้ดระดับต่ำ เครื่องมือนี้สามารถเริ่มต้นใช้งานได้จากเชลล์ ตัวอย่างเช่น:
>>> import dis # "dis" - ตัวแยกส่วนประกอบของไบต์โค้ด Python เป็นคำย่อ>>> dis . dis ( 'print("Hello, World!")' ) 1 0 LOAD_NAME 0 (print) 2 LOAD_CONST 0 ('Hello, World!') 4 CALL_FUNCTION 1 6 RETURN_VALUE
- การนำ Scheme 48มาใช้โดยใช้ตัวแปลไบต์โค้ด
- ไบต์โค้ดของการใช้งานภาษาSmalltalk หลายรูปแบบ
- ตัวแปลภาษา Spinที่ติดตั้งอยู่ในไมโครคอนโทรลเลอร์Parallax Propeller
- เอน จินฐานข้อมูล SQLiteแปลงคำสั่ง SQL เป็นรูปแบบไบต์โค้ดเฉพาะ[ 19 ]
- แอปเปิ้ลสวีท16
- ทีซีแอล
- TIMIเป็นมาตรฐานที่ใช้โดยคอมไพเลอร์บนแพลตฟอร์มIBM i
- ไทนี่เบสิก
- Visual Basic for Applicationsคอมไพล์เป็นไบต์โค้ด
- Visual FoxProคอมไพล์เป็นไบต์โค้ด
- เว็บแอสเซมบลี
- YARVและRubiniusสำหรับRuby
- รหัส Z
- โอเปอเรเตอร์โค้ด Zend EngineสำหรับPHP
ดูเพิ่มเติม
- แพลตฟอร์มการประมวลผล – สภาพแวดล้อมที่ใช้ในการประมวลผลซอฟต์แวร์
- การแสดงผลระดับกลาง – โครงสร้างข้อมูลหรือรหัสที่ใช้โดยคอมไพเลอร์
- ระบบรันไทม์ – ระบบคอมพิวเตอร์ที่ให้พฤติกรรมที่จำเป็นต่อการรันโค้ด
หมายเหตุ
- ^ PHP มีการคอมไพล์แบบ just-in-timeใน PHP 8 [ 5 ] [ 6 ]และก่อนหน้านั้นแม้ว่าจะไม่ได้เปิดใช้งานในเวอร์ชันเริ่มต้น แต่ก็มีตัวเลือกเช่น HHVMสำหรับ PHP เวอร์ชันเก่ากว่า: แม้ว่าโอเปรนด์ของ PHPจะถูกสร้างขึ้นทุกครั้งที่โปรแกรมถูกเรียกใช้งาน และจะถูกตีความเสมอ ไม่ใช่คอมไพล์แบบ just-in-time
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ไบต์โค้ด
ไบต์โค้ด (เรียกอีกอย่างว่าโค้ดพกพาหรือp-code ) คือชุดคำสั่งที่ออกแบบมาเพื่อการประมวลผลที่มีประสิทธิภาพโดยตัวแปล ซอฟต์แวร์ ต่างจากซอร์สโค้ดที่มนุษย์อ่านได้ ไบต์โค้ดเป็นรหัสตัวเลข...
การประหารชีวิต
โปรแกรมไบต์โค้ดอาจถูกเรียกใช้งานโดยการแยกวิเคราะห์และ เรียกใช้คำสั่ง โดยตรง ทีละคำสั่ง ตัวแปลไบต์โค้ด ประเภทนี้ พกพาได้ดีมาก ระบบบางระบบที่เรียกว่าตัวแปลแบบไดนามิก หรือ คอม ไพเลอร์แบบทันที (JIT) จะแปลไบต์โค้ดเป็น รหัสเครื่อง ตามความจำเป็นในขณะ รันไทม์...
ตัวอย่าง
ActionScript ทำงานใน ActionScript Virtual Machine (AVM) ซึ่งเป็นส่วนหนึ่งของ Flash Player และ AIR โดยทั่วไป แล้ว โค้ด ActionScript จะถูกแปลงเป็นรูปแบบไบต์โค้ดโดย คอมไพเลอร์ ตัวอย่างของคอมไพเลอร์ ได้แก่ คอมไพเลอร์ที่ติดตั้งมาใน Adobe Flash Professional...
ดูเพิ่มเติม
ลองค้นหา คำว่า bytecode ใน Wiktionary ซึ่งเป็นพจนานุกรมออนไลน์ฟรี แพลตฟอร์มการประมวลผล – สภาพแวดล้อมที่ใช้ในการประมวลผลซอฟต์แวร์ การแสดงผลระดับกลาง – โครงสร้างข้อมูลหรือรหัสที่ใช้โดยคอมไพเลอร์ ระบบรันไทม์ – ระบบคอมพิวเตอร์ที่ให้พฤติกรรมที่จำเป็นต่อการรันโค้ด