×

object c 方舟 编译器

object c(方舟编译器是将java代码像C++静态编译,那么为什么安卓当时一开始为啥不用C++)

admin admin 发表于2023-03-07 20:17:36 浏览40 评论0

抢沙发发表评论

本文目录

方舟编译器是将java代码像C++静态编译,那么为什么安卓当时一开始为啥不用C++

华为方舟编译器可以编译C/C++,Java,JavaScript以及Kotlin,方舟编译器可以说是实现了几乎所有操作系统平台的通用开发语言的编译环境。

不过要强调的是方舟编译器并没有实现Java像C/C++一样的静态编译,方舟编译器本质上还是基于GCC的交叉编译套件,本身还是采用的预编译的方式,至于效率到底怎么样,目前也只是华为官方给出了一些数据,而且我找遍了华为开发者官网也没有找到这个工具。

安卓为什么不直接把C++作为主要开发语言

C++作为应用开发语言其实并不奇怪,在Windows上除了基于C#和.NET的Windows Form,macOS下则是Objective-C以及Swift,C++可以实现对几乎Linux/macOS/Windows三大平台的应用开发,诺基亚就曾将C++作为应用开发语言,当然最终也没能把生态搭建起来。那么作为以C/C++为核心技术栈的Google为什么不选择C++作为Android的核心开发语言呢?主要原因还是几点:

  • C++开发门槛相当高。C++是主流编程语言当中学习难度最大,学习成本最高,C++正式因为功能太强大了,一方面要兼容结构编程,又增加了面向对象编程,不够彻底的面向对象编程语言,又要做很多C语言才能做的事,学习门槛相对就高了很多。相对应的Java却是比较彻底的面向对象编程,学习门槛要低了很多。

  • C++代码能在任何平台下运行,不过在每个平台都需要单独重写、重新编译。这一点就相当的麻烦,Java本身就是完全跨平台的,也是完全开源免费的,一次开发到处运行,这样可以极大的降低研发成本。
  • Java拥有最丰富的开发者群体、最好的开源社区支持。不论是在美国本土,还是在其他国家,尤其是我国市场Java编程语言是行业第一大编程语言,是连续多年占据着TIOBLE编程语言榜单第一的编程语言,Java开发者群体的壮大让Android企业在人力方面的成本大大降低,基本上内部Java Web或者做企业级应用的都可以轻松转岗Android开发。

选择开发语言的时候我相信Google是做了很大的权衡的,毫无疑问Google最重要的技术栈是C/C++,要满足开发者群体足够、开源免费、门槛足够低、完全跨平台、兼顾到性能等等众多特点,你就会发现除了自己像苹果或者微软那样做一门编程语言,也就是Java最适合了。

方舟编译器到底如何还不确定

尽管华为已经明确表示了方舟编译器和鸿蒙OS操作系统都是开源的,不过到现在为止这两款工具都还没有正式开源,也许是华为还没有完全准备好将这两个重量级的产品推向开发者市场。

根据华为的资料显示,方舟编译器对于体验的提升是非常明显的,方舟编译器让系统操作流畅度提升24%,系统响应速度提升44%,第三方应用的操作流畅度提升了60%,不过目前这些数据都还是华为的实验室数据,一旦进入真正大规模使用的阶段,是不是能达到实验室的数据,我们还不得而知。

华为方舟编译器这事儿,如果要有机会还是的华为自己的鸿蒙操作系统上完全重新构建方舟编译器,方舟编译器本质上是基于GCC开发的交叉编译器套件,而华为方舟编译器仅仅也只是构建在Android这一个成熟的商业生态之上。从技术本质上讲,华为采用的是预编译技术,这玩意儿也不是新鲜事儿,Android也尝试过,可是预编译技术会产生一些大家众所周知的后遗症,你会产生大很多的固件文件。

华为是否能够有足够的号召力让开发者来使用方舟编译器,华为的消费者业务最终要走苹果封闭的商业模式还是Android开放的商业模式,目前华为选择了后者,可是华为自己也做手机,怎么处理和其他厂商的关系,这几年华为怼天怼地怼友商,不管是谁都要喷上几句,尤其是三星和小米,那么华为如何和这些厂商相处。

这些都是摆在华为面前要必须解决的问题,华为在技术方面一直都比较保守,到现在为止很多技术比如麒麟处理器也不愿意和其他厂商分享,很明显华为还是想自己占据技术的制高点,并不希望将自己核心的技术分享给其他厂商,那么华为会不会差别对待其他厂商,因此华为会不会对其他厂商一视同仁将直接决定华为这次革命的成败。


