나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-10-31 09:09:57

AutoHotkey

오토핫키
AutoHotKey
파일:오토핫키 로고.svg
AutoHotkey
Automation. Hotkeys. Scripting.
라이선스 GNU GPLv2
최신 버전 2.0.18 (2024년 6월 6일)
홈페이지 파일:홈페이지 아이콘.svg
1. 개요2. 문법3. 장점
3.1. 쉬운 난이도와 높은 접근성3.2. 설치의 간편함
4. 단점
4.1. 소스 코드 유출4.2. 보안 프로그램 오류4.3. 인식4.4. 확장성 제한
5. 공식 문서 및 강좌6. 커뮤니티7. 여담

[clearfix]

1. 개요

오토핫키(AutoHotkey)는 윈도우에서 키보드 단축키 설정, 간단한 매크로 제작, 자동화 등을 목적으로 하는 무료 오픈 소스 기반의 스크립트 언어이다. 간단한 프로그램 제작에 특화된 직관적인 문법을 갖추고 있으며 마우스와 키보드 제어, 화면에서 이미지 검색, 윈도우 창 조작, 간단한 GUI 제작 등 언어의 목적에 맞는 기능이 내장되어 있다.

2. 문법

BASIC, Python 같은 언어처럼 단순하고 직관적인 문법을 가지고 있다. 1999년경에 나온 AutoIt을 만들던 제작자 그룹 중 한 명이 AutoIt V2에서 V3로 넘어가는 시점에서 컨셉에 대한 견해차이로 따로 독자적으로 만들어 AutoIt 커뮤니티에 공개하면서 오토핫키가 탄생하였다. AutoIt V2를 기반으로 했기 때문에 그 문법을 그대로 차용하고 있다. 반면, 현재의 AutoIt V3는 아예 다른 문법을 가지고 있다.

2023년 v2.0으로 바뀌면서 기존 버전(v1.0, v1.1(AutoHotkey_L))과 하위 호환성이 거의 없어졌다. 다른 프로그래밍 언어들과 비슷하게 문법이 바뀌었고, 함수 기반 구문으로 전환이 필요하다. 예를 들어 기존 버전에서는
MsgBox, Hello, World!
처럼 함수 이름 다음에 매개변수를 쉼표로 구분해 나열했다면 v2.0 부터는
MsgBox("Hello, World!")
MsgBox "Hello, World!" ; 반환값이 필요 없는 경우 소괄호를 쓰지 않을 수 있다
이렇게 써야 한다.

난이도가 쉽다지만 다른 프로그래밍 언어와 다른 점이 많다보니 난해한점도 많다. := 익스프레션= 리터럴의 차이만 봐도 그렇고 내장된 명령과 사용자 함수의 표현 차이도 난다. 익스프레션은 식을 집어넣는 수식이고, 리터럴은 문자를 그대로 대입하는 수식이다. v2 버전에선 하위 호환성을 버리고 이런 문제를 수정하여 새로운 버전을 이용하려면 기존 소스 코드의 대대적인 수정이 필요하다.

Python에 익숙하다면 ahk 같은 라이브러리를 이용하여 오토핫키를 대신할 수 있다.

3. 장점

3.1. 쉬운 난이도와 높은 접근성

쉽다. 쉽게 만든다고 만든 AutoIt 만 해도 BASIC 언어의 형태를 그대로 가지고 있었기 때문에 비프로그래머들에게는 배우기 매우 어려웠던 반면, AHK 는 직관적이고 꼭 필요한 기능만 담아 논리적인 센스만 조금 있다면 누구나 쉽게 접근할 수 있다. 대부분의 명령은 영어만 할 줄 안다면 바로 이게 무슨 역할을 하는지 알아볼수 있다. C언어에선
#!syntax cpp
#include <stdio.h>
int main(void)
{
     printf("Hello world!");
     return 0;
}
처럼 코딩을 할 수 있다면, 오토핫키에선
Msgbox, Hello world!
라고 코딩할 수 있다. 비전문가가 볼때 훨씬 간결하고 Msgbox를 "메시지 박스"라고 직관적으로 알아듣는다.

또한, 처리 순서에 대해서도 비전문가가 이해하기 쉽다. 그냥 위에서 아래로 굴러가니까. C언어의 경우 함수를 따라 이동하지만, 오토핫키는 그런거 없다.

C에서는 수 줄에 걸쳐서 사용해야하는 랜덤 함수는, 오토핫키에선 한 줄로 간단하게 표현 가능하다.
#!syntax cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
     srand((unsigned int)time(NULL));
     int var = rand()%100+1; //(1부터 100사이의 난수를 생성하여 var에 저장한다)
     return 0;
}
Random, var, 1, 100 ;(1부터 100사이의 난수를 생성하여 var에 저장한다)

3.2. 설치의 간편함

오토핫키의 설치 파일의 용량은 3 MB 이하이며, 설치도 매우 빠르다. 부담없이 빠르게 PC에 설치해서 쓸 수 있다.

4. 단점

4.1. 소스 코드 유출

