동적 타이핑의 생산성 향상은 무엇입니까? [닫은]


82

동적 유형 언어가 정적 유형 언어보다 생산적이라는 주장을 자주 들었습니다. 이 주장의 이유는 무엇입니까? 컨피규레이션 오버 컨벤션, 함수형 프로그래밍, 고급 프로그래밍 모델 및 일관된 추상화 사용과 같은 현대적인 개념으로 툴링하는 것만이 아닌가? (예를 들어 Java에서) 종종 중복 유형 선언이 필요하지 않기 때문에 혼란이 적지 만 정적 유형 지정의 다른 이점을 잃지 않고 유형 유추를 사용하는 정적으로 유형이 지정된 언어에서 대부분의 유형 선언을 생략 할 수도 있습니다. 그리고이 모든 것은 스칼라와 같은 현대적인 정적으로 유형이 지정된 언어에서도 사용할 수 있습니다.

그렇다면 실제로 타이핑 모델 자체의 장점 인 동적 타이핑의 생산성에 대해 무엇을 말해야합니까?

설명 : 저는 빠른 해킹보다 큰 / 중간 규모의 프로젝트에 더 관심이 있습니다. :-)


10
"static duo"가 "dynamic duo"보다 빠르거나 생산성이 높을 것으로 기대하십니까?
Steve314

듀오 란 무엇을 의미합니까? 어쨌든 : 정적 타이핑이 동적 타이핑보다 생산적이라는 몇 가지 이유를 생각할 수 있습니다. 더 많은 컴파일러 검사 오류, 코드 완성, 코드의 프로그래머 의도에 대한 자세한 정보. 이것이 내가 대화에 대해 묻는 이유입니다.
Hans-Peter Störr

11
요점이있는 농담이었습니다. "동적 듀오"는 배트맨과 로빈입니다. 그들이 "정적 듀오"라고 불리 우면 고담시 범죄 지하 세계에 거의 두려움을 느끼지 않을 것입니다. 개발자는 사람이므로 용어의 의미에 관계없이 피상적 인 요소가 차이를 만들 수 있습니다.
Steve314

첫 번째 질문은 내가하고있는 일을 아는지의 여부입니다. 그렇다면 미리 미리 디자인 할 수 있으며 정적 타이핑이 의미가 있습니다. 그렇지 않으면 즉시 많은 것을 변경해야하며 동적 타이핑이 더 쉬울 것입니다. Common Lisp은 내가하고있는 일을 모른다면 내가 찾은 최고의 언어입니다. (주의 사항 : 나는 Haskell을 긁었으므로 유추 된 정적 타이핑에 대한 느낌이 없습니다.)
David Thornley

답변:


99

나는 실제로 그것이 꽤 가까운 전화라고 생각합니다. 동적 타이핑과 정적 타이핑 모두 장점이 있습니다.

동적 입력이 더 생산적인 이유 :

  • 더 간결합니다 .-모든 유형이 동적으로 유형이 지정된 경우 (예 : 타입 선언, 타입 캐스팅 로직 등) 많은 외부 상용구 코드를 제거 할 수 있습니다. 유지 보수
  • 오리 타이핑 및 원숭이 패치와 같은 "해킹" 기술을 사용하면 결과를 매우 빠르게 얻을 수 있습니다 (나중에 혼동 될 수도 있지만 ...)
  • 보다 대화식 -동적 타이핑은 실행중인 프로그램 인스턴스 또는 실시간 코딩의 신속한 프로토 타이핑, 실시간 디버깅을위한 대화식 REPL 유사 프로그래밍에 적합합니다.
  • 테스트 케이스는 런타임 오류를 포착 할 수 있습니다. TDD를 사용 중이거나 최소한 테스트 스위트가 양호하다고 가정하면 코드에서 입력 문제가 발생합니다.
  • 다형성 개선 -동적 언어는 다형성 함수 및 추상화 생성을 장려 할 가능성이 높아 생산성과 코드 재사용을 향상시킬 수 있습니다. 예를 들어 Clojure는 많은 추상화 에서 동적 다형성을 잘 활용 합니다.
  • 프로토 타입 - 프로토 타입 기반 데이터 / 객체 모델은 정적으로 유형이 지정된 상속 계층보다 더 강력하고 유연합니다. 동적 언어는 프로토 타입 기반 접근 방식을 허용하거나 장려 할 가능성이 높으며 Javascript가 좋은 예입니다.

