“언어 A가 언어 B로 작성되었다”는 것은 무엇을 의미합니까?


31

나는 종종 언어 A가 언어 B로 쓰여졌다는 용어를 듣습니다. 예를 들어, PHPC로 , C #C ++ 로 작성되었습니다 .

누군가 그것이 그 의미가 무엇인지, 심지어 올바른지 설명해 주시겠습니까? 언어에서 사용하는 인터프리터 컴파일러와 관련이 있습니까?

또한 구현 언어 선택의 기반이되는 요소는 무엇입니까?


19
엄밀히 말하면, "PHP는 C로 작성되었습니다"는 잘못되었습니다. 언어 자체는 공식적인 정의이므로 다른 프로그래머 언어로 작성되지 않고 영어로 작성됩니다. 컴파일러, 인터프리터 및 / 또는 라이브러리 만 C, C ++ 등으로 작성할 수 있습니다. 실제로, 많은 언어의 경우 지배적 인 컴파일러 또는 인터프리터가 있으며 언어 정의와 구현 사이의 구별은 이루어지지 않습니다.
user281377

흥미롭게도 BCPL은 대부분 BCPL에서 작성되었습니다
OldCurmudgeon

7
PHP "자체"는 공식적인 정의가 아닙니다. C 프로그램입니다.
Kaz

8
s/written/implemented/훨씬 더 명확합니다.
TMN

2
@ugoren 어셈블리로 작성된 많은 C 컴파일러가있었습니다. 그러나 이번 세기에는 그리 많지 않습니다.
로스 패터슨

답변:


30

대부분의 프로그래밍 언어는 해석 언어와 컴파일 언어의 두 가지 범주로 나뉩니다.

컴파일 된 언어는 컴파일러 에 의해 머신 코드 로 변환되며 CPU는 단계별로 직접 실행하는 언어입니다. 반면에, 해석 된 언어는 중개자 인 통역사를 사용 하여 언어 코드를 실행합니다. 인터프리터 자체는 일반적으로 기계 코드로 컴파일 된 다른 프로그램입니다.

PHP는 해석 언어입니다. PHP 코드 를 실행하려면 별도의 프로그램이 필요합니다 . 컴퓨터는 프로그램을 직접 실행하지 않습니다. 별도의 프로그램 인 PHP 인터프리터 자체가 C로 작성되었습니다.

C #은 컴파일 된 언어이지만 기계 코드로 컴파일되지는 않습니다. 대신 가상 시스템에서 실행되도록 특수 언어 인 바이트 코드로 컴파일됩니다. Java는 이러한 설정의 또 다른 예입니다. 가상 머신이 인터프리터 인 컴파일과 해석의 하이브리드로 볼 수 있습니다. C # 용 가상 머신 (CLI 또는 공용 언어 인프라 )은 C ++로 작성됩니다.

다른 예는 다음과 같습니다.

  • Python : Python 인터프리터는 Python 코드를 Python 바이트 코드로 컴파일 한 다음 바이트 코드를 해석합니다. 인터프리터 자체는 C로 작성되었습니다. 이후 C #에 사용 된 것과 동일한 CLI에서 실행되도록 IronPython 이라는 Python을 컴파일 하고 Java 가상 머신 인 Jython 에서 실행 되는 CLI를 포함하여 새로운 구현이 추가되었습니다 . 원을 완성하기 위해 Python PyPy로 작성된 Python 버전이 있습니다.
  • 루비 : 루비는 순수한 해석 언어로 시작했지만 최신 버전은 바이트 코드를 사용하도록 전환되었습니다. Ruby의 경우 IronRuby 라는 CLI로 컴파일 하고 Java VM ( JRuby) 용으로 컴파일하는 프로젝트가 있습니다.

죄송합니다. 가상 머신이 인터프리터와 어떻게 다른가요? 하나를 사용하는 것이 컴파일의 절반 지점인지 어떻게 알지 못합니다. 바이트 코드가 절반 컴파일되었다고 말하고 있습니까?
Philip

