2010-07-31 2 views
15

저는 PHP를 아주 좋아합니다. 분명히 매우 약한 타입의 언어입니다. 이점 중 일부는 변수 유형을 변경하는 일반적인 독립을 포함한다는 것을 알게되었습니다.약형 언어의 장점 (및 단점)은 무엇입니까?

제가 궁금해하는 점은 단점입니다. C처럼 강력하게 형식화 된 언어에서 빠져 나와 PHP와 같은 약한 유형의 언어에서 얻을 수없는 것은 무엇입니까? 또한 유형 설정 (double ($ variable)과 같이)을 사용하면 약한 형식의 언어조차도 강력한 형식의 언어처럼 작동 할 수 있다고 주장 할 수 있습니다.

So. 약한 타입. 내가 포함시키지 않은 몇 가지 이점은 무엇입니까? 무엇보다 단점은 무엇입니까?

+3

"강력한"및 "약한"타이핑이란 무엇을 의미합니까? 정적 대 동적? 명시 적 대 암시 적 유형 이름? 명시 적 대 암시 적 캐스팅? 안전 대 안전하지 않은 캐스팅? – dan04

+3

C는 약하게 입력됩니다. –

+0

C는 어떻게 강하게 입력됩니까? – chimeracoder

답변

9

(가) 정적 입력의 장점을 인용 런타임에 도달 할 수 컴파일 타임에 잡힌 오류의 전체 클래스가 있다는 것입니다. 예를 들어 함수 매개 변수로 정적 유형의 클래스 또는 인터페이스가있는 경우 실수로 잘못된 유형의 객체를 전달하지 않을 것입니다 (명백하고 잘못된 캐스트가없는 경우).

물론 이것은 올바른 유형의 잘못된 객체를 전달하거나 올바른 기능을 부여했지만 잘못된 작업을 수행하는 인터페이스 구현을 중단시키지 않습니다. 또한, PHP/Python/etc 사용자가 컴파일 타임이나 런타임에 오류를 잡을지를 누가 신경 써야하는지 100 % 코드 커버리지가 있다면?

개인적으로, 정적 타이핑이있는 언어로 재미있는 시간을 보내고, 재미있는 시간은없는 언어로했습니다. 타이핑의 종류와 다른 두 언어 중 하나를 선택하지 않아도되고, 일반적으로 더 중요한 것들이 걱정할 필요가 없기 때문에 결정적인 문제는 거의 없습니다. 필자는 정적으로 형식화 된 언어를 사용할 때 의도적으로 "컴파일러에 기대기"라는 식의 코드를 작성하여 잘못된 방식으로 컴파일하지 않을 것입니다. 예를 들어 한 곳에서 변경을 수행 한 다음 수행 된 모든 컴파일 오류를 수정하고 클린 컴파일 할 때까지 반복하여 수행 할 수있는 특정 리팩터가 있습니다. 전체 테스트 스위트를 여러 번 실행하여 동일한 작업을 수행하는 것은별로 실용적이지 않을 수 있습니다.그러나 IDE가 다른 언어로 동일한 리팩터를 자동화하거나 테스트를 신속하게 완료하는 것은 전례가 아니므로 가능한 것이 아닌 편리 성의 문제입니다.

편리함과 코딩 스타일을 넘어서서 합법적 인 관심사를 가진 사람들은 코드의 정확성에 대한 공식적인 증명을 위해 노력하는 사람들입니다. 정적 유형 공제는 명시 적 정적 유형 지정이하는 대부분의 작업 (전부는 아님)을 수행 할 수 있고 키보드의 상당한 마모를 줄일 수 있다는 사실을 모르고 있습니다. 그래서 정적 타이핑을 사용하면 사람들이 쉽게 증명할 수있는 방식으로 코드를 작성해야합니다. 다음 POV에서 뭔가있을 수 있습니다. 나는 "if"라고 말합니다 : 모릅니다. 어쨌든 대부분의 사람들이 정적으로 형식화 된 코드를 증명하는 것처럼 아닙니다.

는 즉석에서 변수 유형을 변경하는 등은

나는 반신 반의하는 가치의 생각합니다. 그것은 (파이썬/장고) 같은 것을 할 항상 유혹 :

