IT이야기

후드 아래에서 예외는 어떻게 구현됩니까?

cyworld 2022. 7. 23. 11:17
반응형

후드 아래에서 예외는 어떻게 구현됩니까?

거의 모든 사람이 사용하고 있지만, 저를 포함한 많은 사람들은 그냥 일하는 것을 당연하게 생각합니다.

저는 고품질의 소재를 찾고 있습니다.제가 사용하는 언어는 Java, C, C#, Python, C++ 입니다.그래서 가장 관심이 많습니다.

C++는 그 언어로 어떤 것이든 던질 수 있기 때문에 아마도 시작하기에 좋은 장소일 것입니다.

또한 C는 조립에 가깝습니다.조립체가 없는 순수한 C구조를 사용하여 예외를 어떻게 에뮬레이트할 수 있습니까?

마지막으로 구글 직원들이 속도 문제로 일부 프로젝트에 예외를 두지 않는다는 소문을 들었습니다.이건 그냥 루머인가?그들 없이 어떻게 실질적인 일을 해낼 수 있을까요?

감사합니다.

예외는 고급 비로컬 흐름 제어 구조의 보다 일반적인 예에 불과합니다.기타 예는 다음과 같습니다.

  • notifications(예외의 일반화.원래는 일부 오래된 Lisp 오브젝트시스템에서 현재는 에 실장되어 있습니다).CommonLisp 및 Ioke)
  • 연속(더 구조화된 형태)GOTO 언어에서 사용됨) (「 」, 「 」)
  • coroutines(특히 Lua에서 인기 있는 서브루틴의 일반화),
  • 생성기 - 라 Python(기본적으로 코루틴의 제한된 형식),
  • 섬유(경량 스레드) 및 물론 이미 언급한 것
  • GOTO.

(제가 놓친 다른 많은 것들이 있을 것입니다.)

이들 구성의 흥미로운 특성은 모두 표현력이 거의 동일하다는 것입니다.하나가 있으면 다른 모든 것을 쉽게 만들 수 있습니다.

따라서 예외를 가장 잘 구현하는 방법은 사용 가능한 다른 구성에 따라 달라집니다.

  • 에는 'CPU'가 탑재되어 있습니다.GOTO그렇기 때문에 필요하다면 언제든지 그 상태로 되돌릴 수 있습니다.
  • 에는 C가 있다setjmp/longjmp기본적으로 맥가이버의 연속극입니다(덕트테이프와 이쑤시개로 만들어져 실제는 아니지만, 더 좋은 것이 없다면 적어도 즉각적인 문제에서 벗어날 수 있습니다).
  • JVM과 CLI에는 각각 예외가 있습니다.즉, 언어의 예외 시멘틱이 Java/C#과 일치하면 홈 프리입니다(그렇지 않으면 나사가 됩니다).
  • Parrow VM은 예외이자 계속입니다.
  • Windows 에는, 언어 실장자가 독자적인 예외 처리를 위한 프레임워크가 있습니다.이 프레임워크는 언어 실장자가 자신의 예외를 위에서 작성하는 데 사용할 수 있습니다.

예외 사용 및 예외 구현 모두 Microsoft Live Lab의 Volta Project입니다.(이제 없어졌습니다.)Volta의 목표는 버튼을 누르는 것만으로 웹 애플리케이션을 위한 아키텍처 리팩터링을 제공하는 것이었습니다.따라서 1계층 웹 어플리케이션을 2계층 또는 3계층 어플리케이션으로 변경할 수 있습니다.[Browser] ★★★★★★★★★★★★★★★★★」[DB].그런 다음 NET 코드와 코드가 클라이언트 또는 DB에서 자동으로 실행됩니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★NET 자바스크립트

이제 VM 전체를 JavaScript로 작성하고 바이트 코드를 변경하지 않고 실행할 수 있습니다(기본적으로 C++에서 JavaScript로 CLR을 포트합니다).실제로 이를 수행하는 프로젝트(HotRuby VM 등)가 있지만 이는 비효율적이며 다른 JavaScript 코드와의 상호 운용성도 높지 않습니다.

대신 CIL 바이트 코드를 JavaScript 소스 코드로 컴파일하는 컴파일러를 작성했습니다.단, JavaScript에는 다음과 같은 기능이 없습니다.NET에는 (제너레이터, 스레드, 2개의 예외 모델도 100% 호환성이 없습니다)그리고 더 중요한 것은 컴파일러 라이터가 좋아하는 기능이 결여되어 있다는 것입니다.GOTO또는 계속)를 사용하여 상기의 누락된 기능을 구현할 수 있습니다.

