레이블이 PHP인 게시물을 표시합니다. 모든 게시물 표시
레이블이 PHP인 게시물을 표시합니다. 모든 게시물 표시

2011년 1월 24일 월요일

PHP의 정수형에 대한 불만

몇년전에 PHP를 상당히 많이 썼었다. 물론 게임 렌더링 엔진의 코어에... 초당 120프레임까지 뽑아내려면 PHP가 최고다..... 는 농담이고.... ^^ 그냥 이런 저런 웹 사이트를 만드는데 많이 사용했었다.

최근에 PHP를 다시 접할 일이 있었다. 32비트 정수 값으로 표현하기엔 너무 큰 랜덤 수를 만들어 이것을 MySQL 데이터베이스에 저장하려고 했는데.. 아뿔사....

MySQL은 64비트 정수형인 BIGINT 변수형을 지원한다... 따라서 별 문제 없음... 진짜 문제는 PHP... PHP의 int는 32비트가 될 수도 있고, 64비트가 될수도 있다... 꺼억... 꼭 C같군 -_-; PHP가 설치된 컴퓨터의 비트수에 따라 달라진단다.. (또 64비트 정수를 사용하려면 64비트 PHP 버전을 따로 설치해야 할거라고 추측만 하고 있음)

이런 어이없는 짓은 C에서는 용납이 가능하다. 그냥 32비트/64비트 용으로 따로 실행파일을 만들어 배포하면 되니까.... 하지만 PHP는 웹기반이라서 이건 정말 개소리다 -_-;;; 이런 상황을 고려해보자.. PHP에서 64비트 정수를 사용하는 웹사이트를 만들어서 64비트 웹 서버에 호스팅했다고 치자.. 근데 이 호스팅 서비스가 맘에 안들어서 다른 웹호스팅 서비스로 옮기기로 맘을 먹었는데 새 호스팅 회사가 32비트 PHP를 쓴다면?..... 한마디로 왕짜증 -_-; 코드 전부다 리팩터하거나... 아예 64비트 정수를 지원하는 클래스를 스스로 짜는게 훨 낫다는 결론..... 써글 -_-?

PHP에서 64비트 정수를 사용하는 것의 또다른 문제 중 하나는 Random() 함수이다. 랜던 시드(seed)의 인자와 Random() 함수의 반환값이 모두 int이다. 따라서 64비트 정수 클래스를 커스텀하게 만든다면 이 함수를 그대로 쓸 수 있는 방법이 없다. 그 대신 이 64비트 클래스의 값을 2개의 32비트 정수값으로 바꿔서 이리저리 짜맞춰야 한다는 게지... -_-

뭐 PHP에서 정수대신에 부동소수점(floating-point) 수를 쓰면 32비트가 넘는 정수의 값을 표현할 수 있다... 하지만 정밀도(precision)의 문제가 또 있다는 게 문제.. 역시 내 입맛엔 별로 맞지 않음... -_-

오해는 하지 마시길... 난 사실 PHP를 매우 선호한다. 웹프로그래밍을 할 때 다른 언어 다 제쳐두고 언제나 찾게되는 언어가 PHP니까.. 하지만 MySQL처럼 PHP도 BIGINT형을 자체적으로 지원해야 한다고 생각한다...