暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

聊聊程序、编程语言、人工智能、算法和上下文

haha视界 2022-12-15
188
  • 上下文

  • 程序和编程语言

  • 人工智能

  • 数据结构和算法

上下文

不管讨论什么,一定要有个上下文,计算机世界里面是不是到处可以看到Context这个词。这就是上下文的意思。大白话讲就是,讨论一个事情的前提条件,或者说是场景、环境、语境。大家在一个共识里面讨论。

有了上下文后,那这个上下文包含什么呢?说来也简单,其实就2类东西:静态的和动态的。

静态的可以是:人、事、物等各类实体类东西。

动态的就是说要“动”,是个动作,比如吃、喝、拉、撒、睡;摸、爬、滚、打;望、闻、问、切;等等各类动作。

比如Android的Activity,本身就是继承至Context,那Activity就是个上下文,Activity包括了当前状态等各field-实体属性,也包括Activity的各个生命周期回调函数-动作方法。

比如Koa里面,对每个请求都有个ctx参数,也是上下文,通过它,串起来一个请求的完整生命周期。

比如Spring的Context ...

程序和编程语言

计算机世界是对现实世界的抽象。计算机只负责0101的二进制解析和执行,它只是个机器而已,程序给它什么数据,它就老实巴交的执行什么操作。而给数据这个事情,就交给程序来做。

所谓程序,就是通过人工或非人工的方式而产生的一组0101的数据流而已。这个数据流,就是指令,包含两类东东:代码和数据。所谓数据,可以理解为你手上现在有的东西;代码可以理解为你想做的事情。

比如 我现在有个锄头,要去挖地;比如 我现在有10元钱,想买瓶水喝。头、10元钱就是数据;地、水就是代码

通过某种方式生成程序的过程,叫做编程:编写出程序。而不同的方式,可以理解为不同的编程语言。可以通过Java写编程,Shell编程...

最开始,是用类似织布机的方式,用打孔机器来写0101数据流打印到纸条上,一个人打印一个人检查,这感觉太麻烦。

到上个世纪40年代,发明了汇编语言。所谓汇编语言,就是直白的约定一些规则,然后翻译成0101的程序。

汇编语言写起来也很麻烦,再次演进出来了面向过程的语言,比如70年代发明的C语言。

再后来,大家把面向机器编程,转换为面向物理世界、面向对象编程,能更模块化,就发明了比如80年代的C++。由于虚函数的引入,C++的性能要比C语言差3%~5%。

为了解决面向不同cpu的机器的编程,90年代又发明了一次编写多端运行的Java语言。Java的性能进一步降低,但开发和维护效率更高。

进入21世纪,随着摩尔定律极限的;cpu按scale up垂直方式不断提高cpu频率慢慢遇到了瓶颈,芯片厂商开始考虑通过 scale out,按水平方式扩展,通过增加cpu核心数量,提高机器处理能力。

为了更好的利用多核并发能力,2007年Google的大神级别工程师博采众长,开始设计支持并发、持垃圾回收的go语言。

最近几年,随时cpu性能的提高,为了应对移动端app开发的研发效率,涌现出了kotlin、swift、dart等更现代化的语法,虽然性能有些许下降,但开发效率提升更多。这种胶水语言,不太需要像c/c++、Java那样,要深入理解原理,按二八原则来学习这类语言,更多的是掌握常用语法即可几天就可以上手干活。

从这编程历史可以看到,随着硬件性能的提高,编程语言则按照提高编程效率发展的趋势。作为面向用户交互的编程开发,长期趋势可以预见到,必会出现更简单的语言,编程群体也会从现在到专业IT程序员扩展到普通用户就能开发,比html、js、css这web三件套还要简单。而作为基础架构编程开发,则会更复杂,面向更细的分工方向发展。

总结就是:语言按简单方向发展,人群按全民编程方向发展,基础架构按深的方向发展。

未来程序员有2种:

  1. 面向用户交互的产品编码专员,有产品feeling的会更吃香;

  2. 面向基础架构的系统研发工程师,对计算机相关的基础能力强的更吃香。

人工智能

不管是面向过程编程还是面向对象编程,都必须有这两类东西:指令和数据

不同编程语言,只是对这2类东西的组织方式不同而已。各类属性就存储为数据;各个方法函数存储指令。现实世界的问题,通过抽象出属性和动作,投射到计算世界,编程方法(指令)和数据。

不管是“人工”智能还是人工智能(AI),无外乎改变的就是这两类东西:

  • 一个是靠人实实在在的把代码敲出来,确定性的修改指令和数据;

  • 一个是代码自己修改指令和数据。

代码怎么自己修改指令和数据呢?我们来写一个人工智能程序:

试想一下,我们通过一个随机函数,随机的输出我们期望的结果。

switch(rand()) {
 case 1:
  print("这是1");
 case 2:
  print("这是2");
 case 3:
  print("这是3");
  ...
 case default:
  print("我不知道输出啥");
}

这代码,神仙都不能100%猜对它的输出,这就算一个简单的人工“智能”程序。

所谓智能,更多的是一个程度,一个比较级。“人工”是大家知道它会输出什么,它的智能程度是L1;AI是大家不知道它会输出什么,但肯定比我们“人工”做的方案要好,它的智能程度是L2甚至更高。刚刚我们的那段人工智能程序例子,它的智能程度是几级?是L0,算智障级别。

那什么是智能程度为L2的AI?

人工智能一般包含2个阶段:训练和上线。

  1. 训练:

“人工”给定一套对数据进行分类、聚类的规则集的指令,然后给定一个初始值数据。

这类规则集可以是基于统计的;也可以是基于专家经验的。

这类程序就是通过反复的执行“人工”给定的这一套规则的指令,根据不同的输出结果更新数据,再根据更新后的数据,重复执行这套规则指令,直到输出符合人们预期的满意的结果集。这个时候,就训练完成了。

  1. 上线:

对该场景下的新的输入数据,程序根据训练完的结果集,再执行一次指令,输出新数据对应的结果集。这个结果集就是让人们认为它是真正的AI的证明。

数据结构和算法

所谓数据结构,就是存储数据的结构。指的是对给定的数据,按照一定方式进行存储。更偏向静态。

所谓算法,简单点说就是按给定方式执行指令的一套方法。这种方式可能很好,也可能很差。解决某类问题的优秀的算法就沉淀下来,就是大家目前刷题常见到的东西。算法更偏向动态。

算法指令通过某种数据结构修改数据。

程序通过调动不同的算法来修改对应数据,输出用户期望的结果:

编程语言->程序->算法->数据结构->数据->结果->用户

一个程序,一定要对有用户产生影响的结果,才能叫程序;不然,一个可有可无的东西,就没存在的必要了。

文章转载自haha视界,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论