来自 TIOBE 的 2007 年度总结

以下是来自 TIOBE 的 2007 年度语言总结。Python 荣获 "2007年度最佳语言" 称号。

  • Python 荣获 "年度最佳程序设计语言" 称号。虽然评分差距不大,但是最后 Python 还是以 2.04% 的评分年增长率夺得头筹。与 C# 等语言不同,似乎没有什么显而易见的原因导致 Python 能获得如此巨大的进步。12月份, Python 有史以来第一次超过了 Perl ,这意味着 Python 已经成为系统级的 "标准"。而事实上,Python 也成为了系统管理员和编译经理们的最爱。对于 Python 来说,由于 Python 3 即将发布,2008 年又将迎来一次新的飞跃。

  • 从 2007 年的数据我们可以发现一些有趣的现象:首先,不具备自动垃圾收集机制的语言正在迅速地衰落,以 C / C++ 最为显著(二者差不多都下跌了 2%)。其次,虽然表面上风平浪静,脚本语言之间的竞争也越来越激烈:新的脚本语言不断涌现。2006年 Ruby 进入了我们的视线;2007年 Lua 紧随其后;现在 Groovy 和 Factor 这些新生儿也进入了前 50 。所谓 "长江后浪推前浪,前浪死在沙滩上",并没有一种脚本语言能够长久地占领鳌头。

  • 2007 年进步最大的语言:Lua 从 46 上升到 16; Groovy 从 66 上升到 31; Focus 从 78 上升到 41, 还有 Factor 从无名小卒晋升到了 45 名。

  • 同样,也有失意者:ABAP 从 15 名下跌到 29,IDL 从 23 名跌到了 48。

  • 在 2007 年初,TIOBE 作出了这样的预言:

      • C# 和 D 将会取得很大胜利;而Perl 和 Delphi 将失败。

    C# 的确非常成功,Perl 也的确失败了。然而 D 语言 和 Delphi 的预言则完全错误:D 语言一点动静都没有,而 Delphi 仍然停留在前 10 名。

    • 关于 2008 年的预言:
      • C、C++ 和 Perl 将继续衰退;
      • Java 和 C# 将毫无悬念地成为两大最受欢迎的语言;

    C 和 C++ 将由于缺乏自动垃圾收集机制而继续衰退,尤其是在 Microsoft 不再主动支持 C++ 的情况下,C++ 会获得更坏的影响。Perl 现在似乎已经没什么悬念了。Java 和 C# 在 2007 年做的非常好,相信 2008 年将会继续保持强劲的势头。至于其他可能进入前 20 的语言,现在还很难进行预测,不过 TIOBE 看好 ActionScript 和 Groovy 。

  • 将svnserve架设的Subversion服务器加入Windows服务中

    由于没有适合Apache 2.2.6的Subversion版本,一直使用svnserve.exe作为Subversion服务器。使用的时候都要先开启svnserve -d -r "路径" 这个批处理文件,而且一直有一个DOS窗口开着,很烦。

    今天查了一下svnserve的参数,发现一个 –service 模式。进行资料查询以后,成功将其加入Windows的服务之中。

    具体方法:使用命令行输入以下命令:

    sc create svnserve binpath= ""F:Program FilesSubversionbinsvnserve.exe" –service -r 路径" displayname= "Subversion" depend= tcpip start= auto

    该命令将在Windows服务中增加一条名为"Subversion"的服务。手动将其启动(或重启之后也将启动),即可正常使用。

    此后,svnserve将一直处于启动的状态。

     

    详细内容,可以参考http://svn.collab.net/repos/svn/trunk/notes/windows-service.txt

    从已有的数据库生成建立数据库的SQL语句

    在调试的时候不断地修改数据库的设计,最后需要根据修改好的数据库建立install.php文件。

    使用MySQL自带的mysqldump.exe即可完成该功能。

    mysqldump -c -d -uuser -ppassword TeleWeb >test.txt

    之后对test.txt进行少量的修改即可

    注:mysqldump的参数很多,这里不再列出。

    参见:

    php调用dll经验小结

          最近做一个网站,需要频繁使用远程数据,数据接口已经做好。在做转换的时候遇到了性能上的问题:开始打算用php来实现转换,苦苦查了数天,都没有找到直接操作字节的方法。虽然可以使用 pack() 方法将各个数据压入结构中,但是在解压的时候却不能通过 unpack() 简单的解出来,需要通过

    //php code
    for( $i = 0; $i < $length; $i+=2 ){
        $tempstr = $tempstr.chr( hexdec(substr($array["data"], $i, 2)) );
    }
    $array["data"] = $tempstr;

          这类方法进行解码。频繁的使用各种字符串操作,无疑将对性能造成很大的影响。经过研究,发现有以下方法可以实现对字节的操作:

    • 使用stream进行读写
    • 使用socket进行读写
    • 使用COM dll,将数据在C++ dll中进行转换

          由于网上找不到相关的文档(其实是没好好找),stream和socket先后被PASS掉了。为了编译COM的dll,还专门下载了VC++ 6.0(为啥不装2005?硬盘太小,装不下,没办法啊)。经过无穷无尽的Google(全是php调用VB写的dll的信息,没多大帮助)和编译/调试,终于成功的把结果传递到php中。
          下面简单介绍一下步骤和注意事项

    1. 在VC++ 6.0中,File -> New…  选择Projects中的"ATL COM AppWizard",填写工程名称等。本例中,工程名为"ATLtest"。
    2. 在"ATL COM AppWizard – Step 1 on 1"对话框中,"Server Type" 选择"Dynamic Link Library (DLL)",之后Finish。
    3. 在"ClassView"中,右击"ATLtest",选择"New ATL Object…",在"ATL Object Wizard"中,选择默认的"Simple Object",之后"Next"。
    4. 在"ATL Object Wizard 属性"中,在"Short Name"输入接口的名称。本例中,接口名称为"test"。之后,"Names"选项卡中的所有textBox都自动填好了默认的值。注意两个地方:一个"Prog ID"(本例中为"ATLtest.test"),一个"Interface"(本例中为"Itest")。
    5. 完成之后,在"ClassView"中,"ATLtest classes"下生成了"Ctest"类,并且实现了"Itest"接口。
    6. 右击"Itest"接口,选择"Add Method…"。
    7. 在"Add Method to Interface"中,填写方法的名称和参数。注意:返回值一定是HRESULT型,真正的返回值是最后一个参数。比如
      //C++ code
      BSTR Encode(unsigned int msgType, unsigned int msgLength, BSTR message)

      这个函数,要写成

      //C++ code
      STDMETHODIMP Ctest::Encode(
          unsigned int
      msgType,
          unsigned int
      msgLength,
          BSTR message,
          BSTR *result
      )

      这样的形式。还有就是返回值只接受简单的类型(不知道为什么,char**不能用)和指针,BSTR没法直接使用。

    8. 完成这个函数。当然,为了简单起见,这里就是给结果随便赋了一个值,用来说明参数成功的传递出来了。没有考虑任何内存泄漏问题。
      //C++ code
      STDMETHODIMP Ctest::Encode(
          unsigned int
      msgType,
          unsigned int
      msgLength,
          BSTR message,
          BSTR *result
      )
      {
          BSTR temp = ::SysAllocString(L"asdfasdf");
          *result = temp;

          return S_OK;
      }

    9. 编译,将得到的ATLtest.dll使用regsvr32进行注册,之后才能使用COM进行调用。
    10. 之后书写这样的php代码:
      //php code
      $com = new COM("ATLtest.test") or die("无法建立COM组件");
      $result = "未处理的字符串";
      echo ‘$result = "’.$result.‘"<br />’;

      $result = $com->Encode(1,1,"11");
      echo ‘$result = "’.$result.‘"<br />’;

      $com = null;

    11. 注意这里的"ATLtest.test"是刚才(4)中的"Prog ID",并且使用Encode() 的方法和声明的也不一样。没有关系!
      当然,由于完全没有用到三个输入参数,这里的1,1,"11"只是为了满足输入参数的数量。
    12. 这个php的输出是什么样的呢?
      //HTML 结果
      $result = "未处理的字符串"
      $result = "asdfasdf"

      可见,$result 成功的改变成了dll中赋的值,说明 Encode() 方法成功的返回了值。

    几点疑问

    1. 为什么 Encode() 中返回的是 BSTR* ,但是到了php中,就变成了字符串(BSTR) 呢?这个自动的转换是ATL进行的,还是php进行的呢?
    2. C++代码中通过SysAllocString()为BSTR分配的空间在何时进行垃圾收集?收集工作由哪里负责?会不会导致内存泄漏?
    3. 完恶的C++ 6.0 编译器,为什么返回值不支持 char** 这种简单的类型呢(使用char**直接编译出无数错误)? BSTR本质上就是指针嘛,也不支持(提示说只支持简单类型和指针),只好用一个不伦不类的BSTR*来写。嗯,下一步尝试改用CCOMBSTR或者_bstr_t,试试哪个更好用。
    4. 对于传入的BSTR* result,需要使用 SysFreeString() 进行处理么?在C++中看来,无疑是需要释放的;但是php在背后做了哪些工作呢?有没有对未被引用的常量"未处理的字符串"进行垃圾收集呢?

    参考资料
         
    以下资料比较有参考价值:

    计算机语言正向多元化发展

    再次回到 TIOBE 的语言排名,结合8月份的比较可以看出,这三个月来,C(-3.23%)和C++(-2.30%)的下降速度明显增大,而Ruby(+1.37%)和D(+1.02%)语言以1.02%的增幅继续保持着良好的上升。Lua(+0.66%)涨势减缓,而Perl(-1.49%)和SAS(-1.08%)则显出了跌落的趋势。Basic(+0.76%)和Python(+0.59%)开始抬头,微软在其中起到的作用不可忽视。

    从整体来看,Java虽然从21.77%下降到了20.54%,但仍然保持着独大的局面。而前20的语言所占的总数从93.66%下降到了91.65%,也从一个侧面反映了计算机语言正在向多样化的方向发展。

    Position
    Nov 2007
    Position
    Nov 2006
    Delta in Position Programming Language Ratings
    Nov 2007
    Delta
    Nov 2006
    Status
    1 1 Java 20.542% +0.14%   A
    2 2 C 13.969% -3.23%   A
    3 4 (Visual) Basic 10.228% +0.76%   A
    4 3 C++ 8.750% -2.30%   A
    5 5 PHP 8.687% -0.52%   A
    6 6 Perl 4.738% -1.49%   A
    7 7 Python 4.227% +0.59%   A
    8 8 C# 3.917% +0.89%   A
    9 12 Ruby 3.084% +1.37%   A
    10 9 JavaScript 2.928% +0.62%   A
    11 10 Delphi 2.456% +0.20%   A
    12 14 D 1.704% +1.02%   A
    13 13 PL/SQL 1.179% -0.04%   A
    14 11 SAS 1.129% -1.08%   A
    15 16 Lisp/Scheme 0.754% +0.17%   A–
    16 48 Lua 0.746% +0.66%   A–
    17 17 COBOL 0.708% +0.14%   A–
    18 15 ABAP 0.647% +0.01%   A–
    19 19 Pascal 0.639% +0.12%   B
    20 18 Ada 0.613% +0.07%   B

    MySpace.cn:面试

    昨天接到面试通知,今天一早就赶到了老校区。

    提前20min到达面试地点,和工作人员了解了一些 MySpace 的现状,弥补了没参加宣讲会的不足。拿试卷的时候瞄了几眼,发现主观题拿到了满分(嘎嘎)。不过客观题只拿到60%,嗯嗯……

    面试过程没什么多说的,直达2面。参加二面的刚好就是昨天笔试坐第一排的俩人……

    面试快结束的时候才发现和我一起参加面试的是西工大的研究生@@,之后又发现面试官是 Yahoo! 中国的前CTO(我没听错吧?)……总之收到很大刺激。看来这回 MySpace 是下了血本发展中国市场了,挖了一批牛人来。

    结果要等两天才知道,因此就不多说了。

    MySpace.cn:新的征途(?)

    下午参加了 MySpace 的笔试,晚上就接到了面试通知。话说选择题的判卷效率还真的不是一般的高啊……

    下午2点举行的宣讲会邀请到 MySpace 中国CEO 罗川(也是 MSN 中国区的前CEO)进行宣传,不过等到我从公交车上挤下来,然后挤到熙熙攘攘的图书馆,宣讲已经进入尾声。我只来得及赶上一句“已经网投过的同学可以离场了”,就被半赶半挤地’请’出来了……

    笔试由50道选择题,2道算法题和3道简答题构成。搞笑的是监考的工作人员居然特别强调不许作弊,以及不许使用手机(哪年的传统啊)。于是在第一时间判断出题目很简单。果然,选择题忽略,依然是考IQ;算法题只要求将给定的C风格字符串反转(哪年的题啊……),以及说明 nth_element()的用法(这个当年恶补STL的时候好好的看过)。简答题则分别考察了 Web 2.0 、RSS 以及 Web Service 的概念和个人的理解。恰好都在我的知识覆盖领域之内,于是……水过。

    今年 MySpace 在中国四所城市进行校园招聘。经过网投,受邀参加陕西地区 .NET 开发工程师 笔试的人只有7名,加上现场投递简历的人员(一般来说会有研究生,及’霸王试’的人员),本应有十余人参加笔试。然而真正坐下来进行考试的却只有2人。教室里的大部分人不知 .NET 为何物,而集中在全国只招15名的C++开发部门。答最后一题时,工作人员好心地提醒我还有一面题(当然,我已经做完那一面了,嘎嘎);开考1小时,把检查过两遍(居然检查出一道错题)的试卷交了(我的一贯风格),然后在一教室人的各种目光的注视下扬长而去……

    PS:为了坐免费的校车回新校区,之后参加了恒生电子股份有限公司(杭州一金融IT行业)的宣讲会,并也得到了笔试的邀请。话说宣讲会这东西不能参加,参加了以后就有想投简历的冲动……

    作为 Web 2.0 时代的成功网站代表(2005年 MySpace 被新闻集团以5.8亿美元的价格收购,因此也成为了互联网小团队成功创业的代表),MySpace 在欧美市场获得了相当大的成功,注册用户已逾两亿,年广告收入约5.25亿美元,Alexa 排名达到第6。然而要进军中国市场,还有很多需要改善的地方。相对于欧美,中国大陆的互联网应用人群非常集中,因此通过校园活动(音乐会等)所进行的宣传无疑是正确(而且成功)的,但是 MySpace 意图通过社区和音乐作为特色进行用户笼络,则是一大败笔(MSN 的失败一定程度上也是因为这一点)。

    国内成熟的社区有很多,天涯(得到 Google 注资)、猫扑(被收购到千豫旗下)等著名社区均通过并购的方式获得了大笔进行商业运作的资金,以校内网 为代表的 2.0 时代SNS更是通过收购而一举成名(进而达到一发而不可收拾的地步)。通过模仿腾讯进行的网络营销模式似乎永远都没有赔钱的。然而,Chinaren、5416等传统SNS的淡出,以及 MSNYahoo! 在中国市场的惨败(相对于其国际市场上的成功)也在时刻提醒着我们:互联网泡沫仍然存在。正如俗话所说:投资有风险,入’网’ 需谨慎。

    回到本文的标题,无论是 MySpace 在中国的发展前景,还是我个人是否进入这一领域,都还是一个未知数。因此在’新的征途’之后,加上了一个不大不小的问号。