Google Closure는 진정한 컴파일러입니까?


19

이 질문은 이 스택 오버플로 질문 에 대한 주석의 토론에서 영감을 얻었습니다 . 구글 폐쇄 컴파일러 설명서는 (강조 추가) 다음 상태 :

Closure Compiler는 JavaScript 다운로드 및 실행 속도 향상을위한 도구입니다. JavaScript를위한 진정한 컴파일러입니다. 소스 언어에서 기계 코드로 컴파일하는 대신 JavaScript에서 더 나은 JavaScript로 컴파일됩니다.

그러나 Wikipedia 는 다음과 같은 "컴파일러"정의를 제공합니다.

컴파일러는 프로그래밍 언어 (소스 언어) 작성된 소스 코드 를 다른 컴퓨터 언어로 변환하는 컴퓨터 프로그램 (또는 프로그램 세트)입니다 . 언어 리 라이터는 일반적으로 언어.

이를 바탕으로 Google Closure는 컴파일러가 아니라고 말합니다. 그러나 구글이 실제로 "진정한 컴파일러"라고 명시한다는 사실은 더 많은 것이 있는지 궁금하게 만듭니다. Google Closure는 실제로 JavaScript 컴파일러입니까?


2
나는 그것이 출력하는 JS가 모든 합법적 인 JS의 적절한 서브 세트라고 확신한다. 이런 의미에서 출력 언어 "또 다른"언어입니다.
AakashM

답변:


23

클로저 컴파일러는 축소 기 , 최적화 기 유효성 검사기 일체형입니다. 컴파일러는 적어도 현재 형식으로 실행되지 않는 것을 가져 와서 ( ECMAScript 기반 예제의 경우 TypeScript 를 가져야 함) 컴파일러로 변환해야한다는 것이 정확하기 때문에 그런 종류의 범주를 자체 범주에 넣습니다 .

그러나 용어를 늘리는 것에 대해 Google을 비난하십니까? 그들은 또 무엇을 부를 것인가? Google Minifier? 아니, 그 이상이고 거기에는 수백 명의 사람들이 있습니다. 구글 옵티 마이저? 그 이상입니다. Google 검사기? 아니, 그것보다 훨씬 더.

그래서 선택은

  • 구글 클로저 푸글 (Google Closure Foogle)이라고 부르며 사전에 의미없는 새로운 단어를 소개합니다.
  • Google Closure Minoptivalidator라고 부릅니다. 의도는 명확하지만 기억하기는 어렵습니다.
  • 진실에 가까운 구글 클로저 컴파일러라고 부릅니다.

의미 론적 차이만으로 컴파일러가 기대하는 모든 것을 수행합니다. 그리고 결국 모든 단어는 사용법에 따라 어느 정도 정의됩니다. 따라서 Google에서 사람들이이 컴파일러를 컴파일러라고하도록 설득 할 수 있으면 컴파일러 정의가 약간 변경됩니다. 확실히 어떤 식 으로든 문제를 일으킬 수는 없습니다.

또는 이전 예제로 돌아가려면 TypeScript에서 "진정한 컴파일러"라고 할 수있는 중요한 것을 찾을 수 있지만 Google Closure Compiler는 "거의 컴파일러"로 제한해야합니까?


문제의 핵심은 사람들이 "컴파일러"로 보는 것을 실제로 보는 것이 었습니다. 0A0D에서 언급했듯이 그것은 의미 론적이지만 Google이 왜 그것이 "진정한 컴파일러"인지 명확히해야 할 필요성을 느꼈는지 궁금합니다. "Minoptivalidator"에 +1!
James Allardice

@JamesAllardice : 다시 말하지만, 사람들에게 그것이 컴파일러라는 것을 설득 할 수 있다면 컴파일러의 정의가 그것을 포함하도록 확장되기 때문입니다. 그리고이 경우에는 그것이 정말로 공정해야합니다. 세마 틱 라인으로 컴파일러에서 분리하는 새 단어를 정의하면 제품이 "거의 아니지만 그리"분류되지 않습니다.
pdr

