Java 컴파일 속도 vs Scala 컴파일 속도
나는 스칼라에서 한동안 프로그래밍을 해왔고 그것을 좋아하지만 한 가지 짜증나는 것은 프로그램을 컴파일하는 데 시간이 걸린다는 것이다.사소한 것 같지만 Java를 사용하면 프로그램에 작은 변경을 가할 수 있고 넷빈의 실행 버튼을 클릭하거나 BOOM이 실행 중이고 시간이 지남에 따라 스칼라로 컴파일 하는 데 많은 시간이 걸리는 것 같습니다.많은 대형 프로젝트에서는 컴파일 시간이 오래 걸리기 때문에 자바 사용 시에는 예상하지 못했던 요구로 스크립트 언어가 매우 중요해진다고 합니다.
하지만 제가 아는 바로는 자바에서 왔고, 다른 어떤 컴파일 언어보다 빠르고, Scala(매우 간단한 언어)로 바꾼 이유 때문에 빠릅니다.
scala 컴파일을 더 빠르게 할 수 있는지, scalac도 javac만큼 빠르게 할 수 있는지 묻고 싶었습니다.
Scala 컴파일러의 속도에는 두 가지 측면이 있습니다.
기동시의 오버헤드 증가
Scalac 자체는 로드 및 jit-compile해야 하는 많은 클래스로 구성됩니다.
Scalac은 클래스 경로에서 모든 루트 패키지와 파일을 검색해야 합니다.클래스 패스의 크기에 따라 1~3초가 더 걸릴 수 있습니다.
전체적으로 scalac의 시작 오버헤드는 4~8초로 예상되며, 처음 실행하면 디스크 캐시가 채워지지 않습니다.
스타트업 오버헤드에 대한 Scala의 답변은 fsc를 사용하거나 sbt를 사용하여 계속 빌드하는 것입니다.IntelliJ 는, 어느쪽인가를 사용하도록 설정할 필요가 있습니다.그렇지 않으면 작은 파일이라도 오버헤드가 비정상적으로 커집니다.
컴파일 속도가 느립니다.Scalac은 초당 최대 500회선을 관리합니다.Javac은 그 약 10배를 관리합니다.여기에는 몇 가지 이유가 있습니다.
유형 추론은 특히 암묵적 검색을 수반하는 경우 비용이 많이 든다.
Scalac은 Scala의 규칙에 따라 한 번, Java의 규칙에 따라 두 번 유형 검사를 수행해야 합니다.
타입 체크 외에 Scala에서 Java로 이행하기 위해서는 약 15개의 이행 단계가 있으며, 모두 시간이 걸립니다.
Scala는 일반적으로 Java보다 파일 크기당 훨씬 더 많은 클래스를 생성합니다. 특히 기능성 숙어가 많이 사용되는 경우입니다.바이트 코드 생성 및 클래스 쓰기에 시간이 걸립니다.
한편, 1000 회선의 Scala 프로그램은 2-3K 회선의 Java 프로그램에 대응하고 있는 경우가 있기 때문에, 회선/초 단위로 카운트 했을 때의 느린 속도의 일부와 회선/초당 기능성의 밸런스를 맞출 필요가 있습니다.
(예를 들어 클래스 파일을 병렬로 생성하는 등) 속도 향상에 임하고 있지만, 이 면에서는 기적을 기대할 수 없습니다.scalac은 javac만큼 빠르지 않습니다.최소한의 파일 세트만 재컴파일 할 수 있도록 fsc와 같은 컴파일 서버에 솔루션이 존재한다고 생각합니다.저희도 그거 하고 있어요.
Scala 컴파일러는 Java보다 더 정교하며, 유형 추론, 암묵적 변환 및 훨씬 더 강력한 유형 시스템을 제공합니다.이러한 기능은 무료로 제공되는 것이 아니기 때문에 scalac의 속도가 javac만큼 빠르지는 않을 것입니다.이는 작업을 수행하는 프로그래머와 작업을 수행하는 컴파일러 간의 트레이드오프를 반영합니다.
그러나 이미 Scala 2.7에서 Scala 2.8로 컴파일 시간이 눈에 띄게 개선되었으며, 2.8로 더스트 침체가 된 이상 개선은 계속될 것으로 예상됩니다.이 페이지에는 Scala 컴파일러의 퍼포먼스를 향상시키기 위한 현재의 대처와 아이디어가 기재되어 있습니다.
Martin Odersky는 그의 대답에서 훨씬 더 자세한 내용을 제공한다.
Scala 컴파일은 Java 컴파일보다 적어도 몇 배나 더 오래 걸립니다.그 이유는 다음과 같습니다.
- )
XY.scala에는 '클래스'라는 가 포함되어 됩니다.XY여러 개의 최상위 클래스를 포함할 수 있습니다).따라서 컴파일러는 주어진 클래스/트래빗/오브젝트 식별자를 찾기 위해 더 많은 소스 파일을 검색해야 할 수 있습니다. - 함축적 의미 - 함축적 의미를 많이 사용하는 것은 컴파일러가 특정 메서드에 대한 범위 내 암묵적 변환을 검색하여 적절한 메서드를 찾기 위해 순위를 매길 필요가 있음을 의미합니다(즉, 메서드를 찾을 때 검색 도메인이 크게 증가합니다).
- scala형 시스템은 Java형 시스템보다 훨씬 복잡하기 때문에 CPU 시간이 더 많이 소요됩니다.
- 추론 - 유형 은 계산 들고, 비용이 많이 드는 입니다.
javac할 가 없다 scalac에는 완전 무장 및 작동 가능한 전투 스테이션의 8비트 시뮬레이터가 포함되어 있으며, Gen 중 마법 키 조합 CTRL-ALT-F12를 사용하여 볼 수 있습니다.ICode 컴파일 단계
스칼라 IDEA SBT. SBT 를 셋업하여 모드(명령어 「SBT」)로 합니다.~compileSBT를 사용하다
또한 IDEA용 SBT 플러그인을 사용하여 각 실행 구성에 SBT 작업을 첨부할 수 있습니다.또한 SBT 플러그인은 IDEA 내에서 대화형 SBT 콘솔을 제공합니다.
어느 쪽(SBT 외부 실행 또는 SBT 플러그인)이든 SBT는 계속 실행되므로 프로젝트 구축에 사용되는 모든 클래스가 "워밍업"되고 JIT 및 시작 오버헤드가 제거됩니다.또한 SBT는 필요한 소스 파일만 컴파일합니다.이것은 Scala 프로그램을 구축하는 가장 효율적인 방법입니다.
Scala-IDE(Eclipse)의 최신 리비전은 증분 컴파일을 훨씬 잘 관리합니다.
자세한 내용은 "최고의 Scala 빌드 시스템이란?"을 참조하십시오.
또 다른 솔루션은 fsc - Scala 2 언어용 고속 오프라인 컴파일러 - (이 블로그 투고 그림 참조)를 IDE 빌더로 통합하는 것입니다.

