'뻘소리'에 해당되는 글 35건

  1. 2016.10.17 네비메시에 관해서....
  2. 2016.10.15 휴리스틱함수
  3. 2016.10.13 Coupling에 관해서..
  4. 2016.10.04 백오리피스
  5. 2016.10.04 Swift
  6. 2016.10.04 Django(Python)
  7. 2016.10.04 게임프로그래밍을 할 때 필요한 것들....
  8. 2016.10.04 향상된 디버깅 옵션
  9. 2016.10.04 컨텍스트 스위칭(Context Switching)
  10. 2016.08.21 람다 대수
뻘소리2016. 10. 17. 00:47

네비메시는 AI에서도 상당히 밀접한 관계가 있다.

X지점에 있는 객체를 Y지점으로 옮긴다. 그런데 그냥 이동하는 것이 아니라 장애물이나 방해되는 요소를 제외하여 알아서 움직이거나 최소의 비용으로 최단거리를 움직인다고 하면 쉽지 않다. 그렇다고 모든 이동 요소들을 검사해서 가기에도 퍼포먼스가 너무 떨어진다. 그래서 내가 원하는 구간 또는 영역을 한정시켜 최소한의 작업으로 지능적으로 이동할 수 있는 방법이 필요하다. 근데 이거 보통 실시간 3D 게임에서도 잘 적용안되는데 주로 쓴다해도 마을 정도이다. 어차피 내가 이동 할 건 내가 선정하고 내 판단으로 움직여서 사냥할 때나 그럴땐 잘 안쓰지.. 주로 마을에서 퀘스트를 받고 똥개훈련 받는다치면 맵 켜서 NPC클릭 하면 자동으로 그 앞까지 가게 하는 정도? 아무튼 마을이라는 한정적인 구간에서는 그나마 쓰기가 낫다. 실시간 게임에서 주변 타일이나 환경과 상호작용은 잘 없기 때문에 사용은 드물다고 본다. 


마을에서 장애물이나 벽, 건물등이 있다고 하면 내가 갈 수 있는 길에만 바닥에 삼각형으로 이루어진 메시를 만들어 굳이 오브젝트에 충돌검사 여부를 주지 않고 삼각형 메시 안에서만 이루게하면 된다. 네비게이션 메시가 이 같은 개념이라고 봐도 된다. 물론 이 바닥을 깔게 되면 2D에서 길찾기 알고리즘을 썼던것들을 응용해서 3D에서도 사용할 수 있다. 에이스타나 다익스트라나 점점 서치나.. 


만약 객체가 벽에 충돌했는지를 감지할 때 실제 해당하는 기하 구조와의 충돌을 검사할 필요가 없다. 그냥 네비게이션 메시의 외곽선에 도달했는지만 검사하면 된다. 


네비게이션 메시가 제대로 작동하려면 몇 가지 조건들을 만족해야 한다. 

1. 네비게이션 메시는 무조건 삼각형들로만 구성되어야한다.

2. 전체 메시는 반드시 연속적이어야한다. 그러려면 모든 인접한 삼각형들은 두 개의 정점들과 하나의 변을 공유해야한다.

3. 서로 다른 두 삼각형이 동일한 평면에 겹쳐져서는 안된다. 다시 말하면, 어떤 삼각형 안의 한 점은 오직 그 삼각형에만 속해야 한다. 이렇게 하지 않으면 검색 알고리즘이 매우 복잡해진다.


객체의 이동 과정.

1. 객체의 이동 벡터를 현재 칸의 평면에 대해 투영한다. 3D 이동 벡터를 현재 칸의 평면 상의 2D 선분으로 표현하기로 한다. 이 선분은 제어점의 시작과 목표를 양 끝점으로 한다.


2. 이동 경로가 메시 칸의 2D 삼각형 변들과 교차하는지 점검한다. 이 결과에 따라 다음 세 가지 경우들 중 하나를 수행한다.


1) 이동 경로가 공유되지 않은 변(즉 인접한 삼각형과 연결되지 않은 변)에 교차한다면, 벽이나 어떤 장애물에 부딪혔다는 뜻이다. 그러면 이동 경로의 선분을 제한하거나 객체의 방향을 조정하는 등의 작업을 수행하고 다시 2D 삼각형 변들과 교차하는지 검사한다.


