programing

"untyped"는 학문적 CS 세계에서 "동적으로 typed"를 의미하기도 합니까?

codeshow 2023. 9. 19. 21:29
반응형

"untyped"는 학문적 CS 세계에서 "동적으로 typed"를 의미하기도 합니까?

저는 "자바스크립트가 입력되지 않았습니다"라는 슬라이드 덱을 읽고 있습니다.이것은 제가 진실이라고 생각했던 것과 모순되어, 더 많은 것을 배우고자 땅을 파기 시작했습니다.

자바스크립트에 대한 모든 답변은 입력되지 않은 언어입니까?자바스크립트는 타이핑되지 않은 이 아니며, 제가 익숙하고 행복한 정적, 동적, 강하고 약한 타이핑의 다양한 형태의 예를 제공한다고 말합니다.그래서 그렇게 할 방법이 없었습니다.

그래서 자바스크립트 제작자인 브렌단 아이히에게 물어보니 이렇게 말했습니다.

학문적 유형은 "정태적 유형이 아님"을 의미하는 "untyped"를 사용합니다.그들은 충분히 영리해서 값들이 유형을 가지고 있다는 것을 알 수 있습니다 (duh!).문맥이 중요합니다.

학문에 중점을 둔 컴퓨터 과학자들은 "비타자"를 "동적 타자"의 동의어로 사용합니까(그리고 이것이 유효합니까?) 아니면 제가 놓치고 있는 더 깊은 무언가가 있습니까?맥락이 중요하다는 브렌던의 의견에 동의하지만, 현재 제 책들이 이 주제에 대해 잘 다루고 있지 않기 때문에 설명을 인용하는 것도 좋을 것 같습니다.

이해력을 높일 수 있도록, 위키피디아에서도 (어쨌든 제가 찾을 수 있는) 이 대체 사용법을 언급하지 않기 때문에 이를 확정하고 싶습니다.제가 틀리면 앞으로 용어를 사용하거나 사용에 의문을 제기하고 싶지 않아요 :-)

(저는 또한 최고의 스몰토크러가 스몰토크도 "타자가 없다"고 말하는 것을 본 적이 있습니다. 그래서 이 퀘스트를 시작하게 된 것입니다! :-)

네, 이것이 학술 문헌의 표준 관행입니다.그것을 이해하려면, "유형"의 개념이 1930년대에 람다 미적분학의 맥락에서 발명되었다는 것을 아는 것이 도움이 됩니다. (실제로, 심지어 더 일찍, 집합론의 맥락에서).그 이후로, "유형론"으로 알려진 계산 논리학의 전체 분야가 등장했습니다.프로그래밍 언어 이론은 이러한 기초를 바탕으로 합니다.그리고 이 모든 수학적 맥락에서 "유형"은 특정하고 잘 정립된 의미를 가지고 있습니다.

"동적 타자"라는 용어는 훨씬 나중에 발명되었습니다. 그리고 그것은 "타자"라는 단어의 수학적인 일반적인 사용에 직면했을 때 용어들에 있어서 모순입니다.

예를 들어, Benjamin Pierce가 표준 교재 Types and Programming Languages에서 사용하는 "type system"의 정의는 다음과 같습니다.

유형 시스템은 특정 프로그램 동작의 부재를 증명하기 위해 구문을 계산된 값의 종류에 따라 분류하는 다루기 쉬운 구문 방법입니다.

그는 다음과 같이 말합니다.

"정적"이라는 단어는 때때로 명시적으로 추가되는데, 예를 들어, 우리는 여기서 고려하고 있는 컴파일 시간 분석의 종류를 스킴(Susman and Steel, 1975; Kelsey, Clinger and Rees, 1998; Dybvig, 1996)과 같은 언어에서 볼 수 있는 동적 또는 잠재적 유형과 구별하기 위해 여기서 고려하고 있는 "정적 유형의 프로그래밍 언어"를 말합니다.여기서 런타임 유형 태그는 힙에서 서로 다른 종류의 구조를 구별하는 데 사용됩니다."다이나믹 타이핑"과 같은 용어들은 틀림없이 잘못된 이름이고 아마도 "다이나믹 체크"로 대체되어야 하지만, 그 사용법은 표준입니다.

현장에서 일하는 대부분의 사람들은 이 관점을 공유하고 있는 것 같습니다.

