유형 시스템 분류 (강 / 약, 동적 / 정적)


23

간단히 말해서 : 유형 체계는 학문적 맥락에서 어떻게 분류 되는가; 특히, 다른 종류의 시스템 유형을 구별 할 수있는 평판 좋은 출처를 어디에서 찾을 수 있습니까?

어떤 의미 에서이 질문의 어려움은 대답을 찾을 수 없다는 것이 아니라 너무 많이 찾을 수 있다는 것입니다. 배경은 Haskell 위키에서 타이핑 에 관한 기사를 개선하려고 노력하고 있으며 현재 다음과 같은 차이점을 주장합니다.

  • 타이핑 없음 : 언어에 유형 개념이 없거나 타이핑 된 관점에서 : 언어에는 정확히 하나의 유형이 있습니다. 어셈블리 언어에는 '비트 패턴'유형 만 있고, Rexx 및 Tk에는 '텍스트'유형 만 있으며, 핵심 MatLab에는 '복합 값 매트릭스'유형 만 있습니다.
  • 약한 타이핑 : 구별 유형이 거의 없으며 여러 유형에 대한 유형 동의어가있을 수 있습니다. 예를 들어 C는 부울, 정수, 문자, 비트 세트 및 열거에 정수를 사용합니다.
  • 강력한 타이핑 : Ada, Wirthian language (Pascal, Modula-2), Eiffel과 같은 세밀한 유형의 세트

이것은 내 개인적인 인식과는 완전히 반대되는 것으로서

  • 약한 입력 : 객체에는 유형이 있지만 상황에 따라 암시 적으로 다른 유형으로 변환됩니다. 예를 들어, Perl, PHP 및 JavaScript는 가능한 모든 "1"컨텍스트에서 사용할 수있는 모든 언어입니다 1.
  • 강력한 타이핑 : 객체에는 유형이 있으며 오버로드를 사용하여 시뮬레이션 할 수는 있지만 암시 적 변환이 없으므로 잘못된 컨텍스트에서 객체를 사용하면 오류가 발생합니다. 파이썬에서 문자열이나 float로 배열을 인덱싱하면 TypeError 예외가 발생합니다. Haskell에서는 컴파일 타임에 실패합니다.

나는 현장보다 경험이 많은 다른 사람들에게 이것에 대한 의견을 물었고, 한 사람이 다음과 같은 특성을 부여했다.

  • 약한 입력 : 데이터에 대해 잘못된 작업을 수행하는 것은 제어 또는 거부되지 않고 단지 유효하지 않은 / 임의의 결과 만 생성합니다.
  • 강력한 타이핑 : 데이터에 대한 작업은 데이터가 작업과 호환되는 경우에만 허용됩니다.

내가 이해하는 것처럼, 첫 번째와 마지막 특성화는 C를 약한 유형이라고하고 두 번째 특성은 강력하게 유형이라고합니다. 첫 번째와 두 번째는 Perl과 PHP를 약한 유형으로, 세 번째는 강력하게 유형이라고합니다. 세 가지 모두 파이썬을 강력한 유형으로 묘사합니다.

나는 대부분의 사람들이 나에게 "글쎄, 합의가없고, 용어의 수용된 의미가 없다"고 말할 것이라고 생각한다. 그 사람들이 잘못 경우에, 나는 그것에 대해 듣고 드리겠습니다,하지만 그들은 잘 경우, 그럼 어떻게 합니까 CS 연구자들은 설명하고 형 시스템을 비교? 덜 문제가되는 용어를 사용할 수 있습니까?

관련 질문으로, 동적 / 정적 구별이 종종 "컴파일 시간"과 "런타임"이라는 관점에서 주어 졌다고 생각합니다. 언어 컴파일 여부가 그 언어의 속성이 아니기 때문에 불만족 스럽습니다. 구현으로. 동적 타이핑과 정적 타이핑에 대한 순수한 의미 론적 설명이 있어야한다고 생각합니다. "정적 언어는 모든 하위 표현식을 입력 할 수있는 언어"입니다. 나는이 개념을 명확하게하는 어떤 생각, 특히 참고 문헌에 감사한다.


6
나는 당신이 이미 당신의 대답을 가지고 있다고 생각합니다 : 약하고 강한 타이핑에 대한 허용되는 정의가 없습니다.
svick 2016 년

나는 그것을 믿기 어려울 것이지만, 내가 들어 본 적이없는 것이 있기를 희망하면서 질문을 던진다. .
벤 밀우드