1
@Philip : 바이트 코드는 머신 코드가 아닙니다. 따라서 CPU에 직접 명령어를 제공하는 대신 바이트 코드를 가져 와서 해석하여 기계 명령어로 변환하는 인터프리터가 필요합니다. 장점은 가상 머신이 다른 아키텍처로 포팅하기가 더 간단하고 JIT 컴파일 과 같은 트릭을 적용 할 수 있다는 것 입니다 .
Martijn Pieters

"컴파일 된"이라는 용어가 마케팅 목적으로 희석되었다고 느끼는 사람이 있습니까?
Philip

2
우와! 다시 가져갑니다. 나는 잠시 길을 잘못 가고 있었다. "컴파일 된"은 머신 코드와 머신 코드만으로 전환하는 것을 의미한다고 생각했는데 실제로는 그렇지 않습니다. 코드를 다른 코드로 번역하는 용어 일뿐입니다. 기계 코드, 바이트 코드 또는 원하는 언어가 되십시오. 또한 PHP 컴파일러가 있다는 것이 밝혀 졌으므로 "일반적으로"해석된다고 말할 수 있습니다.
필립


34

당신은 기본적으로 옳습니다. Ruby가 C로 작성되었다고 말하면 언어 해석기 및 핵심 라이브러리의 일부가 C로 작성되었음을 의미합니다.

따라서 Ruby 인터프리터는 텍스트 파일을 입력으로 가져 와서 처리 한 다음 다른 텍스트 파일 (루비로 작성된 경우)에 있거나 C 코드로 컴파일 된 함수를 호출하는 C 프로그램입니다. 메모리, 파일 시스템 등과 같은 시스템 리소스에 직접 액세스합니다. 그리고 매우 높은 성능을 요구하는 일부 기능.

따라서 다른 언어로 작성하거나 작성해야하는 언어의 다른 부분이 있습니다. C에서 인터프리터와 C ++로 라이브러리를 작성하는 것을 막을 수있는 것은 없습니다. 여러 단계를 거쳐 텍스트 처리에 매우 능숙한 언어를 사용하여 일부 중간 데이터를 생성 한 다음 일부 C 코드로 처리 할 수도 있습니다.

결정의 요소는 다른 복잡한 응용 프로그램과 동일 할 수 있습니다. 성능은 하나입니다. 시스템 리소스에 직접 액세스 할 수있는 코드를 작성하는 기능 따라서 대부분의 경우이 언어는 컴파일 된 언어 여야합니다 (이론에서는 Python으로 Ruby 인터프리터를 작성할 수 있음). Linux, Win, OS X 등에서 언어를 실행하려면 다른 시스템에서의 가용성이 중요합니다.


내가 게시 한 순간 답변에 대해 세 개의 투표를하는 이유를 아는 사람이 있습니까?
Thorsten Müller

1
나는 지금 4 개를 본다. 그러나 나는 당신이 무엇을 요구하는지 정말로 확신하지 못한다? 공감 비가 너무 빨리 나타 났습니까? 그렇다면 질문에 많은 관심을 기울이고 (거의 세 가지 동시 답변) 대답은 좋습니다.
yannis

흠. 어쩌면 나는 그것을 저장 한 다음 편집하고 다시 저장하고 첫 번째 저장을 잊어 버렸습니다 (오래되고 있습니다). 나에게 그것은 내가 게시 한 순간 처음 세 개의 투표를 한 것처럼 보였다.
Thorsten Müller

@ thorstenmüller +1 "C에서 인터프리터와 C ++로 라이브러리를 작성하는 것을 막을 수있는 것은 아무것도 없습니다."나는 이것에 대해 물어 보려고했다. 인터프리터 / 컴파일러가 한 언어이고 핵심 라이브러리가 다른 언어 인 경우 유명한 구현이 있습니까?
Songo

@ thorstenmüller 나는 때때로 그런 일이 몇 번 일어났다. 게시 한 사용자 중 몇 명이 질문을보고있는 경우 제출하는 순간 1-2 초 내에 "새로운 답변이 게시되었습니다"라는 작은 메시지가 표시되어 전체 답변을 훑어 보거나 10 초 내에 투표 할 수있었습니다. 귀하의 게시 또한 답변을 게시 한 후 5 분 이내에 편집 한 내용이 편집 기록에 표시되지 않아 사용자가 약간 혼란 스러울 수 있습니다.
이즈 카타

