프로그래밍 언어를 배우거나 혹은 가르치거나

Posted by 미스란디르 Sat, 29 Mar 2008 00:08:00 GMT

C를 배운지 얼마 안된 사람이 다음과 같은 질문을 했다고 쳐보자.

"값을 반환 했는데 먼가 잘 안돼요."

그래서 소스를 살펴본다.

int sum_and_multiple(int a, int b)
{
    int sum = a + b;
    int mul = a * b;
    return sum, mul;
}

약간 특이하다. 저건 컴파일할때 에러가 아닌데, (적어도 GCC에선) 그렇다고 값을 두개를 반환하는가 하면 그것도 아니다. C의 함수 구현은 저런 반환값을 허용하지 않는다. 저건 잘못됐다고 살짝 야단을 치면서 혹은 친절하게 지난번에 가르쳐준 call-by-reference를 복습시켜준다.

정답은 물론 다들 아시는 것 처럼 이렇다.

void sum_and_multiple(int a, int b, int *sum, int *mul)
{
    *sum = a + b;
    *mul = a * b;
}

정말 그걸로 된걸까?

요즘엔 이런 생각이 든다. 이러한 설명 과정에 의해서 자연스러운 사고방식이 또 하나 없어져가는게 아닐까, 라고. 함수가 값을 반환한다고 배웠다면 값을 꼭 하나가 아니라 여러개 반환하는 건 안될까? 라고 생각하는 것은 너무나도 당연한 생각이다.

조금 다르게 struct 형을 반환하거나, struct를 동적할당해서 그 포인터를 반환하는 방법이 있다. 하고싶은 것에 비해 들이는 노력이 너무 많다.

이러한 동작들이 어째서 안되는지를 설명하기 위해서는 C의 구현, 컴퓨터의 동작방식 레지스터와 스택등을 설명하지 않으면 안된다. (이제와서 생각해보건데, 두개가 안될 이유가 별로 없어 보인다. x86이라면 axeax대신 스택으로 반환값을 처리한다거나 하면 되지 않겠는가?)

하지만 그건 어찌보면 좀 가혹한 얘기이고 흥미를 잃을 수도 있다.

여기서 루비나 파이썬 혹은 LISP같은 프로그래밍 언어를 잠깐만 소개해주면 어떨까? '이건 무조건 안된다.' 'call-by-reference로 하렴' 대신, 가능 한 경우도 있다고 알려준다.

def sum_and_multiple(a, b)
    sum = a + b
    mul = a * b
    return sum, mul

혹은

def sum_and_multiple(a, b)
    sum = a + b
    mul = a * b
    sum, mul
end

혹은

(defun sum_and_multiple (a b) (LIST (+ a b) (* a b)))

딴 얘기지만 python이랑 루비는 지향하는 바가 다르면서도 키워드가 비슷해서 그런지 참 비슷하게 생겼다. 루비에서도 return을 쓸 수 있으니 return sum, mul 하면 end빼고 똑같지 않은가!

이제 처음 프로그래밍을 배우기 시작해서 C를 익히는 사람에게 다른걸 보여줘봐야 무슨 소용이 있나 싶기도 하다. 하지만 무조건 프로그래밍 언어에 자신을 끼워 맞추기 보다는 또 다른 세계가 있다는 것을 알려주는 것이 좀 더 올바른 교습방법이 아닐까 하는 생각이 든다. 물론 가르치는 사람이 몰라서 안가르쳐 주는 경우가 더 많겠지만.

Posted in  | Tags  | 2 comments | no trackbacks

langdev 포럼이 열렸습니다.

Posted by 미스란디르 Sat, 15 Mar 2008 02:35:00 GMT

홍민희님이 한국의 LtU:Lambda the Ultimate를 바라며 사이트를 열었어요.

이제 시작해서 글이 별로 없지만 여러가지 프로그래밍 언어에 대한, 혹은 스스로 만들고 싶은 언어에 대한 얘기들을 이것 저것 해보아요.

Posted in  | Tags  | 1 comment | no trackbacks

최근 루비 M17N회의 결과

Posted by 미스란디르 Mon, 18 Feb 2008 16:38:00 GMT

가 메일링에 떴네요. 원문은 [ruby-dev:33825]에서 보실 수 있습니다.

