사랑합니다. 편안히 잠드소서
뛰다가 걷기도 하고 올라갔다가 내려가기도 하고 그러다 쉬기도 하고

by nVec
2009년 03월 03일
Static/dynamic typing? Strong/weak typing?

최근 파이썬을 뒤적이고 있다. 사실 파이썬을 본격적으로 공부해보려는 것은 아니다. 다만 펄/파이썬/루비 중에서 뭔가 하나를 배워보려고 하는데 셋 모두 아는 것이 별로 없으니 도대체 무엇을 선택해야 하나 갈피를 잡을 수 없어서 세 언어 모두 조금씩 특성을 파악해보고 마음에 드는 놈을 고르려는 중이다.

어쨌든 그렇게 파이썬에 대한 책 하나 빌려서 읽고 있는데 처음은 파이썬에 대한 자랑부터 시작하더라. '파이썬은 동적 타입 결정이 어쩌고 저쩌고…' 그래 내가 바로 펄/파이썬/루비를 배우려고 하는 이유가 바로 이거다. Dynamic typing! 편하고 쉽잖아!

그런데 문제는 여기서 발생했다. Dynamic typing의 개념을 명확히 하기 힘들었던 것. 책에서도 파이썬이 그냥 '동적 타입 결정 때문에 편하다' 라고 돼있을 뿐이었다. 간신히 지난 학기 프로그래밍언어 시간에 들었던 내용을 떠올려 보았는데, 다음과 같다

"Dynamic typing은 run-time 시간에 type checking을 수행하는 방식이고, static typing은 compile-time에 수행하는 방식이다"

분명 틀린 말은 아닌 것 같은데 왠지 단번에 이해하기 쉽지 않았다. 타입 체크하는 시점이 그렇게 중요한 이슈였던가? 어쨌든 타입이 잘못되었으면 그게 컴파일이건 실행 중이건 간에 에러는 발생하는 것 아닌가? 단지 실행 중에 타입 체크를 한다고 해서 더 유연해지는 건가? 이번에도 수업시간에 맨날 졸던 것이 후회되기 시작한다. 하여간 혼자서 답을 내긴 어렵고 해서 일단 구글링을 해봤는데 대충 위와 같은 정의가 많았지만 또 다른 방식으로 정의하기도 하더라.

"Dynamic typing은 변수의 타입이 프로그램의 어느 시점에서든 변경이 가능한 방식이고, static typing은 그와 반대로 처음 변수의 타입이 정해지면 그 후로 변경 할 수 없는 방식이다"

아. 이게 좀더 와 닿는다. 그런데 뭔가 조악해 보인다. 왠지 허술해 보이기도 하고. 그래서 좀더 찾아봤는데 이런 정의도 있더라.

"Dynamic typing은 자료의 타입이 run-time에 정해지는 방식이고, static typing은 compile-time에 정해지는 방식이다"

처음 정의와 유사한데, 나는 이게 더 마음에 들었다. 그저 말 조금 바꾼 것뿐인데 왜 그런진 모르겠다. 그런데 이렇게 몇 개 찾아보고 나니 더 불확실해 졌다. 도대체 둘을 가르는 명확하고 확고한 정의가 뭐지? 누가 좀 알려줬으면 좋겠다.

게다가 검색 중에 하나의 이슈가 또 딸려 나왔다. Strong typing과 weak typing이 그것이다. 이것도 프로그래밍 언어 시간에 분명 배운 것이긴 한데 금방 떠오르진 않더라. 그래서 책에서 바로 찾아봤다.

"If we detect all type errors statically in a program, we say that the language is strongly typed."

타입 에러를 정적으로 찾아낸다니, Static/dynamic typing 의 정의와 뭐가 다른 걸까? 이건 Static/dynamic typing을 정의할 때보다 더 모호하다. 그래서 이것도 구글링 해봤다. 그래서 나온 결과들이 다음과 같다.(해석 생략)

"A strongly typed language is a language that is being strict about what you can do with your typed variable. A weakly typed language is the opposite"

