오토잇

**오토잇**()은 마이크로소프트 윈도우를 위한 프리웨어 자동화 언어이다. 초기 버전은 주로 마이크로소프트 윈도우의 프로그램을 위한 자동화된 스크립트를 만드는 데에 사용되었다. 그러나 지금은 전반적인 디자인과 기능 모두에서 향상된 기능을 포함하는 프로그래밍 언어로 발달하였다.

최근에 출시된 버전 3은 문법이 더 베이직에 가깝게 되었고, 3 세대 프로그래밍 언어와 **Variant**라고 불리는 자료형을 포함한다. 지원되는 운영 체제는 윈도 95, 98, ME, NT4, 2000, XP, 2003, 비스타, 2008 이 있다. (그러나 3.3.0.0 버전 이후는 윈도우 9x 지원 부분이 제거되었다.)

오토잇 스크립트는 바이트 코드(a3x) 혹은 실행 파일(실행 가능한 bin 파일에 a3x 파일을 추가함.)로 변환이 가능하다. 실행 파일은 오토잇 인터프리터가 설치되어있지 않은 컴퓨터에서도 잘 작동한다. 다양한 함수 라이브러리(UDF, "사용자 정의 함수"로 알려져 있다.)는 표준으로 포함되어 있거나 웹사이트에서 추가할 수 있다. 오토잇은 사실상 IDE인 SciTE 편집기와 함께 배포된다. 변환기 및 도움말 텍스트를 완벽하게 배포판에 포함되어 오토잇 개발자에 대한 사실상의 표준 환경을 제공한다.

## 기능
* 배우기 쉬운 BASIC 류의 문법
* 일반적인 고급 언어 수준의 함수, 반복분, 표현식 분석
* 키눌림과 마우스 움직임 흉내내기
* 창과 프로세스 조절
* 모든 표준 윈도 컨트롤을 제어 가능
* 스크립트를 단독 실행파일로 변환 가능 (AutoitSC.bin에 a3x를 추가하는 방식)
* 그래픽 사용자 인터페이스(GUI) 생성
* 컴포넌트 오브젝트 모델(COM) 지원
* 정규 표현식 지원 (펄 호환 정규 표현식, PCRE 라이브러리 사용)
* 외부 DLL과 윈도우 API 함수 직접 호출, 구조체 지원
* 조절가능한 RunAs 함수
* 상세한 도움말 파일(개인에 의해 일부 한글화 된)과 지원 포럼에 기반한 방대한 영문 커뮤니티
* 윈도 95 / 98 / ME / NT4 / 2000 / XP / 2003 / Vista / 2008 / 7 / 8과 호환
* 유니코드와 x64 지원
* 심리적 안정을 위해 디지털 서명됨 (Autoit3.exe에 한하여)
* 윈도우 비스타의 사용자 계정 제어(UAC)와 작동가능
* 다른 프로그래밍 언어에서 사용 가능한 **AutoitX3** (WinAPI 호출 DLL과 COM 호출 방식, 유니코드와 x64 지원)
* 라이브러리를 통한 객체 지향 설계를 지원 (autoitobject UDF/DLL 필요)

## 사용
오토잇은 윈도나 자동화 작업(웹사이트나 네트워크 모니터링, 디스크 최적화나 백업등)에 필요한 유틸리티를 만들 수 있다. 또한 응용 프로그램을 제어나 테스트하는 데에 오토잇 스크립트를 사용할 수 있지만 온라인 게임에서 봇을 돌리거나 악성코드를 만드는 데에 사용될 수도 있다. 대한민국 IT 산업에서는 주로 소프트웨어 테스트, 휴대용 프로그램으로의 리팩 등에 사용하고 있다.

