통역이나 번역을 하는 분들이 대단하다는 것은 두 나라 언어와 문화에 모두 정통하다는 것이다. 그래서 어떤 프로그래밍 언어를 공부하려면, 기존에 자기가 알고 있던 언어로 작성된 소스 코드를 새로운 언어로 옮겨보는 것이다. 그렇게 하면 상당히 귗낳고 어려운 작업이 되기는 하지만, 두 언어에 대해서 상당한 경지에 이를 수 있다. 단지 언어의 겉모습, 즉 구문론(syntactic)적인 접근에서 벗어나 언어의 의미론(semantic)에 대해서도 무척 깊은 생각을 하게 되기 때문이다.

아래는 게시판에 어떤 분이 올리신 "C언어에서 씨앗으로 옮기는 것"에 대해서 내가 직접 쓴 답변이다. 이 답변을 작성하면서 막연하게 알고있었던 C 언어의 의미론적인 특징을 보다 더 체계화 할 수 있는 큰 공부가 되었다.


한 언어의 바탕글을 다른 언어로 바꾸는 것은 상당한 인내와 노력과 어느 정도의 지식이 필요한 작업입니다. 가령 C 바탕글을 씨앗으로 바꾸려면, 두 언어 모두에 대해 어느 정도의 지식이 필요합니다. 만약 두 언어가 지향하는 점을 잘 모르고 있거나 헷갈리게 된다면, 바탕글은 뒤범벅이 될 것입니다. 이는 제가 처음 씨앗을 배울 때 C의 바탕글을 고치면서 배웠기 때문에 누구보다도 많은 경험을 했던 것이지요.

질문자님 역시 C에 대해 상당히 해박한 지식을 갖고 있는 분 같은데, 아직까지 씨앗에 대해서는 많이 공부하지 않으신 것 같군요. 이번 기회를 빌어 씨앗의 깊은 곳을 이해하실 수 있었으면 좋겠습니다.

1 . 먼저 이중포인터...

질문

밑에 C문을 씨앗으로 옮기려면 어떻게...

int search_block(char *argument, char **list)
{
        ~~~~~~어쩌구저쩌구~~~~~~
}

저는 대충

구역찾기(글자^ 명령글줄, 글자^^ 목록) => 정수
{
        ~~~~~~어쩌구저쩌구~~~~~~
}

일단은 이렇게 썼는데, 이게 맞는지, 책을 읽다가 헷갈려서 그러는데요... 이런 건 열린 배열로 받아야 한다느니 그런거같아서요. C 에서 * 는 씨앗에서 ^ 이거 아닌 가요? 쩝.... 씨에선 형식인자 받을 때 & 표시 안쓰던거같던데...흐흠.. 그리고 씨앗 책들(사용자설명서 + 기본단원설명서) 에선... '글자^^' 이런 표현 안썼던거같던데... 혹시 숨어있을지도 모르니깐 뭐라고 말은 못하겠네요.


답변

우선 위에서 제시하신 예는 C를 씨앗으로 직역했다고 생각할 때는 맞는 것입니다. 두 언어 간의 간접 연산자가 C는 *, 씨앗은 ^로 서로 다르고, 또한 *는 앞가지 연산자인데 반해 ^는 뒷가지 연산자라는 점이 다르지요. 그래서 대상물 앞에 *을 써준 것을 씨앗으로 고치면, 대상물 뒤에 ^를 쓰면 되겠지요.

그리고 사용자 설명서에는 "글자^^"와 같은 표현은 없지만, "모든 자료형에 대한 접근형을 둘 수 있다"는 가정 속에 이것이 포함되는 것입니다. '모든 자료형'이란 바로 '접근형 자신'도 포함된다는 소리이지요. 즉 접근형의 접근형도 만들 수 있다는 것을 묵시적으로 적어두는 것입니다. 씨앗 언어 정의에서 접근형 부분을 다시 한번 읽어보세요.

2. C와 씨앗에서의 '배열과 포인터의 관계'

질문

C 에선 배열이 포인터와 개념이 그러니깐, 주소에 대한 개념이 같다고 하자나요... 씨앗에선 아닌 가요? 왜 배열과 포인터를 섞어 쓰는데 안되죠? 책에서도 섞어 쓴 예가 없어서리... 예를들면....C에서...

char *command[] =
{
        "north",
        "east",
        "south",
        "west",
        "\\n"
}

이걸 씨앗에선...

글자^[5] 명령어 := {
        "북", "동", "남", "서", "\\줄"
}

이거면 안되나요? 물론 안되더군요..흐~~~~ 이걸 막 이리바꿔보고 저리 바꿔보고 하다가.... 예를 들면

글자[5]^ 명령어 .............

아님

글자^[5] 명령어 := {
        북, 동, 남, 서, \\줄
}

이렇게도 해 보구.. 기타 등등...해 볼껀 왠만하면 다 해 봤음.

왜 자꾸 자료형이 틀리다고 나오죠? 1001 번 에러도 나보고 잘못된 자료주소 에러도 나고...흑흑 하다가 글자[5][3] 하니깐 에러 안나긴 하던데..... 제가 원하는건 이런거 말구.... 배열포인터....

답변