정적 타이핑이 더 생산적인 이유 :

  • 더 나은 디자인 -소프트웨어의 가치 유형을 미리 생각해야한다면보다 깨끗하고보다 논리적 인 솔루션으로 이끌 수 있습니다. (나는 할 수 있다고 말한다 -정말 나쁜 코드를 디자인하는 것은 여전히 ​​가능하다 ...)
  • 더 나은 컴파일 시간 확인 -정적 타이핑을 사용하면 컴파일시 더 많은 오류가 발생할 수 있습니다. 이것은 큰 장점이며, 정적으로 유형이 지정된 언어에 대해 가장 좋은 것입니다.
  • 자동 완성 -정적 타이핑은 IDE에 더 많은 정보를 제공하여 코드 또는 문서 조회의 자동 완성이 더 효과적입니다.
  • 해킹 방지 -코드에 유형 규칙을 유지해야하므로 장기적인 유지 관리에 유리할 수 있습니다.
  • 유형 추론 -일부 언어 (예 : 스칼라)에서는 동적 언어의 간결한 이점을 통해 유형 규칙을 유지할 수 있습니다.

평균적으로 제 결론은 (펜스의 양쪽에서 수년간의 경험을 쌓은 후) 동적 타이핑이 단기간에 더 생산적 일 수 있지만, 테스트 스위트와 테스트 규칙이 매우 좋지 않으면 유지하기가 어렵다는 것입니다.

반면에, 정확성 이점과 도구 지원이 장기적으로 생산성을 향상시킬 수 있다고 생각하기 때문에 실제로는 정적으로 형식화 된 접근 방식을 선호합니다.


14
+1, 매우 자세한 답변. "더 나은 컴파일 시간 확인"포인트 값을 충분히 강조 할 수 없습니다.
NoChance

8
Type Inference와 함께 Haskell 스타일 오버로드, C ++ 템플릿, 제네릭 및 정적 타이핑 프레임 워크 내에서 오리 타이핑의 장점을 제공하는 다른 언어 기능도 있습니다. 객체가 필요한 인터페이스를 제공하는 한 "오리와 같은 퀘이크")는 공칭 유형 과 거의 상관없이 사용할 수 있습니다 . "거의"는 일부 접근 방식이 일종의 "이 종류의 덕과 같은 오리"선언 (예 : Haskell의 "클래스"선언)을 필요로하기 때문입니다.
Steve314

45
"짧은 코드는 더 빨리 읽고 유지 관리하는 것이 더 빠르다"는 당신의 주장에 강력히 반대해야합니다. 코드를 이해 하는 중간 단계 가 있습니다. 다른 사람들의 코드를 Delphi와 JavaScript로 유지해야했고 Delphi 코드 는 더 장황 하기 때문에 이해 하기 가 훨씬 쉽습니다 . 그리고 특히 델파이 코드에는 타입 선언이 있고 JavaScript는 그렇지 않기 때문에. 프리미티브보다 복잡한 것을 다룰 때, 타입 선언은 변수가 무엇인지, 변수가 무엇을 할 수 있는지를보기가 쉽지 않습니다. 이는 유지 보수 작업에 필수적인 지식입니다.
메이슨 휠러

21
나는 여기에 주어진 대부분의 이유에 동의하지 않기를 간청합니다. 아마도 가장 엄격한 유형 시스템이있는 Haskell을 가져 가십시오. REPL (실제로 두 개 이상)을 가지고 있으며 생성자에 패턴 일치를 수행하여 매우 강력한 다형성을 제공하며 Javascript 또는 Python보다 훨씬 더 간결합니다. 그래서 당신이 언급 한 이유 중 일부는 느슨한 유형의 언어가 아니라 우연한 것 같습니다.
안드레아

15
나는 "테스트 사례"에 너무 많은 신뢰를 두지 않을 것이다. 좋은 유형의 시스템과 비교할 수 없습니다. 타입 시스템은 함수가 최소한 타입이 올바른 파라미터로 이미 호출되었다는 증거를 제공하는 반면 테스트 사례는 경험적 증거 만 제공 할 수 있습니다. 그러나이 증거조차 인공적인 환경에서 수집됩니다.
Ingo

56

동적 언어를 사용하면 유형이 지정된 언어를 사용할 때보 다 빠르게 코드를 작성할 수 있습니다.

거대한 동적 요소를 신속하게 생성하면 장기적인 유지 관리를 신경 쓰지 않고도 다른 프로젝트로 안전하게 이동할 수 있습니다.

이것은 생산성 향상입니다 :)

농담이지만 ​​'동적 언어'를 사용하는 프로젝트에 참여한 후, 작동하는 제품을 원한다면 처리해야 할 불필요한 테스트, 문서 및 규칙이 너무나 무서웠습니다.
그리고 컴파일 할 때 발생할 수있는 많은 런타임 오류의 기쁨으로.
또한 메타 프로그래밍을 통해 코드에 도입 할 수있는 모든 해킹과 voodoos에 대해 아는 것도 잊었습니다!

