为啥说Objective-C很难学

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥说Objective-C很难学相关的知识,希望对你有一定的参考价值。

作为一个网络上的活跃分子,使用Objective-C的开发者,我收到了许多围绕Objective-C的提问。这些问题在人们学习Objective-C或者尝试开发app的时候会不断跳出来,而且其中的某些问题可能笼统如“Objective-C看起来太难了”也会细致若“那个‘-’是干嘛用的啊?”。我要说的是这些其实都是好问题,那么接下来我就和大家探讨一下:相对于Ruby或Java,为什么某些程序员对转投ios或者OS X开发会心存畏惧。

语法

先说说编程语言是什么。所谓编程语言就是一种人可以读得懂的程序代码。一门编程语言通常包含一系列内容:语法(语句书写和声明的规则)和语义(以达成某些任务为目标,把语句和声明有效的结合起来)。

大部分(通常情况下)编程语言在方法调用上都是类似C语言的风格,访问类成员采用.语法。(也就是C中的structs)。虽然这些语言一般都有各自己定义类的方式(Java和C#或C++还是不大相同的),但是追究到语言的诸多细节还都是很相似的。每当人们开始接触一门新的编程语言的时候,如果它的语法看起来很似曾相识,会让学习者觉得很舒服。像大多数人都是有C语法背景的,所以要学习一门类C语法的语言的话,第一观感会很亲切。

单从语法角度来看,Objective-C可谓**别具一格**。它的语法太特别了,碍于它语法的另类,很多人没有耐心去深究它的语义,而它的语义恰恰与C++,Java等语言没什么区别。

像Python和Ruby这些所谓”古怪”的语言都更容易上手,仅仅是因为它们可以通过.语法来进行方法调用和访问类成员。而且人们通常能够迅速习惯用缩进来代替花括号。

当我向别人介绍Objective-C的时候,一般情况下,我会拿它和某个OOP(面向对象编程)语言来对比说明。

why objective-c is hard to learn 1

目前来看还OK。也许他们之前知道lisp吧,所以不难理解这句语法。

why objective-c is hard to learn 2

到这句,人们普遍觉得比较难接受,情况也变得不那么乐观了。

why objective-c is hard to learn 3

这句可以直接让人们崩溃了。

那些冒号是啥?太吓人了!随后冒出一堆问题:方法是怎么调用的?是通过performAction还是什么别的方式?方法怎么重载?

要知道,我们没有在讨论方法,我们说的是消息(messages)(我也不会去讨论他们之间的区别)和selectors,好比上文所呈现的performAction:withTwoParameters。但是,大家已经懒得去了解了。

Objective-C是C的超集,它其实是一门很cool的编程语言,但是由于其自身的某些特点,相较于其他现代编程语言,人们会觉得Objective-C很古老。作为C的超集,Objectivec-C在C的基础上扩展了一系列非常规的特性,这恰恰增加了Objective-C的复杂度。

Objective-C是一门大型语言。下此定义的出发点是:它的语法十分繁复。实际上,苹果已经在加大对Objective-C瘦身的力度,比如说,虽然速度缓慢但是终究还是完成了头文件去标准C风格的过渡。而且,苹果还为Objective-C做了不少改进,增加了许多新特性,使得Objective-C的代码更加简练,比如:

Synthesizing properties
通过.语法访问getters/setters
垃圾回收(Garbage Collection)
Blocks(闭包closures)
ARC(Automatic Reference Counting)
弱引用(Weak references)
所以,虽然语言变得越来越庞大,但是开发编写代码的复杂度反而降低了。

Runtime

Objective-C是动态运行的,可能单单从其与C的渊源这个角度来看这个特性并不那么直观。由于不需要直接编写汇编码,C语言自身是一门变化较低的语言,鉴于Objective-C是C的超集,我们很容易将Objective-C的稳定性趋向于C,但现实际上,Objective-C是动态运行的且灵活性相当高的语言。Objective-C支持函数柯里化(function currying),支持反射机制,可以在运行时动态地为类添加或移除方法。

除非你之前有接触过类似Objectivec-C这些特性的编程语言,比如说Ruby或Lisp,否则一时间很难适应Objective-C。但是无需担忧!有些东西,外表看起来神秘可怕其实本质没那么复杂。

Framework

使用Objective-C构建apps完全离不开Cocoa/Cocoa Touch框架。就好像用Ruby开发web应用离不开Rails一样。

经过经年累月的发展,Cocoa已经变得非常的厚重。不过如前文所说,苹果最近正在逐渐的为常规iOS开发所依赖的Cocoa Touch框架进行减肥,以降低它的复杂度。即便如此,哪怕要开发的app极其简单,也还是有许多东西要学,像苹果的官方文档还有已暴露的各种头文件都是很好的学习资源。就拿UIView中的contentStretch属性为例,头文件的定义和说明如下:

@property(nonatomic) CGRect contentStretch __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);

