Bjarne Stroustrup Previews C++ 17

本文是infoWorld关于C++17对C++之父进行的采访,原文见这里


InfoWorld:C++17什么时候可用?

Stroustrup:C++17将会在2017年的某个时间正式发布,可能是在秋季。主要特性的实现会准时或提前完成。其实有些部分现在已经实现了。

InfoWorld:你认为C++17有哪些重大的新特性?

Stroustrup:如何定义重大呢,假如一个语言特性或者库会影响你对这门语言的看法并且影响你的代码结构,那我认为它就是重要的。按照这个定义,很遗憾,我的答案是: 对于绝大多数人来说,C++17并没有重大的特性。请不要把”C++17并无重大改进”这样的文字加粗或者作为文章的标题,因为这是不准确的、是不必要的煽动。我很看好文件库(file system library)和 并行算法(parallel algorithms)。它们特别有用,会使有些任务变简单,但对于大部分人来说,这并不是重大的特性。

然而,我认为重大的特性以其它的方式存在。一些重大的特性会出现在TS(Technical Specifications)中。比如:concepts, networking, more concurrency stuff, ranges (Standard Template Library 2), modules, coroutines. 它们肯定不会被包含在C++17中,但它们确实存在着。

InfoWorld:C++17的哪些改进对开发者影响最大呢?

  • (parts of) Library Fundamentals TS v1
  • Parallelism TS v1 * File System TS v1
  • Special math functions
  • hardware*interference_size * .is_always_lockfree() * clamp()
  • non-const .data() for string

Stroustrup:这因人而异,因你做的事情而异。对我来说,我认为并行算法是最重要的,文件系统库也是很方便的特性. optional, anystring_view这些基础库中的东西也很重要. 另外STL中其它小的改进也很多. 如果你是搞数学的,那么数学库对你是不可或缺的,现在也都在标准库中了。

InfoWorld:7月份能知道C++17所有的特性(facets)吗?

Stroustrup:我希望可以,2016年6月下旬,我们会在芬兰奥卢确定一些小的提议,比如:

  • Dynamic memory allocation for overaligned data (for better vectorization)
  • Template parameter deduction for constructors (make many”make functions” redundant)
  • constexpr_if (a compile-time if)
  • Refining Expression Evaluation Order for Idiomatic C++ (finally, we can eliminate bugs from people accidentally relying on undefined order of evaluation)
  • Default comparisons (==, !=, <, <=, >, and >=)
  • Operator Dot (smart references)
  • Generalizing the Range-Based For Loop (for sentinel-based and counted ranges)
  • Structured bindings (simple use of multiple return types)

只要不是运气太差,这些都可以确定下来的。当然,投票统计之前所有事情都是无法确定的。标准委员会会争取共识,一张否决票顶五张赞成票。和16年3月份通过的决议比较,假如本次通过了大部分决议那C++17将变得更加有趣。

InfoWorld:随着constexpr lambdas进入C++17,C++是不是朝着函数式编程语言更进了一步。这对开发者有什么影响呢?

Stroustrup:自从1994年STL起,C++平稳而谨慎的增加着函数式编程技术的使用。constexpr lambdas只是编译时特性的一个简单扩展。如果structured bindings的决议C++17通过了的话, 多返回值将被支持,就像一些函数式编程语言的函数一样。

InfoWorld:Concepts这个可以改善编译时诊断的技术,没有被加入C++17是不是一件遗憾的事情?

Stroustrup:对我来说是的,这是个巨大的遗憾。从2004年,我就和Gabriel Dos Reis及其他几个人一起,在这个问题上研究了好几年,并且用Andrew Sutton的实现测试了三年的时间。我觉得可以 正式发布这个特性了,但标准委员会的大多数人因为各种原因不同意。一个Concept是对类型和值的集合的编译时断言(predicate)。我认为“更好的错误提示”是Concept最基础且重要的一个优势:我们可以对 我们泛型函数(模板)的参数设定要求。这样可以促成更好的设计、更好的接口、更高效的代码。

InfoWorld:你能不能回答下,为什么modulesco-routines也不会放到c++17.

Stroustrup:我很乐意看到modules可以更好的防范某些单元上下文中的改变(比如宏)和更好的编译速度,但是提议还没有为C++17准备好,所以只能加进TS了。我想最终modules会变成一个重要的特性。 它解决了C/C++里面长期存在的问题。MS C++(vs2015)和clang的某些版本已经有类似modules的支持。对于co-routines没有直接放到c++17而是放到TS中我很失望。我认为它在一些特殊的场景下很重要(pipelines and generators)。 MS Vc++(vs2015)也集成了这个特性。

InfoWorld:为什么你不延期发布一年,以使conceptsmodulesco-routines等特性可以一起发布呢?