1
몰라요, "Google Foogle"을 좋아합니다 :-)
GrandmasterB

9
에 투표합니다 Minoptival. 공룡처럼 들립니다. 모두 공룡을 좋아합니다.
이즈 카타

2
@Izkata : 진화의 역사가 우리에게 가르쳐 준 것이 있다면, 자바 스크립트가 포함되지 않을 것입니다. Javascript는 무료로 제공되며 새로운 지역으로 확장되며, 장벽을 통해 고통스럽게, 심지어는 위험 할 수도 있습니다.
pdr

9

이를 바탕으로 Google Closure는 컴파일러가 아니라고 말합니다.

그렇습니다 ...하지만 그것은 Wikipedia 가이 시점에서 권위 있다고 가정합니다.

Wikipedia 정의에 대한 대응책으로 일부 사전 정의 ( http://www.thefreedictionary.com/compiler )를 고려 하십시오 .

2) (컴퓨터 과학) -고급 언어로 작성된 다른 프로그램을 기계어로 번역하여 실행할 수있는 프로그램입니다.

2) (Electronics & Computer Science / Computer Science) COBOL 또는 FORTRAN과 같은 고급 프로그래밍 언어가 컴퓨터에서 작동 할 수있는 기계 언어로 변환되는 컴퓨터 프로그램.

해당 언어로 작성된 명령어를 나중에 컴퓨터에서 직접 실행할 수있는 기계 코드로 변환하는 특정 프로그래밍 언어와 관련된 컴퓨터 프로그램입니다.

이러한 정의는 모두 구식이지만, "하나의 진정한 의미"가 없다는 것을 보여줍니다 ... 실제로 "컴파일러"와 같은 용어의 의미는 시간이 지남에 따라 변경됩니다. (그리고 IMO는 이 경우에 대한 정확한 정의 가 필요 하지 않기 때문에 괜찮습니다 .)

클로저 컴파일러가 "진정한 컴파일러"인지 아닌지에 대한 토론은 (IMO) 유익한 활동이 아닙니다. 그 맥락에서 "진정한 컴파일러"라는 구글 사람들의 의미 를 이해하는 것이 더 유용 할 것 입니다.


2
+1, 아이러니하게도, JS는 웹의 '기계 언어'이자 '고수준 프로그래밍 언어'입니다.
K.Steff

3
+1, '이 시점에서 위키 백과가 권한이 있다고 가정합니다.' 거기에 쓰여지는 모든 것을 맹목적으로 받아들이는 사람들이 너무 많습니다.
Marjan Venema

6

"실제 컴파일러"라고 할 수있는 이유는 프로그램에서 완전한 AST (추상 의미 트리)를 작성하고이를 사용하여 새 텍스트를 생성하기 때문입니다.

원본 텍스트와 결과 텍스트가 모두 유효한 JavaScript라는 사실은 단순한 우연의 일치입니다.

코드의 텍스트 조작 만 할 수있는 도구 (minifier, prettifier 등)는 많지만 AST 처리는하지 않고 코드 재생성이 훨씬 적기 때문에 중요합니다. 이러한 도구가 점점 강력 해지더라도 동일한 종류의 소프트웨어가 아니며 한계가 다릅니다.


1
고마워, 이것은 흥미로운 답변입니다. 귀하의 설명이 Wikipedia와 다른 사람들이 인용 한 다양한 사전보다 "컴파일러"에 대한 더 나은 정의를 제공 할 수 있다고 생각합니다.
James Allardice

글쎄, 나는이 답변을 좋아하고 어느 시점에서 투표를했지만 AST를 작성하지 않고 (전통적인 고급 언어 대 기계 언어 감각으로) 컴파일하는 것이 가능하다는 점에 주목할 것입니다. 예를 들어 , 컴파일러 작성하기를 참조하십시오 . 이제 Crenshaw의 튜토리얼에서 나온 컴파일러가 매우 조잡한 것은 사실이지만 어느 누구도 컴파일러가 아니라고 비난하는 것은 아닙니다.
dmckee

