컴파일러는 개발 외부에서 사용됩니까?


14

내가 이해하는 한, 컴파일러는 개발자가 코드를 실행 가능한 (기계 코드) 파일로 컴파일하는 개발자를위한 것입니다. 컴파일러는 클라이언트 시스템 또는 최종 사용자 시스템으로 확장되지 않습니다.

대신 개발자는 컴파일러를 사용하여 코드를 기계 코드로 변환 한 다음 응용 프로그램으로 사용하기 위해 다른 기계로 전송합니다.

컴파일러는이 프로세스 이외의 기능을 가지고 있습니까? 그렇다면 언제 사용됩니까?


21
예, 컴파일러는 코드를 컴파일합니다.
Tom Squires

@Tom : C 컴파일러가 게임 콘솔을 포함한 다양한 컴퓨터에 설치되어 있다고 읽었습니다. 이것은 우리가 C로 코드를 작성한 다음 컴파일러에 의해 컴파일 된 다음 인터프리터에 의해 실행되는 장치로 배송된다는 것을 의미합니까?
Pankaj Upadhyay

3
@Pankaj Upadhyay : 코드 컴퓨터로 전송 된 다음 내부 프로세스에 의해 컴파일 될 수 있습니다. 장치 사용자가 이런 일이 발생하거나 알지 못할 것입니다. 특정 하드웨어에 대해 코드의 일부를 컴파일해야하고 런타임에 하드웨어를 테스트하는 솔루션이 너무 느려서 설치 중에 코드를 배포하고 컴파일해야하는 경우에 수행 될 수 있습니다. 아마 ...
FrustratedWithFormsDesigner

3
@Pankaj 컴파일러와 함께 제공되는 게임 콘솔은 없지만 일부 콘솔을 설치할 수 있습니다. 소니는 예를 들어 PS2에 설치할 수있는 Linux 및 GCC 버전을 제공했습니다. 다른 사람들은 다른 OS와 소프트웨어를 콘솔로 가져 오는 길을 깨뜨 렸습니다.
IronMensan

4
@Stargazer : "아니요, 컴파일러는 소스 언어에서 대상 언어로 번역합니다"? 쉼표를 생략하면 문장이 의도 한 의미와 반대되는 의미가됩니다.
Daniel Pryden

답변:


19

예, 아니오 그렇습니다. 고전적인 시나리오는 컴파일러를 사용하여 소스 코드에서 기계 코드를 생성 한 개발자이며 기계 코드는 사용자에게 배포됩니다.

있습니다 이 생각에 몇 가지 예외. 첫째, 많은 오픈 소스 프로젝트는 주로 소스 코드 형태로 (또는 독점적으로) 배포되며, 최종 사용자는 make다음 과 같은 몇 가지 명령을 입력하여 설치해야합니다.make intall. 그러면 컴파일러, 링커 등이 호출되어 해당 사용자 컴퓨터의 소스 코드에서 기계 코드가 생성됩니다. 그러나 이러한 경우, 빌드 및 설치 프로세스는 사용자가 이전에 소스 코드 전용 패키지를 설치 한 적이없는 경우를 제외하고는 사용자가 그에 대한 지식을 거의 필요로하지 않을 정도로 자동화되어야합니다 (적어도 의도적으로). 패키지 관리자는 일반적으로 일부 "개발"패키지를 실제로 관심이있는 응용 프로그램을 설치하기위한 전제 조건으로 나열합니다 (일부는 여전히 최종 사용자에게는 비우호적 인 것으로 간주 됨).

또 다른 예외 (내가 본 다른 답변에서 잘 설명되었지만 잘 설명되지 않은)는 JIT (Just-In-Time) 컴파일러입니다. JIT 컴파일러의 몇 가지 명백한 예는 Microsoft CLR (Common Language Runtime) 및 JVM (Java Virtual Machine)입니다. 이 경우 일반적으로 소스 코드를 기계 코드로 변환하는 데는 완전히 별개의 컴파일러가 있습니다. 하나는 개발자가 사용합니다. 그러나 머신 코드를 직접 생성하는 대신 머신 독립 바이트 코드를 생성합니다. 그런 다음 CLR / JVM에는 첫 번째 코드와 완전히 분리 된 두 번째 컴파일러가 포함되어있어 해당 바이트 코드를 대상 컴퓨터의 기계 코드로 변환합니다.

두 번째 컴파일러가 꼭 필요한 것은 아니라고 덧붙여 야합니다. 예를 들어 JVM의 초기 버전은 바이트 코드를 컴파일하는 대신 해석했습니다. 이것은 종종 상당히 심각한 성능 저하를 초래하므로 프로덕션 용도로 사용되는 가장 합리적인 최신 JVM에는 JIT 컴파일러가 포함됩니다.


