약한 타이핑을 선호하는 주장은 무엇입니까?


40

이것은 친구와의 토론에서 나왔고, 나는 좋은 주장을 생각하기가 힘들다는 것을 알았습니다. 약한 타이핑은 어떤 이점을 제공합니까?


17
Cooper와 Torczon의 공학 엔지니어 는 약한 타이핑을 잘못 설계된 유형 시스템을 사용하는 것으로 정의합니다. 그게 누군가에게 도움이 될 것 같지는 않습니다.
코빈 3

@ 코빈 3 월 : 좋은 하나. 내 목록에 추가해야합니다.
Jörg W Mittag

5
최고의 경영진은 다음과 같은 최고의 주장을 할 수 있습니다. 저렴한 시스템을 구축하기 위해 저렴한 사람들을 고용 할 수 있습니다.
Vector

답변:


46

이러한 유형의 토론의 문제점은 "정적 입력", "동적 입력", "명시 적 입력", "암시 적 입력", "예 : 오리 타이핑 ","구조 타이핑 "또는"공칭 타이핑 ". 아직까지도 연구와 토론의 영역 인 "매니페스트 타이핑"과 "잠재 타이핑"이라는 용어도 더 잘 정의되어있을 것입니다.

따라서 친구가 토론의 ​​기초가 될 정도로 안정적인 "약한 타이핑"이라는 용어에 대한 정의를 제공 할 때까지이 질문에 대답하는 것은 의미가 없습니다.

안타깝게도 Nick의 답변 외에 응답자 중 누구도 자신의 정의를 제공하지 않았으며 일부 의견에서 혼란이 발생하는 것을 볼 수 있습니다. 아무도 그들의 정의를 실제로 제공하지 않기 때문에 말하기는 어렵지만, 나는 바로이 페이지에서 적어도 세 가지 다른 것을 세는 것으로 생각합니다.

가장 일반적으로 사용되는 정의 중 일부는 다음과 같습니다 (그렇습니다. 그 중 어느 것도 의미가 없다는 것을 알고 있지만 사람들이 실제로 사용하는 정의입니다).

  • 약한 타이핑 = 안전하지 않은 타이핑 / 강한 타이핑 = 안전한 타이핑
  • 약한 타이핑 = 동적 타이핑 / 강한 타이핑 = 정적 타이핑
  • 약한 타이핑 = 오리 타이핑 / 강한 타이핑 = 공칭 타이핑
  • 약한 타이핑 = 구조적 타이핑 / 강한 타이핑 = 공칭 타이핑
  • 약한 타이핑 = 암시 적 타이핑 / 강한 타이핑 = 명시 적 타이핑
  • 약한 타이핑 = 잠재 타이핑 / 강한 타이핑 = 매니페스트 타이핑
  • 약한 타이핑 = 타이핑 없음 / 강한 타이핑 = 타이핑
  • 약한 타이핑 = 암시 적 캐스트 / 강한 타이핑 = 명시 적 캐스트 만
  • 약한 타이핑 = 암시 적 또는 명시 적 캐스트 / 강한 타이핑 = 캐스트 없음
  • 약한 타이핑 = 암시 적 전환 / 강력한 타이핑 = 명시 적 전환 만
  • 약한 타이핑 = 암시 적 또는 명시 적 전환 / 강력한 타이핑 = 전혀 전환 없음
  • 약한 타이핑 = 해석 / 강한 타이핑 = 컴파일
  • 약한 타이핑 = 느리게 / 강한 타이핑 = 빠름
  • 약한 입력 = 가비지 수집 / 강력한 입력 = 수동 메모리 관리
  • 약한 입력 = 수동 메모리 관리 / 강력한 입력 = 가비지 수집
  • … 그리고 많은 다른 사람들

