[dynamic-languages] 사람들이 동적 언어에서 그토록 매력적이라고 ​​생각하는 것은 무엇입니까? [닫은]

요즘 모두가 다이나믹하고 컴파일되지 않은 악 대차에 뛰어 드는 것 같습니다. 저는 대부분 컴파일 된 정적 유형 언어 (C, Java, .Net)로만 작업했습니다. 동적 언어에 대한 경험은 ASP (Vb Script), JavaScript 및 PHP와 같은 것입니다. 이러한 기술을 사용하는 것은 동적 언어에 대해 생각할 때 입에 나쁜 맛을 남겼습니다. 맞춤법이 틀린 변수 이름 및 잘못된 유형의 값을 변수에 할당하는 것과 같이 일반적으로 컴파일러에 의해 포착되었을 수있는 것은 런타임까지 발생하지 않습니다. 그런 다음에도 새 변수를 만들고 일부 기본값을 할당하기 때문에 오류가 발생하지 않을 수 있습니다. 또한 변수에는 명시 적 유형이 없기 때문에 동적 언어에서 intellisense가 잘 작동하는 것을 본 적이 없습니다.

제가 알고 싶은 것은 사람들이 동적 언어에 대해 매력적이라고 ​​생각하는 것은 무엇입니까? 다이나믹 언어로 할 수있는 일의 측면에서 할 수 없거나 컴파일 된 언어로하기 어려운 주요 이점은 무엇입니까? 오래 전에 우리가 런타임 예외를 던지는 컴파일되지 않은 ASP 페이지와 같은 것은 나쁜 생각이라고 결정한 것 같습니다. 이러한 유형의 코드가 왜 부활합니까? 그리고 적어도 Ruby on Rails가 10 년 전에 ASP로 할 수 없었던 어떤 것과도 다르게 보이는 이유는 무엇입니까?



답변

그 이유는 사람들이 매우 제한적이고 표현력이없는 유형 시스템을 가진 정적으로 유형화 된 언어에 익숙하기 때문이라고 생각합니다. 이들은 Java, C ++, Pascal 등과 같은 언어입니다.보다 표현적인 유형 시스템과 더 나은 유형 추론의 방향으로가는 대신 (예를 들어 Haskell, 심지어 SQL에서와 같이 어느 정도까지) 어떤 사람들은 모든 “유형”정보를 머리 (및 테스트)에 포함하고 정적 유형 검사를 모두 제거합니다.

이것이 결국 당신을 사게하는 것은 불분명합니다. typechecking에 대한 오해가 많이 있습니다. 제가 가장 흔히 접하는 것은이 두 가지입니다.

오류 : 동적 언어는 덜 장황합니다. 오해는 유형 정보가 유형 주석과 같다는 것입니다. 이것은 완전히 사실이 아닙니다. 우리 모두는 타입 어노테이션이 성가시다는 것을 알고 있습니다. 기계는 그런 것들을 알아낼 수 있어야합니다. 사실, 그것은 현대 컴파일러에서도 마찬가지입니다. 다음은 Haskell의 두 줄에있는 정적으로 형식화 된 QuickSort입니다 ( haskell.org ).

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

다음은 LISP에서 동적으로 입력 된 QuickSort입니다 ( swisspig.net ).

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

Haskell 예제는 정적으로 입력 된 가설을 위조 하므로 verbose . LISP 예제는 자세한 가설을 위조 하므로 정적으로 입력 됩니다. 타이핑과 자세한 정도 사이에는 어떤 의미도 없습니다. 당신은 그것을 당신의 마음에서 안전하게 제거 할 수 있습니다.

오류 : 정적으로 형식화 된 언어는 해석이 아니라 컴파일되어야합니다. 다시 말하지만 사실이 아닙니다. 정적으로 입력 된 많은 언어에는 인터프리터가 있습니다. Scala 인터프리터, Haskell 용 GHCi 및 Hugs 인터프리터가 있습니다. 물론 SQL은 내가 살아있는 것보다 더 오랫동안 정적으로 입력되고 해석되었습니다.

아시다시피, 역동적 인 군중은 자신이하는 일에 대해 신중하게 생각할 필요가없는 자유를 원할 것입니다. 소프트웨어가 정확하지 않거나 견고하지 않을 수 있지만 반드시 그럴 필요는 없습니다.

