目录

编译器性价比的三个问题

为什么会有那么多编程语言?

科学计算

并行处理

商业领域

系统编程

为什么会有新编程语言的诞生?

1.广泛使用的编程语言会改变的很慢

2.很容易产生一门新的语言

3.使用新语言填补需求空白

什么样的编程语言算是一门优秀的编程语言?

总结

第一点:你很难做到一款编程语言拥有所有功能

第二点:一门编程语言培养程序员占了主要成本


编译器性价比的三个问题

为什么会有那么多编程语言?

对于编程应用领域来说,它的需求非常独特,又充满矛盾,众口难调,很纳为程序员设计一款能够应用所有情况的编程语言。

科学计算

就拿科学计算来说,科学通常应用于大型计算机主要的应用工程,也用于大科学和需要长时间运算的实验以及模拟实验上,实现这种运算,编程语言需要满足有非常好的浮点运算的支持,简称FP,需要对数组和数组操作有着很好的支持,因为大部分科学应用中最常见的数据类型就是有浮点数的大数组,因为通常情况下我们计算的外界因值或者一些进行演算的算法因子,通常都是浮点数,因为科学计算要求精度较高,准确率较高,通常会精确到小数点后8位,对于CPU来说浮点数它的计算方式和普通整型不一样,浮点数更为复杂,因为浮点数有高位和低位,高位放整数,低位放小数点后的数,并且在计算时要保证小数点溢出到整数同时要保证每个小数都能完成计算包括整数上的进位和小数点上的进位一系列复杂的运算。

同时科学应用也需要并行运算,在一个大数面前最好的方式就是分治法,将一个问题拆分成许多个小问题,然后同时进行计算,在合并成一个解决方案,这类似于C语言的核心思想,C语言一开始面向过程的思想就是把一个问题分解成许多函数,然后依次调用解决这个问题。

并行处理

为了足够的性能以及效率,很需要在程序中使用并行处理,但实际上不是每种语言都支持这些,在过去FORTRAN对这些有很好的支持,到至今FORTRAN仍被重度使用在科学计算领域,正如它的名字一样,公式翻译,它就是为了科学计算而诞生的,现在许多的编译器,比如C,C++,它们本身不是为科学计算而生的,在上面写算法较为难,同时本身C/C++不支持并行计算,你需要自己去调用第三方的系统库或者其它第三方lib库来完成这些,同时你还要自己能够把算法问题拆分成各个子问题然后调用第三方lib库(如多线程)实现并行计算,同时你还要保证数据在多线程之间的准确性,较为复杂。

随着时间的推移,FORTRAN仍有人在维护它,它更新的已经不像最初的样子了,但它在科学计算中时钟处于核心位置,并在该领域是主要引领语言之一,需要知道的是它诞生于1957年,到如今它是引领语言,包括现在的许多高级编译器和解释器都以FORTRAN和Speedcoding(FORTRAN的前身)为核心框架。

商业领域

另一个完全不同的领域就是商业领域,在这里你需要一些持久性的东西,因此你不想丢失这些东西,企业经过千辛万苦才得到这些数据,所以他们需要一种方式去保存住数据,并且这种方式必须可靠,你也需要优秀的报告基础,因为通常你想要对数据进行处理,所以你需要好的措施来生成报告,在性能上你可能需要很快的响应时间和查询时间来保证你能在需要的时候很快的取出数据并做相应的处理。

在许多现代企业中,数据是最有价值资产之一,你需要好的数据存储服务来你的数据进行分析以及处理,这点我们称之为数据分析,所以在商业领域里最常用的编程语言就是数据库语言,关系型数据库SQL,SQL几乎主宰了数据存储这个领域。

系统编程

嵌入式,控制设备,操作系统有什么特征?

对于这些系统来说,需要非常底层的控制,系统编程的重点在于如何做好对于资源的有效管理,需要在这些资源上进行细粒度(详细)的控制,防止资源的浪费

通常在系统编程上回涉及到许多时间方面的问题,如:操作系统内核的时间轮询系统,和时间片中断线程之间的调度,还要英特尔的超时间片技术,所以你需要一些实时的限制,所以你需要能够对时间进行预判,实际上有一些设备需要在一定时间内子才能作出反应,如果这是一个网络设备或者其它类似的设备,你需要对网络进行大量的响应,这个响应也要保持与设备一致的时间内,如果一直监听等待响应这有点浪费资源,因为在等待期间你可以做其它事情,当时间到了在回来接收这是最合理资源把控的手段,在系统编程包括其它接近底层编程中资源是非常重要的。

再如一个列子:

如运行空间不足系统就会停下来,这个停下来是处于待机状态,至于停多久,等待多久这些时间都需要一些把控,还是说一直停下来等有运行空间时在激活,还是说等待多久自动关机,或者主动清空内存为系统腾出运行空间,这里叫做资源空间的时间把控。