그러나 가장 널리 사용되는 것으로 보이는 세 가지 정의 는

  • 약한 타이핑 = 멍청한 엉터리 프로그래밍 언어 / 강한 타이핑 = 내 최고 프로그래밍 언어
  • 약한 타이핑 = 다른 모든 프로그래밍 언어 / 강력한 타이핑 = 내가 배운 유일한 프로그래밍 언어 이 세계관)
  • 약한 타이핑 = 이해할 수없는 모든 언어 / 강력한 타이핑 = Java (자유롭게 C # 또는 C ++로 대체)

모두가 심지어 무엇을 "약한 입력"의 정의에 동의하지 않는 것입니다 , 심지어는 의미가 장점이 될 일을 생각하지 않습니다. 무엇의 장점? 더 나쁜 것은, 정의가 전혀 없다면 , 모든 사람들은 자신의 주장에 맞게 정의를 바꿀 수 있으며, 모든 토론은 화염 전으로 전개되는 것이 확실하다는 것입니다.

나는 나 자신이 몇 년에 걸쳐 내 자신의 정의를 개인적으로 바꾸어 왔으며 이제는 더 이상 유용한 용어를 고려하지 않는 시점에 도달했습니다. 또한 약한 타이핑 (다양한 정의에서)이 쉘 스크립팅에 자리 잡고 있다고 생각했지만 Bash와 PowerShell에서 동일한 문제를 해결해야 할 때마다 내가 얼마나 잘못되었는지 고통스럽게 생각 나게합니다.


5
꽤 냉소적 인 대답! 나는 당신이 어디에서 왔는지 알지만 정의를 제공하지 않는 사람이 "약하고 역동적 인 타이핑"을 언급하고 있다고 추측하는 것이 "충분히 좋다"고 생각합니다. 나는 그것이 완벽하지는 않다는 것을 알고 있지만, 대부분의 사람들은 타입 시스템을 정의 할 때 소리를 지르는 것처럼 보입니다.
Nicole

7
@Renesis : 나는 그것을 "현실주의"라고 부를 것이다 :-) 나는 사람들의 절반이 완전히 다른 것들에 대해 이야기하고 있다는 것을 깨닫지 못하고 다른 사람들은 그들이 말하는 것을 모른다는 것을 깨닫기 위해 타입 시스템에 대한 충분한 토론을 보았다. 에 대해 전혀 . 몇 달 전에 성능을 향상시키기 위해 선택적 유형 시스템을 추가하는 것에 대해 언급하지 않을 언어의 핵심 개발 목록에 대한 토론이있었습니다. 그 토론은 일주일 동안 계속되었고 수십 명의 사람들과 수백 개의 우편물이 참여했습니다. 아니 하나는 옵션 형 시스템 실현 정의에이 성능을 향상시킬 수 없습니다. ...
Jörg W Mittag

8
냉소에 +1! "강력한 타이핑 = IDE가 내 변수의 유형 (인텔리 센스 등)을 알고있을 때 약한 타이핑 = 그렇지 않은 경우)를 추가 할 수 있습니다.
user281377

1
입력 시스템을위한 더 나은 정의 이름은 암시 적 가치 판단이 부족 약한강한 있습니다.
Eva

1
화려하고 재미 있고 정확합니다. 타입 시스템에 대해 더 많이 배울수록, 한 언어가 전혀 다른 방식으로 다른 언어와 다르다는 환상으로 인해 얼마나 오래 고통을 겪었는지 더 많이 깨달았습니다. 이 개념이 얼마나 많은 혼란을 일으키는 지 놀랍습니다. 저는 약한 / 강한 것이 실제가 아니라는 것을 받아 들일 경우에만 필요하지 않다고 생각합니다. 그래서 실제로 존재하는 것에 대해 이야기하고 아마도 우리는 무언가를 배울 것입니다.
BrianH

25

일반적으로 혼동되는 두 가지 주요 개념이 있습니다.

동적 타이핑

프로그래밍 언어는 대부분의 유형 검사가 컴파일 타임이 아닌 런타임에 수행 될 때 동적으로 유형이 지정됩니다. 동적 타이핑에서 값에는 유형이 있지만 변수에는 없습니다. 즉, 변수는 모든 유형의 값을 참조 할 수 있습니다.

여기서의 장점은 종종 "새로운"프로그래머의 경우처럼 무시되지만 모든 프로그래머에게 편리 할 수도 있습니다.

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;
}

느슨하거나 약한 타이핑

타이핑이 약하다는 것은 언어가 사용될 때 암시 적으로 유형을 변환 (또는 캐스트)한다는 의미입니다.

혜택:

  • 모든 유형 값을 매개 변수로 함수에 전달하십시오 . 콜백, 유연한 API에 유용하며 클로저 구현을 간소화합니다.
  • 암시 적 부울 평가 . 모든 유형은 부울로 평가 될 수 있습니다. ||부울로 변환하지 않고 할당에 사용할 수 있는 부분과 같은 부작용도 있습니다 .

    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에 있습니다. 그것은 내가 할 수있는 것보다 낫다고 말했다.


1
정적 타입 언어에서 많은 코드 생성이 필요한 경우에도 동적 타이핑이 유리합니다. C #의 Entity Framework에 필요한 코드 생성량과 동적 형식 언어 (PHP, Python 등)의 ORM 라이브러리를 비교합니다. 일부 사람들은 IDE IntelliSense의 이점이 모든 코드 생성 비용보다 훨씬 높다고 주장 할 수도 있습니다.
Dean Harding

3
귀하의 의견 "// no i = ((Array) data) .length 또는 Array myArr = (Array) data;" 데이터의 배열 성이 컴파일 타임에 가능하기 때문에 동적 타이핑과는 실제로 관련이 없습니다. 정적으로 유형이 지정된 언어는 instanceof에서 얻은 지식을 전파 할 수 있습니다.
피터 테일러

@ 피터 테일러, 나는 그것이 간단한 경우에 해당한다고 생각합니다. if블록이 사용 되는지 또는 다른 복잡한 (런타임 또는 동적) 논리이든 관계없이 다음 줄은 합법적이고 오류로부터 안전하다는 점에서 동적 타이핑 과 관련이 있습니다.
Nicole