나는 그 참조를 읽지 못했지만 명시적인 AST가 컴파일에 꼭 필요한 것은 아니라는 데 동의합니다. 여전히 대부분의 경우 데이터에 명시 적이거나 실행에 암시적인 등가 구조가 있습니다 (콜 스택 (또는 시간의 진화)에 구문 분석이 반영 될 수 있음). 내 주요 요점은 컴파일은 텍스트 조작이 아니라 일부 소스 코드 분석에서 코드를 생성하는 것입니다.
Javier

4

내 의견으로는 의미 론적입니다. 전통적인 의미에서 이것은 컴파일러가 아닙니다. 그러나 동일한 Wikipedia 링크에서

컴파일러는 어휘 분석, 사전 처리, 구문 분석, 의미 분석 (구문 지향 변환), 코드 생성 및 코드 최적화와 같은 많은 작업을 수행 할 수 있습니다.

폐쇄는 이러한 작업 중 일부 또는 전부를 수행합니다.

Wikipedia 기사에서 조금 더 아래로

그러나 실제로는 언어를 배타적으로 해석하거나 배타적으로 해석해야하는 언어는 거의 없지만 런타임에 재 해석에 의존하는 언어를 디자인 할 수는 있습니다.

즉 , "Closure Optimizer"가 아닌 " Closure Compiler " 라고 부르는 것이 더 쉽다는 것입니다. 왜냐하면 실제로 브라우저는 JavaScript를 다른 언어 나 바이트 코드로 변환 할 필요가 없기 때문에 브라우저에 맞게 JavaScript를 최적화하기 때문입니다.

명사로서의 클로저 컴파일러는 비평 행 입니다.


그것은 의미론 일뿐입니다. 문제의 요점은 사람들이 "컴파일러"를 어떻게 보는지를 보는 것입니다. 클로저 컴파일러는 여전히 "진정한 컴파일러"라고 생각하지 않지만 많은 유사한 동작을 수행합니다.
James Allardice

3

먼저 소스-소스 컴파일러가 존재하지 않는 방식으로이를 제거하십시오. 최종 결과가 낮은 수준의 코드가 아니기 때문에 무언가 컴파일러가 아니라고 말할 수는 없습니다.

Closure Compiler가 AST를 생성하고 코드 생성 문구를 사용하는 것이 맞지만 많은 Javascript 최소화 프로그램은 이미 그렇게하고 있으며 컴파일러라고도하지 않습니다.

Closure Compiler를 진정으로 차별화시키는 것은 오류 감지 및 최적화에 잘 알려진 많은 컴파일러 기술을 적용한다는 것입니다. 여기 몇 가지 예가 있어요.

타입 시스템 :

폐쇄 컴파일러는 주석이 달린 유형 시스템을 정의합니다. 많은 컴파일러가 프로그램에서 오류를 확인하는 데 사용하는 형식 유추 기술을 사용합니다.

절차 적 최적화

Closure Compiler는 호출 그래프를 작성하여 전체 프로그램 레벨에서 데드 코드의 이름을 바꾸고 제거합니다.

절차 내 최적화

Closure Compiler는 데이터 흐름 분석뿐만 아니라 다른 제어 흐름 분석을 적용하여 Javascript를 최적화합니다. 인라이닝, 레지스터 할당, 라이브 변수 분석 등과 같은 고전적인 컴파일러 기술과 그 밖의 많은 바이트가 출력 자바 스크립트에서 마지막 바이트를 짜내기 위해 사용됩니다.

모듈 시스템

빠른 시작 시간을 위해 코드를 별도의 다운로드로 나누는 데 사용할 수있는 Closure Compiler의 덜 알려진 부분입니다. 많은 그래프 알고리즘도 사용합니다. "전통적인"컴파일러에서도 매우 일반적입니다.

이러한 모든 컴파일러 및 정적 분석 기술은 Closure Compiler를 다른 Javascript 최소화 기와 차별화하는 것입니다. 대상 입력 언어와 출력 언어가 동일하다는 사실에서 벗어나서 왜 이것이 "진정한 컴파일러"로 분류되지 않았는지 알 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.