나는 종종 언어 A가 언어 B로 쓰여졌다는 용어를 듣습니다. 예를 들어, PHP 는 C로 , C # 은 C ++ 로 작성되었습니다 .
누군가 그것이 그 의미가 무엇인지, 심지어 올바른지 설명해 주시겠습니까? 언어에서 사용하는 인터프리터 컴파일러와 관련이 있습니까?
또한 구현 언어 선택의 기반이되는 요소는 무엇입니까?
s/written/implemented/
훨씬 더 명확합니다.
나는 종종 언어 A가 언어 B로 쓰여졌다는 용어를 듣습니다. 예를 들어, PHP 는 C로 , C # 은 C ++ 로 작성되었습니다 .
누군가 그것이 그 의미가 무엇인지, 심지어 올바른지 설명해 주시겠습니까? 언어에서 사용하는 인터프리터 컴파일러와 관련이 있습니까?
또한 구현 언어 선택의 기반이되는 요소는 무엇입니까?
s/written/implemented/
훨씬 더 명확합니다.
답변:
대부분의 프로그래밍 언어는 해석 언어와 컴파일 언어의 두 가지 범주로 나뉩니다.
컴파일 된 언어는 컴파일러 에 의해 머신 코드 로 변환되며 CPU는 단계별로 직접 실행하는 언어입니다. 반면에, 해석 된 언어는 중개자 인 통역사를 사용 하여 언어 코드를 실행합니다. 인터프리터 자체는 일반적으로 기계 코드로 컴파일 된 다른 프로그램입니다.
PHP는 해석 언어입니다. PHP 코드 를 실행하려면 별도의 프로그램이 필요합니다 . 컴퓨터는 프로그램을 직접 실행하지 않습니다. 별도의 프로그램 인 PHP 인터프리터 자체가 C로 작성되었습니다.
C #은 컴파일 된 언어이지만 기계 코드로 컴파일되지는 않습니다. 대신 가상 시스템에서 실행되도록 특수 언어 인 바이트 코드로 컴파일됩니다. Java는 이러한 설정의 또 다른 예입니다. 가상 머신이 인터프리터 인 컴파일과 해석의 하이브리드로 볼 수 있습니다. C # 용 가상 머신 (CLI 또는 공용 언어 인프라 )은 C ++로 작성됩니다.
다른 예는 다음과 같습니다.
당신은 기본적으로 옳습니다. Ruby가 C로 작성되었다고 말하면 언어 해석기 및 핵심 라이브러리의 일부가 C로 작성되었음을 의미합니다.
따라서 Ruby 인터프리터는 텍스트 파일을 입력으로 가져 와서 처리 한 다음 다른 텍스트 파일 (루비로 작성된 경우)에 있거나 C 코드로 컴파일 된 함수를 호출하는 C 프로그램입니다. 메모리, 파일 시스템 등과 같은 시스템 리소스에 직접 액세스합니다. 그리고 매우 높은 성능을 요구하는 일부 기능.
따라서 다른 언어로 작성하거나 작성해야하는 언어의 다른 부분이 있습니다. C에서 인터프리터와 C ++로 라이브러리를 작성하는 것을 막을 수있는 것은 없습니다. 여러 단계를 거쳐 텍스트 처리에 매우 능숙한 언어를 사용하여 일부 중간 데이터를 생성 한 다음 일부 C 코드로 처리 할 수도 있습니다.
결정의 요소는 다른 복잡한 응용 프로그램과 동일 할 수 있습니다. 성능은 하나입니다. 시스템 리소스에 직접 액세스 할 수있는 코드를 작성하는 기능 따라서 대부분의 경우이 언어는 컴파일 된 언어 여야합니다 (이론에서는 Python으로 Ruby 인터프리터를 작성할 수 있음). Linux, Win, OS X 등에서 언어를 실행하려면 다른 시스템에서의 가용성이 중요합니다.
그것은 단지 언어 A의 핵심 대부분 이 언어 B로 작성 되었다는 것을 의미합니다 . "핵심 A의 핵심"은 언어마다 다를 수 있지만 일반적으로 당신이 생각하는 바에 따르면 그것은 컴파일러 또는 해석기라는 것을 의미합니다. 다른 언어를 작성하기 위해 언어를 선택하는 결정 요인은 거의 모든 프로젝트와 마찬가지로 개발자가 더 익숙한 언어입니다.
"언어 A는 언어 B로 작성되었습니다"는 대부분의 현대 언어에 비해 지나치게 단순화 된 것입니다. 파이썬을 예로 들어 참조 구현 CPython 이 실제로 C로 작성 되었지만 Jython (Java로 작성), IronPython (C #으로 작성), PyPy (Python으로 작성 ) 와 같은 다른 언어로 작성된 구현이 있습니다 . CLPython (Common Lisp로 작성), Stackless Python (C 및 Python으로 작성) 및 Unladen Swallow (C ++로 작성).
프로그래밍 언어는 정의이며, 파이썬 예제에서 볼 수 있듯이 컴파일러, 인터프리터 및 라이브러리를 작성할 수있는 언어에 대한 제한은 없습니다. 물론 언어 자체를 작성할 수도 있습니다. bootstrapping 이라는 프로세스를 통해 .
string.lower(s)
파이썬 함수로 위임 return s.lower()
하는 것이 맞습니다. CPython의 3.3 문자열 경우 작업은 C로 구현
프로그래밍 언어를 사용한다는 관점에서 프로그래밍 언어는 프로그램 일뿐입니다. 컴파일러 일 수도 있고 인터프리터 일 수도 있고 일종의 가상 머신 일 수도 있습니다. 모든 것은 컴퓨터 프로그램 일 뿐이므로 어떤 언어로도 쓸 수 있습니다.
따라서, 자신의 PHP 버전을 만들고 싶다면, 가장 유창한 언어로 시작할 수 있습니다. 그런 다음 PHP 형식의 코드를 읽을 수있는 프로그램을 작성하고 PHP 사양에서 프로그램이 지시하는대로 수행하십시오 . 따라서 언어 X로 PHP 언어를 작성하고 있습니다.
완전히 다른 의미를 가진 매우 유사한 문구는 "언어 B로 언어 A를 작성", 예를 들어 "Java로 C를 작성"입니다.
이것은 한 언어에서 구문 적으로 올바른 코드를 설명하지만 다른 언어의 구조, 관용구 및 규칙을 사용합니다. "Java로 C 작성"예에서, 이것의 표시는 열거 형 대신 정수 상수를 사용하고 identifiers_with_underscores 등을 사용하여 각 메소드 위에 모든 로컬 변수를 선언하는 것입니다.
일반적으로 누군가가 오랫동안 한 언어로 작업 한 경우 (특히 해당 언어 로만 작업 한 경우 ) 현재 언어에 익숙하지 않거나 깨끗한 코드 작성에 관심이없는 경우에 발생합니다.
기술은 본질적으로 반복적 인 프로세스입니다. 우리는 간단한 도구로 시작한 다음 그 도구를 사용하여 더 나은 도구를 만듭니다. 첫 번째 어셈블리 언어는 칩에 대한 표준화 된 명령어 바이트 코드의 거의 1 : 1 변환이었습니다. 8086 아키텍처와 그 어셈블러는 Z80, RISC 등과 같은 다른 아키텍처보다 우세 해지면서 FORTRAN, COBOL, Pascal 및 C와 같은 8086 어셈블리로 소화 될 수있는 언어를 개발하기 시작했습니다. 소스 코드를 해석하는 프로그램 이 언어들은 좀 더 원시적 인 것으로 작성되어야하며, 그렇지 않으면 닭과 계란 논쟁으로 끝납니다. 첫 번째 C 컴파일러의 소스 코드가 C로 작성된 경우, 그 C 소스 코드를 컴파일 한 것이 무엇이고, 정의상 첫 번째 C 컴파일러가 아닐까요?
기본적으로 "C #은 C ++로 작성 됨"은 C # 언어 (Microsoft .NET Framework 및 명령 줄 컴파일러)의 사양을 따르는 첫 번째 및 / 또는 가장 인기있는 컴파일러 및 런타임 / 코어 라이브러리를 의미합니다. program CSC.exe)는 C ++로 작성되었습니다.
"언어 A는 언어 B로 작성 됨"은 언어 A의 유일한 구현 (또는 널리 사용되는 유일한 것)은 실제로 언어 B에서 개발 된 프로젝트이고 유일하고 완전한 최신의 유일한 것임을 의미합니다. A의 사양은 문서와 B 프로그램이 일치하지 않는 경우 B 프로그램이 일반적으로 올바른 것으로 간주하는 B 소스 코드입니다.