现在做程序主要用哪些软件?

现在做程序主要用哪些软件?,第1张

去年最受欢迎的语言和往年一样,没有变化,仍然是:Java、C、C、PHP、Basic。前几名的语言要在短短的一两年有变动,是不太可能的。这五个语言哪个不是占据Top5的位置五或十年以上?估计2009年仍然是这样的局面,由这几个语言独占鳌头。

但C#已经在快步进逼BASIC,可能再过两年就可以进入前五名。C#上升,BASIC下降,某种程度上反映出微软的VB程序员正转换到C#语言。C#正在逐渐累积和Java抗衡的能量。

在2009年,最值得重视的编程语言好消息,应该就是C了。C0x的x最终被设定为9,将于2009年推出这个标准。经过十年的经验累积,许多C既有的缺点都将在这个标准中获得改善,值得我们期待。

得益于Google的强力背书下,Python这几年小有斩获,现在已经变成通用型脚本语言的第一选择,Python兴起,导致Perl风华难再,两者消长的态势相当明显。而且在2008年末,大家期待已久的Python30也终于推出了。

现今,我们生活在Web的时代,Web后端或许百家争鸣(Java、PHP、NET、),但Web前端还是JavaScript一枝独秀。尽管JavaScript语言存在许多为人所诟病的地方,但JavaScript的重要性仍会持续上升。

对Delphi来说,我承认我过去看走了眼,认为它会持续触底,但2008年显然是Delphi重新被群众拥抱的一年。Delphi曾经拥有许多高手级的使用者,甚至对VisualBasic造成威胁,但是过去这几年在Java和NET的出现之后,以及Web应用席卷全球后,Delphi明显地被边缘化了。外患加上内忧(Borland公司内部的变动),使得Delphi的形势相当不佳,连原文书都找不到几本。在Borland将开发工具部门切割出CodeGear,接着CodeGear又被Embarcadero买下之后,Delphi好像又渐渐有起色了,但说它拨云见日还太早。

如果说Delphi触底反弹,那么遭遇完全相反的就是Ruby了,近期Ruby的招聘大幅降低。对于一个窜升太快的语言,需求稍微有跌落,是正常现象。Ruby长期应该仍会是缓慢上升的格局。

今年是Lua丰收的一年,能见度大增,除了用在游戏软件开发之外,也陆续被一些重要的商业软件商所采用(例如Adobe公司)。我看好Lua,因为在嵌入式语言领域,还没有其他语言可以与之匹敌。

说到Adobe,今年推出AIR之后,好像市场的热度还没起来,所以Adobe的官方语言依然载浮载沉。我希望它能在2009年有更好的表现。

Erlang在2008年的表现不错,持续缓慢上升。Java平台上的两个语言Groovy与Scala也开始受到关注。这些新语言某些程度也相对地呼应了函数式编程(functionalprogramming)与动态语言崛起的现实状况。

根据Net在2009年1月的数据显示,Apple计算机的市场占有率已经达到963%,而且iPhone在过去这一年半的销售数字更是相当抢眼。受其影响,开发MacOS应用软件的官方语言Objective-C也大有斩获,越来越受到重视。要不是Apple的笔记本太贵我买不起,否则我早就开始学Objective-C了。

我注意到过去一年有一个奇怪的语言忽然冒出头,叫做Alice。Alice是一个3D动画的制作环境,适合用来辅助说故事。这个语言之所以叫做Alice,该不会是和“Alice'sAdventuresinWonderland(爱丽斯梦游仙境)”的故事有关?

容我在此有一点私心介绍一下REBOL语言。根据目前的开发进度来看,2009年将会是REBOL30发布的一年。我希望大家多多关注这个语言。你可以到我的REBOLOGY博客(blogspot)上看看它的动态。

分析完重点语言之后,就整体来看,我们会发现动态语言和函数式语言越来越受欢迎。我自己就是从C、C到Java、C#,再到Erlang、REBOL,我使用的语言越来越动态、越来越偏函数式编程。

动态语言受欢迎

由于动态语言越来越受欢迎,NET和Java都注意到这样的现象,试图让动态语言可以更容易地整合到自己的平台上。Java阵营的DaVinciMachine,微软的DLR(DynamicLanguageRunti-me)都是这种趋势下的产物。我们可以预期在不久的未来,动态语言会更加蓬勃发展。

