1.5. Applications of Compiler 


컴파일러 설계는 많은 사람들이 학교에서 배우는 컴파일러 기술을 배우지만 대부분 PL을 만들지는 않는다.

컴파일러 설계는 컴퓨터 과학 분야에 영향을 준다.

이번 section에서 상호작용과 기술 응용에 대해서 배움.



1.5.1. Implementation of High-Level Programming Languages


Programmer는 알고리즘을 만들고

Compiler는 program을 target program으로 만듬.

high-level language는 쉽지만 느리다.

low-level programmer는 결과물에 비해 많은 노력을 하지만 효율적인 코드를 만든다.

high-level의 비효율적임을 상쇄가능하다.


Example 1.2.

high-level을 바로 machine code로 바로 만드는 것은 비효율적이다.

data-flow optimization이 효율적인 코드를 생성해내기 때문이다.

(1.4.2. 참조 - 2019/02/03 - [분류 전체보기] - 1.4. The Science of Building a Compiler)


Object-orientation

1. data abstraction

2. Inheritance of properties

modular and easier

더 많고, 더 작고, 많은 절차들로 구성


Java는 type-safe 언어다.

관계없는 타입의 객체는 사용되지 않는다.

Java는 pointer와 pointer 연산을 허용하지 않는다.

Java는 garbage-collection이 오래동안 사용하지 않은 메모리 변수를 자동으로 해재시킴.

compiler optimization은 overhead를 감소하려고 개발됨

overhead : 불필요한 범위 검사 제거,  접근할 수 없는 객체 할당...??


효율적인 알고리즘은 garbage-collection의 overhead를 최소화하기 위해 개발


Java는 호환성과 mobile code를 위해서 설계됨.


bytecode는 런타임에서 해석되거나 자연어로 컴파일(dynamically) 되어야만 한다.



1.5.2. Optimizations for Computer Architectures


Computer Architecture가 빠르게 변할 수록 compier 기술은 불안정.


high-performance system 은 2 가지 이점이 있다.

1. Parallelism

2. memory hierarchies



Parallelism

- 현대 microprocessor는 보통 instruction-level parallelism을 뜻함.

- 하드에어는 동적으로 순차적인 명령들을 check 한다. 그리고 가능한 별렬로 실행한다.

- 어떤 경우에는 machine은 hardware scheduler를 가르킨다.

hardware scheduler는 병렬의 개수를 늘리기 위해서 명령 순서를 바꿀 수 없다.

-H/W가 명령들을 다시 정렬하든 안하든, Compiler는 명령들을 재정렬 할 수도 있다.

(더 효과적인 instruction-level parallelism을 만들기 위함)


VLIW(very long Instruction Word)

VLIW machines은 명령어들을 병렬로 처리할 수 있다.

컴파일러 기술은 절차지향 프로그램을 자동으로 코드 생성하기 위해서 개발됨.


Parallelization 개발의 목적

Sequntial scientific programs  ->  multiprocessor code



Memory Hierarchies

-속도와 크기가 다른 몇 단계로 구성

-Processor에 가까울 수록 빨라짐. 하지만 작아짐.

-Parallelism and memory hierarchy

-machine의 성능에 항상 도움.

-하지만 효과적이지 못함. 왜냐하면, compiler가 real performance를 app에 제공하기 때문임.


- Processor usally has

- 작은 레지스터 (byte)

- 몇 단계의 캐쉬 (Kb~ Mb)

- 물리적 메모리 (Mb ~ Gb)

- Secondary 메모리 (Gb ~ )

- 인접 메모리 계층의 접근은 속도차가 발생할 수도 있음

이유 : by two or three orders of magnitude

- system 성능은 processor의 속도에 따른 제한은 없지만, memory subsystem 때문에 제한이 없다.

- compier는 processor 실행 최적화에 초점을 두었었지만, 지금은 메모리 계층을 더 효율적으로 만드는데 초점을 둠.

- optimizing program에서 register를 효율적으로 사용하는 것이 가장 중요!!!!!!!!!!!!!!!

- register SW에서 명시적으로 관리됨.

- caches and physical memory 명령들에서 숨겨져 있고, HW에 의해 관리.

