본질적으로 추상화는 프로그래머와 시스템의 하위 계층 (컴파일러, 라이브러리 및 런타임 시스템) 모두에 대한 정보 통신을 줄입니다. 추상화를 위해, 이것은 일반적으로 하위 계층이 프로그래머가 지정되지 않은 동작과 관련이 없다고 가정 할 수있게하여 지정된 동작을 제공하는 데 더 큰 유연성 을 제공합니다.
이 "무정의"측면에서 얻을 수있는 잠재적 이점의 예는 데이터 레이아웃입니다. C (낮은 추상화)에서 컴파일러는 데이터 레이아웃 최적화에 더 제한적입니다. 컴파일러가 (예를 들어, 프로파일 정보를 통해) 핫 / 콜드 또는 허위 공유 방지 최적화가 유리할 것임을 식별 할 수 있더라도, 일반적으로 그러한 적용이 금지된다. ( "as as"를 지정하는 것은 자유로울 수 있습니다. 즉, 사양을보다 추상적으로 취급하지만 모든 잠재적 부작용을 도출하면 컴파일러에 부담이됩니다.
보다 추상적 인 사양은 또한 트레이드 오프와 사용의 변화에 대해 더욱 강력합니다. 하위 시스템은 새로운 시스템 특성 또는 새로운 용도를 위해 프로그램을 재 최적화하는 데 제약이 적습니다. 보다 구체적인 사양은 프로그래머가 다시 작성하거나 하위 계층에서 "있는 것처럼"동작을 보장하기 위해 추가 노력을 기울여야합니다.
정보 숨기기 추상화의 성능을 저해하는 측면은 "표현할 수 없음"이며, 하위 계층은 일반적으로 "모름"으로 처리합니다. 이는 하위 계층이 일반적인 일반 용도, 대상 용도 또는 특정 프로파일 정보와 같은 다른 수단과의 최적화에 유용한 정보를 식별해야 함을 의미합니다.
정보 숨기기의 영향은 다른 방향에서도 작동합니다. 프로그래머는 모든 세부 사항을 고려하고 지정하지 않아도 생산성을 높일 수 있지만 프로그래머는 높은 수준의 설계 선택의 영향에 대한 정보가 적을 수 있습니다.
다른 한편으로, 코드가 더 구체적 일 때 (추상적이지 않은 경우), 시스템의 하위 계층은 지시를 받았을 때 지시받은 것을 더 간단하게 수행 할 수 있습니다. 코드가 대상 용도로 잘 작성되면 대상 용도에 잘 맞습니다. 덜 추상적 인 언어 (또는 프로그래밍 패러다임)는 프로그래머 가 세부 설계 및 주어진 언어로 쉽게 하위 계층에 전달할 수없는 정보를 사용하여 구현을 최적화 할 수 있도록 합니다 .
언급 된 바와 같이, 추가적인 프로그래머 기술 및 노력이 가치있는 결과를 생성 할 수있을 때 덜 추상적 인 언어 (또는 프로그래밍 기술)가 매력적이다. 더 많은 프로그래머 노력과 기술이 적용되면 결과는 일반적으로 더 좋습니다. 또한 성능에 중요한 응용 프로그램에 덜 사용되는 언어 시스템 (개발 노력이나 안정성을 강조하는 대신 경계 검사 및 가비지 수집은 프로그래머의 생산성뿐만 아니라 정확성에 관한 것입니다. 추상화는 프로그래머의 정신 부하를 줄여 신뢰성을 향상시킬 수 있습니다) 성능 향상에 대한 압력이 줄어 듭니다.
최적화는 일반적으로 특정 용도에 맞게 코드를 조정하여 최적화 할 수 있기 때문에 반복하지 마십시오. 이것은 명백한 신뢰성과 프로그래밍 노력에 영향을 미칩니다.
언어에 의해 제공되는 추상화는 또한 덜 무거운 추상화를 선택할 수단이없는 바람직하지 않거나 불필요한 작업을 포함 할 수 있습니다. 하위 계층에서 불필요한 작업을 발견하고 제거 할 수있는 경우도 있지만 (예 : 경계 검사가 루프 본문에서 추출되어 일부 경우에는 완전히 제거 될 수 있음),이를 위해 유효한 최적화를 결정하려면 더 많은 "기술과 노력"이 필요합니다. 컴파일러
언어 연령과 인기도 숙련 된 프로그래머의 가용성과 시스템의 하위 계층 품질 (성숙한 라이브러리 및 코드 예제 포함) 모두에서 중요한 요소입니다.
이러한 비교에서 또 다른 혼란 요인은 사전 컴파일과 적시 컴파일 간의 다소 직교적인 차이입니다. JIT (Just-In-Time) 컴파일은 프로파일 정보 (프로그래머에 의존하지 않고 프로파일 실행을 제공하지 않음) 및 시스템 별 최적화 (시간 단위 컴파일이 광범위한 호환성을 목표로 할 수 있음)를보다 쉽게 이용할 수 있지만 공격적인 최적화의 오버 헤드는 다음과 같이 설명됩니다. 런타임 성능의 일부. JIT 결과를 캐싱하여 일반적으로 사용되는 코드의 오버 헤드를 줄입니다. (이진 재 최적화의 대안은 JIT 컴파일의 몇 가지 장점을 제공 할 수 있지만, 기존의 이진 배포 형식은 대부분의 소스 코드 정보를 삭제하여 시스템이 특정 구현에서 의도를 식별하도록합니다.)
(프로그래머 제어에 중점을두기 때문에 추상화 언어가 낮을수록 사전 컴파일 사용을 선호합니다. 링크 타임 구현 선택은 더 큰 프로그래머 제어를 제공하지만 설치 시간 컴파일은 허용 될 수 있습니다. JIT 컴파일은 중요한 제어를 희생시킵니다. )
벤치마킹 방법론의 문제도 있습니다. 동등한 노력 / 기술은 확립하기가 사실상 불가능하지만, 언어 목표가 결과를 편향시킬 수도 있습니다. 낮은 최대 프로그래밍 시간이 필요한 경우, 더 추상적 인 언어의 간단한 관용적 표현에 비해 덜 추상적 인 언어의 프로그램을 완전히 작성하지 못할 수도 있습니다. 높은 최대 프로그래밍 시간 / 노력이 허용 된 경우, 저 추상 언어가 유리할 것입니다. 최선의 노력의 결과를 나타내는 벤치 마크는 자연스럽지 않은 언어에 유리하게 편향 될 수 있습니다.
다른 프로그래밍 패러다임의 장점을 얻기 위해 언어로 덜 관용적 인 방식으로 프로그래밍하는 것이 때때로 가능하지만, 표현력이 이용 가능한 경우에도 그러한 표현을위한 트레이드 오프는 바람직하지 않을 수 있습니다.