본문 바로가기

공부/컴퓨터

SQLite 아키텍쳐 문서 번역본. ( 번역기 수준임 -_- )

반응형
원문 주소 : http://www.sqlite.org/arch.html



The Architecture Of SQLite

SQLlite의 아키텍쳐



(This page was last modified on 2003/03/19 03:14:03 UTC)

(이 페이지의 최종 수정일 2003/03/19 03:14:03 )



Introduction - 소개






Block Diagram Of SQLite

This document describes the architecture of the SQLite library.
The information here is useful to those who want to understand or
modify the inner workings of SQLite.




A block diagram showing the main components of SQLite
and how they interrelate is shown at the right.  The text that
follows will provide a quick overview of each of these components.




이문서는 sqlite라이부러리의 구조를 설명하였다. 이정보는 sqlite의 내부 동작을 이해하거나 수정하기를원하는사람에게 유용할것이다.

sqlite의 메인 콤포넌트와 흐름을 "Block Diagram Of SQL"에서 잘보여주고 잇따. 이 지면의 아래서 부터는 각각의 콤포넌트의 오브뷰를 잘 보여주고 있따.



Interface - 인터페이스



Most of the public interface to the SQLite library is implemented by
four functions found in the main.c source file.  The
sqlite_get_table() routine is implemented in table.c.
The Tcl interface is implemented by tclsqlite.c.  More
information on the C interface to SQLite is
available separately.



To avoid name collisions with other software, all external
symbols in the SQLite library begin with the prefix sqlite.
Those symbols that are intended for external use (in other words,
those symbols which form the API for SQLite) begin
with sqlite_.


대부분 sqlite의 인터페이스(c에서 뭐 이걸 쓰먹기 위해서 호출되는 함수?정도)는 main.c안에 있는 4개의 함수에서 발견할수있다.
sqlite_get_table()루틴은 table.c안에 있다.
tcl인터페이스는 tclsqlite.c에 구현되어 잇다.
c인터페이스에 대한 더 많은 정보는 따로 잇따.(available separately.)

다른 소프트웨어와 이름중복을 피하기위해서 sqlite는 sqlite라는 접두사를 모든 익스턴 씸볼로 붙였따-_-;
( 대충 : sqlite_ 로 시작하는 api 함수를 사용. )


Tokenizer



When a string containing SQL statements is to be executed, the
interface passes that string to the tokenizer.  The job of the tokenizer
is to break the original string up into tokens and pass those tokens
one by one to the parser.  The tokenizer is hand-coded in C.
All of the code for the tokenizer
is contained in the tokenize.c source file.



Note that in this design, the tokenizer calls the parser.  People
who are familiar with YACC and BISON may be used to doing things the
other way around -- having the parser call the tokenizer.  The author
of SQLite
has done it both ways and finds things generally work out nicer for
the tokenizer to call the parser.  YACC has it backwards.



실행하고하는 sql문이 포함된 문자열의 경우 인터페이스는 스트링을 토큰라이져에게 넘긴다.
토큰라이져의 일은 파써가 하나하나 전달받을수 있게 짤라주는것이다.
이 토큰라이져는 c언어로 직접코딩되어져 있다. 이 모든 코드는 tokenize.c에 있따



이 구조에서 토큰라이즈는 파써를 호출하게되어 있다.
YACC나 BISON에 익숙해있는 사람들은 아마 다른 방식으로 구현했을것이다
-- 파쓰가 토큰라이져를 call하는것과 같은..
sqlite의 제작자는 이 두가지 방법중에 파쓰에 의해서
토큰라이즈가 호출되는건 배제햇따. YACC는 이것과는 전혀틀릴것이다.




Parser



The parser is the piece that assigns meaning to tokens based on
their context.  The parser for SQLite is generated using the
Lemon LALR(1) parser
generator.  Lemon does the same job as YACC/BISON, but it uses
a different input syntax which is less error-prone.
Lemon also generates a parser which is reentrant and thread-safe.
And lemon defines the concept of a non-terminal destructor so
that it does not leak memory when syntax errors are encountered.
The source file that drives Lemon is found in parse.y.



