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