- Cache-management polices는 larage data structure에서 비효율적

(Cache-management polices : HW에서 구현) (larage data structure : array가 대표적)

효율적이려면 data의 양식을 바꾸거나 명령 순서를 바꿔야함.

- cache 명령을 효율적으로 바꾸기 : code layout 바꾸면 가능할 수도 있음.



1.5.3. Design of New Computer Architectures


high-level language가 대중화 되면서 compiler를 잘사용하는지?,  its raw speed 가 컴퓨터 시스템 성능을 결정하지 않음.

in modern computer architecture development, 

컴파일러는 제안된 architecture features 평가하는데 사용되어짐.

compilers are developed in the processor-design, and compiled code, running on simulators


RISC

- Compiler 가 computer architecture 설계에 어떻게 영향을 줄지에 대한 잘 알려진 발명임.

- RISC 이 전에는 assembly programming을 쉽게 만들어내는 것이 trend 였음.

= Typically CISC(Complex Instruction-Set Computer)

CISC 명령 집합

- 복합 메모리주소 모드 포함. 데이터 구조 접근과 프로시져 호출 명령들 지원

(프로시져 호출 명령들 : stack에 register, 통과 매개변수 저장,)

- compiler optimization은 구조에서 중복을 제거해서 명령들을 간단하게 만듬.

=> 그래서  HW는 최적화하기 많이 쉬워짐.

- 범용 processor architecture는 RISC를 기반으로 함.

- x86 architecture는 CISC 명령set을 가지지만, 많은 ideas는 RISC를 위해서 개발됨.

많은 ideas는 processor 자체 개발에 사용되어졌음.



Specialized Architectures

- 지난 30년간 VLIW, SIMD 등 많은 architectural concepts 제시됨.

- architectural concepts 개발은 (컴파일 기술)연구와 개발이 동반됨.

- 이러한 의견들은 임베디드 설계로 만들어짐

- 맞춤식 processors는 특정 app의 cost-effective 향상 시키기 위해서 나옴.

- 이와 달리 범용 processor는 경제규모 때문에 나옴. 앱별로 다양한 아키텍처를 출시.

- 결론 : compiler 기술은 아키텍처를 위한 programming 뿐만 아니라, 제안된 아키텍처 설계를 평가하기 위해 필요해짐.



1.5.4. Program Translations


- 전혀 이해 안됨. 그래서 영문으로 남김


While we normally think of compiling as a translation from a high-level language to the machine level, the same technology can be applied to translate between different kinds of languages. The following are some of the important applications of program-translation techniques.



Binary Translation

- Binary Translators는 x86 code를 변환(Alpha code, Sparc code)하기 위해서 개발됨.

- Trensmeta Inc에 의해서 Binary Translation 사용되어짐.

- 이 회사는 HW에서 직접 x86 명령을 실행하는 것이 아니라,

x86 code  ->  native VLIW code 이진 변환함.

