仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2020|回复: 19
打印 上一主题 下一主题

[学习教程] IOS编程之iOS系列译文:编译器仓酷云

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:32:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有一些像NSCopying的接口(经@李禹龙提醒应该叫协议)不是特别用到开始不用了解NSObject创建对象的时候用+(id)alloc方法创建后需要init方法初始化编译器做些甚么?

本文次要切磋一下编译器次要做些甚么,和怎样无效的使用编译器。
复杂的说,编译器有两个职责:把Objective-C代码转化成初级代码,和对代码做剖析,确保代码中没有任何分明的毛病。
如今,Xcode的默许编译器是clang。本文中我们提到的编译器都暗示clang。clang的功效是起首对Objective-C代码做剖析反省,然后将其转换为初级的类汇编代码:LLVMIntermediateRepresentation(LLVM两头表达码)。接着LLVM会实行相干指令将LLVMIR编译成方针平台上的当地字节码,这个历程的完成体例能够是立即编译(Just-in-time),或在编译的时分完成。
LLVM指令的一个优点就是能够在撑持LLVM的恣意平台上天生和运转LLVM指令。比方,你写的一个iOSapp,它能够主动的运转在两个完整分歧的架构(Inter和ARM)上,LLVM会依据分歧的平台将IR码转换为对应的当地字节码。
LLVM的长处次要得益于它的三层式架构—第一层撑持多种言语作为输出(比方C,ObjectiveC,C++和Haskell),第二层是一个共享式的优化器(对LLVMIR做优化处置),第三层是很多分歧的方针平台(比方Intel,ARM和PowerPC)。在这三层式的架构中,假如你想要增加一门言语到LLVM中,那末能够把主要精神会合到第一层上,假如想要增添别的一个方针平台,那末你没需要过量的思索输出言语。在书TheArchitectureofOpenSourceApplications中LLVM的创立者(ChrisLattner)写了一章很棒的内容:关于LLVM架构。
在编译一个源文件时,编译器的处置历程分为几个阶段。要想检察编译hello.m源文件必要几个分歧的阶段,我们可让经由过程clang命令察看:
1
2
3
4
5
6
7
8
%clang-ccc-print-phaseshello.m
0:input,"hello.m",objective-c
1:preprocessor,{0},objective-c-cpp-output
2:compiler,{1},assembler
3:assembler,{2},object
4:linker,{3},image
5:bind-arch,"x86_64",{4},image

本文我们将重点存眷第一阶段和第二阶段。在文章Mach-OExecutables中,Daniel会对第三阶段和第四阶段举行论述。
预处置

每当编源译文件的时分,编译器起首做的是一些预处置事情。好比预处置器会处置源文件中的宏界说,将代码中的宏用其对应界说的详细内容举行交换。
比方,假如在源文件中呈现下述代码:
1
#import<Foundation/Foundation.h>

预处置器对这行代码的处置是用Foundation.h文件中的内容往交换这行代码,假如Foundation.h中也利用了相似的宏引进,则会依照一样的处置体例用各个宏对应的真正代码举行逐级替换。
这也就是为何人们主意头文件最好只管少的往引进其他的类或库,由于引进的工具越多,编译器必要做的处置就越多。比方,在头文件顶用:
1
@classMyClass;

取代:
1
#import"MyClass.h"

这么写是告知编译器MyClass是一个类,而且在.m完成文件中能够经由过程importMyClass.h的体例来利用它。
假定我们写了一个复杂的C程序hello.c:
1
2
3
4
5
6
#include<stdio.h>
intmain(){
printf("helloworldn");
return0;
}

然后给下面的代码实行以下预处置命令,看看是甚么效果:
1
clang-Ehello.c|less

接上去看看处置后的代码,一共是401行。假如将以下一行代码增加到下面代码的顶部::
1
#import<Foundation/Foundation.h>

再实行一下下面的预处置命令,处置后的文件代码行数暴增至89,839行。这个数字比某些操纵体系的总代码行数还要多。
幸亏,今朝的情形已改良很多了:引进了模块&ndash;modules功效,这使预处置变得加倍的初级。
自界说宏

我们来看看别的一种情况界说大概利用自界说宏,好比界说了以下宏:
1
#defineMY_CONSTANT4

那末,但凡在此行宏界说感化域内,输出了MY_CONSTANT,在预处置过程当中MY_CONSTANT城市被交换成4。我们界说的宏也是能够照顾参数的,好比:
1
#defineMY_MACRO(x)x