이탤릭체는 제 글입니다.

Ruby M17N 회의가 2008년 2월 15일에 열렸는데, 그 기록을 올립니다.

==cgi.rb 후속의 공모에 대해서 조건은 다음과 같다

  • 이름이 cgi.rb가 아닐 것
  • MVC를 분리할 것

얼마전에 cgi.rb가 너무 노후화되서 그 후속작을 공모하는 메일이 올라왔었다. 그것에 대한 논의가 이루어진듯

== String#gsub(regexp, hash)

String#gsub(regexp, {"ä"=>"\u00C4", ..}) 와 같은 표기를 쓰고 싶음 →채용

== replica의 출전에 대한 정보를

→쓴다

replica는 encoding의 복제품 같은걸 얘기하는데 예를들면 cp949가 euc-kr의 replica가 되는거죠(사실 루비구현에선 그렇지 않지만). 아마도 소스안에서 이게 무슨 replica인지 따위를 주석으로 쓴다는 것 같네요

== CP949와GBK는 서로 다름

→CP949를 분리

CP949와 GBK가 valid한 영역이 거의 같아서인지 같은걸로 취급했다가 다시 분리됐어요.

== 널문자와 UTF-16를 합칠 경우에 대해

널문자는 ASCII와 호환되지 않는 문자와도 결합가능하도록 하면 어떨까 →채용

== String#length나String#at등이 느리다

search_nonascii를 사용해서 고속화 VALID한UTF-8이라면 더더욱 빨라진다.

== String#getbyte, String#setbyte

→채용

== Indexer

→보류

== inspect 에 대해서

다음과 같이 검토

  • obj.inspect_acumulate(enc)를 신설

== strftime 의 앞으로의 방향 strftime은 locale에 의존하지 않고、로케일에 의존하는건 필요하다면 별도로 추가

== require_relative 의 도입에 대해서 require_relative 을 부른 파일의 상대경로에 대해서 require 한다. →채용

== IO.copy_stream IO.copystream(filename, filename) 이나 IO.copystream(stream, stream) 등으로 파일이나 스트림을 카피한다. 또한 파일명을 준 경우에는 시스템콜을 호출하기 때문에 루비는 다른 것을 할 수 있다. →이름은 검토 필요

== Hash#compare_by_identity가 미묘한점 Hash#comparedby(:equal?, :objid)으로 변경하고 싶음 →채용 →Hash#identifed_by의 경우가 좋을지도[ruby-dev:33817]

== Unicode Normalization

API는 다음과 같다

  • String#encode("utf-8 nfc")
  • String#normalize("nfc")
  • Encoding::UTF_8.nfc(str)

open(fn, "r:utf-8", ...) 정도에서 정규화하면서 읽는등의 처리를 하고 싶기 때문에 그것에 대한 기법을 검토


다른 내용들에 아시는 내용 있으면 커멘트 달아주세요~;

써 놓고 보니 m17n회의라면서 결국은 루비1.9 개발논의 회의인거군요. 루비 1.9.1은 언제나오려나.

Posted in  | no comments | no trackbacks

어제의 삽질 - 시스템이 엉키는 경우

Posted by 미스란디르 Thu, 14 Feb 2008 04:06:00 GMT

  • emerge glibc를 하는데, 똑같은 짓을 계속 하고 있길래 왜그런가 했더니, /usr/include/linux 에 깔린 리눅스 헤더의 날짜가 미래라고 거부를 하는 거였다.

    find /usr/include -print |xargs

    로 해결했다.

  • freeglut을 빌드하는데 gcc가 (정확히는 링커가) libGLU.so 가 요구하는 libstdc++ 을 찾을수가 없댄다. /etc/ld.so.conf 를 제대로 지정했는데도 불구하고 여전히 뭔가 이상하다. ldconfig를 아무리 해도 안된다. 알고 봤더니 /etc/ld.so.cache 의 날짜가 미래라서 ldconfig 가 안먹는 것이었다. 바로 요런 에러다.

    /i686-pc-linux-gnu/4.2.0/../../../libGLU.so, not found (try using -rpath or -rpath-link) /usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../libGLU.so: undefined reference to operator delete(void*)@GLIBCXX_3.4' /usr/lib/gcc/i686-pc-linux-gnu/4.2.0/../../../libGLU.so: undefined reference tovtable for cxxabiv1::vmiclasstypeinfo@CXXABI1.3'

  • 그러나 사실 위의 짐작은 틀린 것이었는데, ld.so.cache를 지우고 새로 생성해도 libstdc++를 찾을 수가 없다고 한다. ldd로 libGLU.so 를 찍어보면

    ldd /usr/lib/libGLU.so

    linux-gate.so.1 => (0xffffe000) libGL.so.1 => //usr//lib/opengl/nvidia/lib/libGL.so.1 (0xb7ddb000) libstdc++.so.6 => /usr/lib/gcc/i686-pc-linux-gnu/4.2.0/libstdc++.so.6 (0xb7cf5000) 이하 생략.