// animatable. default is unit rectangle 0,0 1,1

这到底是什么意思呢?按照我的理解,这个属性是用来描述可伸缩区域的大小。但是怎么实现的呢?这个区域是指一个矩形吗?也许你永远都不会和这个属性打交道,但是假如在开发过程中的某个时点和场景下使用这个属性能够轻松解决你的问题,那个时候你会知道它的存在并能正确的使用它吗?

Cocoa/Cocoa-Touch是庞大的框架。要真正的驾驭它就只能靠熟能生巧了。但这个熟悉它的过程常常使很多新的学习者退缩。

History

一直以来,苹果都在不停的推动着围绕Objective-C语言开发体系的进步,像Objective-C runtime,Cocoa/Cocoa Touch框架以及针对Objective-C的编译器等一系列更高层面设计的交叉重叠使得Objective-C不仅仅是一个语言这么简单。

why objective-c is hard to learn 4

所以当学习Objective-C的时候,不能孤立的去学习这门语言、某些框架、它的运行机制或编译器,而是要把他们融会贯通。比如说现在Objective-C集成的ARC(Automatic Reference Counting)机制就涉及到了语义(不需要显示调用dealloc了)层面、编译器层面(显而易见)、以及对Cocoa/Cocoa Touch框架的命名约定等内容。

上文所提到的围绕Objective-C的一些列紧密关联的设计算是其独有的特点。其他的语言或多或少都会依赖于别的的语言或平台来运行,比如基于.net运行的Iron Python,不是Java但是却依赖JVM的Clojure,甚至Ruby和Rails其实都有各自相对独立的实体和工程。唯一一个比较知名的受Cocoa/Cocoa Touch和Objective-C runtime支撑运行的Mac Ruby,后来也被苹果停掉后了后续支持。

Objective-C和相关的框架、runtime以及编译器等等这个体系对其他开发者社区而言是又几乎是封闭的。

未来

从目前掌握的信息来看,过去的四年来苹果一直在尝试降低Objective-C语言的复杂度。淘汰手动内存管理以及C标准头文件,引入更符合当下编程语言潮流的ARC机制,还有通过.语法来访问属性的getter/setter方法等等都是为了降低Objective-C的学习成本。但是即便如此,Objective-C仍然是具备一定学习门槛的开发语言,它的热度完全那些基于Objective-C编写的热门iOS应用带起来的。
参考技术A 解决方案如下:
1. 先安装sshpass
下载:wget http://nchc.dl.sourceforge.net/sourceforge/sshpass/sshpass-1.04.tar.gz
安装:
tar -zxvf sshpass-1.04.tar.gz
cd sshpass-1.04
./configure
make && make install

2. 再写一个管理sshpass的BASH脚本.
脚本文件名为:/opt/program/bash/test.sh
脚本内容如下:
#!/bin/bash
cat <<MENU
1) localhost
2) 192.168.100.100
3) 加上你的主机
MENU
echo -n "Your choose:"
read host
case "$host" in
1)
exec /usr/local/bin/sshpass -p 123456(这是我机器的密码) ssh huabo@localhost
;;
2)
exec /usr/local/bin/sshpass -p 123456 ssh huabo@192.168.100.100
;;
3)
你的登录命令
;;
*)
echo "Error, No host"
;;
esac
参考技术B Objective-C,通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言。它主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统,而在NeXTSTEP和OpenStep中它更是基本语言。Objective-C可以在GCC以及Clang运作的系统上编写和编译,因为GCC与Clang含Objective-C的编译器。
Objective-C用途:编写iOS操作系统(如:iPhone、iPod touch、iPad 等苹果移动终端设备 )应用程序和Mac OS X操作系统应用程序的利器。 Objective-C的流行当归功于iPhone的成功,因为Objective-C被用于编写iPhone应用程序。
Objective-C用途:编写iOS操作系统(如:iPhone、iPod touch、iPad 等苹果移动终端设备 )应用程序和Mac OS X操作系统应用程序的利器。 Objective-C的流行当归功于iPhone的成功,因为Objective-C被用于编写iPhone应用程序。

2015年3月全球开发语言使用率排行榜占第三位,仅次于C和java!