이것은 "비입력"과 "동적으로 입력"이 동의어라는 것을 의미하지는 않습니다.오히려 후자는 전자의 특정한 경우에 대한 (기술적으로 오해를 불러일으키는) 이름입니다.

추신: 그리고 FWIW, 저는 우연히 활자 시스템의 학술 연구자이자 자바스크립트의 비학술적 구현자입니다. 그래서 저는 분열을 감수해야 합니다.:)

저는 프로그래밍 언어를 전문으로 하는 컴퓨터 과학자이고, 네, '비타이핑'이라는 단어는 이런 식으로 자주 사용됩니다.Forth나 Assembly 코드와 같이 동적 형식 태그를 붙이지 않는 언어와 함께 사용할 수 있도록 이 단어를 예약하는 것이 좋겠지만, 이 언어들은 거의 사용되지 않고 심지어 더 드물게 연구되며, "동적 형식"보다 "비 형식"이라고 말하는 것이 훨씬 쉽습니다.

밥 하퍼는 스킴, 자바스크립트 등과 같은 언어들은 단지 하나의 유형, 즉 값만을 가진 타자 언어로 간주되어야 한다고 말하는 것을 좋아합니다.한 가지 유형의 형식주의만으로 일관된 세계관을 구성할 수 있기 때문에 이러한 견해에 기대어 봅니다.

추신: 순수 람다 미적분학에서 유일한 "값"은 정규 형태의 항이고, 정규 형태의 유일한 닫힌 항은 함수입니다.그러나 람다 미적분학을 사용하는 대부분의 과학자들은 기본 유형과 상수를 추가한 다음 람다에 대한 정적 유형 시스템을 포함하거나 동적 유형 태그로 바로 돌아갑니다.

추신: 프로그래밍 언어, 특히 유형 시스템에 관한 한 위키피디아의 정보는 질이 좋지 않습니다.믿지 마.

조사해보니, 질문에 대한 답은 단순히 '그렇다'는 것입니다. 학술 CS 유형, 또는 적어도 일부는 '동적으로 입력했다'는 의미로 '비입력했다'를 사용합니다.예를 들어 프로그래밍 언어: 원칙실행, 제3판(Kenneth C).로든과 케네스 A.Lambert, 2012)는 이렇게 말합니다.

정적 유형 시스템이 없는 언어를 일반적으로 비유형 언어(또는 동적 유형 언어)라고 합니다.이러한 언어에는 스킴(Scheme) 및 기타 리스프 방언, 스몰토크(Smalltalk), 펄(Perl), 파이썬(Python), 루비(Ruby) 등 대부분의 스크립트 언어가 포함됩니다.하지만, 비정형 언어를 사용한다고 해서 반드시 프로그램에서 데이터가 손상되는 것은 아닙니다. 이는 모든 안전 점검이 실행 시에 수행된다는 것을 의미합니다. […]

[link] (참고: 원본에서 굵은 글씨로 표시) 그리고 계속해서 이런 식으로 "Untyped"를 사용합니다.

나는 이것이 놀랍다고 생각합니다(프리스케와 아담 미할신이 주는 것과 거의 같은 이유로). 하지만 당신은 여기에 있습니다. :-)


추가하도록 편집:플러그를 꽂으면 더 많은 예를 찾을 수 있습니다."untyped languages"Google 책 검색 로 이동합니다.예를 들어,