그러나 다니엘 스피왁이 코멘트에서 언급했듯이 직접 Eclipse에서는 그렇지 않다.
Eclipse가 표면 아래에서 이미 FSC를 사용하고 있기 때문에 Eclipse 내에서 FSC를 직접 사용해서는 안 됩니다.
FSC는 기본적으로 상주 컴파일러 위에 있는 얇은 레이어이며, Eclipse가 Scala 프로젝트를 컴파일하기 위해 사용하는 메커니즘입니다.
마지막으로 Jackson Davis가 코멘트에서 상기시켜 주듯이
sbt(Simple Build Tool)에는 완벽하지는 않지만 일종의 "증분" 컴파일이 포함되어 있으며, 향후 0.9 sbt 버전에서는 향상된 증분 컴파일이 진행 중입니다.
fsc 사용 - 백그라운드 태스크로 항상 로드할 필요가 없는 고속 스칼라 컴파일러입니다.이전 컴파일러 인스턴스를 재사용할 수 있습니다.
Netbeans scala 플러그인이 fsc를 지원하는지(문서상으로는 그렇게 되어있지만) 알 수 없었습니다.플러그인의 야간 빌드를 시도합니다.
스칼라에서는 무료인 JRebel 플러그인을 사용할 수 있습니다.즉, "develope in debugger"라고 하면 JRebel은 항상 변경된 클래스를 즉석에서 새로고침합니다.
Martin Odersky가 직접 쓴 글을 읽은 적이 있습니다.그는 함축적인 검색(컴파일러는 모호한 부분을 배제하기 위해 같은 변환에 대해 암묵적으로 1개 이상 존재하지 않도록 해야 한다)이 컴파일러를 바쁘게 만들 수 있다고 말합니다.그러니 함축된 사건들을 조심스럽게 다루는 것이 좋은 생각일 수도 있습니다.
100% Scala일 필요는 없지만 비슷한 기능을 사용할 수 있다면 Kotlin에게 시도해 보십시오.
--올리버
이것은 분명히 낮은 투표가 될 것입니다만, 매우 빠른 회전이 항상 품질이나 생산성에 도움이 되는 것은 아닙니다.
시간을 들여 신중하게 생각하고 개발 마이크로 사이클을 줄입니다.좋은 스칼라 코드는 더 밀도가 높고 더 중요합니다(즉, 부수적인 세부사항과 복잡함이 없습니다).그것은 더 많은 생각을 필요로 하고 그것은 시간이 걸린다(적어도 처음에는.코드/테스트/디버깅 사이클을 줄여 개별적으로 조금 더 길게 진행하면서도 생산성과 작업 품질을 향상시킬 수 있습니다.
요약: Scala에 가장 적합한 최적의 작업 패턴을 찾습니다.
언급URL : https://stackoverflow.com/questions/3490383/java-compile-speed-vs-scala-compile-speed
'source' 카테고리의 다른 글
| Google MAP API Uncatched TypeError: null의 속성 'offsetWidth'를 읽을 수 없습니다. (0) | 2023.02.04 |
|---|---|
| mariadb on fedora의 기본 비밀번호는 무엇입니까? (0) | 2023.02.04 |
| require_once의 상대 경로가 작동하지 않음 (0) | 2023.02.04 |
| MySQL tinyInt에서 인덱싱할 수 있습니까? (0) | 2023.01.25 |
| MySQL phpMyAdmin: 오류 #1932 - 엔진에 테이블이 없습니다. (0) | 2023.01.25 |