2011년 04월 08일
위태로운 엄격한 타입 언어
동적 타입 언어 사용자들이 엄격한 타입(strong typed) 언어의 문제로 삼는 "복잡한 상속 계층" 문제에 대해 정확히 알고 싶어서 검색을 하다가 문서를 하나 발견했다. 사실 예전에 읽었던 문서 같은데 왠지 새로워(늘 그렇지 뭐) 다시 읽어 봤다.
http://blog.objectmentor.com/articles/2007/08/23/strongly-typed-languages-considered-dangerous
그대로 번역을 할 필요는 없을 듯 하고 저작권 문제도 있으니 중요한 꼭지만 몇가지 따와서 정리해보겠다(고 생각하고 쓰기 시작했는데 의도했던 것보다 많이 번역했).
맨 밑에 세 줄 요약 적어 놨으니 읽기 싫으면 워프하세요.
저는 이 글의 주장과 부분적으로 동의하지만 결론이 같지는 않습니다. 스칼라 같이 엄격한 타입 언어와 관련된 문제를 해결하려는 시도도 있습니다.
------------
종종 도움이 될 것으로 기대했던 것이 정 반대가 되는 일이 있다.
와인버그의 문제 해결 규칙 첫번째: 모든 해법은 새로운 문제를 일으킨다.
강한 타입 언어로 일하려면 공변성, 다중 상속(정말 필요함)의 매력, 템플릿(또는 지네릭) 등등 논의해야할 것들이 많다.
동적 타입 언어(Smalltalk, Self, Objective-C 등)로 일을하면 공변성이나 템프릿은 문제가 되지 않고 다중 상속도 중요성이 줄어든다.
타입 언어에서 목 객체를 만들어 보면 적어도 인터페이스나 확장 가능한 클래스가 있어야 하지만 동적 타입 언어에서는 필요 없다. 동적 타입 언어에서는 실행될 때까지 이런 메서드가 있는지 신경쓰지 않으며 심지어 없어도 작동되기도 한다.
그럼 타입 언어는 나쁜 건가?
JVM, CLR 같은 가상머신은 최근 엄청 발달했다. 리플렉션은 빨라졌고, 실시간(JIT) 컴파일러는 똑똑해졌고, 자바 5에서 동시성 지원이 좋아졌고, 심지어 자바 6는 로컬 객체 참조로 메모리 운영을 눈에 띄개 개선했다. 자바는 정말 빠르다.
동적 언어는 일반적으로 성능이 떨어지는 편이다. 하지만 시스템이 충분히 빠르다면 동적 언어로 만든 애플리케이션도 빠르게 작동한다. Smalltalk으로 만든 애플리케이션을 사람들은 수년동안 써 왔다. 루비도 대규모 클래스에 쓸 정도로 충분히 빠르다.
동적 언어로 쓰면 코드를 잘 작성해야 한다. 언어 때문이 아니라 코드 작성 방법에 문제가 있는 것이다.
동적 타입 언어를 사용하면 엄청난 능력을 손에 쥐게 된다. 엄청난 능력에는 큰 책임이 따라 온다는 사실을 피터 파커가 배운 것처럼 루비나 다른 동적 언어도 이와 같다.
동적 타입 언어를 잘 작성하도록 마련된 지침이 많지 않다. 엉터리로 작성된 엄격한 타입 언어를 읽는 것도 힘들지만 동적타임 언어는 훨씬 어렵다. 이렇게 엉터리로 작성된 코드는 빨리 실패하곤 하는데 빨리 실패하는 건 사실 좋은 일이다. 빨리 실패하면 돈을 절약할 수 있다. 설계가 엉터리면 실패하기 마련이다. 문제는 그때까지 들인 시간과 돈이다.
엄격한 타입 언어는 컴파일러 오류 때문에 안전하다는 착각을 하게 만든다. 많은 사람이 컴파일러가 오류를 잡아내므로 단위 테스트가 필요 없다며 비웃는다. 단위 테스트가 작성된 코드를 검사하기 보다 동작의 명세로 쓰일 수 있다는 점을 놓친 주장이다.
동적 타입 언어로 일하는 게 힘들지도 모른다. 하지만 TDD를 따른다면 언어는 큰 문제가 되지 않는다.
빠른 타입 언어가 필요한 영역이 있기는 하다. 어셈블러는 C보다 빠르고 C는 C++ 보다, C++는 자바보다 빠르다. 자바로 게임을 만들기도 하지만 흔하지 않다. 여러 언어를 섞어 쓰는 것도 가능하다. 빠르게 작동해야 하는 몇몇 부분을 한 언어로 작성하고 나머지 부분을 다른 언어로 작성할 수 있다.
셀프에서 멀티 디스패처를 지원하는 데 사용하는 기능을 성능을 높이는 용도로 개발했던 경험이 있는데 이와 같이 동적 타입 언어의 성능을 개선하는 노력이 많이 일어나고 있다.
머지않아 동적 타입 언어도 믿을만해질 것이다. 나는 아직도 주로 자바를 쓰지만 상황이 조금 정리되고 동적 타입 언어가 단점을 극복하기를 기다린다. 난 루비를 좋아하지만 루비가 차기 주류 언어라 되리라고 생각하지 않는다.
----------
세 줄 요약
1) TDD가 논란 종결자
2) 동적 타입 언어는 성능 문제가 있지만 좋아질거임
3) 아직은 기다리는 중임
http://blog.objectmentor.com/articles/2007/08/23/strongly-typed-languages-considered-dangerous
그대로 번역을 할 필요는 없을 듯 하고 저작권 문제도 있으니 중요한 꼭지만 몇가지 따와서 정리해보겠다(고 생각하고 쓰기 시작했는데 의도했던 것보다 많이 번역했).
맨 밑에 세 줄 요약 적어 놨으니 읽기 싫으면 워프하세요.
저는 이 글의 주장과 부분적으로 동의하지만 결론이 같지는 않습니다. 스칼라 같이 엄격한 타입 언어와 관련된 문제를 해결하려는 시도도 있습니다.
------------
종종 도움이 될 것으로 기대했던 것이 정 반대가 되는 일이 있다.
와인버그의 문제 해결 규칙 첫번째: 모든 해법은 새로운 문제를 일으킨다.
강한 타입 언어로 일하려면 공변성, 다중 상속(정말 필요함)의 매력, 템플릿(또는 지네릭) 등등 논의해야할 것들이 많다.
동적 타입 언어(Smalltalk, Self, Objective-C 등)로 일을하면 공변성이나 템프릿은 문제가 되지 않고 다중 상속도 중요성이 줄어든다.
타입 언어에서 목 객체를 만들어 보면 적어도 인터페이스나 확장 가능한 클래스가 있어야 하지만 동적 타입 언어에서는 필요 없다. 동적 타입 언어에서는 실행될 때까지 이런 메서드가 있는지 신경쓰지 않으며 심지어 없어도 작동되기도 한다.
그럼 타입 언어는 나쁜 건가?
JVM, CLR 같은 가상머신은 최근 엄청 발달했다. 리플렉션은 빨라졌고, 실시간(JIT) 컴파일러는 똑똑해졌고, 자바 5에서 동시성 지원이 좋아졌고, 심지어 자바 6는 로컬 객체 참조로 메모리 운영을 눈에 띄개 개선했다. 자바는 정말 빠르다.
동적 언어는 일반적으로 성능이 떨어지는 편이다. 하지만 시스템이 충분히 빠르다면 동적 언어로 만든 애플리케이션도 빠르게 작동한다. Smalltalk으로 만든 애플리케이션을 사람들은 수년동안 써 왔다. 루비도 대규모 클래스에 쓸 정도로 충분히 빠르다.
동적 언어로 쓰면 코드를 잘 작성해야 한다. 언어 때문이 아니라 코드 작성 방법에 문제가 있는 것이다.
동적 타입 언어를 사용하면 엄청난 능력을 손에 쥐게 된다. 엄청난 능력에는 큰 책임이 따라 온다는 사실을 피터 파커가 배운 것처럼 루비나 다른 동적 언어도 이와 같다.
동적 타입 언어를 잘 작성하도록 마련된 지침이 많지 않다. 엉터리로 작성된 엄격한 타입 언어를 읽는 것도 힘들지만 동적타임 언어는 훨씬 어렵다. 이렇게 엉터리로 작성된 코드는 빨리 실패하곤 하는데 빨리 실패하는 건 사실 좋은 일이다. 빨리 실패하면 돈을 절약할 수 있다. 설계가 엉터리면 실패하기 마련이다. 문제는 그때까지 들인 시간과 돈이다.
엄격한 타입 언어는 컴파일러 오류 때문에 안전하다는 착각을 하게 만든다. 많은 사람이 컴파일러가 오류를 잡아내므로 단위 테스트가 필요 없다며 비웃는다. 단위 테스트가 작성된 코드를 검사하기 보다 동작의 명세로 쓰일 수 있다는 점을 놓친 주장이다.
동적 타입 언어로 일하는 게 힘들지도 모른다. 하지만 TDD를 따른다면 언어는 큰 문제가 되지 않는다.
빠른 타입 언어가 필요한 영역이 있기는 하다. 어셈블러는 C보다 빠르고 C는 C++ 보다, C++는 자바보다 빠르다. 자바로 게임을 만들기도 하지만 흔하지 않다. 여러 언어를 섞어 쓰는 것도 가능하다. 빠르게 작동해야 하는 몇몇 부분을 한 언어로 작성하고 나머지 부분을 다른 언어로 작성할 수 있다.
셀프에서 멀티 디스패처를 지원하는 데 사용하는 기능을 성능을 높이는 용도로 개발했던 경험이 있는데 이와 같이 동적 타입 언어의 성능을 개선하는 노력이 많이 일어나고 있다.
머지않아 동적 타입 언어도 믿을만해질 것이다. 나는 아직도 주로 자바를 쓰지만 상황이 조금 정리되고 동적 타입 언어가 단점을 극복하기를 기다린다. 난 루비를 좋아하지만 루비가 차기 주류 언어라 되리라고 생각하지 않는다.
----------
세 줄 요약
1) TDD가 논란 종결자
2) 동적 타입 언어는 성능 문제가 있지만 좋아질거임
3) 아직은 기다리는 중임
# by | 2011/04/08 21:59 | 프로그래밍 이야기 | 트랙백(1) | 덧글(2)
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : fupfin의 생각
위태로운 강한 타입 언어...more