ActionScript: Shock and awe

C…더 이상 이 주제로 글을 쓰고 있지만 아마도, 그리고 기원하건데 마지막 글일 듯.

지역 변수의 스코프 문제

지역 변수의 선언이 유효한 범위(local variable scope) 가 굉장히 괴악하다. 다음은 너무나도 적절한 mtasc.com에서 제시하는 예제.

function f() {
	var x = 1;
	if (true) {
		var x = "hello";
		// ...
	}
	trace(x+1);
}

trace 의 결과가1 좀 충격적이다. 일반적인 프로그래밍 언어2에 익숙한 사람이라면 출력되는 결과를 “2” 라고 생각할 것이다.

하지만 결과는 hello1 … 생각없이 짜다 또 한 방 먹었고 Orz

문자열의 길이

문자열의 길이는 보통 두 가지 의미를 갖는다.

  • (의미 단위인) 글자 단위의 길이
  • (저수준 단위인) 메모리 상의 bytes 길이

저수준 메모리 접근이 가능하거나, 해당 추상화가 존재하는 어느 정도 성숙된 언어들 — 예를 들어 C 와 그 자손들 혹은 최근의 일부 VM 언어들(C#/Java), 혹은 python이나 PHP 같은 언어들 — 에서는 저 두 가지를 구하는 방법이 모두 존재한다.

하지만 기대를 저버리지 않고 ActionScript 에는 메모리 상의 bytes길이를 인코딩에 맞게 구하는 방법이 없다. 정말 소켓 연결해서 쓰기가 !@#$%^&* 스럽다.

UTF-8 문자의 bytes 길이 경계에 해당하는 0x7F, 0x07FF 랑 비교해서 1~3 byte(s) 로 쪼개지게해서 일일이 길이를 구하고 직렬화하게 수정해야했다.3


  1. trace는 Debugger를 통해서만 출력이 이루어지는 함수. ↩︎

  2. C나 C++, Java, C# 같은 스코프 룰이 있는 대부분의 언어. ↩︎

  3. BMP에 있는 유니코드 밖에 지원 안하는 걸로 보인다. 유니코드 표현 형식이 ‘\unnnn’ (nnnn = 숫자) 형태인데, 네 자리만 된다면 딱 BMP만 표현되지… ↩︎