3
이에 대한 자세한 내용은 SO 관련 질문을 참조하십시오 .
svick 2016 년

1
svick의 요점을 강화하기 위해 허용되지 않는 것에 대한 권한 참조를 찾을 수 없습니다. 권위가 있다고 주장하는 것은 단순히 틀릴 것입니다 (여러 개의 반대 사례가 제공 될 수 있기 때문에).
edA-qa mort-ora-y

글쎄, "모든 사람이 동의하는 하나의 진정한 정의가 있습니다"라는 논문을 작성하는 사람과 "이 논문에 사용할 정의가 있습니다."라는 논문을 작성하는 사람 사이에는 차이가 있습니다 다른 사람 ". 후자조차도 내가 지금까지 알고있는 것보다 낫습니다. 나는이 경우, 무엇을, 우측하지만 당신이 될 수있다 생각 합니까 사람들이 타입 시스템의 다른 종류에 대해 말을? 동적 / 정적 구분이 적어도 구체적입니까?
벤 밀우드

답변:


18

역사적으로, "강력한 유형의 프로그래밍 언어"라는 용어는 70 년대에 널리 사용되는 기존의 프로그래밍 언어에 반응하여 사용되었으며, 대부분 유형이 구멍이있었습니다. 몇 가지 예 :

  • Fortran에는 "COMMON"스토리지 영역이 있는데, 이는 모듈간에 공유 될 수 있지만 각 모듈이 동일한 유형의 COMMON 스토리지의 컨텐츠를 선언하고 있는지 확인하지는 않았습니다. 따라서 한 모듈은 특정 COMMON 스토리지 블록에 정수가 있고 다른 부동 소수점 수가 있다고 선언하면 결과적으로 데이터가 손상됩니다. Fortran은 또한 "EQUIVALENCE"문을 가지고있어 동일한 스토리지가 다른 유형의 두 개의 다른 오브젝트를 포함하도록 선언 될 수 있습니다.

  • Algol 60에서, 절차 매개 변수의 유형은 절차 매개 변수의 유형을 지정하지 않고 단지 "절차"로 선언되었습니다. 따라서 프로 시저 매개 변수가 정수 허용 프로 시저 인 것으로 가정 할 수 있지만 실제 승인 프로 시저를 인수로 전달하십시오. 이로 인해 COMMON 및 EQUIVALENCE 문과 같은 종류의 손상이 발생합니다. 그러나 Algol 60은 이전 문제를 해결했습니다.

  • 파스칼에서 "변형 기록"이 추가되었는데, 이는 이전 EQUIVALENCE 문과 거의 동일합니다.

  • C에서는 "유형 캐스트"가 추가되어 모든 유형의 데이터를 다른 유형의 데이터로 재 해석 할 수 있습니다. 이것은 아마도 그들이하고있는 일을 알고있는 프로그래머를위한 다소 의도적 인 타입의 구멍이었습니다.

70 년대에 디자인 된 강력한 언어는 그러한 모든 유형의 구멍을 없애기위한 것입니다. 이것이 의미하는 것으로 드릴 다운하면 본질적으로 데이터 표현이 보호된다는 의미입니다. 한 유형의 데이터 객체를 내부 표현과 동일한 비트 패턴을 갖는 다른 유형의 객체로 볼 수 없습니다. 이론가들은 "강력한 타이핑"이라는 모호한 아이디어 대신이 표현의 특성을 나타 내기 위해 "표현 독립"이라는 용어를 사용하기 시작했습니다.

완전한 런타임 유형 검사를 수행하는 Lisp와 같은 동적 유형 언어는 표현을 보호한다는 의미에서 "강력한 유형"입니다. 동시에 정적으로 형식이 지정된 언어는 배열 범위 검사를 수행하지 않으면 표현 독립성을 잃게됩니다. 따라서이 용어는 엄격한 의미에서 "강력한 유형"이 아닙니다. 이러한 변칙적 인 결과로 인해 "강력한 유형"이라는 용어는 70 년대 이후 사용되지 않게되었습니다. 미 국방부가 Ada 디자인에 대한 엄격한 요구 사항을 개발할 때 언어를 "강력하게 입력"해야한다는 요구 사항도 포함되었습니다. (당시에는 "강력한 유형의"아이디어는 자명 한 것으로 여겨졌으며 정의는 제공되지 않았습니다. ) 응답으로 제출 된 모든 언어 제안은 "강력한 유형"이라고 주장했습니다. Dijkstra는 모든 언어 제안을 분석했을 때 그 중 어느 것도 강하게 타이핑되지 않았으며 실제로 그 용어의 의미가 명확하지 않다는 것을 발견했습니다. 보고서를 참조하십시오EWD663 . 그러나, 나는이 용어가 체크 무늬가 된 역사를 모르는 젊은 세대의 연구자들을 통해 이제 다시 사용되고 있다는 것을 알았습니다.