kafka是啥?虽然很难学,但是实验入门很简单

文章目录

kafka概述

Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。
kafka的三个基本组成是生产者、消费者、broker(生产者和消费者之间的消息队列服务器)。

发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接受感兴趣的消息。

缓冲/消峰:缓解大流量情况,解决生产消息和消费消息的处理速度不一样的情况。

异步处理机制:允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

消息队列的两种模式

  • 点对点
    一个生产者一个消费者 ,消费者主动拉取数据,消息收到后清除
  • 发布/订阅
    多个生产者 ,消费者多个,而且相互独立,多个topic消费者消费数据后不删除数据

几个基本的概念

  • Producer:消息生产者,就是向 Kafka broker 发消息的客户端。
  • Consumer:消息消费者,向 Kafka broker 接收消息的客户端。
  • Consumer Group(CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
  • Broker:一台 Kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个broker 可以容纳多个 topic。
  • Topic:可以理解为一个队列,生产者和消费者面向的都是一个 topic。
  • Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
  • Replica:副本。一个 topic 的每个分区都有若干个副本,一个 Leader 和若干个Follower。
  • Leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 Leader。
  • Follower:每个分区多个副本中的“从”,实时从 Leader 中同步数据,保持和Leader 数据的同步。Leader 发生故障时,某个 Follower 会成为新的 Leader。

kafka快速入门

官网链接https://kafka.apache.org/downloads.html

本地搭建伪分布式kafka集群

解压tar -xzvf kafka_2.12-3.2.3.tgz

在kafka目录下创建etc目录,mkdir etc

将zookeeper配置文件拷贝进去cp config/zookeeper.properties etc,在文件最后添加

audit.enable=true

搭建一个有三个broker的伪分布式节点

cp config/server.properties etc/server-0.properties
cp config/server.properties etc/server-1.properties
cp config/server.properties etc/server-2.properties

分别进入配置文件,修改

broker.id=0
listeners=PLAINTEXT://localhost:9092   注释去掉
log.dirs=/tmp/kafka-logs-0	区分log.dir
broker.id=1
listeners=PLAINTEXT://localhost:9093   注释去掉
log.dirs=/tmp/kafka-logs-1	区分log.dir
broker.id=2
listeners=PLAINTEXT://localhost:9094   注释去掉
log.dirs=/tmp/kafka-logs-2	区分log.dir

进入bin目录下使用启动脚本,开启zookeeper

./zookeeper-server-start.sh ../etc/zookeeper.properties

提示没有java环境就先安装javasudo apt install openjdk-8-jre-headless

然后启动三个kafka的实例,进入bin目录

./kafka-server-start.sh ../etc/server-0.properties
./kafka-server-start.sh ../etc/server-1.properties
./kafka-server-start.sh ../etc/server-2.properties

创建主题

./kafka-topics.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --create --topic test --partitions 3 --replication-factor 2

查看分区状态

./kafka-topics.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --describe --topic test


创建消费者和生产者

./kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test --from-beginning

./kafka-console-producer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test

然后在生产者终端发送信息,在消费者终端就可以接收到消息。
梳理一下整个过程,就是先创建好管理节点的zookeeper,然后创建三个broker节点,然后分别创建了生产者和消费者进行通信。

kafka新版本中取消了对zookeeper的依赖,在创建topic时,不用--zookeeper选项而改用--bootstrap-server--bootstrap-servers参数,只在启动客户端连接Kafka服务时使用。并且,即使列表里面填了多个节点,只要有一个可用就行了。

listeners:指定broker启动时本机的监听名称、端口,给服务器端使用
advertised.listeners:对外发布的访问ip和端口,给客户端使用。如果advertised.listeners没有配置,就采用listeners的配置。

使用docker部署kafka

这里没有实验成功,三个broker链接不起来,先放个官方文档在这,以后需要用到再回来看

https://github.com/bitnami/containers/tree/main/bitnami/kafka

更深入的学习(待更)

另外需要说明,上面的实验只是实验帮助理解,kafka并不是只有这么简单,通常是用java来调用kafka提供的api来对消息进行发送和接收。

学习链接

https://www.bilibili.com/video/BV1h94y1Q7Xg/

以上是关于为啥说Objective-C很难学的主要内容,如果未能解决你的问题,请参考以下文章

有人说,越低级的程序越难学,越高级的程序越容易学?

Cadence 是否真的很难学

java是否很难学?谢谢

电子信息科学与技术专业是否很难学?

node.js会很难学吗?

云计算很难学?看这里!!!