2) 이동 경로가 공유된 변과 교차한다면 인접한 칸으로 이동한 후 1단계로 돌아가서 세 칸의 평면에 대해 다시 벡터를 투영하고 교차를 점검하면 된다.


3) 나머지 경우는 이동이 현재 삼각형을  벗어나지 않는 것이다. 이 경우라면 선분의 끝(목표)에 해당하는 점을 다시 3D 좌표로 변환하고 그것을 이용해서 실 객체를 이동시키면 된다.


이렇게 3D좌표와 2D좌표를 오락가락하면서 변환하면 생각보다 복잡하고 실시간으로 하기엔 쉽지 않은 연산일거다. 그래서 y축을 버린다. y축은 투영이 매우 쉽다. 모든 칸의 법선들은 바닥과 어차피 수직이기 때문에 버린다. 굳이 평평하지 않아도 되고 그냥 각 칸의 법선이 주어진 축과 동일한 방향이 되는것만 정하는것 뿐이다.


y축을 버린 후 객체 이동 과정.

1. 제어점으로부터 목표 위치로 가는 이동 경로를 만들고, 주어진 공통 축 값(y)을 제거해서 2D 이동 벡터를 얻는다.

2. 아까와 동일한 방법으로 2D 이동 벡터와 삼각형 변들의 교차 여부를 판단하는 과정을 반복해서 제어점이 목표 위치까지 도달하도록( 또는 벽에서 멈추도록) 한다.

3. 새(x,,z) 제어점이 놓여진 칸의 평면 방정식을 이용해서(x,z)로부터 y 값을 구하고, 그것을 이용해서 실제 3D 좌표를 얻은 후 객체를 실제로 이동한다.



'뻘소리' 카테고리의 다른 글

SIMD  (0) 2017.11.02
처음으로 초대장 배포해보네요..(마감)...  (36) 2017.06.07
휴리스틱함수  (0) 2016.10.15
Coupling에 관해서..  (0) 2016.10.13
백오리피스  (0) 2016.10.04
Posted by 멜데스
뻘소리2016. 10. 15. 00:01

최단 경로[편집]

예를 들어, 최단 경로 문제에서 휴리스틱 함수 은 한 노드에서 목표 노드까지의 최소 비용 경로를 추정하는 탐색 트리의 노드들로 정의할 수 있다. 탐욕적 최우선 탐색과 A* 탐색과 같은 세련된 탐색 알고리즘에서 최선의 노드를 찾아내기 위해 휴리스틱 기법이 사용된다. 탐욕적 최우선 탐색은 휴리스틱 함수에서 최솟값을 가지는 노드를 선택할 것이다.

A* 탐색은 가 최솟값을 가지는 노드들을 확장할 것이다. (는 초기 상태에서 현재 노드까지의 정확한 경로 비용이며, 는 목표 도달 비용을 절대 넘지 않는 용인된 함수이다.) 그러면 A*은 항상 최적의 해를 찾을 것이다.

휴리스틱과 관련된 고전적인 문제로 N 퍼즐이 있다. 이 문제에서 사용되는 휴리스틱 기법은 잘못 배치된 타일의 수를 세는 것과, 각 블록의 현재 위치와 목표 위치 사이의 맨하탄 거리(Manhattan distance)의 합을 구하는 것이 있다. 두 가지 모두 용인되는 방법이다.

계산 성능 측면에서 휴리스틱 함수의 효과[편집]

각 노드에서 선택들 , 목표 노드에서 깊이 가 있는 어떤 탐색 문제에서, 원시적인 탐색 알고리즘은 해를 찾기 전에 노드들 를 잠재적으로 탐색한다. 휴리스틱은 분기 기작을 이용하여 에서 더 낮은 상수 로의 분기 요소를 감소시킴으로써 탐색 알고리즘의 효과를 향상시킨다.

분기요소는 휴리스틱 기법에서 부분 순서를 정기하는 데에 사용할 수 있다. 즉 탐색 트리의 노드 이 주어질 때, 이 보다 낮은 분기요소를 가지면, 로 표현할 수 있다.

탐색 트리에서 각 노드에 낮은 분기 요소를 주는 휴리스틱 방법은 좀 더 효과적으로 계산할 수 있기 때문에 특정 문제의 해상도를 위해 사용된다.