到现在为止,系统编程上语言应用最广泛的还是C/C++语言,因为C指针的特性能够让程序员更好的访问底层模块和其它电路设备只需要知道电路在PCB板中处于哪个地址,在用指针指向,就可以写入状态控制电路的开关,而C++这种面向对象的思维能够更好的抽象表达一个设备,如饮水机,用C++的类来控制,把类抽象为一个饮水机,拥有水量,温度等属性,在利用C的指针特性来修改饮水机电路开关,控制是否烧水,因为C++支持C,但是C++会生成许多额外代码,来做类的解析工作,以及耗费许多编译工作,因为本质上C++其实是从C语言变异过来的一门语言,C++的效率要慢于C,对于许多实时响应的底层设备来说选择C的会更多。

但是在一个领域中最重要的东西,可能在另一个领域就不是那回事了,可以想象一下,如果将所有的东西都集成在一个系统址中,并且这些东西都能很好的支持,这是一件十分困难且庞大的事情,因为许多领域要求的很苛刻,你不能随意满足它们,且要求精度很高。

经过上面的问题,就诞生了第二个问题:

为什么会有新编程语言的诞生?

首先要说一点,新的编程语言主要成本是培养程序员如何去使用这款编程语言。

(声明:程序员培训是编程语言的主要成本)

这是很重要的一点,因为你需要让程序员看到这款编程语言的价值,以及为什么选择这款编程语言,同时你要保证你的编程语言不是那么非人类,让人很难学懂,这是一件很难的事情。

对于一个大型编译器项目而已,可能仅需要10-20个程序员就能写出一个相当优秀的编译器,真正花成本的是那些使用者,如何教会他们使用,这会消耗他们大量的时间精力与金钱,这里的成本不是指那些书本费和培训费之类的,是这门语言是否值得他们去学习,这需要程序员自己去决定,许多程序员会利用他们自己的时间去学习,他们花费的时间则是一种看得见的经济成本,许多想学编程语言的人基本上会花费大量的书本费甚至培训费,所以一个简单的编译器其实一个人就能构造出来,复杂一点的如果这个人能力够强,只要时间够的情况下依然可以开发出来,最重要的是上面这些,如何让程序员选择这门语言,这才是编程语言的关键所在,像linus(linux内核的作者)仅用一周开发了git。

如果你思考下,你需要教会一百万个程序员学会你的编程语言,这是一件相当的明显的经济投资。

基于这个管擦结果,可以做一些简单的预测:

1.广泛使用的编程语言会改变的很慢

:软件求稳不求新,如果迭代的太快会让程序员跟不上步伐,甚至一个新特性刚出,还没被程序员捂热,就发布了另外一个特性,也不管稳不稳定,C语言从98年以后就已经不怎么更新了,更新的是那些厂商,如GNU的GCC(GLIB C),BASIC C基本上已经没有变了到现在,但这不影响C语言是如今世界排名第一的编程语言。

即便你改了一些小语法,或者一些接口,你不得不让他们去花时间重新学习这个东西,对于他们来说其实代价是相当高的,因为他们平时也要上班,甚至者有了家庭,相对来说时间较少。

2.很容易产生一门新的语言

:新的编程语言一开始用户为0,所以不用担心去教会庞大的用户量新东西,所以它可以随着时代的变迁频繁迭代更新,为开发者们提供便利,当拥有一两个用户时频繁更新也不会影响到他们,因为教会一两个用户和教会一百万个用户差距很大,成本很低,所以新的编程语言实验速度非常快,可以结合小众开发者们的建议更新编程语言,所以新的编程语言会法阵的很快,且成本很低。

一名程序员什么时候会去在一门已经存在并广泛使用的语言与一门全新的语言中选择?

如果他们觉得他们能花点钱和短时间内能学会这款编程语言,并且在这个行业里变得更具有竞争力,那么他们就会选择新语言

这会在什么情况下发生?

最有可能发生的情况下是在这门新的编程语言刚好能够快速解决你目前遇到的问题,能够填补需求空缺,并且可以短时间内上手。

同时程序员不会轻易换语言,因为他们觉得这门语言学过来不简单,不想轻易换掉自己的老本行,新语言也只是用来填充空白,你很少看见一些C程序员转行去做Python,但是会转行C++因为C++面向对象思维更符合现代,同时C++又是基于C,上手快。

3.使用新语言填补需求空白

