예를 들어, 대규모 웹앱에 "강력한"유형의 시스템을 사용합니까?


29

나는 이것이 매우 광범위하고 모호하며 아마도 철학적 인 질문이라는 것을 알고 있습니다. 어느 정도까지는 "강력한"유형 시스템 자체라는 질문에서 가장 중요한 키워드는 잘못 정의되어 있습니다. 그래서 내가 의미하는 바를 설명하려고 노력하겠습니다.

질문에 대한 전반적인 맥락

우리는 Ruby on Rails에서 매우 큰 규모의 웹 앱을 구축해 왔으며 일반적으로 스택에 만족합니다. 우리가 원할 때, 우리는 10 % 정도의 엣지 케이스를 걱정하지 않고 "비즈니스"케이스의 90 %에 대해 작동하는 물건을 정말 빠르게 배송 할 수 있습니다. 반면에 코드 검토 및 테스트 적용을 통해 느리고 신중하게 모든 기반을 다룰 수 있습니다. 다시 한 번 더 면밀한 조사 및 안전성이 필요한 상황에서만 가능합니다.

그러나 팀이 성장함에 따라 스택에 "안전망"이 없어 불편 함을 느끼기 시작했습니다.

우리는 최근에 자바를 기반으로 안드로이드 개발을 시작했습니다. 그리고 나는 컴파일 된 / 정적 / 강력한 언어가 제공하는 안전성을 (유쾌하게) 상기시켰다.

  • 철자가 틀린 변수, 잘못된 데이터 유형, 잘못된 함수 호출 및 많은 사소한 오류는 IDE 자체에 의해 잡 힙니다. IDE가 컴파일러에 연결되어 프로그램 "정확성"의 특정 측면을 확인할 수 있기 때문입니다.
  • 함수 서명을 변경해야합니까? 쉬운. 컴파일러 + IDE는 모든 호출 사이트를 찾는 데 도움이됩니다.
  • 특정 예외를 항상 처리해야합니까? 구조에 대한 예외를 확인했습니다.

이제 이러한 안전 기능에는 장점이 있지만 단점도 잘 알고 있습니다. "보일러 플레이트 헤비"자바의 세계에서 더욱 그러하다. 따라서 Java 대신에 요즘 사람들이 작업을 시작한 수많은 "강력한"언어를보기 시작했습니다. 예를 들어 : Scala, Rust, Haskell 등 가장 관심있는 것은 타입 시스템의 힘과 정적 / 컴파일 타임 검사입니다.

이제 질문

대규모 응용 프로그램에서 이러한 강력한 유형 시스템과 정적 / 컴파일 타임 기능을 어떻게 사용합니까?

예를 들어, 어떻게이 강력한 기능에 대한 표준 "hello world"소개를 넘어 설까요? 리치 유형 시스템을 사용하여 비즈니스 도메인 문제를 모델링하는 시스템은 무엇입니까? 타입 시스템이 30,000 LOC + 영역에있을 때 도움이됩니까, 방해합니까? 예를 들어 시스템이 약한 유형의 외부 세계와 상호 작용할 때 이러한 유형 시스템 (및 컴파일 타임 검사)에서 제공하는 안전망은 어떻게됩니까? JSON 또는 XML API, 다양한 데이터 저장소, 사용자 입력 등을 통해


12
실제 답변이 없기 때문에 이것은 주제가 아닙니다. 이 질문은 사실적인 설명이 아니라 의견이 많은 토론 ( "정적 유형이 좋아하기 때문에 싫어요 ...") 을 유발하기위한 것 입니다. 저의 조언은 "시스템이 약한 유형의 외부 세계와 상호 작용할 때 이러한 유형 시스템이 제공하는 안전망은 어떻게됩니까?"와 같이보다 구체적인 질문 부분 중 하나를 선택하는 것입니다. 하고 질문을 다시 그것에 대해 할 수 있습니다. 미래 독자들에게 도움이 될 결정적인 답변을 얻을 수 있습니다.
Benjamin Hodgson

