Flash ActionScript 사용기

사용기라고 하니 뭔가 거창하지만, 오전에 Flash CS3 trial을 받고, 오후에 코드 제네레이터 초안까지 잡았으니 일단 사용기는 사용기.

C++과 통신할 수 있는 ActionScript 모듈을 만들어내는게 목표였는데, 사용하다 괴로운 점이 한 두가지가 아니었다.

약 타입 언어주제에 제한이 많다

완전히 동적 타입이라 사용하기 쉬운 것도 아니고, 그렇다고 함수형 언어의 강력한 정적 타입 검사랑은 비교도 안되는 주제에 이런 저런 안되는게 왜 그리 많은. 게다가 타입 지정이 기본도 아님. 타입을 지정하지 않고도 변수를 사용해도 되고, 경고도 없다. 이럴거면 차라리 python처럼 duck–typing을 해줘…

텍스트 기반의 소켓 구현

사용해야 했던게 Flash 8 / ActionScript 2.0이라소 binary socket이 없다. 그럼 무슨 짓을 해야하는가 하면…

  • Binary 와 text 변환을 수시로 한다
  • 한 번에 전송되는 단위는 NULL-terminated string 1개
  • 다만 이렇게 간단한 데이터 구조라 버퍼링 같은 것은 밑단에서 해결
  • 사용되는 문자열은 기본적으로 UTF-8

Binary -> Text 변환에 UTF-8을 더하면, 안정적으로 보낼 수 있는 binary–to–text 변환이 아주 적은 수로 줄어든다. UTF-8의 경우 각 바이트의 처음 몇 비트만 보면 이게 연속인지, 끝인지 파악할 수 있는데 (물론 첫 바이트로 다 알 수 있기도하고), 단순히 8bit을 다 쓰는 인코딩을 했다간 이게 뭐가 날아갈지.

게다가 \0 이 전송되면 그걸로 메시지 하나가 종료… 일단 뼈대로는 구글 차트에서 사용되는 8bit 중 6bit을 쓰게해주는 녀석을 생각 중.

함수를 다루는 것

그렇지만 이게 함수객체의 형변환 검사가 되는 것도 아니고 좀 많이 불편하다. 그래도 멤버 함수를 배열로 넣을 수 있다는 것은 적당한지도.

배열 생성자가 모호하다

배열 생성 구문이,

var x:Array = new Array()

같은 형태인데, 다음 두 가지가 다 가능하다.

var x1:Array = new Array(10)
var x2:Array = new Array(1, 2, 3, 4, 5)

어떤 차이가 날까?

첫번째 항목은 길이 10짜리 배열을, 두번째 항목은 1, 2, 3, 4, 5를 원소로 갖는 배열이 만들어진다. 원소 1개짜리 배열은 선언하고 / 대입하는 형태로 써야함.

for statement scope가 괴악

한 가지 형태로밖에 재현을 못하고 있긴한데 for loop 이전에 변수 선언 / 들어가서 변수 선언에 따라 스택에 쌓인 다른 변수 값이 변하는 괴악한 현상을 당했다. 이건 좀 알아봐야할 것 같은데…

File scope의 괴악함

ActionScript 2.0에서 Flash 자체 파일 — .fla — 말고 외부에 .as 로 ActionScript 파일을 분리할 수 있는데, 다음과 제약이 좀 문제가 많다.

  • 파일 전체에서는 class 혹은 interface 안에 들어간 선언들만 의미가 있다
  • 전역 함수나 변수는 선언할 수 없다

라는 것. Python의 __main__()을 생각하고 테스트를 작성하다가 잘 안되어서 각각의 클래스에 static member로 추가.

문서 검색의 문제

PDF 파일 혹은 Flash CS3 자체에 내장된 도움말 파일을 볼 수 있긴한데, 둘 다 검색이 별로다. MSDN offline 파일의 증분검색이나, man 페이지처럼 후다닥 볼 수 있는 걸 기대하면 안된다

편집기 문제

사실 외부로 class들을 분리한게 소스 컨트롤에 넣는 것과, 편한 편집기 — 내 경우엔 vim — 를 쓰자는 거였는데, 정작 전역 변수나 함수를 선언할 수 있는 .fla는 외부 편집기에서 편집하는게 사실상 불가능하다 — binary와 UTF-16으로 보이는 문자들이 섞인 괴악한 물건이다보니 WordPad로 열어보고 소스를 좀 보다가 Flash CS3 trial을 설치함.

뭐 이런 문제도 문제고 — ActionScript 3은 좀 더 낫다고 하는데 — 속도 문제나 편집기 문제같은 걸 생각할 때 이번 같은 특수한 응용이 아니고서야 APM묶음에 의존하지 (그러니까 ActionScript와 대응해서는 Perl,PHP,Python…) 이걸 쓰고 싶겠냐. RIA라고 굳이 flash에 의존하지 않는 이유를 너무나 명확히 본 기분이다.