[…] 이것이 주요 정보 숨기기 메커니즘으로, 많은 유형화되지 않은 언어가 있습니다.를 들어 PLT [4어 PLT 방식 [4]합니다를 합니다.structs, […]

— Jacob Matthews and Amal Ahmed, 2008 [link]

[…], 우리는 유형화되지 않은 기능 언어 […]에 대한 바인딩 시간 분석을 제시합니다.[…] 이는 스킴의 부작용 없는 방언을 위해 부분 평가자에 구현되어 사용되고 있습니다.그러나 이 분석은 Haskell과 같은 엄격하지 않은 유형의 함수형 언어에도 유효할 만큼 충분히 일반적입니다. […]

— 찰스 콘셀, 1990 [link]

참고로, 이 검색 결과들을 살펴본 후에 제 인상은 만약 연구자가 "유형화되지 않은" 함수 언어를 쓴다면, 아담 미할신이 언급한 유형화되지 않은 람다 미적분학과 같은 의미에서 그 언어를 "유형화되지 않은" 것으로 간주할 가능성이 매우 높다는 것입니다.적어도 여러 연구자들은 스킴과 람다 미적분학을 같은 호흡으로 언급합니다.

물론 이 검색은 이러한 식별을 거부하는 연구자들이 있는지 여부를 말해주지 않으며, 이러한 언어들을 "타자되지 않은" 언어로 간주하지 않습니다.제가 이걸 찾았어요

동적으로 입력되는 언어는 입력되지 않은 언어가 아니기 때문에 순환성이 실제로 없다는 것을 깨달았습니다. 단지 프로그램 텍스트에서 유형이 즉시 명확하지 않을 뿐입니다.

— 누군가 (누군지 분간할 수 없음), 1998 [link]

하지만 분명히 이 신원확인을 거부하는 대부분의 사람들은 명시적으로 그렇게 말할 필요를 느끼지 않을 것입니다.

입력하지 않은 것과 동적으로 입력한 것은 동의어가 아닙니다."비타자"로 가장 자주 불리는 언어는 람다 미적분학인데, 이 언어는 사실상 통일된 언어입니다 - 모든 것은 함수이기 때문에 우리는 모든 것의 종류가 함수라는 것을 정적으로 증명할 수 있습니다.동적으로 입력된 언어에는 여러 유형이 있지만 컴파일러가 이 유형을 정적으로 검사할 수 있는 방법이 추가되지 않으므로 컴파일러가 변수 유형에 런타임 검사를 삽입해야 합니다.

변수 입니다: 합니다와 할 수 .x 어떤 이 중단 수학 하는 것)이 될 수 자,수,열,것것)다를 할 수 .x 시 다를 .x는 함수입니다.

값이나 변수에 대해 이야기하는지에 따라 두 문장 모두 정확합니다.JavaScript 변수는 입력되지 않고, JavaScript 값은 입력된 형식을 가지며, 변수는 런타임 시 모든 값 유형에 걸쳐 있을 수 있습니다(즉, '동적으로').

자바스크립트와 다른 많은 언어에서 변수가 아닌 값이 유형을 전달합니다.모든 변수는 모든 유형의 값에 걸쳐 범위를 지정할 수 있으며 "동적 유형" 또는 "유형을 지정하지 않은" 변수와 유형을 지정할 수 있는 변수를 유형 검사하는 관점에서 논리적으로 동일하고 실질적으로 동일합니다.유형 이론가들이 언어와 유형에 대해 이야기할 때, 그들은 대개 이것, 즉 유형을 전달하는 변수에 대해 이야기합니다. 왜냐하면 그들은 프로그램 텍스트(즉, 변수)에서 작동하고 메모리의 실행 프로그램(즉, 값)에서 작동하지 않는 유형 체커와 컴파일러 등을 쓰는 것에 관심이 있기 때문입니다.

반면 C와 같은 다른 언어에서는 변수가 유형을 전달하지만 값은 그렇지 않습니다.자바와 같은 언어에서 변수와 값은 모두 유형을 갖습니다.C++에서 일부 값(가상 기능이 있는 값)은 유형을 운반하고 다른 값은 그렇지 않습니다.일부 언어에서는 값이 유형을 변경하는 것도 가능하지만, 이는 일반적으로 나쁜 설계로 간주됩니다.

유형에 대해 글을 쓰는 대부분의 CS 연구자들은 기본적으로 구문론적으로 파생 가능한 유형을 가진 언어만을 유형 언어로 간주하지만, 동적/잠재적 유형의 언어를 사용하는 우리들 중에는 그 사용법에 불쾌감을 느끼는 사람들이 훨씬 더 많습니다.

언어의 종류는 다음과 같이 3가지가 있다고 생각합니다.

입력되지 않음 - 연산자만이 값의 해석을 결정하며 일반적으로 모든 항목에서 작동합니다.예:어셈블러, BCPL

정적 유형 - 식/변수에 관련된 유형이 있으며, 해당 유형은 컴파일 시 연산자의 해석/유효성을 결정합니다.예: C, Java, C++, ML, Haskell

동적 유형 - 값에 관련된 유형이 있으며, 해당 유형은 런타임에 연산자의 해석/유효성을 결정합니다.예: LISP, Scheme, Smalltalk, Ruby, Python, Javascript