user = request.GET['username'] 
# do something with the string variable, "user" 
user = get_object_or_404(User,user) 
# do something with the User object variable, "user" 

을하지만 실제로, 같은 이름은 함수 내에서 다른 일에 사용되어야 하는가? 아마도. 아마도 그렇지 않습니다. "재사용", 예를 들어, 정적으로 입력 된 언어로 된 다른 것들에 대한 정수 변수는 대폭 권장되지 않습니다. 욕망은,

가, BTW 일반적으로 약한 입력이 암시 적 형식 변환이 발생한다는 것을 의미 명확한 코드에 대한 열망을 무시해서는 안되는 시간의 아마 95 % ..., 간결하고, 설명 변수 이름의 생각해야하지 및 강한 입력하지 않는 것을 의미합니다. 이 정의에 따르면, C는 산술 타입에 관한 한 약하게 타입 지정되었으므로, 나는 그것이 당신이 의미하는 것이 아니라고 가정합니다. 나는 철저한 철저한 타이핑은 도움보다 성가신 것으로 간주되고, "완전한 약한 타이핑"(무엇이라도 다른 것으로 변환 될 수있는 것)은 대부분의 언어에서 무의미하다고 생각합니다. 따라서 코드를 파악하기가 너무 어려워지기 전에 얼마나 많은 수의 암시 적 변환을 허용 할 수 있는지에 대한 질문이 있습니다. C++에서 변환 연산자와 명시 적이 지 않은 one-arg 생성자를 구현할지 여부를 결정하는 데있어 계속되는 어려움을 참조하십시오.

+0

"약함"과 "강함"은 명확하게 연속체이지만, C 또는 'int '를'float'에 대입 할 수는 있지만, 그것들이 동일하게 정의 되더라도'struct a'를'struct b'에 할당 할 수는 없습니다. – caf

+0

@caf : 사실, 그리고 당신이 코멘트하고있는 그대로의 내용 :-) –

1

많은 종류의 책이 이런 종류의 것에 대해 쓰여졌습니다. 본질적인 절충안이 있습니다. 약식 언어를 사용하면 많은 고민 거리가 사라집니다. 예를 들어 파이썬에서는 floatint으로 나눌 필요가 없습니다. intlist에 추가; 타이핑 함수의 인수 (알고 계셨습니까? 을 추가하기위한 특별한 연산자가 있습니다. (+)intint으로 전송하기 때문에!); 변수가 null 일 수 있다는 것을 잊어 버리면 ... 그런 종류의 문제는 단순히 사라집니다.

그 자리에 새로운 런타임 버그가 있습니다 : Python의 [0]*5은 기다리십시오. [0,0,0,0,0]! OCaml은 강력한 타이핑의 모든 성가심 때문에 많은 컴파일러를 가지고 많은 버그를 잡습니다. 그리고 이것이 바로 그것이 좋은 이유입니다. 그것은 절충점입니다. 위키 피 디아에서 직선

+1

"런타임 버그"? 요소 별 매핑 대신 시퀀스 반복이 매우 합리적이고 일관되며 기대됩니다. 결국, "xyz"* 5'에서 무엇을 기대할 수 있겠습니까? –

+5

@ 존 : 문자에 대한 산술 연산이 당신의 언어로 유효한지 여부에 달렸습니다 (C에서는 불행히도). 요소 별 매핑은 연산자가 의미가있는 곳에서 상당히 합리적이고 일관성이 있습니다. 수학에서 우리는 [0,1,2] * 2가 [0,1,2]가 아니라 [0,1,2] 2,0,1,2], 그렇지 않나요? 매쓰 매 티카가 파이썬리스트 - 스칼라 곱셈과 같은 벡터 스칼라 곱셈을 정의했다면 악몽 일 것입니다. 나는 어느 쪽이 다른 쪽의 관례에 놀라는 것이 옳은 것 같지 않다고 생각한다.'*'가 당신의 언어로 무엇을 의미 하는지를 단지 배워야 만한다. –

+0

>>> 1 + [] 역 추적 (가장 최근 통화 최종) : 형식 오류에 파일 "", 라인 1 : 지원되지 않는 피연산자 유형 (들) +에 대한 'INT'과 '목록' –

0

:

내가 말할 것 같은 일에 관하여

