Nice programing

Julia는 동적으로 입력됩니까?

nicepro 2020. 11. 20. 09:36
반응형

Julia는 동적으로 입력됩니까?


많은 블로그와 매뉴얼 자체 에서 Julia가 동적으로 입력 된다고 말합니다 . 그러나 매뉴얼을 읽었을 때 F # 과 같은 유형 추론을 사용 하여 정적으로 입력 된 것처럼 들립니다 .

  • Julia는 유형 추론을 통해 정적으로 입력됩니까?
  • 동적으로 입력됩니까?
  • 나는 그것이 동적으로 입력되었다고 가정하고, 매뉴얼이 잘못되었을 것 같지 않습니다.
  • 유형 추론이 Julia와 전혀 관련이 있습니까?

Tim Holy의 대답은 매우 정확하지만 조금 더 자세히 설명하겠습니다. 먼저, 몇 가지 용어를 정의 해 보겠습니다. 제 정의에 동의하지 않을 수 있지만 적어도 제가 무슨 말을하는지 알 것입니다. 제 생각에 정적 언어와 동적 언어의 주요 차이점은 다음과 같습니다. 정적 언어에서 표현식에는 유형이 있습니다. 동적 언어에서 값에는 유형이 있습니다.

정적 언어에는 프로그램의 모든 표현식 유형을 결정하는 규칙이 있습니다. 식의 유형에 따라 프로그램의 동작이 결정됩니다. 모든 식에 대해 결정되는 일관된 유형을 인정하지 않는 프로그램은 잘못된 것으로 간주되어 컴파일되지 않습니다. 다형성이 존재하는 경우 표현식의 유형은 단일 구체적인 유형이 아닐 수 있습니다. 매개 변수 다형성은 동일한 코드가 유형의 매개 변수에 의해 색인 된 구체적으로 유형화 된 알고리즘의 전체 제품군을 설명하도록하는 방법으로 생각할 수 있습니다. 하위 유형 다형성은 정적 언어에 제한된 양의 동적 동작을 도입하는 것으로 생각할 수 있습니다.

반면 동적 언어에는 표현식에 유형을 할당하는 규칙이 없습니다. 유형은 데이터가 실행될 때 프로그램 통해 흐르는 방식에 의해 암시됩니다 . 일반적으로 표현식은 잠재적으로 모든 유형의 값을 생성 할 수 있습니다. 이 때문에 유형 이론가들은 때때로 동적 언어를 "단일 유형"으로 설명합니다. 즉, "유형"이 본질적으로 표현의 속성 인 정적 관점에서 동적 언어의 모든 표현에는 유형이 Any있습니다. 물론 그것은 유형의 개념이 값에 대해서만 의미가있는 언어에 유형의 정적 개념 (표현식에만 의미가 있음)을 적용하는 것입니다.

Julia는 역동적 인 진영에 있습니다. 유형은 표현이 아닌 값의 속성입니다. 코드의 결과 유형은 실행시 값이 어떻게 흐르는 지에 따라 결정됩니다. 언어는 실행하기 전에 표현식에 유형을 할당하는 규칙을 포함하지 않습니다. 그러나 많은 동적 언어와 달리 Julia는 유형에 대해 이야기하는 데 상당히 정교한 언어를 가지고 있으며 유형으로 표현식에 주석을 달 수 있습니다. 예를 x::T들어은 x유형 값인 어설 션입니다 T. 그게 사실이면 x::T다음 값으로 평가됩니다.x그렇지 않으면 오류가 발생하고 표현식이 값을 반환하지 않습니다. 메소드 시그니처의 유형 주석은 약간 다른 의미를 갖습니다. 기존 값의 유형을 주장하는 대신 해당 인수가 표시된 유형 인 경우에만 메소드가 적용됨을 나타냅니다. 두 경우 모두 다음 코드는의 값 x이 유형 이라고 안전하게 가정 할 수 있습니다 T.