따라서 생산성 향상은 평생 동안 중간 규모 / 큰 프로젝트의 신화 일 수 있습니다.


11
예, 제 경험은 동일합니다. 100 줄의 펄 스크립트는 괜찮습니다. 훌륭한 도구가 없으면 우리는 잃어 버렸습니다. 그러나 100k 라인 펄 프로젝트는 아마도 악몽 일 것입니다.
Ingo

3
... 그리고 JavaScript가 있습니다 (동적 일뿐 만 아니라 약한 유형도 있습니다).
Den

16

이 문제에 대한 이론적 견해도 있습니다 : 정적 타입 시스템은 본질적으로 프로그램의 타입-정확성을 증명할 수있을 때만 프로그램을 받아들이는 특수 정리 증명 자입니다. 결정 가능한 정적 유형 시스템이 가능한 모든 유형 정정 프로그램을 입증 할만큼 강력하지 않기 때문에 모든 정적 유형 시스템은 일부 유효한 프로그램을 거부합니다.

정적 유형 검사기가 제공 할 수없는 프로그램은 해킹 및 / 또는 나쁜 스타일이라고 주장 할 수 있지만 이미 유효한 프로그램을 가지고 있고 유형 검사기가 프로그램을 수락하지 않으면 단기적으로 생산성을 손상시킵니다.

형식 검사기가 방해가되는 경우는 일반 컨테이너와 인수 및 반환 형식의 공 / 차이가 있습니다.


18
반대로 잘못된 프로그램 을 잘못 입력 한 경우 컴파일러에서 즉시 알려주고 불량 라인을 강조 표시합니다. 이는 실패한 테스트 실행을 감지하고 오류를 찾기 위해 디버깅하는 것과 비교할 때 생산성을 향상시킵니다.
MarkJ

5
일반 컨테이너와 명시 적 공 / 차 차이는 잘못한 경우 "가져 오게"하는 것을 의미합니다. 런타임에 실패하는 코드 컴파일의 이점은 무엇입니까?
M.Stramm

일반적으로 작업은 모든 테스트를 성공적으로 실행할 때까지 0 % 완료된 것으로 간주됩니다. 그래야만 진행 상황을 아무것도 아닌 것으로 간주 할 수 있습니다. 이를 염두에두고 아직 완료되지 않은 제품의 생산성을 측정 할 가치는 없다고 생각합니다.
Pijusn

-1 실제 질문 ( "생산성 향상", 기억하지 않습니까?)을 다루지 않습니다. 또한 "유형 시스템이 거부하는 올바른 프로그램"을 작성하고 싶지 않을 수도 있습니다. 그렇다고해서 꼭해야한다는 의미는 아닙니다. 그리고 왜 타입 체커가 거부하는 "유효한 프로그램"을 갖고 있습니까? Javascript 프로그램을 코딩하고 갑자기 Java로 컴파일하려고 했습니까?
Andres F.

타입 시스템이 거부하는 유효한 프로그램은 코드를 단축시켜 타입 시스템이 알아낼 수없는 오류를 줄입니다 (코드가 적을수록 오류가 적음). 라인을 강조하는 컴파일러 / IDE는 테스트 값 (예 : REPL 구동 개발)을 사용하여 동적 언어로 수행 할 수 있으므로 중간 값을 볼 수 있으며 유형 시스템뿐만 아니라 유형 오류도 선택할 수 있습니다. 정적 유형 유추를 사용하여 유형 경고를 표시 할 수도 있습니다.
aoeu256

15

대부분의 동적 언어에서 찾은 한 가지 장점은보다 일반적인 코드를보다 쉽게 ​​작성할 수 있다는 것입니다. 타입 시스템과 싸울 필요가 없을 때 더 높은 수준의 추상화로 작성하는 것이 훨씬 쉽습니다.

당신은 많은 그것에 대해 생각하지 않아도 -와 사소 일을 수행하는 코드 작성 어떤 자바 오브젝트하는 것은 어렵고 아마도 기본적으로 동적으로 입력되는 반사를 요구한다 JavaScript와 같은 것을 사용하면 모든 객체에 흥미로운 기능을 수행하는 함수를 작성하는 것이 제 2의 본성입니다. 완벽한 예는 객체를 가져 와서 모든 메소드를 동일한 작업을 수행하지만 이벤트를 발생시키는 메소드로 대체하는 최근에 작성한 함수입니다. Java에서 이와 같은 방식으로 접근하는 방법을 모르겠습니다. 그러나 유형 시스템으로 인한 금액과 다른 언어 차이로 인한 금액이 확실하지 않습니다.