휴리스틱 탐색[편집]

공통 탐색 작업에 있어서, 낮은 분기 요소를 가진, 용인되는 휴리스틱을 찾는 문제는 인공지능 분야에서 광범위하게 조사되고 있다. 다음과 같은 몇몇 공통적인 기술들이 사용된다.

  • 부프로그램의 해결비용은 전체 해결비용을 유용하게 예측하는 값으로 자주 사용되며, 이들은 항상 용인된다. 예를 들어, 10-퍼즐에 대한 휴리스틱은 1번~5번 타일들을 제자리로 옮기는 비용이 될 수 있다. 공통된 아이디어는 모든 부프로그램들의 경우에서 정확한 해결비용을 저장하는 패턴 데이터베이스를 사용하는 것이다.
  • 느슨한 문제의 해는 본래 문제에서 유용한 용인된 예측을 제공하기도 한다. 예를 들어, 맨하탄 거리는 N-퍼즐의 느슨한 버전이다. 왜냐하면 각 타일을 다른 타일들과 독립적으로 움직일 수 있다고 가정하기 때문이다.
  • 용인된 휴리스틱 함수들 의 집합이 주어졌을 때, 함수 는 그들 모두를 지배하는 용인된 휴리스틱 함수이다.

1993년 A.E.프리에디티스(A.E.Prieditis)는 이런 기법들을 활용하여, 주어진 문제에 대한 휴리스틱 해법을 자동으로 생성시키는 ABOLVER라는 프로그램을 만들었다.

ABSOLVER는 8-퍼즐을 대해, 기존의 다른 휴리스틱 해법보다 우수한 새로운 해법을 만들어냈으며, 루빅스 큐브에 대한 유용한 휴리스틱 해법을 최초로 발견하였다..


-위키-

'뻘소리' 카테고리의 다른 글

처음으로 초대장 배포해보네요..(마감)...  (36) 2017.06.07
네비메시에 관해서....  (0) 2016.10.17
Coupling에 관해서..  (0) 2016.10.13
백오리피스  (0) 2016.10.04
Swift  (0) 2016.10.04
Posted by 멜데스
뻘소리2016. 10. 13. 01:59

Class - Class Coupling


1. Nil coupling : 결합도가 전혀 없는, 커플링이 안되어있는 상태. 그냥 참조도 뭣도 안하는 외딴섬 같은 클래스가 있단거.


2. Overt Coupling : friend로 연결된 커플링.

클래스간 friend 커플링일 경우 복잡도 증가를 줄여준다. 

상태패턴 경우(State Pattern), 상태 클래스를 프렌드로 엮어두면 장점이 많음.

메멘토 패턴도 마찬가지.


3. Covert Coupling : A클래스가 B클래스의 멤버변수를 public을 통해 직접 접근....


4. Export Coupling : 가장 전형적인 OOP 커플링. 흔히 Get, Set함수 , 메시지 등을 통해 접근 요청 처리 할때 발생.


5. Surreptitious coupling : 엑세스 지정자 개 무시하고 그냥 클래스 멤버변수 접근가능..


프렌드가 꼭 나쁜건 아니라고 생각되서 끄적여봄.

'뻘소리' 카테고리의 다른 글

네비메시에 관해서....  (0) 2016.10.17
휴리스틱함수  (0) 2016.10.15
백오리피스  (0) 2016.10.04
Swift  (0) 2016.10.04
Django(Python)  (0) 2016.10.04
Posted by 멜데스
뻘소리2016. 10. 4. 07:21

백 오리피스

위키백과, 우리 모두의 백과사전.
백 오리피스
Back Orifice
개발자Sir Dystic (cDc)
최근 버전1.20 / 1998-08-03
운영 체제마이크로소프트 윈도,
유닉스 시스템 (클라이언트 전용)=
종류원격 관리
라이선스프리웨어,
(소스 배포, 유닉스 클라이언트)
웹사이트백 오리피스 홈페이지

백 오리피스 (Back Orifice, 종종 BO로 축약됨)는 원격 관리를 위하여 고안된 논의의 여지가 있는 컴퓨터 프로그램이다. 프로그램은 사용자가 원격지로부터 실행중인 마이크로소프트 윈도 운영 체제를 조절 가능하게 한다.[1] 그 이름은 마이크로소프트 백오피스 서버 소프트웨어의 말장난이다.