내가 아는 한, 모든 동적 유형 언어는 유형 안전합니다. 즉, 유효한 연산자만이 값에 대해 연산할 수 있습니다.그러나 정적 유형 언어의 경우에는 그렇지 않습니다.사용하는 형식 시스템의 전력에 따라 일부 작업자는 런타임에만 점검하거나 아예 점검하지 않을 수 있습니다.예를 들어, 대부분의 정적 유형 언어는 정수 오버플로를 제대로 처리하지 않으며(양의 정수를 2개 더하면 음의 정수가 생성될 수 있음), 아웃바운드 배열 참조는 전혀 확인되지 않거나(C, C++) 런타임에만 확인됩니다.또한 일부 유형 시스템은 매우 약하기 때문에 컴파일 시간 형식의 식을 변경하려면 유용한 프로그래밍이 탈출 해치(C 및 패밀리의 캐스트)를 필요로 합니다.

이 모든 것은 C++가 Python보다 안전하다는 터무니없는 주장으로 이어지는데, 반면 진실은 Python이 본질적으로 안전하고 C++로 다리를 쏠 수 있다는 것입니다.

이 질문은 모두 의미론에 관한 것입니다.

이 데이터를 제공하면 다음과 같습니다.12어떤 타입입니까?당신은 확실히 알 방법이 없습니다.정수일 수 있습니다. 플로트일 수 있습니다. 문자열일 수 있습니다.그런 의미에서 그것은 매우 "타자 없는" 데이터입니다.

에서 "및과 할 수 (내 가상 "", "", "", "" 하면 "" 합니다 와" () ).add(12, a)이 껑충 껑충 껑충 껑충 껑충 뛰다10912여기에 아스키 값을 더하면 됩니다.a).

C랑 잠깐 얘기해요.C를 사용하면 임의의 데이터로 원하는 모든 작업을 수행할 수 있습니다.,uint- 모든 할 수 , s - - uint "입니다. s 그런 의미에서 C는 (그런 식으로 다룬다면) "비타자"입니다.

12 " - "12유형이 있습니다. 최소한 숫자는 알고 있습니다.문맥에 따라 언어에 관계없이 모든 것은 유형을 갖습니다.

이것이 제가 처음에 말했던 이유입니다 - 당신의 질문은 의미론의 하나입니다."Untyped"의 의미는 무엇입니까?브렌던이 "정적인 타입은 없다"고 말한 것은 정곡을 찌른 것 같습니다. 왜냐하면 그것이 의미할 수 있는 전부이기 때문입니다.인간은 자연스럽게 사물을 유형별로 분류합니다.우리는 직관적으로 자동차와 원숭이 사이에 근본적으로 다른 무언가가 있다는 것을 알고 있습니다. 그것을 구별하는 법을 배운 적이 없습니다.

처음부터 예를 들어보자면, "유형에 신경 쓰지 않는" 언어(그 자체)를 사용하면 구문 오류 없이 "나이"와 "이름"을 "추가"할 수 있습니다.그렇다고 논리적으로 건전한 수술은 아닙니다

자바스크립트는 "오류"를 고려하지 않고 모든 종류의 미친 짓들을 할 수 있게 해줍니다.그것은 당신이 하고 있는 일이 논리적으로 건전하다는 것을 의미하지는 않습니다.그것은 개발자가 해결할 일입니다.

컴파일/빌드/해석 시간에 형식 안전을 강제하지 않는 시스템/언어가 "비입력"입니까? 아니면 "동적으로 입력"입니까?

의미론.

편집

몇몇 사람들이 "예"에 빠져있는 것 같아 여기에 무언가를 추가하고 싶었지만, 자바스크립트에는 "타입"이 있습니다.

나는 다른 사람의 대답에 대해 이렇게 말했습니다.

자바스크립트에서 나는 내가 "원숭이"가 되도록 만든 객체와 "인간"이 되도록 만든 객체를 가질 수 있으며, 어떤 기능들은 "인간"에서만 작동하도록 설계될 수 있고, 다른 기능들은 "원숭이"에서만 작동하도록 설계될 수 있으며, 다른 기능들은 "팔을 가진 것들"에서만 작동하도록 설계될 수 있었습니다.언어가 "팔을 가진 것들"과 같은 객체의 범주가 있다는 것을 들은 적이 있는지 여부는 자바스크립트("동적")와 마찬가지로 어셈블리("Untyped")와도 무관합니다.이것은 모두 논리적 무결성의 문제입니다. 유일한 오류는 이 방법으로 팔이 없는 것을 사용하는 것입니다.