그러나 최근에 Haskell을 사용하기 시작했습니다. Haskell을 사용하면 동적으로 입력 한 언어처럼 쉽게 추상적이고 일반적인 코드를 작성할 수 있습니다. 위의 Java / JavaScript 예제 는 객체, 메소드, 이벤트 또는 많은 돌연변이가 없기 때문에 Haskell 에서는 의미가 없지만 다른 종류의 일반 코드는 작성하기 쉽습니다.

실제로 Haskell은 동적으로 입력되는 언어로는 할 수없는 몇 가지 일반적인 코드를 작성할 수 있습니다. 완벽한 예는 read기본적으로 반대되는 함수입니다 toString. 당신은 얻을 수 있습니다 Int또는 Double당신이 원하는 또는 어떤 유형 (한이 특정 유형 클래스의 참조). 당신은 다형성 할 수 있습니다 상수를 , 그래서 maxBound(가)까지 가능 Int, Double, Char... 등., 모두가 해야하는 유형에 따라 할 수 있습니다.

저의 이론은 이제 동적 언어를 사용함으로써 얻을 수있는 생산성 향상은 능력이 적고, 더 장황하며, 유연성이 떨어지는 유형 시스템을 가진 Java와 같은 언어와 항상 비교된다는 것입니다.

그러나 Haskell의 유형 시스템조차도 동적으로 유형이 지정된 언어로는 가질 수없는 성가신 문제가 있습니다. 내가 가장 걱정 한 것은 숫자가 처리되는 방식입니다. 예를 들어, 형식 시스템 length이 없으면 문제가 없을 것입니다. 내가 겪었던 또 다른 성가신 일은 Word8(부호없는 int 유형)과 기대하는 함수를 사용하는 것 Int입니다.

따라서 궁극적으로 유형 시스템이 없으면 너무 많이 생각하지 않고 일반 코드를 작성하는 것이 더 쉬워지고 유형 시스템의 성가신 함정을 피할 수 있습니다. 동적 언어로 타입 시스템과 싸울 필요는 없지만 그에 의존 할 수는 없습니다.


1
그렇습니다. 어떤 이유로 든 숫자 체계는 제대로 달성하기가 어렵습니다. 스칼라에서는 엉망입니다. 동적 유형 시스템은 간단한 정적 유형 시스템보다 작업이 용이하다는 점에서 유리하지만, 고급 시스템 (Scala, Haskell, ML 등과 같이 system-F의 변형을 사용하는 시스템) 에서는 잃어 버린다고 생각합니다 .
Edgar Klerks

3
귀하의 답변은 의미가 있지만 실수가 있습니다. 첫째, 동적 언어에 "유형 시스템이 없다"는 것은 사실이 아니기 때문에 "일반 코드 작성이 더 쉬워지는"이유가 될 수 없습니다. Haskell에 대한 자신의 반례가 보여 주듯이 자신을 주장하기가 쉽지 않습니다. "타입 시스템과 싸울 필요가 없습니다"는 거짓입니다. 정적 타입 검사가 충분하지 않아 발생한 버그를 수정해야 할 때마다 싸 웁니다. 마지막으로, Int리스트에 의해 리턴 된 것을 명시 적으로 강제하는 것은 쉽지 않습니다. 예 : 1.0 + fromIntegral (length myList)즉, 그냥 사용하십시오 fromIntegral.
Andres F.

2
마지막으로 "코드 작성 속도가 빠름"! = "보다 생산적입니다". 코드가 작동해야합니다! 나중에 디버깅 및 수정에 시간을 소비해야하는 버그가있는 소프트웨어를 작성하면 생산성이 떨어집니다.
Andres F.

다이나믹하게 타이핑 된 언어가 "보다 생산적"이라는 말을 할 때 "너무 많이 생각하지 않고"적기
Ataraxia

유형 시스템이 실제로 생산성을 향상시킨 경우 Haskell 또는 Idris의 유용한 응용 프로그램은 어디에 있습니까? 형식 오류, "패치 가능성"(예측할 수없는 방식으로 응용 프로그램을 편집 할 수있는 기능) 및 doctest 및 형식 유추의 90 % 오류 검사를 이해하는 것이 얼마나 쉬운 지 더 중요하다고 생각합니다.
aoeu256

7

Q : 동적 유형 언어가 정적 유형 언어보다 생산적이라는 주장을 자주 들었습니다. 이 주장의 이유는 무엇입니까? "

역사적인 이유가 있습니다. 수십 년 전으로 돌아 가면 동적 언어는 정적 언어보다 훨씬 생산적이며 (훨씬 느리게) Perl은 C를 모두 알고 있고 현재 수행중인 작업 중 하나라도 허용하는 경우 C보다 훨씬 더 생산적입니다. 그러나 시간이 지남에 따라 언어는 서로 많은 돈을 빌려 왔으며 새로운 언어는 그 차이를 좁히고 있습니다 (생산성과 성능 모두).