鉴于本文的内容所限,就不合错误壮大的预处置做更多、更周全的睁开会商了。可是仍是要夸大一点,倡议人人不要在必要预处置的代码中到场内联代码逻辑。
比方,上面这段代码,如许用没甚么成绩:
1
2
3
4
5
6
#defineMAX(a,b)a>b?a:b
intmain(){
printf("largest:%dn",MAX(10,100));
return0;
}

可是假如换成这么写:
1
2
3
4
5
6
7
8
#defineMAX(a,b)a>b?a:b
intmain(){
inti=200;
printf("largest:%dn",MAX(i++,100));
printf("i:%dn",i);
return0;
}

用clang的max.c编译一下,了局是:
1
2
largest:201
i:202

用clang-Emax.c举行宏睁开的预处置了局是以下所示:
1
2
3
4
5
6
intmain(){
inti=200;
printf("largest:%dn",i++>100?i++:100);
printf("i:%dn",i);
return0;
}

本例是典范的宏利用不妥,并且一般这类成绩十分潜伏且难以debug。针对本例这类情形,最好利用staticinline:
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
staticconstintMyConstant=200;
staticinlineintmax(intl,intr){
returnl>r?l:r;
}
intmain(){
inti=MyConstant;
printf("largest:%dn",max(i++,100));
printf("i:%dn",i);
return0;
}

如许悔改以后,就能够输入一般的了局(i:201)。由于这里界说的代码是内联的(inlined),以是它的效力和宏变量差未几,可是牢靠性比宏界说要好很多。再者,还能够设置断点、范例反省和制止非常举动。
基础上,宏的最好利用场景是日记输入,可使用__FILE__和__LINE__和assert宏。
词法剖析标志

预处置完成今后,每个.m源文件里都有一堆的声明和界说。这些代码文本城市从string转化成特别的标志流。
比方,上面是一段复杂的Objective-Chelloword程序:
1
2
3
4
intmain(){
NSLog(@"hello,%@",@"world");
return0;
}

使用clang命令clang-Xclang-dump-tokenshello.m来将下面代码的标志流导出:
<p>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
intint[StartOfLine]Loc=<hello.m:4:1>
identifiermain[LeadingSpace]Loc=<hello.m:4:5>
l_paren(Loc=<hello.m:4:9>
r_paren)Loc=<hello.m:4:10>
l_brace{[LeadingSpace]Loc=<hello.m:4:12>
identifierNSLog[StartOfLine][LeadingSpace]Loc=<hello.m:5:3>
l_paren(Loc=<hello.m:5:8>
at@Loc=<hello.m:5:9>
<p>
若相依 该用户已被删除
沙发
发表于 2015-1-21 09:44:42 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
小妖女 该用户已被删除
板凳
 楼主| 发表于 2015-1-24 12:05:38 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
因胸联盟 该用户已被删除
地板
发表于 2015-1-25 09:07:27 | 只看该作者
down下code4app网站的每个分类的代码挨着看
只想知道 该用户已被删除
5#
发表于 2015-2-2 17:54:49 | 只看该作者
到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了
飘飘悠悠 该用户已被删除
6#
发表于 2015-2-8 03:18:55 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
再见西城 该用户已被删除
7#
发表于 2015-2-11 06:54:52 | 只看该作者
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
深爱那片海 该用户已被删除
8#
发表于 2015-2-18 09:46:22 | 只看该作者
近期由于IOS7的发布,所以应用的适配潮可谓是都搞的锣鼓喧天,甚是热闹,因此呢,因适配IOS7而产生的问题也是铺天盖地的卷来,
第二个灵魂 该用户已被删除
9#
发表于 2015-3-4 10:27:07 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
不帅 该用户已被删除
10#
发表于 2015-3-11 05:40:39 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
若天明 该用户已被删除
11#
发表于 2015-3-17 19:09:38 | 只看该作者
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
蒙在股里 该用户已被删除
12#
发表于 2015-3-24 20:48:03 | 只看该作者
边吃零食边看Stanford的视频教程
admin 该用户已被删除
13#
发表于 2015-3-27 15:11:57 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
变相怪杰 该用户已被删除
14#
发表于 2015-3-31 21:17:25 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
简单生活 该用户已被删除
15#
发表于 2015-4-1 11:10:16 | 只看该作者
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
分手快乐 该用户已被删除
16#
发表于 2015-4-2 02:53:59 | 只看该作者
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
小女巫 该用户已被删除
17#
发表于 2015-4-6 08:32:16 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
愤怒的大鸟 该用户已被删除
18#
发表于 2015-4-21 18:57:54 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
谁可相欹 该用户已被删除
19#
发表于 2015-4-26 22:54:40 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
透明 该用户已被删除
20#
发表于 2015-4-29 01:56:10 | 只看该作者
AD: iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 00:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表