动态语言势力之广,可能远远超出你的想象,下面列出常见的动态语言:D、JavaScript、、Erlang、Groovy、Lisp、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Smalltalk、Tcl、VBScript。

究竟动态语言有什么样的魅力?因为动态语言可以用更简单的方式,做到静态语言很难做到的事。我很难用三言两语介绍动态语言的特点,而且动态语言的定义也似乎见仁见智,值得写一篇专文好好地介绍。

函数式语言崭露头角

除了动态语言,函数式语言也是一种趋势,连微软都推出了F#。去年年中我在台湾微软讲过两场F#的讲座,听众不少,显示大家对这类编程技术相当好奇。

函数编程(FP)长期以来没有出现在主流的商业软件世界,真正让FP无法被接受的原因可能是“执行效率”。传统上,函数式编程语言的效率确实比命令式(imperative)编程语言来得差,这在商业系统上是不能忍受的。但是这个原因却有了变化。今天,我们有了新的衡量标准:“简单”、“快速开发”比其他因素都更重要,因为现在软件的复杂度已经到了我们无法忍受的地步,而IT产业的竞争也比以往激烈许多。

想要“简单”、“快速开发”,就要用比较高阶的抽象,因此函数式编程比命令式编程更适合现在的开发环境。这些年来硬件的进步,使得函数式编程的效率不再是大问题;甚至由于编译技术的进步,函数式编程语言的执行速度,现在也已经不再是吴下阿蒙。

近年来硬件的发展,使得局势似乎180度反转成为对FP有利的局面:多CPU、多核心、超线程(HyperThreading)的硬件架构普及,以及分布式运算的流行,这根本就是专为滋养FP繁殖而打造的环境。

但是,大多数的程序员想从OO或者procere式的编程方式,转到FP,难度是不小的。

语言联合国

当一个系统比较大的时候,使用混合语言编程是很常见的,因为:

每个语言都有适合使用的时机,一个大系统可以分成多个次系统或模块,每个次系统都有不同的特质,适合采用不同的语言。

大系统开发时,开发者的人数变多。每个人倾向于使用自己熟悉的语言和工具。

以我自己的例子来说,基于上面的考虑,我规划的系统,同时使用C、C#、REBOL、Lua,未来可能还会加入Erlang。我们用C进行系统编程(处理低阶的,和操作系统相关的部分),使用C#写跨平台的服务器(未来考虑用Erlang取代),使用REBOL写解析器和编译器,使用Lua作内部脚本语言。每个语言各适其所。

使用混合语言的开发方式,另一个好处是程序员擅长什么就用什么。学习一个语言到精通的地步,需要很长的时间。我们无法要求自己团队的程序员都能使用某个我所熟悉的语言,可以退而求其次,让他们用自己最熟悉的语言,只要开发出来的东西符合我们规定即可。

使用混合式语言开发,只要模块切割得当,接口定义清楚,架构设计正确,那么绝对是可行的。这是我的经验之谈。

但是也请注意,混合多语言可能会导致维护难度的提高。当开发某模块的人离职,且当初他所使用的语言没有其它人会,这个时候麻烦就来了。

混合多种语言开发系统,有可能要面对语言之间的阻抗(impedance)问题,就好像不同国家之间会有不同的文化隔阂一样。好的系统设计应该要考虑到这一点,减少模块之间的接触点,设法让语言之间的阻抗降到最低。

我的建议

如果你想培养一个全能的联合国梦幻开发团队,我的建议是要集合下面的语言人才:

C:进行系统开发

C:进行COM与传统的微软技术开发

C#:进行现代的微软技术开发

PHP:进行Web后端开发

JavaScript:进行Web前端开发

Objective-C:进行Mac或iPh-one开发

Java:毕竟许多地方还是会用到Java

Python:进行脚本开发

提出问题:这种功能必须涉及client(客户端)和server(服务器),所以到底client如何和server实现实时连接通讯?

分析问题:这种功能实际上就是数据同步,同时要考虑手机本身、电量、网络流量等等限制因素,所以通常在移动端上有一下两个解决方案:

1一种是定时去server查询数据,通常是使用HTTP协议来访问web服务器,称Polling(轮询);

