이것은 친구와의 토론에서 나왔고, 나는 좋은 주장을 생각하기가 힘들다는 것을 알았습니다. 약한 타이핑은 어떤 이점을 제공합니까?
이것은 친구와의 토론에서 나왔고, 나는 좋은 주장을 생각하기가 힘들다는 것을 알았습니다. 약한 타이핑은 어떤 이점을 제공합니까?
답변:
이러한 유형의 토론의 문제점은 "정적 입력", "동적 입력", "명시 적 입력", "암시 적 입력", "예 : 오리 타이핑 ","구조 타이핑 "또는"공칭 타이핑 ". 아직까지도 연구와 토론의 영역 인 "매니페스트 타이핑"과 "잠재 타이핑"이라는 용어도 더 잘 정의되어있을 것입니다.
따라서 친구가 토론의 기초가 될 정도로 안정적인 "약한 타이핑"이라는 용어에 대한 정의를 제공 할 때까지이 질문에 대답하는 것은 의미가 없습니다.
안타깝게도 Nick의 답변 외에 응답자 중 누구도 자신의 정의를 제공하지 않았으며 일부 의견에서 혼란이 발생하는 것을 볼 수 있습니다. 아무도 그들의 정의를 실제로 제공하지 않기 때문에 말하기는 어렵지만, 나는 바로이 페이지에서 적어도 세 가지 다른 것을 세는 것으로 생각합니다.
가장 일반적으로 사용되는 정의 중 일부는 다음과 같습니다 (그렇습니다. 그 중 어느 것도 의미가 없다는 것을 알고 있지만 사람들이 실제로 사용하는 정의입니다).
그러나 가장 널리 사용되는 것으로 보이는 세 가지 정의 는
모두가 심지어 무엇을 "약한 입력"의 정의에 동의하지 않는 것입니다 , 심지어는 의미가 장점이 될 일을 생각하지 않습니다. 무엇의 장점? 더 나쁜 것은, 정의가 전혀 없다면 , 모든 사람들은 자신의 주장에 맞게 정의를 바꿀 수 있으며, 모든 토론은 화염 전으로 전개되는 것이 확실하다는 것입니다.
나는 나 자신이 몇 년에 걸쳐 내 자신의 정의를 개인적으로 바꾸어 왔으며 이제는 더 이상 유용한 용어를 고려하지 않는 시점에 도달했습니다. 또한 약한 타이핑 (다양한 정의에서)이 쉘 스크립팅에 자리 잡고 있다고 생각했지만 Bash와 PowerShell에서 동일한 문제를 해결해야 할 때마다 내가 얼마나 잘못되었는지 고통스럽게 생각 나게합니다.
일반적으로 혼동되는 두 가지 주요 개념이 있습니다.
프로그래밍 언어는 대부분의 유형 검사가 컴파일 타임이 아닌 런타임에 수행 될 때 동적으로 유형이 지정됩니다. 동적 타이핑에서 값에는 유형이 있지만 변수에는 없습니다. 즉, 변수는 모든 유형의 값을 참조 할 수 있습니다.
여기서의 장점은 종종 "새로운"프로그래머의 경우처럼 무시되지만 모든 프로그래머에게 편리 할 수도 있습니다.
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
다른 방법으로 새로운 값을 캐스트하거나 할당해야하는 경우 코드가 줄어 듭니다.
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
타이핑이 약하다는 것은 언어가 사용될 때 암시 적으로 유형을 변환 (또는 캐스트)한다는 의미입니다.
혜택:
암시 적 부울 평가 . 모든 유형은 부울로 평가 될 수 있습니다. ||
부울로 변환하지 않고 할당에 사용할 수 있는 부분과 같은 부작용도 있습니다 .
var a = param || defaultValue;
다시 말하지만 코드가 적습니다.
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
자바조차도 .toString()
객체를 String
; 그렇지 않으면 Java 프로그래머는 하루 종일 그것을 저주 할 것입니다 (로그 문은 제어 할 수 없습니다).
두 가지 정의는 http://en.wikipedia.org/wiki/Type_system에 있습니다. 그것은 내가 할 수있는 것보다 낫다고 말했다.
if
블록이 사용 되는지 또는 다른 복잡한 (런타임 또는 동적) 논리이든 관계없이 다음 줄은 합법적이고 오류로부터 안전하다는 점에서 동적 타이핑 과 관련이 있습니다.
약한 타이핑에 대한 주요 주장 은 성능 중 하나입니다. (이것은 명시된 OP 운영 질문에 대한 답변입니다). 동적 대 정적, 암시 적 대 명시 적에 대한 많은 토론이 있습니다. 기타
C는 가장 유명한 약한 유형의 언어이며 변수 유형의 런타임 검사 또는 컴파일 시간 검사를 수행하지 않습니다. 본질적으로 당신은 전송할 수 있습니다 char *
에 int *
와 언어 상관하지 않을 것입니다. 왜 이러는거야?
C 프로그래밍은 어셈블리를 사용하는 방식과 매우 유사하므로 주소 만 신경 쓰는 경우가 있습니다. void *
바로 이런 이유로 참조를 전송 하거나 전달하는 것은 드문 일이 아닙니다 . 메모리가 어떻게 구성되어 있는지 알고 있다면 (C 및 어셈블리 문제), void *
필요한 정보를 얻기 위해 주소를 기반으로 멋진 계산을 수행 할 수 있습니다 . 이를 통해 예를 들어 Java에서 수행해야 할 프로세스를 단락시킬 수 있습니다.
런타임 유형 검사에는 엄청난 오버 헤드가 없지만 중요한 섹션이 너무 느려질만큼 충분한 경우가 있습니다. 나는이 경우 임베디드 프로그래밍과 실시간 시스템에 대해 주로 생각하고 있습니다.
즉, 대부분의 경우 컴파일 시간을 확인하거나 런타임을 확인하는 강력한 유형의 시스템이 있으면 아파하는 것보다 더 자주 도움이됩니다.
예를 들어 엑셀, 자바 스크립트 및 vbscript 등의 초보자는 약한 타이핑이 이해하기 쉽습니다. 또한 잠재적 인 오류에 대해 일부 개발 속도를 교환합니다.
주제에 대한 좋은 기사 : 강력한 타이핑 vs 강력한 테스트