本文为字节跳动签约作者EmacserVimer悟空问答原创文章,未经允许转载、抄袭必究!

用过最反人类的语言是object-C,有同感么

没有同感!我觉得最反人类的语言是“斗图”!

object-c的发展历史

二十世纪80年代初布莱德·确斯(Brad Cox)在其公司Stepstone发明Objective-C。他对软件设计和编程里的真实可用度问题十分关心。 Objective-C最主要的描述是他1986年出版的Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.

object c和c++的区别

两者都是C语言的衍生,但C++完全不支持Objectice C,Objectice C仅仅支持部分C++特性(比如mm文件直接定义及实现类、函数指针等)。
Objective C在效率上比C++差一些(因为支持类反射,这样一来会有差距,而C++在这方面做得比较好),而且有些高级语言的底层支持C++(比如JNI)不支持Objectice C,导致Objectice C完全没名气。而且Objectice C因为好多API完全闭源也导致了现在也完全不能与主流的C++、Java、C#、VB等语言相提并论。
Objectice C应用的兴起也是2008年iPhone发布以后的事了。不过在这个硬件制造性能大幅提升的时代,C++的一些缺陷渐渐被性能稍差但比一些高级语言效率要好的Objectice C有所取代(因为它的内存还是手工管理的)。

Objective-C 和 Java 很像,区别在哪儿

1.类比较
objC:例如创建一个bird的类
@Interface bird{
@private int foot;
}
-(void)eat{
NSLog(@“what is the bird eat?“);
}
@end
objectC是以“-“和“+”开头的类方法,-(void)eat:(id)sender{}加:是带参数的,void是eat方法的返回类型,参数的描述包含两个部分:圆括号中的参数类型以及圆括号后面的参数名。
java: class bird{
private int foot;
public void eat(){
system.out.println(“what is the bird eat?“);
}
}
C++:class bird{
private:int foot;
pubblic:eat();
};
与java和C++一样ObjC的类也可以继承其他类,几乎所有的类都要继承NSObject的基类,继承方法也类似于C++但public和priavte关键字不能在父类前。注意objec和java一样不能多继承。
这里java中的interface在objectC就是protocol,但是在java中可以多接口,只能单继承,这一点ObjetC和java相似。
2.实例化
在C++中创建实例:Bird *bird =new Bird();
在java中创建实例:Bird bird=new Bird();
而在objectC中则是: Bird *bird=;这里的alloc是释放的bird创建实例的消息调度。
3.消息
objectC一般调用alloc的调用函数,如Bool listening =;
在C++中则会这样:bool listening =bird-》 isListening();
在java中就会是:boolean listening =bird.isListening();
若要带参数:;
C++:bird-》run(fly);
java:bird.runEvent(fly);
4.成员变量
在ObjectC中self就像c++和java中的this一样,ObjectC的类方法就使用self关键字。
5.内存管理
objectC不像java那样有垃圾收集器可以看管对象释放及分配内存,若objectc没有内存管理的话,就会泄露内存。因此relase就是一个内存释放器,当通过alloc函数或是以new copy 开头的函数创建NSObject的子类实例时就将计数值-1,变成0就是由1-》0若没有内存管理,则计数值不会变成0.
这些是比较典型的,其实还有很多相同和不同之处。
因为objectC是c的超集。也就是可以用C来写,其实在objectc的项目中可以添加C++语法,这样的混编,文件的扩展名也就变成了.mm文件。

object-c的介绍

Object-C通常写作Objective-C或者Obj-C或OC,是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在gcc运作的系统写和编译,因为gcc含Objective-C的编译器。在MAC OS X系统下,运用苹果提供的SDK等开发工具包,可以用来做IOS开发,开发后的程序在Iphone虚拟机中进行测试,运用的主要语言为Object-c。与C#类似。Object-c仅支持单一父类继承,不支持多重继承。

object c 是c语言吗

object-c通常写作objective-c或者obj-c,是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在gcc运作的系统写和编译,因为gcc含Objective-C的编译器。在MAC OSX系统下,运用苹果提供的SDK等开发工具包,可以用来做IOS开发,开发后的程序在Iphone虚拟机中进行测试,运用的主要语言为Object-c。与C#类似。Object-c仅支持单一父类继承,不支持多重继承。