"정적 유형"이라는 용어는 모든 유형 검사가 정적으로 수행되며 런타임시 유형 오류가 발생하지 않음을 의미합니다. 언어도 강력하게 입력하면 실행 중에 실제로 유형 오류가 없음 을 의미합니다 . 반면에 유형 시스템에 유형 구멍이있는 경우 런타임 유형 오류가 없으면 아무 의미가 없습니다. 결과가 완전히 손상되었을 수 있습니다.

"강한 입력 대 약한 입력"에 대한 새로운 논쟁은 특정 유형 변환이 허용되어야하는지에 관한 것 같습니다. 이 사람들에 따라 정수가 필요한 문자열을 허용하는 것은 "약한 타이핑"입니다. 문자열이 정수를 나타내지 않으면 문자열을 정수로 변환하려는 시도가 실패 할 수 있기 때문에 어떤 의미가 있습니다. 그러나 정수를 문자열로 변환해도 문제가 없습니다. 이 사람들에 따르면 "약한 타이핑"의 사례일까요? 나도 몰라 "약한 타이핑"에 대한 Wikipedia 토론에서 참조 된 출판물을 인용하지는 않습니다. 나는 그것이 일관된 아이디어라고 믿지 않는다.

참고 사항 : 기본 사항은 "강력한 타이핑"이라는 용어가 엄격한 정의를 가진 기술적 용어로 사용되지 않았다는 것입니다. "우리의 타입 시스템은 강력하다; 모든 타입 에러를 잡아 내고 타입 홀이 없다"는 언어 설계자들이 느끼는 것과 비슷했다. . 좋은 소리로 사람들이 그것을 사용하기 시작한 버즈 단어였습니다. Cardelli-Wegner 논문은 그것이 어떤 의미인지에 대한 분석이 제공된 곳에서 처음 본 것입니다. 여기 내 게시물은 그들의 입장을 정교하게 생각해야합니다.


역사적 발전에 대한 참고 자료를 줄 수 있습니까? "런타임 타입 오류가 없다는 것은 아무 의미가 없습니다"-여기서 컴파일 타임을 의미합니까?
Raphael

다음은 Google Scholar에 게재 된 유클리드 관련 논문입니다 . 나는 70 년대에 언어가 강력하게 입력되었다고 주장되는 여러 논문을 본 것을 기억합니다. 일반적으로 영업 피치라고 생각했습니다.
Uday Reddy

1
@ 라파엘. "런타임 유형 오류"를 의미했습니다. 런타임에 도달하려면 프로그램이 먼저 정적 유형 검사기를 통과해야합니다. 요점은 Java와 같은 강력한 형식의 언어는 컴파일 타임에 확인할 수없는 런타임에 형식 오류를 발생 시킨다는 것입니다. 유형 구멍 언어 (예 : C)를 사용하면 런타임에서 오류 대신 쓰레기를 생성 할 수 있습니다.
Uday Reddy

1
@benmachine. 내가 인용 한 유클리드 논문의 "유형 확인"섹션을 참조하십시오. 요점은 "강력하게 입력 된"이라는 단어가 유행어라는 것입니다. 기술적 인 개념이 아닙니다. 기껏해야 기술적 인 내용은 유형 구멍이 없음을 의미하는 것입니다.
Uday Reddy

