# compiler
libisl 라이브러리
Space Space는 변수들의 집합과 그 차원을 나타냄 Space는 해당 변수들의 관계와 어떤 차원에서 작동하는지를 정의함. 예를 들어, 두 입력 차원과 한 출력 차원이 있는 공간은 2 -> 1 형태를 가집니다. 이는 맵이나 세트를 정의할 때 사용되는 기본 틀입니다. > Example > 2 -> 1 isl_space Set 세트는 다차원 정수 좌표의 집합을 나타냅니다. 예를 들어, 2차원 평면 상의 직사각형 영역을 나타내는 세트는 이러한 좌표의 집합으로 생각할 수 있습니다. 세트는 기본적으로 선형 부등식과 같은 제약 조건에 의해 정의됩니다. a.k.a Iteration Domain islbasicset isl_set islunionset islunionset Map 맵은 두 세트 간의 관계를 나타냄. 맵은 입력 세트에서 출력 세트로의 매핑을 나타내므로, 입력 튜플에서 출력 튜플로의

나만의 서버 프레임워크 만들기 - 인증, 트랜잭션, 템플릿 엔진, 자동 생성 도구 만들기
지난 글에서는 Node.js 서버 프레임워크를 동작시키기 위해 필요한 여러가지 필수 기술을 어떻게 구현할 수 있는지 간략하게 정리를 해보았습니다. 사실 저는 이 프레임워크를 위해 바퀴를 재발명하면서 수 많은 기술적인 난관들을 만났습니다. 말 그대로 고난과 역경이었는데요. 아직도 해결되지 못한 과제들이 많이 있습니다. 이번 시간에는 인증 개념과 트랜잭션 처리, 그리고 추가로 템플릿 엔진과, 타입스크립트 컴파일러에 대해서도 다뤄보려고 합니다. 로깅 화면 우선 기능 구현에 대한 설명을 하려면 제가 만든 서버 프레임워크에는 무슨 기능들이 있는지 알아봐야 합니다. 읽는데에는 시간이 그리 많이 걸리진 않습니다. 소개 @Session 데코레이터 StingerLoom에선 세션 기반 인증을 지원합니다. S

