이 문장의 의미는 "우리는 그것을 컴파일하여 CPU가 잘못된 일을하지 않도록하기를 원했습니다."


10

나는 기사를 읽고 있었다 . 다음과 같은 단락이 있습니다.

스칼라는 빠른 것으로 밝혀 졌습니까? 글쎄, 당신의 빠른 정의는 무엇입니까? Java만큼 빠릅니다. C 나 어셈블리만큼 빠를 필요는 없습니다. 파이썬은 루비보다 빠르지 않습니다. 우리는 동시성을 더 잘 활용하면서 더 적은 수의 기계로 더 많은 것을 원했습니다. 우리는 그것을 컴파일하여 CPU가 잘못된 일을하지 않도록하고 싶었습니다.

나는 마지막 문장의 의미를 찾고 있습니다. 해석 된 언어는 어떻게 CPU가 "잘못된"작업을하게합니까?


3
해석 된 JVM 바이트 코드로 컴파일되는 모든 것을 호출하는 것은 사용법에 약간 자유 롭습니다.
Rig

답변:


47

코드가 말한다면

A = A + 1

컴파일 된 코드는 이것을 수행합니다

add A, 1

해석 된 코드가이를 수행합니다 (또는 일부 변형).

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

아이디어를 얻을?


3
때로는 지나친 단순화 정말 않는 그림이 명확 ;-) 수 있도록 (단지 전체로 : 많은 잘 알려진 통역 최적화 일부 가 두 개의 샘플 "구현"여기의 중간 그래서 멀리 단계 참조).
Joachim Sauer 2018 년

3
@JoachimSauer : 물론입니다. 컴파일 된 코드에 비해 10 배 이하의 속도로 인터프리터를 실행하는 것은 여전히 ​​어렵습니다. 언어가 수학 라이브러리 나 I / O와 같이 어쨌든 호출되어야하는 하위 컴파일 함수에서 실제로 시간을 보내는 언어라면 해석 비용은 문제가되지 않습니다.
Mike Dunlavey 2016 년

1
이것은 놀라운 설명입니다
Jamie Taylor

13

우리는 그것을 컴파일하여 CPU가 잘못된 일을하지 않도록하고 싶었습니다.

그들이 컴파일되고 해석 된 것을 말하는 것처럼 들립니다. Ruby On Rails에서 처음 개발 된 후 백그라운드 처리 작업을 Scala (컴파일)로 옮기는 Twitter의 전체 이야기로 해석됩니다.

컴파일 된 코드와 해석 된 코드에 대한 설명은 여기에 있습니다 .

컴파일 된 언어를 사용하면 사용자가 입력 한 코드가 실행 파일로 저장되기 전에 기계 별 명령 세트로 축소됩니다. 해석 된 언어를 사용하면 코드는 입력 한 것과 같은 형식으로 저장됩니다. 해석 된 프로그램은 런타임에 기계 명령어로 줄여야하기 때문에 컴파일 된 프로그램은 일반적으로 해석 된 프로그램보다 빠르게 실행됩니다.


첫 번째 +1을 제공하게되어 기쁩니다. P.SE에 오신 것을 환영합니다!
haylem

4
(Scala는 JVM에있는 것처럼 기술적으로 바이트 컴파일 된 것임)을 언급 할 가치가 있습니다.
haylem

스칼라는 JVM 기반인지 몰랐다. 아마도 JIT가 컴파일되었음을 의미합니다. 어떤 경우에 Twitter가 왜 Ruby on Rails에서 JRuby로 이동하지 않았습니까? 컴파일 된 이점을 통해 더 쉬운 마이그레이션이 될 것이라고 생각할 것입니다.
KrisG

3
또한 더 나은 동시성 모델을 찾고 있었고 Ruby의 가비지 수집에 문제가있었습니다. 기사에서 자세히 설명합니다.
scrwtp

9

여기서 "잘못된 것"은 인터프리터가 코드를 구문 분석하고 처리하는 데 걸리는 오버 헤드를 의미합니다. 해석 된 언어와 컴파일 된 언어의 개념과 관련이 있습니다. 사용중인 몇 가지 코드 변환 모델이 있으며 대략 다음 범주 중 하나에 속합니다.

  • 네이티브 컴파일-소스 코드는 머신 코드로 직접 컴파일됩니다. 휴대 성을 희생하면서 최고의 성능. 일반적으로 C 및 C ++과 연관되어
  • 중급 컴파일-소스 코드는 단순화 된 중개 언어 (바이트 코드)로 컴파일되며, 나중에 실행 중 기계 코드로 해석되거나 컴파일됩니다. 네이티브 코드보다 더 나은 이식성, 순수 해석보다 성능이 향상되는 동시에 해석의 단점을 유지합니다 (후기 바인딩과 같은). 예를 들어 C #, Java 및 JVM 및 .NET CLR을 대상으로하는 다른 언어,
  • 해석-소스 코드는 기계 코드로 직접 변환되지 않고 전용 인터프리터 프로그램에서 해석 및 실행됩니다. 통역사는 정교함이 다양하지만 순진한 구현에서는 한 줄씩 소스 코드를 구문 분석, 분석 및 실행하는 것으로 요약됩니다. 해석은 컴파일보다 더 큰 유연성을 허용하므로 해석 된 언어는 예를 들어 동적 타이핑 또는 리플렉션을 더 많이 사용합니다. 해석 된 언어는 종종 상용구 코드가 적고 빠른 프로토 타입 제작에 능숙하기 때문에 개발자 생산성을 향상시키는 것으로 간주됩니다. 단점은 성능이 저하 된 것입니다. 일반적으로 JavaScript, Ruby 또는 Python과 연관됩니다.

따라서 해석 언어와 컴파일 언어 중 하나를 선택하면 문제는 무엇이며, 개발자의 생산성이나 성능은 무엇입니까? 이 기사에서 설명하는 마이그레이션은 성능 고려 사항으로 인해 강력한 프로토 타입 언어 Ruby가 JVM 기반 스칼라로 대체 된 것과 동일한 생각을 따르는 것으로 보입니다.


-1 대답이 표현되는 방식이 너무 단순 해 보입니다. JIT ( Just-In-Time Compilation ) 와 같은 것을 완전히 무시 합니다. 스칼라가 JVM / CLR을 실행하는 방식
gnat

진실. 답을 다시 쓰면 주제에 거의 추가되지 않았습니다.
scrwtp

-3

이 경우 the wrong stuff컴파일되지 않은 코드에서 형식 안전성이 부족함을 의미했습니다.

따라서 코드가 느리게 해석 될뿐만 아니라 더 버그가 있습니다 ...


8
컴파일 된 언어는 형식이 안전하고 해석 된 언어는 안전하지 않다고 가정합니다. 예를 들어 lisp를 컴파일 할 수 있고 강력하게 타입을 지정할 수없는 반면 Haskell을 해석 할 수 있고 매우 타입이 안전합니다
Zachary K

1
"더 안전하지 않은"과 "더 안전하지 않은"을 동일시하는 것은 판매 할 제품을 가진 사람들이 밀어내는 FUD입니다.
user16764

1
@ user16764 : 사실이라면 FUD가 아닙니다. IME를 사용하여 제품을 판매하기 위해 넌센스를 강요하는 사람들은 동적 타이핑과 오류 사이의 연결을 무시하려고 시도하는 사람들입니다. ( " 한 가지 유형의 오류 일뿐 입니다 "등)
Mason Wheeler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.