The advantage claimed of weak typing is that it requires less effort on the part of the programmer than strong typing, because the compiler or interpreter implicitly performs certain kinds of conversions. However, one claimed disadvantage is that weakly typed programming systems catch fewer errors at compile time and some of these might still remain after testing has been completed.

. 그러나 암시 적 변환이 줄을 흐릿하게 만들기 때문에이 용어의 상대적 모호성 ("강력한 입력"및 "약한 입력")에주의하십시오.

출처 : http://en.wikipedia.org/wiki/Weak_typing

+2

필자는 '약한 타이핑의 이점은 컴파일러 나 인터프리터가 암묵적으로 특정 종류의 변환을 수행하기 때문에 강력한 타이핑보다 프로그래머 쪽에서 더 적은 노력이 필요하다는 것이다. 개발자가 STUPID 타이핑 문제를 디버그하기 위해 ..... –

+0

@PeterLee : 공정한 점은 프로그래머가 성숙하고 일반적인주의 사항을 알고 있다는 낙관적 인 가정 일 것입니다. "Intro to CS"설정에서 포인트 링이 사실이지만 개발자가 나아질수록 관련성은 떨어집니다. –

+1

필자는 점점 더 약하게 언어 코드를 타이핑 할 때 프로그래머 자신이 컴파일러가되고있는 반면, 개발자/프로그래머는 이러한 타이핑주의 사항이 아닌 비즈니스 논리에 초점을 맞추어야한다는 것을 알게되었습니다. 도구 (컴퓨터의 실제 컴파일러)에 의해 발견되어야합니다. 다른 부분은 JavaScript jQuery와 같은 모든 프레임 워크 덕분입니다. –

2

약점과 강함은로드 된 용어입니다. (당신은 약한 언어 프로그래머가되고 싶습니까?) Dynamic과 Static은 더 좋지만 대부분의 사람들이 정적 프로그래머보다 동적 프로그래머가 될 것이라고 생각합니다. 초기화되지 않은 변수를 허용

garbage_out = garbage_in * 3; // garbage_in was not initialized yet 
"hello world" + 2; // does this make sense? 

는 철자의 오류를 찾기 위해 열심히 작성

PHP) (그게 전부가 아닌로드 용어) 나는 PHP에게 무차별 언어를 부를 것이다. 비 관련 유형에 대한 조작 허용은 거의 항상보고되어야하는 오류입니다. 대부분의 해석 된 동적 언어는 좋은 이유로 이러한 것을 허용하지 않습니다. 쓰레기를 허용하지 않고 동적으로 입력 된 언어를 사용할 수 있습니다.

+0

"이것이 의미가 있습니다."- 맞습니다. 그리고 "Hello World"를 작성했기 때문에 파이썬이 예외를 throw 할 때마다 +2 ', * 항상 항상 * "hello world"+ str (2)'을 의미합니다. 제 이론은 사람들에게'%'(형식 문자열)을 사용하게하는 교활한 속임수라는 것입니다. 왜냐하면 문자열로 자유로운 변환을 할 수 있기 때문입니다. ' "hello world % s"% 2'은 괜찮습니다. 이 트릭이라면 기본적으로 나에게 효과가 있었다 ;-) –

+0

첫 번째 라인은 유효한 PHP 코드가 아니다. 그러나 그것이 있다고 가정하더라도 PHP는 정의되지 않은 변수에 대한 경고를 던질 것입니다. 이것은 약하거나 난잡한 또는 타이핑에 대해 아무것도 보여주지 않습니다. 두 번째 예제는보다 합법적이지만, 유즈 케이스는'$ a = '2'; $ b = $ a + 1; // $ b == 3'. 문자열에'+'를 사용하는 것은 완전히 무의미한 것은 아닙니다. – deceze

1