Lombok 너의 내부가 알고싶어!(feat: Rexbok 만들기)
Java 개발자라면 누구나 한번쯤 접해보았을 보일러 플레이트 코드 정리의 끝판왕 Lombok입니다. Spring 의존성을 주입할때도 @RequiredArgsConstructor 를 활용해 참 편하게 주입받아 왔는데요. 그렇다면 Lombok은 애너테이션을 붙이면 어떻게 작성하지도 않은 코드를 만들어주게 되는 것일까요? 🧚 AST(Abstract Syntax Tree) & Annotation Processor Lombok의 동작을 이해하기 위해서는 두가지 개념에 대한 이해가 필요합니다. 첫 번째는 AST(Abstract Syntax Tree), 두 번째는 Annotation Processor 입니다. Annotation Processor `Annotation Proce
JIT vs AOT Compilation
JIT(Just In Time) image JIT 란? > JIT 컴파일은 소스코드를 즉시 기계어로 변환하는 것이 아닌, 중간 단계의 중간 언어(Intermediate Language 또는 IL)로 컴파일 후, 실행 시점 단계에서 실제 기계어로 컴파일 하는 방식이다. > - 대표적인 JIT 컴파일을 사용하는 언어는 Java, C# 등을 예로 들 수 있다. Strenght / Weekness Strenght 플랫폼 독립성 : JIT 컴파일은 바이트 코드를 실행하는 시점에 해당 플랫폼에 맞는 기계어로 변환하여 실행 최적화 : JIT 컴파일은 런타임에 최적화를 수행 메모리 사용량 : JIT 컴파일은 런타임에 필요한 코드만을 메모리에 올 업데이트와
MLIR Transformation
Reference Manual 최상위 변환작업 %arg: !transform.any_op : 핸들이 임의의 페이로드 연산과 연관 %arg1: !transform.op : 핸들이 X 종류의 페이로드 연산과만 연관 %arg2: !transform.op : 핸들이 "linalg.elemwise_binary" 연산과만 연관 Casting syntax target-op -> transformed-op 연산이 두 유형 모두와 호환될시 한 유형을 다른 유형으로 캐스팅할 수 있음 example %arg1 : %matmul -> %casted :

컴파일러 - Tokenizer, Lexer, Parser, AST
컴파일러 우리가 작성한 코드는 컴파일러에 의해 기계어로 변환된다. 컴파일 도중 Tokenizing, Lexing, Parsing이 일어나게 되는데, 오늘은 그 세 가지 과정이 무엇인지에 대해 알아볼 것이다. 위 세 과정은 코드를 기계가 읽기 편하도록 실제 기계어 번역 전에 알맞게 변환하는 것인데, Tokenizing, Lexing, Parsing 순서대로 일어나게 된다. Tokenizing 토큰이란, 어떠한 의미를 갖는 문자 그룹을 뜻하며, 일반적으로 단어 혹은 문장부호, 특수기호를 포함한다. 토크나이징이란 본래의 코드를 쪼개어 여러 개의 토큰으로 구분하는 작업으로, 보통 탭, 스페이스, 개행문자 등과 같은 문자들을 기준으로 쪼개게 된다. 예를 들어 다음과 같은 코드가 있다고 하자. 이 코드를 토크나이저가 토크나이징을 하면 다음과 같이 변하게 된다. > 무조건 이렇게 변하는 것은 아니니, 참고 수준으로 보자. 구현에 따라 바뀔 수 있다. Tokeniz
[BoostCamp]Day03

CS 필수 지식 #1
⭐ 동기 vs 비동기 동기 : 클라이언트가 요청을 보낸 후 서버로부터 요청에 대한 응답(=결과)가 와야 다음 동작을 실행 비동기 : 요청을 보낸 후 응답에 상관없이 다음 동작을 실행 -- 비동기는 자원의 효율적인 사용이 가능하지만 설계가 동기적방식보다 복잡 API (Application Programming Interface) API는 응용 프로그램에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스 쉽게 말하면, 응용 프로그램을 개발할 때 사용하는 인터페이스 구글맵 API, 카카오 비전 API 등 기존에 있는 응용 프로그램을 통해서 데이터를 제공 받거나 기능을 사용하고자 할 때 사용하는 인터페이스 및 규격 openAP

[JAVA] JDK, JRE, JVM?
JRE와 JDK에 관심을 갖게 된 이유 2023년 6월 1일 기준으로 오라클 공식 홈페이지(https://www.oracle.com/kr/) 내에서 리소스* 탭의 Java다운로드* 를 클릭하면 확인이 가능하다. 자바를 다운할 경우, JRE와 JVM,JDK라는 단어가 많이 보여진다. Java 종류의 차이점을 알기 전, JRE와 JVM,JDK에 대하여 짚고 넘어가보자. 💬 들어가기에 앞서 용어 정리 > 1. 고급언어 인간이 이해할 수 있는 언어. 즉, 일반 Java에서 사용하는 코드 2. 기계어 binary 코드. 즉, 이진수(0과 1) 로만 이루어진 코드 3. Compile(컴파일) 고급
C++ compiler
컴파일 과정 전처리 #include나 #define, #ifdef 등을 컴파일러가 이해할 수 있도록 코드로 변환시키는 작업. 1. 문자 해석 C++ 코드에는 96개의 문자들로 이루어진 Basic source character set이 있다. 5종류의 공백 문자 10종류의 숫자 52종류의 알파벳 대소문자 29종류의 특수 문자 이 문자 셋에 포함되지 않는 다른 문자는 \u를 통해 유니코드로 치환되거나 따로 해석한다. 2. \문자 해석 \문자를 처리한다. 라는 코드는 라는 코드로 변경된다. 3. 전처리 토큰들로 분리 전처리 토큰의 종류 헤더 이름 식별자 문자/문자열 리터럴 연산자 1~2단계를 통하면서 안에 내용이 변경되었다면 해당 변경을 취소한다. 주석 또한 공백문자 하나로 변경된다. 4. 전처리기 실행 #include 파일 내용 복사 #define 코드 치환 #if, #ifdef 구문을

var - Java
var 지역 변수 타입 추론 Java 10부터 도입 컴파일러가 타입을 추론 컴파일 타임에 추론하기 때문에 성능 영향 없음 ❌ 명시적 선언을 타입 선언 없이 선언 가능 제약 사항 지역 변수에서만 사용 초기화 필요 null 로 초기화 불가 배열에 사용 불가 Lambda에 사용 불가 var 활용 키워드 앞에만 사용할 수 있는 어노테이션 사용 가능 반복문에서 사용 가능

타입스크립트 정리 6: 컴파일러
TypeScript 컴파일러 VScode 또는 TypeScript playground에서 타입스크립트 컴파일러 설정을 할 수 있다 https://www.typescriptlang.org/play TS config VScode에서 설정한다면 먼저 터미널에서 작업할 디렉토리로 들어간 다음 이라고 치면 tsconfig.json 파일이 생성된다 이 tsconfig.json 파일을 통해 typescript playground의 TSconfig처럼 설정을 할수있다 JSON 형태로 설정들이 나열되어 있다. “ 큰 따옴표를 써서 수정해야함. 감시모드 tsc -w 파일명 타입스크립트가 변경사항이 발생하는지 항상 감시하고 index.ts 파일을 변경하고 저장하면 자동으로 다시 컴파일하도록 한다. Starting compilation in watch mode… 라고 뜨면서 실시간으로 컴파

컴파일러와 인터프리터
컴파일러와 인터프리터 > 컴파일러와 인터프리터는 고급언어로 작성된 원시 프로그램(고급언어나 어셈블리어로 작성된 프로그램, Source Program)을 목적 프로그램(Object Program)으로 번역하는 번역 프로그램이며, 프로그램 번역 방식에 따라 구분됩니다. 컴파일러 > 소스 코드 전체를 한 번에 실행하는 프로그램 컴파일러는 고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹 작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램을 생성하여 CPU로 전달합니다. 번역 실행 과정을 거쳐야 하기 때문에 번역 과정이 번거롭고 번역 시간이 오래 걸리지만, 한번 번역한 후에는 다시 번역하지 않으므로 실행 속도가 빠릅니다. 컴파일러를 사용하는 언어에는 C언어, Java 등이있습니다. 인터프리터 > 코드를 한 줄씩 읽어 내려가며 실행하는 프로그램. 컴파일러와는 대조적 컴파일러 언어

20230403 TIL
1.오늘의 알고리즘 문제 1. 골드바흐의 추측 2. 팩토리얼의 0의 개수 세기 3. 조합 0의 개수 과 definition(정의)의 차이점에 대해 정리했습니다. Declaration(선언) 선언은 변수, 네임스페이스, 함수 및 클래스를 포함하여 프로그램 이름을 지정하는 데 사용됩니다. 이름은 선언될 때까지 프로그램에서 사용할 수 없습니다. 정의와 달리 프로그램 항목은 여러 번 선언할 수 있습니다. 다중 선언은 서로 다른 선언이 동일한 형식으로 이루어진 경우에만 가능합니다. 컴파일러의 관점에서 선언은 프로그램 요소를 가시적으로 만드는 수단입니다. 선언의 조건이 추론되지 않는 상황 ❌정적 데이터 멤버(static data member)가 클래스 선언 내에서 선언되면 클래스의 각 개체에 대해 하나의 복사본만 생성하므로 정적 데이터 멤버는 지정된 클래스 유형의 개체 요소이다. ❌선언에 typedef 문이 포함된 경우. ❌변수는 초기화 또는 함수 본문 없이 선언되지만 외부 지정을

(1) Lexical Analysis
1960년대 이후, 모든 프로그래밍 언어의 syntax는 formal grammar에 의해 지정됐다. BNF(Backus-Naur Form or Backus-Normal Form)은 ALGOL 60의 syntax를 표현했다. > program ::= statement | program statement statement ::= assignStmt | ifStmt assignStmt ::= id = expr; ifStmt ::= if ( expr ) stmt expr ::= id | int | expr + expr id ::= a | b | c | i | j | k | n | x | y | z int ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Productions 문법의 규칙을 production이라고 한다. 여기에 nonterminal symbol과 terminal symbol이 있다. Nonterminal symbol이란 문법적으로 변할 수

[TypeScript] TypeScript Compiler
📌 TypeScript Compiler Watch mode 시계모드로 해 두면 해당 파일을 컴파일을 계속 하지 않아도 자동으로 컴파일 됨 규모가 큰 프로젝트에서는 이렇게 사용하지 않음 🤔 만약 파일이 여러개라면? 파일을 지정하지 않아도 시계모드로 프로젝트 전체 폴더를 확인해 변경 사항이 적용될 수 있는 모든 타입스크립트 파일을 다시 컴파일 할 수 있음 🤔 특정한 파일을 컴파일하고 싶지 않다면 - tsconfig.json에 exclude 추가하기 와일드카드 사용 dev.ts로 끝나는 모든 파일 무시 📌 compilerOptions 타입스크립트 코드를 컴파일되는 방식을 관리한다. 어떤 파일을 컴파일할지 컴파일되는 파일이 어떻게 처리되야 하는지 처리할 수 있다 tsconfig.json의 각각 옵션 오른쪽 주석에 옵션에 대한
[Babel] Babel 사용해보기
Babel이란? JavaScript 컴파일러이다. 이전 버전과 호환되는 JavaScript 버전으로 변환하는데 주로 사용한다. Babel 사용 이유 JavaScript 문법은 꾸준히 진화고 있다. JavaScript 문법이 꾸준히 진화하고 있는데 브라우저가 지원을 하지 않으면 동작하지 않는다. Babel이 하위 브라우저에서도 동작할 수 있도록 컴파일을 해준다. JavaScript를 실행하는 방법이 다양하다. 브라우저에서 실행 Node.js에서 실행 Node.js 환경에서 작업한 코드를 브라우저에서 동작 할 수 있게 컴파일 해준다. Babel 기본 사용 방법 Node.js 환경이 필요하다. Node.js 환경에서 babel을 사용하면 파일에 접근해서 코드를 변환해준다. babel은 기본적으로 JavaScript로 구성되어 있고 npm을 통해 쉽게 설치가 가능 하다. 사용 방법 Babel 설치 및 Preset
언어가 왜이렇게 많음? low-level language 왜씀
언어가 많은 이유? 자신의 언어와 컴파일러를 개발하는 천재들이 많음. 그중에서 사용하기 편리한 언어, 강점을 가진 언어들이 남게됨. low-level language가 쓰이는 이유? 값이 싼 = 사양이 낮은 컴퓨터를 판매할 때 필요하기 때문. 사양이 낮은 컴퓨터는 high-level 언어를 이해하기에 너무 느림 ex) iptv 컴퓨터 셋톱박스 가격이 100만원이면 사람들이 안씀 => 가격 30으로 낮추려면 컴 사양을 낮춰야함

Top-Down Parsing(2)
Nonrecursive Predictive Parsing 만약 $w$가 지금까지 match해온 input이라면, stack에는 $S\,\,\overset{*}{\underset{lm}\Rightarrow}\,\,w\alpha$를 만족하는 sequence of grammar symbols $\alpha$가 존재한다. Algorithm 4.34 : Table-driven predictive parsing INPUT : A string $w$ and a parsing table $M$ for grammar $G$ OUTPUT : If $w$ is in $L(G)$, a leftmost derivation of $w$; otherwise, an error indication.