24

예, 컴파일러는 주로 몇 가지 예외를 제외하고 개발자가 사용합니다. 최종 사용자는 때때로 컴파일러를 사용하여 코드를 변경하지 않더라도 최신 오픈 소스 소프트웨어를 컴파일하고 설치합니다. 또한 일부 프로그래밍 언어에는 컴파일러가 없습니다. 대신 "컴파일"하는 인터프리터를 사용합니다. 이 경우 최종 사용자는 자신의 컴퓨터에 인터프리터를 설치해야합니다.


4
실행 파일을 생성하는 프로그램을 의미하도록 "컴파일러"의 정의를 제한해야한다면 좋은 대답이 될 것입니다. 그러나 이것은 "컴파일러"의 진정한 정의의
일부일뿐입니다.

16
@ Jan Soltis : 동의하지 않습니다. 소스에서 Linux 커널을 컴파일했습니다. 즉, Linux 커널 개발자 라는 의미 입니까? Linux 커널 코드를 수정하거나 패치를 제출 한 적이 없습니다 . 즉, 저는 커널 개발자가 아닙니다 . 또한 몇 년 동안 Gentoo를 기본 운영 체제로 사용 하면서 컴퓨터의 모든 단일 소프트웨어를 컴파일했습니다 . 그러나 대부분은 포티지 패키지 관리 시스템에 의해 자동으로 컴파일되었습니다. 이 경우 개발자가 아닌 최종 사용자 역할을하고 있다고 주장합니다 .
Daniel Pryden

8
@ Jan Soltis : 나는 그것이 당신의 의견임을 알고 있습니다. 나는 정중하게 동의하지 않습니다. 나는지지하지 않는 주장을하는 동안 내 입장을 뒷받침 할 반론을 제시했다. 내가 생각하지 못하는 "개발자"와 "최종 사용자"사이에는 뚜렷한 선이 있다고 생각하는 것 같습니다.
Daniel Pryden

6
소스를 다운로드 한 다음 "make install"을 실행하는 것은 개발자가 아닙니다. 확실히 최종 사용자 작업입니다.
Kristopher Johnson

3
@ Jan : 패키지를 컴파일하는 Gentoo와 같은 배포판을 사용하면 최소한 파워 유저가되지만 여전히 분명히 사용자 유형이라는 것을 받아 들일 수 있습니다. 다른 사람의 코드를 수정하거나 추가하거나 읽지 않아도 다른 사람의 코드를 컴파일한다고해서 개발자가되는 것은 아닙니다.
Carson63000

10

컴파일러는 한 언어에서 다른 언어로 코드를 변환하는 프로그램으로 정의됩니다 ( Wikipedia 참조 ). 컴파일러의 가장 일반적인 용도 는 소스 언어를 기계어 코드로 변환하는 것이지만 "컴파일러"라는 단어를 정의합니다.

예를 들어, 파이썬은 모듈을 가져올 때 바이트 코드를 생성하므로 컴파일러의 정의에 적합합니다 (소스 언어 인 Python에서 대상 언어 인 Python 바이트 코드로 변환하기 때문에).

또 다른 예는 V8 JavaScript 엔진입니다. 그것은 86 기계 코드로 자바 스크립트로 변환 , 따라서 컴파일러의 정의에 맞는뿐만 아니라. V8은 컴파일러의 정의에 적합 할뿐만 아니라 Chrome에 포함되어 있으며 클라이언트 시스템에서 매우 널리 사용됩니다.


4

런타임에 코드를 동적으로 생성 한 다음 생성 된 코드를 실행하는 응용 프로그램의 경우가 있습니다. 이 코드는 런타임에 컴파일해야합니다.

편집 : 다른 예외가 있지만 이미 다른 답변에서 언급되었습니다.


+1 그냥 JIT
gnat

1
Chrome의 V8 엔진은 이상한 예외가 아닙니다.
riwalk

명확히하기 위해 업데이트되었습니다. 다른 예외가 있다는 것을 알고 있습니다.
Morgan Herlocker

3

컴파일러는 프로그래밍 언어 코드를 실행 파일 (machin-code) 파일로 컴파일하는 개발자를위한 것입니다.

"컴파일러는 개발자에게 가장 중요한 요소입니다."라고 말합니다. 그러나 프로그램이 즉시 새로운 프로그래밍 언어 코드를 생성하므로 최종 사용자 컴퓨터에 컴파일러를 설치해야하는 예를 보았습니다. 그렇다고 최종 사용자가 컴파일러 자체를 다루어야하는 것은 아닙니다.