5
리소스 추천도 여기에서 주제가 맞지 않습니다 (해당 답변이 빨리 구식이되어 Google보다 Google이 더 나쁘지 않기 때문에). Benjamin이 말한 것처럼 게시물에 묻힐 수있는 몇 가지 질문이 있지만 현재 상태의 전체 게시물은 본질적으로 사람들 이이 언어를 사용한 경험을 설명하도록 요구합니다. 대지. 이 질문에 대한 답변이 많았지 만 StackExchange 질문이 아닙니다.
Ixrec

4
유형 시스템은 도구이며 다른 도구와 마찬가지로 효율성은 도구 자체가 아니라 더 큰 범위에 달려 있습니다. Haskell과 같은 언어의 유형 시스템을 활용하여 비즈니스 로직에 대한 변형을 유형 레벨로 인코딩하고 컴파일러 시간에 기계 (컴파일러)가 해당 불변량을 검사하도록 할 수 있지만,이를 위해서는 시맨틱에 대한 이해가 필요합니다. 타입 시스템과 타입 검사. 올바른 질문은 "이것이 웹에 유용한 도구"가 아니라 "내가 직면 한 몇 가지 특정 문제가 있습니다. 어떻게 강력한 유형의 시스템을 사용하여 문제를 해결할 수 있습니까?"입니다.
user2407038

5
설명하는 대부분의 내용은 유형 시스템과 관련이 없습니다. 그것들은 순전히 IDE 기능입니다. 확인 된 예외의 예외 (말장난 의도가 없음)와 함께 언급 한 모든 기능은 정적 유형 언어의 IDE에 나타나기 오래 전에 Smalltalk IDE에 존재했습니다. 실제로 가장 널리 사용되는 Java IDE 중 하나는 실제로 수정 된 스몰 토크 IDE (IBM VisualAge Smalltalk로 시작되었지만 Java 코드를 이해하기 위해 수정되었지만 여전히 Smalltalk로 작성되어 VisualAge Java로 릴리스 됨) 그리고 ...로 출시
요 르그 W MITTAG

4
… VisualAge Java Micro Edition은 재사용 가능한 구성 요소로 분류되어 Eclipse라는 이름으로 Open Source로 릴리스되었습니다. 이 질문과 관련하여 다소 아이러니하게도, 스몰 토크 IDE가 그렇게 강력하다는 것은 스몰 토크 시스템의 동적 특성 때문 입니다. 예를 들어, 자동 리팩토링이 스몰 토크에서 처음으로 구현되었습니다. 하스켈은 여러분이 언급 한 모든 언어 중에서 가장 강력하고 엄격한 정적 유형 시스템을 가지고 있으므로 논리에 따라 최상의 IDE를 갖추어야합니다. 그러나 그렇지 않습니다. "컴파일러에 연결"에 대해서도 언급했습니다. 이것은 ...
Jörg W Mittag

답변:


34

현재 시간 부족으로 짧은 답변을 드리겠습니다. 그러나 현재 두 개의 큰 프로젝트 (Haskell에서> 100.000 LOC) ( flowbox.ioluna-lang.org )를 진행 하고 있습니다.. 백엔드, 프로그래밍 언어의 컴파일러 및 webGL 기반 GUI를 포함한 모든 부분에 Haskell을 사용합니다. 나는 강력한 타입 시스템과 "종속 타입"과 같은 기계가 당신을 인도하고 다른 언어로 알려진 부담과 번거 로움을 덜어 줄 수 있음을 인정해야합니다. 우리는 유형을 매우 광범위하게 사용하며 컴파일 타임에 확인할 수있는 모든 것이 완료됩니다. 실제로 지난 3 년간의 개발 과정에서 런타임 오류나 스택 오버플로가 발생하지 않았습니다. 유일한 오류는 프로그래머가 만든 명백한 논리 오류입니다. 많은 사람들이 Haskell에서 무언가가 컴파일되면 작동하고 언젠가는 당신의 얼굴에 날려 가지 않을 것이라고 확신합니다.

