본문 바로가기

전체 글

(21)
What is Type-safe? Type Safety에 대한 정의에 대해 완전한 이해를 위해 포스팅을 준비하던 중, PL Enthusiast 블로그에서 너무 좋은 글을 찾게 되었다. 따로 정리할 필요없이 본 포스팅에서는 해당 글에 대한 이해와 번역을 한글로 정리한다. Type Safety는 잘 이해되는 개념이지만, 쉽게 고정되는 개념은 아니다. 특히 누군가 "JAVA는 Type-safe한 언어다."라고 하면 이는 정확히 무엇을 의미하는가? 모든 종류의 Type-safe한 언어들은 어떤 면에서 "같다"고 볼 수 있는가? Type-safe의 개념은 특정 언어에서, 그리고 일반적으로 어떻게 받아들여지는가? 사실, Type Safety의 개념은 해당 언어의 타입 시스템의 정의에 따라 달라진다. 가장 간단한 예시로, Type Safety는 프로..
C++ 키워드 정리 • volatile volatile 키워드는 컴퍼일러의 최적화를 제한하는 역할을 한다. volatile(휘발성)이라는 뜻 그대로 언제든지 그 값이 변할 수 있음을 명시하는 키워드이다. volatile로 지정된 변수는 최적화를 수행하지 않게 된다. 주로 메모리 맵 입출력(MMIO)를 제어할 때, volatile을 사용하여 컴파일러 최적화를 제한한다. 최적화 이전 최적화 이후: 0 != 255는 블록 내에서 true이므로 최적화되어 무한 루프에 빠진다. volatile 사용: 변수 foo에 volatile 키워드를 지정하여, 최적화를 막을 수 있다. • restrict restrict 포인터는 메모리 접근에 관련된 최적화 기능이다(C99 표준). restrict 포인터는 컴파일러에게 최적화를 하라고 알려준다..
JAVA JIT 컴파일러 JAVA 프로그램은 여타 언어들처럼 프로그램 → 컴파일러(최적화) → 네이티브 코드이나, 프로그램 → 인터프리터(직접실행) 방식이 아닌 프로그램 → 컴파일러 → 가상머신(최적화 및 직접실행)의 방식으로 실행된다. 그 중에서 눈여겨 볼 수 있는 것은, 바로 실행시간 최적화를 하는 JIT 컴파일러인데, 오늘은 이에 대해 다루어본다. 개괄 JIT(Just-In-Time) 컴파일러는 런타임시 .class 바이트 코드를 네이티브 코드로 컴파일하여 JAVA 응용 프로그램의 성능을 향상시키는 런타임 환경의 구성 요소이다. 자바 프로그램은 여러 컴퓨터 아키텍처 환경에서 JVM이 해석할 수 있는 플랫폼 중립(platform-neutral)적인 바이트 코드를 포함하는 클래스로 구성된다. 런타임에 JVM은 클래스 파일을 로..
C++ 코딩 스타일 개발시 프로그램 성능이나 개발시간 뿐 아니라 코드를 일관된 스타일로 잘 작성하는 것도 매우 중요하다. 본 포스팅에서는 C++ 코딩 스타일에 대해 다룬다. • Part 1: Style 스타일 가이드라인은 생각보다 엄격하지 않다. 중요한 것은 적절한 공백과 일관된 스타일을 유지하여 이해하기 쉬운 코드를 짜는 것이다. 명시적이고 일관적인 네이밍 1. CamelCase 2. snake_case 이 둘은 가장 일반적으로 많이 사용되는 네이밍 스타일이다. 네이밍 스타일 뿐만 아니라 선택 단어 역시도, 선언되는 변수/함수의 기능을 명확하게 잘 드러낼 수 있도록 하자. 일반적인 C++ 네이밍 컨벤션 1. 타입의 첫 글자는 대문자로 한다 : MyClass 2. 함수와 변수의 첫 글자는 소문자로 한다 : myMethod ..
비주얼 스튜디오 동생, VS Code OS-independent하게 사용하기 편리한 에디터 겨울동안 잠시 회사에 들어가 C++로 개발을 하게 되었는데, 회사 컴퓨터인 윈도우 머신과 내 노트북인 리눅스 머신을 동시에 돌리게 되었다. 두 환경에서 적절하게 잘 동기화 시키며 사용할 개발 환경이 필요하게 되었는데, 이를 계기로 VS Code를 사용하게 되었다. VS Code는 이름 그대로 Visual Studio의 코드 에디터 버전 정도로 이해할 수 있다. 하지만, 그 정도로 이해하기엔 VS와는 차이점이 많다. 일단, VS Code는 IDE가 아닌 코드 에디터이고, 플러그인과 여러 설정을 통해 개발 환경을 구축 가능하지만, 기본 기능은 상당히 가벼운 편이다. VS Code는 가볍지만 추가할 수 있는 기능들 중에 강력한 것들이 많아서, 일반적인 Vi..
Why OCaml? 이 발표에서 야론 민스키는 제인 스트릿이라는 회사에서 왜 오캐믈이라는 변방의 언어로 모든 시스템을 구축하고 개발하게 되었는가를 설명한다. 먼저 그는 일반적인 프로그래밍 언어를 4개의 범주로 나누어 설명한다. 아래와 같이 좌측 열 위쪽에 있는 언어들은 파이썬, PHP 같은 언어들인데 이들은 일반적으로 스크립트 언어라고 불리우는 것들로, 짜기 쉽고 간편하지만 컴파일되는 언어가 아니라 컴파일 되는 언어보다 속도가 매우 느리다는 단점이 있다.(언어의 종류에 따라서는 100배까지도!) 그에 반면 좌측 열 아래쪽에 있는 언어들은 C#, 자바같은 일반적인 언어들인데, 이들은 컴파일되어 빠르고 좋은 성능을 가지는 언어인 것을 보여준다. 여기서, 좌측열과 우측열의 명령형 언어와 함수형 언어를 구분하는 차이점은 함수형 언..
Linux PATH 지정하기 PATH의 정의 PATH는 리눅스와 다른 유닉스 계열 운영체제의 환경 변수로, 사용자가 발행 한 명령에 응답하여 실행 파일 (즉, 즉시 실행할 수있는 프로그램)을 검색 할 디렉토리를 쉘에게 알려준다. PATH는 이러한 운영 체제의 가장 중요한 단일 환경 변수로 간주되어진다. 출처 : linfo.org PATH 등록 및 확인 리눅스 시스템의 환경변수인 PATH는 배쉬에서 echo $PATH로 확인할 수 있는데, 나의 PATH 목록은 다음과 같다. :를 기준으로 여러개 디렉토리들의 절대경로들이 등록되어 있는데, 이중에서 usr/bin/의 경우는 시스템에서 자동으로 등록한 디렉토리이다. usr/bin/은 셸에서 사용하는 실행가능한 바이너리들이 들어있는 디렉토리인데, 아래와 같이 배쉬에서 부를 수 있는 여러 셸..
프로그램 분석에서의 Soundness PL에서 Soundness와 Completeness는 자주 언급되는 개념이다. 하지만 이에 대한 정의는 일정하게 사용되지 않는 양상을 보여, 가끔 혼동을 주기도 한다. 그리고, 정적분석에 대해서 Sound(안전하다), Complele(완전하다), 혹은 Soundy(적당히 안전하다)라는 개념 또한 고려해 보아야할 것이다.정적분석에서의 Soundness(안전성) Soundness의 개념은 형식적인 수학 논리 모델에서 온 것이다. 어떤 증명 시스템과 모델이 있다고 가정하자. 증명 시스템은 성질들을 증명할 수 있는 규칙들의 집합이고, 이는 수학적인 구조를 가진다. 증명 시스템 L이 증명하는 모든 statement들이 true라면 Sound하다고 할 수 있다. 그리고 L이 모델에 있는 모든 true인 statem..