모든 컴퓨터에 대한 범용 어셈블리 언어가 가능합니까?


23

어셈블리 언어에 대해 몇 가지 질문을하고 싶습니다. 내 이해는 기계 언어에 매우 가깝기 때문에 더 빠르고 효율적입니다.

컴퓨터 아키텍처가 다르기 때문에 어셈블리에서 다른 아키텍처에 대해 다른 코드를 작성해야합니까? 그렇다면 왜 어셈블리가 아닌가? 한 번만 작성하십시오-모든 유형의 언어를 실행 하시겠습니까? 한 번만 쓰고 다른 구성을 가진 거의 모든 컴퓨터에서 실행할 수 있도록 단순히 보편적으로 만드는 것이 쉽지 않을까요? (불가능하다고 생각하지만 구체적이고 심층적 인 답변을 원합니다)

어떤 사람들은 C가 내가 찾고있는 언어라고 말할 수 있습니다. 나는 C를 사용하지 않았지만 예를 들어 Java보다 빠르지 만 여전히 고급 언어라고 생각합니다. 나는 여기에 잘못되었을 수 있습니다.


10
어떤 연구를 했습니까? 더 나은 질문을 할 수 있도록 요청하기 전에 조사해야합니다. 어셈블리 언어로 작성된 글이 많이 있습니다.
DW

4
문의하기 전에 상당한 양의 연구 / 자율 학습을 수행하고, 어떤 연구를 수행했는지 질문에 알려 주시기 바랍니다. 이 경우 관련 Wikipedia 기사 (예 : 어셈블리 언어 및 컴퓨터 아키텍처)를 읽고 컴퓨터 아키텍처 교과서를 읽는 것이 연구에 포함될 수 있습니다. 더 나은 질문을하려면 : 아직 조사하지 않은 경우 해당 연구를 수행 한 다음 수행 한 연구를 설명하기 위해 질문을 편집하십시오. 이런 종류의 연구는 종종 더 나은 질문을 공식화하는 데 도움이됩니다. 어쨌든 응답자가 이미 알고있는 것을 반복하지 않도록 도와줍니다.
DW

15
Assembly라는 언어가없는 이유를 이해하는 것으로 시작하십시오.
Raphael

2
C 이식성에 대한 하나의 "고전적인"문제는 하드웨어마다 다른 프리미티브 (예 : 정수) 크기이며 다른 인용이 있습니다.
vzn