백 오리피스는 클라이언트 서버 시스템 구조와 더불어 설계되었다. 작고 조심성있는 서버 프로그램이 어떤 장치에 설치되면, 그것은 또다른 컴퓨터 시스템 상에 그래픽 사용자 인터페이스를 갖춘 클라이언트 프로그램으로 복제가 된다. 그 두 구성요소는 전송 제어 프로토콜과/혹은 사용자 데이터그램 프로토콜 전송계층를 사용하는 어떤 또다른 장치와 함께 통신한다. 리트 현상을 참고하면, 이 프로그램은 일반적으로 포트번호31337상에서 실행된다.

프로그램은 1998년 8월 1일에 데프 콘 6 에서 초연했다. 그것은 미국의 해커 단체 CDC의 구성원인 서 디스틱의 두뇌의 산물이었다. 그 단체에 따르면, 그것의 목적은 마이크로소프트의 운영 체제 윈도 98에 있는 보안의 결핍을 시연하는 것이었다.

비록 백 오리피스가 원격 관리 같은 합법적인 목적을 가졌을지라도, 그것을 덜 상냥한 기업이 소송하게 만드는 다른 요소들이 있다. 그 서버 프로그램은 시스템의 사용자에 의한 피상적인 지켜봄으로부터 스스로를 숨길 수 있다. 사용자 상호작용없이 설치될 수 있음에 따라, 트로이 목마의 폭발력으로 분배될 수 있다.

이것과 다른 이유들로, 바이러스 검사 소프트웨어 산업은 즉시 악성코드로서 그 도구를 분류했으며 백 오리피스를 그들의 검역 목록에 덧붙였다. 이 사실에도 불구하고, 단순한 GUI와 쉬운 설치 때문에 스크립트 키드에 의해 널리 사용되었다.

1999년에 발표한 백 오리피스 2000와 프랑스계 캐나다인 해킹 그룹 QHA가 발표한 딥 백 오리피스가 백 오리피스를 뒤따랐다.

참고[편집]

  1. 이동 Richtel, Matt. "Hacker Group Says Program Can Exploit Microsoft Security Hole," 뉴욕 타임즈 1998년 8월 4일에 작성됨. 2007년 4월 24일에 확인함.

외부 고리[편집]

출처 - 위키

추억의 단어...

'뻘소리' 카테고리의 다른 글

휴리스틱함수  (0) 2016.10.15
Coupling에 관해서..  (0) 2016.10.13
Swift  (0) 2016.10.04
Django(Python)  (0) 2016.10.04
게임프로그래밍을 할 때 필요한 것들....  (0) 2016.10.04
Posted by 멜데스
뻘소리2016. 10. 4. 07:19

스위프트 (프로그래밍 언어)

위키백과, 우리 모두의 백과사전.
Swift
발표년도2014년
개발자애플
최근 버전3.0 정식
최근 버전 출시일2016년 9월 13일, 21일 경과
미리보기 버전3.0 GM
미리보기 버전 출시일2016년 9월 7일, 27일 경과
영향을 받은 언어오브젝티브-C 및 D 언어[1]
사용 중인 파일 확장자.swift
웹사이트https://developer.apple.com/swift/

스위프트(Swift)는 애플의 iOS와 OS X를 위한 프로그래밍 언어로 2014년 6월 2일 애플 세계 개발자 회의(WWDC)에서 처음 소개되었다.[2]. 기존의 애플 운영체제용 언어인 오브젝티브-C와 함께 공존할 목적으로 만들어졌다. 오브젝티브-C와 마찬가지로 LLVM으로 빌드되고 같은 런타임을 공유한다. 클로저다중 리턴 타입네임스페이스제네릭스타입 유추 등 오브젝티브-C에는 없었던 현대 프로그래밍 언어가 갖고 있는 기능을 많이 포함시켰으며 코드 내부에서 C나 오브젝티브-C 코드를 섞어서 프로그래밍하거나 스크립트 언어처럼 실시간으로 상호작용하며 프로그래밍 할 수도 있다.[3] 언어 설명서도 함께 배포되었다. 애플에서는 iBooks에서 Swift에 관한 책을 배포하고 있다. [4]

Xcode에서 사용 가능하다.

헬로 월드 프로그램[편집]