Because
lemon is a program not normally found on development machines, the
complete source code to lemon (just one C file) is included in the
SQLite distribution in the "tool" subdirectory.  Documentation on
lemon is found in the "doc" subdirectory of the distribution.




파쓰는 어떤 문맥의 기본이 되는 토큰들에 의미를 할당하는 부분이다.
sqlite의 파쓰는 Lemon의 "Lemon Lalr"의 사용법에서 유래되엇따.
Lemon은 YACC와 BISON과 같은 일을 하지만
이것은 다른 좀더 적은 에러를 발생시키는 입력문법을 가지고 있다.
Lemon은 thread-safe이며 (제진입가능하게) 구현되어있다.
Lemon의 소스화일은 parse.y안에 잇따.



Lemon은 개발자 컴터에서 보통 발견할수 없는것이기에
이것의 완벽한 소스코드가(겨우 1개의 c화일이다.) sqlite의 tool안에 분리되어 있다.
lemon의 문서는 doc안에 있을것이다.





Code Generator - 코드 생성기



After the parser assembles tokens into complete SQL statements,
it calls the code generator to produce virtual machine code that
will do the work that the SQL statements request.  There are seven
files in the code generator:  build.c, delete.c,
expr.c, insert.c select.c, update.c,
and where.c.
In these files is where most of the serious magic happens.
expr.c handles code generation for expressions.
where.c handles code generation for WHERE clauses on
SELECT, UPDATE and DELETE statements.  The files
delete.c, insert.c, select.c, and
update.c handle the code generation for SQL statements
with the same names.  (Each of these files calls routines
in expr.c and where.c as necessary.)  All other
SQL statements are coded out of build.c.




파쓰가 완벽한 sql문의 토큰들을 모은후에 sql문을 실행하기 위한 버츌 머신코드를 생성하기 위해
코드제너레이트가 호출된다.
코드 제너레이트는 7개의 파일이 있따.
build.c, delete.c,
expr.c, insert.c select.c, update.c,
and where.c일케-_- 이들 파일은 각각 특정한일들을 수행한다.
expr.c는 코드발생을 다루는일을 한다.
where.c는 "WHERE"절의 코드발생을 담당한다.
delete.c, insert.c, select.c, 과
update.c는 파일이름과 동일한 sql구문의 코드발생을 담당한다.
(이 각파일들은 expr.c에서 호출되어지고 필요하다면 where.c에서 호출되어진다.)
모든 다른 sql문들은 build.c가 아닌곳에서 코드되어 있다.






Virtual Machine - 가상기계(어색하군-_-;)



The program generated by the code generator is executed by
the virtual machine.  Additional information about the virtual
machine is available separately.
To summarize, the virtual machine implements an abstract computing
engine specifically designed to manipulate database files.  The
machine has a stack which is used for intermediate storage.
Each instruction contains an opcode and
up to three additional operands.



The virtual machine is entirely contained in a single
source file vdbe.c.  The virtual machine also has
its own header file vdbe.h that defines an interface
between the virtual machine and the rest of the SQLite library.




코드제너레이트에의해서 발생된 것들은 버쳘머신에 의해 수행된다.
버츌머신에대해서 추가적인 정보는 따로 분리되어 있다.
간츄려 보믄은 버츌머신은 데이터베이스파일의 조작하기 위해서
특별히 뒤쟈인된 추상적인 연산 엔진이다.
이 머신은 중간결과물을 저장하기위해 스텍을 갖꼬 잇따.
각 명령문은 opcode와 3가지의 operand부분 포함한다.



이 버쳘머신은 vdbe.c요기 단일파일에 잇따.
vdbe.h에 존재하는 해드파일은 버쳘머신과
sqlite라이부러리의 나머지 찌꺼기가 포함되어있다.




B-tree Driver



An SQLite database is maintained on disk using a B-tree implementation
found in the btree.c source file.  A separate B-tree is used for
each table and index in the database.  All B-trees are stored in the
same disk file.  Each page of a B-tree is 1024 bytes in size.  