개인적으로 형식 안전을 포기하고 일시적인 자유를 구입하려는 사람들은 자유도 형식 안전도받을 자격이 없다고 생각합니다.


답변

컴파일러가하는 일을 대체하기 위해 단위 테스트에서 10 배의 코드 커버리지를 작성해야한다는 것을 잊지 마십시오.

나는 거기에 있었고, 동적 언어로 그렇게했고, 전혀 이점이 없다고 생각합니다.


답변

다른 사람들의 반응을 읽을 때 동적 언어에 대한 세 가지 주장이 다소있는 것 같습니다.

1) 코드가 덜 장황합니다. 나는 이것이 유효하지 않다고 생각합니다. 일부 동적 언어는 일부 정적 언어보다 덜 장황합니다. 그러나 F #은 정적으로 입력되지만 정적 입력은 코드를 많이 추가하지 않습니다. 하지만 암시 적으로 형식화되어 있지만 이는 다릅니다.

2) “내가 가장 좋아하는 동적 언어 X에는 내가 가장 좋아하는 기능적 기능 Y가 있으므로 동적이 더 좋습니다.” 기능과 동적을 혼동하지 마십시오 (왜 이것이 말해야하는지 이해할 수 없습니다).

3) 동적 언어에서는 결과를 즉시 볼 수 있습니다. 뉴스 : Visual Studio (2005 년부터)에서도 C #으로 그렇게 할 수 있습니다. 중단 점을 설정하고 디버거에서 프로그램을 실행하고 디버깅하는 동안 프로그램을 수정하면됩니다. 나는 항상 이것을하고 완벽하게 작동합니다.

저 자신은 정적 타이핑을 강력하게 옹호합니다. 한 가지 주된 이유는 유지 관리입니다. 나는 거기에 자바 스크립트의 몇 10K 라인 시스템을 가지고 있고, 어떤 I는 (존재하지 않는) 컴파일러가 변수가 엉망 이름 바꾸기가 무엇인지 말하지 때문에 반나절처럼 걸릴 싶지 리팩토링. 그리고 그것은 내가 직접 작성한 코드이며 IMO도 잘 구성되어 있습니다. 나는 다른 사람이 작성한 동등한 동적 시스템을 담당하는 작업을 원하지 않을 것입니다.

나는 이것에 대해 엄청나게 비추천받을 것 같지만 기회를 잡을 것입니다.


답변

VBScript는 다른 버전의 VB와 비교하지 않는 한 짜증납니다. PHP는 너무 자란 템플릿 언어라는 점을 기억하는 한 괜찮습니다. 현대 자바 스크립트는 훌륭합니다. 정말. 엄청난 재미. “DHTML”태그가 붙은 스크립트를 멀리하십시오.

런타임 오류를 허용하지 않는 언어를 사용한 적이 없습니다. IMHO, 그것은 대체로 붉은 청어입니다. 컴파일러는 모든 오타를 포착하지 않으며 의도를 검증하지도 않습니다. 명시 적 유형은 명시 적 유형이 필요할 때 유용하지만 대부분 그렇지 않습니다. 여기서 질문을 검색 generics하거나 서명되지 않은 유형을 사용하는 것이 인덱스 변수에 적합한 선택인지 여부 에 대한 질문을 검색합니다. 대부분의 경우이 항목은 방해가되며 시간이있을 때 사람들이 손을 움직일 수있게합니다. .

그러나 나는 당신의 질문에 정말로 대답하지 않았습니다. 동적 언어가 매력적인 이유는 무엇입니까? 잠시 후 코드 작성이 지루해지고 알고리즘을 구현하고 싶기 때문입니다. 당신은 이미 모든 것을 펜으로 작업하고 잠재적 인 문제 시나리오를 도표화하고 해결할 수 있음을 증명했으며 남은 것은 20 줄의 구현을 코딩하는 것뿐입니다 … 그리고 컴파일 할 수 있도록 200 줄의 상용구를 작성하는 것입니다. . 그럼 당신은 당신이 작업하는 타입 시스템은 당신이 실제로 무슨 일을하는지 반영하지 않는다는 것을 깨닫게하지만, 다른 사람이 당신이 무엇을 매우 추상적 인 생각이 일을 할, 당신은 오래 전에 그렇게 knicknack의 미세 조정의 삶을 위해 프로그램을 포기했습니다 가상의 탐정 애드리안 몽크조차도 부끄럽게 만들 것이라는 강박 적입니다.

