본문 바로가기

Computer Science32

[파이썬 공식문서] 4. Execution model 파이썬 공식 홈페이지 내 Execution model 문서에 정의된 내용을 정리해본다. 1. 프로그램의 구조 파이썬 프로그램의 기본 구성단위는 코드 블럭이다. 여기서 블럭은 파이썬 프로그램 텍스트가 실행되는 단위를 나타내는데, 모듈, 함수 바디, 클래스 정의부 등이 될 수 있다. 모든 입력된 인터랙티브한 커맨드는 블럭이 된다. 아래와 같이 말이다. print('Hello World!') # 하나의 블럭 > Hello World! 이러한 코드 블럭은 실행 프레임(Execution frame)에서 실행된다. 프레임은 관리정보 등을 가지고 어디서 어떻게 실행이 이어지고 코드 블럭이 실행된 후에는 어떻게 종료할 것인지를 결정한다. 2. 이름과 바인딩 규칙 이름 바인딩하기 파이썬에서 이름(Names)은 오브젝트를.. 2022. 4. 9.
우선순위 큐(priority_queue) 잘 써보기 PS와 우선순위 큐 알고리즘 문제를 풀다보면 끊임없이 만나는 자료구조가 있다. 바로 우선순위 큐이다. C++에서 priority_queue를 사용하다보면 강력함도 느끼고, 동시에 한계도 많이 느낀다. 오늘은 이에 대해 다루어보려고 한다. 우선순위 큐의 활용 LeetCode - Find Median from Data Stream Find Median from Data Stream - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com 위 문제를 한번 풀어보겠다. 문제조.. 2021. 11. 19.
퍼징 템플릿 벡터(Fuzz Vectors) 퍼징 템플릿 벡터(Fuzz Vectors) 본 글의 퍼징 템플릿 벡터는 실제 퍼징 방법론에 사용되는 OWASP의 퍼즈 벡터 리소스를 참조합니다. 퍼즈 벡터(Fuzz Vectors)란? 다음의 퍼즈 벡터들은 ZAP Fuzzer에 사용되는 템플릿입니다. 퍼징은 매개변수 조작에 대한 프로그램의 응답을 테스트합니다. 퍼즈 벡터를 이용한 퍼징의 결과로 어플리케이션 프로그램에서 생성되는 일반적인 오류 조건을 찾을 수 있습니다. 퍼징의 분류 재귀 퍼징(Recursive fuzzing) 재귀 퍼징은 설정된 알파벳의 가능한 모든 조합을 반복하여 입력의 일부를 퍼징합니다. 아래의 예시를 보면, http://www.example.com/8302fa3b 설정된 16진수(0~f)는 재귀 퍼징 범위에 속합니다. 이렇게하면 총 1.. 2021. 6. 8.
퍼징(Fuzzing)이란 무엇인가? 퍼징(Fuzzing)이란? Fuzz 테스트(또는 퍼징)은 자동화 테스트로 기형/반기형적 데이터를 주입하여 소프트웨어 버그를 찾는 블랙박스 테스팅 기술입니다. 퍼징의 이해 간단한 예시 사용자가 0, 1, 2 숫자 중 하나를 선택하여 입력하는 프로그램을 가정하겠습니다. 이는 세 가지 실제 실행경로를 만듭니다. 하지만 3 또는 255를 전송하면, 정수는 정적크기 변수에 저장되기 때문에 전송되어질 수 있습니다. 기본 Switch-case가 안전하게 구현되지 않은 경우 프로그램이 전통적인 보안문제인 버퍼 오버플로우 등의 메모리 문제가 발생할 가능성이 내제합니다. 퍼징은 이러한 소프트웨어의 구현 결함을 자동으로 찾는 것이 목적입니다. 히스토리 Fuzz 테스트는 Barton Miller 교수와 학생들이 1989년 W.. 2021. 6. 6.
포맷스트링 공격(Format String Attack)이란? 포맷스트링 공격(Format String Attack)이란? 포맷스트링 공격은 프로그램에 입력된 문자열 데이터가 명령으로 해석될 때 발생합니다. 이러한 방식으로 공격자는 코드를 실행하거나 스택 메모리 일부를 읽거나 실행중인 프로그램에 Segmentation Fault를 발생시켜 시스템에 의도되지 않은 동작을 일으킬 수 있습니다. 포맷스트링의 3가지 개념 포맷 함수(Format Function) 프로그램 언어의 변수를 사람이 읽을 수 있는 문자열 형식으로 변환하는 printf, fprintf와 같은 ANSI C 함수입니다. 표1. 포맷 함수의 예시 Format function Description fprint Writes the printf to a file printf Output a formatted .. 2021. 5. 28.
What is Type-safe? Type Safety에 대한 정의에 대해 완전한 이해를 위해 포스팅을 준비하던 중, PL Enthusiast 블로그에서 너무 좋은 글을 찾게 되었다. 따로 정리할 필요없이 본 포스팅에서는 해당 글에 대한 이해와 번역을 한글로 정리한다. Type Safety는 잘 이해되는 개념이지만, 쉽게 고정되는 개념은 아니다. 특히 누군가 "JAVA는 Type-safe한 언어다."라고 하면 이는 정확히 무엇을 의미하는가? 모든 종류의 Type-safe한 언어들은 어떤 면에서 "같다"고 볼 수 있는가? Type-safe의 개념은 특정 언어에서, 그리고 일반적으로 어떻게 받아들여지는가? 사실, Type Safety의 개념은 해당 언어의 타입 시스템의 정의에 따라 달라진다. 가장 간단한 예시로, Type Safety는 프로.. 2020. 9. 5.
C++ 키워드 정리 • volatile volatile 키워드는 컴퍼일러의 최적화를 제한하는 역할을 한다. volatile(휘발성)이라는 뜻 그대로 언제든지 그 값이 변할 수 있음을 명시하는 키워드이다. volatile로 지정된 변수는 최적화를 수행하지 않게 된다. 주로 메모리 맵 입출력(MMIO)를 제어할 때, volatile을 사용하여 컴파일러 최적화를 제한한다. 최적화 이전 최적화 이후: 0 != 255는 블록 내에서 true이므로 최적화되어 무한 루프에 빠진다. volatile 사용: 변수 foo에 volatile 키워드를 지정하여, 최적화를 막을 수 있다. • restrict restrict 포인터는 메모리 접근에 관련된 최적화 기능이다(C99 표준). restrict 포인터는 컴파일러에게 최적화를 하라고 알려준다.. 2020. 9. 5.
JAVA JIT 컴파일러 JAVA 프로그램은 여타 언어들처럼 프로그램 → 컴파일러(최적화) → 네이티브 코드이나, 프로그램 → 인터프리터(직접실행) 방식이 아닌 프로그램 → 컴파일러 → 가상머신(최적화 및 직접실행)의 방식으로 실행된다. 그 중에서 눈여겨 볼 수 있는 것은, 바로 실행시간 최적화를 하는 JIT 컴파일러인데, 오늘은 이에 대해 다루어본다. 개괄 JIT(Just-In-Time) 컴파일러는 런타임시 .class 바이트 코드를 네이티브 코드로 컴파일하여 JAVA 응용 프로그램의 성능을 향상시키는 런타임 환경의 구성 요소이다. 자바 프로그램은 여러 컴퓨터 아키텍처 환경에서 JVM이 해석할 수 있는 플랫폼 중립(platform-neutral)적인 바이트 코드를 포함하는 클래스로 구성된다. 런타임에 JVM은 클래스 파일을 로.. 2020. 9. 5.
C++ 코딩 스타일 개발시 프로그램 성능이나 개발시간 뿐 아니라 코드를 일관된 스타일로 잘 작성하는 것도 매우 중요하다. 본 포스팅에서는 C++ 코딩 스타일에 대해 다룬다. • Part 1: Style 스타일 가이드라인은 생각보다 엄격하지 않다. 중요한 것은 적절한 공백과 일관된 스타일을 유지하여 이해하기 쉬운 코드를 짜는 것이다. 명시적이고 일관적인 네이밍 1. CamelCase 2. snake_case 이 둘은 가장 일반적으로 많이 사용되는 네이밍 스타일이다. 네이밍 스타일 뿐만 아니라 선택 단어 역시도, 선언되는 변수/함수의 기능을 명확하게 잘 드러낼 수 있도록 하자. 일반적인 C++ 네이밍 컨벤션 1. 타입의 첫 글자는 대문자로 한다 : MyClass 2. 함수와 변수의 첫 글자는 소문자로 한다 : myMethod .. 2020. 9. 5.
Why OCaml? 이 발표에서 야론 민스키는 제인 스트릿이라는 회사에서 왜 오캐믈이라는 변방의 언어로 모든 시스템을 구축하고 개발하게 되었는가를 설명한다. 먼저 그는 일반적인 프로그래밍 언어를 4개의 범주로 나누어 설명한다. 아래와 같이 좌측 열 위쪽에 있는 언어들은 파이썬, PHP 같은 언어들인데 이들은 일반적으로 스크립트 언어라고 불리우는 것들로, 짜기 쉽고 간편하지만 컴파일되는 언어가 아니라 컴파일 되는 언어보다 속도가 매우 느리다는 단점이 있다.(언어의 종류에 따라서는 100배까지도!) 그에 반면 좌측 열 아래쪽에 있는 언어들은 C#, 자바같은 일반적인 언어들인데, 이들은 컴파일되어 빠르고 좋은 성능을 가지는 언어인 것을 보여준다. 여기서, 좌측열과 우측열의 명령형 언어와 함수형 언어를 구분하는 차이점은 함수형 언.. 2020. 9. 5.
Linux PATH 지정하기 PATH의 정의 PATH는 리눅스와 다른 유닉스 계열 운영체제의 환경 변수로, 사용자가 발행 한 명령에 응답하여 실행 파일 (즉, 즉시 실행할 수있는 프로그램)을 검색 할 디렉토리를 쉘에게 알려준다. PATH는 이러한 운영 체제의 가장 중요한 단일 환경 변수로 간주되어진다. 출처 : linfo.org PATH 등록 및 확인 리눅스 시스템의 환경변수인 PATH는 배쉬에서 echo $PATH로 확인할 수 있는데, 나의 PATH 목록은 다음과 같다. :를 기준으로 여러개 디렉토리들의 절대경로들이 등록되어 있는데, 이중에서 usr/bin/의 경우는 시스템에서 자동으로 등록한 디렉토리이다. usr/bin/은 셸에서 사용하는 실행가능한 바이너리들이 들어있는 디렉토리인데, 아래와 같이 배쉬에서 부를 수 있는 여러 셸.. 2020. 9. 4.
프로그램 분석에서의 Soundness PL에서 Soundness와 Completeness는 자주 언급되는 개념이다. 하지만 이에 대한 정의는 일정하게 사용되지 않는 양상을 보여, 가끔 혼동을 주기도 한다. 그리고, 정적분석에 대해서 Sound(안전하다), Complele(완전하다), 혹은 Soundy(적당히 안전하다)라는 개념 또한 고려해 보아야할 것이다.정적분석에서의 Soundness(안전성) Soundness의 개념은 형식적인 수학 논리 모델에서 온 것이다. 어떤 증명 시스템과 모델이 있다고 가정하자. 증명 시스템은 성질들을 증명할 수 있는 규칙들의 집합이고, 이는 수학적인 구조를 가진다. 증명 시스템 L이 증명하는 모든 statement들이 true라면 Sound하다고 할 수 있다. 그리고 L이 모델에 있는 모든 true인 statem.. 2020. 9. 4.
컴파일러 최적화 종류와 기법 정리 컴파일러 Back-end에서는 어떻게든 머신 인스트럭션의 갯수를 하나라도 줄이고자 노력한다. 컴파일러 최적화 기법은 컴파일러마다 다양하지만, 일반적으로 많이 사용되는 것은 주로 상수 연산을 최대한 줄이는 것이다. 다음 기법들은 일반적인 컴파일러에서 통용되는 최적화 기법들이다. 1. Copy propagation Copy propagation은 직접 할당의 대상을 해당 값으로 대체하는 최적화 과정이다. 아래와 같이 y = x의 직접 할당은 해당 값으로 대체될 수 있다. 최적화 이전 최적화 이후 2. Constant folding Constant Folding은 런타임에 계산 전, 컴파일 타임에 상수 표현을 인식하고 처리하는 최적화 과정이다. 최적화 이전 1스텝 진행 결과 2번째 줄, b의 할당 값인 9 -.. 2020. 9. 4.
OCaml 컴파일과 빌드 OCaml 컴파일러 ocamlc - OCaml 바이트코드 컴파일러. .byte를 만들어낸다. ocamlopt - OCaml 네이티브코드 컴파일러. .native를 만들어낸다. 파일 확장자명 종류 .c - c source를 나타냄 .cc - c++ source를 나타냄 .C - c++ source를 나타냄(.c와 구분 주의) .o - c object를 나타냄 .a - c archive를 나타냄(archive란 오브젝트 파일들을 모아 하나의 파일로 만든 것) .cmi - mli object를 나타냄 (mli는 ml 인터페이스 파일) .cmo - ocaml object를 나타냄 (byte code) .cmx - ocaml object를 나타냄 (native code) .cmxs - native plugin을 .. 2020. 9. 4.
NP 문제에 대한 쉬운 설명 P 문제 Polynominal complexity의 알고리즘을 가지고 있는 쉬운 문제. 즉, 다항 시간내에 풀리는 문제. NP 클래스 Non-deterministic Polynominal complexity를 가지는 문제들. 운에 기대면 현실적인 비용으로 해결할 수 있는 문제들. 예를 들자면 주어진 지도 위의 도시(그래프)를 한 번씩만 방문하는 경로 찾기 문제인 해밀턴 경로(Hamilton path) 문제가 대표적이다. 이를 다항시간 내에 푸는 알고리즘은 아직 없다. 건너풀기(Problem Reduction) 문제 A를 푼 알고리즘으로 동일하게 B 문제를 해결할 수 있다면, 그 문제는 간접적으로 풀 수 있는 것이다. 단, A 문제로 푼 답을 B 문제의 답으로 옮기는 건 다항 시간내에 되야한다. NP 완전.. 2020. 9. 4.