고려해야 할 사항은 다음과 같습니다.

가비지 수집 : 가비지 수집이있다 거대한 생산성 향상. Java가 GC의 첫 번째 주요 정적 언어라고 생각합니다. 그 전에 정적은 기본적으로 수동 메모리 관리를 의미했습니다. (참고 : 여기 및 다음에서는 주류 언어 만 고려하고 있습니다. 많은 실험 및 틈새 언어가 존재하므로 어떤 시점 에나 반대의 예를 제공 할 수 있습니다.)

메모리 안전 : 발을 쏠 때 걱정할 필요가없는 생산성 향상입니다. Java와 같은 "관리되는"정적 언어 이전에는 정적은 일반적으로 직접 메모리 액세스를 의미했습니다. 디버깅도 생산성의 일부이며, 안전하지 않은 메모리 액세스는 실제로 모호한 버그로 이어질 수 있습니다.

성가신 유형 시스템. 정적 언어로 매개 변수화 된 유형 (예 : 템플리트 또는 제네릭)을 도입하기 전에 정적 유형 시스템의 한계가 종종 부담이었습니다. 예를 들어 Java에서는 컬렉션에서 항목을 선택할 때마다 명시 적으로 다운 캐스트해야했습니다. 그래서 당신은 캐스트의 구문 오버 헤드를 가지고 어떤 종류의 안전을. 유비쿼터스 컬렉션이 프로그래밍에 어떤 영향을 미치는지 고려할 때 이는 큰 단점이었습니다.
모든 유형의 유형을 선언해야하는 것은 많은 중복 된 타이핑이지만 현대적인 유형 유추를 통해이를 크게 줄일 수 있습니다.

큰 표준 라이브러리. 파이썬은 큰 표준 라이브러리 때문에 "배터리 포함"으로 유명했습니다. 이것은 매우 미니멀리스트 표준 라이브러리가있는 C와 비교됩니다. 그러나 Java 및 .net과 같은 플랫폼에서는 방대한 표준 라이브러리가 표준이되고 있으며 Scala 및 F #와 같은 새로운 언어는이를 "무료로"상속합니다.

일류 데이터 구조. Perl 및 Python과 같은 동적 언어에는 목록 및 맵과 같은 일류 데이터 구조가 내장되어있어 일반적인 작업을위한 편리한 구문 단축키가 있습니다. 이에 비해 C에는 고정 크기 배열을 제외하고 내장 컬렉션이 없습니다.

클로저 및 람다 구문 -동적 언어는 일반적으로 처음부터 이것을 가지고 있지만 정적 언어는 이것을 가장 최근에 Java로 채택했습니다.

대화식으로 코드 스 니펫을 빠르게 테스트 할 수있는 REPL 기능은 큰 도움이됩니다. 그러나 Visual Studio의 "즉시"창과 같은 IDE 도구는 정적 언어로이를 어느 정도 모방 할 수 있습니다.

고급 툴링 -정적 언어가 동적 언어의 편리함에 가까워지는 위의 포인트 외에도 현대 편집자는 동적 언어가 일치하는 데 어려움을 겪는 방식으로 정적 분석을 활용하고 있습니다. 예를 들어, 편집자는 안전한 자동 리팩토링을 제공 할 수 있습니다.

결론 : 역사적으로 사실이지만 오늘날의 대답은 명확하지 않습니다.


Q : 그렇다면 실제로 타이핑 모델 자체의 장점 인 동적 타이핑의 생산성에 대해 무엇을 말해야합니까?

동적 타이핑 모델을 동적 언어와 분리하는 것은 다소 어렵지만, 예를 들어 C #은 핵심 언어가 정적 언어 임에도 불구하고 시간이 지남에 따라 더 동적 인 기능을 채택했습니다. 이것은 실제로 동적 유형 모델의 이점을 증명합니다. 예 :

반사 반사는 기본적으로 동적 타이핑 기능입니다. 컴파일 타임보다 런타임 속도로 객체 유형을 검사합니다. 그것이 도입되었을 때 눈살을 찌푸리게되었지만 C #에서는 리플렉션 사용이 점점 더 보편적이되었습니다. 예를 들어 ASP.Net MVC는 리플렉션을 많이 사용합니다.

특성 특성은 동적 입력의 예입니다. 컴파일 타임에 클래스에 임의의 속성을 추가 한 다음 런타임에 리플렉션을 통해 검사하고이를 기반으로 객체를 조작 할 수 있습니다. MEP와 같은 것은 기본적으로 동적 유형 모델을 기반으로하는 확장 프레임 워크입니다.