이 프로그램 디자인의 가능한 이유 :

  • 성능 : 규칙이 어떤 종류의 최종 사용자 데이터 저장소에 저장되고 이러한 규칙으로 처리 할 대량 데이터가있는 규칙 중심 응용 프로그램을 생각해보십시오. 규칙을 반복해서 해석하는 대신, 프로그램은 먼저 처리 코드를 생성하고 컴파일하여 처리 할 데이터에 대해 실행합니다.

  • 최종 사용자가 어떤 종류의 수학 공식을 추가 할 수 있고 프로그램 개발자는이를 위해 자신의 파서 / 인터프리터를 구현하고 싶지 않은 프로그램을 생각해보십시오. 대신, 프로그램은이 공식을 사용하여 유효한 프로그램 코드로 변환하여 컴파일러가 컴파일하고 나중에 실행할 수 있도록 추가합니다.


hmm .. 최종 사용자가 컴파일러 자체로 작업해야한다는 의미는 아닙니다 . 그것은 거의 설명하고 명확히합니다.
Pankaj Upadhyay

2

맞습니다. 컴파일러는 소스 코드를 실행 가능한 형식으로 컴파일 한 다음 링커에 의해 실행 가능한 이진 파일에 연결됩니다. 소스 코드는 많은 명령 줄 쉘 중 하나 (C-shell, bash, zsh 등), awk, sed 등과 같은 인터프리터에 의해 직접 실행될 수도 있습니다.

토론을 특정 제품으로 제한하지 않으면 "개발자"와 "최종 사용자"사이에 명확한 선을 그리는 것이 어려울 수 있습니다. 개발자는 모두 사용하는 도구의 "최종 사용자"이며 "최종 사용자"는 컴퓨터에 컴파일러 및 인터프리터와 같은 개발 도구가 설치되어있을 수 있습니다.


2
좋아, 나는 컴파일러에 대해 많은 오해가 있기 때문에 이것을 -1로 할 것이다. 컴파일러는 소스 언어의 코드를 대상 언어로 변환합니다. 기계 코드를 생성한다는 것은 차량에 4 개의 바퀴가 있다고 말하는 것과 비슷합니다 (예, 대부분의 차량에는 4 개의 바퀴가 있지만 오토바이는 차량이기도합니다) 같은 방식으로 대부분의 컴파일러는 기계 코드를 생성하지만 C #-> VB 변환기는 컴파일러도)
riwalk

1
@ Stargazer712, 오해 가 없음을 확신합니다 . 컴파일러가하는 일을 매우 잘 알고 있습니다. 감사합니다. 그러나 모르는 사람이 나에게 자동차가 무엇인지 묻는다면, 아마도 일부는 그렇지 않다는 사실에도 불구하고 자동차에 4 개의 바퀴가 있다고 말할 것입니다 . pedantic 정의는 종종 개념을 이해하려고 시도하는 사람에게 설명하는 것보다 더 혼동됩니다. "컴파일러"는 작업 설명 일 수도 있지만 여기서 언급하는 것은 도움이되지 않습니다.
Caleb

1

또한 관리자는 다양한 자동화 된 작업을 수행하기 위해 스크립트를 작성할 때 프로그래밍 언어를 사용해야 할 수도 있습니다. 예를 들어, 디스크 공간을 확보하기 위해 90 일 후에 서버에서 오래된 로그 파일을 삭제하는 스크립트가 있습니다. 스크립트를 작성하는 데 사용되는 언어는 시스템에서 실행될 수 있도록 해석되거나 컴파일되어야합니다.


1

일부 프로그램은 메타 프로그램입니다 . 실행하는 동안 다른 프로그램 (또는 일부 소스 코드)을 생성하고 컴파일 한 다음 어떻게 든 실행할 수 있습니다. 다단계 프로그래밍에 대해서도 읽어보십시오 .

따라서 이러한 종류의 프로그램을 사용하려면 사용자가 자신을 프로그래밍하는 방법을 모르더라도 (컴퓨터가 컴파일해야하는 코드를 생성하기 때문에) 컴파일러가 필요합니다.

예를 들어, 참조 MELT (확장하는 C ++ 코드를 생성 GCC 또는 J.Pitrat의) CAIA (C의 -notably 코드 조합 문제를 해결하기 위해 자신의 코드 코드를 생성) 인공 지능 시스템을.

또한 일부 언어와 일부 구현에서는 거의 모든 곳에서 해당 언어 및 구현으로 코딩 된 모든 프로그램에 컴파일러가 있어야합니다. 먼저, 일부 웹 브라우저에는 Javascript JIT 엔진 (예 : V8 )이 포함되어 있습니다 . 또한 대부분의 Common Lisp 구현 (예 : SBCL) 에는 컴파일러가 포함되어 있습니다 ( 표현식을 생성하고 평가할 수있는 응용 프로그램을 실행하는 데 유용함 ). 호모 닉 언어Qine 프로그램에 대해서도 읽어보십시오 .

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