(the Trensmeta Crusoe processor is a VLIW processor

- backward 호환성을 제공하기 위해 Binary translation 사용


- 1994년에 매킨토시 processor가 Motorolar MC68040에서 PowerPc로 바뀜.

이 때, PowerPC processors는 MC68040의 코드를 그대로 사용했음.



Hardware Synthesis

- SW는 high-level languages로 쓰여짐.

- HW설계는 VHDL처럼 high-level HW에서 설명되어졌음.

- HW설계는 대표적으로 register transfer level에서 설명됨.

- HW Synthesis tools은 RTL -> Gates, 그리고 transistors에 mapping, 물리적 layout으로 변환.

- Compilers와는 다르게 종종 최적화 circuit을 가짐

- 높은 단계에서 설계변환 기법도 존재함.

 (Behavior of functional level)


Database Query Interpreters

- DB 쿼리는 관계적이고 boolean 연산자들을 포함하는 술부로 구성된다.

- 술부에 만족하는 records를 검색, 해석에 사용.



Compiled Simulation

- Simulation은 현상 이해나 design을 증명하기 위해서 사용되는 기술임.

- Simulation에는 가능한 많은 input set이 좋고, simulation으로 몇 일을 보낼 수도 있음.

- design simulator 작성보다 design을 compile하는게 더 빠름.

- 컴파일된 시뮬레이션은 interpreter-based 접근보다 빠르게 run orders of magnitude




1.5.5 Software Productivity Tools


- Programs은 완벽하게 일하는 것보다 정확하게 일하는 것이 더 중요함.

- 에러가 많으면 System 파괴, 잘못된 결과 생산, 보안에 취약한 프로그램을 만들고, 중요한 시스템을 치명적인 실패로 만듬.
- test는 에러 찾는 것에서 가장 중요한 기술이다.

- 좋은 test 접근법은 data-flow analysis 를 이용해서 자리잡은 에러를 찾는 것이다.

- compiler optimization과 달리 error 감지 기술은 불완전할 수도 있다.

- Optimizaer는 보수적이라 어떠한 상황에서도 안바뀔 경우가 높다.

- 프로그램이 취약점으 가지면 특별한 기술을 사용하는 것은 중요.


Data-Flow Anaysis

- 가능한 모든 실행 경로에서 에러 찾을 수 있음.

이는 test case에 의한 사용이 아님

- compiler optimization을 위해 개발된 많은 data-flow analysis는 programmers의 engineering tasks를 돕기 위한 툴 개발에 이용됨.

- error 경고를 위해 만들어짐.



Type Checking

- 잘못된 객체 타입 사용시 적용.

- 파라미터가 procedure를 통과시.

- 보안 취약점 : 주의할 필요 없는 data나 string을 공격.

=> 크래커에 의해 제공된 string은 "dangerous"로 표기 되야함.

적절한 format이 check 안되면 "dangerous"가 여전히 남고

program 속의 코드는 잠재적인 보안 취약점을 가지고 있을 수 있음. ( C의 버퍼오버플로우가 특히 그런거 같음. )



Bounds Checking

- low-level programming 많은 실수를 많듬.

- C의 Buffer overflow는 보안 문제를 야기함.

C는 arrays의  bounds를 check 안함. 그래서 사용자가 알아서 잘 써야함.

크래커는 input data로 조종함. - system 보안을 건드리거나 잘못된 행동들을 발생시킴.

- Buffer overflows를 찾기 위한 기술 개발은 완벽하게 개발 안됨.

- Data-flow analysis는 buffer overflow를 찾는데 사용됨.

- 포인터 추적 기술은 고급 에러 검사 기술임.

- potential buffer overflow는 시스템 보안을 위협함.



Memory-Management Tools

- Gabage Collection은 효율성, 쉬운 프로그래밍, SW 신뢰성에서 매우 훌륭함!

- Automatic memory management 는 C와 C++의 memory-management errors를 해결함.

- Tools는 프로그래머의 memory-management error를 찾는 것을 돕기 위해 개발됨.

(Typically, Purify)












1.4. The Science of Building a Compiler


1.4.1. Modeling in Compiler Design and Implementation


Lexical units of program에 finite-state machines, regular expressions 기능의 모델 유용함.


1.4.2. The Science of Code Optimization


- Compiler에 의해서 생성된 코드는 일반 코드보다 빠름.

- 복잡해져서 코드 개선의 기회가 많아짐.


- Compiler 설계의 목표에 있어서 다음 4가지는 반드시 지켜져야 한다.

1. 컴파일러는 완벽해야한다. (정확해야함)


2. effective (효율적이어야함)

Typically, the same optimization that speed up execution time also conserve power


3. 짧은 컴파일 시간 제공. 개발과 디버깅을 위해서 (내 생각에 Android Studio는 이 부분에 있어서 ㅈ망인듯)


4. 단순해야함. - 기술과 컴파일 유지 비용 관리를 위해서.

1.3. The Evolution of Programming Languages


1940년에 전기 컴퓨터가 처음 나왔는데 0과 1의 순서로 프로그램이 되었다.

low level operation은 location 이동, 레지스터 2개 내용 추가, 값 2개 비교 등을 함.

하지만 느리고, 지루하고, 에러 발생이 쉬웠다.

그리고 한번 작성하는 것에 있어서 이해와 수정이 어려움.


1.3.1. The Move to High-level Languages


- 1950년에 인간과 친한 assembly language 개발됨.

- assembly languages는 처음에 단순 기계언어를 기억하는 용도였다.

- 하지만 나중에 assembly에 macro 기술이 추가되서 프로그래머가 parameterized shrothands for frequently used sequnces of machine language를 정의 가능해졌음.

- 1950년 후반에 과학적인 계산 : Fortan 개발. 이는 

- bussniess data processing : Cobol 개발.

- 상징적인 계산 Lisp 개발

- 이러한 언어철학은 high-level notations이 되었다.

- 쉬운 숫자 계산, 비즈니스 응용, 상징적 프로그램

- 여전히 요즘에도 성공적으로 사용됨.


이후에 쉽고 자연스럽고 robust한 언어들이 만들어짐

나중에 우리는 현재 PL에 대해서 배움.


1세대 : 기계어

2세대 : 어셈블리

3세대 : Fortan, Cobol, C, Java, ...

4세대 : SQL, NOMAD, Postscript


폰노이만 언어는 계산적인 모델의 기초가 되었음.  ->  폰노이만 아키텍처

오늘날의 많은 언어들의 기초.


기능언어 : ML, Haskell, Prolog


객체지향 언어 : Simula67, Smalltalk


스크립트 언어 : 고급 연산자를 사용해서 해석 ( Awk, PHP, Javascript, Python, ...)

보통 짧은 코드를 구성해서 사용.



1.3.2. Impacts on Compilers


- Programming Language와 Compiler는 밀접한 관계다. 그래서 Programming Language 기술은 compiler writer에게 새로운 기술을 요구한다.

- 1940년 이후 Compiler writer는 새로운 PL을 알아야할 뿐만 아니라 하드웨어의 기능을 최대한 끌어내는 알고리즘을 창작해야 한다.

그래서 어려운듯. 

- 컴파일러는 (overhead를 최소화 시킨)high-level languages 사용을 촉진한다.

- high-performance를 만드는 것에 있어서도 Compiler의 기능을 최대한 끌어내는 것이 중요.


1.3.3. Exercise for section 1.3.



1.2.6. Code Generation

1.2.8. The Grouping of Phases into Passes

1.2.9. Compiler-Construction Tools

1.3.3. Exercise for section 1.3.

1.4. The Science of Building a Compiler

1.4.1. Modeling in Compiler Design and Implementation


'Compilers(Principles,Techniques,&Tools)' 카테고리의 다른 글

Preface  (0) 2019.02.02
Compilers 공부 시작  (0) 2019.02.02

1.2 The Structure of a Compiler


Compiler에서 mapping을 2개로 나눈다면 analysis와 synthesis가 있다.


Analysis ( Front-end )

- Program을 문법적인 여러개의 조각으로 나눔.(break up, seperate) => 중간 결과물을 만들기 위해서.

- 코드가 잘못되면 사용자에게 유익한 정보를 줌.

- 소소코드 정보를 Symbol table에 저장.


Synthesis( Back-end )

- Intermediate representation, information in the symbol table을 가지고 target program 구성.


Compilation process (in more detail)

- intermediate representation은 명시적으로 구성 될 필요가 없다.

- Symbol table은 모두 Parser의 과정에서 사용된다.

- 몇몇 Compiler는 Machine-independent optimization phase 를 가짐.


Optimization phase

- front-end와 back-end 사이에서 작용.

- 목표 : 최적화 하지 않은 것보다 좋은 target program을 만들기 위해.

- 그렇지만, optimization은 선택 사항이다.




1.2.1. Lexical Analysis


- Compiler의 첫 번째 단계

1. source program의 문자열을 읽는다.

2. 의미 있는 sequences를 그룹화한다. (의미 있는 sequences == lexemes(어휘소))

그룹화 : Token stream  =  <token-name, attribute-value>

token-name : syntax-anlayzer에서 abstract symbol
attribute-value : symbol table의 entry

- Semantic analysis와 code generation에서 symbol-table entry 정보 필요



position = initial + rate * 60 (1.1)

<id,1> <=> <id,2> <+> <id,3> <*> <60> (1.2)



1.2.2 Syntax Analysis (Parsing) - 구문 분석


- Compiler의 두 번째 단계

- Syntax tree 생성 (for the token stream)

- 산술적인 관습을 따름 ( *는 +보다 먼저 연산)



1.2.3. Semantic Analysis - 의미 분석

- source program의 semantic consistency 검사

- type checking is important

- each Operator has matching operands

- 예시, arr[1] (OK) <-> arr[1.5] (소수점 허용 안됨)

- may permit some type conversions called coercions

- 정수, 소수 연산시 타입은 소수가 됨.

- inttofloat(60)은 명시적인 type convert 임.


1.2.4. Intermediate Code Generation


- 중간 코드는 다양한 형식으로 1개 이상 생성된다.

- Syntax tree는 syntax analysis와 semantic analysis에서 사용된다.

- Syntax and Semantic analysis 이후에 보통 Compiler는 low-level 언어 생성. 이를 abstract machine으로 생각할 수 있다.


- three-address assignment (6장에 나옴)

- 어셈블리어처럼 순서를 지닌다. 그리고 명령당 3개의 연산자가 있다.

- register처럼 동작

- output of the intermediate code generator consists of three-address code sequnce

- instruction은 오른쪽에 많아도 1개의 연산자를 갖는다.

- Compiler는 three-address instruction에 의해 계산된 값을 고정하려고 temporary name을 생성한다. 

- 첫 번째와 마지막 three-address instructions은 operand가 3개보다 작다.


1.2.5 Code Optimization


- inttofloat 함수를 사용하지 않아도 되게끔 코드를 만들어준다.

- shorter code, or target code that consumes less power.

- 정수를 소수로 변환해줌. (inttofloat 함수가 없어도 됨 = 자동 type convert)

- Simple optimizaer : 컴파일 속도를 너무 많이 늦추지 않고 target program의 속도 향상 가능

- optimizing compilers는 code optimization 단계에서 많은 시간을 보냄.


1.2.6. Code Generation




1.2.7. Symbol-Table Management


- Compiler의 직접적인 기능 : 변수 이름 저장하고 각각의 다양한 애용들 모음.

- Symbol table은 필드에 각 변수 명을 기록하는 데이터 구조다.

(데이터 구조 : 빠르게 이름을 찾고, 데이터를 빠르게 검색하는 구조)


1.2.8. The Grouping of Phases into Passes




1.2.9. Compiler-Construction Tools



Introduction


프로그램은 어디서나 사용된다. 그리고 그 프로그램을 실행하려면 컴파일러가 필요하다.

컴파일러 설계의 원리와 기술은 컴퓨터 과학자의 경력에 여러번 재사용 가능하다.

컴파일러 설계와 컴퓨터 과학이론과 컴파일러 기술 응용에 대한 개요를 배운다.

컴파일러 공부에 필요한 Programming language 키워드에 대해서 짧게 배운다.


1.1 Language Processor


Compiler

- source program  ->  target program

- 에러 찾기 ( source program 변환 과정에서)




Target program이 실행 가능한 machine-language 일 경우

- input  ->  output



Interpreter

- source program+input  ->  output

- input이 생긴 source program에 직접적으로 지정된 작업을 실행함.




compiler가 interpreter 보다 맵핑이 빠르다.

interpreter는 Compiler보다 에러진단이 좋다. 왜냐하면, statement로 source program statement를 실행하기 때문이다.


Java = hybrid Compiler = compiler + interpreter

- Javacode는 bytecode로 먼저 컴파일

- bytecode는 가상 머신에 의해서 해석됨. ( 다른 곳에서 해석 = 여러 플랫폼에 적용 가능한 이유일지도???)

- Java는 속도 높이려고 immediate program 실행 전에 bytecode를 machine-language로 바꿈.

- Just-in-time Compiler



Compiler는 Target program을 만들기 위해서 아래 그림 1.5와 같이 여러 가지 과정이 있음.

Source program은 전처리기가 담당.

전처리기는 매크로를 소스 언어의 상태로 만들고

modified source program은 Compiler로 간다.

Compiler는 assembly language를 만든다.
assembly language는 출력 처리, 디버깅에 좋음.


큰 프로그램은 나눠서 컴파일 되는 경우가 많다.

그래서 relocatable machine code는 실제 기계에서 relocatable object files와 library files와 함께 실행되는 코드가 됨.

링커는 한 파일의 코드가 다른 파일의 위치를 참조 할 수있는 외부 메모리 주소를 확인합니다.

loader는 모든 실행 가능한 오브젝트 파일을 메모리에 집어 넣어 실행합니다.




1.1.1 Execercises for Section 1.1


Exercise 1.1.1 : What is the difference between a compiler and an interpreter?

compiler : source program  ->  target program

interpreter : source program + input  ->  output


Exercise 1.1.2 : What are the advantages of a compiler over an interpreter an interpreter over a compiler?

compiler : 빠름 ( mapping inputs to outputs )

interpreter : 에러진단이 compiler보다 좋음.


Exercise 1.1.3 : What advantages are there to a language-processing system in which the compiler produces assembly language rather than machine language?

Assembly language가 출력 처리, 디버깅에 좋음.


Exercise 1.1.4 : A compiler that translates a high-level language into another high-level language is called a source-to-source translator. What advantages are there to using C as a target language for a compiler?

?????????????????????


Exercise 1.1.5 : Describe some of the tasks that an assembler needs to perform.

Assembly to relocatable machine code.










Preface


1986년 출시된 책임.

Programming Languages는 새로운 복잡한 문제와 함께 진화해왔다.

오래된 코드 최적화 기술은 외부컴파일러에서 사용되는 것을 발견했다.

그것은 SW에서 debugging Tools 에서 사용된다. 그리고 코드에 존재하는 보안취약점을 찾는데 사용한다.

그리고 grammars, regular expressions, parsers, and syntax-directed translators 같은 Front-end 기술은 여전히 널리 사용된다.


대부분의 사람들은 컴파일러를 만들거나 심지어 유지하는 사람이 없다.

하지만 Copiler와 관련된 models, theory, algorithms 이러한 기술들은 SW설계와 SW개발을 돕는다.

이 공부는 source language, target machine 같은 곳에서의 language processor를 설계하는 곳에서 마주하는 문제들을 돕는다.


Use of the Book


이 책의 중요부분을 제대로 다루려면 최소 2분기, 혹은 2학기는 필요함.

이 책의 절반은 stressing code optimization 이다. 그리고 이것은 학부생 과정에서 배운다.

그리고 나머지 절반은 졸업생 혹은 mezzanine level에서 배운다.


Chpater 1

computer architecture 이슈와 Programming language 원칙의 배경을 배움.


Chapter 2

작은 컴파일러를 개발함. 중요한 개념을 소개하고 나중 챕터에서 자세하게 배운다.


Chapter 3

lexical analysis, regular expressions, finite-state machines, scanner-generator tools 를 배움.

이것들은 문자 처리에 대한 정렬의 근본임.


Chapter 4

major parsing methods(recursive-descent, LL), rop-down and bottom-up(LR and its variants) 배움.


Chapter 5

syntax-directed definitions, syntax-directed translations에 대한 원리들을 소개함.


Chapter 6

Chapter 5의 이론을 보여주고 대표적인 Programming language에서는 어떻게 사용해서 중간코드를 생성하는지에 대해서 보여줌.


Chapter 7

run-time environments, run-time stack 관리, garbage collection에 대해서 배움.


Chapter 8

object-code 생성임. 

object-code는 

 basic blocks의 구성,

 expressions로부터 코드 생성, 

 basick blocks, 

 register-allocation 기술들을 배움.


Chapter 9

코드 최적화 기술을 소개함.

code optimization (flow graphs, data-flow frameworks, iterative algorithms for solving these frameworks)\


Chapter 10

instruction-level optimization을 소개함.

instruction을 작은 순서로 병행처리하는 것과

single processors를 한번에 여러개를 사용할 수 있는 스케줄링.


Chapter 11

larger-scale 병렬 감지와 착취를 말하고 

여기서 고차원배열에 대해서 많은 반복믄을 가지는 numeric codes를 배움.


Chapter 12

interprocedural analysis.

pointer analysis, aliasing, data-flow analysis 

procedure 호출 순서 고려에 대해서 배움.


이 책을 사용한 아래의 과정은 콜롬비아, 하버드, 스탠포드에서 배움.


콜롬비아에서는 앞의 8개 챕터를 1년 과정으로 배우고 이 책의 가장 핵심 과정은 semester-long project인데 학생들이 프로젝트를 작업하려고 작은 팀 단위로 나뉘어져서 그들의 방식으로 작은 언어를 구현한다. 학생들이 만든 언어는 양자계산, music synthesis, 컴퓨터 그래픽스, 게임, matrix operations 등 다양한 분야의 앱이 있다. 학생들은 컴파일러를 만들기 위해 compiler-component generators를 사용하고 챕터2,5에서 배우는 syntax-directed translation 기술을 사용한다. follow-on graduate 과정은 Chapters 9~12에 관점을 둠. 이러한 과정은 code generation, optimization, multiprocessor architectures를 가지고 있음.


스탠포드는... 내가 알거 없으니까 생략하도록 한다.


Prerequistes


The reader should possess some "computer-science sophistication"

데이터 구조, 이산수학, 그리고 프로그래밍 좀 할줄 알아야 함.

이 책에서 이러한 지식들은 유용하게 사용 될 거임.



Exercise


이 책은 거의 모든 section에 연습문제가 있음. 연습 문제는 옆에 이상한 모양 딸려 있을거임.

가정 어려운 문제는 이상한 모양 2개 딸려 있음.


Gradiance On-Line Homeworks


더 많은 정보 얻으려면 www.aw.com/gradiance를 접속하거나 computing@aw.com에 이메일 보내라고 한다.

그런데 오래되서 잘 모르겠다. 그리고 이거 말고 나머지 내용은 생략한다.

방문하라길래 방문해봤는데 사이트 연결안됨.


Support on the World Wide Web


이 책의 홈페이지는 dragonbook.stanford.edu 이다.

이 홈페이지도 접속안됨.

그래서 걍 다 생략함.


Acknowledgements


감사인사 글인거 같음. 그래서 생략함.















'Compilers(Principles,Techniques,&Tools)' 카테고리의 다른 글

채워야할 부분.  (0) 2019.02.03
Compilers 공부 시작  (0) 2019.02.02

Compilers에 대해서 공부하려고 아래의 번역본 책을 샀다. 몇 페이지 읽어봤는데 무슨 말인지 이해가 잘 안간다. 수능때 언어, 외국어 각각 8등급을 쳐맞아서 그런지 한국어도 개어려웠다. 그래서 그냥 똑같은거 원서 보면서 공부하고자 한다. 

공부 기간 : 2019년 2월 1일 ~ 3월 31일

프로젝트 진행 : 4월




앞으로 업로드 되는 내용 대부분은 아래의 책을 공부해서 적은 내용이고 이것은 개인적으로 요약하거나 변질된 내용들이 있을 수 있습니다.


예전에 자연어처리 연구실에 있다가 C언어 코드를 input을 받아서 코드에 해당하는 결과물을 출력하는 컴파일러를 작성한 적이 있다.

이 때, 왜 하는지 잘 몰랐지만 자연어처리(NLP) 자체가 언어를 다른 언어로 번역하는 기능이기 때문에 컴파일러와 원리가 같다는 것을 깨달았다.

그 당시에는 컴파일러 작성시에 Tokenizing과 Parsing 2가지만 신경써서 'awk'라는 스크립트 언어를 활용해서 긴 코드를 작성한 기억이 있다.


Compiler 자체가 매우 체계적으로 작성되어 있고 이런 것들을 '오토마타'가 함께 동반되었다는 것을 지금에서는 조금이나마 이해를 한다.

이러한 부분들이 SW 개발에 있어서 많은 도움을 줄 것으로 예상한다. 

그래서 그냥 NLP 공부겸 SW개발에 도움이 될 것으로 생각하고 그냥 다음의 '드래곤책'이라고 불리는 책을 가지고 공부를 시작한다.

기사와 용이 싸우는 모습을 책 표지로 한 것은 컴파일러를 공부한다는 것은 용과 싸우는 것처럼 매우 어렵기 때문이라는 썰을 여기저기서 주워들었다.




'Compilers(Principles,Techniques,&Tools)' 카테고리의 다른 글

채워야할 부분.  (0) 2019.02.03
Preface  (0) 2019.02.02

+ Recent posts