Phases of translation
Phases of translation--翻译阶段
The C++ source file is processed by the compiler as if the following phases take place, in this exact order:
Phase 1 --96个basic source character set
- The individual bytes of the source code file are mapped(in implementation defined manner) to the characters of the basic source character set.In particular, OS-dependent end-of-line indicators are replaced by newline character. The basic source character set consists of 96 characters:--96个基本字符
a) 5 whitespace characters(space, horizontal tab, vertical tab, form feed, new-line)
b) 10 digit characters from0
to9
c) 52 letters froma
toz
and fromA
toZ
d) 29 punctuation characters:_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " ’
- Any source file character that cannot be mapped to a character in basic source character set is replaced by its universal character name (escaped with \u or \U) or by some internal form that is handled equivalently.--转义字符
- Trigraph sequences are replaced by corresponding single-character representations.(until C++17)
Phase 2--backslash-反斜线
- Whenever backslash appears at the end of a line (immediately followed by the newline character), both backslash and newline are deleted, combining two physical source lines into one logical source line.
This is a single-pass operation; a line ending in two backslashes followed by an empty line does not combine three lines into one. If a universal character name (\uXXX) is formed on this phase, the behavior is undefined. If a non-empty source file does not end with a newline character after this step (whether it had no newline originally, or it ended with a backslash), the behavior is undefined (until C++11) a terminating newline character is added (since C++11).
Phase 3--header,identifiers,numbers,character and string literal
- The source file is decomposed into comments, sequences of whitespace characters (space, horizontal tab, new-line, vertical tab, and form-feed), and preprocessing tokens, which are the following:
- header names such as or "myfile.h" (only recognized after #include)
- identifiers
- numbers
- character and string literal(including alternative tokens),such as +, <<=, new, <%, ##, or and
- individual non-whitespace characters that do not fit in any other category
- Any transformations performed during phases 1 and 2 between the initial and the final double quote of any raw string literal are reverted. (since C++11)
- Each comment is replaced by one space character.
Newlines are kept, and it's unspecified whether non-newline whitespace sequences may be collapsed into single space characters.
Phase 4 --preprocessor
- The preprocessor is executed.
- Each file introduced with the #include directive goes through phases 1 through 4, recursively.
At the end of this phase, all preprocessor directives are removed from the source.
Phase 5--character and string literal
- All characters in character literals and string literals are converted from the source character set to the execution character set (which may be a multibyte character set such as UTF-8, as long as the 96 characters of the basic source character set listed in phase 1 have single-byte representations).
Escape sequences and universal character names in character literals and non-raw string literals are expanded and converted to the execution character set. If the character specified by a universal character name isn't a member of the execution character set, the result is implementation-defined, but is guaranteed not to be a null (wide) character。
Phase 6
Adjacent string literals are concatenated.
Phase 7-- translated as a translation unit
Compilation takes place: the tokens are syntactically and semantically analyzed and translated as a translation unit.
Phase 8 -- instantiation unit
Each translation unit is examined to produce a list of required template instantiations, including the ones requested by explicit instantiations. The definitions of the templates are located, and the required instantiations are performed to produce instantiation units.
Phase 9
Translation units, instantiation units, and library components needed to satisfy external references are collected into a program image which contains information needed for execution in its execution environment.
Some compilers don't implement instantiation units (also known as template repositories or template registries) and simply compile each template instantiation at Phase 7, storing the code in the object file where it is implicitly or explicitly requested, and then the linker collapses these compiled instantiations into one at Phase 9
Phases of translation的更多相关文章
- C++预处理详解
本文在参考ISO/IEC 14882:2003和cppreference.com的C++ Preprocessor的基础上,对C++预处理做一个全面的总结讲解.如果没有特殊说明,所列内容均依据C++9 ...
- C++ 字面量
https://docs.microsoft.com/en-us/cpp/cpp/string-and-character-literals-cpp?view=vs-2017 C++ supports ...
- The C Programming Language Second Edition
%12d at least #include <stdio.h> main() { ,sum=,w=; ; ; w<=end; w++ ) { sum+=w; // for(wb= ...
- 浅谈C++编译原理 ------ C++编译器与链接器工作原理
原文:https://blog.csdn.net/zyh821351004/article/details/46425823 第一篇: 首先是预编译,这一步可以粗略的认为只做了一件事情,那就 ...
- Logical query-processing phases
Logical query-processing phases in brief (1) FROM This phase identifies the query’s source tables an ...
- Introduction to Neural Machine Translation - part 1
The Noise Channel Model \(p(e)\): the language Model \(p(f|e)\): the translation model where, \(e\): ...
- Datatypes translation between Oracle and SQL Server
Datatypes translation between Oracle and SQL Server part 1: character, binary strings Datatypes tran ...
- Network Address Translation(转载)
Network Address Translation 来源:http://alexanderlaw.blog.hexun.com/9791596_d.html 地址转换用来改变源/目的 ...
- [Google Translation API v2 for Java]
Reference:https://cloud.google.com/translate/docs/reference/libraries#java-resources QuickstartSampl ...
随机推荐
- IOS 特定于设备的开发:使用加速能力“向上定位”
iPhone提供了3个机载的传感器,用于沿着iPhone的3根相互垂直的轴(左/右(x轴).上/下(y轴)和前/后(z轴))度量加速能力.这些值指示作用于iPhone的力,它们来自重力和用户移动.可以 ...
- 安装64位Oracle 10g超详细教程
安装64位Oracle 10g超详细教程 1. 安装准备阶段 1.1 安装Oracle环境 经过上一篇博文的过程,已经完成了对Linux系统的安装,本例使用X-Manager来实现与Linux系统的连 ...
- 转载:Ajax及 GET、POST 区别
转载:Ajax及 GET.POST 区别 收获: xhr.setRequestHeader(), xhr.getResponseHeader() 可以设置和获取请求头/响应头信息; new FormD ...
- Html 小插件5 百度搜索代码2
网页添加百度搜索框代码大全 ★ 用法:在下面选择合适的样式,复制代码到网页中相应位置粘贴即可. ★ 样式一(200×30)代码: <iframe id="baiduframe" ...
- 随手写了一个linux服务端与window客户端的epoll程序,当做练习把。
linux服务端:监听链接,处理消息 #include <sys/socket.h> #include <sys/epoll.h> #include <n ...
- LuCI探究(转)
原文链接 : http://www.cnblogs.com/gnuhpc/archive/2013/08/31/3293643.html 1. 多语言 1)检查: opkg list | grep l ...
- UVA - 1103Ancient Messages(dfs)
UVA - 1103Ancient Messages In order to understand early civilizations, archaeologists often study te ...
- Linux/UNIX进程控制(1)
进程控制(1) 进程标识符 每一个进程都有肺腑的整形表示唯一的进程ID.按一个进程终止后,其进程ID就能够再次使用了.例如以下是几个典型进程的ID及其类型和功能. ID 进程名 ...
- DEV GridControl 小结(持续添加)
一.属性: 1.Views OptionsBehavior=>Editable:False 列表不可编辑 OptionsSelection=>EnableAppearanceFocuse ...
- jquery的extend()函数
extend()是在写插件的过程中常用的方法,该方法有一些重载原型. 1.该方法的原型是: extend(dest,src1,src2,src3...); 它的含义是将src1,src2,src3.. ...