Stroustrup:我以前也被问过这个问题,我回答了no, 我们要保证c++17可以按期发布。一次延期会是一次很不好的先例,会导致后面更多的延期。假如c++17变成c++18, 我想c++20会变成c++22或者c++23。

Android 6.0 Openssl Crash

Android 6.0发布将近半年,预计本月推出正式版本。所以开发者们要重视起APP在Android 6.0下的兼容性问题。最近我们的App就遭遇到因6.0更换了OpenSSL库而导致的一个Crash。

Crash的原因:

异常

1
java.lang.unsatisfiedlinkerror dlopen failed cannot locate symbol "openssl_add_all_algorithms_noconf"

你的产品依赖了openssl,而google在Android 6.0中使用了google自己的一个基于openssl分支boringssl,而这个分支在API和ABI上都不兼容openssl。

Google为什么切换openssl

  1. 众所周知openssl存在着很多的问题,包括去年爆出的Heartbleed。目前依然有大量补丁没有被合入openssl主干,而google觉得其中很多补丁非常重要,所以google创建新的分支合入这些补丁。
  2. google以为这个改动很小,绝大多数开发者是不会受影响的。(但据说google自己的youtube一样受影响,可见google想当然了).
  3. google只对NDK标准接口负责,第三方库的接口,google是不保证的。

你的APK中招了吗?

是不是你还在窃喜自己没有基于NDK开发的so,所以没有依赖openSSL。但你可能使用了第三方的so库,而这些库可能用到了openSSL。所以你的产品可能直接或间接依赖openssl. 这里有一个在线检测工具,可以测试自己是否中招。Find apps with the OpenSSL / Android M crash flaw;

解决方案

  1. 静态链接openssl。优点是一劳永逸的解决问题,缺点是APK的增大size。
  2. APK中打包libssl.so、libcrypto.so。如果你依赖的第三方库依赖了openssl, 而你没有权限去改它的代码,这是你唯一的解决方法。同样有size的问题。
  3. NDK中使用jni调用java层的加密相关代码,缺点是复杂。

参考:

  1. Sygic and Waze navigation apps not working on Android M
  2. Finding a Hidden Flaw that Will Crash Apps on Android M

读<程序员的呐喊>

又是一本国外技术圈的名人的博客整理成的书。作者steve yegge是google的程序员,06年之前的7年工作在amazon。丰富的编程经验和自由的个性,使他对各种编程语言和互联网产品有自己独到的见解。

<程序员的呐喊>之呐喊英文书名原为咆哮(Rantings),应该指的是steve yegge对各种语言的攻击。除了对ruby流露出无尽的爱慕外,steve yegge对其它语言无不加以批判:Java的名词王国,Python圈子的傲慢刚愎,Perl像一个各种语言的垃圾填埋厂。除了攻击语言,他还’攻击’自己的所在的公司,除了流露出对旧东家老大贝佐斯的不满,还经常对google的各种产品指指点点。

当然,以上steve yegge的各种吐槽咆哮都是有理有据有礼有节的。从Jeff Atwood1到steve yegge,国内还有coolshell的陈皓,都是技艺精湛、勤于思考、笔耕不辍,在圈子里很有影响力的大牛,放到古代定是名噪一时使洛阳纸贵的才子。而籍籍无名之辈的你我,如不奋起直追,定日复一日年复一年,骈死于需求槽枥之间。

与有缘之人共勉!


  1. blog.codinghorror.com, 博客集整理成书,中文版<高效能程序员的修炼>

MongoDB中的$in和$elemMatch

PC客户端开发多年,一直想涉足下Web开发,进入15年,想起14年有一个计划是用ruby写一个网站,已经无法完成了!亡羊补牢也不晚,于是动手搞起,打算山寨goodreads的quotes板块,已经草草的实现了部分功能-看这里, 其中数据库部分使用到是MongoDB, 使用MongoDB的原因是新鲜、好玩、简单,MongoDB确实比较容易理解,花2个小时看了一遍the-little-mongodb-book就可以上手干活了。

但高级些的用法还是需要细读官方文档,不然还是会出错,最近自己就在$in和$elemMatch上栽跟头,花费了大把时间。

1
{ _id: 1, quote: "不要着急,最好的总会在最不经意的时候出现", author: 泰戈尔, tags: [ "哲理", "人生" ]}

比如(上面的例子),我需要根据tag哲理查找tags中包含哲理的记录,怎样写query语句呢?借助于万能的google,$in和$elemMatch很快进入了我的视线,从字面理解,$in是查询指定field是否在某个集合中,看mongo的官方文档$in的用法也确实是这样讲的:

The $in operator selects the documents where the value of a field equals any value in the specified array.