2还有一种是移动端和服务器建立长连接,使用XMPP长连接,称Push(推送)。(按照本人理解:客户端的实现时:

while(true) {

 request(timeout);

 request(timeout);

}

客户端发出一个“长”请求,如果服务器发送消息或者时间out了,客户端就断开这个请求,再建立一个长请求

从耗费的电量、流量和数据延迟性各方面来说,Push有明显的优势。但是使用Push的缺点是:

对于客户端:实现和维护相对成本高,在移动无线网络下维护长连接,相对有一些技术上的开发难度。

对于服务器:如何实现多核并发,cpu作业调度,数量庞大的长连接并发维护等技术,仍存在开发难点。

在讲述Push方案的原理前,我们先了解一下移动无线网络的特点。

移动无线网络的特点:

因为 IP v4 的 IP 量有限,运营商分配给手机终端的 IP 是运营商内网的 IP,手机要连接 Internet,就需要通过运营商的网关做一个网络地址转换(Network Address Translation,NAT)。简单的说运营商的网关需要维护一个外网 IP、端口到内网 IP、端口的对应关系,以确保内网的手机可以跟 Internet 的服务器通讯

 

原理图如下:

 

                                         

        

GGSN(Gateway GPRS Support Node 网关GPRS支持结点)模块就实现了NAT功能。

因为大部分移动无线网络运营商都是为了减少网关的NAT映射表的负荷,所以如果发现链路中有一段时间没有数据通讯时,会删除其对应表,造成链路中断。(关于NAT的作用及其原理可以查看我的另一篇博文:关于使用UDP(TCP)跨局域网,NAT穿透的心得)

 

Push在Android平台上长连接的实现:

既然我们知道我们移动端要和Internet进行通信,必须通过运营商的网关,所以,为了不让NAT映射表失效,我们需要定时向Internet发送数据,因为只是为了不然NAT映射表失效,所以只需发送长度为0的数据即可。

这时候就要用到定时器,在android系统上,定时器通常有一下两种:

1javautilTimer

2androidappAlarmManager

分析:

Timer:可以按照计划或者时间周期来执行相关的任务。但是Timer需要用WakeLock来让CPU保持唤醒状态,才能保证任务的执行,这样子会消耗大量流量;当CPU处于休眠的时候,就不能唤醒执行任务,所以应用于移动端明显是不合适。

AlarmManager:AlarmManager类是属于android系统封装好来管理RTC模块的管理类。这里就涉及到RTC模块,要更好地了解两者的区别,就要明白两者真正的区别。

RTC(Real- Time Clock)实时闹钟在一个嵌入式系统中,通常采用RTC 来提供可靠的系统时间,包括时分秒和年月日等;而且要求在系统处于关机状态下它也能够正常工作(通常采用后备电池供电),它的外围也不需要太多的辅助电路,典型的就是只需要一个高精度的32768KHz 晶体和电阻电容等。(如果对这方面感兴趣,可以自己查阅相关资料,这里就说个大概)

好了,回来正题。所以,AlarmManager又称全局定时闹钟。这意味着,当我用使用AlarmManager来定时执行任务,CPU可以正常地休眠,只有在执行任务是,才唤醒CPU,这个过程是很短时间的。

下面简单来说明其使用:

1类似于Timer功能:

//获得闹钟管理器

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

//设置任务执行计划

amsetRepeating(AlarmManagerELAPSED_REALTIME, firstTime, 51000, sender);//从firstTime才开始执行,每隔5秒再执行

2实现全局定时功能:

//获得闹钟管理器

AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

//设置任务执行计划

amsetRepeating(AlarmManagerELAPSED_REALTIME_WAKEUP, firstTime, 51000, sender);//从firstTime才开始执行,每隔5秒再执行

总结:在android客户端使用Push推送时,应该使用AlarmManager来实现心跳功能,使其真正实现长连接。

在服务器端的实现:

在服务器端,可以使用很多语言来实现,如C/C++,java,Erlang等等,如我们国内比较好的极光推送(C开发),openfire(java开发)等等。

最近我看了极光推送的介绍和原理,下面我就说说他们是遇到什么难题,然后使用什么技术或者方案来解决呢。

当有大量的手机终端需要与服务器维持长连接时,对服务器的设计会是一个很大的挑战。

假设一台服务器维护10万个长连接,当有1000万用户量时,需要有多达100台的服务器来维护这些用户的长连接,这里还不算用于做备份的服务器,这将会是一个巨大的成本问题。那就需要我们尽可能提高单台服务器接入用户的量,也就是业界已经讨论很久了的 C10K 问题。

C2000K

针对这个问题,他们专门成立了一个项目,命名为C2000K,顾名思义,他们的目标是单机维持200万个长连接。最终他们采用了多消息循环、异步非阻塞的模型,在一台双核、24G内存的服务器上,实现峰值维持超过300万个长连接。

最后总结:

        因为我最近用java在做一个PC、服务器、android的即时通讯系统(说白了就是模仿QQ,后面希望有不同的功能)。我的原则是用别人的原理,自己来实现,这样才更好深入了解一些框架。所以,估计难点是在通讯开发和服务器上的开发,必须深刻了解多消息循环、异步非阻塞的模型。之后我会发表关于这方面的实现。

       在现在的android平台上,已经不是android单机的世界了(我不是说做单机游戏没有前途)。现在都是依靠发展蓬勃的互联网来支撑整个IT体系,所以,要成为一个android应用开发高手,必须朝着android、硬件、云服务这一体系来发展。

如果你想转行,我建议你可以转行做工程师或者参与一些游戏的工程师,都很不错。当然,你可以根据个人喜好来选择。你最好选择计算机行业,因为毕竟你已经做过了,学什么都可以很快。

运维工程师。负责日常维护,保证整个服务的高可用性,不断优化系统架构,提高部署效率,优化资源利用率,提高整体ROI。简单来说就是保证业务(如网站、游戏服务器)的长期稳定运行,同时保证数据(如用户名、密码、数据)的安全可靠。

如果只是为了谋生而写代码,换语言可能会对你的职业生涯产生影响,因为不同的编程语言和它们的技能是不一样的,学习基类需要一定的学习时间。虽然编程的原理是一样的,但是体验是不一样的。毕竟要想在某个领域深耕,不是一两天,甚至不是一两年。所以我个人建议要不断提高,努力掌握其中一门编程语言。

软件测试工程师。测试应该是与开发联系最紧密的岗位。转行相对简单,有代码基础。您也可以稍后执行性能测试。如果真的不想写代码,做功能测试就好,至少会轻松很多,当然工资也会降低。其次,测试对整个项目或产品有很高的业务要求。如果你发展了,你只需要知道你想做的生意。但是一个项目中可能只有一两个测试,需要对整个产品的业务流程有很好的了解。如果您更喜欢业务而不是功能实现,您可以选择测试。

向项目管理发展。项目管理可以说是程序员开发比较便捷的方式。目前,软件项目经理是人才市场上的热门人才,经验丰富、外语好的软件项目经理是一个热点。供不应求,工资自然上涨。最重要的是,一个优秀的项目经理能够长期在这个岗位上工作,并且有进一步晋升到高层的可能。

机器语言为纯粹的机器代码,机器语言是有0,1,0,1的二进制代码组成,可以由计算机直接执行。汇编语言为8086汇编、Win32汇编、NET的汇编;高级语言又分为Java、Basic、Pascal、Object Pascal、C、C++、C#、ASP、Perl、PHP、SQL等等(是纯粹的编程语言) 扩展资料

 常用编程语言汇总及其用途

 C:操作系统、嵌入式、驱动开发

 C++:图形图像、科研、通信、桌面软件、游戏、游戏服务器

 C#:Windows桌面软件、NET Web、服务器

 Java: Java SE:跨平台的桌面应用,Android;Java EE:企业级应用,web开发、服务器后端;Java ME:手机应用、流行于非智能机时代;Java Android:用于安卓开发应用

 GO:高性能服务器应用,比较年轻

 Erlang:高并发服务器应用,多用于游戏

 Python:Web、科学计算、运维

 Ruby:web

 Perl:运维、文本处理,用的较少

 Lisp:科研,一种逻辑语言,用于人工智能

 Node:一个JavaScript运行环境(runtime)

 Haskell:Haskell是一种标准化的、通用纯函数编程语言,数学逻辑方面

 Scala:一种类似Java的编程语言,集成面向对象编程和函数式编程的各种特性

 Javascript:前端,在node中可以做后端

 HTML/CSS:标记语言,主要是给前端工程师构建页面使用

为什么golang的开发效率高?

golang是一编译型的强类型语言,它在开发上的高效率主要来自于后发优势,不用考虑旧有恶心的历史,又有一个较高的工程视角。良好的避免了程序员因为“ { 需不需要独占一行 ”这种革命问题打架,也解决了一部分趁编译时间找产品妹妹搭讪的阶级敌人。

它有自己的包管理机制,工具链成熟,从开发、调试到发布都很简单方便;

有反向接口、defer、coroutine等大量的syntactic sugar;

编译速度快,因为是强类型语言又有gc,只要通过编译,非业务毛病就很少了;

它在语法级别上支持了goroutine,这是大家说到最多的内容,这里重点提一下。首先,coroutine并不稀罕,语言并不能超越硬件、操作系统实现神乎其神的功能。golang可以做到事情,其他语言也可以做到,譬如c++,在boost库里面自己就有的coroutine实现(当然用起来跟其他boost库一样恶心)。golang做的事情,是把这一套东西的使用过程简化了,并且提供了一套channel的通信模式,使得程序员可以忽略诸如死锁等问题。

goroutine的目的是描述并发编程模型。并发与并行不同,它并不需要多核的硬件支持,它不是一种物理运行状态,而是一种程序逻辑流程。它的主要目的不是利用多核提高运行效率,而是提供一种更容易理解、不容易出错的语言来描述问题。

实际上golang默认就是运行在单OS进程上面的,通过指定环境变量GOMAXPROCS才能转身跑在多OS进程上面。有人提到了的pomelo,开源本来是一件很不错的事情,但是基于自己对callback hell的偏见,我一直持有这种态度:敢用nodejs写大规模游戏服务器的人,都是真正的勇士 : ) 。

2、Erlang与Golang的coroutine有啥区别,coroutine是啥?

coroutine本质上是语言开发者自己实现的、处于user space内的线程,无论是erlang、还是golang都是这样。需要解决没有时钟中断;碰着阻塞式i\o,整个进程都会被操作系统主动挂起;需要自己拥有调度控制能力(放在并行环境下面还是挺麻烦的一件事)等等问题。那为啥要废老大的劲自己做一套线程放user space里面呢?

并发是服务器语言必须要解决的问题;

system space的进程还有线程调度都太慢了、占用的空间也太大了。

把线程放到user space的可以避免了陷入system call进行上下文切换以及高速缓冲更新,线程本身以及切换等操作可以做得非常的轻量。这也就是golang这类语言反复提及的超高并发能力,分分钟给你开上几千个线程不费力。

不同的是,golang的并发调度在i/o等易发阻塞的时候才会发生,一般是内封在库函数内;erlang则更夸张,对每个coroutine维持一个计数器,常用语句都会导致这个计数器进行reduction,一旦到点,立即切换调度函数。

中断介入程度的不同,导致erlang看上去拥有了preemptive scheduling的能力,而golang则是cooperative shceduling的。golang一旦写出纯计算死循环,进程内所有会话必死无疑;要有大计算量少i\o的函数还得自己主动叫runtimeSched()来进行调度切换。

3、golang的运行效率怎么样?

我是相当反感所谓的ping\pong式benchmark,运行效率需要放到具体的工作环境下面考虑。

首先,它再快也是快不过c的,毕竟底下做了那么多工作,又有调度,又有gc什么的。那为什么在那些benchmark里面,golang、nodejs、erlang的响应效率看上去那么优秀呢,响应快,并发强?并发能力强的原因上面已经提到了,响应快是因为大量非阻塞式i\o操作出现的原因。这一点c也可以做到,并且能力更强,但是得多写不少优质代码。

然后,针对游戏服务器这种高实时性的运行环境,GC所造成的跳帧问题确实比较麻烦,前面的大神 @达达 有比较详细的论述和缓解方案,就不累述了 。随着golang的持续开发,相信应该会有非常大的改进。一是屏蔽内存操作是现代语言的大势所趋,它肯定是需要被实现的;二是GC算法已经相当的成熟,效率勉勉强强过得去;三是可以通过incremental的操作来均摊cpu消耗。

用这一点点效率损失换取一个更高的生产能力是不是值得呢?我觉得是值得的,硬件已经很便宜了,人生苦短,让自己的生活更轻松一点吧: )。

4、基于以上的论述,我认为采用go进行小范围的MMORPG开发是可行的。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 现在做程序主要用哪些软件?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情