따라서 자바스크립트가 내부적으로 "유형 개념"을 가지고 있고, 따라서 "동적 유형"을 가지고 있다고 생각하고, 이것이 다소 "유형화되지 않은 시스템과 분명히 다르다"고 생각한다면, 위의 예를 통해 내부적으로 가지고 있는 "유형 개념"은 실제로 무관하다는 것을 알아야 합니다.

로하려면 예를 들어 , C# 로합니다라는 ICreatureWithArms혹은 비슷한 것.자바스크립트에서는 그렇지 않습니다. C나 ASM에서는 그렇지 않습니다.

분명히, 자바스크립트가 "유형"에 대한 이해를 가지고 있는지 없는지 여부는 무관합니다.

저는 컴퓨터 과학자는 아니지만, CS 커뮤니티에서 (적어도 과학 출판물에서는) "비입력"이 실제로 "동적으로 입력된"의 동의어로 사용된다면 오히려 놀랄 것입니다. 이 두 용어는 서로 다른 개념을 설명합니다.동적으로 입력되는 언어는 유형의 개념을 가지고 있으며 런타임 시 유형 제약을 적용합니다(예를 들어 오류 없이 정수를 문자열로 나눌 수 없음). 반면, 입력되지 않는 언어에는 유형의 개념이 전혀 없습니다(예: 어셈블러).심지어 프로그래밍 언어에 관한 위키피디아 기사(http://en.m.wikipedia.org/wiki/Programming_language#Typed_versus_untyped_languages) 도 이러한 구별을 만듭니다.

업데이트 : 자바스크립트에서 "변수가 입력되지 않음" 정도로 일부 텍스트가 말하는 것에서 혼란이 오는 것일 수도 있습니다(사실입니다).그러나 그것이 자동적으로 언어가 입력되지 않았다는 것을 의미하는 것은 아닙니다(거짓일 수 있습니다).

Brendan의 의견에 동의합니다. 문맥이 전부입니다.

나의 의견:

2004년경에 루비가 타이핑되지 않았는지 동적 타이핑을 했는지에 대해 논쟁이 일어났기 때문에 혼란스러웠던 것으로 기억합니다.올드스쿨 C/C++ 사람들(나도 한 명)은 컴파일러에 대해 생각하면서 루비가 타이핑되지 않았다고 말하고 있었습니다.

C에는 런타임 유형이 없고 주소만 있으며 실행 중인 코드가 해당 주소에 있는 것을 아닌 것으로 처리하기로 결정하면 헉.그것은 분명히 타이핑되지 않았고 동적 타이핑과는 매우 다릅니다.

그 세계에서 타이핑은 컴파일러의 전부입니다.C++는 컴파일러의 검사가 더 엄격했기 때문에 "강력한 타이핑"을 했습니다.자바와 C는 좀 더 "약한 타자"로 되어 있었습니다(자바가 강한 타자인지 약한 타자인지에 대한 논쟁도 있었습니다).동적 언어는 컴파일러 유형 검사가 없었기 때문에 연속체에서 "입력되지 않았습니다.

오늘날, 우리는 동적 언어에 너무 익숙해져 있기 때문에, 컴파일러나 인터프리터 타입 검사가 없다는 것을 의미하는 입력되지 않은 것이 분명하다고 생각합니다. 이것은 디버깅하기 엄청나게 어려울 것입니다.그러나 CS의 보다 이론적인 세계에서는 그것이 명확하지 않은 기간이 있었습니다.

의미 있는 알고리즘을 작성하기 위해 값을 조작하려는 의도가 있어야 하기 때문에 어떤 깊은 의미에서 어떤 것도 입력하지 않을 수 없습니다.이것은 특정 언어에 대해 컴파일러 또는 인터프리터가 구현되는 방식에 대한 세부 사항을 다루지 않는 이론적 CS의 세계입니다.따라서 "미입력"은 그러한 맥락에서 전혀 의미가 없습니다.

언급URL : https://stackoverflow.com/questions/9154388/does-untyped-also-mean-dynamically-typed-in-the-academic-cs-world

반응형