//Swift 2.0 이전
println("Hello, World!")
//Swift 2.0
print("Hello, World!")

함께 보기[편집]

참고문헌[편집]

  1. ↑ 이동:  “Building assert() in Swift, Part 2: __FILE__ and __LINE__ - Swift Blog -”. Apple Developer. 2014년 9월 26일에 확인함Swift borrows a clever feature from the D language: these identifiers expand to the location of the caller when evaluated in a default argument list.
  2. 이동 “Apple announces Swift, a new programming language for iOS”.
  3. 이동 “Apple announces new Xcode, ‘Swift’ programming language”.
  4. 이동 The Swift Programming Language.

외부 링크[편집]


'뻘소리' 카테고리의 다른 글

Coupling에 관해서..  (0) 2016.10.13
백오리피스  (0) 2016.10.04
Django(Python)  (0) 2016.10.04
게임프로그래밍을 할 때 필요한 것들....  (0) 2016.10.04
향상된 디버깅 옵션  (0) 2016.10.04
Posted by 멜데스
뻘소리2016. 10. 4. 07:18

장고 (웹 프레임워크)

위키백과, 우리 모두의 백과사전.
장고
Django logo.svg
Django admin.png
최근 버전1.8.4 / 2015년 8월 18일, 413일 경과[1]
종류웹 애플리케이션 프레임워크
라이선스BSD 사용 허가서
웹사이트http://www.djangoproject.com

장고(Django, FAQ 발음으로는 "쟁고"(IPA[ˈdʒæŋgoː])[2])는 파이썬으로 작성된 오픈 소스 웹 애플리케이션 프레임워크로, 모델-뷰-컨트롤러 패턴을 느슨하게 적용한다. 2005년 7월에 BSD 사용 허가서로 공개되었다.

이 웹 애플리케이션 프레임워크는 집시 재즈 기타리스트인 장고 라인하르트의 이름을 따 명명되었다. [3]

고도의 데이터베이스 기반 웹사이트를 작성하는 데 있어서 수고를 더는 것이 장고의 주된 목표이다. 장고는 콤포넌트의 재사용성(reusability)과 플러그인화 가능성(pluggability), 빠른 개발 등을 강조하고 있다. 또한, "DRY(Don't repeat yourself: 중복배제)" 원리를 따랐다. 설정 파일 일서부터 데이터 모델에까지 파이썬 언어가 구석구석에 쓰였다.

서비스 배포[편집]

장고는 아파치 웹 서버에 mod_wsgi 또는 mod_python 모듈을 설치하여 서비스할 수 있다. 또한 장고는 FastCGI 모드로 구동할 수 있기 때문에 FastCGI를 지원하는 서버와 연동하여 서비스할 수 있다.[4]

장고는 공식적으로 아래의 데이터베이스를 지원한다.

마이크로소프트 SQL 서버는 django-mssql를 설치하여 사용할 수 있으나 마이크로소프트 운영 체제 내에서만 작동한다.

각주[편집]

바깥 고리[편집]

출처 -위키

'뻘소리' 카테고리의 다른 글

백오리피스  (0) 2016.10.04
Swift  (0) 2016.10.04
게임프로그래밍을 할 때 필요한 것들....  (0) 2016.10.04
향상된 디버깅 옵션  (0) 2016.10.04
컨텍스트 스위칭(Context Switching)  (0) 2016.10.04
Posted by 멜데스
뻘소리2016. 10. 4. 07:15

사실 안 필요한건 없다.. 다다익선이라고.. 뭐든.. 알면.. 좋다..


그래도 정말 핵심적이고 필요한 부분을 끄집어 본다면 음..


<공통>

OS(운영체제, 시스템프로그래밍도 포함하자)

물론 클라도 마찬가지만 특히 서버는 쓰레드, 동기화기법, 프로세스 지식을 많이많이...

+자료구조

+알고리즘

<클라이언트>

1. C

2. C++

3. C#

4. API

5. DirectX

6. 그밖의 상용엔진(Unity, Unreal, Cocos 등)

혹여나 IOS계열 모바일런칭을 한다.

+ Objective C(아직까진 건재..)

+ swift(신흥강자...)

<서버>

1. 네트워크 프로그래밍 

2. DB (SQL은 대세론을 따라 공부하는게 몸도 마음도 편하....)