Object C 属性、特性、类型

@property声明属性,做了三件事

.h: 声明了getter和setter方法;

.h: 声明了实例变量(默认:下划线+属性名);

.m: 实现了getter和setter方法。
是否给setter和getter加锁,是否保证setter或者getter的每次访问是完整性的

atomic (默认值)

一定程度上可以保证线程安全,有线程在访问setter,其他线程只能等待完成后才能访问。

nonatomic

不保证你获得的是有效值
readwrite,就是告诉编译器,同时生成getter和setter。如果是readonly,只生成getter。

readwrite: 「读写」
readonly:  「只读」
strong (默认值)

表明你需要引用(持有)这个对象,负责保持这个对象的生命周期。

基本数据类型(非对象类型,如int, float, BOOL),默认值并不是strong,strong只能用于对象类型。

weak

跟strong相反,属性所指的对象销毁时,属性值也会清空,设置为nil。

会给你一个引用,指向对象。但是不会主张所有权。也不会增加retain count。

在delegate patterns中常用weak解决strong reference cycles(以前叫retain cycles)问题。

copy

会在赋值前,复制一个对象,指向新对象

NSString,NSArray,NSDictonary,推荐使用copy属性

NSMubtableString,NSMutableArray, NSMutableDictonary属性则使用strong属性。

assign

针对基本数据类型赋值操作。
nullable :对象「可为空」

nonnull :对象「不可为空」

null_unspecified :「未指定」

null_resettable :调用setter去reset属性时,可以传入nil,但是getter返回值,不为空。
① 四种整型 :

short int : 短整型, 占16位, mac 上占 2 字节, ios 上占 2 字节, 范围 -32768(-2^15) ~ 32767(2^15 - 1), 3万;

int : 整型, 占32位, mac 上占 4 字节, ios 上占 4 字节, 范围 -2147483648(-2^31) ~ 2147483647(2^31 - 1), 21亿;

long int : 长整型, 占64位, mac 上占 8 字节, ios 上占 4 字节, (-2^63) ~ (2^63 - 1), 922亿亿;

long long : 占64位, mac 上占 8 字节, ios 上占 8 字节;

② 进制 :

八进制 十六进制赋值 : 八进制由 “0“ 开头, 十六进制由 “0x“ 或者 “0X“ 开头;

③ 无符号整型:
无符号整型 第一位 不是符号位, 范围比原来要大,例 unsigned short int 范围是 0到6万

--  %d  : 十进制整数, 正数无符号, 负数有 “-“ 符号;

--  %o  : 八进制无符号整数, 没有 0 前缀;

--  %x  : 十六进制无符号整数, 没有 0x 前缀;

--  %u  : 十进制无符号整数;
单个字符表示 : 使用 ’’ 将单个字符引起来, 便是字符常量, 如 ’a’, ’b’ 等;

转义字符表示 : 使用转义符号 \ 来指定字符, 如 ’\n’ 等;

字符占用空间大小 : 每个字符占用一个字节, 因此 Object-C 不支持中文字符, 因为中文字符都是占 2 ~ 3 个字节;

--  %c  : 单个字符输出;

--  %s  : 输出字符串;
float  : 占 4 字节;

double  : 占 8 字节;

long double  : 占 16 字节;

CGFloat :对于需要兼容64位机器的程序而言,需要用CGFloat,当然从长远角度考虑还是推荐尽量使用CGFloat。尽管在32位上相比float增加了一些memory footprint的消耗

(Object-C浮点数 : 不区分 double 与 float, 一个浮点数 3.8 可以赋值给两种类型的变量)

--  %f  : 以小数形式输出浮点数, 默认 6 位小数;

--  %e  : 以指数形式输出浮点数, 默认 6 位小数;

--  %g  : 自动选择 %e 或者 %f 各式;
① 定义普通枚举:

定义方式 : 格式 enum enum_name {elem1, elem2, elem3 ...};