당신의 그 반죽 가서 시작 동적 언어에 심각하게보고있다.


답변

저는 정적으로 형식화 된 C #의 고통에 완전히 푹 빠진 풀 타임 .Net 프로그래머입니다. 그러나 저는 현대 JavaScript를 좋아합니다.

일반적으로 동적 언어를 사용하면 정적으로 입력 된 언어보다 의도를 더 간결하게 표현할 수 있다고 생각합니다 . 많은 경우에 표현하려는 구성 요소가 무엇인지 정의하는 데 시간과 공간을 덜 소비하기 때문입니다.

여러 종류의 동적 언어도 있다고 생각합니다. VBScript에서 고전적인 ASP 페이지를 작성하는 것으로 돌아가고 싶지 않습니다. 유용하게 사용하려면 동적 언어가 핵심에서 일종의 수집, 목록 또는 연관 구성을 지원해야 객체 (또는 객체에 전달되는 내용)를 표현하고 더 복잡한 구성을 만들 수 있습니다. (어쩌면 우리는 모두 LISP로 코딩해야 할 것입니다 … 농담입니다 …)

.Net 서클에서 동적 언어는 VBScript 및 / 또는 JavaScript와 관련되어 있기 때문에 나쁜 평가를받습니다. VBScript는 Kibbee가 언급 한 여러 이유 때문에 악몽으로 회상 될뿐입니다. 누구나 CLng를 사용하여 VBScript에서 유형을 적용하여 32 비트 정수에 대해 충분한 비트를 얻었음을 기억합니다. 또한 JavaScript는 여전히 모든 브라우저에 대해 다른 방식으로 작성된 드롭 다운 메뉴의 브라우저 언어로 간주됩니다. 이 경우 문제는 언어가 아니라 다양한 브라우저 개체 모델입니다. 흥미로운 점은 C #이 성숙할수록 더 역동적으로 보이기 시작한다는 것입니다. 저는 Lambda 표현식, 익명 객체 및 유형 추론을 좋아합니다. 매일 JavaScript처럼 느껴집니다.


답변

다음은 Haskell의 두 줄 (haskell.org에서)에있는 정적으로 형식화 된 QuickSort입니다.

qsort []     = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

다음은 동적으로 입력 된 LISP의 QuickSort입니다 (swisspig.net에서 제공).

(defun quicksort (lis) (if (null lis) nil
  (let* ((x (car lis)) (r (cdr lis)) (fn (lambda (a) (< a x))))
    (append (quicksort (remove-if-not fn r)) (list x)
      (quicksort (remove-if fn r))))))

나는 당신이 여기에서 선택한 언어로 일을 편향시키고 있다고 생각합니다. Lisp는 악명 높게 괄호가 무겁습니다. Haskell과 더 가까운 것은 Python입니다.

if len(L) <= 1: return L
return qsort([lt for lt in L[1:] if lt < L[0]]) + [L[0]] + qsort([ge for ge in L[1:] if ge >= L[0]])

여기 에서 파이썬 코드


답변

나에게 동적 언어의 장점은 Ruby의 블록 및 Python의 목록 이해와 같은 코드 및 기능적 기술 이 적기 때문에 코드가 얼마나 더 읽기 쉬워진다는 것 입니다.

그러나 나는 컴파일 시간 검사 (오타 발생)와 IDE 자동 완성을 놓칩니다. 전반적으로 적은 양의 코드와 가독성이 저에게 갚았습니다.

또 다른 장점은 일반적으로 해석되거나 컴파일되지 않은 언어의 특성입니다. 일부 코드를 변경하고 즉시 결과를 확인하십시오. 개발하는 동안 정말 시간을 절약 할 수 있습니다.

마지막으로, 콘솔을 실행 하고 이전에 사용한 적이없는 클래스 나 메서드와 같이 확실하지 않은 것을 시도해보고 어떻게 작동하는지 확인할 수 있다는 사실이 마음에 듭니다. 콘솔에는 많은 용도가 있으며 알아낼 수 있도록 남겨 두겠습니다.