반환 지향 프로그래밍은 스택 스매싱의 진화된 버전인가요?
반환 지향형 프로그래밍
반환 지향 프로그래밍은 스택 스매싱의 진화된 버전이다. 일반적으로 공격들의 이러한 종류들은 상대방이 프로그램의 버그(주로 버퍼 오버런)를 이용함으로써 콜 스택을 조작할 때 발생한다. 버퍼 오버런 시에 사용자가 제공하는 데이터를 적절한 경계 검사 없이 메모리에 저장하는 함수는 적정한 양보다 더 많은 데이터를 받아들일 수 있다. 데이터가 스택에 겹쳐써지면 초과된 데이터는 함수의 변수에 할당된 공간을 넘치게 되고 반환 주소도 겹쳐쓰게 된다. 이 주소는 이후에 함수에 의해서 제어 흐름을 다시 호출자로 넘겨줄 때 사용된다. 만약 겹쳐써졌다면 제어 흐름은 새로운 반환 주소로 넘겨지게 된다.
레지스터 스프링
컴퓨터 보안에서, 레지스터 스프링은 트램펄린의 한 종류이다. 이것은 콜 스택에 위치한 익스플로잇으로서 DLL이나 정적 프로그램 바이너리 내에서 제어 흐름을 존재하는 코드로 안내하는 가짜 반환 포인터 또는 SEH 포인터이다. 이 대상 코드는 결과적으로, 익스플로잇에 의해서 미리 준비된 적절한 프로세서 레지스터가 페이로드 코드가 어디서 시작하는지를 가리키는 곳으로의 "CALL EBX"이나 "JMP ESP" 같은 call 또는 jump로 이루어 진다. AspectC++
관점 지향 프로그래밍은 횡단 관심사를 하나의 모듈, 즉 관점(애스펙트, aspect)로 모듈화하는 것을 허용한다. 애스펙트는 기존의 클래스를 수정할 수 있지만 대체적으로는 기존 기능의 이전(before), 이후(after), 주변(around)에 실행할 "어드바이스"(advice)를 제공한다. 예측사격
현대의 1인칭 슈팅 컴퓨터 게임은 일반적으로 비유도 어깨 견착 미사일과 같은 예측사격이 필요한 상대적으로 속도가 낮은 투사체 병기가 많이 등장한다. 또한 세계 어딘가의 서버에서 행동을 연산하는 어떤 다인용 게임은, 고속병기나 히트스캔병기일지라도 지연 문제가 존재하기 때문에 예측사격이 필요하다. 본질적으로 목표를 정확하게 겨냥하더라도, 플레이어의 컴퓨터에서 전송한 사격에 대한 정보가 서버에 도달하는 시간 때문에, 그 동안 목표가 피격을 피할만큼 충분히 이동할 수 있다. 직비
직비 스택의 최신 버전은 2007년 10월 30일 발표된 "직비 프로"(ZigBee PRO)이다. 때때로 “직비 2007”로 불리기도 한다. 직비 프로에는 2개의 스택 프로파일이 들어가 있다. 직비 스택 프로파일 1(간단히 줄여 직비)은, 가정용 및 단순 산업용 용도이다. 직비 스택 프로파일 2는 더 많은 기능을 포함하고 있는데, 멀티캐스팅, 다대일 라우팅, 대칭키 키교환(SKKE)을 이용한 고수준의 보안성 등이다. 직비 스택 프로파일 1이 RAM과 플래시 메모리를 더 적게 사용한다. 직비 스택 프로파일 1과 2 모두 완전한 메시 네트워킹 기능을 제공하며 또한 모든 직비 애플리케이션 프로파일에 대해 작동한다. 단위전략 기반 디자인
단위전략 기반 디자인(Policy-based design) 혹은 단위전략 기반 클래스 디자인(policy-based class design), 단위전략 기반 프로그래밍(policy-based programming) 은 단위전략이라고 불리는 C++의 이디엄에서 비롯된 컴퓨터 프로그래밍 패러다임이다. 이는 전략 패턴을 컴파일 타임에 적용하는 것이며, C++의 템플릿 메타프로그래밍과 연관이 있다. 단위전략 기반 디자인은 Andrei Alexandrescu의 저서인 Modern C++ Design을 통해서 대중에 알려졌다. 마샬링 (컴퓨터 과학)
컴퓨터 과학에서 마샬링(marshalling, l을 하나만 사용하여 marshaling이라고도 표기)이란 한 객체의 메모리에서의 표현방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환하는 과정이다. 또한 이는 데이터를 컴퓨터 프로그램의 서로 다른 부분 간에 혹은 한 프로그램에서 다른 프로그램으로 이동해야 할 때도 사용된다. 마샬링은 직렬화(serialization)와 유사하며 한 오브젝트, 여기서는 직렬화 된 오브젝트로 멀리 떨어진 오브젝트와 통신하기 위해 사용된다. 이는 복잡한 통신을 단순화 하기 위해, 기본 요소(primitives) 대신 통신을 위한 맞춤형 오브젝트를 사용한다. 마샬링의 반대 개념으로 언마샬링(unmarshalling)이 있다 (디마샬링-demarshalling-이라고도 불리며, 역직렬화-deserialization-와 유사하다). 절차적 프로그래밍
절차적 프로그래밍()은 절차지향 프로그래밍 혹은 절차지향적 프로그래밍이라고도 불리는 프로그래밍 패러다임의 일종으로서, 때때로 명령형 프로그래밍과 동의어로 쓰이기도 하지만, 프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임을 의미하기도 한다. 프로시저는 루틴, 하위프로그램, 서브루틴, 메서드, 함수(수학적 함수와는 다르고 함수형 프로그래밍에 있는 함수와는 비슷한 의미이다.)라고도 하는데, 간단히 말하여 수행되어야 할 연속적인 계산 과정을 포함하고 있다. 프로그램의 아무 위치에서나 프로시저를 호출될 수 있는데, 다른 프로시저에서도 호출 가능하고 심지어는 자기 자신에서도 호출 가능하다. Ajax
Ajax는 소프트웨어 개발에 대한 새로운 접근방식이 아니다. 보다 높은 관점에서 Ajax는 MVC 패턴의 뷰와 컨트롤러에 해당하는 기술이며, 이런 방식은 이전의 프로그래밍 환경인 델파이, MFC, MP3, 비주얼 베이직, 오라클 ADF, 윈도 Forms 등에서 이미 많이 사용하고 있던 것이다. 예를 들어 WebDAV를 사용하는 마이크로소프트 아웃룩 웹 액세스와 브라우저에서 직접 웹 서비스를 이용하는 웹 기반의 ERP 시스템 P2plus 같은 것들이 해당한다. 그러나 이전에는 표준적인 통신 모델이 없었기 때문에, 이들은 모두 독자적인 확장을 이용한다. X86 호출 규약
x86의 codice_2 명령의 예는 다음과 같다:
파스칼 프로그래밍 언어의 호출 규약을 기반으로 매개변수들은 왼쪽에서 오른쪽 순으로 스택 위에 푸시된다. (cdecl과 반대) 피호출자는 반환 이전에 스택의 균형을 맞추는 일을 한다. 이 호출 규약은 다음의 16비트 API에서 일반적이다: OS/2 1/x, 마이크로소프트 윈도 3.x, 볼랜드 델파이 버전 1.x. 관점 지향 프로그래밍
관점 지향 소프트웨어 개발은 온전한 엔지니어링 분야를 가리키는 반면에 관점 지향 프로그래밍은 소스 코드 레벨에서 관심사들의 모듈화를 지원하는 프로그래밍 메서드들과 도구들을 포함하고 있다. 반환 지향형 프로그래밍
스레드 코드 - 반환 지향형 프로그래밍은 스레드 코드의 재발견이다. Return-to-libc 공격 버퍼 오버플로
NOP 슬라이드 기법은 가장 오래되고 가장 널리 알려진 스택 버퍼 오버플로 공격 기법이다. 버퍼의 정확한 주소를 찾는 문제를 해결하는 것으로, 표적 영역의 크기를 효과적으로 증대시킨다. 이를 위하여 훨씬 큰 영역의 스택을 NOP 기계어 코드 (컴퓨터가 이 명령을 읽으면 그 클럭 싸이클에는 아무 일도 하지 않는다)로 오염시킨다. 공격자 제공 데이터 끝, 즉 NOP 명령어 이후에 버퍼의 최상위 위치, 셸 코드가 있는 곳으로 상대적 jump 명령어를 둔다. NOP 명령어의 모음이 "NOP 슬라이드"라고 불린다. 왜냐하면 귀환 주소를 덮어 쓸 때 NOP 영역 내의 주소값 어디를 써도 결국 NOP 명령어들을 따라 "미끄러져" 최후의 상대 jump로 실제 악성 코드에 도달하기 때문이다. 이 기법은 공격자가 상대적으로 작은 크기의 셸 코드의 위치 대신 스택에서 NOP 슬라이드의 위치를 추정하면 된다. 스택 버퍼 오버플로
코드를 데이터에서 분리하는 것 대신 다른 기법으로 실행 가능한 프로그램의 메모리 공간을 랜덤화하는 것이 있다. 공격자가 위치할 실행 코드를 어디에 위치시킬 지를 결정할 필요가 있기 때문에 실행 가능한 페이로드는 실행 가능한 스택과 함께 제공되거나 ret2libc 또는 ROP같은 코드 재사용을 사용해서 구성되는데, 메모리 레이아웃을 랜덤화하는 것은 공격자가 코드가 어디에 존재하는지를 알게 하는 것을 방어한다. 그러나 구현은 일반적으로 모든 것을 랜덤화하지는 않으며, 심지어 ASLR이 실행 불가 스택에 적용 되더라도 주로 실행 파일 자체는 고정 주소에 로드되며 공격자는 메모리의 이 고정 영역을 사용할 수 있다. 그러므로 모든 프로그램들은 반드시 메모리의 영역까지 랜덤화되는 PIE(position-independent executables)와 함께 컴파일되어야 한다. 랜덤화의 엔트로피는 구현 마다 다르며 충분히 작은 엔트로피는 본질적으로 메모리 공간을 무차별 대입 공격하는 것에 대해 문제가 될 수 있다. 스택 버퍼 오버플로
이 방법이 아니더라도 다른 방식들도 존재한다. 가장 최악은 셸코드 생성을 위한 return-to-libc 공격 방식이다. 이 공격에서 악의적인 페이로드는 셸코드 없이, 하지만 적절한 콜 스택과 함께 스택을 로드해서 실행은 표준 라이브러리 호출들의 체인에 위치하게 된다. 이것은 실행이 실제로는 스택 자체에 위치하지 않기 때문에 동작한다. 소프트웨어 크래킹
다른 경우로, 원본 소스 코드에 대한 접근을 목적으로 프로그램을 역컴파일하는 것도 가능하다. 이것은 종종 스크립트 언어와 JIT 모음을 사용하는 언어에서 가능하다. 예를 들면 자바 바이트코드는 프로그램이 플랫폼에 의존적인 기계어로 컴파일되기 전의 중간 언어로서 사용된다. 랜 스위칭
LAN 스위칭은 패킷 교환이 사용된 형태의 근거리통신망(LAN)이다. 스위칭 기술은 빠르며 하드웨어적인 방법을 사용하고 대부분의 경우 필요한 곳에 트래픽을 전송할 수 있도록 네트워크 설계를 결정한다. LAN 스위칭은 네트워크 스위치의 다양한 종류를 사용한다. 표준 스위치는 L2 스위치로 알려져 있으며 모든 LAN에서 쉽게 찾아볼 수 있다. L3 또는 L4 스위치는 높은 기술을 가지고 있으며 매우 고가임으로 큰 네트워크 환경과 특수한 시설에서 찾아볼 수 있다. 프런트엔드와 백엔드
콘텐츠 관리 시스템(CMS)에서 프론트엔드와 백엔드는 CMS의 최종 사용자가 보는 뷰와 관리 뷰를 각각 가리킬 수 있다.[1] 음성 합성에서 프론트엔드는 입력 텍스트를 심볼 음운 표현으로 변환하는 합성 시스템의 일부를, 백엔드는 음운 표현을 실제 소리로 변환(convert)하는 것을 가리킨다.[2] 주요 컴퓨터 하위 시스템에서 그래픽 파일 관리자는 컴퓨터의 파일 시스템의 프론트엔드이고 셸은 운영 체제와 통신한다. 프론트엔드는 사용자와 마주하며 백엔드는 응답 시 운영 체제의 프로그램의 실행을 종료한다. 컴파일러에서 프론트엔드는 컴퓨터 프로그래밍 소스 코드를 중간 표현으로 변환하며 백엔드는 컴퓨터 출력 언어의 코드로 생성하기 위해 중간 표현을 가지고 작업한다.[3] 스케치패드
스케치패드는 현대의 컴퓨터 지원 설계(CAD) 프로그램의 조상일뿐 아니라 일반적으로 컴퓨터 그래픽스 일반의 발전에 주요한 돌파구를 제시했다. 예를 들어 그래픽 사용자 인터페이스(GUI)는 스케치패드뿐 아니라 현대의 객체 지향 프로그래밍에서 비롯된 것이었다. 이반 서덜랜드는 컴퓨터 그래픽스가 인간-컴퓨터 상호작용의 새로운 방식을 보여주는 동시에, 컴퓨터 그래픽이 예술과 기술적인 목적에 둘 다 사용될 수 있음을 증명하였다. 코드 재사용
재사용을 빠르고 용이하게 하기 위해 프로그래밍 정식 절차의 일부로서 보다 체계적으로 실시할 수 있도록 하는 연구가 많이 이루어져 왔다. 객체지향 프로그래밍도 그러한 목적에서 만들어진 것으로 정식화된 재사용기법으로서 일반화되었다. 같은 목적으로 후에 개발된 것으로서 제네릭프로그래밍이 있다. F 샤프
저 소스는 5000! 을 계산할 때도 stack overflow 를 걱정하지 않아도 된다.
이것이 F# 언어의 한 특징이다. 보통의 명령형 언어(Python 언어)와 달리 패턴 매칭(match)에 의한 재귀호출은 상태에 의한 호출이기 때문이다. 저 소스에서 쓰인 재귀호출을 보통은 꼬리재귀호출이라고 한다. 반환 지향형 프로그래밍
반환 지향 프로그래밍은 빌린 코드 청크 접근법에 기반하며 공격자에게 튜링 완전 기능(루프와 조건 분기를 포함하는)을 제공하기 위해 확장되었다.[5][6] 다시 말해서, 반환 지향 프로그래밍은 완전하게 기능적인, 공격자가 어떠한 요구되는 연산을 수행하기 위해 사용할 수 있는 "언어"를 제공한다. 논리형 프로그래밍
위의 예는 프롤로그의 예이다. 응답 집합 프로그래밍(answer set programming) 분야는 절대 문절 형태가 선택에 의해 확장되는 하나의 예이다. 데이터 스트림
데이터 스트림(data stream)은 연결지향통신에서, 전송된 정보를 수집하거나 정보를 전송할 때 사용되는 디지털 방식으로 암호화 된 일관된 신호의 흐름을 말한다. 전자 및 컴퓨터 구조 분야에서, 데이터의 흐름은 재구성 가능한 데이터경로 배열 다른 비슷한 파이프 네트워크나 다른 처리 블럭, 처리 유닛들의 포트로 언제, 어떤 정보들이 들어오거나 밖으로 나가는 지를 관할한다. 폰 노이만 구조의 컴퓨터는 명령 스트림기반인 반면, 안티머신은 데이터스트림 기반이기 때문에 종종 데이터 스트림을 명령 스트림으로 보기 쉽다. 오브젝티브-C
메시지는 객체 지향 프로그래밍을 지원하기 위해 내부적으로 추가된 문법이다. 오브젝티브-C의 객체 지향 프로그래밍에 대한 모델로 메시지를 객체에 전달하는 방식을 채용하고 있다. 이는 스몰토크와 매우 유사한 모델이다. 하지만 이는 C++과 다른 언어에서 사용하는 시뮬라(Simula) 프로그래밍 모델과는 구별되는 것이다. 이러한 특징은 중요한 의미를 갖는다. 오브젝티브-C의 기본적인 차이점은 "메소드를 호출"하는 것이 아니라 "메시지를 전달"한다는 것이다. 포스 (프로그래밍 언어)
절차적, 스택 지향, 형 확인 없는 반사적 프로그래밍 언어(reflective programming language without type checking)인 포스는 두 가지 특징을 가진다. 명령어의 상호작용적인 실행(좀 더 정형적인 운영 체제에 부족한 시스템용 셸로서 적합하게 한다)과 나중에 실행할 일련의 명령어를 컴파일하는 능력이다. 몇몇 포스 버전들(특히 초기의 것들)은 스레드된 코드를 컴파일하지만 오늘날의 많은 구현들은 다른 언어 컴파일러처럼 최적화된 기계어를 생성한다. 플래닝 포커
플래닝 포커는 광대역 델파이(Wideband delphi)의 한 형태이다. 이것은 애자일 소프트웨어 개발에서 가장 일반적으로 사용된다. 특히 스크럼 (애자일 개발 프로세스)과 익스트림 프로그래밍 방법론에서 말이다. 횡단 관심사
관점 지향 프로그래밍은 횡단 관심사들을 애스펙트로 캡슐화함으로써 모듈화를 갖는 것을 목표로 한다. 이를 통해 횡단 관심사를 해결하는 코드의 깨끗한 분리와 재사용을 달성할 수 있게 한다. 횡단 관심사에 대한 기초적인 설계를 통해 소프트웨어 공학적 장점으로 모듈화와 단순해진 유지보수가 포함될 수 있다. 트리 순회
각각의 노드가 부모 포인터를 가지고 있거나 스레드 이진 트리인 경우 스택을 쓸 필요가 없다. 스레드를 쓰는 경우, 중위 순회를 더 크게 개량할 수 있고, 전위 순회와 후위 순회에 필요한 부모 노드의 필요성을 되찾더라도 이것이 알고리즘에 기반한 간단한 스택보다 더 느려지게 된다. 리다이렉션
리다이렉션(redirection)은 컴퓨팅에서 표준 스트림을 사용자 지정 위치로 우회할 수 있는 다양한 유닉스 셸을 포함한 대부분의 명령어 인터프리터에 일반적인 명령이다. 방향 지정, 방향 변경으로도 부른다. 스트림 예약 프로토콜
스트림 예약 프로토콜()은 진입 제어를 구현하는 이더넷 확장판이다. 2010년 9월에 SRP는 IEEE 802.1Qat로 표준화되었다.(이후에 IEEE 802.1Q와 통합되었다.) SRP는 OSI 모델의 제2계층(데이터 링크 계층)에서 스트리밍의 개념을 정의한다. 클라우드 컴퓨팅
클라우드 컴퓨팅(cloud computing)은 인터넷 기반 컴퓨팅의 일종으로 정보를 자신의 컴퓨터가 아닌 인터넷에 연결된 다른 컴퓨터로 처리하는 기술을 의미한다. 공유 컴퓨터 처리 자원과 데이터를 컴퓨터와 다른 장치들에 요청 시 제공해준다. 구성 가능한 컴퓨팅 자원(예: 컴퓨터 네트워크, 서버, 스토리지, 애플리케이션, 서비스)에 대해 어디서나 접근이 가능한, 주문형 접근을 가능케하는 모델이며[1][2] 최소한의 관리 노력으로 빠르게 예비 및 릴리스를 가능케 한다. 클라우드 컴퓨팅과 스토리지 솔루션들은 사용자와 기업들에게 개인 소유나 타사 데이터 센터의 데이터를 저장, 가공하는 다양한 기능을 제공하며[3] 도시를 거쳐 전 세계로까지 위치해 있을 수 있다. 클라우드 컴퓨팅은 전기망을 통한 전력망과 비슷한 일관성 및 규모의 경제를 달성하기 위해 자원의 공유에 의존한다. 반영 (컴퓨터 과학)
반영은 프로그램을 서로 다른 상황에서 동적으로 사용할 수 있게 한다. 예를 들어, 비슷한 동작을 수행하는 서로 다른 클래스 ‘X’와 클래스 ‘Y’를 교체하여 사용하는 응용 프로그램을 고려해보자. 반영 지향적이 아닌 프로그램 개발에서는, 응용 프로그램은 클래스 ‘X’와 클래스 ‘Y’의 함수를 호출하기 위하여, 함수(이름)을 직접 코드로 작성해야 한다. 반면, 반영 지향적인 프로그램 패러다임에서, 응용 프로그램은 함수(이름)을 직접 코드로 작성하지 않고, 클래스 ‘X’와 클래스 ‘Y’의 함수를 호출하기 위하여, 반영을 이용하여 설계되고 작성될 수 있다. 반영 지향적인 프로그램은 보다 보편적인(Generic) 코드의 수행의 기능을 사용하기 위하여, 거의 언제나 추가적인 정보, 프레임워크, 연관 사상, 객체 관계 등을 필요로 한다. 반영 지향적인 프로그램 기술을 확장하면, 하드 코딩을 방지할 수 있다. 평행 이동
평행 이동(translation)은 기하학에서 모든 점을 같은 방향으로 같은 거리 이동시키는 함수를 가리킨다. 병진(竝進) 이라고도 한다.
고정점이 없는 아핀 변환이다. 행렬 곱셈은 원점을 고정점으로 가지기 때문에 이를 바로 사용할 수 없다. 가장 좋은 회피방법은 동차좌표에서 병진 벡터를 같이 나타내서 곱하는 것으로, 원래 이동하는 차원이 n차원이라면 n+1차 정사각행렬을 사용한다.
평행 이동 연산자 formula_1는 다음과 같이 표현된다. 서비스 거부 공격
분산 반사 서비스 거부 공격()은 DDoS가 한 단계 더 진화한 형태의 공격 방식이다. 아파치 스파크
아파치 스파크(Apache Spark)는 오픈 소스 클러스터 컴퓨팅 프레임워크이다. 원래 캘리포니아 대학교 버클리의 AMPLab에서 개발된 스파크의 코드베이스는 나중에 아파치 소프트웨어 재단에 기부되었으며 그 이후로 계속 유지 보수를 해오고 있다. 스파크는 암시적 데이터 병렬성과 장애 허용과 더불어 완전한 클러스터를 프로그래밍하기 위한 인터페이스를 제공한다. MPEG 프로그램 스트림
프로그램 스트림은 하나 또는 그 이상의 패킷화된 기초 스트림(PES)을 하나의 스트림으로 결합하여 생성된다. 이 포맷은, 데이터 전송을 위해 개발된 MPEG 트랜스포트 스트림과는 다르게, 디스크처럼 합리적이고 신뢰성 있는(데이터 손실 우려가 적은) 미디어를 위해 개발되었다. 프로그램 스트림은 가변 사이즈 레코드들을 지원하며, 방송수신을 어렵게 하는 시작 코드를 최소로 사용한다. 프로그램 스트림 코딩 레이어는, 트랜스포트 스트림과는 다르게, 하나 또는 그 이상의 기초 스트림의 단 하나의 프로그램을 하나의 스트림으로 패키지화될 수 있도록 도와준다. 프로토타입 기반 프로그래밍
이렇게 접근하면 객체 작성자가 한 부모 객체의 자식 객체들간에 부수효과를 신경쓰지 않고 복제할 수 있다는 이점이 있다. 또 다른 이점은, 디스패치 중 메서드 미리보기의 계산 비용이 위임에 비해서 급격히 줄어든다는 것이다. 위임을 하면 적합한 메서드나 슬롯을 찾는 것을 실패한다면 전체 위임 사슬에서 찾아봐야 하기 때문이다. 포스 (프로그래밍 언어)
포스는 스택을 사용하며, 역폴란드 표기법(후위 표기법) 사용하여 입출력에 대한 코드를 기술하며, 스택 조작 명령어들을 통해서 값들의 위치와 상태를 변형한다. 응용 프로그램 이진 인터페이스
ABI는 API와 다르다, API가 소스 코드에서 사용된다면 ABI는 바이너리에서 호환이 가능하다는 점이 다르다.
EABI(임베디드 응용 프로그램 이진 인터페이스, embedded-application binary interface)는 임베디드 소프트웨어 프로그램을 수행하는 파일 형식, 자료형, 레지스터 사용, 스택 프레임 조직, 명령 변수를 위한 표준 변환을 정의하고 있다. 관점 지향 프로그래밍
이를테면, 개념적으로 매우 단순한 메소드가 있는 은행업 애플리케이션을 생각해 보자. 아래는 하나의 계정에서 다른 계정으로 송금하는 것이다:
그러나 이러한 송금 방식은 디플로이된 애플리케이션이 다음을 필요할 것만 고려하고 있다: 현재 사용자가 이 작업을 수행하기 위한 권한이 있는지를 검사하는 보안 검사 기능이 없다. 데이터베이스 트랜잭션은 우연한 데이터 손실을 예방하기 위해 작업을 캡슐화하는 것이 좋겠다. 진단을 위해 이 작업은 시스템 로그에 기록하는 것이 좋겠다. 등등... 반환 지향형 프로그래밍
이 랜덤화 접근법은 단지 라이브러리 위치 뿐만 아니라 프로그램의 모든 명령어들을 각각 재위치시킴으로써 더 나아갈 수 있다.[10] 이것은 랜덤화된 명령어들을 런타임 시에 다시 모을 수 있도록 소프트웨어 동적 변환기 같은 광범위한 런타임 지원을 요구한다. 이 기법은 가젯을 찾고 활용하기 어렵게 만드는데 성공적이지만, 상당한 양의 오버헤드가 유발된다. 명령형 프로그래밍
컴퓨터 과학에서 명령형 프로그래밍()은 선언형 프로그래밍과 반대되는 개념으로, 프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 프로그래밍 패러다임의 일종이다. 자연 언어에서의 명령법이 어떤 동작을 할 것인지를 명령으로 표현하듯이, 명령형 프로그램은 컴퓨터가 수행할 명령들을 순서대로 써 놓은 것이다. 하스켈
2002년을 기준으로 하스켈은 느긋한 계산법을 쓰는 함수형 언어 가운데 가장 활발한 연구가 이루어지는 언어로 볼 수 있다. 언어의 변형도 몇 가지 개발되었다. 매사추세츠 공과대학교와 글래스고 대학교가 개발한 버전은 병렬화가 가능하기 때문에 ‘병렬 하스켈’이라고 불린다. 이후 병렬화와 분산 처리를 더욱 강화한 ‘분산 하스켈’과 에덴 프로그래밍 언어가 나왔고, 느긋한 계산법 대신 적극적인 계산법을 쓰는 ‘적극적 하스켈’이 있으며 하스켈에 객체 지향 개념을 도입한 버전으로 ‘하스켈++’, ‘오하스켈’, 몬드리안 프로그래밍 언어 등등이 있다. 객체 지향 프로그래밍
다형성 개념이란 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것)이나 오버로딩(같은 이름의 메소드가 인자의 갯수나 자료형에 따라서 다른 기능을 하는 것)을 의미한다. 다형 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다. 프로그래밍 패러다임
소프트웨어 공학의 서로 다른 무리가 서로 다른 "방법론"을 지원하듯이, 서로 다른 프로그래밍 언어는 서로 다른 "프로그래밍 패러다임"을 지원한다. 어떤 언어들은 하나의 특정한 패러다임을 지원하기도 하는데, 스몰토크와 jdk 1.8 이전의 자바가 객체지향 프로그래밍을 지원하는 반면에, 하스켈과 스킴은 함수형 프로그래밍을 지원한다. 여러 가지 패러다임을 지원하는 언어들도 있는데, 커먼 리스프, 파이썬, 오즈, jdk 1.8 이상의 자바 등이 이런 언어들이다. ("몇년 전까지 자바는 명령형 프로그래밍, 객체지향 프로그래밍 패러다임을 따르기로 유명했다. 하지만 jdk 1.8 부터 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했고 선언형 프로그래밍의 장려를 위해 Stream과 같은 표준 API 등도 추가했다. 그러나 태생부터 함수형 패러다임을 지원하는 여타 언어들과는 달리 여전히 함수를 일급객체로 취급하지는 않는다. 자바에서 람다식은 함수형 인터페이스를 구현하는 익명클래스의 인스턴스를 생성하며, 좀 더 간단한 표현을 위해 컴파일러의 타입 추론이 동원된다." ) 스택
스택()은 제한적으로 접근할 수 있는 나열 구조이다. 그 접근 방법은 언제나 목록의 끝에서만 일어난다. 끝먼저내기 목록(Pushdown list)이라고도 한다. 래킷 (프로그래밍 언어)
래킷(Racket, 이전 이름: PLT Scheme)은 리스프-스킴 계열의 범용 프로그래밍 패러다임이다. 설계적 목표 중 하나는 언어 제작, 설계, 구현의 플랫폼의 역할을 하는 것이다. 이 언어는 스크립팅, 범용 프로그래밍, 컴퓨터 과학 교육, 연구와 같은 다양한 문맥에 사용된다. 주파수 편이 변조
주파수 편이 변조(Frequency-shift keying, FSK)란 반송파(carrier wave)의 이산 주파수(discrete frequencies) 변화를 통해 디지털 정보가 전송되는 주파수 변조 체계이다. 가장 간단한 FSK는 이진 FSK(BFSK)이다. BFSK는 이진수 정보(0과 1로 구성)를 전송하기 위해 한 쌍의 이산 주파수를 사용한다. BFSK에서 "1"은 mark 주파수, 그리고 "0"은 space 주파수라 불린다.
자세히 설명된 참조할만한 구현은 다음과 같다. BFSK 신호의 복조(demodulation)는 Goertzel 알고리즘을 이용해서 매우 효율적으로 구현되며, 낮은 전력의 마이크로컨트롤러(microcontroller)에서도 그러하다. 되부름 하향 구문 분석
되부름 하향(recursive descent parser)는 상호 순환 절차(procedure)의 집합(또는 비재귀 적인 동등한 구문)으로 이루어진 하향식 구문 분석이다. 한 절차는 문법의 한 생성 규칙을 처리한다. 따라서 프로그램의 구조는 문법을 반영한 모양이 된다. 축소 명령어 집합 컴퓨터
1960년대로 거슬러 올라가면 수많은 시스템들이 최초의 RISC 아키텍처라고 볼 수도 있는데, 이는 부분적으로 로드/스토어 접근 방식에 기반을 두기 때문이다. RISC라는 용어는 버클리 RISC 프로젝트의 데이비드 패터슨이 만든 용어이지만 비슷한 개념은 이미 그 이전에 등장하였다.CISC에서는 하드웨어가 스택을 지원하지만, RISC에는 없다. 스택 제어(데이터의 PUSH, POP이 발생할 때 레지스터의 퇴피, 서브루틴에 점프했을 때의 리턴 주소의 보존, 복귀)의 처리는 단순한 명령을 조합하여 소프트웨어로 구현된다. 명령어의 순서로 인해 발생할 수 있는 파이프라인의 위험은 컴파일하는 동안 최적화되어 사라진다. 파이썬
2.x대 버전 과의 차이를 간략히 요약하면 다음과 같다.파이썬은 다양한 프로그래밍 패러다임을 지원하는 언어이다. 객체 지향 프로그래밍과 구조적 프로그래밍을 완벽하게 지원하며 함수형 프로그래밍, 관점 지향 프로그래밍 등도 주요 기능에서 지원 된다. 그리드 컴퓨팅
그리드 컴퓨팅()은 최근 활발히 연구가 진행되고 있는 분산 병렬 컴퓨팅의 한 분야로서, 원거리 통신망(WAN, Wide Area Network)으로 연결된 서로 다른 기종의(heterogeneous) 컴퓨터들을 하나로 묶어 가상의 대용량 고성능 컴퓨터를 구성하여 고도의 연산 작업(computation intensive jobs) 혹은 대용량 처리(data intensive jobs)를 수행하는 것을 일컫는다. 모든 컴퓨터를 하나의 초고속 네트워크()로 연결하여 계산능력을 극대화시키는 차세대 디지털 신경망 서비스를 말한다. 여러 컴퓨터를 가상으로 연결해서 공동으로 연산작업을 수행하게 하는 것이며 분산 컴퓨팅이라고도 한다.  프로그래밍 심리학
후기 피아제의 인지발달이론에 근거하여 컴퓨터 프로그래밍 능력의 발전단계를 설명하는 이론이다. 피아제가 주장한 발달이론의 감각운동기, 전조작기, 구체적조작기, 형식적 조작기의 발전과정이 컴퓨터 프로그래밍에 적용한 모델이다. 초보 프로그래머는 신뢰할 수 있는 코드를 수동으로 실행 할 수 없으며 변수의 최종값을 결정할 수 없다. 이러한 단계를 감각운동기(Sensorimotor)에 있다고 정의한다. 초보 프로그래머는 코드의 추적(Trace)를 안정적으로 할 수 있지만 전체적인 구성을 보지 못하는 단계가 전조작기(Preoperational) 라고 한다. 이 단계에서 프로그래머는 귀납적 접근을 하므로 프로젝트를 설계할 수 없는 단계이다. 연역 추론이 가능한 초보 프로그래머는 구체적 조작기(concrete operational)에 이르렀다고 말 할 수 있습니다. 이 단계에서는 코드이 읽기와 변수들의 값을 추론 할 수 있으나 비교적 짧은 프로그램에서 가능한 상태입니다. 형식적 조작기(Formal operational)에 이른 프로그래머는 설명문으로 문제를 추상화하고 하위 문제를 생성하고 그 하위 문제를 결과로 만들어 내고, 재구성하고 평가하는 것을 반복적으로 수행할 수 있습니다.  반환 지향형 프로그래밍
일반적인 버퍼 오버런 공격에서, 공격자는 간단하게 공격 코드(페이로드)를 스택에 쓰고 반환 주소를 이 새로운 명령어들의 위치로 겹쳐쓴다.[3] 최근들어 운영 체제들은 버퍼 오버플로 버그 익스플로잇과의 전쟁을 통해 데이터가 저장되는 메모리를 실행 불가능하게 마크한다(이 기법은 데이터 실행 방지로 알려져 있다). 데이터 실행 방지가 활성화되면 머신은 사용자가 쓸 수 있는 메모리 영역에 위치한 코드를 실행하지 않는다. 이 방어를 강화하기 위해 하드웨어가 지원하는 데이터 실행 방지도 사용 가능해 졌다. 직교 진폭 변조
제한된 전송 대역 내에서 데이터 전송을 고속으로 하는 데 유리하다. ASK와 PSK를 혼합시킨 변조 방식이며 디지털 신호 처리 및 LSI 기술이 발전하여 실현되었다. 이 방식에서는 데이터의 타이밍을 표시하는 파일럿 신호가 필요하지 않다. 반환 지향형 프로그래밍
많은 기법들이 반환 지향형 프로그래밍에 기반한 공격을 막기 위해 제안되어 왔다.[9] 대부분은 프로그램과 라이브러리 코드의 위치를 랜덤화하는 것에 의존하는 것으로, 공격자가 정확하게 명령어들의 위치를 예상하지 못하게 하는 것이다. 이 기법의 꽤 흔한 구현은 주소 공간 배치 난수화(ASLR)이며, 공유 라이브러리들을 각 프로그램에 서로 다른 메모리 위치에 로드한다. 비록 현대 운영 체제에서 많이 쓰이고 있지만, ASLR은 정보 누수 공격에 취약하며 메모리에서 알려진 라이브러리 함수의 주소를 찾는 다른 접근법들이 존재한다. 만약 공격자가 성공적으로 알려진 명령어들의 위치를 결정할 수 있으면, 다른 모든 것들의 위치는 추론 가능해지고 반환 지향 프로그래밍 공격은 구성될 수 있다. 역정규화
역정규화()는 이전에 정규화된 데이터베이스에서 성능을 개선하기 위해 사용되는 전략이다. 컴퓨팅에서 역정규화는 일부 쓰기 성능의 손실을 감수하고 데이터를 묶거나 데이터의 복제 사본을 추가함으로써 데이터베이스의 읽기 성능을 개선하려고 시도하는 과정이다. 아주 많은 수의 읽기 작업을 처리할 필요가 있는 관계형 데이터베이스 소프트웨어의 성능이나 스케일링에서 고려된다. 역정규화는 비정규화(unnormalized form)와는 구별한다. 데이터베이스/테이블은 이들을 효율적으로 역정규화하기 위해 우선 정규화되어야 한다. 스프링 프레임워크
스프링은 추상화된 트랜잭션 관리를 지원하며 XML 설정파일 등을 이용한 선언적인 방식 및 프로그래밍을 통한 방식을 모두 지원한다. 로지스틱 회귀
로지스틱 회귀의 기본적인 접근은 이미 개발되어 있는 선형 회귀의 방식을 사용하는 것이다. 즉, 독립 변수의 선형 결합과 회귀 계수에 관한 선형 예측 함수에서 비롯되었다. 선형 예측 함수 formula_23는 특정 데이터 항에 대해 아래와 같이 표현된다. 차량기지 알고리즘
역폴란드 표기법의 계산법처럼, 차량기지 알고리즘 또한 스택을 이용한다. formula_1 또는 formula_2 처럼 대부분의 사람들에게 익숙한 중위 표기법을 역폴란드 표기법으로 변환하려면 입력, 출력 및 한개의 연산자 스택이 필요하다.이 간단한 예제로부터 몇가지 규칙을 살펴볼 수 있다.모든 연산자, 괄호 및 숫자는 단 한번만 입력에서 읽고, 최대 한번만 출력 큐에 입력된다. 연산자 및 괄호는 최대 한번만 스택에 푸쉬된 후 팝되므로, 모든 입력 토큰에 대해 최대 몇개의 연산만이 수행된다. 따라서 알고리즘의 실행시간은 입력 길이에 비례하며, 대문자 O 표기법으로는 O("n")이다. 명령형 프로그래밍
1980년대에는 객체지향 프로그래밍이 빠르게 성장하였다. 객체지향 언어들은 명령형의 형태를 띠고 있으나, 객체를 지원하기 위한 특징을 추가하였다. 그 후 20세기의 마지막 20년 동안 상당히 많은 객체지향 언어들이 개발되었다. 스몰토크-80은 앨런 케이가 1969년에 처음 생각했는데, 1980년에 제록스 팔로 알토 연구센터에서 출시되었다. 시뮬라(세계 최초의 객체 지향 프로그래밍 언어로 알려졌다.) 등의 다른 객체지향 언어를 참고하여 비야네 스트롭스트룹이 C를 바탕으로 하여 C++를 설계했다. C++는 1985년 처음 구현되었다. 1980년대 후반과 1990년대에는 래리 월이 1987년 객체지향 언어의 개념을 수용한 탁월한 명령형 언어인 펄(Perl)을 출시하였다. 귀도 반 로섬이 1990년에 파이썬을 출시하였고, 래스무스 러도르프가 1994년에 PHP를 출시하였으며, 역시 1994년 썬마이크로시스템즈에서 자바가 나왔다. 상속 (객체 지향 프로그래밍)
일부 언어에서는 클래스 선언에 특정한 클래스 한정자를 추가함으로써 그 클래스가 상속 불가하다고 선언할 수 있다. 자바의 "final" 키워드 또는 C#의 "sealed" 키워드가 그 예이다. 이러한 한정자들은 클래스 선언에서 "class" 키워드와 클래스 식별자의 선언 전에 추가된다. 봉인(sealed) 클래스는 특히 개발자들이 소스 코드에 권한이 없고 미리 컴파일된 바이너리에만 권한이 있을 때, 재사용이 제한된다.
봉인 클래스에는 서브클래스가 없다. 그래서 클래스 객체의 참조 또는 포인터가 서브클래스의 인스턴스(존재하지 않음)나 수퍼클래스의 인스턴스(참조 타입을 업캐스팅하는 것은 타입 체계에 위반됨)가 아닌 해당 클래스의 인스턴스를 참조하고 있다는 것을 컴파일 타임에 쉽게 추론할 수 있다: 서브 타입 다형성. 실행 전에 참조되는 객체의 정확한 타입을 알 수 있기 때문에, 초기 바인딩(또는 "정적 디스패치")이 후기 바인딩 ("동적 디스패치" 또는 "동적 바인딩") 대신에 사용될 수 있다. 이것은 사용되고 있는 프로그래밍 언어에서 다중 상속이 지원되는지 또는 단일 상속만이 지원되는지에 따라서 한 회 이상의 가상 메소드 테이블 조회를 필요로 한다. 알고리즘 트레이딩
역추세 전략은 단기적 혹은 중기적으로 추세와는 반대로 가격이 움직일 것을 기대하고, 지금까지의 짧은 추세의 방향과는 반대 방향으로 포지션을 구축하는 전략이다. 역추세 전략은 일정 기간동안 주가가 형성한 가격 범위대를 이용해 과열 혹은 침체를 판단한다. 여기서 일정 기간은 대체로 짧은 기간이며 거래 방식은 스캘핑(Scalping)이 대다수를 차지한다. 역추세 전략에서는 캔들에 내포된 저가나 고가를 이용하기도 하고 RSI, Stochastic Oscillator, 이격도, Bollinger Band와 같은 기술적 지표를 이용하기도 한다. 아파치 스쿱
스쿱()은 구조화된 관계형 데이터 베이스와 아파치 하둡간의 대용량 데이터들을 효율적으로 변환하여 주는 명령 줄 인터페이스(Command-Line Interface) 애플리케이션이다. 오라클 또는 MySQL같은 관계형 데이터 베이스에서 하둡 분산 파일 시스템으로 데이터들을 가져와서 그 데이터들을 하둡 맵리듀스로 변환을 하고, 그 변환된 데이터들을 다시 관계형 데이터 베이스로 내보낼 수 있다. 스쿱은 데이터의 가져오기와 내보내기를 맵리듀스를 통해 처리하여 장애 허용 능력뿐만 아니라 병렬 처리가 가능하게 한다. 스쿱은 2012년 3월 최상위 아파치 프로젝트가 되었다. 객체 지향 프로그래밍
상속은 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다. 상속을 받는 새로운 클래스를 부클래스, 파생 클래스, 하위 클래스, 자식 클래스라고 하며 새로운 클래스가 상속하는 기존의 클래스를 기반 클래스, 상위 클래스, 부모 클래스라고 한다. 상속을 통해서 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있고 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다. 변수 영역
"동적 영역 규칙"을 사용하는 언어는 대개 호출 스택에 변수의 바인딩이 포함되어 있다. 변수가 선언될 때 스택의 맨 위에 각 변수가 선언되며, 프로그램의 흐름이 변수 영역을 빠져나갈 때 스택의 맨 위가 팝된다. 호출 스택은 런타임에만 동작하므로, 컴파일 타임에는 동적 영역 규칙을 실행할 수 없다. 회귀 테스트
회귀 테스트는 익스트림 프로그래밍의 중요한 부분이다. 이 방법론에 따르면 디자인 문서는 처음 작성된 후에도 소프트웨어 개발 주기 상의 모든 단계마다 업데이트된다. 그러한 업데이트는 전체 소프트웨어 패키지에 대한 확산적이며 반복적인 자동화 테스트를 통해 이뤄진다. 어드밴스트 포맷
레거시 운영 체제에서 어드밴스트 포맷 드라이브를 사용할 때 하드 디스크 제조업체가 제공하는 소프트웨어를 이용하여 디스크 드라이브를 재배치하는 것이 중요하다. 디스크 재정렬은 파티션 이동으로 인해 파일 시스템 클러스터가 부분적인 물리 디스크 섹터를 가로지르는 클러스터 스트래딩(cluster stradding)이라는 성능 저하 현상을 회피하기 위해 필수적이다. 하드 디스크 파티션을 만들 때 클러스터 대 클러스터 정렬이 결정되기 때문에 디스크 파티션 "이후"에 재정렬 소프트웨어가 사용된다. 이를 통하여 컴퓨팅 생태계가 만들어낸 미정렬 쓰기 수를 줄이는 데 일조할 수 있다. 응용 프로그램들을 어드밴스트 포맷 기술로 전환을 준비시키는 추가적인 활동들이 롱 데이터 섹터 위원회와 하드 디스크 드라이브 제조업체들에 의해 주도되고 있다. 상속 (객체 지향 프로그래밍)
수퍼클래스 메소드가 가상 메소드인 경우, 수퍼클래스의 메소드의 호출은 동적 디스패치된다. 일부 언어(예: C++)에서는 특정 메소드가 가상으로 선언되어야 하고, 기타 언어(예: 자바)에서는 모든 메소드가 가상이어야 한다. 비가상 메소드의 호출은 항상 정적으로 디스패치된다 (즉, 함수 호출의 주소는 컴파일 타임에 결정된다). 정적 디스패치는 동적 디스패치보다 빠르고 인라인 확장과 같은 최적화를 가능하게 한다. 반가상화
반가상화는 오래된 개념을 위한 새로운 용어이다.
IBM의 VM 운영 체제는 1972년 이후로 편리한 기능 등을 제공해 왔다 VM 세계에서, 반가상화는 하드웨어 유지 보수 소프트웨어에 의해서만 흔히 쓰이는 명령어 코드를 사용하기 때문에, 이러한 반가상화를 "진단 코드"로 부른다. IBM의 대화식 모니터 시스템은 진단 코드를 사용함으로써 VM을 호출하여 서비스를 요청하도록 한다. SF Express
과거에는 택배 산업이 단순히 물품을 배달해 주는 노동 집약적 산업이었던 것에 반해, 최근에는 과학 기술의 발전을 통한 4차 산업혁명의 영향으로 물류산업에 큰 변화가 일어나고 있다. 드론을 통한 배송, 빅데이터를 이용한 정보 생산, 물류 자동 분류 시스템, 크라우드, AI, 스마트 포장 등을 통해 인건비를 줄이며 효율적인 서비스 제공이 가능해 졌으며, IT기술을 통한 공급사슬관리 등 고객에게 유용한 부가가치 서비스를 제공하게 되었다. 물류 산업이 노동 집약적 산업에서 자본 집약적, 기술 집약적 산업으로 변화해 가고 있으며 특히, 미국과 중국이 이 산업에서 빠르게 발전하고 있다. 변환행렬
선형 변환은 행렬로 표현할 수있는 유일한 변환은 아니다. n 차원 유클리드 공간 formula_1 에서 비선형인 일부 변환은 n + 1 차원 공간 formula_2 에서 선형 변환으로 나타낼 수 있다. 여기에는 변환과 같은 아핀 변환(affine transformation) 과 사영 변환(projective transformation 또는 Homography) 이 모두 포함된다. 이러한 이유로, 정사각 행렬 변환은 3D 컴퓨터 그래픽 에서 널리 사용된다. 이러한 n + 1 차원 변환 행렬은 아핀 변환 행렬 , 사영 변환 행렬 또는 보다 일반적으로 비선형 변환 행렬 등 그 응용에 따라 다르게 불린다. n 차원 행렬과 관련하여, n + 1 차원 행렬은 첨가 행렬로 설명 될 수 있다. 반환 지향형 프로그래밍
반환 지향형 프로그래밍 공격은 다른 공격들 보다 우위를 갖는다. 잠재적으로 위험한 함수들을 공유 라이브러리에서 제거하는 것을 포함한, 위에서 언급한 익스플로잇 방어 기법 어느 것도 반환 지향형 프로그래밍 공격에 효과적이지 않다. 관점 지향 프로그래밍
모든 AOP 구현체들은 각각의 관심사를 한 자리에 캡슐화하는 횡단 표현식들을 일부 보유하고 있다. 구현체들 간의 차이점은 제공되는 생성자들의 권한, 보안, 사용성에 기인한다. 스마트 안테나
스마트 안테나는 크게 스위치 빔 스마트 안테나와 적응 배열 스마트 안테나로 나뉜다. 스위치 빔 시스템은 몇개의 사용가능한 고정 빔패턴을 가지고 있다. 임의 지점에서 시간 안에 어떤 빔을 사용해 접속할지에 관해서는 시스템 요구사항에 근거해 결정된다. 
적응 배열 안테나는 도착방향 예측 기법의 임의의 방향으로 빔을 향하게 할 수 있도록 한다. 서포트 벡터 머신
서포트 벡터 머신(, SVM기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다.
두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여 새로운 데이터가 어느 카테고리에 속할지 판단하는 비확률적 이진 선형 분류 모델을 만든다.
만들어진 분류 모델은 데이터가 사상된 공간에서 경계로 표현되는데 SVM 알고리즘은 그 중 가장 큰 폭을 가진 경계를 찾는 알고리즘이다.
SVM은 선형 분류와 더불어 비선형 분류에서도 사용될 수 있다. 비선형 분류를 하기 위해서 주어진 데이터를 고차원 특징 공간으로 사상하는 작업이 필요한데, 이를 효율적으로 하기 위해 커널 트릭을 사용하기도 한다. 스킴 (프로그래밍 언어)
스킴 프로그래밍 언어(Scheme) 는 함수형 프로그래밍과 절차적 프로그래밍을 지원하는 다중패러다임 프로그래밍 언어로, 리스프(LISP)의 방언(변종 언어)이다. 1970년대 Guy Lewis Steele Jr. 과 Gerald Jay Sussman 에 의해서 개발되었다. 다른 LISP 방언과 비교할 때 단순함이 특징이다. 전통적인 LISP과 가장 큰 차이점은 동적 영역 규칙 대신 정적 영역 규칙을 사용하고 있다는 것이다. 반복문을 지원하기 않기 때문에 재귀함수를 이용하여 반복 계산을 처리한다. 따라서 대부분의 스킴 구현은 꼬리호출 최적화(tail-call optimization)를 수행한다. 함수 (프로그래밍)
함수의 개념은 컴퓨팅 머신이 이미 존재한 이후 어느 시점에서 발전하였다. 산술 및 조건 점프 명령은 일찍이 계획되었고 상대적으로 조금씩 변화해왔다. 그러나 프로시저 호출을 위한 특별한 명령들은 여러 해에 걸쳐 상당히 변화되고 있다. SSEM과 RCA 1802와 같은 최초의 컴퓨터들과 마이크로프로세서들은 단일 함수 호출 명령어가 없었다. 함수는 구현할 수 있었지만 프로그래머들이 호출 시퀀스(일련의 명령)를 각각의 호출 영역에 사용해야 했다. IBM 1620, 인텔 8088, PIC 마이크로컨트롤러와 같은 일부 매우 초기의 컴퓨터들과 마이크로프로세서들은 전용 하드웨어 스택을 사용하여 반환 주소를 저장하는 단일 명령 함수 호출을 갖고 있었으며, 이러한 하드웨어는 함수를 겨우 몇 번만 겹쳐 사용하는 것만 지원되었지만 반복적인 함수를 지원하였다. 유니박 I, PDP-1, IBM 1130과 같은 1960년대 중순 이전의 머신들은 일반적으로 호출 규약을 사용하여 명령 카운터를 호출된 함수의 최초의 메모리 지점에 저장하였다. 함수를 여러 번 임의로 겹쳐 사용하는 것을 지원하였지만 반복적인 함수를 지원하지는 못했다.
PDP-11(1970년)은 스택 푸시형 함수 호출 명령을 갖춘 최초의 컴퓨터들 가운데 하나이며, 이 기능은 임의로 겹쳐 함수를 사용하는 것과 반복적인 함수를 모두 지원한다. 관점 지향 프로그래밍
컴퓨팅에서 관점 지향 프로그래밍(, AOP)은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다. 코드 그 자체를 수정하지 않는 대신 기존의 코드에 추가 동작(어드바이스)을 추가함으로써 수행하며, "함수의 이름이 'set'으로 시작하면 모든 함수 호출을 기록한다"와 같이 어느 코드가 포인트컷(pointcut) 사양을 통해 수정되는지를 따로 지정한다. 이를 통해 기능의 코드 핵심부를 어수선하게 채우지 않고도 비즈니스 로직에 핵심적이지 않은 동작들을 프로그램에 추가할 수 있게 한다. 관점 지향 프로그래밍은 관점 지향 소프트웨어 개발의 토대를 형성한다. 스칼라 (프로그래밍 언어)
스칼라는 다른 언어로 표현할 수 있는 패턴을 매우 간결하게 표현할 수 있는 범용 프로그래밍 언어이다. 객체 지향 프로그래밍 언어와 함수형 프로그래밍의 요소의 결합과 자바 API의 적용을 통해 프로그래머의 생산성을 높이는데 도움을 준다. 그 예로 같은 기능을 하는 프로그램을 작성했을 때 자바로 작성했을 때에 비해 2-3배의 코드 길이가 줄어든다. 반환 지향형 프로그래밍
그러므로 제어 흐름을 바꾸는 옵코드(주로 반환 명령어인 0xC3)를 찾는 것이 가능하며, 이후 바이너리에서 역으로 선행하는 바이트들(유용할 가능성이 있는 명령어들)을 찾는다. 이러한 명령어들의 집합인 "가젯"은 이후 버퍼 오버런 익스플로잇을 통해 첫 번째 가젯의 명령어의 주소로 반환 주소를 겹쳐씀으로써 묶일 수 있다. 차후 가젯들의 첫 번째 주소는 이후 스택에 성공적으로 써진다. 첫 번째 가젯이 끝날 때 반환 명령어가 실행될 것인데, 이것은 다음 가젯의 주소를 pop하고 그곳으로 점프할 것이다. 이 가젯의 끝날 때 체인은 세번째와 함께 계속된다. 작은 명령어 순서열을 묶음으로써 공격자는 임의적인 프로그램 행동을 이미 존재하는 라이브러리 코드에서 생산할 수 있게 된다. Shacham은 주어진 충분히 큰 양의 코드가 주어진다면(C 표준 라이브러리를 포함해서) 충분한 가젯들이 튜링 완전 기능을 위해 존재하게 될 것이라고 말한다.[7] 버퍼 오버플로 보호
2001년부터 2005년까지, IBM은 "ProPolice"라고 알려진 스택 스매싱 방어를 위한 GCC 패치를 개발하였다. 이것은 스택 프레임에서 버퍼들을 로컬 포인터들과 함수 매개변수들의 뒤에 둠으로써 스택가드의 아이디어를 개선하였다. 이것은 임의적인 메모리 위치로 접근하는 것을 막음으로써 포인터의 오염을 피하게 도와주었다. 스택
이를테면, a부터 b와 c를 순서대로 넣은 다음 자료를 하나씩 꺼내면 c부터 b와 a의 순서로 나오게 된다. S를 스택, x를 데이터 요소(element)라고 하자. 그러면 스택에서는 아래와 같은 중요한 연산이 존재하는 것을 알 수 있다.또한, 스택연산을 목록(list) 연산으로 표현할 수도 있다.컴퓨터에서 포인터라고 하는 자료의 위치 표시자와 넣고 빼는 명령어를 사용해서 스택을 이용한다. 주로 함수를 호출할 때 인수의 전달 등에 이용된다. LIFO의 특징을 이용하여 역폴란드 표기법을 이용한 프로그래밍 언어인 포스(Forth) 등에서도 이용된다. 프로토타입 기반 프로그래밍
프로토타입 기반 프로그래밍은 객체지향 프로그래밍의 한 형태의 갈래로 클래스가 없고, 클래스 기반 언어에서 상속을 사용하는 것과는 다르게, 객체를 원형(프로토타입)으로 하여 복제의 과정을 통하여 객체의 동작 방식을 다시 사용할 수 있다. 프로토타입기반 프로그래밍은 클래스리스("class-less"), 프로토타입 지향(prototype-oriented) 혹은 인스턴스 기반(instance-based) 프로그래밍이라고도 한다. 뱅크 전환
뱅크 전환()은 마이크로프로세서의 주소 공간보다 많은 메모리를 활용하기 위해 개발된 기술이다. 주로 8비트 마이크로프로세서에서 사용되었으며, 거의 대부분의 8비트 마이크로프로세서가 16비트 주소 공간이므로 2 = 65536 매모리 공간을 갖는다. 이것보다 많은 메모리를 확장하려면 뱅크스위칭을 사용한다. 그러나 주소공간 내에서 액세스가 되어야 하므로 동시에 64 kB보다 많은 공간을 식별할 수 없다. 따라서 사용하는 뱅크를 설정하고 해당공간만을 액세스하다가, 뱅크를 바꾸어 다른 공간을 활용한다.  버퍼 오버플로 보호
GNU 컴파일러 모음, LLVM, 마이크로소프트 비주얼 스튜디오 등에는 버퍼 오버플로 보호의 여러 기법들이 존재한다.
스택 버퍼 오버플로는 스택 스매싱으로 알려진 공격의 한 부분으로서 고의적으로 유발될 수 있다. 만약 감염된 프로그램이 특별한 권한으로 실행되거나 신뢰되지 않은 네트워크 호스트로부터 데이터를 받는다면, 이 버그는 공격자가 실행 가능한 코드를 실행 중인 프로그램에 삽입하여 프로세스의 제어를 가질 수 있게 함으로써 잠재적으로 보안 취약점이 될 수 있다. 이것은 공격자가 컴퓨터에 대한 비인가된 접근을 갖게 하는 가장 오래된 방식 중 하나이다. 스택 추적
많은 프로그래밍 언어 (자바와 C#을 포함한)는 시스템 호출을 통해 현재 스택 추적을 검색하는 빌트인된 지원을 갖는다. C++은 이것에 대한 빌트인 지원은 없지만, C++ 사용자들은 stacktrace 라이브러리를 통해 스택 추적을 검색할 수 있다. 자바스크립트에서는 예외 처리는 thrown이 발생한 스택을 포함하는 codice_5 속성을 갖는다. 관점 지향 프로그래밍
관심 지향 프로그래밍은 프로그램 로직을 명확한 부분들(이른바 "관심사")로 나누는 것을 수반한다. 거의 모든 프로그래밍 패러다임들은 관심사들을 별도의 독립적인 엔티티로 그룹화하고 캡슐화하는 것을 어느 정도는 지원하며, 이는 이러한 관심사들을 구현, 추상화, 합성하기 위해 사용할 수 있는 추상화(예: 함수, 프로시저, 모듈, 클래스, 메서드)를 제공함으로써 수행된다. 일부 관심사들은 프로그램 내의 여러 추상적 개념들에 영향을 미치며 이러한 형태의 구현체를 거역한다. 이러한 관심사들을 크러스 커팅 관심사(cross-cutting concerns)라고 부른다. 프로그래밍 심리학
인지주의 심리학이 컴퓨터 프로그래밍에 영향을 준 내용을 중심으로 프로그래밍 학습과 프로그래밍 절차를 연구하는 방법으로 통사적지식, 의미적 지식, 도식적 지식, 전략적 지식으로 나누어서 학습하고 소통하는 방법론이다. 통사적 지식(Syntactic Knowledge)는 INPUT, PRINT, CLS와 같은 명령 개개 요소의 규칙과 관련성에 관한 지식을 말한다. 의미적 지식(Semantic Knowledge)란 스택(stack), 메모리 공간, 프로그램 리스트와 같은 위치(location), 객체(object) 및 메모리에 대해 수행 할 수있는 작업에 대한 지식을 말한다. 도식적 지식(Schematic Knowledge)이란 정렬, 반복및 for 문장과 같은 루틴(routine)의 지식을 말한다. 전략적 지식(Strategic Knowledge)란 사고구술(Thinking Aloud) 기술과 같이 계획(plan)하고 모니터(monitor)하는 기술을 말한다. 메시지 지향 미들웨어
메시지 지향 미들웨어()는 응용 소프트웨어 간의 데이터 통신을 위한 소프트웨어이며, 일반적으로 비동기 메시지 전달에 기초한 것을 가리킨다.
많은 메시지 지향 미들웨어는 메시지 큐 시스템을 기반으로 하지만, 그 밖에도 브로드캐스트 형식 메시지 시스템과 멀티 캐스트 형식의 메시지 시스템적인 내용도 있다. 객체 지향 프로그래밍
객체 지향 언어는 프로그래밍 언어가 많은 지원을 받기 시작하고 발전하기 시작한 1990년 대 초반에 많은 발전이 있었다. 이들은 기본적으로 스몰토크와 에이다의 큰 틀을 따르고 있었지만 그들이 가지고 있었던 문제들을 해결해 나가는 과정으로 발전하였다. C++, 델파이, FoxPro와 같은 프로그램들은 객체 지향 언어의 가장 큰 영향을 미쳤던 GUI의 발전에 따라 점점 향상되었다. 스프링 프레임워크
스프링은 웹 프로그램밍 개발 시 거의 표준적인 방식인 Spring MVC라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다. DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다. 위상 편이 변조
모든 디지털 변조 방식은 디지털 데이터를 표현하기 위해 한정된 수의 구분되는 신호를 사용한다. PSK는 이진 숫자의 고유한 패턴이 할당된 정해진 수의 위상을 사용한다. 일반적으로, 각각의 위상은 동일한 수의 비트를 부호화한다. 각각의 비트 패턴은 특정한 위상으로 표시되는 기호를 형성한다. 변조기에 사용되는 기호 세트를 위해 특별히 고안된 복조기는 수신된 신호의 위상을 알아내고, 다시 그것이 나타내는 기호로 매핑하여 원래의 데이터를 복구한다. 이는 수신기가 수신된 신호의 위상과 기준 신호를 비교할 수 있다는 것을 전제로 한다. 그리고 이러한 시스템을 일관성이라고 한다 (그리고 CPSK라고도 함). 콜 스택
콜 스택(call stack) 이란 컴퓨터 프로그램에서 현재 실행 중인 서브루틴에 관한 정보를 저장하는 스택 자료구조이다. 또한 실행 스택(execution stack), 제어 스택 (control stack), 런 타임 스택 (run-time) 스택 혹은 기계 스택 (machine stack) 이라고도 하며, 그냥 줄여서 스택 (the stack) 이라고도 한다. 소프트웨어 프로그램의 기능 수행에 있어 콜 스택의 관리가 중요함에도 불구하고, 상세한 구현은 고급 프로그래밍 언어에서는 보통 감추어지며 자동화되어 있다. 많은 컴퓨터들이 스택 관리를 위한 특별한 명령어(기계어)를 제공하고 있다. 객체 지향 프로그래밍
동적 바인딩은 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념이다. 동적 바인딩은 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다. 평가 전략 (컴퓨터 프로그래밍)
평가 전략()은 프로그래밍 언어에서 함수 호출의 아규먼트(argument)의 순서를 언제 결정하고 함수에 어떤 종류의 값을 통과시킬지 결정하는 것이다. 람다 대수에서 축소 전략(reduction strategy)과 유사하지만 다르다.
근래의 대부분의 프로그래밍 언어들은 값에 의한 호출(call-by-value)과 참조에 의한 전달(pass-by-reference)가 통합되고 있다. C++와 같은 일부 안전하지 않은 오래된 프로그래밍 언어들은 파라미터 통과의 여러가지 개념을 혼용한다. 역사적으로, 값에 의한 호출과 이름에 의한 호출(call-by-name)은 1950년대 후반에 설계된 Algol 60까지 거슬러 올라간다. Clean이나 하스켈과 같은 순수한 함수 언어(functional language)는 요구에 의한 호출(call-by-need)를 사용한다. 상속 (객체 지향 프로그래밍)
"파생 클래스" 또는 후계자 클래스, 자식 클래스라고도 불리는 서브클래스는 하나 이상의 다른 클래스(수퍼클래스, 기반 클래스, 또는 부모 클래스)로부터 하나 이상의 언어 엔티티를 상속하는 모듈러, 파생 클래스이다. 클래스 상속의 의미는 언어에 따라 달라지지만, 일반적으로 서브클래스는 수퍼클래스의 인스턴스 변수들과 멤버 함수들을 자동적으로 상속한다. 어떤 언어들은 다른 구조의 상속을 지원하기도 한다. 예를 들어, 에펠에서 클래스의 사양을 정의하는 계약도 후계자가 상속받는다. 수퍼클래스는 특정한 서브클래스가 상속하고 수정, 보완할 수 있는 공통 인터페이스와 기본적인 기능을 수립한다. 서브클래스에 의해 상속된 소프트웨어는 서브클래스에서 재사용된다. 클래스의 인스턴스에 대한 참조는 사실 그것의 서브클래스 중 하나를 참조하는 것이다. 참조되는 객체의 실제 클래스를 컴파일 타임에 예측하는 것은 불가능하다. 수많은 다른 클래스의 객체 멤버 함수를 호출하는데에는 똑같은 인터페이스가 사용된다. 서브클래스는 수퍼클래스의 함수를 같은 메소드 시그니처를 공유해야 하는 완전히 새로운 함수로 대체할 수도 있다. GPGPU
변환 연산은 주어진 함수 (커널)을 스트림의 모든 요소에 적용한다. 간단한 예로 스트림의 모든 값에 어떤 상수를 곱하는 것이다. (밝기 조절) 변환 연산은 GPU상에서 간단히 구현된다. 프로그래머는 화면의 각 픽셀의 프래그먼트를 생성하고 각각에 프래그먼트 프로그램을 적용한다. 결과로 얻어지는 같은 크기의 스트림이 출력 버퍼에 저장된다.
어떤 계산은 큰 흐름으로부터 작은 흐름(단 한개의 요소만 남을 수도 있다)을 계산해야 한다. 이를 흐름의 감축이라 부른다. 일반적으로 감축은 여러 단계로 이루어질 수 있다. 이전 단계의 결과가 이번 단계의 입력으로 사용되고, 연산이 적용되는 범위가 흐름 요소 하나만 남을 때 까지 반복된다.
흐름 필터링은 본질적으로 불균일 감축이다. 필터링은 어떤 기준에 따라 흐름에서 일부 요소를 제거하는 것이다.
흩뿌리기 연산은 꼭짓점 처리에서 가장 자연스럽게 정의된다. 꼭짓점 처리는 꼭짓점의 위치를 조정할 수 있어서 프로그래머가 정보를 격자의 어디에 예치하는지 제어할 수 있게 해 준다. 다른 확장도 가능한데, 예를 들어 꼭짓점이 영향을 미치는 영역의 크기를 제어하는 것이다.
프래그먼트 처리기는 직접 뿌리기 연산을 수행할 수 없는데, 그 까닭은 격자상에서 각 프래그먼트의 위치는 프래그먼트가 생성될 때 고정되어 프로그래머가 변경할 수 없기 때문이다. 그러나 논리적 흩뿌리기 연산은 추가적인 수집 단계로 때때로 재투사 또는 구현될 수 있다. 흩뿌리기를 구현하려면 먼저 출력값과 출력 주소 모두를 송출해야 한다. 그 직후의 수집 연산은 주소 비교를 통해 출력 값이 현재의 출력칸에 맞아떨어지는지 확인한다.
프래그먼트 처리기는 텍스처를 임의 방식으로 읽을 수도 있어서 단수/복수의 어떤 격자 칸으로부터도 원하는 대로 정보를 모을 수 있다.
정렬 연산은 순서 없이 뒤섞인 요소 집합을 순서에 따라 정렬된 요소의 집합으로 변환한다. 가장 일반적인 GPU 구현은 정렬망을 이용하는 것이다.
탐색 연산으로 프로그래머는 흐름 안의 특정 요소 또는 특정 요소의 이웃 요소를 찾을 수 있다. GPU는 한 요소를 찾는 속도를 올리기 위해 사용되지는 않지만 대신 여러 탐색을 병렬로 실행하는 데 사용된다.
다양한 자료 구조가 GPU상에서 표현될 수 있다:
GPGPU로 CPU 한 개에 비해 100배~250배의 속도 향상을 이룰 수 있지만, 병렬도가 지극히 높은 응용 프로그램에서만 이 정도의 혜택을 볼 수 있을 것이다. 한 개의 GPU 처리 코어는 데스크톱 CPU의 코어 한 개와 대등하지 않다. 마샬링 (컴퓨터 과학)
오브젝트를 "직렬화한다"는 것은 오브젝트의 상태를 오브젝트의 사본으로 다시 변환할 수 있는 바이트 스트림으로 변환하는 것을 의미한다. 이식 (컴퓨팅)
플레이 스테이션 등 세대에서 하드웨어의 성능 향상에 따라 제조 업체는 다른 기종에서 완전 이식을 목표로하고 있지만, 제조 업체 이식 정도는 제각각이며, 일부는 치명적인 버그를 포함한 이식 프로그램이나 혹은 진짜 리메이크있는 것도 존재한다.또한 카세트 테이프 또는 CD-ROM 등 기록 매체의 정보량 증가에 따라 주가되는 소프트웨어는 리메이크 그들이지만, 오리지널 모드라고하여 원작의 충실한 이식 판을 포함하는 소프트웨어를 그대로 나타내주는 'Space'와 '팩맨 '등 한때 유명한 게임은 여러 모드를 가지고 있는 프로그램도있다.