Python이 generic programming을 지원하는 건가요?

parkthi의 이미지

Generic programming이 data type을 parameter화 하여, data type에 상관없이 기능을 기술하게 하게
함으로써, 코드 효율을 높이는 걸로 이해를 하고 있는데요.
C++의 template이나 Ada, Java도 거의 비슷한 식으로 구현 되는 것으로 알고 있습니다.

그런데, generic programming의 의미를 생각하면 python도 기본적으로 generic programming을 지원
한다고 보는 것이 맞나요? Python의 변수나 parameter같은 경우, 그 데이터 타입을 정의를 해 주는 것이
아니고 instancing시점 결정이 되니, generic programming의 의미에 부합이 된다고 생각이 되는데요.

한참을 안보다가 요즘 다시 java를 배우고 있는데, 순수 언어적인 측면에서 다른 언어와 비교 하는 것을
보니, C++의 안좋은 점만 보이는 군요.

imyejin의 이미지

제너릭 프로그래밍이라는 게 정확히 뭘 의미하는지 정의 자체가 모호하지만, 보통은 데이타 타입이 바뀐다고 코드를 몽땅 중복하지 않아도 되고 최대한 같은 루틴을 재사용하는 그러한 프로그래밍 방법을 말합니다. 템플릿 메타프로그래밍은 데이타 타입별로 코드 중복을 줄이면서도 효율이나 타입 안정성을 희생하지 않는 제너릭 프로그래밍의 한 방법이고요.

파이썬과 같이 (정적) 타입이 없는 (소위 동적 타입이라 부르는) 그런 언어는 타입별로 코드를 중복할 필요가 없는데, 이건 원래부터 (정적) 타입이 없어서 이미 효율성을 어느 정도 까먹고 들어가기 때문에 직접적으로 비교할 수가 없습니다. 그러니까 제너릭 프로그래밍이란 게 기본적으로 정적 타입이 있는 언어에서 정적 타입 때문에 생기는 코드 중복을 줄일 수 있는 기법에서부터 출발했기 때문입니다.

타입을 쓰지 않아도 타입을 최대한 유추할 수 있는 (정적) 타입 시스템을 갖춘 현대적인 함수형 언어인 ML이나 Haskell과 같은 언어랑 비교해야 제대로 비교할 맛이 나겠죠. 템플릿이나 제너릭은 이러한 제대로 설계된 정적 타입 시스템을 갖춘 함수형 언어의 parametric polymorphism 을 OO 언어에서 구현하기 위해 별도로 고안한 장치입니다. 못 써먹을 물건은 아니지만 꺾쇠 괄호도 많이 쳐야 하고 쓰기가 귀찮죠.

참고로, 제너릭 프로그래밍에 있어서는 C++ 이 자바나 C#류 언어들보다 한수 위입니다. C++ 템플릿은 언어와 표준라이브러리 설계 단계에서부터 일관성을 갖고 표준화되죠. C++ 템플릿은 정적 코드를 컴파일 시간에 생성하는 메타프로그래밍이지만, 자바나 C#에 쓰는 제너릭은 원래 제너릭 없이 설계했다가 하위호완성을 고려해서 한꺼풀 덧씌워 놓은 것에 불과하거든요. 템플릿 스페셜라이제이션 같은 걸로 장난을 못칩니다. 그런 거 하려면 동적 타입 정보를 리플렉션해서 삽질해야 하는데 타입 안정성이 컴파일 타임에 다 처리하는 것보다 당연히 떨어지고, 또한 경우에 따라서는 이거 효율이 아주 느리게 구현되어 있어서 제너릭 프로그래밍이라는 측면에서 보자면 매우 짜증납니다.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.