[참고 : "점진적"또는 "선택적"타이핑을 사용하는 일부 언어에서 유형 주석은 언어를 동적 모드에서 정적 모드로 전환합니다. 유형 주석이없는 메서드는 동적입니다. 유형 어노테이션이있는 메소드는 정적입니다. 정적 코드에는 모든 표현식에 유형을 할당하는 규칙이 있으며 코드는이를 충족해야합니다. 이것은 Julia가 작동하는 방식이 아닙니다. 유형 주석이있는 코드는 여전히 동적이며 유형 주석이없는 코드와 동일한 의미를 갖습니다.]

F #, OCaml 또는 Haskell과 같은 언어의 유형 추론은 식 유형을 결정하는 방법의 일부입니다. 컴파일러가 식의 유형을 추론 할 수없는 경우 프로그램이 중단되고 컴파일되지 않습니다. 이러한 언어는 모두 Hindley-Milner 유형 추론의 어떤 형태를 사용합니다. 이는 명시 적 유형을 작성하지 않고도 코드 구조에서 표현식 유형을 파생시키는 매우 영리한 방법입니다 (유형이 다음과 같이 암시되는 동적 언어와 비교해보십시오. 코드 실행). 대부분의 경우 유형 어노테이션이 전혀 필요하지 않습니다. 이는 C ++, C # 및 Java와 같은 언어에서 필요할 수있는 장황한 유형 선언에 비해 상당히 즐겁습니다. 그러나 이것은 매우 다릅니다. 줄리아와 파이썬과 같은 동적 언어에서, 단순히 타입 어노테이션이 필요하지 않습니다. 표현식이 미리 결정된 타입을 갖지 않는 것이 완벽하게 허용되기 때문입니다. Hindley-Milner 언어에서는 C ++ 또는 Java 에서처럼 많은 유형을 작성할 필요가 없지만 모든 표현식에는 컴파일러가 계산할 수있는 미리 결정된 유형이 있습니다.

Julia의 컴파일러는 유형 추론을 수행하지만 매우 다릅니다. 모든 표현식이 추론 가능한 유형을 가질 필요는 없습니다. 컴파일러는 코드를 분석하여 표현식 유형을 예측하고 해당 정보를 사용하여보다 효율적인 기계어 코드를 생성합니다. 그러나 표현식의 유형을 결정할 수 없다면 별 문제가 아닙니다. 컴파일러는 런타임 유형 정보를 사용하여 어쨌든 작동하는 일반 코드를 내 보냅니다. Julia에서 대부분의 경우 유형 추론은 최적화 일뿐입니다. 코드가 포함되거나 포함되지 않은 상태에서 동일한 방식으로 작동하지만 성공적인 유형 추론을 사용하면 훨씬 빠르게 실행됩니다.


둘 다 사실입니다. Julia는 동적으로 입력되지만 잘 작성된 Julia 코드에서는 일반적으로 유형을 유추 할 수 있습니다. 가능한 경우 성능이 크게 향상되는 경우가 많습니다.

FAQ에서 이에 대한 몇 가지 논의가 있습니다 .


변수 :: type과 같은 형식을 지정하면 해당 변수를 정적으로 형식화 한 것으로 생각할 수 있지만 동적 형식이 지정됩니다 (컴파일러가 형식을 자동으로 추론 할 수없는 경우 성능이 향상됩니다).


다음은 Julia 프로그래밍 언어 시작하기 책 에서 발췌 한 것 입니다 .

호출 할 때 전달되는 매개 변수의 종류를 제한하기 위해 인수 유형을 표시하는 것도 유용 할 수 있습니다. 부동 소수점 숫자에 대한 함수 헤더는 함수 mult (x :: Float64, y :: Float64)처럼 보입니다. 이 함수를 mult (5, 6)로 호출하면 오류가 발생합니다. ERROR : 'mult'에는 mult (:: Int64, :: Int64)와 일치하는 메서드가 없어 Julia가 실제로 강력한 형식의 언어임을 증명합니다. 부동 소수점 인수에는 정수 매개 변수를 허용하지 않습니다.

다음은 책의 예제 함수입니다.

function mult(x::Float64, y::Float64)
  x * y
end
mult(5, 6) # raises an error
mult(5.0, 6.0) # => 30.0

책이 옳은지는 모르겠지만 다른 모든 답변과 모순됩니다.

참고 URL : https://stackoverflow.com/questions/28078089/is-julia-dynamically-typed

반응형