一眼看去,并不适于我们的需求。再看看$elemMatch:

The $elemMatch operator matches documents in a collection that contain an array field with at least one element that matches all the specified query criteria.

$elemMatch专门用于查询数组Field中元素是否满足指定的条件。看起来适合我们的需求,像这样:

1
 db.items.find({"tags": {$elemMatch: {$equal: "哲理"}}}) ;错误

上面的用法是错误的,因为mongo并没有$equal查询指令, 所以我们无法用$elemMatch达成我们的需求。

当发现$elemMatch无法满足功能需求时,自己陷入了错误的方向:怀疑用错了$elemMatch, 然后就一直在网上看别人如何使用$elemMatch的, 而没有回头看下$in到用法,直到走投无路时。我发现$in到第二个用处:

Use the $in Operator to Match Values in an Array

并且官方示例和自己的需求场景几乎一模一样,接着当然自己很快实现了按tag查找的功能:

1
db.items.find({"tags": {$in: ["哲理"]}})

总结下$in和$elemMatch:

  • $in要查询的Field可以是普通值也可以是数组,而$elemMatch则是专门用于查询array Field的。
  • $in的查询相对简单,主要是查询值或数组中某个值是否在待查询列表中.
  • $elemMatch的查询则比较复杂,是查询Array Field中的元素是否满足一系列的查询条件。

Windbg关联dmp文件

最近一段时间和Crash斗争,每天必不可少的事情是分析dump,每天少则分析几个,多则分析几十个是常有的。而打开dump到进入windbg cmd窗口输入!analyze -v命令是机械枯燥的事情。Windbg是没有默认关联.dmp文件的,只能自己动手了。分享关联方法之前,看下我现在dump文件的打开方式:

我设置了三种打开方式:

  • 直接使用Windbg打开dump
  • 使用windbg打开dump并进行分析
  • 使用windbg打开dump,切换到32位,然后分析(针对加载的wow64)

配置dmp关联的方法

1. 设置dmp文件的关联

Windows下文件的关联指的是在explorer下,双击或通过右键打开文件时选择指定程序打开。文件的关联方式可以通过注册表进行配置,在HKEY_CLASSES_ROOT、HKEY_CURRENT_USER\Software\Classes、HKEY_LOCAL_MACHINE\Software\Classes有以 “.文件格式” 命名的键和另一个自定义的键里面保存具体的配置,用来配置这个文件格式的关联,比如我们要配置的dmp文件的关联,最终会是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HKEY_CURRENT_USER\Software\Classes
   dmpfile
     DefaultIcon
       default = "C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe",0
     shell
       Analyze with windbg
           command
              default=C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -c "!analyze -v" -z "%1\"
       Analyze with windbg - wow64
           command
              default="C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -c "!wow64exts.sw; !analyze -v" -z "%1"
       open
           command
              default="C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -z "%1"
   .dmp
     default = dmpfile

当然,更改HKEY_CURRENT_USER是对当前用户有效,HKEY_LOCAL_MACHINE是对所有用户有效,而HKEY_CLASSES_ROOT是兼容的产物,不推荐在直接配置HKEY_CLASSES_ROOT。

2. 去除用户自定义的打开方式-自定义程序

如果你设置过打开方式里面的自定义程序,必须先删除这一项,否则我们上一步设置的文件关联将不会生效,打开方式自定义程序的配置也是保存在注册表中,具体位置在:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dmp\UserChoice

将这个UserChoice键删除即可。

3. 到这里就讲完了,最后奉上一个bat:

(windbg-dump-asso.bat) download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@echo off

set dbgpath=\"C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe\"


REG ADD "HKCU\Software\Classes\.dmp" /f /d dmpfile

set val=%dbgpath%,0
REG ADD "HKCU\Software\Classes\dmpfile\DefaultIcon" /f /d "%val%"

set val=%dbgpath% -z \"%%1\"
REG ADD "HKCU\Software\Classes\dmpfile\Shell\open\command" /f /d "%val%

set val=%dbgpath% -c \"!wow64exts.sw; !analyze -v\" -z \"%%1\"
REG ADD "HKCU\Software\Classes\dmpfile\Shell\Analyze With Windbg  - wow64\command" /f /d "%val%"

set val=%dbgpath% -c \"!analyze -v\" -z \"%%1\"
REG ADD "HKCU\Software\Classes\dmpfile\Shell\Analyze With Windbg\command" /f /d "%val%"

REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dmp\UserChoice" /f

set /p finish="finsh!"

参考:

http://msdn.microsoft.com/en-us/library/cc144158%28VS.85%29.aspx

http://msdn.microsoft.com/en-us/library/windows/hardware/ff561306.aspx