
编译过程
新建一个OC文件
$ touch main.m
$ open main.m
#import <Foundation/Foundation.h>
int main (){
NSLog(@"Hello world");
return 0;
}
$ Esc + wq
$ clang -fmodules main.m -o main
$ ./main.m
输出:2019-05-06 17:10:43.729 main[39014:5180936] Hello world
$ clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

语法结构
TranslationUnitDecl 0x7fbe6d80aae8 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x7fbe6d80b380 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x7fbe6d80b080 '__int128'
|-TypedefDecl 0x7fbe6d80b3e8 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x7fbe6d80b0a0 'unsigned __int128'
|-TypedefDecl 0x7fbe6d80b480 <<invalid sloc>> <invalid sloc> implicit SEL 'SEL *'
| `-PointerType 0x7fbe6d80b440 'SEL *' imported
| `-BuiltinType 0x7fbe6d80b2e0 'SEL'
|-TypedefDecl 0x7fbe6d80b558 <<invalid sloc>> <invalid sloc> implicit id 'id'
| `-ObjCObjectPointerType 0x7fbe6d80b500 'id' imported
| `-ObjCObjectType 0x7fbe6d80b4d0 'id' imported
|-TypedefDecl 0x7fbe6d80b638 <<invalid sloc>> <invalid sloc> implicit Class 'Class'
| `-ObjCObjectPointerType 0x7fbe6d80b5e0 'Class' imported
| `-ObjCObjectType 0x7fbe6d80b5b0 'Class' imported
|-ObjCInterfaceDecl 0x7fbe6d80b688 <<invalid sloc>> <invalid sloc> implicit Protocol
|-TypedefDecl 0x7fbe6c0209e8 <<invalid sloc>> <invalid sloc> implicit __NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x7fbe6c020800 'struct __NSConstantString_tag'
| `-Record 0x7fbe6d80b750 '__NSConstantString_tag'
|-TypedefDecl 0x7fbe6c020a80 <<invalid sloc>> <invalid sloc> implicit __builtin_ms_va_list 'char *'
| `-PointerType 0x7fbe6c020a40 'char *'
| `-BuiltinType 0x7fbe6d80ab80 'char'
|-TypedefDecl 0x7fbe6c020d48 <<invalid sloc>> <invalid sloc> implicit __builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x7fbe6c020cf0 'struct __va_list_tag [1]' 1
| `-RecordType 0x7fbe6c020b70 'struct __va_list_tag'
| `-Record 0x7fbe6c020ad0 '__va_list_tag'
|-ImportDecl 0x7fbe6d8fb0f8 <main.m:1:1> col:1 implicit Foundation
|-FunctionDecl 0x7fbe6d8fb180 <line:2:1, line:5:1> line:2:5 main 'int ()'
| `-CompoundStmt 0x7fbe6d2c1240 <col:12, line:5:1>
| |-CallExpr 0x7fbe6d2c11c0 <line:3:5, col:25> 'void'
| | |-ImplicitCastExpr 0x7fbe6d2c11a8 <col:5> 'void (*)(id, ...)' <FunctionToPointerDecay>
| | | `-DeclRefExpr 0x7fbe6d2c1090 <col:5> 'void (id, ...)' Function 0x7fbe6d8fb280 'NSLog' 'void (id, ...)'
| | `-ImplicitCastExpr 0x7fbe6d2c11f0 <col:11, col:12> 'id':'id' <BitCast>
| | `-ObjCStringLiteral 0x7fbe6d2c1130 <col:11, col:12> 'NSString *'
| | `-StringLiteral 0x7fbe6d2c10f8 <col:12> 'char [12]' lvalue "Hello world"
| `-ReturnStmt 0x7fbe6d2c1228 <line:4:5, col:12>
生成汇编:
$ clang -S main.m -o main.s
$ vim main.s
## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
subq $16, %rsp
leaq L__unnamed_cfstring_(%rip), %rax
movl $0, -4(%rbp)
movq %rax, %rdi
movb $0, %al
callq _NSLog
xorl %eax, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
## -- End function
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "Hello world"
.section __DATA,__cfstring
.p2align 3 ## @_unnamed_cfstring_
L__unnamed_cfstring_:
.quad ___CFConstantStringClassReference
.long 1992 ## 0x7c8
.space 4
.quad L_.str
.quad 11 ## 0xb
.section __DATA,__objc_imageinfo,regular,no_dead_strip
L_OBJC_IMAGE_INFO:
.long 0
.long 64
.subsections_via_symbols