질문의 첫 번째 부분에 대한 답변 : 다음과 같은 훌륭한 블로그를 읽는 강력한 유형 시스템 기능에 대해 배울 수 있습니다.

실제로, 행성 Haskell 과 같은 다른 멋진 블로그가 많이 있습니다. 어쨌든, 고급 유형 시스템을 실제로 이해하는 가장 좋은 방법은 유용한 오픈 소스 라이브러리를 개발하는 것입니다. 우리는 Flowbox & New Byte Order에서 많은 라이브러리를 공개하고 있습니다 (Hackage에서 찾을 수 있습니다). 개발해야 할 아이디어가 없다면 언제든지 프로젝트에 참여할 수 있습니다. 원하는 ( luna-lang.org 에서 메일 사용 가능 ).


4
"많은 사람들이 하스켈에서 무언가가 컴파일된다면 그것이 작동하고 언젠가는 당신의 얼굴에 날려 가지 않을 것이라고 확신해야한다"고 말했다. Haskell 컴파일러가 만족되면 버그가 거의 발견되지 않습니다.
조르지오

1
아마 유형을 싫어 "하스켈"사람 (너무 많은 내가 쓴 가장 중 하나입니다 종류없이 하스켈의 내 자신의 버전을 하지만 서로 다른 이유로 대부분의 사람들이 할 - 결국,). 소프트웨어 엔지니어링과 관련하여 GHC가 행복 할 때 프로그램이 작동한다는 느낌을 받았습니다. Haskell과 같은 유형 시스템은 프로그래밍에서 인간의 실수를 감지 할뿐만 아니라 거대한 코드베이스를 사용자가 관리 할 수있는 최고의 도구입니다. (나는 항상 타입 오류를 수정해야 할 때마다 Mewtwo의 갑옷에 대한 Giovanni의 정당성을 기억합니다.)
MaiaVictor

Gabriel Gonzales의 블로그는 시작하기에 가장 좋습니다.
sam boosalis

@ danilo2 회사 웹 사이트의 contact @ 주소로 이메일을 보냈습니다. 응답을 요청하십시오. 감사!
Saurabh Nanda

@SaurabhNanda :받은 편지함을 두 번 확인했는데 메시지가 표시되지 않습니다. <at> luna-lang.org에 연락하셨습니까? 내 wojciech <dot> danilo <at> gmail <dot> com에 직접 글을 보내 주시면이 문제의 원인을
조사해 드리겠습니다

17

글쎄, 약한 대 강한 타이핑은 꽤 모호하게 정의되어 있습니다. 또한, '강력한 타이핑'의 일반적인 사용이 가장 근접하기 때문에 타입을 캐스트하기 어렵게 만드는 것들을 언급하는 것이 더 강하므로 더 강력한 타입 시스템을 설명 할 수있는 것은 없습니다. 마치 30 파운드 미만을 운반 할 수 있다면 몸이 약하고 더 많이 들어 올릴 수있는 사람은 모두 같은 범주의 '강한'이라는 오해의 소지가 있습니다.

그래서 나는 정의를 선호한다 :

  • 약한 유형의 시스템은 유형을 사용하여 실수와 같은 특정 작업을 수행하지 못하게합니다.
  • 강력한 유형의 시스템은 유형을 사용하여 작업수행합니다.

내가 당신을 위해 무엇을 의미합니까? 자, 서번트 프레임 워크에서 이미지 변환 API를 작성해 보도록하겠습니다 (하스켈에서, 실제로 따라야 할 것을 알 필요는 없습니다.).