3
이는 기술적 인 문제보다 사회적 문제가 더 많습니다. 모든 CPU 제조업체가 CPU가 동일한 기계 언어를 허용하도록 설득해야합니다. (실제로 x86은
우연히이

답변:


45

어셈블리 언어 는 컴퓨터 프로그래머가 이해하기 쉬운 방식으로 컴퓨터의 명령어 세트에 대한 명령어를 작성 하는 방법입니다.

아키텍처마다 다른 명령어 세트가 있습니다. 허용되는 명령어 세트는 아키텍처마다 다릅니다. 따라서 한 번에 한 번 쓰기 실행 어셈블리 프로그램을 가질 수는 없습니다. 예를 들어 x86 프로세서가 지원하는 명령어 세트는 ARM 프로세서가 지원하는 명령어 세트와 매우 다릅니다. x86 프로세서 용 어셈블리 프로그램을 작성한 경우 ARM 프로세서에서 지원되지 않는 많은 명령어가 있으며 그 반대도 마찬가지입니다.

어셈블리 언어를 사용하는 주된 이유는 프로그램을 매우 낮은 수준으로 제어하고 프로세서의 모든 명령을 활용할 수 있기 때문입니다. 특정 프로세서에 고유 한 기능을 사용하도록 프로그램을 사용자 지정하면됩니다. 때로 프로그램 속도를 높일 수 있습니다. 어디서나 쓸 수있는 철학은 근본적으로 그와 상충됩니다.


1
나는 그 질문이 이미 내 대답의 세 번째 단락에 의해 대답되었다고 생각합니다. 당신이 말했듯이, 그러한 계획은 효율적이지 않을 것이므로 어셈블리 언어를 사용하는 핵심 이유와 근본적으로 상충됩니다.
DW

26
@nTuply 다른 기계를 수용하기 위해 어셈블리 언어를 수정하자마자 끔찍한 어셈블리 스타일 구문을 사용하는 고급 언어가되었습니다. 고급 언어를 사용하기로 결정한 후에는 더 친숙한 구문을 사용하여 컴파일러가 열심히 일하도록 할 수 있습니다.
David Richerby

15
기본적으로 LLVM의 "IR"은 다른 기계 용으로 번역 된 "어셈블리 언어"를 갖는 것은 완전히 어리석은 생각이 아닙니다. 그러나 David가 제공하는 이유 때문에 일반적으로 LLVM 어셈블리를 작성 하지는 않습니다 . 또한 100에서 99 시간이 걸리기 때문에 Clang을 C를 LLVM으로 변환하는 것보다 더 나쁜 작업을 수행합니다. 어셈블리 언어는 고급 언어보다 효율적일 수 있지만 대부분의 실제 프로그래머는 최적화 할 수있는 일반적인 시간이 있지만 잠재적으로 도달 할 수 없습니다.
Steve Jessop

9
@nTuply, 그 존재합니다. 이 추가 어셈블리 언어에서 기계 명령어로 이동하는 프로세스를 컴파일이라고합니다.
Paul Draper

3
@PJTraill 최초의 부트 스트래핑 단계 (대부분의 경우는 아니더라도)를 제외하고는 현대 시스템에서 어셈블러로 컴파일러를 작성해야 할 이유가 없습니다. 고급 언어로 작성된 컴파일러는 실제로 유지 관리하기 가 훨씬 쉽습니다. 또한 C로 작성된 컴파일러의 언어가 어떻게 C보다 더 빠를 수 있습니까? . 컴파일러의 목적은 한 언어 (원본 언어)에서 다른 언어 (일반적으로 특정 아키텍처 및 OS의 기계 언어)로 변환하는 것입니다. 이것은 모든 언어로 작성 될 수 있습니다.
CVn

13

어셈블리 언어의 정의는 해당 언어가 기계 코드로 직접 변환 될 수있는 언어라는 것입니다. 어셈블리 언어의 각 작업 코드는 대상 컴퓨터에서 정확히 하나의 작업으로 변환됩니다. (어떻게하면 좀 더 복잡하다. 일부 어셈블러는 op 코드에 대한 인수를 기반으로 "어드레싱 모드"를 자동으로 결정하지만 여전히 한 줄의 어셈블리는 하나의 기계 언어 명령어로 변환된다는 원칙이 있습니다.)

의심 할 여지없이 어셈블리 언어처럼 보이지만 다른 컴퓨터에서 다른 기계 코드로 변환되는 언어를 발명 할 수 있습니다. 그러나 정의상 이것은 어셈블리 언어가 아닙니다. 어셈블리 언어와 유사한 고급 언어입니다.

당신의 질문은 "물에 뜨지 않거나 물을 가로 질러 여행 할 수있는 다른 방법이 있지만 바퀴와 모터가 있고 육지로 여행 할 수있는 보트를 만들 수 있습니까?" 그 정의에 따르면 그러한 차량은 보트가 아닐 것입니다. 차처럼 들립니다.


1
C는 종종 "휴대용 어셈블리 언어"로 설명되었습니다.
래리 그 리츠

2
@LarryGritz 물론입니다. 그리고 C가 발명되었을 때, 그것은 획기적이었습니다. 그것은 컴파일 된 사용의 용이성과 함께 어셈블리 언어의 많은 힘을 제공했습니다. 그러나 정의에 의하면, 여전히 컴파일 된 언어입니다.
Jay

8

더 없다 개념 (I, 아니 컴퓨터 아마 ... 일 것없는 과학을 세계의 모든 컴퓨터에 대해 하나 개의 어셈블리 언어를 가지고에 대한) 이유는. 사실, 많은 것들이 훨씬 쉬워 질 것입니다. 이론에 관한 한, 그것들은 어쨌든 약간 펑키 한 형용사까지 동일합니다.

그러나 실제로는 서로 다른 목표를 제공하는 운영 및 설계 원칙 (예 : RISC vs CISC)이 서로 다른 목적에 따라 서로 다른 칩이 있으며이를 운영하는 명령어 세트와 어셈블리 언어가 다릅니다. 결국, 대답은 다른 목표, 다른 디자인 결정 과 같이 다른 프로그래밍 언어가 왜 그렇게 많은지 묻는 질문과 같습니다 .

즉, 일부 공유 인터페이스에 도달하기 위해 추상화 레벨을 도입 할 수 있습니다. 예를 들어, x86은 온 칩 레벨로 꽤 오랫동안 사라졌습니다. x86 명령어를 프로세서가 실제로 사용하는 모든 것으로 변환하는 작은 하드웨어가 있습니다. C와 같은 언어는 하스켈, 자바 또는 루비와 같은 언어에 이르기까지 하드웨어에서 (아마도 작은 경우라면) 또 다른 단계입니다. 그렇습니다. 컴파일러는 컴퓨터 과학의 주요 성과 중 하나입니다. 이런 방식으로 우려를 분리 할 수 ​​있기 때문입니다.


6
"아마도 작은 것이면"두 종류의 프로그래머가 있습니다. C의 기본 조작이 CPU 명령어 세트에 나타나는 종류와 매우 유사하기 때문에 C를 저수준 언어로 간주하는 사람들과 C 는 기계 와 동일한 명령어 세트 가 아니기 때문에 C를 고급 언어로 간주하는 사람들 .
Steve Jessop

어셈블리 언어에 의해 특정 유형 (또는 제품군)의 하드웨어에 대해 생성 된 기계어 코드를 완전히 제어하는 ​​것을 의미하는 경우 , 주어진 순간에 우리 세계에서 "모든 컴퓨터에 대해"하나의 언어를 정의 할 수는 있지만 계속 바꿔야합니다. 새로운 아키텍처를 코딩하기위한 학습 곡선을 단축 할 수는 있지만 (아주 잘 설계되어 있다면), 컴파일러가 아닌 일부 작업은 아키텍처의 일부에만 적용되기를 기대합니다. 컴퓨터가 추상 수준에서 동일하다는 것은 빨간 청어입니다. 기계 코드에 관한 것입니다.
PJTraill

7

"어디서나 한 번 쓰기"라는 문구는 그 의미를 알지 못하는 것 같습니다. 즉의 마케팅 슬로건 인 썬 마이크로 시스템즈 상업적의 개념을 발명 한 "가상 머신""바이트 코드" 아마도 생각이 학계 1에서 유래 한 수 있지만, Java 용을 . 이 아이디어는 나중에 썬이 Java 라이센싱 침해를 이유로 고소한 후 .Net을 위해 .Net 용으로 복사되었습니다. Java 바이트 코드는 기계 간 어셈블리 또는 기계 언어 아이디어를 구현 한 것입니다. Java 이외의 여러 언어에 사용되며 이론적으로 모든 언어를 컴파일하는 데 사용할 수 있습니다. 수년간의 고급 최적화를 거친 후 Java는 컴파일 된 언어와 거의 유사한 성능을 제공하여 고성능 플랫폼에 관계없이 가상 머신 기술이 일반적으로 달성 될 수 있음을 보여줍니다.

요구 사항과 관련된 초기 단계 / 순환의 또 다른 새로운 아이디어를 재 계산 프로젝트 라고하며 다른 목적으로 사용될 수는 있지만 과학적 연구를위한 것입니다. 아이디어는 가상 머신 기술을 통해 계산 실험을 복제 할 수 있도록하는 것입니다. 이것은 주로 임의의 하드웨어에서 다른 머신 아키텍처를 시뮬레이션하는 아이디어입니다.


8
썬은 가상 머신이나 바이트 코드를 발명하지 않았으며, 돈을 버는 최초의 그룹조차 아니 었습니다. p 코드를 찾으십시오.
jmoreno

@ jmoreno : 그는 Smalltalk를 찾고 싶을 수도 있습니다.
밥 자비스-복직 모니카

이 기사는 썬이 발명 한 가상 머신 / 바이트 코드를 주장하지 않습니다. 인용되지 않았지만 언급 된 다른 역사가 있습니다. 여기에 매우 중요한 또 다른 핵심 기술 : Google Native Client (크롬 기능)
vzn

5

높은 수준의 이유

마이크로 프로세서는 놀라운 일을합니다. 세탁기 나 엘리베이터와 같은 기계를 가져 와서 주문 제작 된 메커니즘이나 회로 전체를 저렴하고 대량 생산되는 실리콘으로 대체 할 수 있습니다. 칩. 부품에 많은 돈을 절약하고 디자인에 많은 시간을 절약합니다.

그러나 수많은 맞춤형 디자인을 대체 하는 표준 칩이 있습니까? 모든 애플리케이션에 완벽한 단일의 완벽한 마이크로 프로세서가있을 수는 없습니다. 일부 응용 프로그램은 전력 사용량을 최소화해야하지만 빠를 필요는 없습니다. 다른 것들은 빠를 필요가 있지만 프로그래밍하기 쉬울 필요는 없으며, 다른 것들은 저비용이어야합니다.

따라서 마이크로 프로세서에는 여러 가지 "풍미"가 있으며 각각 고유 한 장단점이 있습니다. 코드 재사용이 가능하고 올바른 기술을 가진 사람들을 쉽게 찾을 수 있기 때문에 모두 호환 가능한 명령어 세트를 사용하는 것이 바람직합니다. 그러나 명령어 세트 프로세서의 비용, 복잡성, 속도, 사용 용이성 및 물리적 제약에 영향을 미치므로 몇 가지 "주류"명령어 세트 (및 많은 작은 명령어)가 있으며 각 명령어 세트에는 특성이 다른 프로세서가 많이 있습니다.

아, 그리고 기술이 변화함에 따라 이러한 모든 절충점이 바뀌므로 지침 세트가 발전하고 새로운 것이 등장하고 오래된 것이 죽습니다. 오늘날 "최상의"교육이 있었더라도 20 년이되지 않을 수 있습니다.

하드웨어 세부 사항

아마도 명령어 세트에서 가장 큰 디자인 결정은 워드 크기 , 즉 프로세서가 "자연스럽게"조작 할 수있는 숫자의 크기 일 것입니다. 8 비트 프로세서는 0-255의 숫자를 처리하는 반면 32 비트 프로세서는 0-4,294,967,295의 숫자를 처리합니다. 하나를 위해 설계된 코드는 다른 코드를 위해 완전히 다시 생각해야합니다.

하나의 명령어 세트에서 다른 명령어 세트로 명령어를 번역하는 것만이 아닙니다. 다른 명령 세트에서 완전히 다른 접근법이 바람직 할 수 있습니다. 예를 들어, 8 비트 프로세서에서는 찾아보기 테이블이 이상적 일 수 있지만 32 비트 프로세서에서는 동일한 목적으로 산술 연산이 더 좋습니다.

명령어 세트간에 다른 주요 차이점이 있습니다. 대부분의 지침은 네 가지 범주로 나뉩니다.

  • 계산 (산술 및 논리)
  • 제어 흐름
  • 데이터 전송
  • 프로세서 구성

프로세서는 수행 할 수있는 계산 종류와 제어 흐름, 데이터 전송 및 프로세서 구성에 접근하는 방법이 다릅니다.

예를 들어, 일부 AVR 프로세서는 곱하거나 나눌 수 없습니다. 모든 x86 프로세서는 가능합니다. 상상할 수 있듯이 곱셈과 나눗셈과 같은 작업에 필요한 회로를 제거하면 프로세서가 더 간단하고 저렴해질 수 있습니다. 이러한 작업은 필요한 경우 소프트웨어 루틴을 사용하여 계속 수행 할 수 있습니다.

x86을 사용하면 산술 명령어가 피연산자를 메모리에서로드하거나 결과를 메모리에 저장할 수 있습니다. ARM은로드 저장소 아키텍처이므로 메모리에 액세스하기위한 몇 가지 전용 명령 만 있습니다. 한편 x86에는 전용 조건부 명령어가 있으며 ARM에서는 거의 모든 명령어를 조건부로 실행할 수 있습니다. 또한 ARM을 사용하면 대부분의 산술 명령어의 일부로 비트 시프트를 수행 할 수 있습니다. 이러한 차이로 인해 성능 특성, 칩의 내부 설계 및 비용의 차이, 어셈블리 언어 수준에서의 프로그래밍 기술의 차이가 발생합니다.

결론

범용 어셈블리 언어를 사용할 수없는 이유는 어셈블리 코드를 하나의 명령어 세트에서 다른 명령어 세트로 올바르게 변환하려면 컴퓨터가 아직 할 수없는 코드를 다시 설계해야하기 때문입니다.


훌륭한 답변! 사람들은 프로그래밍해야 할 컴퓨팅이 우리 어디에나 있다는 것을 충분히 이해하지 못합니다. 화면에서 실행되는 응용 프로그램 만이 아닙니다. 매년 수십억 개의 칩이 제조됩니까?
phs

4

DW의 놀라운 답변 추가 : 하나의 어셈블러를 사용하려면 모든 아키텍처를 유지하고 그 중 완벽한 번역기를 유지하고 수행중인 작업을 완전히 이해해야합니다.
한 아키텍처 당 매우 최적화 된 코드는 최적화를 해제하고보다 추상적 인 수준에서 이해하고 다른 아키텍처에 맞게 최적화해야합니다.
그러나 이것이 가능하다면 우리는 완벽한 C 컴파일러를 갖게 될 것이며 순수한 어셈블리로 작성하는 것이 전혀 도움이되지 않을 것입니다.
어셈블러 사용의 주요 요점은 성능이며, 최신 컴파일러에서는 압축 할 수 없습니다.
이러한 프로그램을 작성하는 것은 기존 컴파일러보다 훨씬 어려울 수 있으며 생성되는 모든 새 아키텍처를 유지 관리하면 훨씬 어려워집니다.
그리고 "하나의"프로그램의 경우, 이전 버전과의 호환성도 완벽합니다.


대부분의 경우 gcc는 프로그래머가 할 수있는 것보다 더 나은 최적화를 수행합니다. 어셈블러 사용의 주요 요점은 레지스터 액세스와 같은 C에서는 할 수없는 일을하는 것입니다. Linux 소스 트리를 보면 어셈블리를 사용하는 것과 거의 같습니다.
slebetman

@slebetman-gcc를 사용하면 어셈블리에 의존하지 않고 변수를 레지스터에 넣을 수 있습니다.
Jirka Hanika

@JirkaHanika : CPU 레지스터 또는 특수한 목적으로 지정된 특수 목적 하드웨어 레지스터에 대해 이야기하고 있습니까? 나는 slebetman이 후자를 의미한다고 생각합니다.
PJTraill

"모든 코드"- "GCC가 더 좋습니다"= "어셈블러를 사용합니다". 예, 어셈블러 삽입없이 레지스터에 액세스 할 수 있습니다.
Evil

@PJTraill-Slebetman의 의견은 일반적으로 우수하며 아마도 답변에 포함되어야합니다. 그러나 그의 두 가지 사례 (등록 액세스 및 Linux 소스 트리)는 gcc 확장자로 C에서 할 수없는 일에 대한 훌륭한 사례가 아니라 일반적인 오해를 불러 일으킬 수 있습니다 . 그것들은 교체되거나 생략되어야합니다. (오늘날 무언가를해야하는 HW 교육이 있다면, 지금부터 매년 1 년 동안 해당 gcc 연장을 갖게 될 것입니다. 항상 그런 것은 아니지만 종종 예입니다.)
Jirka Hanika

3

Microsoft는 MSIL 을 중간 어셈블리 언어로 발명했습니다 . 프로그램은 C # 또는 VB.Net에서 MSIL로 컴파일됩니다. 런타임시 MSIL은 JIT 컴파일러를 사용하여 실행중인 머신의 머신 코드로 컴파일되었습니다 . MSIL을 포함하는 파일은 X86의 시작 부분에 프로그램을 시작하기위한 몇 가지 지침이있는 .EXE 파일입니다. ARM 프로세서에서는 프로그램 이름 앞에 mono라는 단어를 입력하여 실행합니다.


"중급 어셈블리 언어"와 "가상 머신"의 차이점은 무엇입니까?
밥 자비스-복직 모니카

@BobJarvis : 하나는 코드이고 다른 하나는 인터프리터입니다. 당신은 중간 조립 및 바이트 코드의 차이 무엇을 요구해야
slebetman

이것은 질문에 대답하지 않는 것 같습니다. 각 머신이 MSIL을 다르게 컴파일 / 어셈블리하는 한, 그에 대해 보편적 인 것은 없으며, 이러한 컴파일의 목적은 일반적인 기능을 포팅하는 것이며 DW가 지적한 것처럼 특정 명령 세트를 이용하는 것은 아닙니다. a) 어셈블러를 사용하는 이유.
PJTraill

