中国编程语言工资排行史话,为什么编程中 1=2

编程语言史话,为什么编程中 1=2?编程语言史话,为什么编程中 1=2?山东人民广播电台资讯百家号考虑以下代码:a = 1a = a + 1print(a)你写代码时候是不是也疑惑过,为什么代码中会有a = a + 1,这个怎么解释?这就不是在说1 = 2么?这是一个对代码中"="常见的误解,"="应该表示相等,但是它在此真意义是赋值。小编也认为这是不好的表示法。我也知道一些语言不会用a = a + 1写法,而是写成a:= a + 1。为什么不是规范起来呢?通常的答案是"因为C"。但这只是一个小小的过失。为什么C这样做?让起来回顾下找下原因。四位老哥在上个世纪60年代早期,主要有四种主要的高级语言:COBOL,FORTRAN II,ALGOL-60和LISP。当时赋值过程要分成两步:1、定义变量时候初始化2、已有变量值改变时候重新赋值。以开头我们的Python例子,我们有:a=1 #初始化a = a + 1#重新分配print(a)人们没有使用这些特定的术语,但它捕捉到了每个人都在做的事情。以下是四种语言的操作符情,以及进行相等判断的检查:ALGOL没有专门的初始化操作符。你先得创建一种类型的变量,然后使用运算符赋值给它。你可以做整数x;x:=5;但是你不能直接就x:= 5;,所以 FORTRAN是唯一一个用=做各种操作的语言,更像是现代语言的行为。但是我们知道历史上,C从ALGOL传承下来,所以:=赋值被删除了,并且把=作为了相等检查。由ALGOL到CPLALGOL60可能是计算机科学史上最具影响力的编程语言,单也可能是最无用的语言。该语言按设计总核心规范中没有任何I/O特性。你可以对输入进行硬编码并测量输出,但如果你想用它做任何事情,你就得有一个扩展核心语言的编译器。 ALGOL是专为研究算法而设计的,你还想要做其他事情,它就会崩溃。然而,它确实是一种强大的语言,人们希望将其推广,想在商业和工业使用。 1963年,克里斯托弗斯特拉奇和剑桥大学进行了第一次大推动。创建一个新语言CPL,CPL是在ALGOL之上增加了一大批创新,其中大部分是让我们后悔的特性。这其中一个就是初始化定义,其中一个变量可以在同一个语句中初始化并赋值!而不是写整数x;x:=5;你可以直接用x=5。但是我们从:=演变到=,主要是因为CPL支持三种变量初始化:=表示按值初始化。表示通过引用初始化,以便如果xy,重新分配给x也会使y变异。但是如果你写了xy + 1并尝试重新分配x,程序就会崩溃。≡表示通过替换来初始化,也就是使x成为一种在每次使用时都对RHS进行评估的niladic函数。他们从未解释如果你尝试重新分配给x可能会发生什么。问题:现在=用于初始化和相等。幸运的是,CPL在实践中对此表现得很清晰,你要写=的任何地方你的意愿都明确无误的。仅仅一年之后,Kenneth E. Iverson发明了APL,它将<-用于赋值。由于大多数键盘都不具备这一点,甚至连Iverson都没咋用过它,他的后续语言J则使用=:作为赋值。但是,APL深深地影响了S,S又深深地影响了R,这就是为什么<- 是首选的R赋值运算符。由CPL到BCPLCPL是一个很棒的语言,只有一个小问题,没有人能够实现它。少数人包揽了部分功能子集的部分实现,但对于那个年代的编译器来说,这太大而且太复杂了。因此,马丁理查德剥离了很多创造BCPL的复杂性。第一个BCPL编译器于1967年推出,并于1970年成为第一个CPL编译器。除了其他简化之外,"三种初始化"规则被去掉了。Richards认为替代表达是适当的,可以被函数取代,并且与赋值相同。所以他把它们全部简化成一个=,但是命名全局内存地址,它使用了:。与CPL一样,=也是相等判断。对于重新赋值,他使用:=就像CPL和ALGOL一样。很多后来的语言遵循这个约定,=用于初始化,:=用于重新赋值,还有=用于相等判断。但是当Niklaus Wirth创造Pascal时它就成为主流,这就是我们现在称之为"Pascal风格"的原因。在我记忆中,BCPL还是第一个"弱类型"语言,因为唯一的数据类型是数据字。这使得编译器更容易移植,导致更多的逻辑错误,但是Richards希望更好的流程改进和描述性命名能够抵消它。 另外,BCPL还引入了大括号作为定义块的一种手段。由BCPL到 BKen Thompson希望将BCPL转换在PDP-7上运行。虽然BCPL有一个"小型编译器",但它仍然是PDP-7的最小工作存储器的四倍,因为PDP-7的存储器只有4k至16kb。所以Thompson需要创建一个新的,更小的语言。另外他个人审美上也希望尽量减少源代码中的字符数。这最终成为B设计的最大因素。这就是为什么我们有例如++和--操作符的初衷。一旦你摆脱了命名的全局内存地址,BCPL总是使用=进行初始化,使用:=进行赋值。Thompson决定将它们合并为一个单一的标记,用于所有形式的任务,并且选择了=因为它更短。但是,这这样一来确定它的用意就有点含糊不清:如果x已经被声明,那么x=y是一个赋值还是一个相等性检查?而且在某些情况下,它应该是两者皆有!他添加了一个新的标记==,作为"等于"的唯一形式。正如Thompson所说的那样:由于赋值的使用频率在一个典型程序中的大概是相等判断使用次数的两倍,所以操作符长度要减半才是最合适的。Thompson(由Dennis Ritchie加入)在1969年左右发布了B语言的第一个版本。在同期两个人Ole Dahl和Kristen Nygaard发明了第一个OOP语言Simula 67。 Simula遵循ALGOL严格分离的初始化和赋值步骤的约定。Alan Kay也在这个时候也创造smalltalk,也遵循了同样的语法,还增加了块。因此,直到1971年左右,大多数新语言都使用:=进行赋值。由B产生了C剩下的就是大家比较熟悉历史。。。。。还有一点需要补充的是,在随后的一年ML语言出现了,是第一真正强调纯函数式的语言。但它仍然在引用单元中有一个列外的设置,可以使用:=赋一个新值。从1980年开始,我们开始看到正确导向的命令式语言,特别是Eiffel和Ada,它们都使用:=来赋值。从整体来看,=从来不是自然选择的赋值运算符。几乎ALGOL所有分支中的每个语言都使用:=来代替赋值,可能是因为=与等式相关联。现在大多数语言使用=,完全是因为C使用它,并且我们可以使用C向前追溯,是CPL第一个这样吃螃蟹的。转载自百家号作者:虫虫搜奇本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。山东人民广播电台资讯百家号最近更新:简介:权威资讯,麻辣点评!作者最新文章相关文章昊卓分享:为什么中文不能用来编程?
昊卓分享:为什么中文不能用来编程?
编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。想必大家在刚学习编程时,都会有这样的困惑:为啥不能直接用中文编程呢?
今天昊卓科技就带大家来揭秘:
编程不用中文的原因:
首先要从电脑程序运行基本说起。电脑本身只能识别0和1组成的机器码指令,为了方便对机器代码的记忆,人们就用英文字符代替机器码。
例如x86的指令mov,对应的机器16位代码0x88,二进制代码。这些英文字符的集合就是汇编语言。汇编语言是最接近机器语言的编程语言。
高级语言,例如c,java等等,都需要用编译软件把他们的代码编译成汇编语言,或者用汇编语言来对代码进行解释。前者叫做编译型高级语言,后者叫做解释型高级语言。
无论那种高级语言,在机电脑上运行最终只能是机器码。在电脑编程语言的发展中,大部分都是英美研发和设计的主力,所以都是英文作为基础,所以编程语言都是英文的。
那么,中文可以用来编程吗?
其实中文是可以用来编程的。编程语言都是用关键字来做代码的。关键字可以汉字来代替。例如if,就用如果,while就用当,函数printf就用打印,等等。
为什么现在很少用中文编程呢?
一方面中国计算机技术发展比较晚,如果重新开发一套中文编程代价和成本太大。再者一套中文编程看似简单,实际上涉及的范围太广工程太过浩大。加之没有让大众普遍接受的中文操作系统,技术和交流圈都很不成熟。
中国以后能有自己成熟的编程语言吗?
软妹子相信会有,只是这个需要漫长的过程,等到中国的技术真正超越国外,并主导了计算机技术等的时候,一定能研发并推广好自己的编程语言。
无论用中文编程还是英文编程
就像你选择用 c 还是 java 一样
关键不是编程工具本身
而是要实现的功能和算法没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!热门搜索:
下载费用:10 元 &
黑龙江松花江水系污染物排放标准 黑龙江省松花江水系水污染物排放标准黑龙江省松花江水系水污染物排放标准 黑龙江省人民政府 第一章 总 则 第 1 条 为贯彻《中华人民共和国环境保护法》 (试行) ,依据《黑龙江省松花江水系水环境 质量标准》 的规定, 按照松花江水系自然环境特点和工农业生产发展及人们生活对水质的要 求, 并考虑技术经济上的可能性与合理性, 为 “防治环境污染和生态破坏” , “保护人民健康, 促进经济发展” ,特制订本标准。 第 2 条 凡向松花江水系排放污染物的所有工矿企、事业单位都必须执行本标准。 第 3 条 一切新建、扩建和改建工程,都必须在计划下达后,首先提出对环境质量影响的预 断评价报告书,经环境保护主管部门审查批准后,方可按“三同时”的原则设计和施工,竣 工投产时污染物必须达到排放标准。 第 4 条 本标准自省人民政府批准颁发之日起施行。 第二章 排放标准 第 5 条 水污染物依据对人和动、植物的危害程度,分为两标准执行。 第(1)类:能在环境或支票物体内蓄积,对人体健康产生长远影响的有害物质,分别控制 在车间或车间处理设备排出口,一九八五年前和一九九○年前应执行表 1 规定的排放标准。 必须注意不得用稀释方法代替必要的处理。 第一类 水污染物排放标准 (表 1)单位:毫克/升 序号 污染物名称 一九八五年前 执 行 一九八六年至一九 九○年 执 行 <0.03 1 汞及其无机化合物 <0.05 (按Hg计) (按Hg计) 2 镉及其无机化合物 <0.1 (按Cd计) <0.05 (按Cd计)3 六价铬化合物 <0.5 (按Cr+6 计) <0.3 (按Cr+6 计) 4 砷及其无机化合物 <0.5 (按As计) <0.5 (按As计) 5 铅及其无机化合物 <1.0 (按Pd计) <0.05 按Pd计) 第(2)类:其长远影响小于第(1)类的污染物,在一九八五年前、一九九○年前,分别控 制在工厂排出口,应符合表 2 规定的排放标准。 第二类污染物排放标准 (表 2)单位:毫克/升 序 号 污染物名称 一九八五年前执行 一九八六年至一九九 ○年执行 1 pH值 5.0─10 6─9 2 悬浮物 150 100 3 化学耗氧量(重铬酸 钾法) 150 100 4 硫化物 2.0 1.0 5 挥发性酚 1.0 0.5 6 氰化物(以游离氰根 计) 1.0 0.5 7 有机磷 1.5 0.5 8 石油类 15.0 10.0 9 铜及其化合物(按C u计) 1.0 0.5 10 锌及其化合物(按Z n计) 5.0 3.0 11 氟及其无机化合物 (按F计) 10.0 5.0 12 硝基苯类 5.0 3.0 13 苯胺类 3.0 2.0 14 合成洗涤剂 5.0 3.0 15 苯 2.5 2.5 注:①悬浮物:造纸,制糖,1985 年前<300mg/L,1990 年 前<200mg/L;水力排炭、洗煤、尾矿水 1985 年前 <500mg/L,1990 年前<300mg/L。 ②化学耗氧量:造纸(酸法) 、制糖 1985 年前<350mg /L,1990 年前<200mg/L。 第 6 条 凡本标准未包括之污染物,应依据各专业部门颁布的《工业企业污染物排放控制指 标》 、 《医院污水排放标准》 、 《放射性物质控制指标》等规定执行。热污染待松花江水系热负 荷科研取得成果后,再订。 第三章 监督管理 第 7 条 严禁在嫩江、牧丹江、汤旺河等源头增加新的污染源,对已有污染源除要执行本标 准外,还将根据松花江水系环境质量标准的实施,对污染物处理程度提出更高的要求。 第 8 条 除重金属污染物外,因技术问题或其它原因,暂时达不到排放标准的单位,如据理 充分, 可通过当地环境保护部门向省环境保护主管部门提出申请报告, 待报请省人民政府批 准后,可延期执行本标准。但延期执行的期限最多不得超过两年。 第 9 条 各工矿企、事业单位都应加强企业管理,防止跑、冒、滴、漏,杜绝事故排放,控 制单位产品水耗,其污染物严禁稀释排放。 第 10 条 不得用渗坑、渗井或漫流方式排放污染物,输送污染物的管道和明渠,应有防渗措 施,以免污染地下水源。排入城市下水道的“废水” ,除执行本标准外,还要符合《室外排 水设计规范》的有关规定。 第 11 条 为保护饮用水源, 在城镇中式生活饮用水源和风景游览地区上游, 不得排入各种污 染物。并参照国家颁布的“101─56 工业企业设计卫生规程”执行。 第 12 条 不得向水库、 灌渠和渔业用水水体的江段直接排放污染物。 上述水体依据国家颁布 的《渔业水质标准》 、 《污水污灌水质标准》执行。 第 13 条 严禁向水体倾倒和堆放垃圾以及各种工业“废渣” ,防止污染,淤塞河床。各种污 染物处理设施产生的污泥或残渣必须妥善处理,不得造成二次污染。 第 14 条 各行业主管部门应健全环境保护机构。 根据本标准及本行业的特点, 制定执行本标 准的具体措施,并负责督促所企业按期达到污染物排放标准。 第 15 条 各地、市环境保扩部门对违反本标准的企业事业单位,按其危害程度实行罚款,情 节严重者要向地方检察院起诉,追究领导责任,刑事责任。 第四章 水质监测 第 16 条 排放水污染物企、事业单位,应设有监测机构,每季向当地环境保护部门报告一次 监测结果。暂时没有检测能力的单位可委托当地环境保护监测站进行检测。 第 17 条 对各监测机构报告的检测数据, 各级环境保护部门有权提出异议, 并指派当地环境 保护监测站进行复检, 直至由省环境监测站进行仲裁判定。 一经确定检测数据确属弄虚作假, 对有关人员应追究其责任。 第 18 条 水质检测按《环境监测标准分析方法》进行。 第 19 条 各地、 市环境保护主管部门负责监督和检查本标准的执行, 并定期向省环境保护主 管部门报告。 附录 一、本标准用词说明 1、对本标准条文执行严格程度的用词,采用以下写法: (1)表示很严格,非这样不可的用词:正面词一般采用“必须” ,反面词一般采用“严禁” 。 (2)表示严格,在正常情况下均应这样作的用词:正面词一般采用“应” ,反面词一般采用 “不应”或“不得” 。 (3)表示允许稍有选择,在条件许可时,首先应这样作的用词:正面词一般采用“宜”或 “一般” ,反面词一般采用“不宜” 。 (4)表示一般情况下均应这样作,但硬性规定这样作有困难的,采用“应尽量” 。表示允许 有选择,在一定条件下,可以这样作的,采用“可” 。 2、 条文中必须按指定的标准、 规范或有他有关规定执行, 写法为 “按现行的…执行” 。 或 “符 合现行的……要求的” ,非必须按所指定标准,规范或其他有关规范执行的写法为“参照现 行的……” 。 二、本标准按水污染物性质分为: 1、耗氧性有机物; 2、可溶性盐类和酸、碱; 3、悬浮固体; 4、漂浮固体和液体; 5、重金属离子; 6、有毒化学品; 7、致病微生物; 8、放射性物质; 9、工业废热水。 为解决松花江水系有机物污染, 标准对耗氧性有机物实施总量控制, 制订了五日生化需氧总 量控制标准,可根据各地区、市、县的分配总量,由相应各级环保主管部门自行制定总量控 制标准。其它水污染物列为本标准,为浓度控制排放标准。 1981 年 10 月 20 日
文档加载中……请稍候!
下载文档到电脑,查找使用更方便
10 元 &&0人已下载
还剩页未读,继续阅读
&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>一、&/span>&/strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>本站提供全自助服务,购买后点击下载按钮可以下载到你电脑或手机(系统不会发送文档到您的邮箱),请注意查看下载存放位置;&/span>&/p>&p>&strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>二、&/span>&/strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>本站具有防盗链功能,所以不要使用迅雷、旋风、网际快车等第三方辅助下载工具(不支持&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>QQ浏览器&/span>),否则下载下来的文件只是网页或乱码;&/span>&br/>&/p>&p>&strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>三、&/span>&/strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>由于网络原因、下载知识欠缺、本地电脑&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>或&/span>手机阻止下载等问题无法解决时,需要提供以下&/span>&span style=&font-family: 微软雅黑, &Microsoft YaHei&; color: rgb(255, 0, 0);&>任意一条信息&/span>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>给我们,我们才能更及时地为你服务:&/span>&br/>&/p>&p>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>3.1、如果是注册的会员,请告诉我们你的会员账号;&/span>&/p>&p>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>3.2、如果是游客下载的,请告诉我们你下载时填写的手机或者邮箱;&/span>&/p>&p>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>3.3、如果是微信或QQ快捷登陆的,请告诉我们你的微信或QQ昵称;&/span>&/p>&p>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>3.4、如果这些你仍然无法确定,请告诉我们你的付款单号(我们可以通过单号反过来查询你的账号和下载记录)&/span>&a href=&https://www.jinchutou.com/i-93.html& target=&_blank& style=&text-decoration: color: rgb(255, 192, 0); font-family: 微软雅黑, &Microsoft YaHei&;&>&span style=&color: rgb(255, 192, 0); font-family: 微软雅黑, &Microsoft YaHei&;&>看看什么是单号?&/span>&/a>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>;&/span>&/p>&p>&strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>四、&/span>&/strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>需要下载哪份文档,请发送文档网址,而不是截图,更不要直接把标题给我们;&/span>&br/>&/p>&p>&strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>五、&/span>&/strong>&span style=&font-family: 微软雅黑, &Microsoft YaHei&;&>其它下载常见问题详见:&/span>&a href=&https://www.jinchutou.com/info-0-23-1.html& target=&_blank& style=&font-family: 微软雅黑, &Microsoft YaHei&;&>https://www.jinchutou.com/info-0-23-1.html&/a>&br/>&/p>&p>&br/>&/p>" /> &span id=&_baidu_bookmark_start_2& style=&display: line-height: 0&>?&/span>&span id=&_baidu_bookmark_start_4& style=&display: line-height: 0&>?&/span>&/p>&p>&span style=&font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>& & 鉴于本网发布稿件来源广泛、数量较多, 系统审核过程只针对存在明显违法有害内容(如色情、暴力、反动、危害社会治安及公共安全等公安部门明文规定的违法内容)进行处理,难以逐一核准作者身份及核验所发布的内容是否存在侵权事宜, 如果著作权人发现本网已转载或摘编了其拥有著作权的作品或对稿酬有疑议, 请及时与本网联系删除。&/span>&/p>&p>&strong style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 white-space: background-color: rgb(255, 255, 255);&>& & 侵权处理办法参考版权提示一文:&/strong>&a href=&https://www.jinchutou.com/h-59.html& target=&_blank& textvalue=&https://www.jinchutou.com/h-59.html&>https://www.jinchutou.com/h-59.html&/a>&span style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>&&/span>&/p>&p>&span style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>1、如涉及内容过多,需要发送邮箱,请电子邮箱到,我们会及时处理;&/span>&/p>&p>&span style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>2、系统一旦删除后,文档肯定是不能下载了的,但展示页面缓存需要一段时间才能清空,请耐心等待2-6小时;&/span>&/p>&p>&span style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>3、请版权所有人(单位)提供最起码的证明(证明版权所有人),以便我们尽快查处上传人;&/span>&/p>&p>&span style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>4、请文明对话,友好处理;&/span>&/p>&p>&span style=&color: rgb(102, 102, 102); font-family: 微软雅黑, Arial, &Times New Roman&; font-size: 14 background-color: rgb(255, 255, 255);&>5、为了杜绝以前再有类似的侵权事情,可以为我们提供相应的关键字,便于管理人员添加到系统后能有效排除和抵制与您(贵单位)相关版权作品上传;&/span>&/p>&p>&span id=&_baidu_bookmark_end_5& style=&display: line-height: 0&>?&/span>&span id=&_baidu_bookmark_end_3& style=&display: line-height: 0&>?&/span>&/p>" /> &span style=&color: rgb(85, 85, 85); font-family: 微软雅黑; background-color: rgb(255, 255, 255);&>& & 为了维护合法,安定的网络环境,本着开放包容的心态共建共享金锄头文库平台,请各位上传人本着自律和责任心共享发布有价值的文档;本站客服对于上传人服务前,有以下几点可提前参阅:&/span>&/p>&p>&span style=&color: rgb(85, 85, 85); font-family: 微软雅黑; background-color: rgb(255, 255, 255);&>1、本站上传会员收益见:&a href=&https://www.jinchutou.com/h-36.html& target=&_blank&>https://www.jinchutou.com/h-36.html&/a> &/span>&/p>&p>2、本站不会为任何刚注册的上传会员特批解除上传限制,普通会员每天可以上传50份,值班经值会审核其上传内容,请自行观察自己上传的文档哪些在“临时转换中”(审核通过),哪些在审核拒绝中,连续坚持几天都没有任何文档被拒的情况下,根据文档质量和发布分类是否正常等考量合格后值班经理会特批升级会员等级,相应的权益也同时上升。&/p>&p>3、上传人本着友好、合作、共建、共享的原则,请耐心仔细的查看《&a href=&https://www.jinchutou.com/i-143.html& target=&_blank&>违禁作品内容处理规则》;&/a>&a href=&https://www.jinchutou.com/i-143.html& target=&_blank&>https://www.jinchutou.com/i-143.html&/a>&/p>&p>4、上传人可以观注本站公告,查看其它被公示永久封禁的原因&a href=&https://www.jinchutou.com/news-1.html& target=&_blank&>https://www.jinchutou.com/news-1.html&/a>&/p>&p>5、其它问题可以参阅上传常见问题指引:&a href=&https://www.jinchutou.com/info-0-25-1.html& target=&_blank&>https://www.jinchutou.com/info-0-25-1.html&/a>&/p>" />&p&&b&17-11-15 下午,新增了关于量子程序语言的内容。&/b&&/p&&p&有些人认为这个作为科普有点难了。我承认这一点。但是问题在于量子计算直至如今也并不是一个亲民的领域,把其中的概念说的很清楚而无争议非常困难,因为量子力学始终是一个绕不过的坎,关于测量、本征态、Hamiltonian、酉算符、密度矩阵的介绍,哪怕仅仅在概念层次上都不得不用一堆线性代数等数学工具;而量子计算的理论方向又会涉及到P/NP,NPC,BPP,BQP,QMA,#P,P-hierarchy等等理论计算机上的复杂度概念,对领域外的人同样不是很友好。如果你真的想要简单的了解量子力学(特别是对量子计算有用的部分),可以参考入门级的科普读物《上帝掷骰子吗——量子物理史话》。本文仅仅对敢于试水的知友提供适当的信息,如果要改成爽文,那么到其他版块发段子或许是更好的选择(看得又爽赞又多)。&/p&&hr&&p&由于我和国内几个做量子计算物理实现的团队还算交往比较熟(利益相关,不透露名称),这里说一下我的了解和看法。&/p&&p&量子计算领域,所实话目前是个实验团队硬着头皮慢慢前进(每年加几个qubit),理论团队大刀阔斧(假设我有一个通用量子计算机/quantum RAM,xxxx;当然也有做复杂度等很硬的方向的),媒体大肆宣传(我们离通用量子计算永远只有12个月),群众吃瓜(可以用来装逼,撕逼)的领域(把什么东西前面加个AI/量子就牛逼了)。纵然前景可能非常良好,但是仍然需要冷静对待。&/p&&p&我之前说了,现在主流的进度是每年加几个qubit(也就是现在一个系统估计做到12-20个qubits),但是为啥IBM突然来了一个50 qubits 的?&/p&&p&这里我给一些简单的尽量没有数学的介绍(好吧,可能只是我不想用知乎的公式编辑器)。&/p&&h2&回顾:构造经典计算机我们需要什么?&/h2&&p&如今计算机专业的人越来越多,但是又有多少人真的了解计算机本身呢?无论量子计算机,生物计算机,化学计算机,还是现在的经典电子计算机,他们都是“计算机”。&/p&&p&计算机,是执行计算的一种机器,计算的对象我们称为信息。&/p&&p&而信息,我们使用组合“位元”的方式来表述,这些“位元”的某些组合就能表示所谓的“数据”,比如我们可以用一堆位元来表示一个整数,一个字符,一个浮点数;而这些基本的数据单元进行适当的组合就可以形成新的更加复杂的数据结构,支持我们现在的各种算法。&/p&&p&如果这个位元只有两个状态(两个可能的取值),那么这个计算机我们就称为“二进制”计算机。由于只有两个状态的位元易于控制,所以即使扩展到了量子计算机,大多数实现方案也是二进制的。&/p&&p&如今绝大多数经典计算机都称为“电子计算机”,原因在于位元的物理载体是电路,我们用电平的高低来表征它的两个状态——0和1。而电路级别的运算单元我们称为“&b&门(Gate)&/b&”,“门”具有重要的数学意义,因为它能够被布尔代数所建模。&/p&&p&更高级别的对运算的抽象我们称为&b&布尔函数&/b&,它能够将一堆位元表示的状态映射到另外一种状态。一个非常重要的结论是,有两种“门”可以构成任意的布尔函数,这两种门分别是NAND(与非)和NOR(或非),它们被称为&b&通用逻辑门&/b&,芯片中使用NAND较多。&/p&&p&最终,我们需要一个计算模型,来表示完整的计算流程。这个模型就是我们的&b&图灵机(Turing Machine)&/b&。由于懒我直接搬来wiki的图,可以看到一共有7个条件:&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-7d3ffccb1be18d5728d8abc696ae802c_b.jpg& data-size=&normal& data-rawwidth=&2496& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&2496& data-original=&https://pic4.zhimg.com/50/v2-7d3ffccb1be18d5728d8abc696ae802c_r.jpg&&&figcaption&Turing 机的必要组成&/figcaption&&/figure&&p&其中我们已经知道,状态可以用二进制位元表示,状态的具体定义是人为的(所以有各种各样的指令集),所以条件1,2,3,4,6,7都已经满足;而5可以使用我们上面所说的&b&布尔函数&/b&来构造。所以基于电路我们可以实现图灵机这种计算模型。&/p&&p&图灵机模型是一种通用计算机模型,如果有一台计算机能模拟图灵机那么它也是一台通用计算机。&/p&&p&而通用计算机的具体实现模型,最出名的一种就是&b&冯诺依曼体系结构&/b&,它是一种实现模型,而不是计算模型(有人经常把它的地位和图灵机搞混了)。&/p&&h2&预备知识:通用量子计算机&/h2&&p&现在你要造一台量子计算机。那么我们希望怎么做呢?&/p&&p&类似的,我们延伸经典计算机的电路概念,因而一种主流实现方案以&b&量子线路&/b&为基础,使用二进制方案。可见量子计算机和经典计算机并没有那么大的差距,毕竟它们都是计算机。&/p&&p&经典计算机里面的&b&位元bit&/b&,对应于量子计算机的&b&量子位元qu-bit&/b&。其中bit的两个可能取值(0和1),对应于qubit的两个&b&本征值&/b&(0和1)。&/p&&p&经典计算机里面的&b&门&/b&,对应于量子计算机的&b&量子门&/b&。而经典计算机的&b&通用逻辑门(NAND)&/b&对应于量子计算机的量子通用逻辑门组&b& {Pauli,CNOT}&/b&。其中Pauli是使用Pauli矩阵作为Hamiltonian,可以对单个qubit施加任意的变换的门(经典计算机只有两个类似操作,恒等变换I和取反NOT),而CNOT是二元门(和NAND一样,输入两个操作数)。&/p&&p&CNOT 是 “controlled not(控制非门)” 的缩写。其被定义为 CNOT(A,B) = (A, A &i&XOR&/i& B),其中 XOR 是异或运算,即如果A取1,那么B取反(NOT B);否则B不变(所谓“A控制B取反”)。&/p&&p&而经典线路中的“布尔函数”对应于量子计算中的“&b&酉变换&/b&”。量子通用逻辑门组可以构成任意的酉变换。&/p&&p&如果这些门都实现了,那么显然按照之前的步骤,我们就可以实现任意的“量子布尔函数”,进而实现“量子图灵机”;如果我们选择使用“量子RAM”,“量子运算单元”,“量子控制器”等等来组成通用量子计算机,那么我们就实现了“量子冯诺依曼体系结构”(所以说认为冯诺依曼体系结构就是经典计算机是不对的,它只是一种实现方案)。&/p&&h2&残酷的现实&/h2&&p&看上去我们只要实现了两种量子门,我们就可以进而实现量子计算机了。不过现实是非常残酷的,就是量子计算上连“门”的问题还没有解决。主要问题是三个:&/p&&ol&&li&量子门本身精度有问题。到现在一个精度到达0.999的CNOT门好像都没有实现。但是对经典计算机完全不是问题,现在随便一台民用经典计算机(手机,树莓派,笔记本。。。)中元件的错误率低到正常人很难估计,并且你可以用1块钱买几千万个门。&/li&&li&量子线路的可扩展性有问题。随着线路规模的扩展,整体精度急剧下降。&/li&&li&量子位元本身的消相干。说明白点就是即使你不做计算,量子数据自己都会慢慢损坏,并且这和周围的环境,电路本身结构,数据本身的结构都有关联。目前超导体系(IBM这次使用的)中数据只能保持微秒量级(并且是十几年努力的结果)。我们需要在这个时间内完成计算并把数据导出为经典数据。&/li&&/ol&&p&解决问题的方法主要是各种纠错和空间排布的技巧(量子纠错码,拓扑量子纠错,surface coding等等),以及疯狂降低温度(超导量子线路需要放到可能只有几mK的绝热桶中)等等。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-a397ceab49b90e61e823c1f67b93e580_b.jpg& data-size=&normal& data-rawwidth=&400& data-rawheight=&533& class=&content_image& width=&400&&&figcaption&IBM的超导量子线路(最下面)。整个柱子会被放到绝热桶中,在极低的温度下工作。分很多层是因为绝热以及消除一些环境带来的白噪声,线路一般在最底下。这张图显然是故意摆拍,这样是无法工作的;超导量子线路工作的时候你只能看到一个大桶和巨大的稀释冷却设备。&/figcaption&&/figure&&p&&br&&/p&&p&但是还是非常难,因为量子纠错不同于经典纠错,它要求量子门本身精度必须达到某些要求(往往非常苛刻),并且大大增加量子比特的数量,以及算法的复杂度(很多诸如Grover算法加上纠错后就不那么吸引人了)。&/p&&p&现在我们看看IBM的这个计算设备到底如何(分为20qubits的成熟版本,以及50qubits的测试版本):&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-5051bdb76c01dc1c42ce_b.jpg& data-size=&normal& data-rawwidth=&812& data-rawheight=&203& class=&origin_image zh-lightbox-thumb& width=&812& data-original=&https://pic4.zhimg.com/50/v2-5051bdb76c01dc1c42ce_r.jpg&&&figcaption&20 qubits 连接图(左)和 50 qubits 连接图(右)&/figcaption&&/figure&&p&图中间每个圆是一个物理 qubit,而之间的连线代表可以发生相互作用(比如实现一个CNOT门)。虽然IBM没有讲明,我估计交叉点似乎也可以做一些事情?否则中间50qubits就显得有些尴尬(因为有些qubits和其他的独立开了,不算完整的线路)。&/p&&p&连线的方式很特殊,应该是为了减缓退相干等问题。仔细一看就会发现,其实20qubits这么多qubit就串在一根线上(线头是17和20号)。50qubits的某些部分甚至和其他的脱离了(也不排除是有其它的关联方式),总之还是比较简单的线路。&/p&&p&另外根据IBM的说法,qubit的相干时间大概是几十微秒,已经很不错了。&/p&&p&所以特点大概有四点:&/p&&ol&&li&简单的线路&/li&&li&没有纠错(算法的可靠执行步数有限,并且线路规模越大预期效果越差)&/li&&li&目前而言对量子线路来说规模算是很大了(媒体做big news有了题材&/li&&li&乐于开放平台供大家测试是挺好的&/li&&/ol&&h2&实用比现实更远&/h2&&p&题主问道,能不能用来破解现在的公钥加密算法(比如RSA)?答案是不能。&/p&&p&这类量子算法中已知的算法是 Shor 算法。根据我做这个方向同学粗略估计,需要破解RSA-2048的量子线路所需要的最少qubit数(考虑到必要的纠错等等)约为 &img src=&//www.zhihu.com/equation?tex=+%3D+& alt=&2048^3 = & eeimg=&1&& 个,现在这个50qubits几乎是一个零头(而且IBM说还在试验阶段)。&/p&&p&而且最近各个期刊上关于Shor算法的实现的论文也没有前几年那么多了,主要是因为做的太toy(比如分解一下3*7,再大的一些规模fidelity下降很厉害)。&/p&&p&不过不知道是不是应该感到好笑的是,最希望Shor算法被实现的是一些研究抗量子公钥加密的人,如果真的有这样一台计算机,他们研究成果肯定会火。&/p&&p&这类被称为 Post-quantum cryptography 的算法已经有很多了,并且已经有了几大家族(基于lattice的,hash的,code-based的)。&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-a46b55d042cc676d23db4b_b.jpg& data-size=&normal& data-rawwidth=&1322& data-rawheight=&712& class=&origin_image zh-lightbox-thumb& width=&1322& data-original=&https://pic3.zhimg.com/50/v2-a46b55d042cc676d23db4b_r.jpg&&&figcaption&抗量子计算机(公钥)加密算法&/figcaption&&/figure&&p&但是为什么现在大家不用来替换RSA——因为不想花钱呗。在经典加密算法中椭圆曲线比RSA(等秘钥长度下)安全性要好非常多,但是只是因为对计算要求高了一点点,并且商业化推广晚了一点,在公众领域就用了很少。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-519ac077fa1b_b.jpg& data-size=&normal& data-rawwidth=&1272& data-rawheight=&1076& class=&origin_image zh-lightbox-thumb& width=&1272& data-original=&https://pic1.zhimg.com/50/v2-519ac077fa1b_r.jpg&&&figcaption&椭圆曲线是美国国家安全局的B类加密算法,安全程度仅次最高的A类&/figcaption&&/figure&&h2&回归理性&/h2&&p&量子计算理论方向著名的学者 Scott Aaronson 写过一篇警告将量子算法滥用到机器学习上面的行为的短篇,有兴趣的可以看看:&a href=&//link.zhihu.com/?target=https%3A//www.scottaaronson.com/papers/qml.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Quantum Machine Learning Algorithms: Read the Fine Print&/a&&/p&&p&这点就像现在的深度学习一样,大家把什么都换成神经网络就可以水paper。量子计算领域有一段时间也出现了这种情况,当时Lloyd大神搞出了一个在&b&某些条件下&/b&指数加速求解线性方程组的量子算法(简称HHL),然后一堆人把机器学习中所有需要矩阵求逆的情形全部换成HHL,然后水了大量的关于量子计算加速机器学习的论文。Aaronson 发现其中很多根本不符合原来的假设。&/p&&p&量子算法的困难之处在于,它不仅要实现,人们还希望它能够比最好的经典算法有优势,这个难度曲线往往很陡峭。即使过了这一关,它还要在真实的环境中发挥作用,这点就更难了。我们知道,不少理论上更优的算法,在实际中往往因为各种实际问题而失败,比如一些把矩阵乘法加速到 &img src=&//www.zhihu.com/equation?tex=O%28n%5E%7Blog_27%7D%29& alt=&O(n^{log_27})& eeimg=&1&& 的算法,(即使做过并行改造后)对并行计算等不是很有利,因而没有实际大规模应用。&/p&&p&其实有时候我们对量子算法期望过高,希望它们什么都能做,但是这个free lunch恐怕来的太简单了。但是于此同时,任何量子算法哪怕在现实中只有平方的实际加速,那么也足以证实它的价值。&/p&&h2&量子计算的发展路线图&/h2&&p&这里仅仅谈实验部分,因为很多人关心实现而不是繁复的理论细节。&/p&&p&&b&过去十几年到现在:原理性验证&/b&&/p&&p&主要目的是为了体现量子性质。常见的做法是搞个N qubit的纠缠态,或者实现某个算法的最小规模,比如分解 3*7=21 的质因数,或者模拟一下氢分子或者BeH2这种小分子,然后根据数据说这个线路表现得不像是经典线路。&/p&&p&这类论文在逐步变少,我个人觉得有些无聊。&/p&&p&&b&未来5-10年:量子霸权,集成化&/b&&/p&&p&量子霸权有以下几个“方向”:&/p&&ol&&li&找一个最适合量子计算但是对经典计算机最不利的问题,不关心问题是否有实际意义&/li&&li&算法本身不要求纠错,也对精度不是很敏感&/li&&li&要赢过最强的超级计算机&/li&&/ol&&p&总之概括而言,“&b&量子霸权&/b&” 就是证实&b&至少有一个&/b&问题上&b&实体的量子计算机&/b&可以在实际中比经典计算机快。目前这个问题主要是Boson Sampling及一些衍生算法。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-4d81aa2c46bc2c7a91fe_b.jpg& data-size=&normal& data-rawwidth=&1488& data-rawheight=&1360& class=&origin_image zh-lightbox-thumb& width=&1488& data-original=&https://pic1.zhimg.com/50/v2-4d81aa2c46bc2c7a91fe_r.jpg&&&figcaption&在“后摩尔定律”时代,超级计算机的算力却仍然符合摩尔定律式的指数增长。取自Top500官网。&/figcaption&&/figure&&p&不过“最强的计算机”是很含糊的,按照目前的情况看,大概只要50个qubits(IBM这个不行,这次这个并不是来做量子霸权的)用专用线路实现Boson Sampling就行。但是问题在于超级计算机的算力却仍然遵循类似摩尔定律一样的另外一个定律(集成定律?)指数上涨。似乎所需要的qubits数每年都会多一些,量子计算必须跟上这个速度。&/p&&p&至于集成化,一个方面是希望能够往上堆qubits,不一定要实现什么算法。这部分就像IBM一样,发布云平台和编程语言等等。&/p&&p&堆qubits又有两种思路,一种是量子线路(前面说的),另外一种是量子退火。&/p&&p&量子退火之前 D-Wave 公司已经做过一些了,但是不少人仍然认为其没有信服力(特别是那个号称加速1亿倍的论文,很多人怀疑是常数加速占主,量子效应仅仅是辅助作用)。不过量子退火巨大的优势在于可能不需要显著的纠错操作,更好上手,最后效果几乎全凭测试。&/p&&p&量子退火一个比较期待的应用是做优化,特别是机器学习方面的 Energy-based model,由于量子退火实际加速效果很难预测(和状态制备的纯度,退相关速度等等都有关系),所以要看实验成果了。个人认为在AI方面量子退火方案比线路方案在短期内(5-20年内)更加靠谱。&/p&&p&&b&未来10-20年:量子(晶格)模拟&/b&&/p&&p&之前我以为量子模拟是指模拟任意体系,不过某同行告诉我近期而言一般指周期性晶格,而我说的那个算量子化学模拟领域做的。&/p&&p&周期性晶格的 Hamiltonian 更加简单,量子数更少,因而更加容易模拟。这些有可能被应用在发现和研究超导物质等。&/p&&p&&b&20年后:量子化学模拟,可扩展量子计算,Shor算法,HHL算法等等&/b&&/p&&p&量子化学模拟要复杂很多,它不像周期性晶格之类的可以简化模拟内容,如果要足够精确,需要涉及大量的量子数,这只有qubit数足够高之后才有戏。&/p&&p&而Shor 算法和 HHL 算法都面临类似的问题,它们要较高的精度才能正确运行。&/p&&p&可扩展量子计算是这些的基础。如果制造一个可扩展的量子计算机?目前我们还不知道。这就是业内需要尝试的深坑了。我的某同学开过玩笑说,你猜可控核聚变和通用量子计算,谁先能实现?&/p&&p&&br&&/p&&h2&[附] 量子编程语言&/h2&&p&可能有一些程序开发相关的人员对量子领域编程比较感兴趣。&/p&&p&由于量子资源非常稀缺(一个qubit也不能浪费),量子语言的表述层级甚至比机器语言还要低——量子语言是精确到位级和门级描述的语言,这和Verilog/VHDL的描述层级差不多,但是量子语言本身的语言特性可以非常高,一般都是高级语言。&/p&&p&量子程序语言和经典的程序语言一样,也分过程式和函数式,另外还有标记语言。&/p&&p&标记语言类似XML/JSON,用来描述量子线路。这在比较早期的量子编程语言很多使用这种方案。但是缺点非常明显,就是不灵活(线路变大后几乎不是人能干的事情,就好像用CAD画个CPU内部线路平面图的方式来编程),而且缺乏交互特性。&/p&&p&后来的一些量子编程语言一部分是函数式,大多改自Haskell;另外一部分是声明式,原型相对比较杂。&/p&&p&有人可能奇怪,为什么人们会想到把函数式语言应用到量子编程上(这样不就难上加难了吗)。这是因为量子程序语言中和普通程序相比,非常重要的一点是缺乏“赋值”的语义,更准确的说是不允许“值拷贝”,但是可以声明赋值(赋初值),或者移动(复制的同时删除原来的实例)。这是因为受“量子不可克隆原理”的限制。而函数式编程语言天生就是immutable的,所以语义上比较接近。&/p&&p&但是考虑到受众可能对Haskell并不是很熟,我还是决定介绍过程式语言。&/p&&p&由于微软在程序语言方面还是相对靠谱的,搞出了C#(过程式,静态类型;近年来和Java差异越来越大)/F#(声明式,静态类型)/F*(F#的扩展)/Typescript(脚本语言,过程式,动态类型,带静态类型注释检查扩展)/Dafny(可验证程序语言,交互式证明),可以说覆盖种类很广泛了。所以我想微软在量子编程语言方面也不至于太差。&/p&&p&所以这里使用微软最近给出的一个关于量子计算的小例子(“Hello world”)来让大家浅尝一下量子编程。&/p&&p&下面选择的图片来自 &a href=&//link.zhihu.com/?target=https%3A//arstechnica.com/gadgets/2017/09/microsoft-quantum-toolkit/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Microsoft makes play for next wave of computing with quantum computing toolkit&/a&&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-35e036a7fb69c2e3d241_b.jpg& data-size=&normal& data-rawwidth=&916& data-rawheight=&1095& class=&origin_image zh-lightbox-thumb& width=&916& data-original=&https://pic1.zhimg.com/50/v2-35e036a7fb69c2e3d241_r.jpg&&&figcaption&微软给出的“Hello world”量子程序&/figcaption&&/figure&&p&这个复杂(至少对于其他语言的hello world而言)的例子只做了一件事情:移动1bit的数据。这其实是著名的“量子远程传态”过程(之前潘院士的量子卫星做的事情之一也是这个),它能够将一个qubit携带的状态转移到另外一个qubit上。不过这个过程是“离域”的,也就是发生移动时,两个qubit不必任何物理上的直接接触(经典情形下两个存储单元必须要有线路连接)。不过这也不是“超光速”,因为必须传输一个经典的bit才能完成整个过程(这个过程怎么也绕不过,而传输经典bit是受光速限制的)。&/p&&p&好的,我们来看看这个程序各个部分干什么。描述过程中我借用C++的一些符号和概念。&/p&&p&首先是程序的大致语法结构:&/p&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&c1&&// 常量&/span&
&span class=&n&&One&/span& &span class=&c1&&// 1&/span&
&span class=&n&&Zero&/span& &span class=&c1&&// 0&/span&
&span class=&c1&&// 过程标识符,代表一个操作(某些门的组合)&/span&
&span class=&n&&operation&/span& &span class=&p&&(&&/span&&span class=&n&&Type&/span&&span class=&p&&&)&/span& &span class=&p&&&&/span&&span class=&n&&Name&/span&&span class=&p&&&&/span& &span class=&p&&(&&/span&&span class=&n&&Parameters&/span&&span class=&p&&&)&/span& &span class=&p&&{&/span&
&span class=&n&&Body&/span& &span class=&p&&{&/span&
&span class=&c1&&// 过程体&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&span class=&c1&&// 这些是类型&/span&
&span class=&n&&Result&/span& &span class=&c1&&// 经典比特的类型&/span&
&span class=&n&&Qubit&/span&
&span class=&c1&&// 量子比特的类型&/span&
&span class=&c1&&// 这些是量子门,对qubit进行门级操作,就地解决,没有返回值&/span&
&span class=&c1&&// 这样就避开了 A = H(B) 这种赋值的语义&/span&
&span class=&k&&void&/span& &span class=&nf&&H&/span&&span class=&p&&(&/span&&span class=&n&&Qubit&/span&&span class=&p&&&)&/span& &span class=&c1&&// Hadamard 单量子门&/span&
&span class=&k&&void&/span& &span class=&nf&&X&/span&&span class=&p&&(&/span&&span class=&n&&Qubit&/span&&span class=&p&&&)&/span& &span class=&c1&&// Pauli-X 单量子门&/span&
&span class=&k&&void&/span& &span class=&nf&&Z&/span&&span class=&p&&(&/span&&span class=&n&&Qubit&/span&&span class=&p&&&)&/span& &span class=&c1&&// Pauli-Z 单量子门&/span&
&span class=&k&&void&/span& &span class=&nf&&CNOT&/span&&span class=&p&&(&/span&&span class=&n&&Qubit&/span&&span class=&p&&,&/span& &span class=&n&&Qubit&/span&&span class=&p&&&)&/span&
&span class=&c1&&// CNOT 双量子门&/span&
&span class=&c1&&// 类型的转换&/span&
&span class=&k&&void&/span& &span class=&nf&&SetQubit&/span&&span class=&p&&(&/span&&span class=&n&&Result&/span&&span class=&p&&,&/span& &span class=&n&&Qubit&/span&&span class=&p&&&)&/span& &span class=&c1&&// 给qubit赋初值,初值来自经典bit&/span&
&span class=&n&&Result&/span& &span class=&nf&&M&/span&&span class=&p&&(&/span&&span class=&n&&Qubit&/span&&span class=&p&&&)&/span& &span class=&c1&&// 测量Qubit,使得Qubit从叠加态“坍缩”到本征态(这个Qubit会失去原来的值),并返回结果。&/span&
&span class=&c1&&// 特殊标识符,这些标识符是为了兼容经典的赋值概念,只给经典bit使用&/span&
&span class=&n&&mutable&/span& &span class=&c1&&// 声明一个为左值的经典bit,一般保存数据用&/span&
&span class=&n&&let&/span& &span class=&c1&&// 声明一个为右值的经典bit,一般作为中间量用&/span&
&span class=&k&&set&/span& &span class=&c1&&// 给左值对应的经典bit赋值&/span&
&span class=&c1&&// if 等等差不多,这里就不说了。if 只能给经典变量使用&/span&
&span class=&c1&&// using 语句&/span&
&span class=&k&&using&/span& &span class=&err&&语句用来分配资源,看看代码就能猜出来,不细讲&/span&
&span class=&err&&然后过程调用等等都类似通常的语言。&/span&
&/code&&/pre&&/div&&p&然后就是具体的内容&/p&&p&&b&EPR 操作&/b&&/p&&p&EPR 来自 &a href=&//link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/EPR_paradox& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Einstein–Podolsky–Rosen paradox&/a& ,爱因斯坦当年为了强调量子力学的怪异性提出了这个悖论(然后那篇论文就成了可能历史上空前绝后的错误的,但是引用数最多的论文,因为现在几乎做EPR相关方向的论文都会把当年那篇引用一下,然后结论说Einstein的结论不对),其中Einstein提出了一个特殊的状态,称为EPR-pair,现在又称 Bell state(这是因为Bell 后来简化了EPR pair并提出了可检验的Bell不等式,人们通过检验Bell不等式证实了量子力学在这个问题上的正确性)。而制造这样一个EPR-pair的操作就是程序中这个EPR,它可以让两个qubit最大地“纠缠”起来。&/p&&p&下面我们来看 &b&Teleport&/b&&/p&&p&&b&&i&我并不指望多数没有接触过量子计算的人理解这个步骤到底发生了什么,只是希望能够体验一下这个操作流程。如果希望了解具体的原理可以自行搜索 Quantum Teleportation&/i&&/b&&/p&&p&程序中 &i&here&/i& 和 &i&there&/i& 就是两个辅助传送的qubit。我们最终的目的是把 &i&msg&/i& 转移到 &i&there&/i& 上。首先,我们把&i&here&/i&和&i&there&/i&在本地变成一个EPR pair。&/p&&div class=&highlight&&&pre&&code class=&language-text&&EPR (here, there)
&/code&&/pre&&/div&&p&然后我们把 &i&there&/i& 扔到几百公里外的对方手里(这种操作程序里写不出来)。&/p&&p&然后过了若干时间,我们想把一个名为 &i&msg&/i& 的 qubit 的状态传递到对方的 &i&there&/i& 上。&/p&&p&方法是首先用CNOT和H门将 &i&msg&/i& 和 &i&here&/i& 耦合起来。&/p&&p&然后测量 &i&msg&/i& 和 &i&here&/i& 这两个 qubit,结果分别为 m_msg 和 m_here,注意到测量结果一定是经典 bit。注意到这个时候 &i&msg&/i& 已经被测量破坏了(需要记得测量qubit得到经典bit一定是破坏性操作)。&/p&&p&然后我们用光纤将 m_msg 和 m_here 发送给接收方(代码中没有体现)。&/p&&p&如果 m_here 是 1,那么就对 there 进行 X 门操作;如果 m_msg 是 1, 那么就对 there 进行 Z 门操作。&/p&&p&这个时候,&i&there&/i& 的内容就会变成 &i&msg&/i& 原先的内容,而msg的内容被破坏,所以这是移动而不是复制。&/p&&p&注意到 &i&there&/i& 和 &i&msg&/i& 并没有任何直接的接触。&/p&&p&至于 TeleportTest 就是分配资源然后调用过程运行测试,没有特别多可以说的。&/p&
17-11-15 下午,新增了关于量子程序语言的内容。有些人认为这个作为科普有点难了。我承认这一点。但是问题在于量子计算直至如今也并不是一个亲民的领域,把其中的概念说的很清楚而无争议非常困难,因为量子力学始终是一个绕不过的坎,关于测量、本征态、Ham…
&figure&&img src=&https://pic3.zhimg.com/v2-efd73f996dbaf124e0909576_b.jpg& data-rawwidth=&983& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&983& data-original=&https://pic3.zhimg.com/v2-efd73f996dbaf124e0909576_r.jpg&&&/figure&&p&对于 &a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Secure_Shell& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Secure Shell (SSH)&/a& 这样的网络协议来说,其主要职责就是在终端模式下访问一个远程系统。因为 SSH 协议对传输数据进行了加密,所以通过它在远端系统执行命令是安全的。此外,我们还可以在这种加密后的连接上通过创建隧道(端口转发)的方式,来实现两个不同终端间的互联。凭借这种方式,只要我们能通过 SSH 创建连接,就可以绕开防火墙或者端口禁用的限制。&/p&&p&这个话题在网络领域有大量的应用和讨论:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Tunneling_protocol%23SSH_tunneling& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Wikipedia: SSH Tunneling&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.oreillynet.com/pub/a/wireless//wep.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&O’Reilly: Using SSH Tunneling&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.ssh.com/support/documentation/online/ssh/winhelp/32/Tunneling_Explained.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ssh.com: Tunneling Explained&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.ssh.com/support/documentation/online/ssh/adminguide/32/Port_Forwarding.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ssh.com: Port Forwarding&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//www.securityfocus.com/infocus/1816& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SecurityFocus: SSH Port Forwarding&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//magazine.redhat.com//ssh-port-forwarding/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Red Hat Magazine: SSH Port Forwarding&/a&&/li&&/ul&&p&我们在接下来的内容中并不讨论端口转发的细节,而是准备介绍一个如何使用 &a href=&https://link.zhihu.com/?target=http%3A//www.openssh.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OpenSSH&/a& 来完成 TCP 端口转发的速查表,其中包含了八种常见的场景。有些 SSH 客户端,比如 &a href=&https://link.zhihu.com/?target=http%3A//www.chiark.greenend.org.uk/%7Esgtatham/putty/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PuTTY&/a&,也允许通过界面配置的方式来实现端口转发。而我们着重关注的是通过 OpenSSH 来实现的的方式。&/p&&p&在下面的例子当中,我们假设环境中的网络划分为外部网络(network1)和内部网络(network2)两部分,并且这两个网络之间,只能在 externo1 与 interno1 之间通过 SSH 连接的方式来互相访问。外部网络的节点之间和内部网络的节点之间是完全联通的。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-c83bf15e9d2a6cda933e_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic2.zhimg.com/v2-c83bf15e9d2a6cda933e_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH tunnels: no tunnel&/i&&/p&&h2&&b&场景 1&/b&&/h2&&blockquote&在 externo1 节点访问由 interno1 节点提供的 TCP 服务(本地端口转发 / 绑定地址 = localhost / 主机 = localhost )&/blockquote&&p&externo1 节点可以通过 OpenSSH 连接到 interno1 节点,之后我们想通过其访问运行在 5900 端口上的 VNC 服务。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-1eeaf2dcef5b_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic3.zhimg.com/v2-1eeaf2dcef5b_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 1&/i&&/p&&p&我们可以通过下面的命令来实现:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -L 7900:localhost:5900 user@interno1
&/code&&/pre&&/div&&p&现在,我们可以在 externo1 节点上确认下 7900 端口是否处于监听状态中:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ netstat -ltn
Active Internet connections
(only servers)
Proto Recv-Q
Local Address Foreign Address State
Tcp 0 0 127.0.0.1:.0.0:*
&/code&&/pre&&/div&&p&我们只需要在 externo1 节点上执行如下命令即可访问 internal 节点的 VNC 服务:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ vncviewer localhost::7900
&/code&&/pre&&/div&&p&注意:在 &a href=&https://link.zhihu.com/?target=http%3A//www.realvnc.com/products/free/4.1/man/vncviewer.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vncviewer 的 man 手册&/a&中并未提及这种修改端口号的方式。在 &a href=&https://link.zhihu.com/?target=http%3A//www.realvnc.com/pipermail/vnc-list/2006-April/054551.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&About VNCViewer configuration of the output TCP port&/a& 中可以看到。这也是 &a href=&https://link.zhihu.com/?target=http%3A//www.tightvnc.com/vncviewer.1.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&the TightVNC vncviewer&/a& 所介绍的的。&/p&&h2&&b&场景 2&/b&&/h2&&blockquote&在 externo2 节点上访问由 interno1 节点提供的 TCP 服务(本地端口转发 / 绑定地址 = 0.0.0.0 / 主机 = localhost)&/blockquote&&p&这次的场景跟方案 1 的场景的类似,但是我们这次想从 externo2 节点来连接到 interno1 上的 VNC 服务:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-27eaad3b725e447d6cafd36a_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic4.zhimg.com/v2-27eaad3b725e447d6cafd36a_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 2&/i&&/p&&p&正确的命令如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -L 0.0.0.0:7900:localhost:5900 user@interno1
&/code&&/pre&&/div&&p&看起来跟方案 1 中的命令类似,但是让我们看看 netstat 命令的输出上的区别。7900 端口被绑定到了本地(127.0.0.1),所以只有本地进程可以访问。这次我们将端口关联到了 0.0.0.0,所以系统允许任何 IP 地址的机器访问 7900 这个端口。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ netstat -ltn
Active Internet connections
(only servers)
Proto Recv-Q
Local Address Foreign Address State
Tcp 0 0 0.0.0.0:.0.0:*
&/code&&/pre&&/div&&p&所以现在在 externo2 节点上,我们可以执行:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo2 $ vncviewer externo1::7900
&/code&&/pre&&/div&&p&来连接到 interno1 节点上的 VNC 服务。&/p&&p&除了将 IP 指定为 0.0.0.0 之外,我们还可以使用参数 -g(允许远程机器使用本地端口转发),完整命令如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -g -L 7900:localhost:5900 user@interno1
&/code&&/pre&&/div&&p&这条命令与前面的命令能实现相同效果:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -L 0.0.0.0:7900:localhost:5900 user@interno1
&/code&&/pre&&/div&&p&换句话说,如果我们想限制只能连接到系统上的某个 IP,可以像下面这样定义:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -L 192.168.24.80:7900:localhost:5900 user@interno1
externo1 $ netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Tcp 0 0 192.168.24.80:.0.0:* LISTEN
&/code&&/pre&&/div&&h2&&b&场景 3&/b&&/h2&&blockquote&在 interno1 上访问由 externo1 提供的 TCP 服务(远程端口转发 / 绑定地址 = localhost / 主机 = localhost)&/blockquote&&p&在场景 1 中 SSH 服务器与 TCP 服务(VNC)提供者在同一个节点上。现在我们想在 SSH 客户端所在的节点上,提供一个 TCP 服务(VNC)供 SSH 服务端来访问:&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-5d48a81e18e659db2a1d10b4e34ef1b5_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic2.zhimg.com/v2-5d48a81e18e659db2a1d10b4e34ef1b5_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 3&/i&&/p&&p&将方案 1 中的命令参数由 -L 替换为 -R。&/p&&p&完整命令如下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -R 7900:localhost:5900 user@interno1
&/code&&/pre&&/div&&p&然后我们就能看到 interno1 节点上对 7900 端口正在监听:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&interno1 $ netstat -lnt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Tcp 0 0 127.0.0.1:.0.0:* LISTEN
&/code&&/pre&&/div&&p&现在在 interno1 节点上,我们可以使用如下命令来访问 externo1 上的 VNC 服务:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&interno1 $ vncviewer localhost::7900
&/code&&/pre&&/div&&h2&&b&场景 4&/b&&/h2&&blockquote&interno2 使用 externo1 上提供的 TCP 服务(远端端口转发 / 绑定地址 = 0.0.0.0 / 主机 = localhost)&/blockquote&&p&与场景 3 类似,但是现在我们尝试指定允许访问转发端口的 IP(就像场景 2 中做的一样)为 0.0.0.0,这样其他节点也可以访问 VNC 服务:&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-73ecf5ff7ccefbce09c846e_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic4.zhimg.com/v2-73ecf5ff7ccefbce09c846e_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 4&/i&&/p&&p&正确的命令是:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -R 0.0.0.0:7900:localhost:5900 user@interno1
&/code&&/pre&&/div&&p&但是这里有个重点需要了解,出于安全的原因,如果我们直接执行该命令的话可能不会生效,因为我们需要修改 SSH 服务端的一个参数值 GatewayPorts,它的默认值是:no。&/p&&blockquote&GatewayPorts&br&该参数指定了远程主机是否允许客户端访问转发端口。默认情况下,sshd(8) 只允许本机进程访问转发端口。这是为了阻止其他主机连接到该转发端口。GatewayPorts 参数可用于让 sshd 允许远程转发端口绑定到非回环地址上,从而可以让远程主机访问。当参数值设置为 “no” 的时候只有本机可以访问转发端口;“yes” 则表示允许远程转发端口绑定到通配地址上;或者设置为 “clientspecified” 则表示由客户端来选择哪些主机地址允许访问转发端口。默认值是 “no”。&/blockquote&&p&如果我们没有修改服务器配置的权限,我们将不能使用该方案来进行端口转发。这是因为如果没有其他的限制,用户可以开启一个端口(& 1024)来监听来自外部的请求并转发到 localhost:7900。&/p&&p&参照这个案例:&a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Netcat& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&netcat&/a& ( &a href=&https://link.zhihu.com/?target=http%3A//bugs.debian.org/cgi-bin/bugreport.cgi%3Fbug%3D310431& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Debian # 310431: sshd_config should warn about the GatewayPorts workaround.&/a& )&/p&&p&所以我们修改 /etc/ssh/sshd_config,添加如下内容:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&GatewayPorts clientspecified
&/code&&/pre&&/div&&p&然后,我们使用如下命令来重载修改后的配置文件(在 Debian 和 Ubuntu 上)。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo /etc/init.d/ssh reload
&/code&&/pre&&/div&&p&我们确认一下现在 interno1 节点上存在 7900 端口的监听程序,监听来自不同 IP 的请求:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&interno1 $ netstat -ltn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Tcp 0 0 0.0.0.0:.0.0:* LISTEN
&/code&&/pre&&/div&&p&然后我们就可以在 interno2 节点上使用 VNC 服务了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&interno2 $ internal vncviewer1::7900
&/code&&/pre&&/div&&h2&&b&场景 5&/b&&/h2&&blockquote&在 externo1 上使用由 interno2 提供的 TCP 服务(本地端口转发 / 绑定地址 localhost / 主机 = interno2 )&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-18dbf1f94f4_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic3.zhimg.com/v2-18dbf1f94f4_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 5&/i&&/p&&p&在这种场景下我们使用如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -L 7900:interno2:5900 user@interno1
&/code&&/pre&&/div&&p&然后我们就能在 externo1 节点上,通过执行如下命令来使用 VNC 服务了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ vncviewer localhost::7900
&/code&&/pre&&/div&&h2&&b&场景 6&/b&&/h2&&blockquote&在 interno1 上使用由 externo2 提供的 TCP 服务(远程端口转发 / 绑定地址 = localhost / host = externo2)&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-71a93e016b37b4a0fceb91d189c4e0e6_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic2.zhimg.com/v2-71a93e016b37b4a0fceb91d189c4e0e6_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 6&/i&&/p&&p&在这种场景下,我们使用如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -R 7900:externo2:5900 user@interno1
&/code&&/pre&&/div&&p&然后我们可以在 interno1 上通过执行如下命令来访问 VNC 服务:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&interno1 $ vncviewer localhost::7900
&/code&&/pre&&/div&&h2&&b&场景 7&/b&&/h2&&blockquote&在 externo2 上使用由 interno2 提供的 TCP 服务(本地端口转发 / 绑定地址 = 0.0.0.0 / 主机 = interno2)&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-7cdce62aff19_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic4.zhimg.com/v2-7cdce62aff19_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 7&/i&&/p&&p&本场景下,我们使用如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -L 0.0.0.0:7900:interno2:5900 user@interno1
&/code&&/pre&&/div&&p&或者:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -g -L 7900:interno2:5900 user@interno1
&/code&&/pre&&/div&&p&然后我们就可以在 externo2 上执行如下命令来访问 vnc 服务:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo2 $ vncviewer externo1::7900
&/code&&/pre&&/div&&h2&&b&场景 8&/b&&/h2&&blockquote&在 interno2 上使用由 externo2 提供的 TCP 服务(远程端口转发 / 绑定地址 = 0.0.0.0 / 主机 = externo2)&/blockquote&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-cb2d903a7639ddb88cff3ff90fe37018_b.jpg& data-caption=&& data-rawwidth=&550& data-rawheight=&180& class=&origin_image zh-lightbox-thumb& width=&550& data-original=&https://pic3.zhimg.com/v2-cb2d903a7639ddb88cff3ff90fe37018_r.jpg&&&/figure&&p&&br&&/p&&p&&i&SSH Tunnels: Scenario 8&/i&&/p&&p&本场景下我们使用如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -R 0.0.0.0:7900:externo2:5900 user@interno1
&/code&&/pre&&/div&&p&SSH 服务器需要配置为:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&GatewayPorts clientspecified
&/code&&/pre&&/div&&p&就像我们在场景 4 中讲过的那样。&/p&&p&然后我们可以在 interno2 节点上执行如下命令来访问 VNC 服务:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&interno2 $ internal vncviewer1::7900
&/code&&/pre&&/div&&p&如果我们需要一次性的创建多个隧道,使用配置文件的方式替代一个可能很长的命令是一个更好的选择。假设我们只能通过 SSH 的方式访问某个特定网络,同时又需要创建多个隧道来访问该网络内不同服务器上的服务,比如 VNC 或者 &a href=&https://link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Remote_Desktop_Services& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&远程桌面&/a&。此时只需要创建一个如下的配置文件 $HOME/redirects 即可(在 SOCKS 服务器 上)。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# SOCKS server
DynamicForward 1080
# SSH redirects
LocalForward 2221 serverlinux1: 22
LocalForward 2222 serverlinux2: 22
LocalForward .23.45:22
LocalForward .23.48:22
# RDP redirects for Windows systems
LocalForward 3391 serverwindows1: 3389
LocalForward 3392 serverwindows2: 3389
# VNC redirects for systems with &vncserver&
LocalForward 5902 serverlinux1: 5901
LocalForward .23.45:5901
&/code&&/pre&&/div&&p&然后我们只需要执行如下命令:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&externo1 $ ssh -F $HOME/redirects user@interno1
&/code&&/pre&&/div&&hr&&p&via: &a href=&https://link.zhihu.com/?target=https%3A//wesharethis.com/2017/07/creating-tcp-ip-port-forwarding-tunnels-ssh-8-possible-scenarios-using-openssh/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&wesharethis.com/2017/07&/span&&span class=&invisible&&/creating-tcp-ip-port-forwarding-tunnels-ssh-8-possible-scenarios-using-openssh/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&作者:&a href=&https://link.zhihu.com/?target=https%3A//wesharethis.com/author/ahmad/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Ahmad&/a& 译者:&a href=&https://link.zhihu.com/?target=https%3A//github.com/toutoudnf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&toutoudnf&/a& 校对:&a href=&https://link.zhihu.com/?target=https%3A//github.com/wxy& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&wxy&/a&&/p&&p&本文由 &a href=&https://link.zhihu.com/?target=https%3A//github.com/LCTT/TranslateProject& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LCTT&/a& 原创编译,&a href=&https://link.zhihu.com/?target=https%3A//linux.cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux中国&/a& 荣誉推出&/p&
这样的网络协议来说,其主要职责就是在终端模式下访问一个远程系统。因为 SSH 协议对传输数据进行了加密,所以通过它在远端系统执行命令是安全的。此外,我们还可以在这种加密后的连接上通过创建隧道(端口转发)的方式,来实现两…
法律问题留给法律界人士去评论吧。只说工作本身。我个人赞同匿名人士的观点 &br&&br&我感觉这就是: “另外那四个真是渣渣,这是什么垃圾代码?!看老子给你们重构一遍!”&br&&br&之说以拿出来重提一遍,是因为我认为这个答案只说了一半。这后面还有一句话: 「然而这一切并没有卵用」 这个才是整件事情的关键。这也是为什么这人离职一段时间了,公司才发现了这个情况。&br&&br&这个家伙的工作能力难道不是应该在干这个项目的时候就已经被发现的吗?&br&&br&这个家伙的工作能力难道不是应该在干这个项目之前就被发现的吗?&br&&br&这个家伙的工作能力难道不是应该在被招进来的时候就被发现了吗?&br&&br&重要的事情说三遍,为什么这么牛的人都已经卷铺盖滚蛋了,你们都不知道人家为啥走?&br&&br&开源这个事情现在玩儿的热火朝天,但是还有人记得当年哪些富可敌国的商业公司为什么要支持开源吗?现在的这些玩儿法,控制某个领域什么什么的都是后来发展出来的。&br&&br&当年搞这些事情的直接原因,就是因为有很多超牛的人,人家不屑于当你的官,人家不稀罕端你的碗,人家就愿意在水泊梁山,大碗喝酒,大块吃肉。问题是这些商业公司发现自己在很多领域不能没有这些人。好吧,那你们就继续在梁山high 着,钱我出,只要你写出来的东西能允许我用就行了。&br&&br&这是当年开源软件得到资助的主要原因。
法律问题留给法律界人士去评论吧。只说工作本身。我个人赞同匿名人士的观点 我感觉这就是: “另外那四个真是渣渣,这是什么垃圾代码?!看老子给你们重构一遍!” 之说以拿出来重提一遍,是因为我认为这个答案只说了一半。这后面还有一句话: 「然而这一切…
日:初稿&br&日:二稿&br&有很多朋友问能否转载,在这里统一回答一下,由于文章还没写完(后面答疑部分大段空着),所以暂不希望转载,如需分享请直接指向本回答,我会努力尽快填完:)&br&&br&&ul&&li&&b&《比特币基础科普与常见误解》&/b&&/li&&/ul&&br&================== 写在最前面 ==================&br&比特币是一种全新的东西。比特币和互联网一样,都有着全新的底层技术,运行原理和上层应用,历史上从未有过类似的东西。&b&给&/b&&b&普通民众讲清楚比特币是什么,就像给80年代的民众讲清楚互联网是什么一样困难。&/b&&br&&br&这也导致了绝大部分普通民众都很难搞清楚比特币是什么,并产生各种各样的误解,这和互联网早期遇到的问题一模一样。如果告诉80年代的民众能通过网络买衣服,他们会怎么反应?&br&&blockquote&连试都没法试,怎么可能通过这种方式买衣服?这绝对扯淡!&br&有图片也不行啊,上街买衣服不都得试穿试穿?&br&不知道穿了合不合身,好不好看就买?你这是疯了吧!&/blockquote&你要向他们介绍Google,他们会怎么反应?&br&&blockquote&一家帮你搜索信息的公司值5000亿美元?查个信息能收那么多钱?&br&什么?查信息是免费的?你用的所有服务都是免费的?&br&那公司怎么赚钱?还市值5000亿美元?你这是疯了吧!&/blockquote&你要告诉普通民众,一种程序员人为造出来的数字货币,一个币能值1200美元,超过一盎司黄金,总市值超过一百亿美元,他们会怎么反应?&br&&blockquote&比特币就是个骗局,任何一个程序员都可以再造出更多的比笨币,比傻币,比蠢币,&br&这种凭空造出来,完全没有实体的虚拟币怎么可能有价值?&br&没有政府背书担保,怎么可能有信用当货币?你这是疯了吧!&/blockquote&听起来是不是都很有道理,逻辑上无懈可击?&br&&br&对于想了解比特币的人来说,比特币又相当晦涩难懂。最早的比特币用户大都是极客与黑客高手,这导致绝大部分“比特币科普教程”实际上充斥着大量的技术术语和底层原理介绍,并不适合没有技术背景的人阅读。&br&&br&通常而言,一个没有技术背景的人自学的话,往往需要花一两个月的时间才能大致搞清楚比特币的技术基础、运行原理、过往历史和生态系统(想想一个80年代的人要花多久才能大致搞清楚互联网)。本文的目的,就是将这一两个月缩短到一两周,并力争在阅读本文的一两小时内形成对比特币的基本认识框架。&br&&br&==================目录==================&br&&ul&&li&&b&0、比特币是什么?&/b&&/li&&br&&li&&b&1、比特币合法吗?&/b&&/li&&/ul&1.1、比特币在法律上的定义&br&1.2、比特币是庞氏骗局或传销吗?&br&1.3、某些传销虚拟币和比特币的区别&br&&br&&ul&&li&&b&2、比特币是怎么运行的?&/b&&br&&/li&&/ul&2.1、中心化账本(银行)&br&2.2、去中心化账本&br&2.3、去中心化账本(比特币)&br&2.4、不可复制的比特币&br&2.5、比特币去中心化的意义&br&&br&&ul&&li&&b&3、比特币有什么用?有什么价值?&/b&&br&&/li&&/ul&3.1、支付汇款&br&3.1.1、比特币支付&br&3.1.2、比特币小额支付&br&3.1.3、比特币跨国汇款(需对冲币价波动)&br&3.1.4、资本管制下的比特币跨国汇款&br&&br&3.2、智能合约&br&3.2.1、映射真实世界资产&br&3.2.2、锚定真实世界法币&br&3.2.3、不可欺诈的合同和经济&br&&br&3.3、信息公开&br&3.3.1、慈善募捐&br&3.3.2、身份验证&br&3.3.3、去中心化服务&br&3.3.4、资金公开&br&3.3.4、信息公开与智能合约的结合&br&&br&3.4、炒作标的&br&&br&3.5、非法用途&br&3.5.1、在线博彩&br&3.5.2、暗网黑市&br&3.5.3、敲诈勒索&br&3.5.5、传销吸纳资金&br&3.5.6、非聪本意&br&&br&3.6、价值储存&br&3.6.1、黄金的价值储存功能&br&3.6.2、比特币的价值储存功能&br&3.6.3、比特币的避险功能&br&3.6.4、比特币的避难功能&br&&br&3.7、货币发行与社会公平&br&3.7.1、社会削弱政府权力的趋势&br&3.7.2、政府掌握货币发行权的弊端&br&3.7.3、美国限制政府货币发行权的尝试&br&3.7.4、哈耶克的货币非国家化&br&3.7.5、弗里德曼的雅浦岛石币&br&3.7.6、数字货币三十年的技术积累&br&3.7.7、比特币的最高使命——以技术手段限制政府滥发法币,促进社会的公平与效率&br&&ul&&li&&b&4、比特币的风投&br&&/b&&/li&&li&&b&5、比特币是怎么发行的,什么是比特币挖矿?&/b&&br&&/li&&/ul&5.1、什么是比特币挖矿&br&5.2、挖矿设备的演变&br&5.3、矿池&br&5.4、比特币挖矿的意义——分发初始比特币&br&&ul&&li&&b&6、区块链的重要意义——人类组织结构的重大创新&/b&&br&&/li&&li&&b&&b&7、比特币的缺陷&/b&&br&&/b&&/li&&li&&b&8、总结&/b&&/li&&/ul&8.1、投资风险&br&8.2、使用风险&br&==================正文==================&br&&br&&ul&&li&&b&0、比特币是什么&/b&&br&&/li&&/ul&比特币(Bitcoin,缩写BTC)是一种&b&总量恒定2100万的数字货币&/b&,和互联网一样具有&b&去中心化、全球化、匿名性&/b&等特性。向地球另一端转账比特币,就像发送电子邮件一样简单,低成本,无任何限制。比特币因此被用于跨境贸易、支付、汇款等领域。&br&&br&比特币由于广阔的前景和巨大的遐想空间,自2009年诞生后价格持续上涨,2011年币价达到1美元,2013年最高达到1200美元,超过1盎司黄金价格,有“数字黄金”的美称(目前币价约450美元)。&br&&figure&&img src=&https://pic2.zhimg.com/50/747da9a8da3954babbe52f70f980ea92_b.jpg& data-rawwidth=&640& data-rawheight=&365& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/50/747da9a8da3954babbe52f70f980ea92_r.jpg&&&/figure&比特币始于2008年神秘人物中本聪(Satoshi Nakamoto)的论文《&a href=&//link.zhihu.com/?target=https%3A//bitcoin.org/bitcoin.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&比特币:一种点对点的电子现金系统&/a&(&a href=&//link.zhihu.com/?target=http%3A//vdisk.weibo.com/s/d3JAXL5bA_YPm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文版&/a&)》。在诞生后的六年里,比特币作为一种前所未有的新型货币,经历了无数的市场考验和技术攻击,始终屹立不倒。现在比特币已成长为一个&b&在全球有着数百万用户,数万商家接受付款,市值最高达百亿美元的货币系统&/b&。&br&&br&比特币相关企业也吸引了来自上百家著名风险投资基金、公司、个人近十亿美元的风险股权投资,其中不乏传统金融巨头,例如:&br&Visa、纳斯达克、花旗:《&a href=&//link.zhihu.com/?target=http%3A//www.8btc.com/visa-chain-30-million& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Visa,纳斯达克等巨头投资区块链公司Chain 3000万美元&/a&》;&br&万事达卡(MasterCard):《&a href=&//link.zhihu.com/?target=http%3A//www.8btc.com/mastercard-dcg& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&万事达卡、纽约人寿保险加入数字货币集团新一轮融资&/a&&br&》;&br&高盛、IDG资本:《&a href=&//link.zhihu.com/?target=http%3A//www.8btc.com/circle-raises-50-million& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&比特币公司Circle获5000万美元融资&/a&》;&br&PayPal联合创始人,eBay联合创始人、高通:《&a href=&//link.zhihu.com/?target=http%3A//www.8btc.com/bitcoin-startup-21& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&初创比特币公司21获1.

我要回帖

更多关于 编程语言中的泛型 的文章

 

随机推荐