은 PHP == 조작의 결과를 보여주는 this table 참조 다양한 유형의 빈 또는 다른 값 주체 같은 0, "0", NULL"" 쌍에인가. 연산자는 비순환 적이므로 테이블은 아주 직관적이지 않습니다. (문자열이 배열과 동등한 지 여부를 묻는 것은별로 중요하지 않겠지 만 - 약점이있는 약식 언어로 처리 할 수 ​​있습니다. 언어가 문제가되는 경우 Turing이 도움이 될 수 있습니다.

+1

이 링크가 질문에 대답 할 수 있지만 여기에 답변의 핵심 부분을 포함하고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않게 될 수 있습니다. –

+0

@RostyslavDzinko : 틀림없이 틀림 없습니다. 제안 해 주셔서 감사합니다. – aib

-1

PHP는 웹 응용 프로그램의 컨텍스트를 위해 만들어 졌음을 알아야합니다.웹 컨텍스트의 모든 것은 문자열입니다. 따라서 강력한 타이핑이 도움이되는 경우는 매우 드뭅니다.

1

저는 강력한 형식의 (Java와 같은) 언어와 약한 형식의 (JavaScript와 같은) 언어를 사용하고 있습니다. 내가 발견 한 것은 약한 타입 언어의 편리 성이 작은 어플리케이션에 적합하다는 것입니다. 안타깝게도 애플리케이션 규모가 커지면 관리가 불가능 해집니다. 당신의 머리 속에있는 것을 추적하기에는 너무 많아 져서 IDE와 컴파일러에 의존하기 시작해야합니다. 그렇지 않으면 코딩이 중단됩니다. 강력한 유형의 언어가 더 유용 해지기 시작합니다. 애플리케이션이 매우 커지면됩니다.

약한 타입의 JavaScript에서 끊임없이 나를 괴롭히는 두 가지 예는 철저히 문서화되지 않고 리팩토링되는 외부 라이브러리를 사용하고 있습니다.

외부 라이브러리 : 강력한 형식의 언어를 처리 할 때 라이브러리 자체의 코드는 자체 문서를 제공합니다. Person 유형의 변수를 만들 때 IDE는 코드를 검사하여 getFirstName(), getLastName() 및 getFullName()이 있음을 알릴 수 있습니다. 약한 유형의 언어에서는 변수가 아무 것도 아니거나 변수 또는 함수를 가지며 함수 인수를 가질 수 있기 때문에 이러한 경우가 아닙니다 (명시 적으로 정의되지 않았습니다). 결과적으로 개발자는 문서, 웹 검색, 토론 포럼 및 과거 사용법에 대한 기억에 크게 의지해야합니다. Java로 외부 라이브러리를 보려고 몇 시간이 걸릴 수 있습니다. " 키를 누르면 내 모든 옵션이 첨부 된 설명서와 함께 표시됩니다. 100 % 완벽하게 문서화되지 않은 라이브러리를 만나면 약한 타입의 언어로 인해 실망 할 수 있습니다. 나는 최근에 "함수 '무승부'에서 인수 '플롯'이 무엇인지 물어 보았다." jqplot을 사용할 때, 잘 설명되었지만 완전히 문서화되지 않은 JavaScript 라이브러리. 마지막으로 포기하고 대안 솔루션을 찾기 전에 한두 시간 동안 소스 코드를 파기해야했습니다.

리팩토링 : 강력한 형식의 언어를 사용하면 변경해야하는 파일을 변경 한 다음 컴파일러 오류를 수정하여 신속하게 리팩토링 할 수 있습니다. 일부 도구는 간단한 버튼 클릭만으로 리팩터링 할 수도 있습니다. 약한 타입의 언어를 사용하면 검색을 수행 한 후주의를 기울여 교체 한 다음 테스트, 테스트, 테스트를 한 후 더 많은 것을 테스트해야합니다. 특히 대형 응용 프로그램에서 파산 된 모든 것을 발견하고 수정 한 것은 거의 확실하지 않습니다.

간단한 요구 사항과 작은 응용 프로그램의 경우 이러한 두 가지 사항은 존재하지 않을 경우 최소한입니다. 그러나 수천 또는 수백만 줄의 코드를 가진 애플리케이션으로 작업하는 경우 약한 타입의 언어로 인해 어려움을 겪을 수 있습니다.

저는 많은 개발자들이이 점에 대해 화가 나서 감정적 인 논의로 전환한다고 생각합니다. 때로는 우리의 머리에 올바른 접근 방식과 잘못된 접근 방식이 있기 때문입니다. 그러나 각 접근법에는 장점과 단점이 있습니다. 감정을 옆으로두고 지금 당장 필요한 것을 위해 최선을 선택한다는 것을 인정하면됩니다.

관련 문제