## 역사
* 1998년 크리스마스 - 키 전송을 위한 C 프로그램의 아이디어
* 1999년 1월 - 오토잇 1.0 출시
* 1999년 8월 - 오토잇v2 와 오토잇X 출시
* 1999년 9월 - 오토잇에 변환기 포함됨.
* 2002년 12월 - 오토잇v3 (공개 베타 버전) 출시
* 2004년 2월 - 오토잇v3 (안정된 버전) 출시
* 2006년 9월 - Auto3Lib 개발 시작
* 2007년 11월 - 오토잇 v3.2.10.0 출시, Auto3Lib이 AutoIt v3에 포함됨.
* 2008년 5월 - 오토잇 v3.2.12.0 출시, 통합된 GUI 기능 추가
* 2010년 1월 - 오토잇과 오토잇X v3.3.4.0 출시

## 커뮤니티
오토잇 커뮤니티는 2009년 6월 27일 오후 8시 50분 을 기준으로 30,915명의 사용자와 660,898개의 글이 있고, 최대 동시 접속자수는 한국 시간으로 2007년 7월 13일 오전 5시 2분에 4,882명이다.

## 문법
### 연산자

### 연산자 우선순위

## [[헬로 월드 프로그램]]

```autoit
ConsoleWrite("Hello World!" & @CRLF)
; ConsoleWrite는 함수이고 단 하나의 인자만 받아서 쓴 바이트 개수만큼 반환한다.
; &는 문자열 결합이며 이 연산자를 사용하면 어떤 변수라도 문자열로 변환된뒤 결합된다.
; @CRLF는 타 프로그래밍 언어에서 \r\n을 의미한다. (캐러지 리턴과 라인 피드)
; ;는 주석 표시에 사용된다.
```


위의 오토잇 스크립트 소스는 표준 출력에 "**Hello World**"를 출력한다.

그러나, 일반적으로 오토잇은 콘솔에 최적화되어 있지 않고 주로 GUI을 이용하기 때문에 대부분은 헬로 월드 프로그램으로 메시지 상자를 이용한다.


```autoit
MsgBox(64, Default, "Hello World!")
; MsgBox는 메시지 상자를 띄우는 함수이고 사용자가 선택한 버튼에 따라서 반환되는 값이 달라진다.
; 첫 번째 인자로 넘긴 64는 MsgBox 함수에서 메시지 상자에 정보 아이콘을 추가할 때 사용된다.
; (몇몇 함수는 한 인자를 flag로 받아서 필요한 옵션을 추가하려면 해당 값만 추가하면 된다.)
; Default는 사용되는 부분에 따라서 다르게 이용된다, 기본적으로 기본값이다.
; (MsgBox 함수는 두 번째 인자가 Default 이면 스크립트의 이름(@ScriptName)을 출력한다.)
; 문자열은 "나 '로 감쌀 수 있다.
```


이 오토잇 스크립트 소스는 정보 아이콘을 포함한 메시지 상자를 출력한다.

## 가능한 내용
* 오토잇에는 아직 배타단계인 PluginOpen, PluginClose 함수가 있다. 이 함수의 주 목적은 오토잇 플러그인용으로 개발된 DLL을 마치 오토잇 함수처럼 이용하기 위해서이다.
* WinAPI를 이용하여 오토잇 스크립트에 어셈블리 코드를 포함하는 것이 가능하다.

## 한계
* 네임스페이스, 멀티스레딩을 지원하지 않는다.
* 기계어로 컴파일 할 수 없다. (현재 오토잇에서는 바이트 코드(a3x)로의 변환만 지원한다.)
* 코드 한 줄에 4095 문자를 초과하여 입력할 수 없다.
* 환경 변수에는 32767 문자를 초과하여 입력할 수 없다.
* 함수는 재귀 호출을 최대 5,100번까지만 할 수 있다.
* 배열은 최대 64 차원, 원소는 2^24 (16,777,216)개를 넘어갈 수 없다.
* 얻을 수 있는 최대 창 제목과 텍스트는 65535 문자이며, 창 제목 얻어오기는 윈도우 95이하에서는 불가능하다.
* GUI 폼에 포함될 수 있는 최대의 컨트롤의 수는 65,532개이다.
* COM 객체의 최대 가능한 이벤트 수는 64개이다.
* 커멘드라인에서 받을 수 있는 최대의 매개변수는 4,096 문자, 64 단위(+ 단위 개수)이다. ($CmdLineRaw 문자열 변수와 $CmdLine 배열)
* 트레이 메뉴의 최대 아이템 수는 505개이다.
* 트레이 메뉴의 최대 이벤트 수는 32개이다.
* 트레이 툴팁의 최대 문자의 수는 64개이다.
* 문자열, 이진값은 2^31 (2,147,483,647) 바이트 이상 변수에 저장될 수 없다.
* 변수의 포인터를 직접 얻을 수 없다. (구조체나 CallBack 함수에 한해서 포인터를 얻을 수 있다.)