{-# LANGUAGE
    TypeOperators,
    DataKinds
    #-}

import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels

main :: IO ()
main = run 8001 conversion

이것은 Servant 패키지와 JuicyPixels 플러그인을 포함하여 일부 모듈을 Servant에 필요로하며, 프로그램의 주요 진입 점은 Warp 백엔드를 사용하여 포트 8001에서 '변환'기능을 서버로 실행하는 것입니다. 언어 비트를 무시하십시오.

conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler

이것은 변환 함수가 API가 'ConversionApi'유형과 일치해야하고 요청이 함수에 의해 처리되는 서버라고 말하고 있습니다. handler

type ConversionApi
     = ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
    :> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage

ConvesionApi유형을 지정합니다 . '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] 목록에 지정된 수신 컨텐츠 유형을 승인하고이를 DynamicImage로 처리해야하며 동일한 범위의 컨텐츠로 변환 된 DynamicImage를 리턴해야합니다. 유형. :>의 의미에 대해 정확히 걱정하지 말고 지금 당장 그것을 행복한 마술이라고 생각하십시오.

그래서 내가 선호하는 정의를 감안할 때 약한 유형의 시스템은 이제 다음과 같은 것을 보장 할 수 있습니다.

  • 잘못된 발신 콘텐츠 유형을 반환하지 않습니다
  • 수신 요청을 잘못된 컨텐츠 유형으로 구문 분석하지 않습니다.
  • 서버가 더 복잡하다면 잘못된 URI를 만들 수는 없지만 실제로 링크를 포함하는 HTML 페이지를 반환하지는 않습니다.
  • 정말 야심 찬 약한 타이핑 시스템은 모든 수신 및 발신 컨텐츠 유형을 철저하게 처리하고 있는지 확인하여 해당 유형이 제약 조건 대신 사양 문서로도 작동하도록 할 수도 있습니다.

위의 정의를 감안할 때 모든 높은 목표이지만 실제로 강력한 유형의 시스템으로 자격을 갖추기에 충분하지는 않습니다. 이제이 사양을 따르는 코드를 실제로 작성 하는 데 어려움 을 겪어야합니다. 정말로 강력한 타입 시스템에서 우리는 다음과 같이 씁니다.

handler = return

그리고 우리는 끝났습니다. 그게 다야, 더 이상 쓸 코드가 없습니다 . 이것은 완벽하게 작동하는 웹 서버입니다. 형식은 컴파일러가 정의하고 가져온 형식과 패키지 (기술적으로 모듈)에서 웹 서버를 만드는 데 필요한 모든 것을 컴파일러에 지시했습니다.

그렇다면 주요 응용 프로그램 규모에서이를 수행하는 방법을 어떻게 배울 수 있습니까? 음, 소규모 응용 프로그램에서 사용하는 것과 크게 다르지 않습니다. 절대 유형은 관련 코드 작성 량에 상관하지 않습니다.

런타임 형식 검사는 피하고 싶을 것입니다. 그 이유는 많은 이점을 없애고 형식을 단순화하는 대신 형식을 사용하여 프로젝트 작업을 더 복잡하게 만들 수 있기 때문입니다.

따라서 대부분 유형을 사용하여 모델링하는 연습 문제입니다. 사물을 모델링하는 두 가지 주요 방법 (또는 일반적인 사물 구축)은 상향식과 하향식입니다. 하향식은 최고 수준의 작업으로 시작하며 모델을 작성할 때 나중에 모델링을 연기하는 부분이 있습니다. 상향식 모델링은 기본 기능으로 시작하는 것처럼 기본 작업으로 시작한 다음 프로젝트 작업을 완전히 캡처 할 때까지 더 큰 모델을 빌드하는 것을 의미합니다. 상향식은 더 구체적이고 빌드하기가 더 빠르지 만 하향식은 모델이 실제로 어떻게 행동해야하는지에 대해 더 잘 알릴 수 있습니다.

유형은 프로그램이 말 그대로 수학과 관련되는 방식이므로 실제로 얻을 수있는 복잡성 또는 학습을 '완료'할 수있는 지점에 대한 상한은 없습니다. 상위 수준의 대학 과정 외부의 거의 모든 리소스는 유형이 특정 언어로 작동하는 방식에 전적으로 헌신되어 있으므로이를 결정해야합니다.

내가 제공 할 수있는 한 유형은 다음과 같이 계층화 될 수 있습니다.

  • [] + {}가 정의 된 JavaScript와 같은 매우 약한 유형
  • [] + {}를 수행 할 수없는 Python과 같이 약하게 입력되었지만 시도하기 전까지는 확인되지 않습니다.
  • C 또는 Java와 같이 약하게 입력했지만 [] + {}를 수행 할 수는 없지만 컴파일 타임에 확인되지만 고급 유형 기능은 없습니다.
  • C ++ 템플릿 메타 프로그래밍과 같은 약한 유형과 강력한 유형의 경계, 유형이 속성 만 적용하는 단순한 Haskell 코드
  • 위에 표시된 것처럼 유형이 작업을 수행하는 더 복잡한 Haskell 프로그램과 같이 강력하게 입력됩니다.
  • 유형과 값이 상호 작용하고 서로를 구속 할 수있는 Agda 또는 Idris와 같은 매우 강력한 유형입니다. 이것은 타입 시스템만큼 강력하며, 프로그래밍은 프로그램이하는 일에 대한 수학적 증거를 작성하는 것과 같습니다. 참고 : Agda로 코딩하는 것은 문자 그대로 수학 증명을 작성 하는 것이 아니며 유형은 수학 이론이며 이러한 유형의 함수는 해당 이론을 입증하는 건설적인 예입니다.

일반적으로이 목록을 아래로 내려 갈수록 유형이 더 많은 것을 할 수 있지만 맨 아래에는 성층권으로 올라가고 공기가 약간 얇아지고 있습니다. 패키지 생태계는 훨씬 작고 관련 라이브러리를 찾은 것보다 더 많은 것을 직접 작성해야합니다. 대규모 프로그램을 작성하기에 충분한 유형 시스템을 실제로 이해해야하므로 진입 장벽도 높아집니다.


목록에 요소 이상이있는 경우 유형 수준 목록 앞에 아포스트로피를 붙일 필요는 없습니다. 그들이 (그들은 일반 목록 유형 생성자를 참조 할 수있다) 모호하기 때문에 아포스트로피는 0- 또는 1 요소 타입 수준의 목록에 대한 필요
가브리엘 곤잘레스

1
나는 알고 있지만 아포스트로피는 일반적으로 승격 된 데이터 유형에 대한 좋은 형태라는 인상을 받았습니다. EG는 Proxy :: Proxy True작동하지만로 작성하는 것이 좋습니다 Proxy :: Proxy 'True.
Steven Armstrong

1
유형 시스템을 분류 할 수있는 유형에 따라 다양한 축을 축소하지 않는 것이 좋습니다. Barendregt의 람다 큐브 에는 이미 3 개의 약한 축이 있으며 정적 대 동적 및 매개 변수 대 임시 다형성도 포함합니다 (후자는 유형이 많은 작업을 수행하게하는 서번트 기술을 허용하는 것입니다) ').
user2141650

1
페어 포인트이지만 대답은 이미 매우 길기 때문에 람다 큐브가 실제로 이해되기 시작하기 전에 유형 이론을 연구해야합니다. 또한, 매우 틈새 시장 이외의 (그리고 이미 하스켈 심지어 AGDA 포함하고있어 이후, 난 정말 뜻 확실히 당신이 정말로, 예를 들어, 의존적 유형하지만 유형의 연산자를 가지고 언어를 찾아 갈 수 없습니다, 언어 틈새 시장) .
Steven Armstrong

'[xs]구문 을 간단히 설명해 주 시겠습니까? 이것은 분명히 그렇지는 Char않지만 대체 구문을 사용 TypeOperators하거나 DataKinds사용하는 방법을 모르겠습니다 . 어떤 종류의 준 따옴표가 있습니까?
wchargin 님이

10

방금 스칼라로 작성된 대형 플랫폼의 핵심 팀에서 일하기 시작했습니다. Scalatra, Play 또는 Slick과 같은 성공적인 오픈 소스 응용 프로그램을보고 동적 데이터 형식과의 상호 작용에 대한보다 자세한 질문을 처리하는 방법을 확인할 수 있습니다.

스칼라의 강력한 타이핑에서 우리가 발견 한 가장 큰 장점 중 하나는 사용자 교육입니다. 핵심 팀은 유형 시스템에서 의사 결정을 내리고 그러한 결정을 시행 할 수 있으므로 디자인 원칙에 익숙하지 않은 다른 팀이 시스템과 상호 작용해야하는 경우 컴파일러가이를 수정하며 핵심 팀은 지속적으로 문제를 해결하지 않습니다. 풀 요청. 이것은 큰 시스템에서 이점입니다.

물론 모든 디자인 원칙을 유형 시스템에 적용 할 수있는 것은 아니지만 유형 시스템이 강할수록 컴파일러에서 더 많은 디자인 원칙을 적용 할 수 있습니다.

또한 사용자가 더 쉽게 할 수 있습니다. 그들에게 종종 일반 컬렉션이나 케이스 클래스를 사용하고 있으며 JSON으로 변환하거나 네트워크 전송에 필요한 것으로 자동 변환합니다.

강력한 타이핑은 또한 위생 처리되지 않은 입력과 위생 처리 된 입력을 구별하는 데 도움이되므로 보안에 도움이됩니다.

강력한 타이핑은 유형을 테스트하는 여러 테스트가 필요하지 않고 테스트가 실제 동작 에보다 집중되도록 도와줍니다 . 테스트가 훨씬 즐겁고 집중적이며 효과적입니다.

가장 큰 단점은 언어와 언어 패러다임에 익숙하지 않으며 시간에 따라 수정 될 수 있다는 것입니다. 다른 한편으로, 우리는 노력의 가치가 있다는 것을 알았습니다.


8

직접적인 답변은 아니지만 (아직 haskell의 +30.000 LOC 코드 기반에서 아직 작업하지 않았기 때문에 :( ..)) https://www.fpcomplete.com/business/resources/case-studies 를 확인 하십시오. / 실제 산업 환경에서 많은 사례 연구를 특징으로합니다.

- 또 다른 좋은 기사는 자신의 경험 하스켈로 변경 설명 IMVU입니다 http://engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell/을 .

큰 애플리케이션의 개인적인 경험에서, 타입 시스템은 매우 많은 종류의 당신이 할 수있는 당신이만큼 인코딩하려고 특히 당신을 도와줍니다. 리팩토링에있어 진정한 힘은 분명합니다. 유지 보수를 의미하는 것은 훨씬 덜 걱정스러운 일입니다.

한 번에 많은 질문을하므로 권장하는 리소스에 대한 몇 가지 링크를 덤프합니다.

마지막으로, 외부 세계를 다루는 것은 여러 가지 방법으로 이루어집니다. Aeson for JSON, Esqueleto for SQL 등과 같은 유형의 안전을 보장하는 라이브러리가 있습니다.


1
답변에 감사 드리지만 fpcomplete.com/business/resources/case-studies 에 대한 사례 연구 는 더 이상 사용할 수 없습니다.
Saurabh Nanda


3

내가 본 것 :

나는 몇 가지 큰 루비 웹 응용 프로그램 (Rails), 하나의 큰 Haskell 웹 응용 프로그램 및 여러 개의 작은 웹 응용 프로그램을 작업했습니다. 그 경험으로 Haskell 응용 프로그램에서 작업하는 삶이 유지 관리 및 낮은 학습 곡선과 같은 Rails보다 훨씬 쉽다고 말해야합니다. 이러한 이점은 Haskell의 유형 시스템과 기능적 프로그래밍 스타일에 기인한다고 생각합니다. 그러나 많은 사람들과 달리 유형 시스템의 "정적"부분은 동적 계약을 사용할 때 여전히 이점이 있다는 점에서 매우 편리하다고 생각합니다.

내가 믿는 것

Haskell 프로젝트가 더 나은 유지 보수 특성을 달성하는 데 도움이되는 몇 가지 주요 기능을 제공하는 Contracts Ruby 라는 멋진 패키지가 있습니다 . 계약 Ruby는 런타임에 검사를 수행하므로 높은 테스트 수렴과 함께 사용하는 것이 가장 좋지만 Haskell과 같은 언어에서 유형 주석을 사용하는 것과 동일한 인라인 문서 및 의도 및 의미 표현을 제공합니다.

질문에 대한 답변

위에서 제기 한 질문에 대답하기 위해 Haskell 및 고급 유형 시스템을 갖춘 다른 언어에 익숙해 질 수있는 곳이 많이 있습니다. 그러나 완벽하게 정직하게 말하면, 이러한 문서 소스는 그 자체로는 우수하지만 Ruby, Python, Java 및 기타 언어에서 발견되는 수많은 문서 및 실용적인 조언과 비교할 때 모두 다소 압도적 인 것처럼 보입니다. 어쨌든 Real World Haskell 은 오래되었지만 여전히 좋은 자원입니다.

카테고리 이론

Haskell을 선택하면 범주 이론에 관해 많은 양의 문헌이 나옵니다. IMHO 범주 이론은 유용하지만 반드시 필요한 것은 아닙니다. 하스켈 공동체에서 유병률이 높기 때문에 유형 이론의 실용성에 대한 감정과 유형의 장단점을 쉽게 접할 수 있습니다. 그것들이 두 가지 다른 점을 기억하는 것이 도움이됩니다. 즉, 범주 이론에 의해 구현 된 구현은 정적뿐만 아니라 동적으로 유형이 지정된 언어로 수행 될 수 있습니다 (유형 시스템이 제공하는 이점). 일반적으로 고급 유형 시스템은 범주 이론에 구속되지 않으며 범주 이론은 유형 시스템에 구속되지 않습니다.

유형에 대한 추가 정보

타입과 프로그래밍 기술에 대해 더 많이 배우면 (재미로 인해 아주 빨리 발생합니다) 타입 시스템으로 더 많이 표현하고 싶을 것입니다. 이 경우 다음 리소스 중 일부를 살펴보고 도구 공급 업체가 이러한 기능을 갖춘 산업 품질 도구를 계약 인터페이스와 같은 사용하기 쉬운 인터페이스에 노출시키는 것으로 만 제공하고 있음을 알리도록하겠습니다.


2

먼저 약한 유형과 강력한 유형, 정적 및 동적 유형 사이의 답변에 혼란이 있다고 생각합니다. 제공된 OP를 명확하게 구분하십시오.

강력한 유형 시스템은 컴파일 타임 제한 또는 런타임 기능이있어 매력적인 시스템입니다.

약한 유형 시스템은 해당 제한이나 기능이없는 유형 시스템입니다.

예를 들어 C, C ++ 및 Java는 변수가 컴파일 타임에 입력되므로 정적으로 입력됩니다. 그러나 언어가 void *포인터와 캐스트를 사용하여 제한을 무시할 수 있기 때문에 C 및 C ++는 약한 유형으로 간주 될 수 있습니다 . 이 주제에 대한 추가 정보.

이러한 차이점에서 강력한 타이핑은 더 나을 수 있습니다. 일찍 실패할수록 좋습니다.

그러나 큰 프로그램을 작성할 때 유형 시스템이 중요한 역할을하지 않는다고 생각합니다. Linux 커널은 C와 어셈블리로 작성된 천만개의 LOC이며 매우 안정적인 프로그램으로 간주되며 보안상의 어려움으로 가득 찬 200 개의 Java 라인에서 몇 마일 떨어져 있습니다. 마찬가지로, 동적으로 유형이 지정된 "스크립트 언어"는 큰 프로그램을 작성할 때 평판이 좋지 않지만 때로는 가치가 없다는 증거가 있습니다 (예 : Python Django, 70k LOC 이상)

제 생각에는 품질 표준에 관한 것입니다. 대규모 응용 프로그램의 확장성에 대한 책임은 프로그래머와 설계자에 의해서만 유지되어야하며 응용 프로그램을 깨끗하고 테스트되고 문서화가 잘되도록하는 의지가 있어야합니다.


-1

더 큰 응용 프로그램에서 이러한 강력한 유형 시스템과 정적 / 컴파일 타임 기능을 사용하는 방법에 대한 정보는 어디에서 읽을 수 있습니까?

이전 답변에서 https://www.fpcomplete.com/business/resources/case-studies/

이러한 강력한 기능에 대한 표준 "hello world"소개를 뛰어 넘는 방법은 무엇입니까?

힘을 키우는 것은 다른 어떤 언어와도 같습니다

리치 유형 시스템을 사용하여 비즈니스 도메인 문제를 모델링하는 방법은 무엇입니까?

추상 데이터 형식 또는보다 일반적으로 다형성 을 사용하여

타입 시스템이 30,000 LOC + 영역에있을 때 도움이됩니까, 방해합니까?

모든 도움이됩니다. 타입 시스템은 원하는 결과의 형태를 알려주는 코드 작성을 도와줍니다. 실제로 Agda는 코드를 작성합니다.

추신 : 형식 시스템을 가지고 있고 스스로 형식을 작성해야한다는 실수를하지 마십시오.

예를 들어 시스템이 약한 유형의 외부 세계와 상호 작용할 때 이러한 유형 시스템 (및 컴파일 타임 검사)에서 제공하는 안전망은 어떻게됩니까? JSON 또는 XML API, 다양한 데이터 저장소, 사용자 입력 등을 통해

유형을 통한 값의 구조를 알면 컴퓨터가 직렬화기를 작성하는 방법을 유추 할 수 있기 때문에 좋습니다.

유형과 추상화에 대해 정말로 알고 싶다면 유형, 데이터 추상화 및 다형성 이해에 대한 가장 좋은 소개입니다.

예쁜 그림으로 된 사례 연구가 아니라 종이이지만 깨달음입니다.


-2

웹 응용 프로그램을 많이 사용하는 .net 프로그래머로서 형식화 된 C #과 형식화되지 않은 Javascript 측면을 모두 볼 수 있습니다.

당신이 묻는 질문에 대한 문헌을 본 적이 없습니다. 타이핑 된 언어를 사용하면이 모든 것을 당연하게 여깁니다. 유형이 지정되지 않은 유형에서는 유형을 불필요한 오버 헤드로 정의하는 것을 볼 수 있습니다.

개인적으로, 강력한 형식의 언어가 동등한 단위 테스트를 작성하는 것과 비교하여 매우 저렴한 비용으로 설명하는 이점을 제공한다는 것을 부정 할 수는 없다고 생각합니다. 약한 유형의 시스템과의 상호 작용에는 일반적으로 DataReader와 같은 객체의 배열 또는 사전과 같은 일반적인 유형 또는 문자열 또는 새로운 동적 클래스의 창조적 인 사용이 포함됩니다. 본질적으로 모두 작동합니다. 컴파일 시간 대신 런타임 오류가 발생합니다.

더 큰 응용 프로그램과 함께 작동하기 위해 몇 줄로 함수를 정의하는 매우 짧은 프로그램을 작성하려면 클래스를 선언 할 공간이 없습니다. 분명히 이것은 JS와 같은 틈새 형식화되지 않은 언어입니까?


타이핑 / 타이핑 또는 정적으로 타이핑 / 동적 타입을 의미합니까? JavaScript는 형식화되지 않고 동적으로 형식화됩니다.
조르지오

2
유형을 정의 할 필요가 없습니다. 괜찮은 언어가 당신을 위해 타입을 유추 할 것입니다 : haskell, ocaml, sml, F # ...
nicolas

1
강력한 형식의 언어에 익숙 할 때 다른 모든 형식은 형식화되지 않습니다. 형식을 정의 할 때 '클래스를 만들 것'이라는 말은 var 또는 무엇이든 사용할 수 있지만 컴파일러 트릭입니다.
Ewan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.