编程语言的存在都是有目的的,人们用他来完成工作,我们处于信息革命的中间,一直都有新的应用程序领域诞生,所以每隔几年就会出现一种甚至多种新的编程语言针对不同的领域而诞生,近几年移动应用程序开发是比较新的,而且已经建立了许多用来支持移动计算的新技术,几年前互联网本身作为新的编程平台的出现(WEB开发)在那段时期出现了很多新的编程语言,列如JAVA,人们希望软件发生改变,也就是技术需要改变,那新的编程语言的机会也就来了,旧语言的变化很慢,因此很难适应这些新领域,它们因为更新速度很慢,难以适应新形势,者往往会加速新语言的出现,因为很多人可能不需要去参与到这些新领域里,所以编程语言不能因为一定人群就去改变自己,这样可能会让自己的一部分用户流失,当某些应用领域中出现新的机会时,同时也有足够的程序员来支持,那么通常就会有一种新语言出现。

再次强调,编译语言的主要成本在于程序员为什么选择这款编程语言。

同时还有就是新语言会看起来像旧语言

也就是说说,新语言很少(要求是全新的语言,语法和特性都和旧语言没有相似的地方),新的编程语言基本上都借鉴了旧语言,这点原因是很难对编程语言的框架在做出新的创新,这样做的好处在于可以降低程序员的培训成本,因为程序员在会旧的编程语言的基础之上,学习新语言发现这款语言语法和结构与旧语言类似,那么学起来就会非常轻松,正如上一篇笔记中说到的基本上都符合如下五个结构:

1.词法分析

2.语法分析

3.语义分析复

4.优化

5.汇编代码

通过利用人们已经知道的老语言,可以使人们更轻松的学习新语言,你让他们更快地学习,加快语言的流行度,最典型的列子就是JAVA和C++,JAVA很像C++,可以让C++的程序员很快的开发JAVA程序,而C++很像C,可以让C语言程序员可以很快的开发C++程序。

什么样的编程语言算是一门优秀的编程语言?

这个问题不能清楚的回答,如果从语言设计的通用性来说,没有一款编程语言是优秀的编程语言

人们不会认同什么才是最好的语言,这就像很多类似的讨论话题:PHP是世界上最好的编程语言,C++比C好太多了,JAVA太棒了类似这样的话。

有很多指标,人们提出了很多衡量编程语言的方法,但是大多数人又认为这些并不是非常好的方法,所谓众口难调,也就没有共识,在程序员的世界,什么是最好的语言这个问题根本无法达成共识。

程序员对很多东西有自己的意见,并且还喜欢说服别人自己的主张。

即使在搞科学研究和语言设计的群体中,关于什么是最好的编程语言这个问题,同样没有普遍接受的共识,只是为了说明提出一个这样衡量的指标有多难,但是有一个很明显普遍的指标:

语言用的人越多,这门语言就越好?

这不是一个好的衡量标准,从积极方面来说,这只是一个非常明确的语言流行度衡量指标。

曾经VISUAL BASIC是世界上用的人最多的语言,它有着良好的设计体系同时也拥有可视化界面编程,在那个非可视化界面编程中VB的诞生让开发者们降低了许多写代码的成本,加快了项目进展,VB可以轻松开发窗口程序,拖拽一下控件就能搭建窗口,但是VB的作者也不会宣称VB就是世界上最好的语言,除了技术的优越性,还有许多其它的因素,实际上技术的优越性可能不是某种语言最终的原因,它是针对某个空白领域或一个没有更好工具的应用程序领域而诞生的,然后一旦建立并拥有大量用户,用户的习惯和历史因素会帮它一直生存下去,这就是为什么FORTRAN和COBOL(面向过程的高级设计语言,后面会说)以及其它更加古老的语言一直流行到现在的原因,如果我们基于我们现有的知识,那么我们能设计出更棒的编程语言

总结

有两件最应该记住的事情,在编程应用领域中存在需求冲突

第一点:你很难做到一款编程语言拥有所有功能

(应用程序域有冲突的需求)

因此很难去设计出一个整合了所有你想要功能的系统,在一个连贯的设计中,你没办法将所有你想要的功能都放在一个单系统中,如果一个编程语言编写结构像SQL又像C++又像PYTHON,看起来一点都不连贯的设计会让开发者很难学懂,但是要想统一化又非常难,因为这些语言本身就有不同的特性,为不同的开发思想和领域而诞生,

如一个编程语言已经做好了,面向对象,对抽象化具有很好的支持,但是又想让它对过程化以及数据查询功能拥有更好的支持,那么就要在花大部分时间将过程化以及数据处理改成类似面向对象的思想,这样才能让用户更好的接受,如果只是单纯的把语言整合进来,那么这和学一个新的语言有什么区别?

第二点:一门编程语言培养程序员占了主要成本

(程序员培训是编程语言的主要成本)

正如之前说的:你需要让程序员看到这款编程语言的价值,以及为什么选择这款编程语言,同时你要保证你的编程语言不是那么非人类,让人很难学懂,这是一件很难的事情。