3

언급했듯이 LLVM은 지금까지 가장 가까운 것입니다. 실제로 보편적 인 언어에 대한 큰 장벽은 동시성, 메모리 사용, 처리량, 대기 시간 및 전력 소비와 같은 암묵적인 트레이드 오프와 관련된 근본적인 차이가 될 것입니다. 명시 적으로 SIMD 스타일로 쓰면 너무 많은 메모리를 사용하고있을 수 있습니다. 명시 적으로 SISD 스타일로 작성하면 차선의 병렬화가 발생합니다. 처리량을 최적화하면 지연 시간이 줄어 듭니다. 단일 스레드 처리량 (예 : 클럭 속도)을 최대화하면 배터리 수명이 단축됩니다.

최소한 코드에는 트레이드 오프로 주석을 달아야합니다. 가장 중요한 것은 언어에 우수한 대수 / 유형 속성이있어 컴파일러에 논리적 불일치를 최적화하고 감지 할 수있는 충분한 공간을 제공하는 것입니다.

그런 다음 정의되지 않은 동작에 대한 문제가 있습니다. C 및 어셈블리 언어의 속도의 대부분은 정의되지 않은 동작에서 비롯됩니다. 실제로 발생하는 정의되지 않은 동작을 인정하면이를 특수한 경우 (예 : 아키텍처 및 컨텍스트 특정 핵)로 처리하게됩니다.