示例 : enum day{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

定义枚举变量 : 格式 enum enum_name var1, var2;

示例 : enum day today, tomorrow, 注意 today tomorrow 两个变量的取值只能是 day 枚举中定义的值;

枚举变量赋值 : 格式 variable = elm1 ;

示例 : today = Sunday; tomorrow = Friday;

② 定义匿名枚举:

匿名枚举格式 : enum {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} today, tomorrow ;

说明 : 两个枚举变量 today 和 tomorrow 只能取值 enum 中得枚举值;

③ 枚举值简介

枚举值常量 : 在 {} 中得是枚举常量 或者 枚举元素, 该元素不是变量, 不能对齐进行赋值, 枚举的值按照定义的顺序 0, 1, 2, 3 以此类推;

枚举值本质 : 枚举值属于无符号整数, 可以使用 %u 占位符打印出来, 其值也能进行大小比较, 和四则运算;

枚举初值 : 枚举值可以在定义的时候赋予一个初值;

--  %p  : 输出十六进制形式的指针地址;

--  %@  : 输出 Object-C 对象;
BOOL 类型值  : 该类型至右两个值 YES 和 NO ;

BOOL 类型本质  : 该类型本质是 signed char, YES 是 1, NO 是 0, 在处理的时候 YES 会被当成真处理, NO 会被当成假处理;
nil相当于Java中的null,表示一个对象,这个对象的指针指向空。Nil是定义一个指向空的类而不是对象。
可以存放任何数据类型的对象,类似Java中的Object类,其被定义为指向对象的指针(本身就是指针了),故定义比如id instance = nil;

id类型是多态和动态绑定的基础。

Object C 数字、字符串、集合、字典、NSURL、NSDate
下一章: Object C 数字、字符串、集合、字典、NSURL、NSDate - (jianshu.com)

object-c的优点及缺点

Objective-C是非常“实际”的语言。它使用一个用C写成、很小的运行库,只会令应用程序的大小增加很小,和大部分OO系统使用极大的VM执行时间会取代了整个系统的运作相反,ObjC写成的程序通常不会比其原始码大很多。而其库函数(通常没附在软件发行本)亦和Smalltalk系统要使用极大的内存来开启一个窗口的情况相反。 Objective-C的最初版本并不支持垃圾回收。在当时这是争论的焦点之一,很多人考虑到Smalltalk回收时有漫长的“死亡时间”,令整个系统失去作用。Objective-C为避免此问题才不拥有这个功能。虽然某些第三方版本已加入这个功能(尤是GNUstep),Apple在其Mac OS X 10.3中仍未引入这个功能。 另一个问题是ObjC不包括命名空间机制(namespace mechanism)。取而代之的是程序设计师必须在其类别名称加上前缀,时常引致冲突。在2004年,在Cocoa编程环境中,所有Mac OS X类别和函数均有“NS”作为前缀,例如NSObject或NSButton来清楚分辨它们属于Mac OS X核心;使用“NS”是由于这些类别的名称在NeXTSTEP开发时定下。 虽然Objective-C是C的母集,但它也不视C的基本型别为第一级的对象。 和C++不同,Objective-C不支持运算子重载(它不支持ad-hoc多型)。亦与C++不同,但和Java相同,Objective-C只容许对象继承一个类(不设多重继承)。Categories和protocols不但可以提供很多多重继承的好处,而且没有很多缺点,例如额外执行时间过重和二进制不兼容。

ObjectC和C++的区别

通常写作objective-c或者obj-c
object-c语言是根据C语言所衍生出来的语言,继承了C语言的特性,是扩充C的面向对象编程语言 它主要使用于MAC OS X和GNUstep这两个使用OpenStep标准的系统。
在MAC OSX系统下,运用苹果提供的SDK等开发工具包,可以用来做IOS开发,开发后的程序在Iphone虚拟机中进行测试,运用的主要语言为Object-c。
与Java语言类似。Object-c仅支持单一父类继承,不支持多重继承。
Objective-C,是在C的基础上,加入面向对象特性扩充而成的编程语言。Objective-C主要应用於Mac OS X和iOS 系统,可以在任何gcc支持的平台上进行编译,因为gcc原生支持Objective-C。
程序例子:
#import《Foundation/Foundation.h》
int main(int argc, char *argv){
NSAutoreleasePool * pool = ;
NSLog(@“Hello World!“);
;
return 0;
}
--
C++ 是在C基础上加了class 等新东西而成的编程语言,可以把C看成是C++的一部分。可以用它写面向对象的程序,也可以写以过程为主的程序。C++ 已得到广泛(远比objective-c广泛)应用,用于各种平台。
--
Objective-C 不用“函数调用”,而用互相传递讯息。
Objective-C 类分为Interface和implementation两块。
Objective-C 构建对象 分为两块 alloc (内存分配)以及init(初始化)
Objective-C 协议分为非正式协议和正式协议
..... (请自己参考书籍或资料)
注:以上是复制粘贴过来的。