1
두 개의 서로 다른 정수 타입은 동일한 표현이 전형적인 현대 구현 (예 모두 intlong32 비트 인, 또는 둘 모두 longlong long하나 개의 이러한 유형에 대한 포인터는 어떤 스토리지를 작성하고, 다른 타입의 포인터를 사용하기 위해 사용하는 (64) 인, 프로그램 일반적으로 C는 읽을 수있는 런타임 오류를 유발하지 않지만 임의의 다른 방식으로 임의로 오작동 할 수 있습니다. 이전에 교환으로 제공
supercat

7

Uday Reddy가 자신의 답변, 유형 이해, 데이터 추상화 및 다형성 (1985) 에서 찾은 논문 은 다음과 같은 답변을 제공합니다.

정적 프로그램 분석으로 모든 표현식의 유형을 판별 할 수있는 프로그래밍 언어를 정적으로 유형이라고합니다. 정적 타이핑은 유용한 속성이지만 컴파일 할 때 모든 변수와 표현식이 유형에 바인딩되어야하는 요구 사항이 너무 제한적인 경우가 있습니다. 형식 자체를 정적으로 알 수는 없지만 모든 식의 형식 일관성이 보장되어야한다는 약한 요구 사항으로 대체 될 수 있습니다. 이것은 일반적으로 런타임 유형 검사를 도입하여 수행 할 수 있습니다. 모든식이 일관성있는 언어를 강력한 형식의 언어라고합니다. 언어를 강력하게 형식화하면 컴파일러에서 허용하는 프로그램이 형식 오류없이 실행되도록 보장 할 수 있습니다. 일반적으로 강력한 타이핑을 위해 노력하고 가능할 때마다 정적 타이핑을 채택해야합니다.


이것을 찾은 것에 대한 크레딧을받을 자격이 없기 때문에 커뮤니티 위키로 게시되었습니다.
벤 밀우드

내가 가진 문제는 svick의 첫 번째 의견과 관련이 있습니다. 강력한 타이핑에 대한 정의를 찾았다는 것은 좋지만, 이것은 일반적으로 일반적으로 받아 들여지는 정의가 아닙니다.
edA-qa mort-ora-y

@ edA-qamort-ora-y : 당신은 어떤 근거로 그렇게 말합니까? 일반적으로 받아 들여지는 것과 그렇지 않은 것에 대한 일화적인 증거보다 더 좋은 것이 있습니까? 어떤 인용? (나는 당신이 그렇지 않더라도 유효한 포인트를 가질 수 있다고 생각하지만, 위의 질문에 여전히 위의 대답에 동의한다고 생각합니다. 합의가 없다면 적어도 하나의 심각한 학문적 대답을 아는 것이 좋습니다).
벤 밀우드

1
나는 합의 된 정의가 없다는 것을 실제로 증명할 수 없다? 논리적으로는 불가능합니다. 그러나 강력한 타이핑에 관한 Wikipedia 기사는 의견 불일치와 모순에 대한 많은 증거와 참고 자료를 제공합니다. en.wikipedia.org/wiki/Strong_typing
edA-qa mort-ora-y

@ edA-qamort-ora-y : Wikipedia의 인용은 실제로 그다지 도움이되지 않습니다. 일부는 학문적이지 않으며, 다른 것은 용어를 정의하는 것 이외의 이유로 인용됩니다. Typeful Programming 논문은 유망한 것처럼 보이지만 통과에 대한 정의는 매우 간단합니다. 어쨌든 내 대답을 편집 할 가치가 있습니다. 부재 증명과 관련하여, 나는 그들이 말하는 것에 대해 알고있는 사람들 사이에서 논쟁 / 불일치의 증거로 충분하다고 생각합니다 (실제로 Typeful Programming 논문은 나에게 줄 수 있습니다).
벤 밀우드

6

정식 답변은 Cardelli and Wegner의 조사 기사 : 유형 이해, 데이터 추상화 및 다형성에 있습니다.

"강력한 타이핑"은 허용되는 의미를 지니고 있지만 "약한 타이핑"은 그렇지 않습니다. 강한 타이핑 실패는 약한 것으로 간주 될 수 있으며 사람들은 어떤 종류의 실패가 허용되고 그렇지 않은지에 따라 다를 수 있습니다.



훌륭합니다. 제가 원했던 것입니다. 논문은 약간의 읽기가 필요하므로 두드러진 요점을 요약 한 답이 있어야한다고 생각합니다. 답변을 편집하거나 커뮤니티 위키 답변을 게시해야합니까? 어느 쪽이든, 나는 다른 사람이 입력을 가지고 있다면 며칠 더 줄 것입니다. 다음 남은 것을 수락하십시오 :)
Ben Millwood

@benmachine. 전체 논문은 읽을 가치가 있지만 높은 수준의 개념 문제는 첫 두 섹션에서만 다룹니다.
Uday Reddy 2016 년

4
여전히이 페이지에 요약되어야한다고 생각합니다. 링크는 나중에 만료 될 수 있습니다.
벤 밀우드

@benmachine. 질문에 대한 답변으로 요약을 게시 할 수 있습니다.
Uday Reddy 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.