'뻘소리' 카테고리의 다른 글

Swift  (0) 2016.10.04
Django(Python)  (0) 2016.10.04
향상된 디버깅 옵션  (0) 2016.10.04
컨텍스트 스위칭(Context Switching)  (0) 2016.10.04
람다 대수  (0) 2016.08.21
Posted by 멜데스
뻘소리2016. 10. 4. 06:42

/Zo(최적화된 디버깅 향상)

Visual Studio 2015
 

게시: 2016년 4월

디버그되지 않은 빌드에서 최적화된 코드에 대해 향상된 디버깅 정보를 생성합니다.

/Zo[-]

/Zo 컴파일러 스위치는 최적화된 코드에 대한 향상된 디버깅 정보를 생성합니다. 최적화는 지역 변수에 레지스터를 사용하고 코드를 다시 정렬하며 루프를 벡터화하고 인라인 함수 호출을 수행할 수 있습니다. 이와 같이 최적화를 수행하면 소스 코드와 컴파일된 개체 코드 간 관계가 명확하지 않을 수 있습니다. /Zo 스위치는 지역 변수 및 인라인된 함수에 대해 추가적인 디버깅 정보를 생성하도록 컴파일러에 지시합니다. 이 경우 Visual Studio 디버거에서 최적화된 코드를 단계별로 실행할 때 자동지역 및 조사식 창에서 변수를 확인할 수 있습니다. 또한 스택 추적을 설정하여 WinDBG 디버거에 인라인된 함수를 표시할 수도 있습니다. 최적화를 사용하지 않도록 설정한(/Od) 디버그 빌드의 경우 /Zo를 지정할 때 생성된 추가 디버깅 정보가 필요하지 않습니다. 릴리스 구성을 디버그하려면 최적화가 설정된 상태에서 /Zo 스위치를 사용합니다. 최적화 스위치에 대한 자세한 내용은 /O 옵션(코드 최적화)을 참조하세요. /Zi 또는 /Z7을 사용하여 디버깅 정보를 지정하는 경우 /Zo 옵션은 Visual Studio 2015에서 기본적으로 사용됩니다. /Zo-를 지정하여 이 컴파일러 옵션을 명시적으로 사용하지 않도록 설정합니다.

/Zo 스위치는 Visual Studio 2013 업데이트 3에서 사용할 수 있으며 이전에 문서화되지 않은 /d2Zi+ 스위치를 대신합니다.

Visual Studio에서 /Zo 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하세요.

  2. 구성 속성C/C++ 폴더를 선택합니다.

  3. 명령줄 속성 페이지를 선택합니다.

  4. /Zo를 포함하도록 추가 옵션 속성을 수정한 후 확인을 선택합니다.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

- 참고 : 2015버전은 디폴트로 깔려있으니 해당사항 없음.
- 위 설명대로 2013업데이트 3이상에서 사용가능하며, 그 이전 버전은 /d2Zi+를 사용.
- 그 이전 버전이라고 해봤자 2012버전 이상 지원가능하며 비스타 이상임...


'뻘소리' 카테고리의 다른 글

Django(Python)  (0) 2016.10.04
게임프로그래밍을 할 때 필요한 것들....  (0) 2016.10.04
컨텍스트 스위칭(Context Switching)  (0) 2016.10.04
람다 대수  (0) 2016.08.21
부스트 코루틴  (0) 2016.08.18
Posted by 멜데스
뻘소리2016. 10. 4. 06:28

문맥 교환

위키백과, 우리 모두의 백과사전.

문맥 교환(Context Switch)이란 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다. 한 프로세스의 문맥은 그 프로세스의 프로세스 제어 블록에 기록되어 있다.

오버헤드와 처리기 구조[편집]

문맥을 교환하는 동안에는 유용한 작업을 수행할 수 없기 때문에, 문맥 교환 시간은 일종의 오버헤드라고 할 수 있다. CISC와 RISC는 각각 장단점이 있는데, 문맥교환 측면에 보면 RISC의 경우 레지스터의 용량이 CISC보다 상대적으로 크기 때문에 좀 더 큰 오버헤드가 발생한다.

바깥 고리[편집]

출처 - 위키

'뻘소리' 카테고리의 다른 글

