มาโคร (วิทยาการคอมพิวเตอร์)

ในการเขียนโปรแกรมคอมพิวเตอร์มาโคร(ย่อมาจาก " คำสั่งมาโคร "; มาจากภาษากรีกμακρο - ' ยาว, ใหญ่' [ 1 ] ) คือกฎหรือรูปแบบ ที่ระบุว่าควร แมปอินพุตบางอย่างไปยังเอาต์พุตทดแทนอย่างไร การใช้มาโครกับอินพุตเรียกว่า การ ขยายมาโคร
อินพุตและเอาต์พุตอาจเป็นลำดับของโทเค็นคำศัพท์หรืออักขระหรือโครงสร้างต้นไม้ทางไวยากรณ์โปรแกรมแอปพลิเคชันรองรับมาโครอักขระเพื่อให้เรียกใช้ ลำดับ คำสั่ง ทั่วไปได้ง่าย ภาษา โปรแกรมบางภาษารองรับมาโครโทเค็นและต้นไม้เพื่อช่วยให้สามารถนำโค้ดกลับมาใช้ใหม่หรือขยายภาษาได้ บางครั้งใช้สำหรับภาษาเฉพาะด้าน
มาโครถูกใช้เพื่อทำให้ลำดับของคำสั่งการคำนวณพร้อมใช้งานสำหรับโปรแกรมเมอร์ในรูปแบบคำสั่งโปรแกรม เดียว ทำให้งานเขียนโปรแกรมไม่น่าเบื่อและมีโอกาสเกิดข้อผิดพลาดน้อยลง[ 2 ] [ 3 ]ดังนั้นจึงเรียกว่า "มาโคร" เพราะบล็อกโค้ด "ขนาดใหญ่" สามารถขยายได้จากลำดับอักขระ "ขนาดเล็ก" มาโครมักอนุญาตให้ใช้พารามิเตอร์ตำแหน่งหรือคำหลักที่กำหนดสิ่งที่ โปรแกรม แอสเซมเบลอร์แบบมีเงื่อนไขสร้างขึ้น และถูกใช้เพื่อสร้างโปรแกรม ทั้งหมด หรือชุดโปรแกรมตามตัวแปรต่างๆ เช่นระบบปฏิบัติการแพลตฟอร์มหรือปัจจัยอื่นๆ คำนี้มาจาก "คำสั่งมาโคร" และการขยายดังกล่าวเดิมใช้ในการสร้างโค้ดภาษาแอสเซมบลี
มาโครแป้นพิมพ์และเมาส์
มาโครแป้นพิมพ์และมาโครเมาส์ช่วยให้ลำดับการกดแป้นพิมพ์และการกระทำของเมาส์สั้นๆ สามารถแปลงเป็นลำดับการกดแป้นพิมพ์และการกระทำของเมาส์อื่นๆ ซึ่งโดยปกติแล้วจะใช้เวลานานกว่า ด้วยวิธีนี้ ลำดับการกดแป้นพิมพ์และการเคลื่อนไหวของเมาส์ที่ใช้บ่อยหรือซ้ำๆ สามารถทำให้เป็นอัตโนมัติได้โปรแกรมแยกต่างหากสำหรับการสร้างมาโครเหล่านี้เรียกว่าเครื่องบันทึกมาโคร[ 4 ]
ในช่วงทศวรรษ 1980 โปรแกรมมาโคร – เดิมทีคือSmartKeyจากนั้นก็ SuperKey, KeyWorks และ Prokey – ได้รับความนิยมอย่างมาก โดยเริ่มแรกใช้เป็นเครื่องมือในการจัดรูปแบบบทภาพยนตร์ โดยอัตโนมัติ จากนั้นก็ใช้สำหรับงานป้อนข้อมูลของผู้ใช้หลากหลายประเภท โปรแกรมเหล่านี้ใช้ โหมดการทำงานแบบ "สิ้นสุดแล้วคงอยู่"และนำไปใช้กับการป้อนข้อมูลจากแป้นพิมพ์ทั้งหมด ไม่ว่าจะอยู่ในบริบทใดก็ตาม อย่างไรก็ตาม โปรแกรมเหล่านี้เริ่มล้าสมัยไปบ้างแล้วหลังจากการมาถึงของอินเทอร์เฟซผู้ใช้ที่ใช้เมาส์ และการมีมาโครแป้นพิมพ์และเมาส์ในแอปพลิเคชันต่างๆ เช่นโปรแกรมประมวลผลคำและสเปรดชีตทำให้สามารถสร้างมาโครแป้นพิมพ์ที่ไวต่อแอปพลิเคชันได้
สามารถใช้มาโครแป้นพิมพ์ในเกมเล่นบทบาทออนไลน์แบบผู้เล่นหลายคนจำนวนมาก (MMORPG) เพื่อทำงานซ้ำๆ แต่ได้ผลตอบแทนสูง จึงทำให้สะสมทรัพยากรได้ เนื่องจากทำโดยไม่ต้องใช้ความพยายามของมนุษย์ จึงอาจทำให้ระบบเศรษฐกิจของเกมเสียสมดุล ด้วยเหตุนี้ การใช้มาโครจึงเป็นการละเมิดTOSหรือEULAของ MMORPG ส่วนใหญ่ และผู้ดูแลระบบจะใช้ความพยายามอย่างมากในการปราบปราม[ 5 ]
มาโครแอปพลิเคชันและการเขียนสคริปต์
มาโครแป้นพิมพ์และเมาส์ที่สร้างขึ้นโดยใช้คุณสมบัติมาโครในตัวของแอปพลิเคชันบางครั้งเรียกว่ามาโครแอปพลิเคชัน มาโครเหล่านี้สร้างขึ้นโดยการดำเนินการตามลำดับเพียงครั้งเดียวและให้แอปพลิเคชันบันทึกการกระทำ ภาษาการเขียนโปรแกรมมาโครพื้นฐาน ซึ่งโดยทั่วไปคือภาษาสคริปต์อาจมีอยู่ด้วย ซึ่งสามารถเข้าถึงคุณสมบัติของแอปพลิเคชันได้โดยตรง[ 6 ]
โปรแกรมแก้ไขข้อความ Emacs (ย่อมาจาก "editing macros") ของโปรแกรมเมอร์ได้นำแนวคิดนี้ไปสู่ข้อสรุป ในทางปฏิบัติ โปรแกรมแก้ไขส่วนใหญ่ประกอบด้วยมาโคร Emacs ถูกคิดค้นขึ้นมาในตอนแรกเป็นชุดมาโครในภาษาแก้ไขTECOต่อมาได้มีการพอร์ตไปยังภาษาLispต่างๆ[ 7 ]
โปรแกรมแก้ไขข้อความสำหรับโปรแกรมเมอร์อีกโปรแกรมหนึ่งคือVim (ซึ่งเป็นโปรแกรมที่พัฒนาต่อยอดมาจากvi ) ก็มีการใช้งานมาโครแป้นพิมพ์เช่นกัน โดยสามารถบันทึกสิ่งที่ผู้ใช้พิมพ์บนแป้นพิมพ์ลงในรีจิสเตอร์ (มาโคร) และสามารถเล่นซ้ำหรือแก้ไขได้เหมือนกับ มาโคร VBAสำหรับ Microsoft Office นอกจากนี้ Vim ยังมีภาษาสคริปต์ที่เรียกว่าVimscript [ 8 ]สำหรับสร้างมาโครอีก ด้วย
Visual Basic for Applications (VBA) เป็นภาษาโปรแกรมที่รวมอยู่ในMicrosoft Officeตั้งแต่ Office 97 ถึง Office 2019 (แม้ว่าจะมีอยู่ในบางส่วนประกอบของ Office ก่อน Office 97 ก็ตาม) อย่างไรก็ตาม ฟังก์ชันของ VBA ได้พัฒนาและเข้ามาแทนที่ภาษามาโครที่เคยรวมอยู่ในแอปพลิเคชันเหล่านั้นแต่เดิม
XEDITซึ่งทำงานบน ส่วนประกอบ Conversational Monitor System (CMS) ของVMรองรับมาโครที่เขียนด้วยEXEC , EXEC2และREXXและคำสั่ง CMS บางคำสั่งเป็นตัวห่อหุ้มมาโครของ XEDIT Hessling Editor (THE) ซึ่งเป็นโคลนบางส่วนของ XEDIT รองรับมาโคร Rexx โดยใช้ Regina และ Open Object REXX (oorexx) แอปพลิเคชันทั่วไปจำนวนมาก และบางแอปพลิเคชันบนพีซี ใช้ Rexx เป็นภาษาสคริปต์[ 9 ]
ไวรัสมาโคร
VBAสามารถเข้าถึงการเรียกใช้ระบบส่วนใหญ่ของ Microsoft Windowsและจะทำงานเมื่อเปิดเอกสาร ทำให้การเขียนไวรัสคอมพิวเตอร์ใน VBA ซึ่งโดยทั่วไปเรียกว่าไวรัสมาโคร ทำได้ค่อนข้างง่าย ในช่วงกลางถึงปลายทศวรรษ 1990 ไวรัสประเภทนี้กลายเป็นหนึ่งในไวรัสคอมพิวเตอร์ที่พบได้บ่อยที่สุด อย่างไรก็ตาม ในช่วงปลายทศวรรษ 1990 จนถึงปัจจุบันMicrosoftได้ทำการแก้ไขและอัปเดตโปรแกรมของตนอย่างต่อเนื่องนอกจากนี้ โปรแกรมป้องกันไวรัสในปัจจุบันยังสามารถต่อต้านการโจมตีดังกล่าวได้ทันที
มาโครแบบมีพารามิเตอร์และไม่มีพารามิเตอร์
มาโครแบบมีพารามิเตอร์ คือ มาโครที่สามารถแทรกอ็อบเจ็กต์ที่กำหนดเข้าไปในการขยายของมัน ได้ซึ่งทำให้มาโครมีพลังบางอย่างคล้ายกับฟังก์ชัน
ตัวอย่างง่ายๆ ในภาษาการเขียนโปรแกรม Cคือ มาโครทั่วไปที่ไม่ใช่มาโครที่มีพารามิเตอร์ กล่าวคือมาโครที่ไม่มีพารามิเตอร์ :
#define PI 3.14159
สิ่งนี้ทำให้PIต้องถูกแทนที่ด้วยเสมอ3.14159ไม่ว่าจะปรากฏที่ใดก็ตาม ในทางกลับกัน ตัวอย่างของมาโครแบบมีพารามิเตอร์คือดังนี้:
#define pred(x) ((x)-1)
ผลลัพธ์ของการขยายมาโครนี้ขึ้นอยู่กับค่าอาร์กิวเมนต์xที่ส่งเข้ามา ตัวอย่างการขยายที่เป็นไปได้มีดังนี้:
pred(2) → ((2) -1) pred(y+2) → ((y+2) -1) pred(f(5)) → ((f(5))-1)
มาโครแบบมีพารามิเตอร์เป็นกลไกที่มีประโยชน์ในระดับซอร์สโค้ดสำหรับการขยายแบบอินไลน์แต่ในภาษาอย่างเช่นภาษาซีซึ่งใช้การแทนที่ข้อความแบบง่ายๆ มาโครเหล่านี้มีข้อเสียร้ายแรงหลายประการเมื่อเทียบกับกลไกอื่นๆ สำหรับการขยายแบบอินไลน์ เช่นฟังก์ชันแบบอินไลน์
ในทางกลับกันมาโครแบบพารามิเตอร์ที่ใช้ในภาษาต่างๆ เช่นLisp , PL/IและScheme นั้นมีประสิทธิภาพมากกว่ามาก สามารถตัดสินใจได้ว่าจะสร้างโค้ดแบบใดโดยพิจารณาจากอาร์กิวเมนต์ ดังนั้นจึงสามารถใช้ในการ สร้างโค้ดขณะรันไทม์ได้ อย่างมีประสิทธิภาพ
มาโครการแทนที่ข้อความ
ภาษาโปรแกรม เช่นCและภาษาแอสเซมบลี บางภาษา มีระบบมาโครพื้นฐาน ซึ่งถูกนำมาใช้ในรูปแบบของพรีโปรเซสเซอร์สำหรับคอมไพเลอร์หรือแอสเซมเบลอร์ มาโคร พรีโปรเซสเซอร์ของภาษา Cทำงานโดยการแทนที่ข้อความอย่างง่ายที่ ระดับ โทเค็นแทนที่จะเป็นระดับอักขระ อย่างไรก็ตาม ฟังก์ชันมาโครของแอสเซมเบลอร์ที่ซับซ้อนกว่า เช่นIBM High Level Assembler (HLASM) ไม่สามารถนำมาใช้กับพรีโปรเซสเซอร์ได้ เนื่องจากโค้ดสำหรับการประกอบคำสั่งและข้อมูลจะแทรกอยู่กับโค้ดสำหรับการประกอบการเรียกใช้มาโคร
การใช้งานมาโครแบบคลาสสิกคือในระบบการจัดพิมพ์เอกสารด้วยคอมพิวเตอร์TeXและอนุพันธ์ของมัน ซึ่งฟังก์ชันการทำงานส่วนใหญ่ขึ้นอยู่กับมาโคร[ 10 ]
MacroMLเป็นระบบทดลองที่พยายามผสานระบบการกำหนดประเภทข้อมูลแบบคงที่และระบบมาโครเข้าด้วยกันNemerleมีมาโครไวยากรณ์แบบกำหนดประเภทข้อมูล และวิธีคิดที่มีประสิทธิภาพวิธีหนึ่งเกี่ยวกับมาโครไวยากรณ์เหล่านี้คือ การคำนวณ แบบหลายขั้นตอน
ตัวอย่างอื่นๆ:
- m4เป็นโปรแกรมประมวลผลมาโครแบบสแตนด์อะโลนที่มีประสิทธิภาพสูง
- แทร็ก
- ส่วนขยายมาโคร TALพร้อมด้วยภาษาคุณลักษณะเทมเพลต
- SMX: สำหรับเว็บเพจ
- ML/1 (Macro Language One)
- troffและnroff : สำหรับการจัดพิมพ์และจัดรูปแบบหน้าคู่มือ Unix (Manpage)
- CMS EXEC : สำหรับมาโครบรรทัดคำสั่งและมาโครแอปพลิเคชัน
- EXEC 2ในระบบตรวจสอบการสนทนา (CMS): สำหรับมาโครบรรทัดคำสั่งและมาโครแอปพลิเคชัน
- CLIST ใน ตัวเลือกการแบ่งเวลาใช้งาน (TSO) ของ IBM : สำหรับมาโครบรรทัดคำสั่งและมาโครแอปพลิเคชัน
- REXX : สำหรับมาโครบรรทัดคำสั่งและมาโครแอปพลิเคชันในระบบปฏิบัติการต่างๆ เช่นAmigaOS , CMS, OS/2 , TSO
- สคริปต์ : สำหรับการจัดรูปแบบเอกสาร
- เชลล์ต่างๆสำหรับระบบปฏิบัติการ เช่นลินุกซ์
แอปพลิเคชันหลักบางตัวถูกเขียนขึ้นในรูปแบบมาโครข้อความ ซึ่งถูกเรียกใช้งานโดยแอปพลิเคชันอื่น เช่นXEDITในระบบจัดการเนื้อหา (CMS)
ภาษาที่สามารถฝังได้
บางภาษา เช่นPHPสามารถฝังลงในข้อความรูปแบบอิสระ หรือซอร์สโค้ดของภาษาอื่นๆ ได้ กลไกที่ใช้ในการจดจำส่วนของโค้ด (เช่น การใส่เครื่องหมายวงเล็บเหลี่ยม<?phpและ วงเล็บปีกกา ?>) นั้นคล้ายกับภาษามาโครแบบข้อความ แต่ภาษาเหล่านี้มีประสิทธิภาพและฟังก์ชันการทำงานที่ครบครันกว่ามาก
มาโครเชิงกระบวนการ
มาโครใน ภาษา PL/Iเขียนขึ้นโดยใช้ส่วนย่อยของภาษา PL/I เอง: คอมไพเลอร์จะดำเนินการ " คำสั่ง พรีโปรเซสเซอร์ " ในระหว่างการคอมไพล์ และผลลัพธ์ของการดำเนินการนี้จะกลายเป็นส่วนหนึ่งของโค้ดที่ถูกคอมไพล์ ความสามารถในการใช้ภาษาเชิงขั้นตอน ที่คุ้นเคย เป็นภาษามาโครทำให้มีประสิทธิภาพมากกว่ามาโครแบบแทนที่ข้อความมาก แต่ก็แลกมาด้วยคอมไพเลอร์ที่ใหญ่ขึ้นและทำงานช้าลง มาโครใน PL/I เช่นเดียวกับในภาษาแอสเซมเบลอร์หลายๆ ภาษา อาจมีผลข้างเคียงเช่น การตั้งค่าตัวแปรที่มาโครอื่นๆ สามารถเข้าถึงได้
เทคโนโลยีเฟรมมีมาโครเฟรมที่มีไวยากรณ์คำสั่งเฉพาะตัว แต่ก็สามารถบรรจุข้อความในภาษาใดก็ได้ เฟรมแต่ละเฟรมเป็นทั้งส่วนประกอบทั่วไปในลำดับชั้นของส่วนประกอบย่อยที่ซ้อนกัน และเป็นกระบวนการสำหรับการรวมเข้ากับเฟรมส่วนประกอบย่อย (กระบวนการแบบเรียกซ้ำที่แก้ไขข้อขัดแย้งในการรวมโดยให้ความสำคัญกับส่วนประกอบย่อยระดับสูงกว่า) ผลลัพธ์ที่ได้คือเอกสารที่กำหนดเอง ซึ่งโดยทั่วไปจะเป็นโมดูลซอร์สโค้ดที่สามารถคอมไพล์ได้ เทคโนโลยีเฟรมสามารถหลีกเลี่ยงการเพิ่มจำนวนของส่วนประกอบที่คล้ายกันแต่แตกต่างกันเล็กน้อย ซึ่งเป็นปัญหาที่รบกวนการพัฒนาซอฟต์แวร์มาตั้งแต่การคิดค้นมาโครและซับรูทีน
ภาษาแอสเซมบลีส่วนใหญ่มีฟังก์ชันมาโครเชิงขั้นตอนที่ไม่ทรงพลังนัก เช่น การอนุญาตให้ทำซ้ำบล็อกโค้ดได้ N ครั้งสำหรับการคลายลูปแต่ฟังก์ชันเหล่านี้มีไวยากรณ์ที่แตกต่างจากภาษาแอสเซมบลีโดยสิ้นเชิง
มาโครไวยากรณ์
ระบบมาโคร—เช่นพรีโปรเซสเซอร์ของภาษาซีที่กล่าวถึงก่อนหน้านี้—ซึ่งทำงานในระดับโทเค็นทางศัพท์ไม่สามารถรักษาโครงสร้างทางศัพท์ได้อย่างน่าเชื่อถือ ในทางกลับกัน ระบบมาโครเชิงไวยากรณ์ทำงานในระดับของต้นไม้ไวยากรณ์นามธรรมและรักษาโครงสร้างทางศัพท์ของโปรแกรมดั้งเดิมไว้ การใช้งานระบบมาโครเชิงไวยากรณ์ที่ใช้กันอย่างแพร่หลายที่สุดพบได้ใน ภาษาที่คล้ายกับ Lispภาษาเหล่านี้เหมาะสมเป็นพิเศษสำหรับมาโครแบบนี้เนื่องจากไวยากรณ์ที่เป็นเอกภาพและมีวงเล็บ (เรียกว่าS-expressions ) โดยเฉพาะอย่างยิ่ง ไวยากรณ์ที่เป็นเอกภาพทำให้ง่ายต่อการกำหนดการเรียกใช้มาโคร มาโครของ Lisp แปลงโครงสร้างของโปรแกรมเอง โดยมีภาษาทั้งหมดให้ใช้งานเพื่อแสดงการแปลงดังกล่าว แม้ว่ามาโครไวยากรณ์มักพบในภาษาที่คล้าย กับ Lisp แต่ก็มีให้ใช้ในภาษาอื่นๆ เช่นProlog [ 11 ] Erlang [ 12 ] Dylan [ 13 ] Scala [ 14 ] Nemerle [ 15 ] Rust [ 16 ] Elixir [ 17 ] Nim [ 18 ] Haxe [ 19 ]และJulia [ 20 ] นอกจาก นี้ยัง มีให้ ใช้เป็นส่วนขยายของ บุคคล ที่สามสำหรับJavaScript [ 21 ]และC # [ 22 ]
มาโคร Lisp ยุคแรก
ก่อนที่ Lisp จะมีมาโคร มันมีสิ่งที่เรียกว่าFEXPRsซึ่งเป็นตัวดำเนินการคล้ายฟังก์ชันที่อินพุตไม่ใช่ค่าที่คำนวณโดยอาร์กิวเมนต์ แต่เป็นรูปแบบทางไวยากรณ์ของอาร์กิวเมนต์ และเอาต์พุตเป็นค่าที่จะใช้ในการคำนวณ กล่าวอีกนัยหนึ่ง FEXPRs ถูกนำไปใช้ในระดับเดียวกับ EVAL และให้หน้าต่างไปยังเลเยอร์การประเมินเมตา โดยทั่วไปแล้วพบว่าเป็นแบบจำลองที่ยากต่อการให้เหตุผลอย่างมีประสิทธิภาพ[ 23 ]
ในปี พ.ศ. 2506 Timothy Hart เสนอให้เพิ่มมาโครลงใน Lisp 1.5 ในAI Memo 57: คำจำกัดความมาโครสำหรับ LISP [ 24 ]
มาโครอ้างอิง
มาโครแบบอนาโฟริก (Anaphoric macro) คือมาโครประเภทหนึ่งที่ตั้งใจดักจับรูปแบบบางอย่างที่ป้อนให้กับมาโคร ซึ่งอาจถูกอ้างอิงโดยอนาโฟร (คำหรือวลีที่อ้างถึงคำหรือวลีอื่น) มาโครแบบอนาโฟริกปรากฏครั้งแรกในหนังสือ On Lisp ของ Paul Graham และชื่อของมันอ้างอิงถึงอนาโฟราทางภาษาศาสตร์—การใช้คำแทนคำที่อยู่ข้างหน้า
มาโครสุขอนามัย
ในช่วงกลางทศวรรษที่ 1980 เอกสารจำนวนหนึ่ง[ 25 ] [ 26 ]ได้นำเสนอแนวคิดของการขยายมาโครแบบสุขอนามัยsyntax-rules ( ) ซึ่งเป็นระบบตามรูปแบบที่สภาพแวดล้อมทางไวยากรณ์ของคำจำกัดความมาโครและการใช้มาโครนั้นแตกต่างกัน ทำให้ผู้กำหนดและผู้ใช้มาโครไม่ต้องกังวลเกี่ยวกับการจับตัวแปรโดยไม่ได้ตั้งใจ (ดูความโปร่งใสของการอ้างอิง ) มาโครแบบสุขอนามัยได้รับการกำหนดมาตรฐานสำหรับ Scheme ใน มาตรฐาน R5RS , R6RSและR7RSมีการใช้งานมาโครแบบสุขอนามัยที่แข่งขันกันอยู่หลายแบบ เช่นsyntax-rules, syntax-case, การเปลี่ยนชื่ออย่างชัดเจน และการปิดทางไวยากรณ์ ทั้งsyntax-rulesและsyntax-caseได้รับการกำหนดมาตรฐานในมาตรฐาน Scheme แล้ว
เมื่อเร็วๆ นี้Racketได้รวมแนวคิดของมาโครสุขอนามัยเข้ากับ "หอคอยของตัวประเมิน" เพื่อให้เวลาในการขยายไวยากรณ์ของระบบมาโครหนึ่งระบบเป็นเวลารันไทม์ปกติของบล็อกโค้ดอื่น[ 27 ]และแสดงให้เห็นวิธีการใช้การขยายและการแยกวิเคราะห์แบบสลับในภาษาที่ไม่ใช้วงเล็บ[ 28 ]
นอกจาก Scheme แล้ว ภาษาโปรแกรมอีกหลายภาษาก็มีการนำระบบมาโครแบบสุขอนามัยมาใช้ หรือมีระบบสุขอนามัยบางส่วน ตัวอย่างเช่นScala , Rust , Elixir , Julia , Dylan , NimและNemerle
แอปพลิเคชัน
- คำสั่งประเมินผล
- ระบบมาโครมีประโยชน์หลากหลาย การที่สามารถเลือกได้ว่าจะให้ประเมินผลในลำดับใด (ดูการประเมินแบบเลซี่และฟังก์ชันที่ไม่เข้มงวด ) ทำให้สามารถสร้างโครงสร้างทางไวยากรณ์ใหม่ๆ (เช่นโครงสร้างควบคุม ) ที่ไม่แตกต่างจากโครงสร้างที่มีอยู่ในภาษา ตัวอย่างเช่น ในภาษา Lisp ที่มี
condแต่ขาดifก็สามารถกำหนดอย่างหลังได้โดยใช้มาโคร ตัวอย่างเช่น ภาษา Scheme มีทั้งcontinuationsและ hygienic macros ซึ่งช่วยให้นักเขียนโปรแกรมสามารถออกแบบนามธรรมการควบคุมของตนเองได้ เช่น การวนซ้ำและโครงสร้างการออกจากโปรแกรมก่อนกำหนด โดยไม่จำเป็นต้องสร้างโครงสร้างเหล่านั้นลงในภาษา - ภาษาย่อยของข้อมูลและภาษาเฉพาะโดเมน
- ต่อไป มาโครทำให้สามารถกำหนดภาษาข้อมูลที่ถูกคอมไพล์เป็นโค้ดได้ทันที ซึ่งหมายความว่าโครงสร้างต่างๆ เช่นเครื่องสถานะสามารถนำไปใช้ในลักษณะที่เป็นธรรมชาติและมีประสิทธิภาพ[ 29 ]
- โครงสร้างการผูกมัด
- นอกจากนี้ ยังสามารถใช้มาโครเพื่อแนะนำโครงสร้างการผูกข้อมูลแบบใหม่ได้ ตัวอย่างที่รู้จักกันดีที่สุดคือ การแปลงข้อมูลให้
letเป็นการประยุกต์ใช้ฟังก์ชันกับชุดอาร์กิวเมนต์
Felleisenตั้งข้อสันนิษฐาน[ 30 ]ว่าหมวดหมู่ทั้งสามนี้ประกอบขึ้นเป็นการใช้งานที่ถูกต้องตามกฎหมายหลักของมาโครในระบบดังกล่าว ผู้อื่นได้เสนอการใช้งานทางเลือกอื่นของมาโคร เช่นมาโครอ้างอิงในระบบมาโครที่ไม่ถูกสุขอนามัยหรืออนุญาตให้มีการแปลงที่ไม่ถูกสุขอนามัยแบบเลือกได้
ปฏิสัมพันธ์ระหว่างมาโครและคุณลักษณะอื่นๆ ของภาษาเป็นหัวข้อการวิจัยที่น่าสนใจ ตัวอย่างเช่นคอมโพเนนต์และโมดูลมีประโยชน์สำหรับการเขียนโปรแกรมขนาดใหญ่ แต่ปฏิสัมพันธ์ระหว่างมาโครและโครงสร้างอื่นๆ เหล่านี้จะต้องได้รับการกำหนดเพื่อให้สามารถใช้งานร่วมกันได้ ระบบโมดูลและคอมโพเนนต์ที่สามารถโต้ตอบกับมาโครได้ถูกเสนอขึ้นสำหรับภาษา Scheme และภาษาอื่นๆ ที่มีมาโคร ตัวอย่างเช่น ภาษา Racketขยายแนวคิดของระบบมาโครไปสู่หอคอยทางไวยากรณ์ ซึ่งสามารถเขียนมาโครได้ในภาษาที่มีมาโคร โดยใช้หลักสุขอนามัยเพื่อให้แน่ใจว่าชั้นทางไวยากรณ์มีความแตกต่างกัน และอนุญาตให้โมดูลส่งออกมาโครไปยังโมดูลอื่นๆ ได้
มาโครสำหรับซอฟต์แวร์ที่ไม่ขึ้นกับเครื่อง
โดยปกติแล้ว มาโครจะใช้ในการแปลงสตริงสั้นๆ (การเรียกใช้มาโคร) ไปเป็นลำดับคำสั่งที่ยาวขึ้น อีกการใช้งานหนึ่งที่พบได้น้อยกว่าคือ การใช้มาโครในทางกลับกัน นั่นคือ การแปลงลำดับคำสั่งไปเป็นสตริงมาโคร นี่คือแนวทางที่ระบบการเขียนโปรแกรมมือถือ STAGE2 ใช้ โดยใช้คอมไพเลอร์มาโครแบบพื้นฐาน (เรียกว่า SIMCMP) ในการแปลงชุดคำสั่งเฉพาะของคอมพิวเตอร์เครื่องใดเครื่องหนึ่งไปเป็น มาโคร ที่ไม่ขึ้นกับเครื่องจากนั้นแอปพลิเคชัน (โดยเฉพาะคอมไพเลอร์) ที่เขียนด้วยมาโครที่ไม่ขึ้นกับเครื่องเหล่านี้ สามารถทำงานได้โดยไม่ต้องเปลี่ยนแปลงใดๆ บนคอมพิวเตอร์เครื่องใดก็ได้ที่มีคอมไพเลอร์มาโครแบบพื้นฐาน แอปพลิเคชันแรกที่ทำงานในบริบทดังกล่าวคือคอมไพเลอร์มาโครที่ซับซ้อนและทรงพลังกว่า ซึ่งเขียนด้วยภาษามาโครที่ไม่ขึ้นกับเครื่อง คอมไพเลอร์มาโครนี้จะถูกนำไปใช้กับตัวเองใน ลักษณะ บูตสแตรปเพื่อสร้างเวอร์ชันที่คอมไพล์แล้วและมีประสิทธิภาพมากขึ้น ข้อดีของแนวทางนี้คือ แอปพลิเคชันที่ซับซ้อนสามารถพอร์ตจากคอมพิวเตอร์เครื่องหนึ่งไปยังคอมพิวเตอร์ที่แตกต่างกันมากได้โดยใช้ความพยายามเพียงเล็กน้อย (สำหรับสถาปัตยกรรมเครื่องเป้าหมายแต่ละแบบ เพียงแค่เขียนคอมไพเลอร์มาโครแบบพื้นฐานเท่านั้น) [ 31 ] [ 32 ]การเกิดขึ้นของภาษาโปรแกรมสมัยใหม่ โดยเฉพาะCซึ่งมีคอมไพเลอร์ให้บริการบนคอมพิวเตอร์แทบทุกเครื่อง ทำให้แนวทางดังกล่าวไม่จำเป็นอีกต่อไป อย่างไรก็ตาม นี่เป็นหนึ่งในตัวอย่างแรกๆ (หากไม่ใช่ตัวอย่างแรก) ของการบูตสแตรปคอมไพเลอร์
ภาษาแอสเซมบลี
แม้ว่าโปรแกรมเมอร์จะสามารถกำหนดคำสั่งมาโคร สำหรับชุดคำสั่งโปรแกรมแอสเซมเบลอร์ดั้งเดิมใดๆ ก็ได้ แต่โดยทั่วไปแล้ว มาโครจะเกี่ยวข้องกับไลบรารีมาโครที่มาพร้อมกับระบบปฏิบัติการ ซึ่งช่วยให้สามารถเข้าถึงฟังก์ชันของระบบปฏิบัติการได้ เช่น
- การเข้าถึงอุปกรณ์ต่อพ่วงโดยใช้วิธีการเข้าถึง (รวมถึงมาโคร เช่น OPEN, CLOSE, READ และ WRITE)
- ฟังก์ชันระบบปฏิบัติการ เช่น ATTACH, WAIT และ POST สำหรับการสร้างงานย่อยและการซิงโครไนซ์[ 33 ]โดยทั่วไปแล้วมาโครดังกล่าวจะขยายเป็นโค้ดที่สามารถเรียกใช้งานได้ เช่น สำหรับคำสั่งมาโคร EXIT
- รายการ คำสั่ง กำหนดค่าคงที่เช่น สำหรับ มาโคร DCB —DTF (Define The File) สำหรับDOS [ 34 ] —หรือการรวมกันของโค้ดและค่าคงที่ โดยรายละเอียดของการขยายจะขึ้นอยู่กับพารามิเตอร์ของคำสั่งมาโคร (เช่น การอ้างอิงถึงไฟล์และพื้นที่ข้อมูลสำหรับคำสั่ง READ)
- โค้ดที่สามารถทำงานได้มักจะสิ้นสุดลงด้วย คำสั่ง กระโดดและเชื่อมโยงรีจิสเตอร์เพื่อเรียกใช้รูทีน หรือ คำสั่ง เรียกใช้ตัวควบคุมเพื่อเรียกใช้ฟังก์ชันของระบบปฏิบัติการโดยตรง
- การสร้าง สตรีมงาน ขั้นตอนที่ 2สำหรับการสร้างระบบในระบบปฏิบัติการ เช่นOS/360นั้น ไม่เหมือนกับมาโครทั่วไป มาโครขั้นตอนที่ 1 ของ sysgen ไม่ได้สร้างข้อมูลหรือโค้ดที่จะโหลดลงหน่วยเก็บข้อมูล แต่จะใช้ คำสั่ง PUNCHเพื่อส่งออกJCLและข้อมูลที่เกี่ยวข้อง
ในระบบปฏิบัติการรุ่นเก่า เช่น ระบบที่ใช้ในเมนเฟรมของ IBM ฟังก์ชันการทำงานของระบบปฏิบัติการอย่างเต็มรูปแบบนั้นมีให้ใช้งานเฉพาะในโปรแกรมภาษาแอสเซมบลีเท่านั้น ไม่ใช่ในโปรแกรมภาษาระดับสูง (เว้นแต่จะใช้ซับรูทีนภาษาแอสเซมบลี) เนื่องจากคำสั่งมาโครมาตรฐานไม่ได้มีคำสั่งที่เทียบเท่าในรูทีนที่มีให้ใช้งานในภาษาระดับสูงเสมอไป
ประวัติศาสตร์
ในช่วงกลางทศวรรษ 1950 เมื่อ การเขียนโปรแกรม ด้วยภาษาแอสเซมบลีเป็นวิธีหลักในการเขียนโปรแกรมคอมพิวเตอร์ ได้มีการพัฒนา คุณลักษณะคำสั่งมาโคร เพื่อลดโค้ดต้นฉบับ (โดยการสร้างคำสั่งแอสเซมบลีหลายคำสั่งจากคำสั่งมาโครแต่ละคำสั่ง) และเพื่อบังคับใช้ข้อกำหนดการเขียนโค้ด (เช่น การระบุคำสั่งอินพุต/เอาต์พุตในรูปแบบมาตรฐาน) [ 35 ]คำสั่งมาโครที่ฝังอยู่ในโค้ดต้นฉบับแอสเซมบลีจะถูกประมวลผลโดยคอมไพเลอร์มาโคร ซึ่งเป็นพรีโปรเซสเซอร์สำหรับแอสเซมเบลอร์ เพื่อแทนที่มาโครด้วยคำสั่งแอสเซมบลีหนึ่งคำสั่งหรือมากกว่านั้น โค้ดที่ได้ซึ่งเป็นแอสเซมบลีบริสุทธิ์ จะถูกแปลเป็นโค้ดเครื่องโดยแอสเซมเบลอร์[ 36 ]
สองในศูนย์การเขียนโปรแกรมแห่งแรกๆ ที่พัฒนาภาษามาโครสำหรับคอมพิวเตอร์ IBM 705 นั้นตั้งอยู่ที่บริษัท Dow Chemical Corp. ในรัฐเดลาแวร์ และสำนักงานโลจิสติกส์ขีปนาวุธของกองบัญชาการวัสดุทางอากาศในรัฐแคลิฟอร์เนีย
บางคนมองว่าคำสั่งมาโครเป็นขั้นตอนกลางระหว่างการเขียนโปรแกรมด้วยภาษาแอสเซมบลีและภาษาการเขียนโปรแกรมระดับสูงที่ตามมา เช่นFORTRANและCOBOL
ในช่วงปลายทศวรรษ 1950 ภาษามาโครได้ถูกแทนที่ด้วยมาโครแอสเซมเบลอร์ซึ่งเป็นการผสมผสานระหว่างทั้งสองอย่าง โดยโปรแกรมเดียวทำหน้าที่ทั้งสองอย่าง คือทั้งตัวประมวลผลมาโครและแอสเซมเบลอร์ในแพ็กเกจเดียวกัน[ 36 ]ตัวอย่างในยุคแรก ได้แก่FORTRAN Assembly Program (FAP) [ 37 ] และ Macro Assembly Program (IBMAP) [ 38 ]บนIBM 709 , 7094 , 7040และ 7044 และAutocoder [ 39 ]บน7070/7072/7074
ในปี พ.ศ. 2492 Douglas E. Eastwood และDouglas McIlroyจากBell Labsได้นำมาโครแบบมีเงื่อนไขและแบบเรียกซ้ำมาใช้ในแอสเซมเบลอร์SAP ที่ได้รับความนิยม [ 40 ]ซึ่งทำให้เกิดสิ่งที่เรียกว่า Macro SAP [ 41 ]บทความของ McIlroy ในปี พ.ศ. 2503 ถือเป็นงานสำคัญในด้านการขยายภาษาโปรแกรมใดๆ (รวมถึง ภาษาโปรแกรม ระดับสูง ) ผ่านโปรเซสเซอร์มาโคร[ 42 ] [ 40 ]
โปรแกรมแอสเซมเบลอร์แบบมาโครช่วยให้นักเขียนโปรแกรมภาษาแอสเซมบลีสามารถสร้างภาษามาโครของตนเองได้ และช่วยให้สามารถพอร์ตโค้ดระหว่างเครื่องสองเครื่องที่ใช้ซีพียูเดียวกันแต่ใช้ระบบปฏิบัติการต่างกันได้ในระดับหนึ่ง เช่นMS-DOS รุ่นแรกๆ และCP/M-86จำเป็นต้องเขียนไลบรารีมาโครสำหรับแต่ละเครื่องเป้าหมาย แต่ไม่จำเป็นต้องเขียนโปรแกรมภาษาแอสเซมบลีโดยรวม โปรดทราบว่าโปรแกรมแอสเซมเบลอร์แบบมาโครที่มีประสิทธิภาพมากขึ้นจะอนุญาตให้ใช้โครงสร้างแอสเซมบลีแบบมีเงื่อนไขในคำสั่งมาโคร ซึ่งสามารถสร้างโค้ดที่แตกต่างกันในเครื่องต่างๆ หรือระบบปฏิบัติการที่แตกต่างกันได้ ลดความจำเป็นในการใช้ไลบรารีหลายชุด
ในช่วงทศวรรษ 1980 และต้นทศวรรษ 1990 คอมพิวเตอร์ตั้งโต๊ะทำงานที่ความเร็วเพียงไม่กี่เมกะเฮิร์ตซ์ และมีการใช้ภาษาแอสเซมบลีเพื่อเร่งความเร็วโปรแกรมที่เขียนด้วยภาษา C, Fortran, Pascal และภาษาอื่นๆ อย่างแพร่หลาย ภาษาเหล่านี้ในขณะนั้นใช้ข้อกำหนดการเรียกใช้ที่แตกต่างกัน สามารถใช้มาโครเพื่อเชื่อมต่อรูทีนที่เขียนด้วยภาษาแอสเซมบลีกับส่วนหน้าของแอปพลิเคชันที่เขียนด้วยภาษาใดๆ ก็ได้ อีกครั้ง โค้ดภาษาแอสเซมบลีพื้นฐานยังคงเหมือนเดิม เพียงแต่ต้องเขียนไลบรารีมาโครสำหรับแต่ละภาษาเป้าหมายเท่านั้น
ในระบบปฏิบัติการสมัยใหม่ เช่น Unix และระบบที่พัฒนาต่อยอดจาก Unix การเข้าถึงระบบปฏิบัติการจะทำได้ผ่านทางซับรูทีน ซึ่งโดยทั่วไปแล้วจะมาจากไลบรารีแบบไดนามิก ภาษาโปรแกรมระดับสูง เช่น C ให้การเข้าถึงฟังก์ชันของระบบปฏิบัติการอย่างครอบคลุม ทำให้ไม่จำเป็นต้องใช้โปรแกรมภาษาแอสเซมบลีสำหรับฟังก์ชันดังกล่าว
นอกจากนี้ไลบรารีมาตรฐานของภาษาโปรแกรมรุ่นใหม่หลายภาษา เช่นGoยังไม่สนับสนุนการใช้syscalls อย่างจริงจัง โดยสนับสนุนให้ใช้ไลบรารีที่ไม่ขึ้นกับแพลตฟอร์มแทนหากไม่จำเป็น เพื่อปรับปรุงความสามารถในการพกพาและความปลอดภัย[ 43 ]
ดูเพิ่มเติม
- มาโครแบบอนาโฟริก
- ภาษาแอสเซมบลี § มาโคร–ประวัติความเป็นมาของมาโคร
- ตัวดำเนินการเชิงซ้อน– โครงสร้างพื้นฐานของภาษาโปรแกรมหน้าเว็บที่แสดงคำอธิบายสั้น ๆ ของเป้าหมายการเปลี่ยนเส้นทาง
- การเขียนโปรแกรมแบบขยายได้– รูปแบบหนึ่งของการเขียนโปรแกรมคอมพิวเตอร์
- การดำเนินการแบบหลอมรวม– โครงสร้างพื้นฐานของภาษาโปรแกรมหน้าเว็บที่แสดงคำอธิบายสั้น ๆ ของเป้าหมายการเปลี่ยนเส้นทาง
- มาโครที่ถูกสุขอนามัย– มาโครที่รับประกันได้ว่าการขยายตัวจะไม่ทำให้เกิดการดักจับตัวระบุ
- มาโครและการรักษาความปลอดภัย– กฎสำหรับการแทนที่อินพุตที่กำหนดด้วยเอาต์พุตที่กำหนดหน้าเว็บที่แสดงคำอธิบายสั้น ๆ ของเป้าหมายการเปลี่ยนเส้นทาง
- การเขียนโปรแกรมโดยการสาธิต– เทคนิคการสอนคอมพิวเตอร์หรือหุ่นยนต์ให้มีพฤติกรรมใหม่ๆ
- การแทรกค่าในสตริง– การแทนที่ตัวยึดตำแหน่งในสตริงด้วยค่าจริง
ลิงก์ภายนอก
- วิธีการเขียนคำสั่งมาโคร
- สไลด์ Powerpoint ของอาจารย์จากสถาบันเทคโนโลยีโรเชสเตอร์(เก็บถาวรเมื่อวันที่ 15 มิถุนายน 2022 ในWayback Machine)