모든 프로그래밍 언어가 비슷하지만, 오토핫키는 특히 심하다. L버전 오토핫키를 쓴다면 exe파일에 열기(O)→메모장을 선택시 하단부에 소스가 적나라하게 보인다. 이외의 버전에서는 디컴파일러 혹은 올리디버거를 이용해 누구나 쉽고 빠르게 뚫을 수 있다. 그러나, 이를 막는 패킹 및 난독화라는 작업이 활성화 되고, 오핫도 슬슬 안전지대에 들어가는 듯 했으나... 그런 거 없다. 이마저도 리버싱 고수에게는 통하지 않는다. 다만 오토핫키는 GPL 라이센스 하에 배포되고 있으므로, AHK2EXE를 이용해 컴파일된 오토핫키 스크립트는 (컴파일 과정에서 오토핫키 소스코드가 통합되므로) 자동적으로 GPL 오픈소스 라이센스가 전염되어 오픈소스로 공개를 해야 한다는 주장이 있다.

그렇지만 GPL 라이선스의 제품이 직접 포함되지 않은 산출물은 GPL이 아니어도 된다! 실제로, GPL 라이선스 컴파일러인 GCC로 산출된 프로그램은 GPL과 별개이다. 오토핫키에서의 바이너리화가 된다면 하나의 실행 파일에 묶이게 되며, 이는 라이브러리와 같은 형태가 아니므로(그리고 분리불가능한 상태이므로) 산출된 프로그램에는 GPL이 적용되지 않는다. 또한, 스크립트 언어에서의 컴파일은 인터프리터와 스크립트가 하나의 exe로 묶이는 개념으로 설명되곤 하는데, 이 경우 또한 자유 소프트웨어 재단의 FAQ에서 GPL 전염이 일어나지 않는다고 밝혔다. 한국어 번역

또한, 오토핫키(1.0)의 제작자 Chris Mallett도 컴파일된 exe(산출물)은 GPL전염이 되지 않는다고 말한 바 있다.
No, because the EXE doesn't contain AutoHotkey's source code. Therefore, when you distribute a compiled script, you're not distributing any GPL source, and thus your application isn't subject to the GPL unless you want it to be. In other words, when you build an app with AutoHotkey, there are no restrictions on selling it, nor do you have to release your script's source code. This is because it is similar in principle to having built the app with a GPL C++ compiler.
'AutoHotkey를 이용한 결과물에 GPL전염이 됩니까?'에 대한 Chris의 답변 원문
즉, GPL 라이선스의 범위는 오토핫키(인터프리터)의 소스 코드(C++)와 그로 인해 나온 산출물(오토핫키 인터프리터, AutoHotkey.exe)의 경우이며, 이를 이용하여 인터프리터와 묶여 컴파일된 프로그램은 GPL C++ 컴파일러를 사용한 빌드와 마찬가지로 GPL이 아니어도 좋다는 뜻이다.

4.2. 보안 프로그램 오류

작성한 스크립트(.ahk)를 실행파일(.exe)로 컴파일하는 옵션도 있는데 바이러스로 판정되는 경우가 많다. 키보드 보안 프로그램이 실행중이라면 작동하지 않을 수 있다.

4.3. 인식

문법의 난이도가 매우 낮아 누구나 쉽게 코딩이 가능하고 일부 몰상식한 사용자들에 의해 제작된 게임 핵 형태의 매크로가 돌아다니는 것을 쉽게 목격할 수 있기 때문에 툴키디들의 전유물이라는 인식이 꽤 퍼져있는 편이다.

한편 상술한 사용처의 문제 때문에 일부 백신에선 오토핫키를 바이러스로써 잡아내기도 한다. 행위 기반으로 잡히는 경우가 90%인데, 어베스트맥아피같은 유명한 백신들에게도 가끔가다 걸리니 주의요망. 바이러스 토탈에 검사를 해보면 멀쩡한 오토핫키 파일이라도 적게는 두세 개부터 많게는 10개이상의 백신이 감지하는 모습을 볼 수 있다.

4.4. 확장성 제한

문법을 더 쉽고, 더 쉽고, 또 더 쉽게 만드는 바람에 자유도가 낮다. 라이트하게 코딩하는 오토핫키 유저에겐 상관 없지만, 오리지널 B버전은 global 명령도 없으며[1] 약간 개선된 L버전도 Python같은 다른 스크립트 언어에 비해선 확실히 떨어진다. 그래서 복잡한 매크로 프로그램을 작성하기엔 기능이 부족하거나 코드가 복잡해지고 가독성도 떨어진다.

5. 공식 문서 및 강좌

6. 커뮤니티

7. 여담

stdout.Write(msg)
stdout.Read(0)
sleep 5000
}}}또는
{{{FileAppend,Test Message`n,*
}}}으로 구문을 저장하고
{{{For /F "tokens=*" %L in ('""%ProgramFiles%\AutoHotkey\AutoHotkey.exe" "My Script .ahk""') do @Echo %L
}}}
[1] Byref 사용