매크로 (컴퓨터 과학)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
매크로(컴퓨터 과학)는 짧은 키 입력이나 마우스 동작 시퀀스를 더 길고 복잡한 시퀀스로 변환하여 작업을 자동화하는 기술을 의미한다. 키보드 및 마우스 매크로는 반복적인 작업을 자동화하는 데 사용되며, 응용 프로그램 내장 매크로 또는 스크립트 언어를 통해 생성될 수 있다. 프로그래밍 언어, 텍스트 편집기, 스프레드시트 등 다양한 소프트웨어에서 매크로 기능이 제공되며, 특히 C 언어의 전처리기, Lisp와 같은 언어의 구문 매크로가 널리 활용된다. 매크로는 텍스트 치환, 절차적, 구문 매크로 등 다양한 형태로 발전해 왔으며, 기계 독립적인 소프트웨어 개발에도 사용되었다. 한국에서는 온라인 게임에서의 매크로 사용이 불법으로 규정되어 제재를 받고 있으며, 게임 외에도 사무 자동화 등 다양한 분야에서 활용되고 있다.
더 읽어볼만한 페이지
- 자동화 소프트웨어 - 매크로 바이러스
매크로 바이러스는 응용 프로그램의 매크로 기능을 악용하여 자동 실행 및 복제를 통해 시스템을 감염시키는 악성 코드로, 출처 불분명한 파일에 대한 주의 및 백신 소프트웨어 활용을 통해 예방이 필요하며, 최신 Microsoft Office에서는 관련 보호 기능을 제공한다. - 자동화 소프트웨어 - Expect
Expect는 텔넷, FTP, SSH와 같은 대화형 응용 프로그램 제어 자동화 도구로, 의사 터미널이나 콘솔 에뮬레이션을 통해 대상 프로그램을 제어하며 autoexpect 도구로 스크립트 작성을 자동화할 수 있고, 비밀번호 처리 시 보안에 유의해야 한다. - 프로그래밍 구성체 - 형 변환
형 변환은 프로그래밍에서 변수의 데이터 타입을 변경하는 것으로, 암시적 형 변환과 명시적 형 변환으로 나뉘며, 객체 지향 프로그래밍에서는 업캐스팅과 다운캐스팅이 발생하고, 각 언어는 고유한 규칙과 방법을 제공하며 잘못된 형 변환은 오류를 유발할 수 있다. - 프로그래밍 구성체 - 연산자 오버로딩
연산자 오버로딩은 프로그래밍 언어에서 기존 연산자를 사용자 정의 자료형에 대해 재정의하여 내장 자료형처럼 다루도록 하는 기능으로, 코드 가독성과 표현력을 높이지만 남용 시 코드 의미를 모호하게 만들 수 있다.
매크로 (컴퓨터 과학) |
---|
2. 키보드 및 마우스 매크로
키보드 매크로와 마우스 매크로는 짧은 키 입력과 마우스 동작을 더 길고 반복적인 작업으로 변환하여 자동화한다. 이러한 매크로를 만드는 별도의 프로그램을 매크로 기록기라고 한다.
1980년대에는 SmartKey를 시작으로 SuperKey, KeyWorks, Prokey 등과 같은 매크로 프로그램이 인기를 얻었다. 처음에는 시나리오 서식 지정에 사용되었지만, 이후 다양한 사용자 입력 작업에 활용되었다. 그러나 마우스 기반 사용자 인터페이스와 워드 프로세서, 스프레드시트와 같은 응용 프로그램의 발전으로 이러한 프로그램의 사용은 줄어들었다.
키보드 매크로는 대규모 다중 사용자 온라인 롤플레잉 게임(MMORPG)에서 반복적인 작업을 통해 자원을 획득하는 데 사용될 수 있다. 그러나 이는 게임 경제를 왜곡하고 다른 사용자에게 불이익을 줄 수 있으므로, 대부분의 MMORPG에서 매크로 사용은 TOS 또는 EULA 위반으로 간주되어 금지된다.[4]
2. 1. 응용 프로그램 매크로 및 스크립팅
응용 프로그램 매크로는 응용 프로그램의 내장 매크로 기능을 사용하거나, 스크립트 언어를 기반으로 하는 매크로 프로그래밍 언어를 사용하여 만들 수 있다.[4] 텍스트 편집기 이맥스(Emacs)는 Emacs Lisp를, Vim은 Vimscript라는 스크립트 언어를 사용하여 강력한 매크로 기능을 제공한다.[5]VBA는 마이크로소프트 오피스에 포함된 프로그래밍 언어로, 원래 포함되었던 매크로 언어의 기능을 확장하고 대체하는 데 사용된다.
다음은 여러 응용 프로그램 및 프로그래밍 환경에서 사용되는 매크로 기능 및 관련 언어에 대한 간략한 설명이다.
- GNU Emacs: Emacs Lisp를 이용한 확장 및 키보드 매크로 기능을 가지고 있다. 이메일 클라이언트나 웹 브라우저 등 고도하고 복잡한 기능을 가진 공개된 매크로도 있다. "Emacs"라는 이름은 TECO 편집기의 매크로 집합 "'''E'''ditor '''MAC'''ro'''S'''"에서 유래되었다.
- 히데마루 에디터: 키보드 매크로 기능과 함께, C 언어와 유사한 문법을 가진 매크로 언어를 채택하고 있다.
- EmEditor: WSH 엔진을 이용하여 JScript 및 VBScript로 기술이 가능하다. COM 객체를 사용하여 EmEditor에서 Microsoft Excel 등을 조작할 수 있다. Ruby나 Python 등의 언어로도 기술이 가능하다.
- 사쿠라 에디터: 키 입력 등을 자동 기록하는 키 매크로나 WSH에 대응한다. ppa.dll (Poor-Pascal for Application영어)을 도입하면 파스칼 스타일의 매크로를 기술할 수 있으며, ActivePerl, ActiveRuby 등을 도입하여 Perl과 Ruby 등으로도 매크로를 작성할 수 있다.
- MIFES: C 언어와 유사한 컴파일 타입의 매크로 언어 MIL/W를 지원한다.[38] 기록한 키보드 매크로를 MIL/W로 변환할 수 있는 기능도 가지고 있다.
- Sublime Text: Python 처리계를 가지고 있어 이를 이용하여 매크로를 기술할 수 있다. C와의 API를 이용하여 일본어 IME에 대응시키는 매크로가 기술된 사례가 있다.[39]
- 마이크로소프트 오피스: 공통 매크로 언어로서 VBA를 사용할 수 있다.
- OpenOffice.org: OpenOffice.org Basic, JavaScript, Python, BeanShell (Java)를 매크로 언어로 이용할 수 있다. OpenOffice.org Basic은 VBA와 비슷한 매크로 언어이다.
- IBM SuperOffice: Lotus Script를 매크로 언어로 사용할 수 있다. 로터스 브랜드 그룹웨어 Notes/Domino에서도 Lotus Script를 사용할 수 있다.
- 저스트시스템 이치타로, 하나코 (그래픽 소프트웨어), 산시로 (스프레드시트 소프트웨어): SuperPlayRite를 매크로 언어로 사용할 수 있다.
- Google Workspace: JavaScript 기반의 Google Apps Script라는 언어를 제공한다.
- 마이크로소프트 비주얼 스튜디오: 2010 버전까지 VBA 또는 VB.NET에 의한 매크로 기능이 표준으로 제공되었다. 2012 버전에서 폐지되었지만, 2013 버전 이후에는 JavaScript로 매크로를 기술할 수 있는 확장 기능(애드인)이 개발되고 있다.[40]
- 어도비 포토샵, 어도비 일러스트레이터 등 어도비 제품: ExtendScript영어를 사용하여 각 소프트웨어 상의 작업을 자동화할 수 있다. ExtendScript의 문법은 JavaScript를 따른다.
- TeraTerm: 테라니시 타카시 및 TeraTerm Project에 의한 터미널 에뮬레이터로, 매크로 언어로서 Tera Term Language (TTL)을 이용할 수 있다.
2. 1. 1. 매크로 바이러스
VBA는 대부분의 마이크로소프트 윈도우 시스템 호출에 접근할 수 있으며 문서를 열 때 실행된다. 이는 VBA로 컴퓨터 바이러스를 작성하는 것을 비교적 쉽게 만들었고, 이것은 일반적으로 매크로 바이러스로 알려져 있다. 1990년대 중후반에 매크로 바이러스는 가장 흔한 유형의 컴퓨터 바이러스 중 하나였다. 그러나 1990년대 후반부터 현재까지 마이크로소프트는 자체 프로그램을 패치하고 업데이트해 왔다. 또한, 현재의 안티바이러스 프로그램은 그러한 공격에 즉시 대응한다.3. 매개변수화된 매크로와 매개변수 없는 매크로
C 프로그래밍 언어에서 `#define` 지시어를 사용하면 매개변수 없는 매크로를 정의할 수 있다.[37] 예를 들어, ` #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)`로 확장된다.
매개변수 매크로는 인라인 확장을 수행하는 유용한 메커니즘이지만, C와 같이 단순한 텍스트 대체를 사용하는 언어에서는 인라인 함수에 비해 몇 가지 단점이 있다.
반면, Lisp 프로그래밍 언어, PL/I, Scheme과 같은 언어에서 사용되는 매개변수 매크로는 훨씬 더 강력하여, 인수를 기반으로 어떤 코드를 생성할지 결정할 수 있다. 따라서 런타임 코드 생성을 효과적으로 수행하는 데 사용할 수 있다.
4. 텍스트 치환 매크로
C 언어와 일부 어셈블리어는 컴파일러나 어셈블러의 전처리기를 통해 기본적인 매크로 시스템을 제공한다.[37] C 전처리기 매크로는 문자 수준이 아닌 토큰에서 단순한 텍스트 치환 방식으로 작동한다. IBM High Level Assembler (HLASM)과 같은 더 정교한 어셈블러의 매크로 기능은 전처리기로 구현할 수 없으며, 명령 및 데이터를 어셈블하는 코드는 매크로 호출을 어셈블하는 코드와 혼합되어 있다.
매크로의 전형적인 사용 사례는 대부분의 기능이 매크로를 기반으로 하는 컴퓨터 조판 시스템 TeX 및 그 파생물에서 볼 수 있다.[6]
MacroML은 정적 타이핑과 매크로 시스템을 조화시키려는 실험적인 시스템이다. Nemerle은 타입이 지정된 구문 매크로를 가지고 있으며, 이러한 구문 매크로를 생각하는 한 가지 생산적인 방법은 다단계 계산으로 간주하는 것이다.
정교한 텍스트 치환 매크로 프로세서의 예시는 다음과 같다.
어셈블리 언어에서는 기계어 명령과 일대일로 대응하는 니모닉만을 기술할 수 있다. 그 후, 어셈블러에 매크로 기능을 추가한 매크로 어셈블러가 등장했다. 매크로 어셈블러는 복수의 니모닉을 묶어 간략하게 기술할 수 있다. 함수와 같은 인수를 취할 수 있는 기능이 있는지 여부는 처리계에 따라 다르다.
C 언어는 전처리기라고 불리는, 컴파일러가 소스 프로그램을 해석하여 오브젝트 프로그램을 생성하기 전에 동작하는 프로세서(처리계)를 갖추고 있다. 번호 기호(`#`)로 시작하는, 전처리기에 주는 지시를 전처리기 지시어라고 부르며, 몇 가지 지시어가 규격으로 표준화되어 있는 외에도, 고유한 지시어를 지원하는 컴파일러도 존재한다.
C 언어 소스 프로그램에서
#define STRING1 STRING2
라는 행을 기술하면, 전처리기에 의해 코드 중의 `STRING1`은 `STRING2`로 치환된다. 이것을 객체 형식 매크로 (object-like macro) 라고 부른다. 또한,
#define SQUARE(val) ((val)*(val))
와 같이 파라미터를 취하는 함수 형식 매크로 (function-like macro) 를 정의하는 것도 가능하다. 그 외에도,
#define TO_STRING(symbol) #symbol
#define PASTE_TOKEN(a,b) a##b
와 같이, 심볼의 문자열화나 토큰의 연결을 실행할 수 있는 매크로 특유의 연산자도 준비되어 있다. 매크로에 의한 치환은, 문자열 리터럴이나 주석 안에는 적용되지 않는다.
함수 매크로는 인수의 타입을 고정하지 않고, 호출 실행 시 처리 비용이 들지 않는 등, 함수보다 편리한 면이 있다. 그러나, 매크로 자체는 텍스트의 치환을 기계적으로 실행하는 것에 불과하므로, 그 매크로를 사용할 때 파라미터로서 인크리먼트식이나 디크리먼트식을 직접 전달하거나, 혹은 파라미터에 함수의 반환값을 사용하기 위해 함수 호출을 직접 기술하거나 하면, 그것들의 평가가 의도하지 않게 여러 번 실행되는 경우가 있다. 이것을 매크로의 부작용이라고 부른다. 매크로 이용자가 부작용을 기대하지 않는 경우에는, 함수 매크로의 정의 시나 사용 시에는 주의해야 한다. 이러한 점에서, MISRA C에서는 함수 매크로 기능을 가능한 한 사용하지 않도록 해야 한다고 하고 있다.
또한, "정의된 매크로"로서, 컴파일 환경에 따라 특정 값(문자열)으로 전개되는 매크로가 있다. 디버깅을 위해 프로그램 중에 파일명이나 행 번호를 자동적으로 채워 넣거나, 전방 호환성 및/또는 후방 호환성 및 이식성을 유지하기 위해 컴파일러의 버전이나 타겟 환경(플랫폼)에 따라 컴파일하는 코드를 변경하는 등의 목적으로 이용한다.
m4 등과 같은 단독 매크로 프로세서도 있다. m4는 sendmail이나 autotools에서 설정 파일을 생성하는 데 사용된다.
4. 1. 내장형 언어
PHP와 같은 일부 언어는 자유 형식 텍스트나 다른 언어의 소스 코드에 포함될 수 있다. 코드 조각을 인식하는 메커니즘(예:<?php
와 ?>
로 묶는 방식)은 텍스트 매크로 언어와 유사하지만, 훨씬 더 강력하고 완전한 기능을 갖춘 언어이다.5. 절차적 매크로
PL/I 언어의 매크로는 PL/I 자체의 하위 집합으로 작성된다. 컴파일러는 컴파일 시간에 "전처리기 문"을 실행하며, 이 실행의 결과는 컴파일되는 코드의 일부를 형성한다. 익숙한 절차적 언어를 매크로 언어로 사용할 수 있다는 것은 텍스트 치환 매크로보다 훨씬 강력한 기능을 제공하지만, 더 크고 느린 컴파일러를 사용해야 한다. PL/I 및 많은 어셈블러의 매크로는 다른 매크로가 액세스할 수 있는 변수를 설정하는 등의 부작용을 가질 수 있다.[5]
프레임 기술의 프레임 매크로는 자체 명령 구문을 가지지만 모든 언어로 텍스트를 포함할 수도 있다. 각 프레임은 중첩된 하위 어셈블리의 계층 구조에서 일반적인 구성 요소이며, 자체를 하위 어셈블리 프레임과 통합하는 절차이기도 하다(상위 수준 하위 어셈블리에 유리하게 통합 충돌을 해결하는 재귀적 프로세스). 출력은 사용자 정의 문서이며, 일반적으로 컴파일 가능한 소스 모듈이다. 프레임 기술은 매크로와 서브루틴 발명 이후 소프트웨어 개발을 괴롭혀 온 유사하지만 미묘하게 다른 구성 요소의 확산을 피할 수 있다.[5]
대부분의 어셈블리 언어는 덜 강력한 절차적 매크로 기능을 가지고 있다. 예를 들어 루프 언롤링을 위해 코드 블록을 N번 반복할 수 있지만, 이는 실제 어셈블리 언어와 완전히 다른 구문을 가지고 있다.[5]
6. 구문 매크로
구문 매크로 시스템은 추상 구문 트리 수준에서 작동하며, 원래 프로그램의 어휘 구조를 보존한다. 이러한 시스템은 Lisp 계열 언어에서 주로 사용되는데, 이 언어들은 균일한 괄호 구문(S-표현식)을 사용하기 때문에 매크로 호출을 쉽게 결정할 수 있기 때문이다. Lisp 매크로는 프로그램 구조 자체를 변환하며, 이 변환 과정에서 전체 언어를 사용할 수 있다.[16]
Lisp 매크로 처리는 Lisp 프로그램 자체가 Lisp의 리스트 객체(S식)로 표현된다는 점을 활용한다. S식을 S식으로 변환하는 함수를 통해 매크로가 처리된다. 이는 텍스트 기반 변환 방식(C++ 템플릿 제외)과는 다른, 텍스트 기반이 아닌 변환 방식이다. 프로그램 실행 전에 구문 트리(S식)를 자유롭게 조작할 수 있으므로, Lisp에서는 특수 형식(다른 언어의 키워드에 해당)을 사용자가 자유롭게 추가 및 변경할 수 있다.
구문 매크로는 Lisp 계열 언어 외에도 Prolog,[7] Erlang,[8] Dylan,[9] Scala,[10] Nemerle,[11] Rust,[12] Elixir,[13] Nim,[14] Haxe,[15] Julia[16] 등 다양한 언어에서 사용 가능하다. 또한, JavaScript[17] 및 C#[18]의 확장 기능으로도 사용할 수 있다.
6. 1. 초기 Lisp 매크로
Lisp는 매크로 이전에 Fexpr이라는 함수와 유사한 연산자를 가지고 있었으며, 이는 메타 평가 계층에 대한 창을 제공했다. 그러나 Fexpr은 효과적으로 추론하기 어려운 모델로 여겨졌다.[19]1963년, 티모시 하트(Timothy Hart)는 AI 메모 57: MACRO Definitions for LISP에서 Lisp 1.5에 매크로를 추가할 것을 제안했다.[20]
6. 2. 지시적 매크로
지시적 매크로는 매크로에 제공된 일부 형태를 의도적으로 캡처하여 다른 지시어(이전 단어를 참조하는 표현)로 참조할 수 있는 프로그래밍 매크로의 유형이다. 지시적 매크로는 폴 그레이엄(Paul Graham)의 "On Lisp"에서 처음 등장했으며, 그 이름은 언어학적 지시어, 즉 선행 단어를 대신하여 단어를 사용하는 것을 참조한다.[7]Lisp의 매크로 처리는 Lisp 프로그램 자체가 Lisp의 리스트 객체(S식)로 표현된다는 점을 활용하여, S식을 S식으로 변환하는 함수에 의해 수행된다. C++ 템플릿을 제외한 이 절의 다른 매크로가 텍스트 기반(토큰 기반 포함)인 것과 달리, 텍스트 기반이 아닌 변환 방식이라는 점에서 완전히 다르다. 프로그램 실행 전에 자유롭게 구문 트리(S식)를 조작할 수 있기 때문에, Lisp에서는 (다른 언어에서의 키워드에 해당하는) 특수 형식도 사용자가 자유롭게 추가 및 변경할 수 있다는 특징이 있다. (일부 Lisp에 있는 리드 매크로는 읽기 시에 작동하므로, 더 높은 수준으로 언어를 커스터마이징할 수 있다.)
Lisp 매크로 관련 참고 서적:
- 폴 그레이엄, ''On Lisp''
- 더그 호이트, ''Let Over Lambda''
6. 3. 위생적 매크로
1980년대 중반, 여러 논문[21][22]에서 매크로 정의와 사용의 구문 환경을 구분하여 매크로 정의자와 사용자가 의도치 않은 변수 포획을 걱정할 필요 없는 패턴 기반 시스템인 위생 매크로 확장(syntax-rules
) 개념을 소개했다. 이는 참조 투명성을 보장한다. 위생 매크로는 R5RS, R6RS, R7RS 표준에서 Scheme에 대해 표준화되었다. syntax-rules
, syntax-case
, 명시적 이름 변경 및 구문 클로저 등 위생 매크로의 여러 경쟁 구현체가 존재한다. syntax-rules
와 syntax-case
는 모두 Scheme 표준에서 표준화되었다.최근 Racket은 위생 매크로 개념과 "평가기 타워"를 결합하여, 한 매크로 시스템의 구문 확장이 다른 코드 블록의 런타임이 되도록 했다.[23] 또한 괄호가 없는 언어에서 인터리브된 확장과 파싱을 적용하는 방법을 보여주었다.[24]
Scheme 외에도 위생 매크로를 구현하거나 부분적으로 위생적인 시스템을 구현하는 여러 언어가 있다. 예로는 Scala, Rust, Elixir, Julia, Dylan, Nim, Nemerle 등이 있다.
6. 4. 응용
매크로 시스템은 여러 가지 목적으로 사용된다.- 평가 순서: 느긋한 계산 및 비엄격 함수와 같이 평가 순서를 선택하여, 언어 내장 기능과 구별할 수 없는 새로운 제어 구조를 만들 수 있다. 예를 들어, `cond`는 있지만 `if`는 없는 Lisp 방언에서 매크로를 사용하여 `if`를 `cond`를 기반으로 정의할 수 있다. Scheme은 계속과 위생 매크로를 통해 프로그래머가 자체 제어 추상화를 설계할 수 있게 한다.
- 데이터 하위 언어 및 도메인 특정 언어: 매크로는 코드에 즉시 컴파일되는 데이터 언어를 정의할 수 있게 하여, 상태 머신과 같은 구조를 자연스럽고 효율적으로 구현할 수 있다.[25]
- 바인딩 구조: 매크로는 새로운 바인딩 구조를 도입하는 데 사용될 수 있다. 가장 잘 알려진 예는 `let`을 일련의 인수에 대한 함수의 적용으로 변환하는 것이다.
펠라이젠은 이러한 세 가지 범주가 매크로의 주요 용도를 구성한다고 추측했다.[26] 다른 사람들은 위생적이지 않거나 선택적인 비위생적 변환을 허용하는 매크로 시스템에서 반복어 매크로와 같은 매크로의 대체 용도를 제안했다.
매크로와 다른 언어 기능의 상호 작용은 활발한 연구 분야이다. 소프트웨어 컴포넌트 및 모듈형 프로그래밍은 대규모 프로그래밍에 유용하지만, 매크로와 이러한 구조의 상호 작용은 함께 사용하기 위해 정의되어야 한다. Scheme 및 매크로가 있는 다른 언어에 대해 매크로와 상호 작용할 수 있는 모듈 및 컴포넌트 시스템이 제안되었다. 래킷 언어는 매크로 시스템 개념을 구문 타워로 확장하여, 구문 계층이 뚜렷하도록 위생 기능을 사용하여 매크로를 포함하는 언어로 매크로를 작성하고 모듈이 다른 모듈에 매크로를 내보낼 수 있도록 한다.
C 언어의 전처리기는 컴파일 전에 소스 프로그램을 처리한다. `#` 기호[37]로 시작하는 전처리기 지시어를 통해 코드 치환(객체 형식 매크로) 및 함수 형식 매크로 정의가 가능하다. 매크로 특유 연산자를 사용하여 심볼 문자열화나 토큰 연결도 가능하다. 함수 매크로는 인수 타입 고정 불필요, 호출 시 처리 비용 없음 등 장점이 있지만, 부작용(의도치 않은 평가 반복)에 주의해야 한다. MISRA C는 함수 매크로 사용 자제를 권고한다. 컴파일 환경에 따라 특정 값으로 전개되는 "정의된 매크로"는 디버깅, 전방 호환성, 후방 호환성, 이식성 유지 등에 사용된다.
Lisp 매크로는 Lisp 프로그램 자체가 Lisp 리스트 객체(S식)로 표현된다는 점을 활용, S식을 S식으로 변환하는 함수로 수행된다. 텍스트 기반이 아닌 변환 방식이라는 점에서 다른 매크로와 다르다. 구문 트리(S식) 조작을 통해 사용자가 특수 형식을 자유롭게 추가/변경 가능하다.
많은 텍스트 편집기에는 키보드 매크로 또는 매크로 언어가 탑재되어 있다.
- GNU Emacs는 Emacs Lisp 확장 및 키보드 매크로 기능을 제공, 이메일 클라이언트, 웹 브라우저 등 복잡한 매크로도 존재한다. "Emacs"는 TECO 편집기 매크로 집합 "'''E'''ditor '''MAC'''ro'''S'''"에서 유래되었다.
- 秀丸 에디터는 키보드 매크로 기능과 C 언어 유사 문법의 매크로 언어를 채택한다.
- EmEditor는 WSH 엔진을 이용, JScript, VBScript로 기술 가능하며, COM 객체를 통해 EmEditor에서 Microsoft Excel 등을 조작할 수 있다. Ruby, Python 등으로도 기술 가능하다.
- 사쿠라 에디터는 키 매크로, WSH 대응 외에 ppa.dll을 통해 파스칼 스타일 매크로, ActivePerl, ActiveRuby 등으로 Perl, Ruby 매크로 작성이 가능하다.
- MIFES는 C 언어 유사 컴파일 타입 매크로 언어 MIL/W를 지원하며[38], 키보드 매크로를 MIL/W로 변환하는 기능도 제공한다.
- Sublime Text는 Python 처리계를 통해 매크로 기술이 가능하며, C와의 API를 이용한 일본어 IME 대응 매크로가 존재한다.[39]
7. 기계 독립적인 소프트웨어를 위한 매크로
STAGE2 모바일 프로그래밍 시스템은 "기계 독립적인" 매크로를 사용하여 애플리케이션을 작성하는 방식을 채택했다. 기본적인 매크로 컴파일러(SIMCMP)는 주어진 컴퓨터의 특정 명령어 집합을 이러한 매크로로 매핑했다. 이를 통해 기계 독립적인 매크로로 작성된 애플리케이션(특히 컴파일러)은 기본적인 매크로 컴파일러가 있는 모든 컴퓨터에서 수정 없이 실행될 수 있었다.[27][28]
이러한 맥락에서 실행되는 첫 번째 애플리케이션은 기계 독립적인 매크로 언어로 작성된 더 정교하고 강력한 매크로 컴파일러였다. 이 매크로 컴파일러는 부트스트랩 방식으로 자체에 적용되어 자체의 컴파일된, 훨씬 더 효율적인 버전을 생성했다. 이러한 접근 방식의 장점은 복잡한 애플리케이션을 한 컴퓨터에서 매우 다른 컴퓨터로 매우 적은 노력(각 대상 머신 아키텍처에 대해 기본적인 매크로 컴파일러 작성만)으로 포팅할 수 있다는 것이었다.[27][28]
그러나 C와 같은 현대 프로그래밍 언어의 등장으로, 사실상 모든 컴퓨터에서 컴파일러를 사용할 수 있게 되면서 이러한 접근 방식은 덜 중요해졌다. 그럼에도 불구하고 이는 컴파일러 부트스트래핑의 초기 사례 중 하나였다.[27][28]
8. 어셈블리 언어 매크로
어셈블리 언어 매크로는 프로그래머가 모든 네이티브 어셈블러 프로그램 명령 집합에 대해 정의할 수 있지만, 일반적으로 다음과 같은 운영 체제 기능에 접근하는 데 사용된다.[29]
- 액세스 방식에 의한 주변 장치 접근 (OPEN, CLOSE, READ 및 WRITE와 같은 매크로 포함)
- 서브태스크 생성 및 동기화를 위한 ATTACH, WAIT 및 POST와 같은 운영 체제 기능.
- DCB 매크로—DOS의 DTF(파일 정의)에 대한—또는 코드와 상수의 조합.
- 실행 가능한 코드는 ''분기 및 링크 레지스터'' 명령 또는 운영 체제 기능을 직접 호출하기 위한 슈퍼바이저 호출 명령으로 종료.
OS/360과 같은 IBM 메인프레임 운영 체제에서는 어셈블리 언어 프로그램에서만 완전한 운영 체제 기능을 사용할 수 있었다. 표준 매크로 명령에 고급 언어에서 사용할 수 있는 루틴에 해당하는 명령이 항상 있는 것은 아니었기 때문이다.
어셈블리 언어에서는 기계어 명령과 일대일로 대응하는 니모닉만을 기술할 수 있었다. 그 후, 어셈블러에 매크로 기능을 추가한 매크로 어셈블러가 등장했다. 매크로 어셈블러는 복수의 니모닉을 묶어 간략하게 기술할 수 있다.
9. 역사
1950년대 중반, 디지털 컴퓨터 프로그램을 작성하는 데 어셈블리 언어 프로그래밍이 일반적으로 사용되면서, '''매크로 명령어'''의 사용이 시작되었다. 이는 하나의 매크로 명령어로 여러 어셈블리 언어 구문을 생성하여 프로그램 코딩량을 줄이고, 프로그램 작성 표준(예: 표준 방식으로 입/출력 명령 지정)을 준수하기 위함이었다.[31] 매크로 명령어는 어셈블리 언어 프로그래밍과 이후에 나온 고급 프로그래밍 언어(FORTRAN, COBOL 등) 사이의 중간 단계였다. IBM 705 컴퓨터용 "매크로 언어"를 개발한 초기 프로그래밍 설치 환경 중 두 곳은 델라웨어의 Dow Chemical Corp.와 캘리포니아의 공군 물자 사령부, 탄도 미사일 군수 사무소였다. 대상 어셈블리 언어 형식으로 작성된 매크로 명령은 어셈블러 전처리 프로그램인 매크로 컴파일러에 의해 처리되어 하나 이상의 어셈블리 언어 명령어를 생성하고, 어셈블리 언어 명령어를 기계어 명령어로 변환하는 어셈블러 프로그램에 의해 처리되었다.[32]
1950년대 후반, 매크로 언어는 매크로 어셈블러로 이어졌다. 이는 하나의 프로그램이 매크로 전처리기와 어셈블러의 기능을 모두 수행하는 결합이었다.[32]
1959년, 벨 연구소의 더글러스 E. 이스트우드와 더글러스 맥길로이는 널리 사용되던 SAP 어셈블러에 조건부 및 재귀 매크로를 도입하여 매크로 SAP를 만들었다.[33] 맥길로이의 1960년 논문은 범용 매크로 프로세서를 통해 모든 프로그래밍 언어(고급 프로그래밍 언어 포함)를 확장하는 분야에서 중요한 역할을 했다.[35][33]
매크로 어셈블러를 통해 어셈블리 언어 프로그래머는 자체 매크로 언어를 구현할 수 있었으며, 동일한 CPU를 사용하지만 다른 운영 체제를 실행하는 두 기기 간에 코드의 제한적인 이식성을 허용했다. (예: 초기 버전의 MS-DOS 및 CP/M-86) 매크로 라이브러리는 각 대상 시스템에 대해 작성해야 했지만, 전체 어셈블리 언어 프로그램은 그렇지 않았다. 더 강력한 매크로 어셈블러는 다른 기기 또는 다른 운영 체제에서 다른 코드를 생성할 수 있는 조건부 어셈블리 구문을 매크로 명령어에서 사용할 수 있도록 하여 여러 라이브러리의 필요성을 줄였다.
1980년대와 1990년대 초반, 데스크톱 PC는 몇 MHz에서만 실행되었고, 어셈블리 언어 루틴은 C, Fortran, Pascal 등으로 작성된 프로그램의 속도를 높이는 데 일반적으로 사용되었다. 당시 이러한 언어는 서로 다른 호출 규칙을 사용했다. 매크로는 어셈블리 언어로 작성된 루틴을 거의 모든 언어로 작성된 응용 프로그램의 프런트 엔드와 연결하는 데 사용될 수 있었다. 기본 어셈블리 언어 코드는 동일하게 유지되었으며, 각 대상 언어에 대해 매크로 라이브러리만 작성하면 되었다.
최신 운영 체제에서는 일반적으로 동적 라이브러리에서 제공되는 서브루틴을 통해 운영 체제에 접근할 수 있다. C와 같은 고급 언어는 운영 체제 기능에 대한 포괄적인 액세스를 제공하므로 이러한 기능을 위해 어셈블러 언어 프로그램이 필요하지 않다.
10. 한국에서의 매크로
온라인 게임에서 매크로는 게임 밸런스를 해치고 불공정 경쟁을 유발하는 부정행위로 간주되어 강력하게 제재된다.[4] 더불어민주당은 게임 매크로를 불법으로 규정하고 처벌하는 법안을 발의하는 등 적극적으로 대응하고 있다. 매크로 프로그램 제작 및 유포는 정보통신망법 위반으로 처벌될 수 있으며, 게임산업진흥법에 따라 게임물 관련 사업자의 승인을 받지 않은 프로그램 배포도 금지된다.
게임 외에도, 사무 자동화, 웹 브라우징, 소프트웨어 개발 등 다양한 분야에서 매크로가 활용되고 있다.
참조
[1]
서적
Oxford English Dictionary
https://www.oed.com/[...]
Oxford University Press
[2]
논문
The Share 709 System: Programming and Modification
ACM
1959-04
[3]
논문
A General Purpose Macrogenerator
1965-10
[4]
웹사이트
Runescape: The Massive Online Adventure Game by Jagex Ltd.
http://www.runescape[...]
2008-04-03
[5]
웹사이트
scripts: vim online
https://www.vim.org/[...]
[6]
웹사이트
T E X forever!
http://svn.tug.org/T[...]
2024-12-06
[7]
웹사이트
Prolog Macros
https://www.metaleve[...]
2021-04-05
[8]
웹사이트
Erlang -- Preprocessor
https://erlang.org/d[...]
2021-05-24
[9]
웹사이트
The Dylan Macro System — Open Dylan
https://opendylan.or[...]
2021-04-05
[10]
웹사이트
Def Macros
https://docs.scala-l[...]
2021-04-05
[11]
웹사이트
About - Nemerle programming language official site
http://nemerle.org/A[...]
2021-04-05
[12]
웹사이트
Macros - The Rust Programming Language
https://doc.rust-lan[...]
2021-04-05
[13]
웹사이트
Macros
https://elixir-lang.[...]
2021-04-05
[14]
웹사이트
macros
https://nim-lang.org[...]
2021-04-05
[15]
웹사이트
Macros
https://haxe.org/man[...]
[16]
웹사이트
Metaprogramming · The Julia Language
https://docs.juliala[...]
2021-04-05
[17]
웹사이트
Sweet.js - Hygienic Macros for JavaScript
https://www.sweetjs.[...]
[18]
웹사이트
LeMP Home Page · Enhanced C#
http://ecsharp.net/l[...]
[19]
웹사이트
untitled email
http://www.brinckerh[...]
2012-05-03
[20]
간행물
MACRO Definitions for LISP
1963-10
[21]
conference
Hygienic Macro Expansion
[22]
문서
Clinger, Rees. "Macros that Work"
http://portal.acm.or[...]
[23]
뉴스
Composable and compilable macros: you want it when?
http://www.cs.utah.e[...]
[24]
뉴스
Honu: Syntactic Extension for Algebraic Notation through Enforestation
http://www.cs.utah.e[...]
[25]
웹사이트
Automata via Macros
http://cs.brown.edu/[...]
[26]
문서
Matthias Felleisen, LL1 mailing list posting
http://people.csail.[...]
[27]
논문
A base for a mobile programming system
ACM
1969-09
[28]
논문
The mobile programming system: STAGE2
ACM
1970-07
[29]
웹사이트
University of North Florida
https://www.unf.edu/[...]
[30]
웹사이트
DTF (DOS/VSE)
https://www.ibm.com/[...]
[31]
웹사이트
IBM Knowledge Center
http://www.ibm.com/s[...]
2013-08-16
[32]
웹사이트
Assembler Language Macro Instructions
http://www.cisco.com[...]
[33]
웹사이트
Computing Science Technical Report No. 99 – A History of Computing Research at Bell Laboratories (1937–1975)
http://cm.bell-labs.[...]
Bell Labs
2020-02-02
[34]
encyclopedia
Macro SAP – Macro compiler modification of SAP
http://hopl.murdoch.[...]
[35]
논문
The History of Macro Processors in Programming Language Extensibility
[36]
웹사이트
syscall package - syscall - Go Packages
https://pkg.go.dev/s[...]
2024-06-06
[37]
문서
文字コード
[38]
웹사이트
マクロガイド-MIFESシリーズ-サポート-メガソフト株式会社
http://www.megasoft.[...]
[39]
Github
GitHub - chikatoike/IMESupport: IMESupport for Sublime Text 2/3
https://github.com/c[...]
[40]
뉴스
Visual Studioにマクロが戻る
https://www.infoq.co[...]
[41]
저널
The Share 709 System: Programming and Modification
http://doi.acm.org/1[...]
ACM
1959-04
[42]
저널
A General Purpose Macrogenerator
1965-10
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com