단, JavaScript에는 예외가 있습니다.그래서 그들은 JavaScript Exceptions를 사용하여 Volta Continuations를 구현하고 Volta Continuations를 사용하여 구현했습니다.NET 예외, 입니다.NET Generators 및 심지어.NET 관리 스레드(!!!)

그래서, 당신의 첫 번째 질문에 대답하기 위해:

후드 아래에서 예외는 어떻게 구현됩니까?

아이러니하게도 예외는 있지만!적어도 이 아주 구체적인 경우에는요.

또 하나의 좋은 예는 Go 메일링 리스트의 예외 제안 중 일부입니다.Goroutines(동시 코루틴과 CSP 프로세스의 혼합 등)를 사용하여 예외를 구현합니다.또 다른 예로는 Monads, 느린 평가, 테일 콜 최적화 및 고차 함수를 사용하여 예외를 구현하는 Haskell이 있습니다.일부 최신 CPU는 예외에 대한 기본 구성 요소도 지원합니다(예를 들어 Azul Systems Java Compute Accelerator용으로 특별히 설계된 Vega-3 CPU).

C++ 예외를 구현하는 일반적인 방법은 다음과 같습니다.
http://www.codesourcery.com/public/cxx-abi/abi-eh.htmlhttpwww..com/public/cxx-abi/abi-eh.html

Itanium 아키텍처용이지만, 여기서 설명하는 구현은 다른 아키텍처에서도 사용됩니다.C++ 예외는 복잡하기 때문에 긴 문서입니다.

다음은 LLVM이 예외를 구현하는 방법에 대한 좋은 설명입니다.
http://llvm.org/docs/ExceptionHandling.htmlhttpllvm.org/docs/.html

LLVM은 많은 런타임에 공통적인 중간 표현을 의미하기 때문에 설명된 메커니즘은 여러 언어에 적용될 수 있습니다.

그의 저서 C 인터페이스와 구현: 재사용 가능한 소프트웨어를 작성하는 기술, D.R. Hanson은 매크로와 매크로 세트를 사용하여 순수 C에서 예외를 적절하게 구현합니다.setjmp/longjmpTRI / RAISE / EXCLUDE / FINDLY 。이 매크로에서는 C++ 예외의 거의 모든 처리를 에뮬레이트할 수 있습니다.

코드는 여기서 읽을 수 있습니다(제외를 참조해 주세요.h/except.c).

추신: 구글에 대한 질문입니다.종업원은 실제로 새로운 코드에서 예외를 사용할 수 있습니다.구 코드에서의 사용이 금지되는 공식 이유는 이미 그렇게 쓰여져 있고 스타일을 혼합하는 것은 의미가 없기 때문입니다.

개인적으로도 예외 없는 C++는 좋은 생각이 아니라고 생각해요.

C/C++ 컴파일러는 예외 처리를 위해 기본 OS 기능을 사용합니다.등의 프레임워크.또한 Net 또는 Java는 VM에서 OS 설비에 의존합니다.예를 들어 Windows에서는 구조화된 예외 처리 인프라스트럭처인 SEH에 의해 실제로 많은 작업이 수행됩니다.이전 참조 기사인 A Crash Course of Win32™ Structured Exception Handling을 꼭 읽어보시기 바랍니다.

예외를 사용하지 않는 경우의 비용은 비싸지만, 어떤 것에 비해서입니까?반품 오류 코드와 비교합니까?정확성 비용과 코드 품질을 고려하면 상용 애플리케이션에서는 예외가 항상 승리합니다.OS 레벨의 매우 중요한 기능이 거의 없는 한 예외는 항상 전체적으로 우수합니다.

마지막으로 흐름 제어에 대한 예외 사용의 안티패턴이 있습니다.예외는 예외여야 하며 흐름 제어에 대한 예외를 남용하는 코드는 성능 면에서 대가를 치르게 됩니다.

(후드 아래) 예외 구현에 대해 지금까지 작성된 최고의 논문은 Barbara Liskov와 Alan Snyder가 CLU에서 예외 처리입니다.새로운 컴파일러를 시작할 때마다 참조해 왔습니다.

의 구현에 수준의 는 C를 사용하여 합니다.setjmp ★★★★★★★★★★★★★★★★★」longjmpDave Hanson의 C Interfaces and Implementations(Eli Bendersky 등)를 추천합니다.

setjmp() ★★★★★★★★★★★★★★★★★」longjmp()★★★★★★ 。

예외 포착에는 사소한 비용이 들지만 대부분의 경우 큰 문제가 되지 않습니다.

