常见编程/框架介绍
文章大纲
一、C/C++
二、C#
三、cocos2d-x
四、go语言
五、Hadoop
六、HBase
七、PHP
八、python
九、Spark
十、Storm
十一、Unity3D
十二、Java
十三、Android
十四、Object-C与swift
十五、.NET
十六、R语言
一、C/C++
1. 简介
C语言是目前世界上流行、使用最广泛的高级程序设计语言。
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。
2. 特点
(1)C语言属于比较低级的语言,仅次于汇编,这个低级主要指它和硬件关系比较紧密。
(2)应用广泛;几乎可以给任何电子设备编程,可以做很底层的开发如操作系统/驱动等。所以如楼上所说嵌入式等地方的开发会大量用到C语言。
(3)简单;因为是低级语言,所以不会提供很多的编程特性,如面向对象、多态、重载等等都不会出现。这也是为什么大学会大面积要求C语言课程而不是C++C#(当然,这指的是语言特性简单,不是指编写C语言程序简单,毕竟提出新的语言特性就是为了简化coding),用C语言写简单的程序来入门编程是个不错的组合。
3. 优点
1.1 简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C语言可以象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
1.2 运算符丰富
C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
1.3 数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
1.4 语法限制不太严格、程序设计自由度大
一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而C语言允许程序编写者有较大的自由度
1.5 语言允许直接访问物理地址,可以直接对硬件进行操作
因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。
1.6 C语言程序生成代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10へ20%。
1.7 C语言适用范围大,可移植性好
C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX,也适用于多种机型。
4. 缺点
(1)C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。
(2)C语言的语法限制不太严格
(3)对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
(4)C语言指针指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。Java取消了指针操作,提高了安全性。
5. 常见使用场景
(1)操作系统 一些操作系统是使用C语言编写的,同时C++凭借其对C的兼容性,面向对象性质也开始在该领域崭露头角。
(2)网络软件 C++拥有很多成熟的用于网络通信的库,其中最具有代表性的是跨平台的、重量级的ACE库,该库可以说是C++语言最重要的成果之一,在许多重要的企业、部门甚至是军方都有应用。
(3)游戏 C++的效率是一个很重要的原因。科学计算:在科学计算领域,FORTRAN是使用最多的语言之一。但是近年来,C++凭借先进的数值计算库、泛型编程等优势在这一领域也应用颇多。
(4)物联网领域 人们普遍使用c/c++编写一些微处理器芯片程序,比如单片机,DSP,ARM等等。
二、C#
C#(读做 "C sharp",中文译音“夏普”)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,并定于在微软职业开发者论坛(PDC)上登台亮相.C#是微软公司研究员Anders Hejlsberg的最新成果.C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角.
三、cocos2d-x
Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++ Cocos2d-iPhone项目的版本。Cocos2d-X发展的重点是围绕Cocos2d跨平台,Cocos2d-x提供的框架。手机游戏,可以写在C++或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x项目可以很容易地建立和运行在iOS,Android,黑莓Blackberry等操作系统中。Cocos2d-x还支持Windows、Mac和Linux等桌面操作系统,因此,开发者编写的源代码很容易在桌面操作系统中编辑和调试。
四、go语言
1. 简介
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
2. 优点
2.1 性能
Go 极其地快。其性能与 Java 或 C++相似。在我们的使用中,Go 一般比 Python 要快 30 倍
2.2 并发性&通道
Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道。Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式
2.3 快速的编译时间
当前我们使用 Go 编写的最大微服务的编译时间只需 6 秒。相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。
2.4 强大的生态系统
对我们这么大小的团队(大约 20 人)而言,生态系统很重要。如果你需要重做每块功能,那就无法为客户创造收益了。Go 有着强大的工具支持,面向 Redis、RabbitMQ、PostgreSQL、Template parsing、Task scheduling、Expression parsing 和 RocksDB 的稳定的库。
Go 的生态系统相比于 Rust、Elixir 这样的语言有很大的优势。当然,它又略逊于 Java、Python 或 Node 这样的语言,但它很稳定,而且你会发现在很多基础需求上,已经有高质量的文件包可用了。
2.5 GOFMT,强制代码格式
Gofmt 是一种强大的命令行功能,内建在 Go 的编译器中来规定代码的格式。从功能上看,它类似于 Python 的 autopep8。格式一致很重要,但实际的格式标准并不总是非常重要。Gofmt 用一种官方的形式规格代码,避免了不必要的讨论
2.6 gRPC 和 Protocol Buffers
Go 语言对 protocol buffers 和 gRPC 有一流的支持。这两个工具能一起友好地工作以构建需要通过 RPC 进行通信的微服务器(microservices)。我们只需要写一个清单(manifest)就能定义 RPC 调用发生的情况和参数,然后从该清单将自动生成服务器和客户端代码。这样产生代码不仅快速,同时网络占用也非常少。
从相同的清单,我们可以从不同的语言生成客户端代码,例如 C++、Java、Python 和 Ruby。因此内部通信的 RESET 端点不会产生分歧,我们每次也就需要编写几乎相同的客户端和服务器代码
3. 缺点
3.1 缺少框架
Go 语言没有一个主要的框架,如 Ruby 的 Rails 框架、Python 的 Django 框架或 PHP 的 Laravel。这是 Go 语言社区激烈讨论的问题,因为许多人认为我们不应该从使用框架开始。在很多案例情况中确实如此,但如果只是希望构建一个简单的 CRUD API,那么使用 Django/DJRF、Rails Laravel 或 Phoenix 将简单地多
3.2 错误处理
Go 语言通过函数和预期的调用代码简单地返回错误(或返回调用堆栈)而帮助开发者处理编译报错。虽然这种方法是有效的,但很容易丢失错误发生的范围,因此我们也很难向用户提供有意义的错误信息。错误包(errors package)可以允许我们添加返回错误的上下文和堆栈追踪而解决该问题。
另一个问题是我们可能会忘记处理报错。诸如 errcheck 和 megacheck 等静态分析工具可以避免出现这些失误。虽然这些解决方案十分有效,但可能并不是那么正确的方法。
3.3 软件包管理
Go 语言的软件包管理绝对不是完美的。默认情况下,它没有办法制定特定版本的依赖库,也无法创建可复写的 builds。相比之下 Python、Node 和 Ruby 都有更好的软件包管理系统。然而通过正确的工具,Go 语言的软件包管理也可以表现得不错。
我们可以使用 Dep 来管理依赖项,它也能指定特定的软件包版本。除此之外,我们还可以使用一个名为 VirtualGo 的开源工具,它能轻松地管理 Go 语言编写的多个项目
4. 就业方向
五、Hadoop
1. 简介
Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。Hadoop=HDFS(文件系统,数据存储技术相关)+ Mapreduce(数据处理),Hadoop的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的处理能力,不管任何数据形式最终会转化为key/value,key/value是基本数据单元。用函数式变成Mapreduce代替SQL,SQL是查询语句,而Mapreduce则是使用脚本和代码,而对于适用于关系型数据库,习惯SQL的Hadoop有开源工具hive代替。
Hadoop就是一个分布式计算的解决方案
2. 优势
(1)高扩展
(2)低成本
(3)成熟的生态圈
(4)hadoop生态系统开源社区活跃
3. 应用场景
(1)大数据量存储:分布式存储
(2)日志处理:Hadoop擅长这个
(3)海量计算:并行计算
(4)ETL:数据抽取到oracle、mysql、DB2、mongdb及主流数据库
(5)使用HBase做数据分析:用扩展性应对大量的写操作—Facebook构建了基于HBase的实时数据分析系统
(6)机器学习:比如Apache Mahout项目
(7)搜索引擎:hadoop + lucene实现
(8)数据挖掘:目前比较流行的广告推荐
(9)用户细分特征建模
六、HBase
HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
七、PHP
1. 简介
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
2. 优点
(1)跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合,或者数据应用够大可以考虑换 PostgreSQL或者Oracle,支持N种数据库。(N >= 10)
(2)语法简单,如果有学习C和Perl的很容易上手,并且跟ASP有部分类似。有成熟的开发工具,比如NuPHPed,或者Zend Studio等等,再Linux平台下可以使用Eclipse等等。
(3)目前主流技术都支持,比如WebService、Ajax、XML等等,足够应用。
(4)有比较完整的支持,比如使用ADODB或者PEAR::DB做数据库抽象层,用Smarty或者smart template做模板层,如果是PHP 5.1的话,还能够使用PDO(PHP Data Object)来访问数据库。
(5)有很多成熟的框架,比如支持MVC的框架:phpMVC,支持类似ASP.net的事件驱动的框架:Prado,支持类似Ruby On Rails的快速开发的框架:Cake等等,足够满足你的应用需求。
(6)PHP 5已经有成熟的面向对象体系,能够适应基本的面向对象要求。适合开发大型项目。
(7)有成熟的社区来支持PHP的开发。
(8)目前已经很多大型应用都是使用PHP,比如淘宝网、Yahoo、163、Sina等等大型门户,很多选用PHP来作为他们的开发语言,所以大型门户都能够选用它,我想足够能够你的使用了。
(9)有很多开源的框架或开源的系统可以使用,比如比较知名的开源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,开源论坛有Discuz!、Phpwind等,开源博客 WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。
(10)使用成本低 (linux apache mysql php内核)
3. 缺点
(1)函数命名不规范 驼峰法和下滑线,传参位置不一 你知道的
(2)单线程 ; PHP本身,一直以来php就是个单进程的程序;虽然php的pthreads扩展早就有了。但是它不够稳定,运行运行着就会莫名其妙的自己挂掉;php的扩展都是C写的,这也就意味着任何一个扩展出现线程竞争资源控制问题都能让整个挂掉
(3)核心异步网络不支持(当然在linux只有同步非阻塞网络模型)。却少了这个使得很难开发一个能够承受大并发的网络应用。传统的网络模型和io都阻塞的。这样基本的编程的做法就是一个进程(或者线程)响应一个用户链接请求。因此无法完成像实时网游那样需要成千上万网络连接的任务。尽管php也有Libevent、eio扩展对此算是某种程度上面的弥补,但是感觉都不是那么完善
(4)只支持web开发,不方便做 .exe文件,不方便做桌面应用程序. 不方便做手机程序.
(5)不适合做爬虫、自动运行脚本.科学运算项目,这语言基本构架就不适合,虽然有很多方法实现。
(6)后期维护困难。后期提速空间局限性较大。
(7)PHP的解释运行机制。这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空。以JSP为例,在JSP中,Java Bean的scope有四种有效值:Page、Application、Session、Request,分别对应页面、程序、会话、请求四种生存期。但在PHP中,只有Page一种生存期。
4. 就业方向
(1)PC端网站开发
(2)移动端微网站开发
(3)APP后台开发
八、python
1. 简介
Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。
2. 特点
(1)web开发pytyon拥有非常完善的与web服务器进行交互的库,以及大量的免费的前端网页模板。更具优势的是,有非常优秀且成熟的Django Web框架,功能一应俱全。
(2)linux系统运维事实上,在早期都是通过shell脚本来去实现自动化运维,但是由于shell脚本本身呢可编程的能力偏弱,一些需要实现的功能的库也很少,大部分都需要自己从头写起,然而pyhon作为“胶水语言”可以很方便的和其他由于集成起来,对各类工具进行方便发二次开发,形成一套自己的运维管理系统。
(3)游戏开发python在游戏开发方面可能不及Lua 或者是 C++,但是由于python脚本化的优点,类似于游戏剧本、游戏玩法逻辑等这种非常灵活的设计上,我们呢修改起来十分方便。当然了,如果开发一款小的游戏程序,python还是很具有优势的,比较出名的就是pygame了,或许是我们自娱自乐的一个福音啦。
网络爬虫在爬虫方面,python是独领风骚的。python有非常丰富的库去访问网页文档的接口api以及后期网页文档的快速处理。
(4)桌面软件在window系统桌面开发领域,相信C++ MFC应该是用的比较广的了,python可以实现对C++的无缝对接,并且同时支持Qt和GTK。
(5)数据处理python作为一门工程性语言,对于数据处理的类库是相当丰富的,比如有高性能的科学计算类库NumPy和SciPy。
(6)人工智能事实上,真正的人工智能的底层语言是C/C++,因为真正的计算全在于C/C++,而python仅仅是调用AI的接口然后去实现一些逻辑而已。但是为什么说人工智能首先python呢?这个其实是由于python作为“胶水语言”的特质才会显的出类拔萃,主要使用python是因为CPython和底层原因的融合使得开发起来更加方便。
(7)python还有其他的应用场景,比如说云计算,大名鼎鼎的云计算框架OpenStack就是python开发的。
九、Spark
1. 简介
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
2. 使用场景
(1)Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,受益越大,数据量小但是计算密集度较大的场合,受益就相对较小;
(2)由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫和索引。就是对于那种增量修改的应用模型不适合;
(3)数据量不是特别大,但是要求实时统计分析需求。
满足以上条件的均可采用Spark技术进行处理,在实际应用中,目前大数据在互联网公司主要应用在广告、报表、推荐系统等业务上,在广告业务方面需要大数据做应用分析、效果分析、定向优化等,在推荐系统方面则需要大数据优化相关排名、个性化推荐以及热点点击分析等。
这些应用场景的普遍特点是计算量大、效率要求高,Spark恰恰可以满足这些要求,该项目一经推出便受到开源社区的广泛关注和好评,并在近两年内发展成为大数据处理领域炙手可热的开源项目。
十、Storm
1. 简介
Storm是一个分布式的、高容错的实时计算系统。
Storm对于实时计算的的意义相当于Hadoop对于批处理的意义。Hadoop为我们提供了Map和Reduce原语,使我们对数据进行批处理变的非常的简单和优美。同样,Storm也对数据的实时计算提供了简单Spout和Bolt原语。
2. 使用场景
(1)流数据处理:Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中。(2)分布式RPC:由于Storm的处理组件都是分布式的,而且处理延迟都极低,所以可以Storm可以做为一个通用的分布式RPC框架来使用。
十一、Unity3D
Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。
十二、Java
1. 简介
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 [1] 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
2. 特点
2.1 面向对象
面向对象可以说是Java最重要的特性。Java语言的设计完全是面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及重用。单从面向对象的特性来看,Java类似于Small Talk,但其它特性、尤其是适用于分布式计算环境的特性远远超越了Small Talk。
2.2 分布式
Java包括一个支持HTTP和FTP等基于TCP/IP协议的子库。因此,Java应用程序可凭借URL打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。为分布环境尤其是Internet提供的动态内容无疑是一项非常宏伟的任务,但Java的语法特性却使我们很容易地实现这项目标。
2.3 健壮
Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自已操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能。这些功能特征大大缩短了开发Java应用程序的周期。Java提供Null指针检测数组边界检测异常出口字节代码校验。
2.4 安全
Java的安全性可从两个方面得到保证。一方面,在Java语言里,象指针和释放内存等C++功能被删除,避免了非法内存操作。另一方面,当Java用来创建浏览器时,语言功能和浏览器本身提供的功能结合起来,使它更安全。Java语言在你的机器上执行前,要经过很多次的测试。它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及试图改变一个对象的类型。
2.5 可移植的
这句话一直是Java程序设计师们的精神指标,也是Java之所以能够受到程序设计师们喜爱的原因之一,最大的功臣就是JVM的技术。大多数编译器产生的目标代码只能运行在一 种CPU上(如Intel的x86系列),即使那些能支持多种CPU的编译器也不能同时产生适合多 种CPU的目标代码。如果你需要在三种CPU( 如x86、SPARC 和MIPS)上运行同一程序, 就必须编译三次。
但JAVA编译器就不同了。JAVA编译器产生的目标代码(J-Code) 是针对一种并不 存在的CPU--JAVA虚拟机(JAVA Virtual Machine),而不是某一实际的CPU。JAVA虚拟机能掩盖不同CPU之间的差别,使J-Code能运行于任何具有JAVA虚拟机的机器上。
虚拟机的概念并不AVA 所 特 有 的:加州大学几年前就提出了PASCAL虚拟机的概念;广泛用于Unix服务器的Perl脚本也是产生与机器无关的中间代码用于执行。但针对Internet应用而设计的JAVA虚拟机的特别之处在于它能产生安全的不受病毒威胁的目标代码。正是由于Internet对安全特性的特别要求才使得JVM能够迅速被人们接受。 当今主 流的操作系统如OS/2、MacOS、Windows95/NT都已经或很快提供对J-Code的支持。
作为一种虚拟的CPU,JAVA 虚拟机对于源代码(Source Code) 来说是独立的。我们不仅可以用JAVA语言来生成J-Code,也可以用Ada95来生成。事实上,已经有了针对若干种源代码的J-Code 编译器,包括Basic、Lisp 和Forth。源代码一经转换成J-Code以后,JAVA虚拟机就能够执行而不区分它是由哪种源代码生成的。这样做的结果就是CPU可移植性。 将源程序编译为J-Code的好处在于可运行于各种机器上,而缺点是它不如本机代码运行的速度快。
同体系结构无关的特性使得Java应用程序可以在配备了Java解释器和运行环境的任何计算机系统上运行,这成为Java应用软件便于移植的良好基础。但仅仅如此还不够。如果基本数据类型设计依赖于具体实现,也将为程序的移植带来很大不便。例如在Windows3.1中整数(Integer)为16bits,在Windows95中整数为32bits,在DECAlpha中整数为64bits,在Intel486中为32bits。通过定义独立于平台的基本数据类型及其运算,Java数据得以在任何硬件平台上保持一致。Java语言的基本数据类型及其表示方式如下:byte8-bit二进制补码short16-bit二进制补码int32-bit二进制补码long64-bit二进制补码float32-bitIEEE754浮点数double32-bitIEEE754浮点数char16-bitUnicode字符在任何Java解释器中,数据类型都是依据以上标准具体实现的。因为几乎目前使用的所有CPU都能支持以上数据类型、8~64位整数格式的补码运算和单/双精度浮点运算。Java编译器本身就是用Java语言编写的。Java运算系统的编制依据POSIX方便移植的限制,用ANSIC语言写成。Java语言规范中也没有任何"同具体实现相关"的内容。
2.6 高性能
如果解释器速度不慢,Java可以在运行时直接将目标代码翻译成机器指令。Sun用直接解释器一秒钟内可调用300,000个过程。翻译目标代码的速度与C/C++的性能没什么区别。
2.7 多线程
多线程功能使得在一个程序里可同时执行多个小任务。线程--有时也称小进程--是一个大进程里分出来的小的独立的进程。因为Java实现的多线程技术,所以比C和C++更键壮。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh等),在开发难易程度和性能上都比单线程要好。任何用过当前浏览器的人,都感觉为调一副图片而等待是一件很烦恼的事情。在Java里,你可用一个单线程来调一副图片,而你可以访问HTML里的其它信息而不必等它。
2.8 动态
Java的动态特性是其面向对象设计方法的发展。它允许程序动态地装入运行过程中所需要的类,这是C++语言进行面向对象程序设计所无法实现的。在C++程序设计过程中,每当在类中增加一个实例变量或一种成员函数后,引用该类的所有子类都必须重新编译,否则将导致程序崩溃。Java从如下几方面采取措来解决这个问题。Java编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,一个在存储器生成的对象不在编译过程中决定,而是延迟到运行时由解释器确定的。这样,对类中的变量和方法进行更新时就不至于影响现存的代码。解释执行字节码时,这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次,随后代码便可以全速执行。在运行时确定引用的好处是可以使用已被更新的类,而不必担心会影响原有的代码。如果程序连接了网络中另一系统中的某一类,该类的所有者也可以自由地对该类进行更新,而不会使任何引用该类的程序崩溃。Java还简化了使用一个升级的或全新的协议的方法。如果你的系统运行Java程序时遇到了不知怎样处理的程序,没关系,Java能自动下载你所需要的功能程序。四.与C和C++语言的异同 Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C++安全性不好,但C和C++还是被大家所接受,所以Java设计成C++形式,让大家很容易学习。Java去掉了C++语言的许多功能,让Java的语言功能很精炼,并增加了一个很有用的功能,Java去掉了以下几个C和C++功能和特征:指针运算结构typedefs#define需要释放内存全局变量的定义这个功能都是很容易引起错误的地方。
3. 就业方向
(1)Android开发
Android是全球最大的智能手机操作系统,Android在国内的市场份额愈来愈额高。最近几年发展非常快速,但人才积累却没有跟上,优秀的Android开发工程师仍然存在不小的缺口。Android应用的主要开发语言就是Java,所以选择这个方向还是蛮不错的。
(2)Web开发
Web开发语言很多,Java是其中之一。Java在开发高访问、高并发、集群化的大型网站方面有很大的优势,例如人人网、去哪儿网、美团等
(3)Java网站建设
近几年来,网站建设业务一直呈快速上升势头,行业市场越来越大。新技术的应用将促使企业网站建设更具魅力。Java编程语言也将使网站结构更紧密,访问更流畅,更能适应新的要求。但是以目前的市场分析Java做网站成本太高,对硬件要求比较高,中小企业大都会选择使用PHP语言进行开发,但是像大企业还是比较喜爱Java技术
(4)Java企业级应用开发
目前Java在许多行业的企业信息应用方面的应用非常多,比如OA、邮箱、股票、金融、考试、物流、医疗、矿山等信息方面的系统。该方向和行业密切相关,所以,这是一个经验型的发展方向。Java开发者在这方面的需求也非常大,待遇也相当不错,工资水平与Java互联网方向的差不多,很容易在一些大型企业就业
(5)Java游戏开发
Java本身就可以用来编写游戏脚本,目前也有例如beanshellgroovy等脚本语言可以方便的无缝的和Java语言进行交互,这些都极大的方便了Java游戏编程。国内游戏专业人才的需求一直存在缺口。目前国内游戏企业的大多数从业人员往往没有受过专业化培训,属于自学成才,远远不能适应玩家的游戏理念和游戏技能的升级换代
(6)Java大数据方向
十三、Android
1. 简介
Android是一种基于Linux的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google(谷歌)公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机
2. 就业方向
(1)设备软件层开发(比如穿戴设备、机顶盒等)
(2)移动手机、平板电脑app开发
十四、Object-C与swift
1. 简介
1.1 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仅支持单一父类继承,不支持多重继承。
1.2 swift
Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C*共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序。
2. Object-C与swift区别
2.1 Swift和Objective-C的联系
Swift和Objective-C共用一套运行时环境,Swift的类型可以桥接到Objective-C(下面我简称OC),反之亦然。
2.2 Swift比Objective-C有什么优势
(1)Swift容易阅读,语法和文件结构简易化。
(2)Swift更易于维护,文件分离后结构更清晰。
(3)Swift更加安全,它是类型安全的语言。
(4)Swift代码更少,简洁的语法,可以省去大量冗余代码
(5)Swift速度更快,运算性能更高。
十五、.NET
1. 简介
.NET就是微软用来实现XML,Web Services,SOA(面向服务的体系结构service-oriented architecture)和敏捷性的技术。对技术人员,想真正了解什么是.NET,必须先了解.NET技术出现的原因和它想解决的问题,必须先了解为什么他们需要XML,Web Services 和 SOA。技术人员一般将微软看成一个平台厂商。微软搭建技术平台,而技术人员在这个技术平台之上创建应用系统。从这个角度,.NET也可以如下来定义:.NET是微软的新一代技术平台,为敏捷商务构建互联互通的应用系统,这些系统是基于标准的,联通的,适应变化的,稳定的和高性能的。从技术的角度,一个.NET应用是一个运行于.NET Framework之上的应用程序。(更精确的说,一个.NET应用是一个使用.NET Framework类库来编写,并运行于公共语言运行时Common Language Runtime之上的应用程序。)如果一个应用程序跟.NET Framework无关,它就不能叫做.NET程序。比如,仅仅使用了XML并不就是.NET应用,仅仅使用SOAP SDK调用一个Web Service也不是.NET应用。.NET是基于Windows操作系统运行的操作平台,应用于互联网的分布式。
2. 就业方向
(1).net桌面程序开发
(2).net web程序开发
十六、R语言
1. 简介
R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具。
2. 优点
(1)开源
(2)是专门为统计和数据分析开发的语言,各种功能和函数琳琅满目,其中成熟稳定的一抓一把
(3)语言简单易学。虽与C语言之类的程序设计语言已差别很大(比如语言结构相对松散,使用变量前不需明确正式定义变量类型等等),但仍保留了程序设计语言的基础逻辑与自然的语言风格。我这样说可能让人听得云里雾里,但是如果你对SAS或者SPSS有一点点了解,就会明白我的意思了...
(4)安装程序只有50Mb左右,比起某些死贵且3个G的付费软件真的是超级迷你小巧玲珑... 因为体积轻便,运行起来系统负担也小。
(5)同各种OS的兼容性好。我两台本本一台Windows,一台Linux,都用得很顺手。相比之下,你有见过人在Mac上用SAS吗... 这人是要多么的想不开... =. =
(6)因为用的人越来越多,又是开源,有很多配套的“插件”为其锦上添花。比如xtable里有一个函数可以直接将R里的表格导出为TeX格式;另有RStudio的插件让你可以在同一个环境里写TeX跑R并可在你的TeX文件中插入你的R代码,多么的贤良淑德... (这个插件我没用过,不过我同学一天到晚在用)
(7)有R GUI和RStudio两种风格供君选择,说实话我觉得这两种风格已经涵括了大多数人的使用偏好...
(8)已经提过了开源,还想再强调一下。各种包和函数的透明性极好,这使得对函数的调整和改良变得非常便利。只需要把源码调出来,自己稍微修改一下就可以了。这种事情放在任何其他统计软件里都近乎奢望。
(9)如果你做Bayesian,用R你有OpenBUGS, WinBUGS, JAGS等各种成熟活泼的包裹,很多语言又简单又附带各种预设的plot,你只需调用即可;还可以自己写MCMC。如果你用SAS/SPSS/Stata,你可以... @@? = =bbb
(10)漂亮又灵活的图,大家也都已经讲过了。原本不是什么特别突出的长处(有则好,没也没啥),不过现在数据可视化越来越热,也就一跃成为主要优点了。
3. 缺点
(1)对大文本(text data)处理极差... 或者说data management本就不是R的强项。SAS于R的最大优势之一可能就在于它兼顾了数据分析和数据管理。在SAS里对数据进行各种复杂操作都相对容易,只需要简单的DATA STEP(必要时结合PROC SQL)即可完成;在R里可就真的是千辛万苦... 虽然也有相应的aggregate, merge之类的函数,但是大都不太好用。这也是为什么大家常常把数据(尤其是数据大时)在别的环境下整好/分割好再喂给R。人家术业有专攻,数据管理真是有些难为它了。
(2)内存管理和平行处理(parallel processing/programming)都为人诟病。数据小时没有感觉,数据大了就各种报错... =. =
(3)package的可靠性问题。我第一门完全使用R做作业的课是门统计课,教授已经六十多岁,见过各种统计软件的出生发展和湮没。她同我们说到R时第一句话就是Never use a package before you understand the manual and confirm the validity of the functions. 也就是包裹虽然好,使用需谨慎。主要原因还是在于开源。不常用的package一定要搞清楚函数的用法和核实过输出,不然真的不推荐使用。我个人也是倾向非常用函数尽量自己写,至少错了也容易debug...
(4)不得不提的package的版本问题。 就算你确认了包裹的可靠性并熟知了各个变量要怎么用,还是可能掉入潜在的陷阱=. = 讲个真事:去年工作的时候一个项目是使用11年某项目的一个贝叶斯模型分析新的数据。当年写代码的人因为相信末日说两年前就已经辞职环游世界去了,于是我只好独自研读他的代码。第一步,很自然的,就是重复当年的分析结果。这时发现当年他用的一个package和现在的R已经不兼容,于是就下载了这个package的最新版本。结果有一个简单的credible interval怎么都重复不出来... 怎么怎么都重复不出来... 我都快绝望了。最后经各种推理验证,发现这个区别源自于新旧版本的函数内部在对数据排序之后对NaN的不同处理... 而这个小小的修改未在任何地方留下任何文字记录。所以怎么说呢... 很多时候还是写自己的程序靠谱哇...
(5)当你跑比较大的simulation,对效率有要求的时候,有时还是不得不用C,这可能是10小时和10分钟的差别,毫不夸张。
4. 使用场景
(1)图形输出
(2)图层混合应用
(3)热力填色地图