이렇게 제대로 나왔으니까.

ld하는 과정을 strace로 찍어봤더니,

[pid  1241] open("/usr/i486-pc-linux-gnu/lib/libGL.so.1", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
[pid  1241] open("/usr/lib/gcc/i486-pc-linux-gnu/4.1.1/libGL.so.1", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)

이런게 보인다. 대체 i486은 어디 들어간걸까?

참고로 ld.so.conf에는

/usr/lib
/usr/local/lib
/usr/lib/gcc/i686-pc-linux-gnu/4.2.2/

정도가 들어있지 저런내용은 전혀 없다.

env-update ; etc-update

도 해보고, gcc, binutils, 심지어는 첫번째에서 얘기한 glibc까지 다시 emerge해봤지만 결과는 마찬가지.

결국 밝혀진 원인은 바로

/usr/etc/ld.so.conf 의 존재였다. 실수로 stage파일을 /usr 에다 풀어서 쓰레기가 있었는데, 이걸 ld가 무식하게 불러온것. 정말 신기하지 않은가?

좀 허무했지만 아무튼 밝혀졌으니 다행

Posted in  | 1 comment | no trackbacks

오픈아이디로 로그인도 안되는 오픈아이디 이벤트

Posted by 미스란디르 Wed, 13 Feb 2008 17:47:00 GMT

정정한다.

idtail은 가입이 잘 되고, revu는 사이트 로그인은 되는데 이벤트 로그인만 안된다. pumpit도 가입 잘 된다.

lifepod만 수정해주면 될 것 같다.

새벽에 홧김에 글 썼다가 다시 확인해보고 민망해졌다.

불만부터 터뜨린점 정중히 사과드린다.

PS. 설마 그 사이에 고쳐진걸까?


http://openid.daum.net/event/ 에서 오픈아이디 확산을 위한 이벤트를 한다.

오픈아이디로 로그인 해보고, 여기저기 구경도 하고 도장을 모아서 경품을 추첨해서 준단다.

물론 경품에 혹해서 (...) 여기저기 로그인을 해보는데, 글쎄 로그인이 안된다. Lifepod 사이트에선 아이디를 잘못 넣었다고, 가입한아이디.myid.net 으로 로긴하라는 소리까지 들었다. 지금 장난하나? openid라고 해놓고 특정 서비스 프로바이더에 종속되는 서비스를 하고 있는 것 아닌가.

오픈아이디를 널리 쓰는걸 물론 나도 바란다. 비밀번호 여기저기 뿌리지 않아도 되니 얼마나 좋은가. 그런데 컨슈머 사이트에서 이렇게 무개념으로 처리하고 있으니 화가 안날 수 없다. 이벤트에 참가한 컨슈머 사이트 8개중에서 로그인을 할 수 있었던건 오픈마루 서비스 3개 (스프링노트, 롤링리스트, 레몬펜)와 미투데이 그리고 위자드닷컴. 나머지 4개는 tisphie.net으로 로긴을 할 수가 없었다. 혹시나 해서 http://tisphie.net/typo 으로 전부 써봤지만 안되는건 마찬가지다.

혹시라도 내가 delegate를 잘못했다면 사과하겠다. 하지만 다른 서비스들에서 잘 쓰고 있었으니 그럴 확률은 별로 없겠지. 이 글을 이벤트에 참가한 idtail / lifepod / revu 담당자가 봤으면 좋겠다.

Tags , , , ,  | no comments | no trackbacks

Older posts: 1 2 3 4 5 ... 18