이 논쟁을 둘러싼 강력한 의견이 많이 있지만 분명이 실제로 의견의 문제가 아니다, 그것의 문제 사실 . 따라서 우리는 경험적 연구를 살펴 봐야 합니다. 그리고 그 증거는 분명합니다.
그렇습니다 . 정적 타이핑은 약간의 가치가 아니라 실제로 실질적인 절충점의 가치가 있습니다. 사실, 확실한 증거는 정적 타이핑이 코드의 버그 수를 15 % 이상 줄일 수 있다는 것을 보여줍니다 (이는 추정치가 낮고 실제 백분율은 거의 확실합니다). 그것은 엄청나게 높은 숫자입니다. 정적 타이핑을지지하는 사람들조차도 그렇게 큰 차이를 만들지 않았다고 생각합니다.
누군가가 당신에게 프로젝트의 버그를 밤새 15 % 줄이는 간단한 방법이 있다고 말하면, 그것은 쉬운 일이 아닙니다. 1 그것은 거의 속담의 총알입니다.
그 증거는 Zheng Gao, Christian Bird 및 Earl T. Barr 의 논문에 타이핑하거나 타이핑하지 말아야 할 것들 : JavaScript에서 감지 가능한 버그의 정량화에 나와 있습니다. 나는 모든 사람이 그것을 읽을 것을 권장합니다. 그것은 훌륭한 연구를 제시하는 잘 작성된 논문입니다.
저자가 얼마나 엄격하게 분석을 수행했는지 간결하게 요약하기는 어렵지만 여기에는 (매우 거친) 개요가 있습니다.
TypeScript 및 Flow 는 JavaScript를 기반으로하는 두 가지 프로그래밍 언어로, 호환되는 방식으로 유형 힌트 및 정적 유형 검사를 추가합니다. 이를 통해 기존 코드를 유형별로 확장 한 다음 유형을 확인할 수 있습니다.
연구원들은 GitHub에서 JavaScript로 작성된 오픈 소스 프로젝트를 수집하고, 해결 된 버그 보고서를보고,보고 된 각 버그를 TypeScript 또는 Flow의 정적 유형 검사기에서 잡을 수있는 코드 조각으로 줄이기 위해 시도했습니다. 이를 통해 정적 타이핑을 사용하여 버그 비율의 하한을 추정 할 수있었습니다.
연구원들은 분석을 통해 유형과 관련이없는 버그를 유형과 관련이있는 것으로 간주하지 않도록 엄격한 예방 조치를 취했습니다. 2
과거의 연구와 비교할 때이 새로운 연구에는 다음과 같은 장점이 있습니다.
- 가 직접 정적의 비교 대 자바 스크립트와 타이프 라이터 / 흐름 사이의 유일한 차이점은 입력이기 때문에 (있는 경우) 몇 가지 혼란 변수 동적 타이핑은.
- TypeScript와 Flow (예 : 다른 유형 시스템)를 모두 확인하고 다른 사람이 (수동) 유형 주석을 재현하여 버그를 수정함으로써 여러 차원에서 복제를 수행합니다. 그리고 다른 프로젝트의 수많은 코드 기반에서이 작업을 수행합니다.
- 이 백서는 정적 타이핑이 수정 가능한 버그 에 대한 직접적인 영향을 측정합니다 (약간의 모호한 품질이 아닌).
- 저자는 무엇을 측정하고 어떻게 사전에 엄격한 모델을 정의합니다. 또한 설명은 매우 명확하고 결함을 쉽게 분석 할 수 있도록합니다 (연구 논문이 공격에 노출 될 때 항상 좋습니다 : 공격이 주장을 찌그러 뜨리지 않으면 더 강해집니다). 삼
- 표본 크기가 충분하고 후속 통계 분석이 완전 하도록 적절한 검정력 분석을 수행합니다 .
- 혼란스러운 설명을 배제하고 하나의 움직이는 부분 만 측정하기에는 지나치게 보수적입니다. 또한 유형을 포함하여 즉시 수정 가능한 버그로 분석을 제한하고 입력을 수용하기 위해 고급 리팩토링이 필요한 항목은 제외합니다. 실제로 실제로 그 효과는 그다지 크지 않지만 확실히 그들이보고 한 것보다 작지 않습니다.
- 그리고 마지막으로, 그들은 약간의 효과가 아니라 놀라운 차이를 발견했습니다 . 지나치게 보수적 인 절차에도 불구하고 95 % 신뢰 구간의 최저 수준에서도 최소한 추가 유형 검사만으로도 사라지는 버그의 10 % 이상이 발견됩니다.
아직 아무도 발견하지 못한 논문에 근본적인 결함이 없다면, 논문은 거의 비용없이 정적 타이핑의 큰 이점을 결정적으로 보여줍니다. 4
역사적으로, 프로그래밍 분야의 타이핑 분야에 대한 연구는 오랜 시간 동안 증거 가 전혀 명확 하지 않았기 때문에 어려운 시작 이었습니다 . 그 이유는 정적 대 동적 타이핑 의 효과를 검사하기 위해 체계적인 실험을 수행하는 것이 쉽지 않기 때문입니다. 체계적인 실험은 조사중인 효과를 분리해야합니다. 불행히도 우리는 프로그래밍 언어에 묶여 있기 때문에 타이핑 규칙의 효과를 분리 할 수 없습니다.
실제로이 있었다 (와 예 VB 정적 및 동적 모두 다른 방언의 입력을 허용 프로그래밍 언어 Option Strict
On
나 Off
, 또는 정적으로 리스프를 입력은). 그러나 이것들은 직접 비교에 적합하지 않았으며, 가장 중요한 것은 직접 비교할 수있는 기존의 충분히 큰 코드 기반이 없기 때문입니다. 기껏해야“실험실 설정”에서 테스트 대상이 정적으로 또는 동적으로 유형이 지정된 언어 변형으로 작업을 임의로 해결하는 것을 비교할 수있었습니다.
불행히도 이러한 인공 프로그래밍 할당은 실제 사용을 잘 모델링하지 않습니다. 특히, 이들 중 다수는 범위가 작고 텍스트의 반 페이지에 요약 될 수있는 잘 정의 된 문제를 해결합니다.
운 좋게도 TypeScript, Flow 및 JavaScript는 정적 타이핑을 제외하고는 실제로 동일한 언어이며 샘플링 할 코드 및 버그에 대한 광범위한 실제 데이터 세트가 있기 때문에 과거에는 마찬가지입니다.
1 원본 논문의 인용문에서 영감을 얻었습니다.
2 나는 이것에 완전히 만족하지 않는다. 정적으로 형식화 된 언어의 주요 강점 중 하나는 표면적으로 형식과 관련이없는 문제를 정적으로 형식 검사 할 수있는 방식으로 표현할 수 있다는 것이다. 이것은 많은 논리 오류를 유형 오류로 변환 하여 정적 입력에 의해 잡힐 수있는 버그의 비율 을 크게 증가시킵니다. 실제로이 백서는 유형과 관련이없는 버그를 대략 분류하고 있으며, 실제로는 정적 타이핑으로 인해 많은 부분이 발견 될 수 있다고 주장합니다.
3 분석에서 해결되지 않은 결함을 찾아 보도록 역동적 인 타이핑을지지하는 사람을 초대합니다. 나는 많은 것이 있다고 생각하지 않으며, 잠재적 결함이 결과를 실질적으로 변화시키지 않을 것이라고 확신합니다.
4 실제 대규모 프로젝트에서 정적 타이핑의 실제 비용이 존재하지 않는 것 같습니다. 아키텍처의 자연스러운 부분이되어 계획을 단순화 할 수도 있기 때문 입니다. 정적 유형 오류 수정에는 시간이 걸리지 만 나중에 발견되는 오류보다 훨씬 적습니다. 이것은 광범위하게 실험적으로 연구되어 왔으며 수십 년 동안 알려져왔다 (예 : Code Complete 참조 ).