@Renesis, 아니, 아니 그러나 ML 언어 계열은 정적으로 유형이 지정되고 유형 유추를 사용하므로 변수 유형을 명시 적으로 언급 할 필요가 거의 없습니다.
피터 테일러

1
@ 피터 테일러가 맞습니다. 동적 입력의 많은 이점은 Haskell, Scala 또는 C #과 같은 더 나은 정적 입력 시스템을 갖춘 언어로 제공 될 수 있습니다. 동적 타이핑의 주요 장점은 HTML DOM과 같이 본질적으로 유형이없는 것을 처리하는 것입니다. node.attr 대신 node [ "attr"]를 쓰는 이유는 무엇입니까? 어쨌든 항상 런타임에 해결됩니다.
Matt Olenik

7

약한 타이핑에 대한 주요 주장 은 성능 중 하나입니다. (이것은 명시된 OP 운영 질문에 대한 답변입니다). 동적 대 정적, 암시 적 대 명시 적에 대한 많은 토론이 있습니다. 기타

C는 가장 유명한 약한 유형의 언어이며 변수 유형의 런타임 검사 또는 컴파일 시간 검사를 수행하지 않습니다. 본질적으로 당신은 전송할 수 있습니다 char *int *와 언어 상관하지 않을 것입니다. 왜 이러는거야?

C 프로그래밍은 어셈블리를 사용하는 방식과 매우 유사하므로 주소 만 신경 쓰는 경우가 있습니다. void *바로 이런 이유로 참조를 전송 하거나 전달하는 것은 드문 일이 아닙니다 . 메모리가 어떻게 구성되어 있는지 알고 있다면 (C 및 어셈블리 문제), void *필요한 정보를 얻기 위해 주소를 기반으로 멋진 계산을 수행 할 수 있습니다 . 이를 통해 예를 들어 Java에서 수행해야 할 프로세스를 단락시킬 수 있습니다.

런타임 유형 검사에는 엄청난 오버 헤드가 없지만 중요한 섹션이 너무 느려질만큼 충분한 경우가 있습니다. 나는이 경우 임베디드 프로그래밍과 실시간 시스템에 대해 주로 생각하고 있습니다.

즉, 대부분의 경우 컴파일 시간을 확인하거나 런타임을 확인하는 강력한 유형의 시스템이 있으면 아파하는 것보다 더 자주 도움이됩니다.


2
강력한 형식의 언어가 C만큼 효율적으로 컴파일 할 수없는 이유는 알 수 없습니다. 그러나 컴파일러는 훨씬 더 복잡해야합니다.
9000

2
C ++은 그러한 언어 중 하나의 예입니다. C ++에서 모든 유형 검사는 컴파일 타임에 수행되고 런타임에는 수행되지 않습니다 ... RTTI를 활성화하지 않은 경우.
Berin Loritsch

2
확실하지 나는이 성능 인수에 동의하지만, 그것은 이다 흥미로운 볼 수 있습니다.
Martin Ba

2

예를 들어 엑셀, 자바 스크립트 및 vbscript 등의 초보자는 약한 타이핑이 이해하기 쉽습니다. 또한 잠재적 인 오류에 대해 일부 개발 속도를 교환합니다.

주제에 대한 좋은 기사 : 강력한 타이핑 vs 강력한 테스트


1
나는 약한 유형의 언어와 초보자에게 친숙한 언어 사이에 강한 통신 관계가 있다고 생각하지 않습니다. 루비와 파이썬은 강력하게 타이핑되며 일반적으로 초보자에게 친숙한 것으로 간주됩니다. C는 약한 유형이며 일반적으로 초보자 적대감으로 간주됩니다.
sepp2k

아니요, 일반적으로 사용되는 언어가 아니라 타이핑에 대해서만 이야기했습니다
Homde

2
역동적이고 강력하게 타이핑 된 초보자 친화적 인 조합입니다. 사람들이 정적으로 유형이 지정된 언어에서 동적으로 유형이 지정된 언어로 이동할 때 실제로 혼란스러워한다는 것을 알았습니다. 학교에서 C 또는 Java를 가장 많이 가르치는 이래로 동적 유형을 시작한 사람을 본 적이 없습니다.
jsternberg

3
@Mchl : 정적 / 동적 또는 강 / 약한 타이핑과는 아무런 관련이 없습니다. 유형을 선언해야하는 것은 명시 적 / 암시 적 타이핑에 관한 것입니다.
Jörg W Mittag

1
아마;) 일 수도 있습니다. 그래서 나는 명시 적으로 암시 적으로 입력 된 언어로도 옮겼습니다. 내가 틀렸다면 파스칼이 정적으로 강력하고 명시 적으로 입력되는 반면 PHP는 동적으로 약하고 암시 적으로 입력되지 않습니까?
Mchl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.