예외 구현에서 처리해야 하는 중요한 것은 예외가 발생한 후 예외 핸들러로 돌아가는 방법입니다.C++에서의 try 스테이트먼트 이후 임의의 수의 네스트 함수 콜을 발신했을 가능성이 있기 때문에 핸들러를 검색하는 콜스택을 해제해야 합니다.단, 구현되어 있어도 이 조작을 실행하기 위해서는 충분한 정보를 유지하기 위한 코드사이즈 비용이 필요합니다(통상은 예외를 받아들일 수 있는 콜의 데이터 테이블을 의미합니다).또한 동적 코드 실행 경로가 단순히 함수 호출에서 돌아오는 것보다 더 길다는 것을 의미합니다(대부분의 플랫폼에서는 상당히 저렴한 작업입니다).구현에 따라 다른 비용도 발생할 수 있습니다.

상대 비용은 사용하는 언어에 따라 달라집니다.사용되는 언어가 높을수록 코드 크기 비용은 중요하지 않으며 예외 사용 여부에 관계없이 정보가 유지될 수 있습니다.

좋은 이유로 예외(및 일반적으로 C++)를 사용하지 않는 어플리케이션은 임베디드 펌웨어입니다.일반적인 소형 베어메탈 또는 RTOS 플랫폼에서는 코드 공간이 1MB 또는 64K 이하일 수 있습니다.일부 플랫폼은 너무 작아서 C조차 실용적이지 않습니다.이러한 환경에서는 위에서 설명한 비용 때문에 규모에 미치는 영향이 중요합니다.표준 라이브러리 자체에도 영향을 미칩니다.임베디드 툴 체인 벤더는 예외 기능 없이 라이브러리를 제작하는 경우가 많아 코드 크기에 큰 영향을 미칩니다.고도로 최적화된 컴파일러는 콜그래프를 분석하여 언인드 조작에 필요한 콜프레임 정보를 최적화하여 공간을 대폭 줄일 수도 있습니다.또한 예외는 까다로운 실시간 요구사항을 분석하는 것을 더욱 어렵게 만듭니다.

보다 일반적인 환경에서는 코드 크기 비용은 거의 무관하며 성능 요소가 핵심일 수 있습니다.사용 여부는 성능 요구 사항 및 사용 방법에 따라 달라집니다.예외적이지 않은 경우에 예외를 사용하면 우아한 디자인을 만들 수 있지만 고성능 시스템에서는 허용할 수 없는 성능 비용이 들 수 있습니다.구현 및 상대비용은 플랫폼과 컴파일러에 따라 다르기 때문에 예외가 문제가 되는지 여부를 제대로 이해하는 가장 좋은 방법은 자체 코드의 성능을 분석하는 것입니다.

Google의 C++ 코드(일부 Windows 고유의 경우를 제외하고)에서는 예외를 사용하지 않습니다.cfr the guidelines, 짧은 형식: "우리는 C++ 예외를 사용하지 않습니다."설명에서 인용(화살표를 눌러 URL을 확장):

예외 사용에 대한 우리의 조언은 철학적 또는 도덕적 근거가 아니라 실용적인 것에 근거하고 있습니다.Google에서 오픈 소스 프로젝트를 사용하고 싶기 때문에 이러한 프로젝트가 예외를 사용하는 경우 Google 오픈 소스 프로젝트에서도 예외에 대해 조언할 필요가 있습니다.처음부터 다시 해야 한다면 상황은 달라질 것이다.

이 규칙은 Java 및 Python과 같은 다른 언어의 Google 코드에는 적용되지 않습니다.

퍼포먼스에 대해서 - 예외의 희박한 사용은 아마 무시할 만한 영향을 미치겠지만, 그것을 남용하지 마세요.

나는 개인적으로 Java 코드가 더 표준적인 if/returns가 아닌 중요한 루프에서 예외를 사용했기 때문에 가능했던 것보다 두 배나 더 나쁜(x100 정도의 시간이 소요됨) 것을 본 적이 있다.

Objective-C 런타임과 같은 일부 런타임에는 제로 비용 64비트 예외가 있습니다.즉, 트라이 블록에 들어가는 데 비용이 들지 않는다는 것입니다.단, 예외가 발생하면 비용이 많이 듭니다.이는 "평균 사례에 최적화"라는 패러다임을 따릅니다. 예외는 예외적인 것으로 간주되기 때문에, 예외는 매우 느린 예외의 대가를 치르더라도 예외가 없는 경우에는 신속하게 처리하는 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/1995734/how-are-exceptions-implemented-under-the-hood

반응형