트램펄린(컴퓨팅)
Trampoline (computing)이 문서는 Wikipedia의 품질 기준에 맞게 다시 작성해야 할 수 있습니다.(2009년 6월) |
컴퓨터 프로그래밍에서 트램펄린이라는 단어는 여러 가지 의미를 가지며 일반적으로 점프 명령과 관련이 있다(즉, 다른 코드 경로로 이동).
저수준 프로그래밍
트램폴린(간접 점프 벡터라고도 함)은 인터럽트 서비스 루틴, I/O 루틴 등을 가리키는 주소를 유지하는 메모리 위치입니다.실행은 트램펄린에 뛰어들어 즉시 튀어나오거나 튀어오릅니다. 그래서 트램펄린이라는 용어입니다.용도에는 다음과 같은 것이 있습니다.
- 트램펄린은 항상 고정된 위치에서 벡터를 찾을 것으로 예상되는 중앙 처리 장치(CPU) 아키텍처에 의해 부과되는 한계를 극복하기 위해 사용할 수 있습니다.
- symmetric multiprocessing(SMP; 대칭형 멀티프로세서) 머신으로 operating system을 기동하면 액티브한 프로세서는 부트스트랩프로세서 1개뿐이에요운영체제가 자체적으로 구성되면 다른 프로세서에 프로세서를 초기화하는 트램펄린 코드로 이동하여 운영체계가 스레드 스케줄링을 시작할 때까지 기다리도록 지시합니다.
고급 프로그래밍
- 일부 Lisp 구현에서 사용되는 것처럼 트램펄린은 퉁크 리턴 함수(연속 통과 스타일)를 반복적으로 호출하는 루프입니다.하나의 트램펄린으로 프로그램의 모든 제어 전송을 표현할 수 있습니다. 이렇게 표현된 프로그램은 트램펄린 또는 트램펄린 스타일로 표현됩니다. 프로그램을 트램펄린 스타일로 변환하는 것은 트램펄린입니다.프로그래머는 trampoline 함수를 사용하여 스택 지향 프로그래밍 [1]언어로 테일 재귀 함수 호출을 구현할 수 있습니다.
continuation-passing 스타일은 많은 제어 흐름 구조를 우아하게 표현할 수 있고 테일 콜 최적화가 쉽기 때문에 함수 언어의 컴파일러에게 인기 있는 중간 형식입니다.최적화된 테일콜이 없는 언어로 컴파일 할 경우 trampolining이라는 기술을 사용하여 스택 증가를 방지할 수 있습니다.이 아이디어는 함수 내부에서 최종 연속 호출을 하는 것이 아니라 종료하고 트램펄린으로 연속 호출을 되돌리는 것입니다.그 트램펄린은 단순히 반복된 연속성을 유발하는 루프일 뿐이다.따라서 중첩된 함수 호출은 없으며 스택은 [2]증가하지 않습니다.
- Java에서 trampoline은 이벤트 청취자 등 내부 클래스를 사용하지 않기 위해 반사를 사용하는 것을 말합니다.리플렉션 콜의 시간 오버헤드는 내부 클래스의 공간 오버헤드와 교환됩니다.Java의 trampolines는 보통 외부 클래스에 이벤트를 [3]전달하기 위한 GenericListener를 만듭니다.
- 코드 조각을 호환성이 없는 호출 규약과 인터페이스 할 경우, 트램펄린은 발신자의 규약을 착신자의 규약으로 변환하기 위해 사용됩니다.
- 임베디드 시스템에서 트램폴라인은 다른 코드 조각을 시작하는 짧은 코드 조각입니다.예를 들어 인터럽트 핸들러를 완전히 어셈블리 언어로 쓰는 것이 아니라 인터럽트 핸들러를 주로 C로 쓰고 짧은 트램펄린을 사용하여 어셈블리 언어 인터럽트 호출 규약을 C 호출 [4]규약으로 변환하는 방법도 있습니다.
- C 함수를 호출할 것으로 예상되는 시스템에 콜백을 전달할 때 C++로 기술된 클래스의 특정 인스턴스의 메서드를 실행하는 경우 짧은 트램펄린을 사용하여 C 함수 호출 규칙을 C++ 메서드 호출 규칙으로 변환합니다.그런 트램펄린을 쓰는 한 가지 방법은 [5]퉁크를 사용하는 것이다.또 다른 방법은 범용 [3]청취자를 사용하는 것입니다.
- Objective-C에서 trampoline은 전송되는 모든 메시지를 캡처하여 재현한 다음 다른 오브젝트(예를 들어 상위 메시징)[6]에 "바운스"하는 메서드에 의해 반환되는 오브젝트입니다.
- GCC 컴파일러에서 트램펄린은 중첩된 [7]함수에 대한 포인터를 구현하기 위한 기술을 참조합니다.트램펄린은 중첩된 함수의 주소를 얻었을 때 스택에서 즉시 생성되는 작은 코드 조각입니다.트램펄린은 정적 링크 포인터를 설정하여 중첩된 함수가 주변 함수의 로컬 변수에 액세스할 수 있도록 합니다.함수 포인터는 단순히 트램펄린의 주소입니다.이를 통해 코드 주소와 정적 [8][9][10]링크를 모두 전송하는 중첩된 함수에 대해 "팻" 함수 포인터를 사용할 필요가 없습니다.단, 이는 보안상의 이유로 스택을 실행 불가능으로 만들려는 욕구와 상충됩니다.
- 난해한 프로그래밍 언어인 Befunge에서 트램펄린은 제어 흐름에서 다음 셀을 건너뛰는 명령이다.
실행하지 않는 스택
trampolines의 일부 구현으로 인해 실행 중지 스택(NX 스택)이 손실됩니다.특히 GNU 컴파일러 컬렉션(GCC)에서는 네스트된 함수가 실행 시 스택 상에 트램펄린을 구축하고 스택 상의 데이터를 통해 네스트된 함수를 호출합니다.trampoline을 사용하려면 스택이 실행 가능해야 합니다.
no-execute 스택과 nested 함수는 GCC에서 서로 배타적입니다.프로그램 개발에 네스트된 함수를 사용하면 NX 스택은 자동으로 손실됩니다.GCC는 상태를 경고하기 위한 경고를 제공합니다.
안전한 개발 라이프 사이클을 사용하여 설계된 소프트웨어에서는 NX [11]스택의 손실로 인해 중첩된 기능을 사용할 수 없는 경우가 많습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Baker, Henry G. (September 1995). "CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A." ACM SIGPLAN Notices. 30 (9): 17–20. doi:10.1145/214448.214454. Archived from the original on 2016-11-11.
- ^ JavaScript의 비동기 프로그래밍 및 연속 전달 스타일 - 2ality
- ^ a b Muller, Hans (2005-01-31). "Asserting Control Over the GUI: Commands, Defaults, and Resource Bundles". today.java.net. Trampolines. Retrieved 2015-11-06. [1]
- ^ Link, Joseph M. (2001-09-01). "Trampolines for Embedded Systems: Minimizing interrupt handlers latency". Dr. Dobb's Journal. Archived from the original on 2018-05-27. Retrieved 2018-05-26.
- ^ Stangvik, Einar Otto (2006-08-16). "Thunking in Win32 with C++". Archived from the original on 2012-10-15.
- ^ Weiher, Marcel (2004). "Higher Order Messaging (HOM)" (PDF). Archived (PDF) from the original on 2018-05-27. Retrieved 2018-05-26.
- ^ fuz (2011-11-18). "Implementation of nested functions". StackOverflow. Archived from the original on 2016-03-29. Retrieved 2018-05-26.
- ^ "Trampolines for Nested Functions". Using the GNU Compiler Collection (GCC). 2018 [2002]. 18.11. Archived from the original on 2018-05-27. Retrieved 2018-05-26.
- ^ "Nested functions". Using the GNU Compiler Collection (GCC). 2018 [2002]. 6.4. Archived from the original on 2018-05-27. Retrieved 2018-05-26.
- ^ Breuel, Thomas M. (2013). "Lexical Closures for C++" (PDF). Archived (PDF) from the original on 2017-12-12. Retrieved 2018-05-26.
- ^ Walton, Jeffrey; Manico, Jim; Wall, Kevin (2018-03-02) [2013]. "C-Based Toolchain Hardening". The Open Web Application Security Project (OWASP). Archived from the original on 2018-05-27. Retrieved 2018-03-02.