summaryrefslogtreecommitdiff
path: root/miniany/doc/en.wikibooks.org_wiki_Compiler_Construction_Introduction.txt
blob: 195b0110d4301f5c7ef4bac4ab1a62cb88586fb5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
   #[1]alternate [2]Edit [3]Wikibooks (en) [4]Wikibooks Atom feed

Compiler Construction/Introduction

   From Wikibooks, open books for an open world
   < [5]Compiler Construction
   [6]Jump to navigation [7]Jump to search

Introducing Compilers and Interpreters[[8]edit | [9]edit source]

   A compiler is a computer program that implements a programming language
   specification to "translate" programs, usually as a set of files which
   constitute the source code written in source language, into their
   equivalent machine readable instructions (the target language, often
   having a binary form known as object code). This translation process is
   called compilation. We compile the source program to create the
   compiled program. The compiled program can then be run (or executed) to
   do what was specified in the original source program.

   The source language is always a higher-level language in comparison to
   machine code, written using some mixture of English words and
   mathematical notation, assembly language being the lowest compilable
   language (an assembler being a special case of a compiler that
   translates assembly language into machine code). Higher-level languages
   are the most complex to support in a compiler/interpreter, not only
   because they increase the level of abstraction between the source code
   and the resulting machine code, but because increased complexity is
   required to formalize those abstract structures.

   The target language is normally a low-level language such as assembly,
   written with somewhat cryptic abbreviations for machine instructions,
   in these cases it will also run an assembler to generate the final
   machine code. But some compilers can directly generate machine code for
   some actual or virtual computer e.g. byte-code for the Java Virtual
   Machine.

   Another common approach to the resulting compilation effort is to
   target a virtual machine. That will do just-in-time compilation and
   byte-code interpretation and blur the traditional categorizations of
   compilers and interpreters.

   For example, C and C++ will generally be compiled for a target
   `architecture'. The draw-back is that because there are many types of
   processor there will need to be as many distinct compilations. In
   contrast Java will target a Java Virtual Machine, which is an
   independent layer above the 'architecture'. The difference is that the
   generated byte-code, not true machine code, brings the possibility of
   portability, but will need a Java Virtual Machine (the byte-code
   interpreter) for each platform. The extra overhead of this byte-code
   interpreter means slower execution speed.

   An interpreter is a computer program which executes the translation of
   the source program at run-time. It will not generate independent
   executable programs nor object libraries ready to be included in other
   programs.

   A program which does a lot of calculation or internal data manipulation
   will generally run faster in compiled form than when interpreted. But a
   program which does a lot of input/output and very little calculation or
   data manipulation may well run at about the same speed in either case.

   Being themselves computer programs, both compilers and interpreters
   must be written in some implementation language. Up until the early
   1970's, most compilers were written in assembly language for some
   particular type of computer. The advent of C and Pascal compilers, each
   written in their own source language, led to the more general use of
   high-level languages for writing compilers. Today, operating systems
   will provide at least a free C compiler to the user and some will even
   include it as part of the OS distribution.

   Compiler construction is normally considered as an advanced rather than
   a novice programming task, mainly due to the quantity of code needed
   (and the difficulties of grokking this amount of code) rather than the
   difficulty of any particular coding constructs. To this most books
   about compilers have some blame. The large gap between production
   compilers and educational exercises promotes this defeatist view.

   For the first version of a compiler written in its own source language
   you have a [10]bootstrapping problem. Once you get a simple version
   working, you can then use it to improve itself.

   Note:
   A compiler is a non-trivial computer program; when written completely
   by hand a non-optimizing compiler for a simple source language is
   likely to be upwards of 3000 lines long. Some compiler-writing tools
   are available which can reduce this size, but will add the
   corresponding dependencies.

   The compilation process

   At the highest level, compilation is broken into a number of parts:
    1. Lexical analysis (tokenizing)
    2. Syntax analysis (parsing)
    3. Type checking
    4. Code generation

   Note:
   You should read most of this chapter, since the rest of the book will
   assume it as background information.

Requirements[[11]edit | [12]edit source]

   Any compiler has some essential requirements, which are perhaps more
   stringent than for most programs:
     * Any valid program must be translated correctly, i.e. no incorrect
       translation is allowed.
     * Any invalid program must be rejected and not translated.

   There will inevitably be some valid programs which can't be translated
   due to their size or complexity in relation to the hardware available,
   for example problems due to memory size. The compiler may also have
   some fixed-size tables which place limits on what can be compiled (some
   language definitions place explicit lower bounds on the sizes of
   certain tables, to ensure that programs of reasonable size/complexity
   can be compiled).

   There are also some desirable requirements, some of which may be
   mutually exclusive:
     * Errors should be reported in terms of the source language or
       program.
     * The position at which an error was detected should be indicated; if
       the actual error probably occurred somewhat earlier then some
       indication of possible cause(s) should also be provided.
     * Compilation should be fast.
     * The translated program should be fast.
     * The translated program should be small.
     * If the source language has some national or international standard:
          + Ideally the entire standard should be implemented.
          + Any restrictions or limits should be well and clearly
            documented.
          + If extensions to the standard have been implemented:
               o These extensions should be documented as such.
               o There should be some way of turning these extensions off.

   There are also some possibly controversial requirements to consider
   (see chapter on [13]dealing with errors):
     * Errors detected when the translated program is running should still
       be reported in relation to the original source program e.g. line
       number.
     * Errors detected when the translated program is running should
       include division by 0, running out of memory, use of an array
       subscript/index which is too big or too small, attempted use of an
       undefined variable, incorrect use of pointers, etc.

Overall Structure[[14]edit | [15]edit source]

   For ease of exposition we will divide the compiler into a front end and
   a back end. These need not even be written in the same implementation
   language, providing they can communicate effectively via some
   intermediate representation.

   The following list itemizes the tasks carried out by the front end and
   the back end. Note that the tasks are not carried out in any particular
   order, as outlined below, and discussed in more detail in subsequent
   chapters.
     * Front end
          + lexical analysis - convert characters to tokens
          + syntax analysis - check for valid sequence of tokens
          + semantic analysis - check for meaning
          + some global/high-level optimization

     * Back end
          + some local optimization
          + register allocation
          + peep-hole optimization
          + code generation
          + instruction scheduling

   Almost all the source-language aspects are handled by the front end. It
   is possible to have different front ends for different high-level
   languages, and a common back end which does most of the optimization.

   Almost all the machine-dependent aspects are handled by the back end.
   It is possible to have different back ends for different computers so
   that the compiler can produce code for different computers.

   The front end is normally controlled by the syntax analysis processing.
   As necessary, the syntax analysis code will call a routine which
   performs some lexical analysis and returns the next token. At selected
   points during syntax analysis, appropriate semantic routines are called
   which perform any relevant semantic checks and/or add information to
   the internal representation.

   [16]Next - Describing a Programming Language
   Retrieved from
   "[17]https://en.wikibooks.org/w/index.php?title=Compiler_Construction/I
   ntroduction&oldid=3357979"
   [18]Category:
     * [19]Book:Compiler Construction

Navigation menu

Personal tools

     * Not logged in
     * [20]Discussion for this IP address
     * [21]Contributions
     * [22]Create account
     * [23]Log in

Namespaces

     * [24]Book
     * [25]Discussion

   [ ] English

Views

     * [26]Read
     * [27]Edit
     * [28]Edit source
     * [29]View history

   [ ] More

Search

   ____________________ Search Go

Navigation

     * [30]Main Page
     * [31]Help
     * [32]Browse
     * [33]Cookbook
     * [34]Wikijunior
     * [35]Featured books
     * [36]Recent changes
     * [37]Donations
     * [38]Random book
     * [39]Using Wikibooks

Community

     * [40]Reading room forum
     * [41]Community portal
     * [42]Bulletin Board
     * [43]Help out!
     * [44]Policies and guidelines
     * [45]Contact us

Tools

     * [46]What links here
     * [47]Related changes
     * [48]Upload file
     * [49]Special pages
     * [50]Permanent link
     * [51]Page information
     * [52]Cite this page
     * [53]Get shortened URL

Sister projects

     * [54]Wikipedia
     * [55]Wikiversity
     * [56]Wiktionary
     * [57]Wikiquote
     * [58]Wikisource
     * [59]Wikinews
     * [60]Wikivoyage
     * [61]Commons
     * [62]Wikidata
     * [63]MediaWiki
     * [64]Meta-Wiki

Print/export

     * [65]Create a collection
     * [66]Download as PDF
     * [67]Printable version

In other languages

   [68]Add links

     * This page was last edited on 5 January 2018, at 20:05.
     * Text is available under the [69]Creative Commons
       Attribution-ShareAlike License; additional terms may apply. By
       using this site, you agree to the [70]Terms of Use and [71]Privacy
       Policy.

     * [72]Privacy policy
     * [73]About Wikibooks
     * [74]Disclaimers
     * [75]Code of Conduct
     * [76]Developers
     * [77]Statistics
     * [78]Cookie statement
     * [79]Mobile view

     * [80]Wikimedia Foundation
     * [81]Powered by MediaWiki

References

   Visible links:
   1. https://en.m.wikibooks.org/wiki/Compiler_Construction/Introduction
   2. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=edit
   3. https://en.wikibooks.org/w/opensearch_desc.php
   4. https://en.wikibooks.org/w/index.php?title=Special:RecentChanges&feed=atom
   5. https://en.wikibooks.org/wiki/Compiler_Construction
   6. https://en.wikibooks.org/wiki/Compiler_Construction/Introduction#mw-head
   7. https://en.wikibooks.org/wiki/Compiler_Construction/Introduction#searchInput
   8. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&veaction=edit&section=1
   9. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=edit&section=1
  10. https://en.wikipedia.org/wiki/Bootstrapping_(compilers)
  11. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&veaction=edit&section=2
  12. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=edit&section=2
  13. https://en.wikibooks.org/wiki/Compiler_Construction/Dealing_with_errors
  14. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&veaction=edit&section=3
  15. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=edit&section=3
  16. https://en.wikibooks.org/wiki/Compiler_Construction/Describing_a_Programming_Language
  17. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&oldid=3357979
  18. https://en.wikibooks.org/wiki/Special:Categories
  19. https://en.wikibooks.org/wiki/Category:Book:Compiler_Construction
  20. https://en.wikibooks.org/wiki/Special:MyTalk
  21. https://en.wikibooks.org/wiki/Special:MyContributions
  22. https://en.wikibooks.org/w/index.php?title=Special:CreateAccount&returnto=Compiler+Construction%2FIntroduction
  23. https://en.wikibooks.org/w/index.php?title=Special:UserLogin&returnto=Compiler+Construction%2FIntroduction
  24. https://en.wikibooks.org/wiki/Compiler_Construction/Introduction
  25. https://en.wikibooks.org/wiki/Talk:Compiler_Construction/Introduction
  26. https://en.wikibooks.org/wiki/Compiler_Construction/Introduction
  27. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&veaction=edit
  28. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=edit
  29. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=history
  30. https://en.wikibooks.org/wiki/Main_Page
  31. https://en.wikibooks.org/wiki/Help:Contents
  32. https://en.wikibooks.org/wiki/Wikibooks:Card_Catalog_Office
  33. https://en.wikibooks.org/wiki/Cookbook:Table_of_Contents
  34. https://en.wikibooks.org/wiki/Wikijunior
  35. https://en.wikibooks.org/wiki/Wikibooks:Featured_books
  36. https://en.wikibooks.org/wiki/Special:RecentChanges
  37. https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikibooks.org&uselang=en
  38. https://en.wikibooks.org/wiki/Special:RandomInCategory/Book:Wikibooks_Stacks/Books
  39. https://en.wikibooks.org/wiki/Using_Wikibooks
  40. https://en.wikibooks.org/wiki/Wikibooks:Reading_room
  41. https://en.wikibooks.org/wiki/Wikibooks:Community_Portal
  42. https://en.wikibooks.org/wiki/Wikibooks:Reading_room/Bulletin_Board
  43. https://en.wikibooks.org/wiki/Wikibooks:Maintenance
  44. https://en.wikibooks.org/wiki/Wikibooks:Policies_and_guidelines
  45. https://en.wikibooks.org/wiki/Wikibooks:Contact_us
  46. https://en.wikibooks.org/wiki/Special:WhatLinksHere/Compiler_Construction/Introduction
  47. https://en.wikibooks.org/wiki/Special:RecentChangesLinked/Compiler_Construction/Introduction
  48. https://commons.wikimedia.org/wiki/Special:UploadWizard?uselang=en
  49. https://en.wikibooks.org/wiki/Special:SpecialPages
  50. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&oldid=3357979
  51. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&action=info
  52. https://en.wikibooks.org/w/index.php?title=Special:CiteThisPage&page=Compiler_Construction%2FIntroduction&id=3357979&wpFormIdentifier=titleform
  53. https://en.wikibooks.org/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fen.wikibooks.org%2Fwiki%2FCompiler_Construction%2FIntroduction
  54. https://en.wikipedia.org/wiki/Main_Page
  55. https://en.wikiversity.org/wiki/Wikiversity:Main_Page
  56. https://en.wiktionary.org/wiki/Wiktionary:Main_Page
  57. https://en.wikiquote.org/wiki/Main_Page
  58. https://en.wikisource.org/wiki/Main_Page
  59. https://en.wikinews.org/wiki/Main_Page
  60. https://en.wikivoyage.org/wiki/Main_Page
  61. https://commons.wikimedia.org/wiki/Main_Page
  62. https://www.wikidata.org/wiki/Wikidata:Main_Page
  63. https://www.mediawiki.org/wiki/Main_Page
  64. https://meta.wikimedia.org/wiki/Main_Page
  65. https://en.wikibooks.org/w/index.php?title=Special:Book&bookcmd=book_creator&referer=Compiler+Construction%2FIntroduction
  66. https://en.wikibooks.org/w/index.php?title=Special:DownloadAsPdf&page=Compiler_Construction%2FIntroduction&action=show-download-screen
  67. https://en.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&printable=yes
  68. https://www.wikidata.org/wiki/Special:NewItem?site=enwikibooks&page=Compiler+Construction%2FIntroduction
  69. https://creativecommons.org/licenses/by-sa/4.0/
  70. https://foundation.wikimedia.org/wiki/Terms_of_Use
  71. https://foundation.wikimedia.org/wiki/Privacy_policy
  72. https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy
  73. https://en.wikibooks.org/wiki/Wikibooks:Welcome
  74. https://en.wikibooks.org/wiki/Wikibooks:General_disclaimer
  75. https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct
  76. https://developer.wikimedia.org/
  77. https://stats.wikimedia.org/#/en.wikibooks.org
  78. https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement
  79. https://en.m.wikibooks.org/w/index.php?title=Compiler_Construction/Introduction&mobileaction=toggle_view_mobile
  80. https://wikimediafoundation.org/
  81. https://www.mediawiki.org/

   Hidden links:
  83. https://en.wikibooks.org/wiki/Main_Page