게임프로그래밍을 할 때 필요한 것들....  (0) 2016.10.04
향상된 디버깅 옵션  (0) 2016.10.04
람다 대수  (0) 2016.08.21
부스트 코루틴  (0) 2016.08.18
비구조적 프로그래밍  (0) 2016.08.18
Posted by 멜데스
뻘소리2016. 8. 21. 05:41

람다 대수

위키백과, 우리 모두의 백과사전.

람다 대수(λ -, lambda -)는 이론 컴퓨터과학 및 수리논리학에서 함수 정의, 함수 적용, 귀납적 함수를 추상화한 형식 체계이다. 1930년대 알론조 처치가 수학기초론을 연구하는 과정에서 람다 대수의 형식을 제안하였다. 최초의 람다 대수 체계는 논리적인 오류가 있음이 증명되었으나, 처치가 1936년에 그 속에서 계산과 관련된 부분만 따로 빼내어 후에 타입 없는 람다 대수 (untyped lambda calculus)라고 불리게 된 체계를 발표하였다. 또한 1940년에는 더 약한 형태이지만 논리적 모순이 없는 단순 타입 람다 대수 (simply typed lambda calculus)를 도입하였다.

람다 대수는 계산 이론언어학 등에 중요한 역할을 하며, 특히 프로그래밍 언어 이론의 발전에 크게 기여했다. 리스프와 같은 함수형 프로그래밍 언어는 람다 대수로부터 직접적인 영향을 받아 탄생했으며, 단순 타입 람다 대수는 현대 프로그래밍 언어의 타입 이론의 기초가 되었다.

수학사에서 람다 대수[편집]

람다 대수는 알론조 처치에 의해 1930년대 소개됐다. 최초의 시스템은 스테펜 클리네와 존 버클리 로서가 클리네-로저 역설을 제창하면서 1935년 논리적 결점을 보이기 위해 도입됐다. 그 후인 1936년 처치는 독립적으로 현재에는 타입 없는 람다 대수라고 불리는 계산에 관련한 부분을 출판했다. 1940년, 그는 또한 계산적으로는 떨어지지만 논리적으로 무결한 시스템을 공개했다. 이것이 단순 타입 람다 대수이다.

함수의 표현[편집]

함수는 컴퓨터 과학과 수학의 기초를 이루는 개념이다. 람다 대수는 함수를 단순하게 표현할 수 있도록 하여 '함수의 계산'이라는 개념을 더 깊이 이해할 수 있게 돕는다.

예를 들어 항등 함수  는 하나의 입력 를 받아 다시 를 결과로 내놓는다고 하자. 한편 함수  는 입력 와 를 받아 두 수의 제곱의 합을 내놓는다고 하자. 이 두 예제로부터 세 가지 유용한 사실을 알 수 있다.

  1. 함수가 반드시 이름을 가질 필요는 없다. 함수 는 이름을 제거하고  와 같은 형태로 쓸 수 있다. 또한 항등 함수 는  의 형태로 쓸 수 있다.
  2. 함수의 입력 변수의 이름 또한 필요 없다.  와  는 변수의 이름은 다르지만 같은 항등 함수를 의미한다. 또한  와  는 같은 함수를 나타낸다.
  3. 두 개 이상의 입력을 받는 함수는 하나의 입력을 받아 또다른 함수를 출력하는 함수로 다시 쓸 수 있다. 예를 들어,  는  와 같은 형태로 다시 쓸 수 있다. 함수를 이와 같이 변환하는 것을 커링 (currying)이라고 한다. 위의 함수 는 다음과 같이 단일 입력 함수를 두 번 적용하는 것으로 이해할 수 있다.


핵심 개념[편집]

추상화

는 단일 입력 를 받아 의 표현으로 치환하는 익명의 함수를 지칭한다. 예를 들어 는 함수 의 람다 추상화이다. 람다 추상화를 통해 함수를 정의한다는 것은 함수를 정의하기만 하고 함수를 수행(호출)하지는 않는다. 람다 추상화를 통해 변수 는 표현 에 속박된다.

자유 변수

자유 변수(free variable)는 람다 추상화를 통해 표현에 묶이지 않은 변수를 말한다. 자유 변수의 집합은 귀납적으로 정의된다.

  • 의 자유 변수는 뿐이다.
  • 의 자유변수는 를 제외하고 에 등장하는 변수들이다.
  • 두 표현 와 의 결합 의 자유변수의 집합은 의 자유변수의 집합과 의 자유변수의 집합의 합집합이다.