Linq에서 SQL로, EF mv. 다양한 Linq 변환기는 쿼리를 런타임 객체로 검사하고 즉시 SQL을 생성합니다. 런타임에 코드를 검사하는 것보다 역동적이지 않습니다. CodeDom은 코인의 다른 측면으로, 런타임에 코드를 생성 할 수 있습니다

Roslyn Roslyn은 기본적으로을 구현 eval했는데, 이는 한때 진정으로 역동적 인 언어의 특징으로 여겨졌습니다.

동적dynamic 타입은 C #에서 가장 명시 적으로 동적 기능으로, 외부 개체와 더 간단하고 생산적인 언어와의 상호 작용을 만들기에 광고됩니다. 그러나 편의상 Asp.net MVC에서도 사용됩니다.

위의 모든 기능의 이점은 동적 모델이 매개 변수화 된 유형, 구조 유형 및 유형 유추를 가진 정적 언어 에서도 확실한 이점을 가지고 있음을 보여줍니다 .


거의 모든 요점이 "동적 타이핑의 생산성 향상은 무엇입니까 ?" 동적 언어가 아닙니다 .
nanny

@nanny 동적 유형 언어와 동적 언어 사이의 차이점을 자세히 설명 할 수 있습니까? (그 퍼지 것들 중 하나). 동적 언어가 아닌 동적 유형 언어의 예와 각 언어에 대한 명확한 정의를 제공 할 수 있습니까?

@nanny :이 질문은 실제로 "동적 타이핑"뿐만 아니라 "동적 타입 언어"에 관한 질문입니다.
JacquesB

@MichaelT 확실하지 않아서 죄송합니다. 동적 타이핑은 모든 동적 언어의 한 측면입니다. 이 답변은 역사적으로 동적 언어가 실제로 동적 타이핑 부분을 다루지 않고 오는 경향이있는 다른 측면에 대해 이야기하고 있습니다.
nanny

1
@nanny : 기본적으로이 질문에 답하고 있습니다. "동적 형식 언어가 정적 형식 언어보다 생산적이라는 주장을 자주 들었습니다.이 주장의 이유는 무엇입니까?" -이 주장의 이유는 역사적이며 역동적 인 타이핑뿐만 아니라 동적 언어의 다른 생산성 향상 기능과도 관련이 있다고 생각합니다.
JacquesB

6

모든 현대 언어 기능의 전체 크기가 너무 커서 정적 대 동적 입력만으로는 많은 무게를 갖지 않습니다.

규칙은 언어 기능이 좋을수록 코드가 짧아집니다. 아주 간단합니다. 자바는 정적 타이핑이 끔찍하게 잘못 될 수있는 방법을 보여줌으로써 상대방에게 많은 피드를 제공합니다. 잘못 설계된 언어 기능에는 일반적으로 비용이 발생하며, Java의 정적 타이핑은 우선 필수 기능이며 (그렇지 않으면 대부분의 사람들은 사용하지 않을 것임) 둘째로 제대로 실행되지 않습니다.
이것이 타입 시스템과 관련이없는 다른 많은 단점들로 인해 PHP가 (최소한 최근까지) 총체적으로 더 나은 삶을 살지 못한다고 주장하지만 대부분의 동적 언어가 비추는 이유입니다.

다른 한편으로는 표현형 시스템을 가진 많은 언어가 있으며, 방해받지 않고 필수가 아닙니다. 그리고 그들 중 일부는 타입 시스템을 탈출해야 할 때마다 타입이 지정되지 않은 코드를 포함 할 수도 있습니다.

개인적으로, 나는 명료 한 구문을 피하면서 공칭 및 구조적 서브 타이핑, 선택적 유형화되지 않은 코드, 일급 함수 유형, 대수 데이터 유형 및 (성숙하지는 않지만 매우 강력한) 어휘 매크로와 같은 유형 유추가있는 언어 인 haXe를 사용합니다. 약 3 년 동안 haXe를 사용한 후 간단한 결론을 내 렸습니다.

언어가 패러다임에 대한 종교적 선택에 빠지지 않고 좋은 도구가 되려고 할 때 프로그래밍이 훨씬 쉬워집니다. 그에 성공 하는 많은 정적 및 동적 언어 와 혼합 언어가 있습니다. 그들 중 일부는 배우기 쉽고 대부분 마스터하기가 어렵습니다.
이들의 힘은 복잡한 문제에 대한 간단한 솔루션을 쉽게 만들 수 있도록 개별 기능을 구성 할 수있는 방식에서 비롯됩니다. 이것은 지금까지 살펴본 모든 언어 기능의 포함 또는 누락의 섬세한 균형을 통해서만 달성 할 수있는 특정 직교성을 배제합니다. 루비에 정적 타이핑을 추가하려고하면 파문이 나고, 하스켈에서 빼내려고하면 파쇄됩니다. 반대로 C에서 가져 가면 사람들은 거의 알지 못하고 Java에서 가져 가면 감사 할 수도 있습니다.

