Rust语言的异步编程模型和协程支持
通用的注重性能的现代编程语言都在慢慢地加入对异步编程和协程模型的支持,作为一门强调性能和零成本抽象的语言,Rust自然也不甘落人之后。 可能是因为Rust语言社区出于对自身特殊的生存周期管理机制多带来的其它语言所有没有的额外的编译器实现复杂性,以及开放语言生态系统中的功能开发优先级(它迄今为止还在快速演进中)考...
通用的注重性能的现代编程语言都在慢慢地加入对异步编程和协程模型的支持,作为一门强调性能和零成本抽象的语言,Rust自然也不甘落人之后。 可能是因为Rust语言社区出于对自身特殊的生存周期管理机制多带来的其它语言所有没有的额外的编译器实现复杂性,以及开放语言生态系统中的功能开发优先级(它迄今为止还在快速演进中)考...
作为一门秉承零成本抽象这一极具挑战的目标为语言设计核心的静态变成语言,用Rust语言来编写一些文本处理程序可以不需要可以优化就能达到很高的性能。 但是如果我们对已经写就的文本处理程序的性能不甚满意,觉得不够快或者想将它推向性能更高的境地,即需要进一步优化,可能还不得不额外下一些功夫才能做到。
内存模型是现代C++语言标准里面的一个经常不太为人重视的特性;这种忽视大概是由于大部分的程序员关注的还是核心语言特性或者库设施这样的一些比较实用的“硬特性”。 相对而言,内存模型这样的底层的概念和机制看起来更像是给面向程序库编程的底层程序员用的。 然而如果我们想追求极致的应用程序性能,又想追求可移植性、高性能这...
新的C++语言标准的演进越来越强调静态编译(即运行期计算)的优势,因为这一发展方向无疑更贴合现代的C++语言Zero Cost Abstraction的目标; 可惜这样做有个非常明显的副作用就是给编译器带来了巨大的挑战,乃至于稍微复杂一点的项目也动辄需要数个小时才能编译完成。
微服务架构模式是当今炙手可热的企业软件架构范式,经过最近几年的广泛的讨论和优缺点争辩之后已经随着 云原生架构 的逐渐火热而日益呈现星火燎原之势。 抛开这些争论不谈,假设我们需要实现一个微服务架构的服务,是否该用C++语言或者是否能用C++语言呢?
C++20的功能特性已经于3月份冻结,显然这次终于来了一波大的改进,而不再是像之前C++14/C++17那般小打小闹的做小步快跑,尤其是三个讨论很久的大feature终于被合入主干;并且这些feature终将会极大地影响后续C++代码的书写方式。
C++17 推出已经有将近3年的时间,速度快一些的公司才慢慢采纳了6年前的C++14进入正式的生产环境。 程序员们的一个大福利就是终于不用外挂第三方库(无论是准标准的boost还是其它形形色色的其它第三方库)就可以直接方便地使用标准库自带的<regex>来写代码; 这显然比直接使用原始而笨拙的stri...
不同于传统的工业标准的C++/Java语言缓慢的更新节奏(最近几年大家都加快了演进的节奏),Rust从一开始就采用了滚动发布的模型, 基本上是按照固定的步伐每个六个星期就会放出来一个新版本,并且从正式发布了1.0开始,最近两年来一直是保持向后兼容的。 社区在2018年初的时候,就约定好会在18年发一个大版本出来,...
C++标准的演进和推出速度过慢一直被内外社区批评,甚至当第一个21世纪的语言标准终于于2011年发布的时候,标准委员会的人都自嘲说我们是一门计算机语言,所以0x需要用十六进制数表示。 进入了第二个十年之后,社区的老学究们终于决定引入时髦的"发布火车"的模型,滚动地推出新的功能,之后新的语言标准总算按照一个大版本一...
最近遇到一个麻烦而繁琐的操作,需要从工作用的缺陷跟踪系统中导出报表,分析其中的一些数据模式,分类整理后用更好的方式整合出来; 本来这类反复重复的零碎工作,如果不是很复杂,依赖于Excel本身的强大的表格计算功能是很容易自动化的(在线系统比较古老仅仅支持CSV格式导出), 只是内部的字段量比较多,并且有很复杂的相互...
公司里面进来切换到了一个新的Backlog管理工具来管理日常的需求和项目规划,可惜新的工具虽然是名门之秀的JIRA(来自于澳大利亚的IT公司confluence),但是访问起来却异常痛苦, 经常一个页面打开需要等待大半天还是不是崩溃。有些心急的同时已经默默地回到了老的方式,导出数据到Excel然后打开Office...
云原生应用试图从思想层面对我们编写和发布软件的方式来一次深刻的革命;这一设想其实是基于目前的大部分云计算平台上运行的应用都是从传统的非云平台环境上移植过来的。
流式编程在微服务架构风格越来越流行的背景下日益引起开发者的关注 (前文有一些简单探讨) ,新的Java语言规范加入了流的概念从语言库上添加了对FRP的支持。 Spring最新的5.0版本更新也顺应这一潮流,加入了原生支持FRP的行列。
流式编程或者响应式编程则是一个不断进入我们视线的设计概念;它采用声明式编程范式,并将数据流和数据更新的处理作为程序运算的核心。 由于函数式编程本身即强调声明式编程,这使得用函数式编程的语言或者工具来实现响应式编程更自然清晰, 一般人们将二者的结合称为函数式反应式编程或者FRP。 FRP最早可以追溯到微软和耶鲁的两...
9月份对于C++社区而言绝对是个令人振奋的收获季节。
随着Java程序在后端压倒性的普及,其性能本身早已经无人质疑;然而一个经常不为人道的事实是,Java平台上的程序不是天然就具有很高的性能; 因为Java语言显著降低了程序员的准入门槛,真正到系统性能这一块,仍然需要大量的调试和优化,即所谓的JVM性能调优。
最近在跟踪项目的性能测试的过程中,发现了一个奇怪的问题:Netty服务器端新建的Channel的数目比Tcpdump抓包得到的经历过三次握手成功的连接数要少: 总有几个连接从抓包来看成功,然后Netty并没有为其分配Channel。直观上来看,似乎是Netty的处理问题值得怀疑,似乎是用于接受新连接的线程池堵塞了。
最近在参与某开发小组的团体代码审查会的时候,发现组内的一线开发工程师对于何时应该做空指针检查并没有很清晰的认识;然而这在Java社区里早已经是个老生常谈的争论 。
可变状态的泛滥往往被认为是软件维护灾难的元凶之一,尤其是当过程封装遇上多线程,普通的面向对象编程技巧完全不堪大用,因为继承/封装/多态等手法针对的都是程序组织上的处理措施,具体到底层实现上,传统的C/C++/JAVA依然依赖过程式实现跟操作系统打交道。
Kotlin语言是大名鼎鼎的JetBrains公司(就是可以甩Eclipse数条大街的IntelliJ IDEA背后的公司)出品的现代的编程语言,之前已经在IDEA中蹦达出来很多次了;只是最近随着Google在其2017年的I/O大会上将其列为Android平台官方支持的语言而窜上了热点。
Java8是日益臃肿、略显老态的老牌程序语言对日益流行的新的函数式编程范式的反击; 它采用了巧妙的技术让自己面向对象的古老躯体也套上了函数式编程的舞鞋再度翩翩起舞,焕发新的光彩。
很多C++项目中都存在一个能够异步调度任务的基础库;大部分这样的库都是用老的C++语言(98/03)写成的,要么模板元语法满天飞外加各种黑魔法导致维护困难, 要么是采用传统的宏方式导致维护困难,布满各种隐患。既然C++11/C++14提供了更好用的武器,我也耐不住手痒自己实现一个。
静态、强类型而又不带垃圾收集的编程语言领域内,很久没有新加入者参与竞争了,大概大部分开发者认为传统的C/C++的思路已经不太适合新时代的编程需求,即便有Ken Tompson这样的大神参与设计的golang也采用了GC的思路来设计其新一代的语言;一方面垃圾收集技术和即使编译技术一直在发展和完善,另一方面是大量的未...
C++社区的第二届编程语言社区活动CppCon2015落下了帷幕;作为C++语言的发明人和灵魂人物, Stroustroup和Herb Sutter一起宣布他们正工作与一个基于现代C++核心语言的编程规范(Core Guidelines)并发布 在GitHub上,并立即引起了轰动。
这是一本关于程序员生产效率的书,作者来自于Thought Works - 很多人一听到这个公司的名字就会在头脑中联系到敏捷/布道师这样的角色,并且可能在心里暗暗的寻思,又是一个光说不练的家伙在传播他们的理论了。但是仔细读来,才会发现这本书其实和敏捷并没有太大关联,讲述的也是一些实实在在的建议和实践。
这是一本讲述程序员开发哲学和思想的书,虽然出版了十余年仍然没有太多过时的东西,因为讲述的内容是一些永远不会过时的东西(至少从计算机程序设计职业化-即所谓的软件工程开启的时间算便是如此)。
PyQT是知名跨平台框架QT的python绑定;用它来做些小程序既可以利用QT的跨平台性又能利用python强大的表达能力,从而取得事半功倍的效果。下边是使用它开发一个小程序过程中的学习小笔记。
UNIX环境下,用shell做一些常见的文本处理工作是很方便高效的事情;虽然目前有很多自带丰富类库的脚本语言可以完成同样的事情,但是对于一些特殊的文本格式处理任务,传统的sed/awk/grep组合还是有很明显的优势:没有复杂的版本问题和类库部署依赖问题,能够快速解决问题。awk作为一门DSL,自身也带有对很多高...
lambda表达式(closure)是C++11中新引入的对程序组织构造改进最大的特性之一;这一特性并不是一个新的概念(几十年前的函数式于样都提供了该特性),然而对于一个深受过程式思维影响的语言而言,lambda的支持则极大提高了代码的抽象能力和可读性。
现有的C++03标准中,不必要的对象的拷贝和临时对象的构造经常会造成额外的性能开销(即使有返回值优化这样的编译器优化来帮忙也不能解决好多情况的问题);新的C++11标准通过对语言的修正,引入了RValue Reference和Move来解决这一问题。
C++11(C++0x)定稿已经满一年,主要的编译器这次跟进的速度也相当快,其中支持最好的要属最近声名雀起的llvm;作为一个历时8年之久的ISO标准,其诞生过程虽然过程很曲折,但是新标准对C++的改进和生产效率的提高无疑是大有益处的。
传统的并发变成模型通过Mutex/Conditional Variable/Semaphore的设施来控制对共享资源的访问控制,但是这一经典模型使得编写正确高效的并发程序变得异常困难: 遗漏合适的锁保护导致的race condition 锁使用不当导致的死锁deadlock 异常未...
Parallel和Concurrency的目标是一致的,然后Parallel更强调在多个物理并发处理单元(至少从OS之上的角度看如此)存在的情况下,如何最大限度地利用现有的CPU资源提高程序的性能。传统的过程式编程思维范式中,所有的操作都是顺行串行的,多核并发处理往往意味着需要对代码做大幅度的修改;而Haskel...
随着基于CPU频率的摩尔定律的失效,现代的计算机体系都采用多核的方式提高处理能力,传统的编程思维和模式在多核时代则遭遇越来越多的问题;而函数式编程则在很大程度上提供了完全不同但是更为优雅的思路。作为纯函数式编程语言,Haskell的并发编程则和传统的过程式语言有着明显的不同。
Haskell中存在三种层次的函数过程抽象,依据约束的多少分别有 Functor, Applicative 和 Monad。Functor是一种最基本的调用提升,通过fmap可以将传入参数函数作用于所wrapper的type;而Applicative和Monad则定义了更多的运算符和原子函数等。
作为一种函数式语言,haskell提供了各种高级的函数编程抽象支持:Functor抽象了那些作用于函数(或者类型封装)内的数据的操作并且将其运算结果用对应函数封装的抽象运算, 其核心是提供了Functor typeclass 和 fmap操作。
正则表达式是文本解析处理的一大利器,因而大部分程序语言都以库的方式提供支持。在Haskell中,有多种不同的实现可供使用,详细看参考wiki, 他们的效率和支持的特性有些微的差异。但是作为一种强类型的静态/函数式语言,haskell的正则匹配可以借助返回值类型多态提供灵活的匹配结果。
作为一个函数式强类型语言,Haskell 尽可能的保证提供纯函数特性,即任何操作都不会有副作用 - 给定相同的参数输入,给定函数必须产生相同的输出结果;这个保证看起来很优美很干脆(容易测试并容易并行处理),但是现实世界中的问题确实则不能通过纯函数的方式解决,譬如IO输入输出,系统文件操作等;这些操作的过程依赖于...
Haskell 中也有class关键字,但其目的却和 OO 中的类有着巨大的差别。在 OO 世界中,类用来描述一大堆具有共同数据和行为的对象的抽象;而 Haskell 中的 class 则是用于抽象提供同样函数接口的数据类型。每一个 ADT 都可以用instance来生命其满足某个 class 并且给出对应于具体...
作为纯函数式语言,haskell的主要特征之一即是提供丰富的函数式变成设施,包括 recursion / composition / lambda / partial & currying 等。Haskell本身的强类型约束和延迟赋值,使得其函数式风格明显区别于流行的 ruby/python 等其它语言。
Haskell的类型系统是强类型的,并且没有任何强制类型转换。所有的类型检查均在编译器做检查。定义新的数据类型之后,即使它们内在的数据结构完全一样,也是完全不同的数据类型,不能混用。
文本处理是Python/Ruby这类脚本语言的重头戏之一,而强大的正则表达式支持对于文本处理来说也是必不可少的。Ruby的设计很多方面沿袭perl,正则表达式方面也不例外。
和其它的面向对象语言类似,ruby的类方法也分为_class method_ 和 instance method, module和class具有相当大程度的相似性, 但是用于重用module中定义的方法时( 同样也有 class method 和 instance method 之分 ),又有一些微妙的差异。
Class和Module是Ruby中的两个重要概念。作为一个纯OO语言,class的概念自然容易理解,即为object的抽象;而module则明显有别于其它语言地提供了mixin方法来解决多继承缺失带来的不便 - 集成多个基类的接口并维持IS-A关系以及LSP替换.
lazy evaluation 是函数式编程中的一个重要概念,和传统过程式语言中的cache/state变量恰恰相对;其对应的数值/运算仅仅在用到的时候才实际运算,如果没有调用就什么也不会做。对于构造起来比较昂贵的对象,lazy evaluation可以有效避免cache带来的额外开销,因为只要需要的部分运算被执...
最近在查一个SNMP协议模块退出时, 发现NET-SNMP VACM模块在退出的时候总是报view删除失败。仔细检查了API调用的代码,却始终没发现明显的问题。程序的逻辑大概可以简化为这样:
Rake - the make in ruby world
blocks&&closure ruby的blocks和closure特性明显有别于其它的语言,其closure本身是__real closure__,所绑定的context是共享的而非copy,其设计思路和_lisp_的相同;blocks本身则可以用于实现closure。二者的关系如下所述 li...
看得再多也不如自己动手试,最近有闲就打算认真研究一下ruby语言了。Pragmatic programmer中说,需要一年学一门新语言一遍改造思想,去年浅浅的学了javascript的皮毛,今年可以看看ruby这个有lisp之风的OO语言了。