예를 들어, 에는 자유 변수가 없지만, 에는 자유변수가  하나이다.

축약[편집]

람다 대수식의 의미는 식이 어떻게 축약될 수 있는지에 따라 정의된다. 람다 대수식 축약에는 세 가지가 있다.

  • 알파-변환(α-conversion): 속박 변수를 바꿈
  • 베타-축약(β-reduction): 식의 인수에 함수를 적용
  • 에타-변환(η-conversion): 외연성을 통해 축약 (겉으로 보이는 행동이 같은 함수는 동일 함수로 간주함)

베타-축약을 통해 같은 식으로 변환되면 베타-동치(β-equivalent)라 부른다. 다른 축약도 마찬가지로 각각 알파-동치(α-equivalent), 에타-동치(η-equivalent)로 정의된다. 축약할 수 있는 식(reducible expression)을 줄여서 redex라고 부른다.

알파-변환[편집]

알파-리네이밍(alpha-renaming)이라고 불리기도 하는 알파-변환은 속박 변수의 이름이 바뀌는 것을 허용한다. 예를 들어, 가 로 바뀌어도 알파-동치이다. 알파-변환은 일반적으로 동치임을 확인하기 위해 사용된다. 정확한 알파-변환의 규칙은 완전히 사소하지 않다. 첫 번째로 추상화로 알파-변환을 수행할 때, 한 변수는 같은 추상화에 속한 경우만 새롭게 이름 붙일 수 있다. 예를 들어, 의 알파-변환은 가 될 수 있으나, 은 될 수 없다. 두 번째로 다른 추상화에 의해 변수가 캡쳐되어 있을 경우 알파-변환을 할 수 없다. 예를 들어, 은 로 알파-변환될 수 없다. 정적인 스코프를 가지는 프로그래밍 언어에서, 알파-변환은 이름 없는 변수의 이름을 해당 변수를 포함하는 스코프에서 결정하는 이름 분석(name resolution)을 통해 변수의 이름을 결정할 수 있다.

치환[편집]

 형태로 쓰여지는 치환은 변수 를 식 과 함께 에 대입하는 과정이다. 치환은 다음과 같은 성질을 가진다. x와 y는 변수, M과 N은 λ 형태의 식이다.

x[x := N] ≡ N
y[x := N] ≡ y (만약 x ≠ y 일 경우,)
(M1 M2)[x := N] ≡ (M1[x := N]) (M2[x := N])
x.M)[x := N] ≡ λx.M
y.M)[x := N] ≡ λy.(M[x := N]) (만약 x ≠ y 이고, y ∉ FV(N) 일 경우,)

람다 추상화에 치환하기 위해서는 알파-변환이 필요하다. 예를 들어, 를 치환했을 경우 는 정확하지 않다. 로 치환되어야 알파-동치를 이룰 수 있다.

타입 없는 람다 대수[편집]

타입 없는 람다 대수는 이와 같은 고찰을 바탕으로 함수를 다음과 같은 형식으로 다시 표현한다.

 변수  수식

위에서 살펴본 항등함수 는 람다 대수로 표현하면  가 된다.

함수를 실제로 계산하는 것은 베타 축약이라는 과정을 통해 이루어진다. 베타 축약은 다음과 같은 규칙을 갖는다.

: 수식 에서 모든 변수 를 수식 으로 치환한다.

예를 들어 입력값 에 대해 수식 를 리턴하는 함수 가 있다고 하자. 이 함수에 입력 을 적용하는 과정은 와 같이 수식 내의 모든 을 7로 치환한 것으로 표현할 수 있다. 이와 같이 치환 등을 통해 수식을 축약하는 것은 베타 축약의 한 예이다.

같이 보기[편집]

참고 문헌[편집]


출처 - 위키

'뻘소리' 카테고리의 다른 글

향상된 디버깅 옵션  (0) 2016.10.04
컨텍스트 스위칭(Context Switching)  (0) 2016.10.04
부스트 코루틴  (0) 2016.08.18
비구조적 프로그래밍  (0) 2016.08.18
아키텍처 프로그래밍  (0) 2016.08.18
Posted by 멜데스