The key and data for an entry are stored together in an area called "payload".
Up to 236 bytes of payload can be stored on the same page as the B-tree
entry.  Any additional payload is stored in a chain of overflow pages.




The interface to the B-tree subsystem is defined by the header file
btree.h.




sqlite데이타베이스는 btree.c안에 잇는 b-tree에 의해 디스크에 보존되어 진다.
각각 테이블과 데이터베이스의 인덱스를 구현하는데 이 b-tree의 분리법은 사용된다.
모든 b-tree는 동일한 디스크 파일에 저장되어 진다.
각 b-tree는 1024바이트의 페이지 사이즈를 갖는다.



엔트리를 위한 키와 데이터는 "payload"라고 불리는 영역에 같이 저장된다.
payload의 상위 236바이트는 같은 B-tree 엔트리의 같은 페이지가 저장되어 질 수 있다.
부가적으로 payload는 오버플러우 페이지의 체인 저장되어 있다.
하부시스템을 위한 B-tree 의 인터페이스는 헤더화일인 btree.h에 정의되어 있다.




Page Cache



The B-tree module requests information from the disk in 1024 byte
chunks.  The page cache is responsible for reading, writing, and
caching these chunks.

The page cache also provides the rollback and atomic commit abstraction
and takes care of reader/writer locking of the database file.  

The B-tree driver requests particular pages from the page cache
and notifies the page cache when it wants to modify pages or commit or rollback changes
and the page cache handles all the messy details of making sure
the requests are handled quickly, safely, and efficiently.



The code to implement the page cache is contained in the single C
source file pager.c.  The interface to the page cache subsystem
is defined by the header file pager.h.




B-tree 모듈은 디스크에서 1024바이트의 공간(chunks)를 요구한다.
페이지 캐쉬 ( 읽기, 쓰기, 캐쉬 ) 에 이공간(chunks) 사용되기 때문이다.

페이지캐쉬는 또한 rollback과 commit(atomic commit abstraction),
읽고 쓸때 데이타베이스 화일에 lock을 걸어 줄때 사용된다.

B-Tree는 페이지 캐쉬에서 일부분의 페이지를 요청하여 작동된다.
그리고 페이지 캐쉬는 수정된 페이지나 commit 나 rollback 될때 통지 된다.
그리고 페이지 캐쉬는 모든 자질구레한 (messy details) 것들을
빠르고 안전하게, 그리고 효과적으로 처리한다(requests are handled).



페이지 캐쉬 구현(code to implement)은 1개의 C 화일인 pager.c에 있다(contained).
페이지캐쉬 하위시스템과의 인터페이스는 헤더화일인 pager.h 화일에 정의(defined)되어 있다.






OS Interface





In order to provide portability between POSIX and Win32 operating systems,
SQLite uses an abstraction layer to interface with the operating system.


The os.c file contains about 20 routines used for opening and
closing files, deleting files, creating and deleting locks on files,
flushing the disk cache, and so forth.  


Each of these functions contains two implementations separated by
#ifdefs: one for POSIX and the other for Win32.  

The interface to the OS abstraction layer is defined by the os.h header file.


SQLlite는 이식성을 지원하기 위해 POSIX와 Win32운영체제의 추상레이어를 사용한다.


os.c 화일은 open, delete, create, locks, 디스크캐쉬등에 사용되는
일들을 하는 대략 20여개 의 루틴을 포함하고 있다.


각각의 함수(functions)들은 POSIX와 Win32 의 기종에 적합하도록 하기 위해 #ifdefs 를 포함하고 있다.


OS의 추상계층의 인터페이스는 os.h 의 헤더화일에 정의되어 있다.









Back to the SQLite Home Page




번역일 : 2004년 1월 8일

역자 : 쓩 ( http://220.85.19.55/mypage/ ) , Chan ( http://ggaman.com )

이 문서에 대해 어떠한 책임도 지지 않음 -_-;;;;;;;;;;;;;;;;;;;;;;;;
반응형