내 개인적인 경험에서 나는 이것을 말할 수있다. 나는 루비를 좋아한다. 그것은 나의 지평과 시스템 설계 방식을 넓혔습니다. IMHO 사람들에게 프로그래밍을 처음 가르치는 데 사용해야합니다. 눈에 거슬리지 않고 강력하고 간결하며 재미 있습니다. 나는 정통 언어에서 온 누군가가 그것을 즐기는 이유를 이해합니다.
그러나 장기적으로 정적 타이핑을 사용하면 정적 분석기에 대한 작업을 연기 할 수 있으며 유형 유추를 통해 기본적으로 무료로 제공됩니다. 결과적으로 유지 관리가 쉽고 자주 실행되는 코드가 만들어집니다.

그러나 정적 타이핑만으로는 아무 일도 할 수 없습니다. 그것은 조합의 문제입니다. F #, Scala, Nemerle, OCaml 또는 haXe 사이에서 나만의 최적의 것을 찾을 수 있다고 생각합니다. 그러나 언어는 당신이 생각을 주위에 구부리지 말고 노력하지 않고 노력을 기울일 수 있도록해야하기 때문에 궁극적으로 당신에게 달려 있습니다. 그리고 결국 프로그래밍이 재미있는 것보다 생산성이 향상되는 것은 없습니다.


"규칙은 언어 기능이 좋을수록 코드가 짧아진다는 것입니다." 이것은 어느 정도의 의견에 달려있을 수도 있지만, 나는이 진술이 정확하다고 생각하지 않습니다. 코드가 짧을수록 쓰기 시간에 타이핑이 적고 디스크 공간을 적게 차지하는 것 외에는 많은 이점이 없습니다 (어쨌든 컴파일 된 언어에서는 중요하지 않습니다). 좋은 언어의 마크는 가능한 한 가장 간결한 방식으로 수행되는 작업에 대한 많은 정보를 전달한다고 생각합니다. 동적 입력은 IMO 매우 자기 문서화하지 않고 결과로 유지 보수를 잃게
아타락시아

기본값 / 키워드 인수, 유형 유추에서 얻은 유형, JIT 컴파일러에서 동적 유형 유추 또는 모든 함수를 기록하는 것만으로 실행중인 프로그램의 모든 함수 또는 클래스로 이동하여 동적 유형 코드를 보완 할 수 있습니다 인수 / 결과를 기록하는 함수 버전). 그런 다음 함수의 이전 실행 로그를 볼 수 있습니다. 또 다른 아이디어는 형식 주석, 런타임 계약 또는 샘플 REPL 세션 테스트가없는 코드를 거부하지만 개발자에게 세 가지 중 하나를 선택할 수있는 옵션을 제공하는 것입니다.
aoeu256

3

개인적으로 다이내믹 타이핑이 도움이 될 수있는 유일한 이유는 타이 포스트가 느리거나 탐색하기 어려운 거대한 기능 / 메소드 / 무엇을 구축하는 것입니다. 또한 전체 단위 테스트 문제를 해결해야합니다. 동적 유형은 (부러진 코드 작성을 원하지 않는 한) 활발한 단위 테스트가 필요합니다 (동적 유형이 예기치 않게 폭발하지 않도록하기 위해 (예 : 변수는 주로 오리이지만 실수로 dcuk는 실수 임)). 스태틱은 이것을 막기 위해 훨씬 더 열심히 노력할 것입니다 (그렇습니다, 당신은 활발한 단위 테스트에 대한 논쟁을 할 수 있습니다)


0

우선 "생산성"을 정의해야한다고 생각합니다. "생산성"이란 무엇을 의미하고 포함합니까?

"보다 생산적"이라는 말은 동일한 기능을 구현하기 위해 더 적은 수의 코드를 작성하는 것을 의미한다면, 동적 타이핑 프로그래밍 언어는 정적 타이핑 언어보다 "생산적"입니다.

그러나 디버깅 및 버그 수정에 소요되는 시간도 고려할 경우 동적 입력 언어는 오류 입력 확인을 런타임에 푸시하는 반면 정적 입력 언어는 동적 입력 언어가 생산적이지 않을 수 있습니다. 컴파일 타임에 오류 검사를 수행 할 수 있습니다. 일반적으로 버그가 발견 될수록 버그를 수정하는 데 더 많은 비용이 드는 것으로 일반적으로 인정됩니다. 따라서, 동적 타이핑 코드는 정적 타이핑 코드와 생산성이 일반적으로 같거나 낮을 수 있습니다.