"Weak typing means that a language implicitly converts (or casts) types when used"

"One of the more common definitions states that weakly-typed programming languages are those that support either implicit type conversion, ad-hoc polymorphism or both"

"One definition of strongly typed involves preventing success for an operation on arguments which have the wrong type"

"A strongly-typed programming language is one in which each type of data is predefined as part of the programming language and all constants or variables defined for a given program must be described with one of the data types. Certain operations may be allowable only with certain data types. The language compiler enforces the data typing and use compliance."

"The term strong typing is used to describe those situations where programming languages specify one or more restrictions on how operations involving values having different data types can be intermixed. Its antonym is weak typing"

이 용어에 대한 정의는 참 다양하더라. 첫 번째 정의는 책에 써있는 것처럼 모호하다. 두 번째와 세 번째 정의는 타입 변환에 대한 관점으로 설명을 하고 있었다 특히 세 번째는 다형성도 첨가하고 있다. 네 번째 정의는 세 번째의 다형성 부분과 이어지는 것처럼 보인다. 다섯 번째 정의는 좀더 자세하다. 하지만 이런 정의대로라면 정말 대부분의 언어는 stongly typed일 수가 없어 보인다. 여섯 번째도 다형성과 연관시키는 듯 하다.

이외에도 다른 정의방법이 더 있더라. 그래서 내가 생각할 때는 한 언어의 type system을 명확하게 단계적으로 구분할 방법은 없어 보인다. 특히 strong/weak typing의 경우가 그런 것 같은데, 타입에 대한 제약이 많아지면 많아 질수록 strong typing에 가까워지는 것 같고 그렇지 않으면 weak typing에 가까워지는 듯하다. 결국 책에 본 정의처럼 모호해 질 수 밖에 없는 것 같다. 혹시 아니라면 누군가 좀 알려줬으면 좋겠다.

*출처를 일일이 표기하려고 했는데, 작성 중에 브라우저가 날라갔다. 결국 다시 찾긴 귀찮아서 이대로 포스팅하게 됐다. 책을 인용한 부분은 Terrence W. Pratt, Marvin V. Zelkowitz, Programming languages 4th ed. 에서 발췌했다.

by nVec | 2009/03/03 23:19 | 소프트웨어 | 트랙백 | 덧글(2)
트랙백 주소 : http://nvec.egloos.com/tb/2251285
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by lefoot at 2009/03/05 00:37
안녕하세요. 처음 글을 쓰네요 ^^; 저도 Dynamic typing을 명확히 정의치는 못하겠지만, 파이썬에서의 dynamic typing의 장점은 몇가지 이야기할 수 있을 것 같습니다. 그중 하나는, 리스트에 서로 다른 type의 요소들을 보관할 수 있다는것일거 같은데요, 가령 파이썬에서는 ' list[0]==3 and list[1]==True ' 와 같은 조건문을 사용하는 것도 가능합니다. 만약 list=[1, True] 였다면 list[0]는 integer, list[1]는 boolean이니까 무사히 실행될 것이고, list=[1, 2] 였다면 list[1] 을 참조할때(!) 에러가 발생할 것 같네요. 말하자면, 저 위의 코드를 실행해보기 전에는 에러가 날지 나지 않을지 알수가 없기 때문에 파이썬은 dynamic typing 을 지원한다고 볼 수 있을 것 같습니다.
Strong typing의 경우에는, ML 같은 functional language에서는 가능하나 파이썬, c언어 같은 언어에서는 지원이 안될 것 같습니다. 파이썬의 경우 앞서 언급한 dynamic typing 때문에, c언어의 경우에는 포인터 때문에 컴파일 시에 코드만 봐서는 에러가 날지 안날지를 알 수가 없을 것 같네요.
Commented by nVec at 2009/03/05 21:57
역시 타입에 관한 제약이 적으니 여러가지를 할 수 있군요.
서둘러 파이썬을 파악해 봐야겠습니다.

:         :

:

비공개 덧글

최근 등록된 덧글
포토로그
최근 등록된 트랙백
rss

skin by nVec