设计使用全新的语言通常比让现有的系统和相关程序员来做出改变使用这些新程序更容易,也更直接,如:当一个新的领域诞生了,你不需要将现有的系统移植到新的领域上,因为现有系统可能压根跟这个领域不相关,或者有一点类似,移植起来你需要重构许多核心代码,这是一个漫长的过程,但是如果有一个新的编程语言让你快速开发新领域上的项目,这会更便捷,因为无论什么时候,重构代码都比重写代码要复杂很多,随着历史的推移你会忘记许多自己写的代码,这也是为什么要注释。

斯坦福大学CS143编译原理课程笔记:3.编译器的性价比相关推荐

  1. 斯坦福大学CS143编译原理课程笔记:1.编译器与解释器简介

    目录 前言 第一节课:编译器与解释器简介 线上与线下的概念 线上 线下 编译器与解释器的区别 编译器 解释器 FORTRAN 1结构 它包含五个阶段 1.词法 分析 2.语法解析 3.语义分析 4.优 ...

  2. 斯坦福大学CS143编译原理课程笔记:2.编译器结构

    目录 编译器的五个阶段 五个阶段的作用 1.概念 2.词法分析 3.语法分析 4.语义分析 5.代码与内存优化 6.代码生成 编译器的五个阶段 1.词法分析 2.语法分析 3.语义分析 4.代码与内存 ...

  3. 斯坦福大学CS143编译原理课程笔记:4. Cool语言概述

    目录 什么是Cool语言? 开始前的准备 COOL项目的五个步骤 COOL编程语言基本教程 文件属性 基本组成 如何运行 输入输出 变量定义 让我们来编译它 COOL语言换行符 COOL方法体续说 C ...

  4. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记

    最近开了一个新坑--[CS231n]斯坦福大学李飞飞视觉识别课程,准备认真学习并记录自己的学习历程. 文章目录 [CS231n]斯坦福大学李飞飞视觉识别课程笔记 课程笔记 学习安排 Week 1 We ...

  5. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(四):图像分类笔记(上)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  6. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(六):线性分类笔记(上)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  7. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(五):图像分类笔记(下)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  8. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十九):卷积神经网络笔记(下)

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

  9. 【CS231n】斯坦福大学李飞飞视觉识别课程笔记(十一):反向传播笔记

    [CS231n]斯坦福大学李飞飞视觉识别课程笔记 由官方授权的CS231n课程笔记翻译知乎专栏--智能单元,比较详细地翻译了课程笔记,我这里就是参考和总结. [CS231n]斯坦福大学李飞飞视觉识别课 ...

最新文章

  1. Quality Certificate Check at Goods Receipt
  2. LeetCode-动态规划基础题-63. 不同路径II
  3. Python NLPIR2016 与 wordcloud 结合生成中文词云
  4. 2015春计算机应用技术基础,计算机应用技术基础.doc
  5. java 泛型 类型形参(Type Parameters) 通配符(wildcard)边界(Bound)
  6. XML 解析错误:格式不佳
  7. 老吴做了15年电商,从简单的卖货,到卖供应链
  8. [转] crontab命令
  9. php选中文本区域,php – 将新行更改为文本区域
  10. 重磅!容器存储解决方案蓝皮书发布
  11. 电气控制技术实训考核装置
  12. 2020年度20多款主流数据库重大更新及技术要点回顾
  13. 2021年文件复制软件评测:FastCopy、TeraCopy、KillCopy、ExtremeCopy、Supercopier
  14. App Store 上架流程
  15. sld中两个条件同时成立时样式配置
  16. 新手如何配置WordPress站点
  17. 华为2019春招留学生笔试第三题python
  18. mahout探索之旅---频繁模式挖掘算法与理解
  19. VC中字符串形式ip地址和整数形式ip地址转换
  20. 开发类似斗鱼虎牙的运营级直播平台多少钱

热门文章

  1. 陀螺仪数据转换成角度_请教怎么把用陀螺仪积分得到的角度转换到大地坐标系下?...
  2. windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
  3. wireshark tshark抓包筛选并存入文件 Centos linux 命令行抓包 yum安装wireshark
  4. html图片等比例拉伸,CSS控制图片等比例缩放
  5. oracle删除重复字段数据库,用Oracle的分析函数删除重复的数据,
  6. linux配置usb主从_技术 | 手把手教你搭建MySQL主从架构
  7. mysql常见函数的实列
  8. 电脑键盘打字手法_电脑快速打字技巧,送个每一位初学者
  9. margin background_div盒子的外部距离(margin)【202】。
  10. java 远程怎么改bug_java struts2 远程执行任意java代码bug漏洞修复