일반적으로 동적 언어를 사용하여 더 적은 수의 기능을 작성할 수있는 것은 아닙니다. 어쨌든 어떤 언어를 비교하고 있습니까?
Andres F.

@AndresF. 오, 나는 주로 파이썬과 C ++를 사용합니다.
yaobin

1
좋습니다, 그러나 실제로 파이썬과 C ++를 비교할 때는 동적 대 정적을 일반화 할 수 없습니다. C ++은 정적 입력을 사용하는 언어의 대표적인 예가 아닙니다. 매우 정적 인 형식의 언어가 있으며, 파이썬만큼 간단한 프로그램을 작성할 수 있습니다. 따라서 일반적으로 어설 션은 허위입니다.
Andres F.

예, 그러나 프로그램이 아직 실행 중일 때 프로그램을 편집하면 어떻게됩니까? 모든 런타임 문제는 간단하게 발생하며 바로 해결할 수 있습니다. Lisp에서 오류가 발생할 때마다 프로그램을 수정 한 다음 계속 실행할 수 있습니다. 예. 더 복잡한 경로의 경우 주석이 좋을 것입니다. 또한 유형이 아닌 오류가 발생할 수 있으므로 모든 언어에서 복잡한 경로를 피하는 것이 좋습니다.
aoeu256

-1

동적 타이핑의 큰 장점은 생산성입니다.

파이썬, 루비 등은 동적 타이핑 (기본 매개 변수, 내장 된 유형 등) 외에 다른 많은 생산성 향상 요소가 있습니다. 프로그래머 생산성에 대한 누적 효과는 인상적입니다.

속도 (또는 부족) 및 자원 소비에 대한 처벌은 예상만큼 나쁘지 않으며 대부분의 경우 개발 속도와 유연성에 의해 보상됩니다.

여기 주제에 (매우 오래된!) 종이 가 있습니다. 프로그래머 생산성에 대해 제대로 수행 된 몇 안되는 연구 중 하나이며 많은 결론이 여전히 유효합니다.

오늘날의 연구는 (아마도) 다른 것이었을까요?

  1. Java JVM은 인식 이상으로 향상되었습니다.
  2. 최신 IDE는 C ++ 및 Java 코더 생산성을 향상 시켰지만 스크립팅 언어와 거의 차이가 없었습니다.
  3. C #은 자바와 같은 야구장에 포함될 수 있지만 약간 더 좋습니다.

따라서 성능이 정말 심각한 문제가 아니라면 메시지는 동적 언어가 생산성을 향상시킵니다.


2
명확하지 않은 점은 다이내믹 타이핑이 생산성을 높이기 위해하는 것입니다. 이 논문은 흥미롭지 만 매우 작은 프로그램에 관한 것이지만 이것이 대부분의 프로그램에서 수천 줄의 코드로 어떻게 전달되는지 확실하지 않습니다.
Hans-Peter Störr

5
이 연구에서는 C, C ++ 및 Java를 정적 언어의 예로 사용하고 일반적인 결론을 일반적인 프로그래밍 언어에 적용하려고 시도합니다. 세 언어는 모두 동일한 기본 구문을 공유하며, 고유하고 성능이 저하되는 결함이 있으므로 비교가 유효하지 않습니다. 정적 언어가 비생산적이지 않고 C 제품군이 비생산적입니다. 그들이 테스트에 파스칼 방언을 포함 시켰다면, 아마도 다른 결론에 도달했을 것입니다.
메이슨 휠러

@mason-이 분야에는 실제 객관적인 연구가 거의 없습니다. 이것은 실제 숫자 등을 포함한 몇 가지 실제 연구 중 하나입니다. "샘플"프로그램은 사소한 것이 아닙니다! 사전 처리 요소, 복잡한 알고리즘 및 대용량 데이터를 결합합니다. 실패와 충돌 시도의 비율이 높으면 작업의 사소한 특성을 확인할 수 있습니다.
James Anderson

2
-1 동적 유형 언어를보다 생산적으로 만드는 것에 대해 많이 말하고 있지 않습니다 . 기본 매개 변수 및 사전은 스칼라와 같은 정적 유형 언어에서 찾을 수 있습니다.
Jonas

1
@JamesAnderson 더 나쁜 것은, 당신이 연결 한 논문이 당신의 요지를지지하지도 않는다는 것입니다. "스크립트 언어"(종종 동적)와 " 일반 언어"(종종 정적)를 비교합니다. 이제 "전통적인"언어 정확히 무엇 입니까? 정적 입력을 사용하는 언어 세트와 동일하다고 생각하십니까? 더 나쁜 것은, 종이가 그렇게 오래 되지 않았다는 것 입니다 . 2000 년에는 정적 언어를 사용한 많은 훌륭한 언어가 이미 동적 언어보다 생산성이 높았습니다.
Andres F.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.