2017-02-12 1 views
-1

저는 컴퓨터 과학 및 프로그래밍에 대해 배우기 시작한 이래로 높은 성능을 얻으려면 C 나 MIPS와 같은 저급 언어로 코드를 작성하고 더 높은 이식성, 높은 수준의 언어, Java 또는 Perl과 유사합니다.컴파일러는 사람보다 더 나은 어셈블리 코드를 생성합니까?

그러나 컴파일러가 순진한 어셈블리를 생성 한 70 년대에는 이것이 사실이었습니다. 따라서 전문적인 인간 코더가 가장 좋습니다. 현대 컴파일러가 마스터 어셈블리 코더와 유사한 코드를 생성하는 오늘날의 상황은 어떻습니까?

컴파일러가 훨씬 더 낫을 때 MIPS와 같은 어셈블리를 배우는 것이 가치가 있습니까? 왜 까다 롭고 오류가 발생하기 쉬운 어셈블리 언어로 작성하는 데 오랜 시간이 걸릴까요?

+2

개발할 플랫폼에 따라 다릅니다. 제한된 자원을 가진 장치에 대한 임베디드 코드를 작성하는 경우 컴파일 된 언어로 실제로 개발하더라도 저급 프로그래밍을 알아야합니다. 카운트에 사용 된 모든 바이트가 시간에 맞춰 돌아갑니다. –

+1

Agner Fog가 어떤 종류의 인간인지에 따라 다릅니다. 그러나 하루에 여러 번 반복하여 반복적으로하고 모든 세부 사항에주의를 기울이는 것은 인간이 항상 밖으로 빠져 나가는 곳입니다. Agner도 마찬가지입니다. 그렇지 않으면 결코 가난하지 않을 지식의 종류입니다. –

+0

컴파일러는 자동으로 인간보다 우수합니다. 왜냐하면 당신이 사용할 수 있기 때문에 컴파일러는 사용할 수 없기 때문입니다. 최악의 경우, 그것을 이길 수있는 방법을 찾지 못할 수도 있습니다. – harold

답변

2

컴파일러는 인간에 의해 만들어지며 정의에 따라 사람을 만드는 것보다 낫지 않습니다. 컴파일러는 일반적으로 어떤 사람보다 성능이 뛰어날 수 없습니다. 그렇습니다. 그러나 많은 사람들은 컴파일러의 출력을 검사하고 프로젝트의 크기에 따라 컴파일러의 출력을 향상시킬 수 있습니다.

대부분의 컴파일러는 시스템을 이해하지 못하고 일반적으로 가르쳐 왔지만 조정할 수는 있지만 메모리를 사용할지 여부를 자동으로 알지 못하거나 특정 캐시에 맞게 조정할 수 없습니다. 시스템 등

컴파일러는 피곤하지 않고 일관성이 있으며 인간에 비해 매우 빠릅니다. 그래서 어떤 규모의 프로젝트에서나, 컴파일러가 충분히 좋은 것보다 큰 것을 말하십시오.

참고 : C에 대해서는 낮은 수준이 아니며 JAVA 나 Perl도 성과라는 단어와 함께 의미가 없습니다. 퍼포먼스에 대한 질문이있는 경우에도 높은 수준 또는 낮은 수준이 아니라 디자인에 따라 느리고 목표가 다르며 특히 이식성이 뛰어나므로 선택의 여지가 없습니다. 초반 C 목표에도 불구하고 C보다. JAVA는 어느 정도 자랑스럽게 말하지만 그것이 최적화되어 있지는 않다는 것을 자랑스럽게 말하면서, 가상 머신 스택에 설정된 가상 명령어 세트입니다. 그래서 모든 것이 천천히 진행됩니다. Pascal은이 성능 컨텍스트 또는 ADA에서 또 다른 선택 일 수 있습니다. 후자의 2 개는 약간 딱딱하고 컴파일하기가 쉽고 C보다 엄격한 코드를 생성하므로 C보다 낮 으면 레벨이 낮습니다.

예를 들어 어셈블리 언어 MIPS 또는 ARM을 배우는 것이 가장 좋습니다. 예를 들어 자신의 질문에 대한 답을 알고있을 것입니다.

의견에서 언급했듯이이 질문을 많이 받았을 때마다 (왜 지난 몇 십 가지 질문과 대답을 읽지 못했습니까?) 컴파일러가 무거운 짐을 싣게하고 정말로 좋은 이유가 있다면 성능이 좋지 않은 섹션을 컴파일러 출력으로 가져 와서 개선하거나 필요한 경우 바꾸십시오. 그렇습니다. 모래 조각만을 사용하여 조각품을 "조각"할 수는 있지만, 조각과 망치를 사용하여 80-90 %의 작업을하고 모래를 그릴 수 있다면 가치가 있습니까? 프로그래밍의 경우 컴파일러를 사용하는 방법을 모르는 경우를 제외하고는 전혀 모래가 필요치 않습니다. 출력 (어셈블리 언어)을 읽는 방법을 모른다면 실용하지 못할 것입니다.

많은 사람들이 "컴파일러가 왜 이것을 했습니까?"라고 물어 보았을 때 가장 적합한 솔루션 일 수도 있고 그렇지 않을 수도있는 장소를 지적한 적이 있습니다. 많은 사람들이 왜 성능에 관한 질문이 아닌 main()에 너무 많은 것을 쌓아 놓았 는가?

다른 문제는 성능의 정의입니다. x86 타겟의 경우 너무 많은 프로세서와 마더 보드가 존재합니다. 특정 주변 장치가있는 특정 메모리가있는 특정 마더 보드의 특정 칩을 조정하려면 해당 시스템에 좋지만 다른 많은 유사한 x86 시스템을 더 느리게 실행하게 만들 수 있습니다. ARM은 같은 문제이지만 다르다.벤치 마크는 너무 조작하기 쉽지 않기 때문에 가짜입니다. 따라서이 경로로 이동하기 전에 실적이 의미하는 바를 스스로 정의해야합니다. 그런 다음 컴파일러에서 결과를 검사 한 다음 개선 할 수 있는지 결정하십시오.

아니요, 컴파일러는 사람이 만들고 인간보다 더 똑똑하지도 않고 뛰어납니다. 그들은 일관성을 유지하면서 훨씬 더 일관되고 확실히 훨씬 빠릅니다.

+1

"JAVA는 어느 정도 자랑스럽게 말하지만 그것이 최적화되지 않았다"- 와우, 그건 강력한 진술이다. Java 컴파일러는 이유에 대해 최적화하지 않습니다. * 간단한 * 바이트 코드를 생성하여 JIT에서 런타임, 실행 시간 및 방법에 따라 실제로 최적화 할 수 있습니다. 감각. – JimmyB

+0

그래서 우리는 일반적으로 머신 코드에 최적화 된 컴파일을 중단하고 프로세서가 런타임에 최적화를 수행해야한다고 생각하십니까? 이 경우 나 JAVA의 경우에는 의미가 없으며, 런타임에 너무 늦어서 너무 느리다. JAVA 바이트 코드는 명령어 세트이며, 명령어 세트로 컴파일 할 때 최적화하지 않을 이유가 없다. –

+0

실행 시간이 정시에 최적화되면 더 나은 해결책이되고 운영 체제가 정상적으로 작동하는 것을 볼 수 있지만 컴파일 타임에 실행되지 않는 코드 및 기타 개선 사항은 런타임에 표시되지 않습니다. 그렇다면 왜 한 가지 교훈 세트가 특별해야할까요? 그것은 아니다. –

관련 문제