人工智能时代来临
|
ortran语法的细节我就不多说了,但你可以清楚地看到,该语言不包含块。函数定义在一行上,而不是作为代码块,DO 循环使用一个行标签来控制循环。当时的高级语言还没有将复合语句分组成块的概念,这些语言仍然依靠 goto 来控制程序流。 该代码由Knuth使用1957年的Fortran版本编写。1957年至1960年间,一种新的语言ALGOL被开发出来,它弥补了当时Fortran等语言和其他高级语言的许多缺陷。 Algol中的块
Algol编程语言首次被描述是在1958年,尽管该语言最流行的版本是Algol 60。Algol的功能之一是将语句分组为复合语句(称为块)的能力,每个Algol程序都被视为一个块,因为一个程序通常包含一个或多个语句(因此为复合语句)。Algol的开发者认识到,许多编程场景,如条件和循环,需要将语句作为一个单元来考虑。 我们每天都使用它们,但是代码中的花括号是从哪里来的呢? 大括号,那个标志着代码块开始和结束的熟悉符号,什么时候成为编程的一部分?也许更重要的是,代码块何时成为程序结构的一部分? 在本文中,我将回答这些问题。 首先,以非块状语言为例 所有熟悉C风格编程语法的程序员都熟悉编程块,用C、C ++、Java、JavaScript和其他语言编写的所有主要编程结构都是块结构的。换句话说,这些构造的主体放置在块中,这些块由打开和闭合的花括号分隔。 有人可能会说,这并不是完全正确的,因为 if 语句和循环(这里只提到两种编程构造),如果它们的主体只有一个语句,就可以不用块来构造。然而,在过去的几年里,编程风格专家建议将所有的构造体放在一个块中(参见Douglas Cockroft的“JavaScript: The Good Parts”中关于将所有if和循环体放在块中的论点特别有说服力) 然而,第一批高级编程语言并没有块。
我将使用大约在20世纪50年代末的FORTRAN语言来演示这一点。 1999年多核还是个幻想,但是在现今移除GIL也异常困难,真的移除效果如何也是未知的,只能说回头太难。
2009年Antoine Pitrou 在Python 3.2中实现了一个新的GIL,并且带着一些积极的结果。 这是GIL的一次最主要改变,旧的GIL通过对Python指令进行计数来确定何时放弃GIL。 单条Python指令将会包含大量的工作,在新的GIL实现中,用一个固定的超时时间来指示当前的线程以放弃这个锁,使得线程间的切换更加可预测。 8.GIL缺陷的解决方案 python作为生命力极强的热门语言,绝对不会在多核时代坐以待毙。即便有GIL的限制,仍然有许多方法让程序拥抱多核。
Python2.6引入了MultiProcess库来弥补Threading库中GIL带来的缺陷,基于此开发多进程程序,每个进程有单独的GIL,避免多进程之间对GIL的竞争,从而实现多核的利用,但是也带来一些同步和通信问题,这也是必然会出现的。
CPython的优势就是与C模块的结合,因此可以借助Ctypes调用C的动态库来实现将计算转移,C动态库没有GIL可以实现对多核的利用。
协程也是一个很好的手段,在Python3.4之前没有对协程的支持,存在一些三方库的实现,比如gevent和Tornado。 (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