0

아마도 당신이 찾고있는 것은 모든 사람이 명령의 기호에 동의하는 범용 터닝 머신 표기법 일 것입니다. ( https://ko.wikipedia.org/wiki/Universal_Turing_machine )

선삭 가능 언어를 기본 공급 업체별 기계 코드로 변환하고 컴퓨터라고하는 모든 것을 위해 빌드되는 '어셈블러'.

에서 프로그래밍 컴퓨터의 예술 은이가 어떻게 보이는지의 예제가있다.

그러나 "모든 컴퓨터에서 사용할 수있는 상용 언어가 아닌 이유는 무엇입니까?"라는 질문을 고려해보십시오. 가장 영향력이 큰 영향은 (1) 편의성입니다. 모든 어셈블리 언어가 가장 사용하기 쉬운 것은 아닙니다. (2) 다른 브랜드의 기계와 벤더 사이의 경제성, 제공, 비 호환성은 기계 설계에 한정된 자원 (시간 / 돈)의 결과뿐만 아니라 비즈니스 전략입니다.


문제는 "유니버설 튜링 머신 (universal Turing machine)"의 의미에서 보편적 인 어셈블리 언어가 아니라, 모든 컴퓨터를 프로그래밍하는데 사용될 수있는 어셈블리 언어에 대한 질문이다.
David Richerby

1
Church-Turing은 UTC가 프로그래밍 가능한 컴퓨터로 할 수있는 일을 할 수 있다고 말합니다. 유한 한 물리적 스토리지 문제를 제외하고. UTC의 어셈블리 언어는 실현 가능합니다. 그러나 내가 말했듯이 문화 및 경제 실용성은 시장에서의 실제 구현 및 채택을 제한 할 수 있습니다.
Chris

가장 큰 문제가 빠졌 습니다 . 바로 성능입니다 ! 하드웨어에 구애받지 않는 높은 목표를 위해 왜 언어를 1000 배 더 느리게 사용합니까? Turing Machine은 실용적인 컴퓨팅을위한 끔찍한 모델입니다.
Artelius

1
해설자는 자신의 주장을 뒷받침하는 컴퓨터 과학을 제공해야합니까? 이것은 모든 컴퓨터 과학 포럼 이후입니다.
Chris

1
저는 CS 전문가가 아닙니다. 그러나 내가 생각하는 것은 von Neumann 아키텍처는 프로그래밍 기능과 성능 사이의 균형을 잡는 훌륭한 엔지니어링 조각이며 Turing 머신의 목적은 가장 기본적인 머신조차도 더 복잡한 머신이 할 수있는 모든 것을 계산할 수 있음을 보여주는 것입니다. 물론, 튜링 머신에 더 많은 기능을 계속 추가 할 수 있지만 (테이프, 산술), 처음에했던 것과 같은 문제, 즉 명령어 세트에 동의하지 않는 사람들이 있습니다. 또한 랜덤 액세스가 없기 때문에 많은 알고리즘에서 큰 오버 헤드가 발생합니다.
Artelius

0

가정 : 고급 언어 L1을 하위 언어 L0으로 컴파일하고 최적화하는 것이 고급 언어 L2 (L1보다 높음)를 L0으로 컴파일하고 최적화하는 것보다 쉽습니다. L2에서 L0보다 L1에서 L0을 컴파일 할 때 더 최적화 된 코드를 생성 할 수 있다는 점에서 더 쉽습니다.

나는 아마도 가정이 맞다고 생각합니다. 그래서 아마도 대부분의 컴파일러는 저수준 중급 언어 (IR / LLVM)를 사용합니다.

이것이 사실이라면, 저수준 언어 L0을 사용하고 L0을 다른 저수준 언어로 번역하기 위해 컴파일러를 작성하십시오. 예를 들어 MIPS 명령어 세트를 사용하여 x86, arm, power, ...로 컴파일하십시오.

-타우 픽


그래서 당신은 당신의 대답이 사실인지 알지 못합니까? 그리고 그것을 지원할 수 없습니까?
Evil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.