다이어리/다이어리

메모. R이 C, 혹은 다른 언어와 같길 바라는 사람을 위하여...

Jae-seong Yoo 2013. 10. 2. 00:23

R을 하면서 처음에 인덱싱 subscript를 [ ] 내에서 , 으로 구분해서 헷갈리고, 패러미터 타입이 없어 대체 어떤 객체 타입이 들어가는 지 몰라 헷갈리고, 그렇지만 무엇보다 내가 원하는 형태로 데이터 먼징하는 것이 불편해 짜증이었죠. 그져 C같이 컨트럴 문 돌리고, C/JAVA같이 다양한 형태의 데이터구조를 쉽게 만들 수 있으면 다 껌같은 것인데요. 짜증이 무척 나지 않았나요? 
속도 문제, 메모리 문제도 다 이게 포인터가 없어 그렇다는 생각이 들어 R에 포인터를 도입해야 한다는 결론에 도달했죠. ㅎㅎㅎ. object를 포인터로 줄 때 "&object.passing" 형태로, 패러미터 리스트에 패러미터를 포인터로 받는 다고 할 때 "&object.receiving" 형태로, C와 달리 무조건 "&"이 변수앞에 붙으면 그 오브젝트의 포인터라는 것이죠. 포인터가 가르키는 오브젝트 값은 무조건 *&object 형태고요. "*object" 같은 것은 안되고요. 함수 리턴 값이 포인터라면 함수 signature로 &rnorm() 하는 형태고요. 멍청한 표현이긴 하지만 단순한 것 같은데... 
제 말은 따지고 보면, 함수내에 함수를 넣고, 함수를 argument로 주는 등 온 갖 쌩쑈를 다 하게 하면서 왜 포인터는 안주냐 이겁니다...
Jaeseong Yoo R이 C와 같길 원한다는건 좀... 포인터가 메모리 주소를 가리키기 위함인데, R로 시스템 프로그래밍을 할 일은 없을 겁니다.
물론 성능이 빠른 R을 위해서라면 메모리에 직접 접근할 수 있게끔, 그렇게 개발할 수도 있을 것 같긴 하지만...

C가 편한 유저들에게(저도 C를 제일 좋아하는 유저 중 한명입니다...) 아쉬울 수도 있겠지만, 각 언어도 개발된 목적이 있고, 그에 따른 장단점이 있고 한 법인데, R에 포인터가 생긴다면... 솔직히 제가 
보기엔 안어울릴 것 같습니다.

이와 비슷하게, 사람들은 자바에서도 포인터가 있니 없니 다투는 것 역시 C에서 보고 배운 포인터의 특성들을 가지고 비교들을 합니다.
그 C 포인터의 특성을 자바 역시 가질 수 밖에는 없지요. 당연합니다. 어차피 자바가상머신 자체가 C로 만들어졌고 (R도 C를 기반으로 만들어졌습니다.) 직접 메모리에서 해쉬코드를 받아서 변수에 부여하고 주소로의 접근을 허용하니까요.

하지만 보통 우리가 자바로 코딩한다고 할 때, 우리가 JVM의 해시코드를 C코드로 분석하고 들여다보진 않습니다. 다 참조변수를 복사해서 (당연하겠지만 새로운 메모리 값을 부여받습니다. 좀 더 정확하게는 해쉬값) 서로를 연결하죠. 컬렉션 프레임워크(DS) 쪽으로 가도 마찬가지 개념으로 이해해야 합니다.

즉, 일반적으로 말하고 사용하는 자바에서는 포인터란 개념이 존재하지 않는다는 말이 옳습니다. C포인터의 특징인 콜바이레퍼런스랑 메모리의 직접 제어 및 접근이, 통상적으로 자바에서는 JVM에 의해 숨겨진다는 얘기죠. 그걸 가지고 자바에 포인터가 있다고 정의내린다면 그럴 수도 있겠죠. 백인종이나 황인종이나 사람은 사람이니까요.

C에서 통계분석을 할 때 BLAS나 linpack 등 여타 헤더 파일을 include하고 또 include하고 하다보면 속도가 느려지게 마련이지만, 편리합니다. 이렇게 include하고 또 include하고 하다가 아예 이들을 종합해가면서 R이 탄생하였을 겁니다. (실제로 R core code를 뜯어보면 linpack 등의 라이브러리를 차용합니다.)
R이 애초에 시스템 프로그래밍용 언어로 만들어질 것이었다면 이게 아니라, 아예 원래 있던 헤더를 새로 뜯어고치던지, 어셈블리어로 만들어졌겠죠.
R만을 위한 헤더를 include하는 과정에서, 자바와 같은 연유로 포인터와 같은 기능이 숨겨지기 마련이었을 겁니다. 사용자가 이해만 쉽게 할 수 있고, 또 확실한 성능을 보장하기 위해선 포인터를 살렸겠지만, 유저 프렌들리 하기 위해서는 사실 좋은 기능이 아닙니다. 하물며 많은 여타 헤더를 include하는 과정에서 포인터라는 기능이 방해가 될 수도 있습니다. R의 실행을 시작하는 순간 메모리에 많은 함수를 내장해놓고, 또 포인터로 사용자가 여기에 맘대로 접근하고 그러면 혼란스러워질 수 있거든요.

C의 포인터 기능 같은걸 이용한 성능 개선을 아쉬워하는 어드벤스드 유저를 위해, R은 인터페이싱 같은 것이 가능합니다. 그러니 너무 아쉬워하지 마세요.