반환 지향 프로그래밍은 스택 스매싱의 진화된 버전인가요?
반환 지향형 프로그래밍
반환 지향 프로그래밍은 스택 스매싱의 진화된 버전이다. 일반적으로 공격들의 이러한 종류들은 상대방이 프로그램의 버그(주로 버퍼 오버런)를 이용함으로써 콜 스택을 조작할 때 발생한다. 버퍼 오버런 시에 사용자가 제공하는 데이터를 적절한 경계 검사 없이 메모리에 저장하는 함수는 적정한 양보다 더 많은 데이터를 받아들일 수 있다. 데이터가 스택에 겹쳐써지면 초과된 데이터는 함수의 변수에 할당된 공간을 넘치게 되고 반환 주소도 겹쳐쓰게 된다. 이 주소는 이후에 함수에 의해서 제어 흐름을 다시 호출자로 넘겨줄 때 사용된다. 만약 겹쳐써졌다면 제어 흐름은 새로운 반환 주소로 넘겨지게 된다.
객체 지향 프로그래밍
1990년대 중반 이후로 각광받고 있는 객체 지향 언어는 자바로 가전 제품에 사용될 소프트웨어의 개발 목적으로 썬 마이크로시스템즈의 제임스 고슬링에 의하여 고안된 언어이다. 1993년 고슬링은 월드 와이드 웹에 자바 언어를 적용할 것을 결정하면서 핫자바라는 웹 브라우저를 개발하였고, 이는 1995년 이후 넷스케이프사 쪽에서 지원을 받게 되었다. 자바 언어의 장점은 언어의 단순성과 플랫폼 독립성이다. 특히 언어의 단순성 입장에서 객체 지향 패러다임에 충실하게 언어가 고안되었기 때문에 C++보다 오용의 소지가 다소 적다. 객체 지향 프로그래밍
객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다. 오픈스택
파이썬으로 작성되어 있으며 Eventlet(병행 프로그래밍용), Kombu(AMQP 통신용), SQLAlchemy(데이터베이스 접속용)와 같은 수많은 외부 라이브러리들을 사용한다. 컴퓨트의 아키텍처는 어떠한 사유 하드웨어 및 소프트웨어 요구 사항 없이 표준 하드웨어 위에서 수평적 확장을 하기 위해 설계되어 있으며 레거시 시스템들과 서드파티 기술들과 연동하는 기능을 제공한다. 서비스 거부 공격
분산 반사 서비스 거부 공격()은 DDoS가 한 단계 더 진화한 형태의 공격 방식이다. Return-to-libc 공격
실행 불가능한 스택은 몇몇 버퍼 오버플로 익스플로잇을 방지할 수 있지만, return-to-libc 공격에서는 단지 존재하는 실행 가능 코드가 사용되기 때문에 return-to-libc을 막을 수는 없다. 스택 스매싱 보호는 스택의 오염을 탐지할 수 있으므로 이 취약점 공격을 막거나 방해할 수 있다. 위상 편이 변조
모든 디지털 변조 방식은 디지털 데이터를 표현하기 위해 한정된 수의 구분되는 신호를 사용한다. PSK는 이진 숫자의 고유한 패턴이 할당된 정해진 수의 위상을 사용한다. 일반적으로, 각각의 위상은 동일한 수의 비트를 부호화한다. 각각의 비트 패턴은 특정한 위상으로 표시되는 기호를 형성한다. 변조기에 사용되는 기호 세트를 위해 특별히 고안된 복조기는 수신된 신호의 위상을 알아내고, 다시 그것이 나타내는 기호로 매핑하여 원래의 데이터를 복구한다. 이는 수신기가 수신된 신호의 위상과 기준 신호를 비교할 수 있다는 것을 전제로 한다. 그리고 이러한 시스템을 일관성이라고 한다 (그리고 CPSK라고도 함). 뱅크 전환
뱅크 전환()은 마이크로프로세서의 주소 공간보다 많은 메모리를 활용하기 위해 개발된 기술이다. 주로 8비트 마이크로프로세서에서 사용되었으며, 거의 대부분의 8비트 마이크로프로세서가 16비트 주소 공간이므로 2 = 65536 매모리 공간을 갖는다. 이것보다 많은 메모리를 확장하려면 뱅크스위칭을 사용한다. 그러나 주소공간 내에서 액세스가 되어야 하므로 동시에 64 kB보다 많은 공간을 식별할 수 없다. 따라서 사용하는 뱅크를 설정하고 해당공간만을 액세스하다가, 뱅크를 바꾸어 다른 공간을 활용한다. 의존관계 역전 원칙
객체 지향 프로그래밍에서 의존 관계 역전 원칙은 소프트웨어 모듈들을 분리하는 특정 형식을 지칭한다. 이 원칙을 따르면, 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존 관계를 반전(역전)시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있다. 이 원칙은 다음과 같은 내용을 담고 있다. 관점 지향 프로그래밍
일반적으로 애스펙트(aspect)는 코드로서 분산되거나 얽혀있으며 이해하고 유지보수하기를 어렵게 만든다. 잠재적으로 서로 완전히 관련이 없는 시스템, 각기 다른 원본 언어 등에서 수많은 비관련 함수들에 로깅과 같은 함수가 분산된다. 즉, 로깅을 바꿀 경우 영향을 받는 모든 모듈의 수정이 필요하다. 애스펙트는 표현이 되는 시스템의 핵심 기능에만 얽혀있는 것이 아니라 서로에게도 얽혀있다. 아파치 슬링
Sling은 "웹 응용 프로그램" 개발의 웹 측면에 중점을 두고 개발 패러다임을 통해 진정한 웹 응용 프로그램의 직관적인 RESTful 개발을 제시한다는 점에서 다른 많은 웹 응용 프로그램 프레임 워크와 차이가 있다. 다른 프레임 워크는 응용 프로그램 개발에 더 중점을 두고 있으므로 Sling을 이상적으로 확장 할 수 있습니다. 함수형 프로그래밍
함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래밍은 함수의 응용을 강조한다. 함수형 프로그래밍은 1930년대에 계산가능성, 결정문제, 함수정의, 함수응용과 재귀를 연구하기 위해 개발된 형식체계인 람다 대수에 근간을 두고 있다. 다수의 함수형 프로그래밍 언어들은 람다 연산을 발전시킨 것으로 볼 수 있다. 선언형 프로그래밍
선언형 프로그래밍은 특수 분야 언어()의 형태로 자주 사용된다. 여기서 "분야"이라는 것은 "언어의 사용 분야"(즉, 그 언어가 표현하는 소재)을 의미한다. 예를 들어, HTML은 특수 분야 언어이며, HTML의 영역은 웹페이지와 하이퍼텍스트이다. 특수 분야 언어의 다른 예로 설정 파일, 스프레드시트, 그리고 심지어는 전자 메일("보낸이:", "받는이:" 헤더는 처리문을 통하여 본다.)까지도 들 수 있다. 모질라 애플리케이션 스위트
앞으로 모질라의 변화에 대한 계획을 보여주는 새로운 개발 로드맵이 공개되었다. 이에 따르면 모질라는 현재의 통합 "클로스 플랫폼 프론트 엔드"(XPFE) 애플리케이션에서, XUL 사용자 인터페이스 프레임워크와 게코 렌더링 엔진과 같은 공통 백 엔드 기술을 공유하는 작은 애플리케이션들의 패키지로 진화하게 될 것이다. 이전처럼 끊임없이 작업이 계속되겠지만, 서드 파티 애플리케이션과의 통합은 더 나아질 것이다. 스위트의 기능을 분산시켜, 다음과 같은 방법을 통해 프로젝트를 발전시킬 계획이다.이것은 장기적인 목표가 아니다. 이미 파이어폭스 1.0 브라우저(구 피닉스, 파이어버드)와 선더버드 1.0 메일/뉴스 클라이언트가 최근 배포되었다. 프로그래밍 심리학
후기 피아제의 인지발달이론에 근거하여 컴퓨터 프로그래밍 능력의 발전단계를 설명하는 이론이다. 피아제가 주장한 발달이론의 감각운동기, 전조작기, 구체적조작기, 형식적 조작기의 발전과정이 컴퓨터 프로그래밍에 적용한 모델이다. 초보 프로그래머는 신뢰할 수 있는 코드를 수동으로 실행 할 수 없으며 변수의 최종값을 결정할 수 없다. 이러한 단계를 감각운동기(Sensorimotor)에 있다고 정의한다. 초보 프로그래머는 코드의 추적(Trace)를 안정적으로 할 수 있지만 전체적인 구성을 보지 못하는 단계가 전조작기(Preoperational) 라고 한다. 이 단계에서 프로그래머는 귀납적 접근을 하므로 프로젝트를 설계할 수 없는 단계이다. 연역 추론이 가능한 초보 프로그래머는 구체적 조작기(concrete operational)에 이르렀다고 말 할 수 있습니다. 이 단계에서는 코드이 읽기와 변수들의 값을 추론 할 수 있으나 비교적 짧은 프로그램에서 가능한 상태입니다. 형식적 조작기(Formal operational)에 이른 프로그래머는 설명문으로 문제를 추상화하고 하위 문제를 생성하고 그 하위 문제를 결과로 만들어 내고, 재구성하고 평가하는 것을 반복적으로 수행할 수 있습니다. 객체 지향 프로그래밍
동적 바인딩은 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념이다. 동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다. 평행 이동
평행 이동(translation)은 기하학에서 모든 점을 같은 방향으로 같은 거리 이동시키는 함수를 가리킨다. 병진(竝進) 이라고도 한다.
고정점이 없는 아핀 변환이다. 행렬 곱셈은 원점을 고정점으로 가지기 때문에 이를 바로 사용할 수 없다. 가장 좋은 회피방법은 동차좌표에서 병진 벡터를 같이 나타내서 곱하는 것으로, 원래 이동하는 차원이 n차원이라면 n+1차 정사각행렬을 사용한다.
평행 이동 연산자 formula_1는 다음과 같이 표현된다. 관점 지향 프로그래밍
이를테면, 개념적으로 매우 단순한 메소드가 있는 은행업 애플리케이션을 생각해 보자. 아래는 하나의 계정에서 다른 계정으로 송금하는 것이다:
그러나 이러한 송금 방식은 디플로이된 애플리케이션이 다음을 필요할 것만 고려하고 있다: 현재 사용자가 이 작업을 수행하기 위한 권한이 있는지를 검사하는 보안 검사 기능이 없다. 데이터베이스 트랜잭션은 우연한 데이터 손실을 예방하기 위해 작업을 캡슐화하는 것이 좋겠다. 진단을 위해 이 작업은 시스템 로그에 기록하는 것이 좋겠다. 등등... 스택 추적
많은 프로그래밍 언어 (자바와 C#을 포함한)는 시스템 호출을 통해 현재 스택 추적을 검색하는 빌트인된 지원을 갖는다. C++은 이것에 대한 빌트인 지원은 없지만, C++ 사용자들은 stacktrace 라이브러리를 통해 스택 추적을 검색할 수 있다. 자바스크립트에서는 예외 처리는 thrown이 발생한 스택을 포함하는 codice_5 속성을 갖는다. 명령형 프로그래밍
컴퓨터 과학에서 명령형 프로그래밍()은 선언형 프로그래밍과 반대되는 개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명령으로 표현하듯이, 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다. 리스코프 치환 원칙
치환성()은 객체 지향 프로그래밍 원칙이다. 컴퓨터 프로그램에서 자료형 formula_1가 자료형 formula_2의 하위형이라면 필요한 프로그램의 속성(정확성, 수행하는 업무 등)의 변경 없이 자료형 formula_2의 객체를 자료형 formula_1의 객체로 교체(치환)할 수 있어야 한다는 원칙이다. 리스코프 치환 원칙(, LSP)은 바바라 리스코프가 "자료 추상화와 계층 (Data abstraction and hierarchy)"이라는 제목으로 기조연설을 한 1987년 컨퍼런스에서 처음 소개한 내용으로, 이 원칙을 엄밀한 용어로 말하자면 (강한) 행동적 하위형화라 부르는 하위형화 관계의 특정한 사례이다. 이 정의는 1994년 논문에서 다음 원칙을 만들어낸 자료형의 의미론적 상호처리를 보장하기 때문에 단순한 문법적 관계일 뿐만 아니라 의미론적 관계다. 되부름 하향 구문 분석
되부름 하향(recursive descent parser)는 상호 순환 절차(procedure)의 집합(또는 비재귀 적인 동등한 구문)으로 이루어진 하향식 구문 분석이다. 한 절차는 문법의 한 생성 규칙을 처리한다. 따라서 프로그램의 구조는 문법을 반영한 모양이 된다. 리스코프 치환 원칙
리스코프의 원칙은 새로운 객체 지향 프로그래밍 언어에 채용된 시그니처에 관한 몇 가지 표준적인 요구사항을 강제한다.여기에 더하여 하위형이 만족해야하는 행동 조건 몇 가지가 있다. 이것은 계약이 상속에 대해 어떻게 상호작용하는지에 대한 제약조건을 유도하는 계약에 의한 설계 방법론과 유사한 용어로 자세히 설명되어있다.사전 및 사후 조건에 관한 규칙은 베르트랑 메이어가 1988년의 저서에서 도입한 개념과 동일하다. 메이어와 이후에 '행동의 하위형'이라는 용어를 처음 사용한 피에르 아메리카 모두 임의의 행동의 하위형 개념에 대한 증명 이론적 정의를 제공했으나, 참조나 포인터를 지원하는 프로그래밍 언어에서 일어날 수 있는 에 대한 고려는 없었다. 1994년 리스코프와 윙이 만든 중요한 개선점은 별칭에 대한 고려였고 핵심 요소는 이력 제약 조건이다. 메이어와 아메라카의 정의에서는 LSP에서 허용하지 않는 변경 가능 지점은 변경 불가 지점의 행동의 하위형이어야 했다. 위치 독립 코드
모든 프로세스가 자신의 독립적인 주소 공간을 가질 수 있기 때문에, 동적 주소 변환의 발명(MMU에 의해 제공되는 기능인)은 근본적으로 위치 독립 코드의 필요를 줄였다. 그러나 같은 코드의 동시 다중적인 작업들은 가상 공간의 낭비를 만들었다. 만약 두 작업들이 전체적으로 똑같은 프로그램이라면, 동적 주소 변환은 시스템이 간단하게 두 다른 작업의 주소 32K를 실제 메모리의 같은 메모리로 매핑하는(즉, 프로그램의 단일 사본만을 포함하는) 해결책을 제공한다. 스택 추적
스택 추적 (stack trace, stack backtrace 또는 stack traceback)은 프로그램 실행 중 특정한 시점에서의 스택 프레임에 대한 리포트이다. 프로그램 실행 중 메모리는 보통 두 곳에 동적으로 할당되는데, 스택과 힙이 그것이다. 메모리는 이름에서 보이듯이 스택에서는 인접하여 할당되지만 힙은 그렇지 않다. 스택은 또한 프로그래밍 구조로도 여겨지며 프로그램의 런타임 스택으로 불린다. 기술적으로 메모리 블록이 스택에 할당되면, 이것은 그 이전에 할당된 블록같이 쉽게 제거되지 않는다. 프로그램에서 함수가 호출될 때마다 메모리 블록은 활성 레코드 (activation record)라고 불리는 런타임 스택의 위에 할당된다. 높은 수준에서는, 활성 레코드가 함수의 파라미터와 내부에 선언된 지역변수를 위해서 메모리를 할당한다. 코드 재사용
한층 더 새로운 수단으로서 자동 프로그래밍이 있다. 이것은 프로그램이 사용자가 설정한 일련의 변수에 근거하여 어떤 종류의 프로그램을 생성하는 것이다.유사한 개념으로 메타 프로그래밍도 있다.편의적 재사용은 다음으로 더 세분화할 수 있다. 버퍼 오버플로 보호
GNU 컴파일러 모음, LLVM, 마이크로소프트 비주얼 스튜디오 등에는 버퍼 오버플로 보호의 여러 기법들이 존재한다.
스택 버퍼 오버플로는 스택 스매싱으로 알려진 공격의 한 부분으로서 고의적으로 유발될 수 있다. 만약 감염된 프로그램이 특별한 권한으로 실행되거나 신뢰되지 않은 네트워크 호스트로부터 데이터를 받는다면, 이 버그는 공격자가 실행 가능한 코드를 실행 중인 프로그램에 삽입하여 프로세스의 제어를 가질 수 있게 함으로써 잠재적으로 보안 취약점이 될 수 있다. 이것은 공격자가 컴퓨터에 대한 비인가된 접근을 갖게 하는 가장 오래된 방식 중 하나이다. X86 호출 규약
x86의 codice_2 명령의 예는 다음과 같다:
파스칼 프로그래밍 언어의 호출 규약을 기반으로 매개변수들은 왼쪽에서 오른쪽 순으로 스택 위에 푸시된다. (cdecl과 반대) 피호출자는 반환 이전에 스택의 균형을 맞추는 일을 한다. 이 호출 규약은 다음의 16비트 API에서 일반적이다: OS/2 1/x, 마이크로소프트 윈도 3.x, 볼랜드 델파이 버전 1.x. 객체 지향 프로그래밍
에이다의 큰 특징은 예외 처리 기능의 도입이다. 이는 시스템의 신뢰도를 높이기 위한 중요한 기능이며, 미 국방성 프로젝트가 중요시 하는 신뢰도를 증가시키기 위한 필수적인 기능으로 볼 수 있다. 하지만 에이다는 큰 단점을 가지고 있었는데, 상속의 개념을 언어에 반영하지 않았다. 또한 에이다는 대부분의 객체 지향 언어는 대부분 동적 바인딩 방식을 채택하고 있는 반면 정적 바인딩을 사용하고 있다는 점이다. 스트림 프로세싱
스트림 프로세싱()은 제한된 형태의 병렬 처리를 응용 프로그램들이 쉽게 이용할 수 있도록하는 SIMD(single instruction, multiple data)와 관련이 있는 컴퓨터 프로그래밍의 한 양식이다. 그런 응용 프로그램들은 GPU 또는 FPGA(field programmable gate arrays) 상에 있는 FPU들과 같은 다수의 연산기들을 명시적 할당, 동기화, 또는 유닛들 간의 통신을 관리하는 것 없이도 사용할 수 있다. 스켈레톤 (컴퓨터 프로그래밍)
스켈레톤 프로그램들은 객체 지향 프로그래밍에 쓰이는 탬플릿 메소드 디자인 패턴에서 이용된다. 객체 지향 프로그래밍에서 더미 코드는 추상 메소드, 메소드 스텁 또는 모의 객체에 대응된다. 자바 원격 함수 호출(자바 RMI) 명명법에서 스텁은 서버측의 스켈레톤과 클라이언트에서 통신한다. 프로그래밍 패러다임
프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 해 주고, 결정하는 역할을 한다. 예를 들어 객체지향 프로그래밍은 프로그래머들이 프로그램을 상호작용하는 객체들의 집합으로 볼 수 있게 하는 반면에, 함수형 프로그래밍은 상태값을 지니지 않는 함수값들의 연속으로 생각할 수 있게 해준다. 상속 (객체 지향 프로그래밍)
객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의 기존의 클래스로부터 속성과 동작을 상속받을 수 있다. 그 결과로 생기는 클래스를 파생 클래스, 서브클래스, 또는 자식 클래스라고 한다. 상속을 통한 클래스들의 관계는 계층을 형성한다. 프로토타입 기반 프로그래밍에서는, 객체가 클래스를 따로 정의할 필요 없이 다른 객체로부터 직접 정의될 수 있다. 이러한 특징을 차등 상속이라고 부른다. 병렬 컴퓨팅
파이프라인을 할 때 명령어 수준 병렬화에서 몇 프로세서들은 한 개 이상의 명령어를 한 번에 만들수 있었다. 이것을 슈퍼스칼라 프로세서라고도 한다. 만약에 자료종속성만 없다면 명령어들은 한꺼번에 합쳐질수 있다. 스코어보딩 (Scoreboarding)과 토마줄로 알고리즘 (스코어보딩과 비슷하지만 레지스터 리네이밍 (Register renaming)을 사용한다) 이 두 가지가 가장 흔한 비 순차적 실행과 명령어 수준 병렬화 기술들이다. 아트멜 AVR
ISP(in-system programming) 프로그램 전송 방식은 기능적으로 SPI 방법에 "Reset" 선을 추가한 것이다. PCB에 납땜 상태에서 프로그램 코드를 전송할 수 있다. AVR에서 가장 일반적인 방법이다. 서포트 벡터 머신
서포트 벡터 머신(, SVM기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다.
두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여 새로운 데이터가 어느 카테고리에 속할지 판단하는 비확률적 이진 선형 분류 모델을 만든다.
만들어진 분류 모델은 데이터가 사상된 공간에서 경계로 표현되는데 SVM 알고리즘은 그 중 가장 큰 폭을 가진 경계를 찾는 알고리즘이다.
SVM은 선형 분류와 더불어 비선형 분류에서도 사용될 수 있다. 비선형 분류를 하기 위해서 주어진 데이터를 고차원 특징 공간으로 사상하는 작업이 필요한데, 이를 효율적으로 하기 위해 커널 트릭을 사용하기도 한다. 주파수 편이 변조
주파수 편이 변조(Frequency-shift keying, FSK)란 반송파(carrier wave)의 이산 주파수(discrete frequencies) 변화를 통해 디지털 정보가 전송되는 주파수 변조 체계이다. 가장 간단한 FSK는 이진 FSK(BFSK)이다. BFSK는 이진수 정보(0과 1로 구성)를 전송하기 위해 한 쌍의 이산 주파수를 사용한다. BFSK에서 "1"은 mark 주파수, 그리고 "0"은 space 주파수라 불린다.
자세히 설명된 참조할만한 구현은 다음과 같다. BFSK 신호의 복조(demodulation)는 Goertzel 알고리즘을 이용해서 매우 효율적으로 구현되며, 낮은 전력의 마이크로컨트롤러(microcontroller)에서도 그러하다. 그리드 컴퓨팅
그리드 컴퓨팅()은 최근 활발히 연구가 진행되고 있는 분산 병렬 컴퓨팅의 한 분야로서, 원거리 통신망(WAN, Wide Area Network)으로 연결된 서로 다른 기종의(heterogeneous) 컴퓨터들을 하나로 묶어 가상의 대용량 고성능 컴퓨터를 구성하여 고도의 연산 작업(computation intensive jobs) 혹은 대용량 처리(data intensive jobs)를 수행하는 것을 일컫는다. 모든 컴퓨터를 하나의 초고속 네트워크()로 연결하여 계산능력을 극대화시키는 차세대 디지털 신경망 서비스를 말한다. 여러 컴퓨터를 가상으로 연결해서 공동으로 연산작업을 수행하게 하는 것이며 분산 컴퓨팅이라고도 한다. 레지스터 스프링
컴퓨터 보안에서, 레지스터 스프링은 트램펄린의 한 종류이다. 이것은 콜 스택에 위치한 익스플로잇으로서 DLL이나 정적 프로그램 바이너리 내에서 제어 흐름을 존재하는 코드로 안내하는 가짜 반환 포인터 또는 SEH 포인터이다. 이 대상 코드는 결과적으로, 익스플로잇에 의해서 미리 준비된 적절한 프로세서 레지스터가 페이로드 코드가 어디서 시작하는지를 가리키는 곳으로의 "CALL EBX"이나 "JMP ESP" 같은 call 또는 jump로 이루어 진다. 관점 지향 프로그래밍
관심 지향 프로그래밍은 프로그램 로직을 명확한 부분들(이른바 "관심사")로 나누는 것을 수반한다. 거의 모든 프로그래밍 패러다임들은 관심사들을 별도의 독립적인 엔티티로 그룹화하고 캡슐화하는 것을 어느 정도는 지원하며, 이는 이러한 관심사들을 구현, 추상화, 합성하기 위해 사용할 수 있는 추상화(예: 함수, 프로시저, 모듈, 클래스, 메서드)를 제공함으로써 수행된다. 일부 관심사들은 프로그램 내의 여러 추상적 개념들에 영향을 미치며 이러한 형태의 구현체를 거역한다. 이러한 관심사들을 크러스 커팅 관심사(cross-cutting concerns)라고 부른다. 반환 지향형 프로그래밍
64-bit x86 프로세서들의 증가로 첫 번째 인자를 스택 대신 레지스터에 전달하는 서브루틴 호출 규약으로 변화되었다. 이것은 버퍼 오버런 익스플로잇을 통해 공격자가 콜 스택을 단순히 조작함으로써 더 이상 라이브러리 함수 호출을 설치할 수 없게 되었다는 것을 의미한다. 공유 라이브러리 개발자들은 또한 공격자에게 유용하게 사용되는 함수들을 제거하고 제한하였다(시스템 호출 래퍼 같은). 결과적으로 return-into-library 공격은 성공하기가 더욱 어려워 졌다. 로지스틱 회귀
로지스틱 회귀의 기본적인 접근은 이미 개발되어 있는 선형 회귀의 방식을 사용하는 것이다. 즉, 독립 변수의 선형 결합과 회귀 계수에 관한 선형 예측 함수에서 비롯되었다. 선형 예측 함수 formula_23는 특정 데이터 항에 대해 아래와 같이 표현된다. 반환 지향형 프로그래밍
비록 반환 지향형 프로그래밍 공격들이 다양한 아키텍처에서 수행될 수 있지만, Shacham의 페이퍼와 뒤의 주요한 작업들은 인텔 x86 아키텍처에 중점을 둔다. x86 아키텍처는 가변 길이 CISC 명령어 집합이다. x86에서 반환 지향형 프로그래밍은 명령어 집합이 매우 밀집하다는 사실에 장점을 갖는다. 즉, 마이트들의 어느 랜덤 순서열들도 유요한 x86 명령어들의 집합으로 변환될 수 있다. 상속 (객체 지향 프로그래밍)
"파생 클래스" 또는 후계자 클래스, 자식 클래스라고도 불리는 서브클래스는 하나 이상의 다른 클래스(수퍼클래스, 기반 클래스, 또는 부모 클래스)로부터 하나 이상의 언어 엔티티를 상속하는 모듈러, 파생 클래스이다. 클래스 상속의 의미는 언어에 따라 달라지지만, 일반적으로 서브클래스는 수퍼클래스의 인스턴스 변수들과 멤버 함수들을 자동적으로 상속한다. 어떤 언어들은 다른 구조의 상속을 지원하기도 한다. 예를 들어, 에펠에서 클래스의 사양을 정의하는 계약도 후계자가 상속받는다. 수퍼클래스는 특정한 서브클래스가 상속하고 수정, 보완할 수 있는 공통 인터페이스와 기본적인 기능을 수립한다. 서브클래스에 의해 상속된 소프트웨어는 서브클래스에서 재사용된다. 클래스의 인스턴스에 대한 참조는 사실 그것의 서브클래스 중 하나를 참조하는 것이다. 참조되는 객체의 실제 클래스를 컴파일 타임에 예측하는 것은 불가능하다. 수많은 다른 클래스의 객체 멤버 함수를 호출하는데에는 똑같은 인터페이스가 사용된다. 서브클래스는 수퍼클래스의 함수를 같은 메소드 시그니처를 공유해야 하는 완전히 새로운 함수로 대체할 수도 있다. 프로그래밍 패러다임
프로그래밍 패러다임과 프로그래밍 언어와의 관계는 프로그래밍 언어가 여러 프로그래밍 패러다임을 지원하기도 하기 때문에 복잡할 수도 있다. 예를 들어서 C++는 절차적 프로그래밍, 객체기반 프로그래밍, 객체지향 프로그래밍, 제네릭 프로그래밍의 요소들을 지원하도록 설계되었다. C++에서는 순수하게 절차적 프로그램을 작성할 수 있고, 순수하게 객체지향 프로그램을 작성할 수 있으며, 두 가지 패러다임 모두의 요소를 포함한 프로그램을 작성할 수도 있다. 최근에는 여러 패러다임들이 관대하게 지원되는 경향이 강하다. 자바나 PHP와 같이 기존부터 있던 언어들에는 본래 없던 패러다임이 추가되고, Swift나 Go, Kotlin과 같이 비교적 새로 만들어지는 언어들은 처음부터 여러 패러다임의 지원을 고려하여 설계된다. 범용성을 강조하는 언어들에서는 최근 함수형, 선언형 패러다임이 적극적으로 적용되고 있는 것이 특징이다. DSL 과 같이 완전히 특수한 목적을 띄지도 않고, 완전한 범용성을 띄지도 않는, 어느 정도의 범용성을 띄는 새로운 언어들이나, 또는 실험적으로 개발되는 많은 언어들에서는 어느 정도 언어 설계의 목적에 따라 여러 패러다임을 조합하는 일이 더욱 흔해지고 있다. 고전적으로 순수한 관점에서 이질적으로 보여졌던 패러다임간의 공존이 갈수록 많이 등장하며, 상황과 맥락에 따라 패러다임간 장점만을 취하려는 시도는 계속되고 있다. 반환 지향형 프로그래밍
가젯들을 위치시키고 바이너리에 공격을 구성하는 것을 돕는 자동화된 툴이 개발되어 왔다. ROPgadget이라 불리는 이 툴은 잠재적인 유용한 가젯들을 바이너리에서 찾고, 공격자에게 암의적인 명령어를 받을 셸을 생성할 공격 페이로드로 조합한다. 슬라이딩 윈도
TCP와 같이 데이터의 전달을 보증하는 프로토콜에서는 패킷 하나 하나가 정상적으로 전달되었음을 알리는 확인 신호(acknowledgement, 이하 "ACK")를 받아야하며, 만약 패킷이 중도에 잘못되었거나 분실되어 확인받지 못하는 경우, 해당 패킷을 재전송해야하는 필요가 있다. 슬라이딩 윈도는 일단 '윈도(메모리 버퍼의 일정 영역)'에 포함되는 모든 패킷을 전송하고, 그 패킷들의 전달이 확인되는대로 이 윈도를 옆으로 옮김(slide)으로서 그 다음 패킷들을 전송하는 방식이다. 응용 프로그램 이진 인터페이스
ABI는 API와 다르다, API가 소스 코드에서 사용된다면 ABI는 바이너리에서 호환이 가능하다는 점이 다르다.
EABI(임베디드 응용 프로그램 이진 인터페이스, embedded-application binary interface)는 임베디드 소프트웨어 프로그램을 수행하는 파일 형식, 자료형, 레지스터 사용, 스택 프레임 조직, 명령 변수를 위한 표준 변환을 정의하고 있다. 차량기지 알고리즘
역폴란드 표기법의 계산법처럼, 차량기지 알고리즘 또한 스택을 이용한다. formula_1 또는 formula_2 처럼 대부분의 사람들에게 익숙한 중위 표기법을 역폴란드 표기법으로 변환하려면 입력, 출력 및 한개의 연산자 스택이 필요하다.이 간단한 예제로부터 몇가지 규칙을 살펴볼 수 있다.모든 연산자, 괄호 및 숫자는 단 한번만 입력에서 읽고, 최대 한번만 출력 큐에 입력된다. 연산자 및 괄호는 최대 한번만 스택에 푸쉬된 후 팝되므로, 모든 입력 토큰에 대해 최대 몇개의 연산만이 수행된다. 따라서 알고리즘의 실행시간은 입력 길이에 비례하며, 대문자 O 표기법으로는 O("n")이다. 익스트림 프로그래밍
익스트림 프로그래밍(, XP)는 켄트 백 등이 제안한 소프트웨어 개발 방법이다. 비즈니스 상의 요구가 시시각각 변동이 심한 경우에 적합한 개발 방법이다. 1999년 켄트 백의 저서인 'Extreme Programming Explained - Embrace Change'에서 발표되었다. 애자일 개발 프로세스라 불리는 개발 방법 중의 대표적인 하나로 꼽히며, 약칭인 'XP'로 잘 알려져 있다. AspectC++
관점 지향 프로그래밍은 횡단 관심사를 하나의 모듈, 즉 관점(애스펙트, aspect)로 모듈화하는 것을 허용한다. 애스펙트는 기존의 클래스를 수정할 수 있지만 대체적으로는 기존 기능의 이전(before), 이후(after), 주변(around)에 실행할 "어드바이스"(advice)를 제공한다. 오픈스택
Glance는 기존의 레거시 인프라스트럭처에 수많은 개선 사항을 추가하고 있다. 이를테면 VMware와 연동할 경우 Glance는 고가용성 및 동적 자원 스케줄링(DRS)인 vSphere 계열에 대한 고급 기능들을 도입하고 있다. vMotion은 하나의 물리적인 서버에서 다른 서버로 서비스 방해 없이 실행 중인 VM의 실시간 마이그레이션을 수행한다. 그러므로 동적이고 자동화된 자체 최적화 데이터센터를 가능케 하며, 다운타임 없이 성능이 떨어지는 서버들의 하드웨어 유지보수를 허용한다. 직교 진폭 변조
제한된 전송 대역 내에서 데이터 전송을 고속으로 하는 데 유리하다. ASK와 PSK를 혼합시킨 변조 방식이며 디지털 신호 처리 및 LSI 기술이 발전하여 실현되었다. 이 방식에서는 데이터의 타이밍을 표시하는 파일럿 신호가 필요하지 않다. 플래닝 포커
플래닝 포커는 광대역 델파이(Wideband delphi)의 한 형태이다. 이것은 애자일 소프트웨어 개발에서 가장 일반적으로 사용된다. 특히 스크럼 (애자일 개발 프로세스)과 익스트림 프로그래밍 방법론에서 말이다. 변환행렬
선형 변환은 행렬로 표현할 수있는 유일한 변환은 아니다. n 차원 유클리드 공간 formula_1 에서 비선형인 일부 변환은 n + 1 차원 공간 formula_2 에서 선형 변환으로 나타낼 수 있다. 여기에는 변환과 같은 아핀 변환(affine transformation) 과 사영 변환(projective transformation 또는 Homography) 이 모두 포함된다. 이러한 이유로, 정사각 행렬 변환은 3D 컴퓨터 그래픽 에서 널리 사용된다. 이러한 n + 1 차원 변환 행렬은 아핀 변환 행렬 , 사영 변환 행렬 또는 보다 일반적으로 비선형 변환 행렬 등 그 응용에 따라 다르게 불린다. n 차원 행렬과 관련하여, n + 1 차원 행렬은 첨가 행렬로 설명 될 수 있다. 데이터 스트림
데이터 스트림(data stream)은 연결지향통신에서, 전송된 정보를 수집하거나 정보를 전송할 때 사용되는 디지털 방식으로 암호화 된 일관된 신호의 흐름을 말한다. 전자 및 컴퓨터 구조 분야에서, 데이터의 흐름은 재구성 가능한 데이터경로 배열 다른 비슷한 파이프 네트워크나 다른 처리 블럭, 처리 유닛들의 포트로 언제, 어떤 정보들이 들어오거나 밖으로 나가는 지를 관할한다. 폰 노이만 구조의 컴퓨터는 명령 스트림기반인 반면, 안티머신은 데이터스트림 기반이기 때문에 종종 데이터 스트림을 명령 스트림으로 보기 쉽다. 스프링 프레임워크
스프링은 웹 프로그램밍 개발 시 거의 표준적인 방식인 Spring MVC라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다. DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다. 스택
스택은 한 쪽 끝에서만 자료를 넣거나 뺄 수 있는 선형 구조(LIFO - Last In First Out)으로 되어 있다. 자료를 넣는 것을 '밀어넣는다' 하여 푸시(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 최근에 보관한 자료부터 나오게 된다. 이처럼 나중에 넣은 값이 먼저 나오는 것을 LIFO 구조라고 한다. 관점 지향 프로그래밍
이를테면 우리가 갑자기 애플리케이션에 대한 보안 고려사항을 변경해야 한다면 일어나는 일에 대해서 생각해 보자. 프로그램의 현재 버전에서 보안 관련 기능들은 수많은 메소드를 가로질러 분산되어 있는 것으로 나타나며 이러한 변경은 상당한 노력이 요구된다. 하스켈
2002년을 기준으로 하스켈은 느긋한 계산법을 쓰는 함수형 언어 가운데 가장 활발한 연구가 이루어지는 언어로 볼 수 있다. 언어의 변형도 몇 가지 개발되었다. 매사추세츠 공과대학교와 글래스고 대학교가 개발한 버전은 병렬화가 가능하기 때문에 ‘병렬 하스켈’이라고 불린다. 이후 병렬화와 분산 처리를 더욱 강화한 ‘분산 하스켈’과 에덴 프로그래밍 언어가 나왔고, 느긋한 계산법 대신 적극적인 계산법을 쓰는 ‘적극적 하스켈’이 있으며 하스켈에 객체 지향 개념을 도입한 버전으로 ‘하스켈++’, ‘오하스켈’, 몬드리안 프로그래밍 언어 등등이 있다. GPGPU
변환 연산은 주어진 함수 (커널)을 스트림의 모든 요소에 적용한다. 간단한 예로 스트림의 모든 값에 어떤 상수를 곱하는 것이다. (밝기 조절) 변환 연산은 GPU상에서 간단히 구현된다. 프로그래머는 화면의 각 픽셀의 프래그먼트를 생성하고 각각에 프래그먼트 프로그램을 적용한다. 결과로 얻어지는 같은 크기의 스트림이 출력 버퍼에 저장된다.
어떤 계산은 큰 흐름으로부터 작은 흐름(단 한개의 요소만 남을 수도 있다)을 계산해야 한다. 이를 흐름의 감축이라 부른다. 일반적으로 감축은 여러 단계로 이루어질 수 있다. 이전 단계의 결과가 이번 단계의 입력으로 사용되고, 연산이 적용되는 범위가 흐름 요소 하나만 남을 때 까지 반복된다.
흐름 필터링은 본질적으로 불균일 감축이다. 필터링은 어떤 기준에 따라 흐름에서 일부 요소를 제거하는 것이다.
흩뿌리기 연산은 꼭짓점 처리에서 가장 자연스럽게 정의된다. 꼭짓점 처리는 꼭짓점의 위치를 조정할 수 있어서 프로그래머가 정보를 격자의 어디에 예치하는지 제어할 수 있게 해 준다. 다른 확장도 가능한데, 예를 들어 꼭짓점이 영향을 미치는 영역의 크기를 제어하는 것이다.
프래그먼트 처리기는 직접 뿌리기 연산을 수행할 수 없는데, 그 까닭은 격자상에서 각 프래그먼트의 위치는 프래그먼트가 생성될 때 고정되어 프로그래머가 변경할 수 없기 때문이다. 그러나 논리적 흩뿌리기 연산은 추가적인 수집 단계로 때때로 재투사 또는 구현될 수 있다. 흩뿌리기를 구현하려면 먼저 출력값과 출력 주소 모두를 송출해야 한다. 그 직후의 수집 연산은 주소 비교를 통해 출력 값이 현재의 출력칸에 맞아떨어지는지 확인한다.
프래그먼트 처리기는 텍스처를 임의 방식으로 읽을 수도 있어서 단수/복수의 어떤 격자 칸으로부터도 원하는 대로 정보를 모을 수 있다.
정렬 연산은 순서 없이 뒤섞인 요소 집합을 순서에 따라 정렬된 요소의 집합으로 변환한다. 가장 일반적인 GPU 구현은 정렬망을 이용하는 것이다.
탐색 연산으로 프로그래머는 흐름 안의 특정 요소 또는 특정 요소의 이웃 요소를 찾을 수 있다. GPU는 한 요소를 찾는 속도를 올리기 위해 사용되지는 않지만 대신 여러 탐색을 병렬로 실행하는 데 사용된다.
다양한 자료 구조가 GPU상에서 표현될 수 있다:
GPGPU로 CPU 한 개에 비해 100배~250배의 속도 향상을 이룰 수 있지만, 병렬도가 지극히 높은 응용 프로그램에서만 이 정도의 혜택을 볼 수 있을 것이다. 한 개의 GPU 처리 코어는 데스크톱 CPU의 코어 한 개와 대등하지 않다. 프로토타입 기반 프로그래밍
프로토타입 기반 프로그래밍은 객체지향 프로그래밍의 한 형태의 갈래로 클래스가 없고, 클래스 기반 언어에서 상속을 사용하는 것과는 다르게, 객체를 원형(프로토타입)으로 하여 복제의 과정을 통하여 객체의 동작 방식을 다시 사용할 수 있다. 프로토타입기반 프로그래밍은 클래스리스("class-less"), 프로토타입 지향(prototype-oriented) 혹은 인스턴스 기반(instance-based) 프로그래밍이라고도 한다. 오브젝티브-C
메시지는 객체 지향 프로그래밍을 지원하기 위해 내부적으로 추가된 문법이다. 오브젝티브-C의 객체 지향 프로그래밍에 대한 모델로 메시지를 객체에 전달하는 방식을 채용하고 있다. 이는 스몰토크와 매우 유사한 모델이다. 하지만 이는 C++과 다른 언어에서 사용하는 시뮬라(Simula) 프로그래밍 모델과는 구별되는 것이다. 이러한 특징은 중요한 의미를 갖는다. 오브젝티브-C의 기본적인 차이점은 "메소드를 호출"하는 것이 아니라 "메시지를 전달"한다는 것이다. 축소 명령어 집합 컴퓨터
1960년대로 거슬러 올라가면 수많은 시스템들이 최초의 RISC 아키텍처라고 볼 수도 있는데, 이는 부분적으로 로드/스토어 접근 방식에 기반을 두기 때문이다. RISC라는 용어는 버클리 RISC 프로젝트의 데이비드 패터슨이 만든 용어이지만 비슷한 개념은 이미 그 이전에 등장하였다.CISC에서는 하드웨어가 스택을 지원하지만, RISC에는 없다. 스택 제어(데이터의 PUSH, POP이 발생할 때 레지스터의 퇴피, 서브루틴에 점프했을 때의 리턴 주소의 보존, 복귀)의 처리는 단순한 명령을 조합하여 소프트웨어로 구현된다. 명령어의 순서로 인해 발생할 수 있는 파이프라인의 위험은 컴파일하는 동안 최적화되어 사라진다. 관점 지향 프로그래밍
컴퓨팅에서 관점 지향 프로그래밍(, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다"와 같이 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다. 이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. 관점 지향 프로그래밍은 관점 지향 소프트웨어 개발의 토대를 형성한다. 알고리즘 트레이딩
역추세 전략은 단기적 혹은 중기적으로 추세와는 반대로 가격이 움직일 것을 기대하고, 지금까지의 짧은 추세의 방향과는 반대 방향으로 포지션을 구축하는 전략이다. 역추세 전략은 일정 기간동안 주가가 형성한 가격 범위대를 이용해 과열 혹은 침체를 판단한다. 여기서 일정 기간은 대체로 짧은 기간이며 거래 방식은 스캘핑(Scalping)이 대다수를 차지한다. 역추세 전략에서는 캔들에 내포된 저가나 고가를 이용하기도 하고 RSI, Stochastic Oscillator, 이격도, Bollinger Band와 같은 기술적 지표를 이용하기도 한다. 관점 지향 프로그래밍
관점 지향 소프트웨어 개발은 온전한 엔지니어링 분야를 가리키는 반면에 관점 지향 프로그래밍은 소스 코드 레벨에서 관심사들의 모듈화를 지원하는 프로그래밍 메서드들과 도구들을 포함하고 있다. 프로그래밍 패러다임
소프트웨어 공학의 서로 다른 무리가 서로 다른 "방법론"을 지원하듯이, 서로 다른 프로그래밍 언어는 서로 다른 "프로그래밍 패러다임"을 지원한다. 어떤 언어들은 하나의 특정한 패러다임을 지원하기도 하는데, 스몰토크와 jdk 1.8 이전의 자바가 객체지향 프로그래밍을 지원하는 반면에, 하스켈과 스킴은 함수형 프로그래밍을 지원한다. 여러 가지 패러다임을 지원하는 언어들도 있는데, 커먼 리스프, 파이썬, 오즈, jdk 1.8 이상의 자바 등이 이런 언어들이다. ("몇년 전까지 자바는 명령형 프로그래밍, 객체지향 프로그래밍 패러다임을 따르기로 유명했다. 하지만 jdk 1.8 부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했고 선언형 프로그래밍의 장려를 위해 Stream과 같은 표준 API 등도 추가했다. 그러나 태생부터 함수형 패러다임을 지원하는 여타 언어들과는 달리 여전히 함수를 일급객체로 취급하지는 않는다. 자바에서 람다식은 함수형 인터페이스를 구현하는 익명클래스의 인스턴스를 생성하며, 좀 더 간단한 표현을 위해 컴파일러의 타입 추론이 동원된다." ) 이진 트리
그래프 이론 측면에서, 여기서 정의한 이진 (그리고 K-항) 트리는 실제로 일종의 방향성 그래프()다. 따라서, 하나의 이진 트리는 bifurcating arborescence라고도 불리는데, 이 용어는 현대 컴퓨터 과학 기술이 널리 퍼지기 이전의 아주 오래된 프로그래밍 책에서 볼 수 있다. 이진 트리가 정렬 트리이면서, 루트 트리인 경우, 방향성 그래프가 아닌 비방향성 그래프로 해석할 수도 있다. 일부 저술자는 "이진 트리" 대신 루트 이진 트리를 사용해, 트리가 루트를 가지고 있지만, 위에서 설명한 것처럼, 이진 트리가 항상 루트를 가지고 있다는 사실을 강조한다. 이진 트리는 "k"가 2인 정렬 K-항 트리의 특수한 경우다. 반환 지향형 프로그래밍
반환 지향형 프로그래밍 공격은 다른 공격들 보다 우위를 갖는다. 잠재적으로 위험한 함수들을 공유 라이브러리에서 제거하는 것을 포함한, 위에서 언급한 익스플로잇 방어 기법 어느 것도 반환 지향형 프로그래밍 공격에 효과적이지 않다. 마샬링 (컴퓨터 과학)
오브젝트를 "직렬화한다"는 것은 오브젝트의 상태를 오브젝트의 사본으로 다시 변환할 수 있는 바이트 스트림으로 변환하는 것을 의미한다. 직비
직비 스택의 최신 버전은 2007년 10월 30일 발표된 "직비 프로"(ZigBee PRO)이다. 때때로 “직비 2007”로 불리기도 한다. 직비 프로에는 2개의 스택 프로파일이 들어가 있다. 직비 스택 프로파일 1(간단히 줄여 직비)은, 가정용 및 단순 산업용 용도이다. 직비 스택 프로파일 2는 더 많은 기능을 포함하고 있는데, 멀티캐스팅, 다대일 라우팅, 대칭키 키교환(SKKE)을 이용한 고수준의 보안성 등이다. 직비 스택 프로파일 1이 RAM과 플래시 메모리를 더 적게 사용한다. 직비 스택 프로파일 1과 2 모두 완전한 메시 네트워킹 기능을 제공하며 또한 모든 직비 애플리케이션 프로파일에 대해 작동한다. 객체 지향 프로그래밍
객체 지향 언어는 프로그래밍 언어가 많은 지원을 받기 시작하고 발전하기 시작한 1990년 대 초반에 많은 발전이 있었다. 이들은 기본적으로 스몰토크와 에이다의 큰 틀을 따르고 있었지만 그들이 가지고 있었던 문제들을 해결해 나가는 과정으로 발전하였다. C++, 델파이, FoxPro와 같은 프로그램들은 객체 지향 언어의 가장 큰 영향을 미쳤던 GUI의 발전에 따라 점점 향상되었다. 상속 (객체 지향 프로그래밍)
일부 언어에서는 클래스 선언에 특정한 클래스 한정자를 추가함으로써 그 클래스가 상속 불가하다고 선언할 수 있다. 자바의 "final" 키워드 또는 C#의 "sealed" 키워드가 그 예이다. 이러한 한정자들은 클래스 선언에서 "class" 키워드와 클래스 식별자의 선언 전에 추가된다. 봉인(sealed) 클래스는 특히 개발자들이 소스 코드에 권한이 없고 미리 컴파일된 바이너리에만 권한이 있을 때, 재사용이 제한된다.
봉인 클래스에는 서브클래스가 없다. 그래서 클래스 객체의 참조 또는 포인터가 서브클래스의 인스턴스(존재하지 않음)나 수퍼클래스의 인스턴스(참조 타입을 업캐스팅하는 것은 타입 체계에 위반됨)가 아닌 해당 클래스의 인스턴스를 참조하고 있다는 것을 컴파일 타임에 쉽게 추론할 수 있다: 서브 타입 다형성. 실행 전에 참조되는 객체의 정확한 타입을 알 수 있기 때문에, 초기 바인딩(또는 "정적 디스패치")이 후기 바인딩 ("동적 디스패치" 또는 "동적 바인딩") 대신에 사용될 수 있다. 이것은 사용되고 있는 프로그래밍 언어에서 다중 상속이 지원되는지 또는 단일 상속만이 지원되는지에 따라서 한 회 이상의 가상 메소드 테이블 조회를 필요로 한다. 논리형 프로그래밍
위의 예는 프롤로그의 예이다. 응답 집합 프로그래밍(answer set programming) 분야는 절대 문절 형태가 선택에 의해 확장되는 하나의 예이다. 색인 순차 접근 방식
색인 순차 접근 방식(, ISAM)은 빠른 데이터 검색을 위한 파일 시스템 구조이다. IBM 메인프레임 컴퓨터를 위해 개발되었으며, 관계형 데이터베이스 등에서 저장 구조로 활용되고 있다. 스퀴드 (소프트웨어)
위의 설정은 한정된 수의 클라이언트들을 위하여 무한대의 웹서버의 콘텐츠를 캐싱하도록 하는 - 고전적인 것이다. 다른 설정은 "역 프록시 (reverse-proxy)" 또는 "웹서버 가속 (webserver acceleration)"이라 불리는 것이다 (httpd accel host 사용). 이 설정에서는 캐시가 무한대의 클라이언트들에게 한정된 수(또는 하나)의 웹서버의 콘텐츠를 제공한다. 위상 편이 변조
위상 편이 변조(Phase-shift keying, PSK)는 기준 신호(반송파)의 위상을 변경 또는 변조 함으로써 데이터를 전송하는 디지털 변조 방식이다 재진입성
재진입성은 함수형 프로그래밍의 핵심 개념이다. 스킴 (프로그래밍 언어)
스킴 프로그래밍 언어(Scheme) 는 함수형 프로그래밍과 절차적 프로그래밍을 지원하는 다중패러다임 프로그래밍 언어로, 리스프(LISP)의 방언(변종 언어)이다. 1970년대 Guy Lewis Steele Jr. 과 Gerald Jay Sussman 에 의해서 개발되었다. 다른 LISP 방언과 비교할 때 단순함이 특징이다. 전통적인 LISP과 가장 큰 차이점은 동적 영역 규칙 대신 정적 영역 규칙을 사용하고 있다는 것이다. 반복문을 지원하기 않기 때문에 재귀함수를 이용하여 반복 계산을 처리한다. 따라서 대부분의 스킴 구현은 꼬리호출 최적화(tail-call optimization)를 수행한다. 스택 버퍼 오버플로
코드를 데이터에서 분리하는 것 대신 다른 기법으로 실행 가능한 프로그램의 메모리 공간을 랜덤화하는 것이 있다. 공격자가 위치할 실행 코드를 어디에 위치시킬 지를 결정할 필요가 있기 때문에 실행 가능한 페이로드는 실행 가능한 스택과 함께 제공되거나 ret2libc 또는 ROP같은 코드 재사용을 사용해서 구성되는데, 메모리 레이아웃을 랜덤화하는 것은 공격자가 코드가 어디에 존재하는지를 알게 하는 것을 방어한다. 그러나 구현은 일반적으로 모든 것을 랜덤화하지는 않으며, 심지어 ASLR이 실행 불가 스택에 적용 되더라도 주로 실행 파일 자체는 고정 주소에 로드되며 공격자는 메모리의 이 고정 영역을 사용할 수 있다. 그러므로 모든 프로그램들은 반드시 메모리의 영역까지 랜덤화되는 PIE(position-independent executables)와 함께 컴파일되어야 한다. 랜덤화의 엔트로피는 구현 마다 다르며 충분히 작은 엔트로피는 본질적으로 메모리 공간을 무차별 대입 공격하는 것에 대해 문제가 될 수 있다. 스칼라 (프로그래밍 언어)
스칼라는 다른 언어로 표현할 수 있는 패턴을 매우 간결하게 표현할 수 있는 범용 프로그래밍 언어이다. 객체 지향 프로그래밍 언어와 함수형 프로그래밍의 요소의 결합과 자바 API의 적용을 통해 프로그래머의 생산성을 높이는데 도움을 준다. 그 예로 같은 기능을 하는 프로그램을 작성했을 때 자바로 작성했을 때에 비해 2-3배의 코드 길이가 줄어든다. 역정규화
역정규화()는 이전에 정규화된 데이터베이스에서 성능을 개선하기 위해 사용되는 전략이다. 컴퓨팅에서 역정규화는 일부 쓰기 성능의 손실을 감수하고 데이터를 묶거나 데이터의 복제 사본을 추가함으로써 데이터베이스의 읽기 성능을 개선하려고 시도하는 과정이다. 아주 많은 수의 읽기 작업을 처리할 필요가 있는 관계형 데이터베이스 소프트웨어의 성능이나 스케일링에서 고려된다. 역정규화는 비정규화(unnormalized form)와는 구별한다. 데이터베이스/테이블은 이들을 효율적으로 역정규화하기 위해 우선 정규화되어야 한다. 반환 지향형 프로그래밍
이 기법에서 공격자는 프로그램 제어 흐름을 하이재킹하기 위해 콜 스택의 제어를 얻고, "가젯"이라고 불리는 신중히 선택된 기계어들을 실행한다. 각 가젯은 일반적으로 연결됨으로써 의미를 구현하는 몇몇 명령어들과 함께 마지막에 반환 명령어(ret)로 끝난다. 이것들은 현재 프로그램 또는 공유 라이브러리 코드 내의 서브루틴에 위치하는데 이것은 Return-to-libc 공격을 사용하는 것이다. 같이 연결된 이러한 가젯들은 공격자가 임의적인 연산을 수행할 수 있게 한다. 진화 연산
진화 연산(進化演算)은 자연의 진화에서 영감을 얻어 개발된 유전 알고리즘, 유전 프로그래밍, 진화 전략 같은 방법을 아우르는 방법론으로 전산학의 인공지능, 좀 더 세분화하면 계산 지능에 속하는 분야이고, 조합최적화 문제를 주로 다룬다. 이론 전산학의 한 분야로 보기도 한다. 섀도 복사본
스냅샷에서는 두 가지 주된 목적이 있다.
읽기 전용인 볼륨 복사본을 만들면서, 백업 프로그램은 다른 프로그램이 같은 파일에 쓰기를 하는 간섭 과정 없이 모든 파일에 접근할 수 있다.
윈도우 XP 프로페셔널, MCE, 윈도우 서버 2003 이후의 운영 체제에 포함된 마이크로소프트의 NT백업 유틸리티는 이러한 메커니즘을 이용한다. 또한 사용자는 스냅샷에 존재했던 파일에 접근할 수 있으므로 이전 버전의 파일을 탐색하거나 실수로 지워진 파일을 복구할 수 있다. 객체 지향 프로그래밍
객체 지향 프로그래밍()은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. Return 문
컴퓨터 프로그래밍에서 return 문은 현재의 함수에서 값이나 주소를 반환할 때 사용한다. 반가상화
반가상화는 오래된 개념을 위한 새로운 용어이다.
IBM의 VM 운영 체제는 1972년 이후로 편리한 기능 등을 제공해 왔다 VM 세계에서, 반가상화는 하드웨어 유지 보수 소프트웨어에 의해서만 흔히 쓰이는 명령어 코드를 사용하기 때문에, 이러한 반가상화를 "진단 코드"로 부른다. IBM의 대화식 모니터 시스템은 진단 코드를 사용함으로써 VM을 호출하여 서비스를 요청하도록 한다. 스택 버퍼 오버플로
이 방법이 아니더라도 다른 방식들도 존재한다. 가장 최악은 셸코드 생성을 위한 return-to-libc 공격 방식이다. 이 공격에서 악의적인 페이로드는 셸코드 없이, 하지만 적절한 콜 스택과 함께 스택을 로드해서 실행은 표준 라이브러리 호출들의 체인에 위치하게 된다. 이것은 실행이 실제로는 스택 자체에 위치하지 않기 때문에 동작한다. 반환 지향형 프로그래밍
이후에는 버퍼 오버런 취약점을 익스플로잇하려는 간단한 공격들을 방어하는 기계에서, 전체 함수들 자체 대신에 라이브러리 함수들의 청크들 즉, 부분들을 사용하는 형태의 공격으로 진화되었다. 이 기법은 스택에서 레지스터로 값을 pop 하는 명령어 열들을 갖는 함수를 찾는다. 이러한 코드열들의 신중한 선택은 공격자가 새로운 호출 규약 하에서 함수 호출을 수행하기 위해 적절한 값들을 적절한 레지스터에 넣게 한다. 공격의 나머지는 return-into-library 공격과 같다. 오픈스택
Designate은 DNS를 관리하는 멀티테넌트 REST API이다. 이 구성 요소는 서비스로서의 DNS를 제공하며 PowerDNS, BIND를 포함한 수많은 백엔드 기술들과 호환된다. 하나의 테넌트마다 DNS 존을 관리하기 위해 기존의 DNS 서버와 상호 작용하는 등의 목적으로 DNS 서비스를 제공하지는 않는다. 유전 프로그래밍
유전 프로그래밍(Genetic programming)은 사용자가 원하는 작업을 수행하는 컴퓨터 프로그램을 찾아내는 방법이다. 생물학적 진화를 통해 착안한 알고리즘으로, 유전 알고리즘의 확장된 형태이고 기본적인 특성은 기존 유전 알고리즘 방식과 흡사하다. 하지만 간단한 명령어 집합을 이용하는 특성 때문에 개개의 결과물은 작은 하나의 컴퓨터 프로그램이 되어 기존 방식에 비해 복잡한 계산도 수행 가능한 것이 큰 장점이다. 회귀 테스트
회귀 테스트는 익스트림 프로그래밍의 중요한 부분이다. 이 방법론에 따르면 디자인 문서는 처음 작성된 후에도 소프트웨어 개발 주기 상의 모든 단계마다 업데이트된다. 그러한 업데이트는 전체 소프트웨어 패키지에 대한 확산적이며 반복적인 자동화 테스트를 통해 이뤄진다. 트랜스폰더 (항공)
모드 S: 원래 데이터 패킷 업링크(1030Mhz)와 다운링크(1090Mhz) 포맷을 표준화한 것을 말하며, 선택적인 문의(각 항공기는 고정된 24비트 주소로 설정)에 응답하기 위한 트랜스폰더(transponder) 레이다 설계에 사용된다. 또한 다운링크 데이터 포맷은 독립적으로 위치나 속도 같은 정보를 사용할 수 있다.(군 및 민간 사용) 단위전략 기반 디자인
단위전략 기반 디자인(Policy-based design) 혹은 단위전략 기반 클래스 디자인(policy-based class design), 단위전략 기반 프로그래밍(policy-based programming) 은 단위전략이라고 불리는 C++의 이디엄에서 비롯된 컴퓨터 프로그래밍 패러다임이다. 이는 전략 패턴을 컴파일 타임에 적용하는 것이며, C++의 템플릿 메타프로그래밍과 연관이 있다. 단위전략 기반 디자인은 Andrei Alexandrescu의 저서인 Modern C++ Design을 통해서 대중에 알려졌다. 디스패치 테이블
컴퓨터 과학에서 디스패치 테이블 ()은 메서드들을 가리키는 포인터들이나 메소드들의 테이블이다. 이런 테이블을 사용하는 것은 객체 지향 프로그래밍에서 늦은 바인딩을 구현하는 기본적인 기술이다. 코드 재사용
재사용을 빠르고 용이하게 하기 위해 프로그래밍 정식 절차의 일부로서 보다 체계적으로 실시할 수 있도록 하는 연구가 많이 이루어져 왔다. 객체지향 프로그래밍도 그러한 목적에서 만들어진 것으로 정식화된 재사용기법으로서 일반화되었다. 같은 목적으로 후에 개발된 것으로서 제네릭프로그래밍이 있다. 트리 순회
각각의 노드가 부모 포인터를 가지고 있거나 스레드 이진 트리인 경우 스택을 쓸 필요가 없다. 스레드를 쓰는 경우, 중위 순회를 더 크게 개량할 수 있고, 전위 순회와 후위 순회에 필요한 부모 노드의 필요성을 되찾더라도 이것이 알고리즘에 기반한 간단한 스택보다 더 느려지게 된다. 역컴파일러
역컴파일러()는 컴파일러와 반대의 역할을 하는 컴퓨터 프로그램이다. 즉, 이것은 상대적으로 저수준의 추상에 있는 프로그램의 코드를 고수준의 추상으로 변형한다. 역컴파일러는 보통 원본 소스코드로 완벽하게 재구성될 수 없으며, 결과가 매우 다양할 수 있다. 그럼에도 불구하고 이것은 소프트웨어 리버스 엔지니어링에서 매우 중요한 도구이다. 역컴파일러는 실행 파일을 입력으로 갖고, 같은 기능을 하는 소스 코드 파일 즉, 고급 언어로 만든다. 마샬링 (컴퓨터 과학)
마샬링은 프로세스 간 또는 스레드 간 데이터 전송에 필요한 원격 프로시저 호출(remote procedure call, RPC) 매커니즘의 구현에 사용된다. 마이크로소프트 COM(컴포넌트 오브젝트 모델, Component Object Model)에서 인터페이스 포인터(interface pointer)는 COM 아파트먼트 바운더리(COM apartment boundaries)를 지날 때 (즉, COM 라이브러리 인스턴스들의 경계를 지날 때) 마샬링 되어야만 한다. 닷넷 프레임워크(.NET)에서, P/Invoke 프로세스 하의 관리되지 않은 타입과 CLR 타입 간의 변환은 마샬링을 요구하는 또 하나의 예이다.