## 알려진 문제

현재 오토잇에서 알려진 문제는 다음과 같다.

* 유니코드 버전에서 바이너리와 문자열 변환이 ASCII 인코딩에서 정상적으로 변환되지 않는 문제가 있다. (해당 부분은 자체 함수만을 사용하여 해결하거나 윈도 API를 여러번 사용하여 해결이 가능하다, 원인은 바이너리와 문자열 길이를 같게 보기 때문이다.)
* 마찬가지로 아스키 버전에서는 멀티바이트 문자 처리에 약간 문제가 있다. (글자 "테스트"를 StringLen 함수를 이용해서 문자열 길이를 얻으면 6을 반환한다.)
* DLL 관련 함수에서 때때로 스크립트가 강제 종료되는 경우가 있다.
* 멀티스레딩이 지원되지 않고, 강제로 지원하려고 하면 반복문이나 Sleep 함수에서 문제가 발생한다.
* #include에서 자기 자신이나 서로를 포함하는 경우, #include-once가 붙지 않으면서 함수를 포함한 소스 코드를 두 번 이상 포함한 경우, FileInstall 함수에서 첫 번째 인자로 넘긴 소스 파일의 위치가 예측 불가능하거나 존재하지 않는 경우에는 변환되지 않는다.
* Obfuscator가 완전히 소스 코드의 가독성을 떨어트릴 수 없고, 일부 코드에서는 오히려 에러를 발생한다. (에러가 발생하게 만드는 함수는 AdlibEnable, Call, Eval, GuiRegisterMsg, GuiSetOnEvent, GuiCtrlSetOnevent, HotKeySet, IsDeclared, TrayItemSetOnEvent, ObjEvent, Opt 설정의 "OnExitFunc" 가 있다.)
* 배열의 비교가 불가능하다. (아래 예제 참고, 예제와 같이 배열의 원소가 같던 다르던 간에 상관없이 배열의 비교를 시도하면 같은 값을 반환한다.)

```autoit
Dim $Aa[3] = [1, 2, 3], $Ab = $Aa, $Ba[3] = [4, 5, 6]
Dim $sFormat = "%8s | %-8s| %-8s| %-8s\n"

ConsoleWrite("(Aa, Ab, Ba) 배열을 비교합니다." & @CRLF)
ConsoleWrite(StringFormat($sFormat, "Compare", _
	"=", "==", "<>"))
ConsoleWrite(StringFormat($sFormat, "Aa, Ab", _
	($Aa = $Ab), ($Aa == $Ab), ($Aa <> $Ab)))
ConsoleWrite(StringFormat($sFormat, "Aa, Ba", _
	($Aa = $Ba), ($Aa == $Ba), ($Aa <> $Ba)))

#cs 실행 결과 나온 출력
(Aa, Ab, Ba) 배열을 비교합니다.
 Compare | =       | ==      | <>
   Aa,Ab | False   | True    | True
   Aa,Ba | False   | True    | True
#ce
```


## 같이 보기
* Automator (OS X 전용)
* 비주얼 베이직
* 오토핫키
* iMacros
* thinBasic

## 각주

## 외부 링크
*  공식 홈페이지
*  오토잇 커뮤니티 /  오토잇 커뮤니티
*  오토잇 도움말
*  한국어 오토잇 도움말 번역본 배포처 , 오토잇 도움말 한글(뱊  , )

분류:스크립트 언어
분류:베이직 프로그래밍 언어 계열
분류:자동화 소프트웨어