10

그것은 단지 언어 A의 핵심 대부분 이 언어 B로 작성 되었다는 것을 의미합니다 . "핵심 A의 핵심"은 언어마다 다를 수 있지만 일반적으로 당신이 생각하는 바에 따르면 그것은 컴파일러 또는 해석기라는 것을 의미합니다. 다른 언어를 작성하기 위해 언어를 선택하는 결정 요인은 거의 모든 프로젝트와 마찬가지로 개발자가 더 익숙한 언어입니다.

"언어 A는 언어 B로 작성되었습니다"는 대부분의 현대 언어에 비해 지나치게 단순화 된 것입니다. 파이썬을 예로 들어 참조 구현 CPython 이 실제로 C로 작성 되었지만 Jython (Java로 작성), IronPython (C #으로 작성), PyPy (Python으로 작성 ) 와 같은 다른 언어로 작성된 구현이 있습니다 . CLPython (Common Lisp로 작성), Stackless Python (C 및 Python으로 작성) 및 Unladen Swallow (C ++로 작성).

프로그래밍 언어는 정의이며, 파이썬 예제에서 볼 수 있듯이 컴파일러, 인터프리터 및 라이브러리를 작성할 수있는 언어에 대한 제한은 없습니다. 물론 언어 자체를 작성할 수도 있습니다. bootstrapping 이라는 프로세스를 통해 .


2
CPython의 확장으로 실행되므로 Psyco를 다른 구현으로 부르지 않습니다.
Martijn Pieters

@MartijnPieters 또한 사이트에 따르면 죽은 프로젝트입니다. 제거되었습니다.
yannis 2011

@YannisRizos하지 공차 삼키기 죽은뿐만 아니라 ?
Andres F.

1
@ Songo : 그 외에는을 string.lower(s)파이썬 함수로 위임 return s.lower()하는 것이 맞습니다. CPython의 3.3 문자열 경우 작업은 C로 구현
마티 피에 터스에게


3

프로그래밍 언어를 사용한다는 관점에서 프로그래밍 언어는 프로그램 일뿐입니다. 컴파일러 일 수도 있고 인터프리터 일 수도 있고 일종의 가상 머신 일 수도 있습니다. 모든 것은 컴퓨터 프로그램 일 뿐이므로 어떤 언어로도 쓸 수 있습니다.

따라서, 자신의 PHP 버전을 만들고 싶다면, 가장 유창한 언어로 시작할 수 있습니다. 그런 다음 PHP 형식의 코드를 읽을 수있는 프로그램을 작성하고 PHP 사양에서 프로그램이 지시하는대로 수행하십시오 . 따라서 언어 X로 PHP 언어를 작성하고 있습니다.


흥미로운 점. 따라서 기본적으로 PHP에 내장 함수 explode를 가지고 a String를 반환하면 Array구현 (즉, 배열을 생성하기 위해 문자열에서 작동하는 코드)이 C 로 작성됩니다 .
Songo

@Songo : 맞습니다. 다시 말하지만, PHP는 Word, Apache 또는 Notepad 또는 vi 또는 emacs와 다르지 않은 프로그램 일뿐입니다. 언어 사양에 따라 데이터를 읽고 구문 분석 한 다음 언어 사양에서 지시 한대로 수행합니다.
Bryan Oakley

이 답변은 언어를 구현과 나쁘게 만듭니다.
Russell Borogove

나는 이것이 가장 단순하고 가장 직접적인 대답이라고 생각하며 어떻게 그것이 어떻게 거품을 일으키는 지 알지 못합니다. 심지어 PHP 구현이 두 개 이상있을 수도 있다고 제안합니다. 사실, 원래 PHP와 Facebook에 여러 가지가 있으며 다른 것도있을 수 있습니다.
Warren P

@RussellBorogove : "프로그래밍 언어 사용의 관점에서"가 답을 명확하게하는 데 도움이된다고 생각하지 않습니까? 우리는이 질문에 대한 절대 초보자를 다루고 있으므로 요점을 설명하기 위해 약간의 정밀도를 희생하는 것이 중요합니다.
Bryan Oakley

3

완전히 다른 의미를 가진 매우 유사한 문구는 "언어 B로 언어 A를 작성", 예를 들어 "Java로 C를 작성"입니다.

이것은 한 언어에서 구문 적으로 올바른 코드를 설명하지만 다른 언어의 구조, 관용구 및 규칙을 사용합니다. "Java로 C 작성"예에서, 이것의 표시는 열거 형 대신 정수 상수를 사용하고 identifiers_with_underscores 등을 사용하여 각 메소드 위에 모든 로컬 변수를 선언하는 것입니다.

일반적으로 누군가가 오랫동안 한 언어로 작업 한 경우 (특히 해당 언어 로만 작업 한 경우 ) 현재 언어에 익숙하지 않거나 깨끗한 코드 작성에 관심이없는 경우에 발생합니다.


"CPython은 C로 작성되었다"는 것은 "이 사용자는 C처럼 파이썬으로 작성한다"는 의미는 아닙니다. CPython (Windows의 경우 Python.exe, Unix의 경우 / usr / bin / python)이 C로 작성되었음을 의미합니다.
Warren P

@Warren P : 물론, 문구는 매우 비슷하므로 어느 쪽이든 익숙하지 않은 사람들은 쉽게 설명을 찾을 수 있습니다.
Michael Borgwardt

3

기술은 본질적으로 반복적 인 프로세스입니다. 우리는 간단한 도구로 시작한 다음 그 도구를 사용하여 더 나은 도구를 만듭니다. 첫 번째 어셈블리 언어는 칩에 대한 표준화 된 명령어 바이트 코드의 거의 1 : 1 변환이었습니다. 8086 아키텍처와 그 어셈블러는 Z80, RISC 등과 같은 다른 아키텍처보다 우세 해지면서 FORTRAN, COBOL, Pascal 및 C와 같은 8086 어셈블리로 소화 될 수있는 언어를 개발하기 시작했습니다. 소스 코드를 해석하는 프로그램 이 언어들은 좀 더 원시적 인 것으로 작성되어야하며, 그렇지 않으면 닭과 계란 논쟁으로 끝납니다. 첫 번째 C 컴파일러의 소스 코드가 C로 작성된 경우, 그 C 소스 코드를 컴파일 한 것이 무엇이고, 정의상 첫 번째 C 컴파일러가 아닐까요?

기본적으로 "C #은 C ++로 작성 됨"은 C # 언어 (Microsoft .NET Framework 및 명령 줄 컴파일러)의 사양을 따르는 첫 번째 및 / 또는 가장 인기있는 컴파일러 및 런타임 / 코어 라이브러리를 의미합니다. program CSC.exe)는 C ++로 작성되었습니다.


0

"언어 A는 언어 B로 작성 됨"은 언어 A의 유일한 구현 (또는 널리 사용되는 유일한 것)은 실제로 언어 B에서 개발 된 프로젝트이고 유일하고 완전한 최신의 유일한 것임을 의미합니다. A의 사양은 문서와 B 프로그램이 일치하지 않는 경우 B 프로그램이 일반적으로 올바른 것으로 간주하는 B 소스 코드입니다.


C ++의 권위있는 구현은 없습니다. C ++의 경우 사양이 정확하며 사양에 정의되지 않은 동작이 구현에서 어떤 작업을 수행 할 수 있습니다. 그래서, 이것은 정확하지 않습니다.
워렌 P

이전 의견이 내 답변과 어떤 관련이 있는지 알 수 없습니다. 모든 언어에 대해 보편적으로 정량화 된 진술을하지 않았으므로 C ++의 반대 사례는 적용 할 수 없습니다. A가 "C ++"인 "A는 B로 작성 됨"형식의 명령문은 B가 "영어"인 경우를 제외하고는 의미가 없습니다.
Kaz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.