从计算的本质到编程语言

计算的本质



所谓计算,是构建在一套公理体系上的,而且在此基础上不断向上演化。

抽象地说,就是从一个符号串 f 变换成还有一个符号串 g 。比方说, 从符号串 12+3 变换成15就是一个加法计算。

假设符号串 是 x^2 ,而符号串 是 2x ,从
f 到 g 的计算就是微分。定理证明也是如此, 令 表示一组公理和推导规则, 令 是一个定理,
那么从 到 的一系列变换就是定理 的证明。

它们都是从己知符号串開始,一步一步地改变,经过有限步骤。最后得到一个满足预先规定的符号串的变换过程。

计算的两大类型:

  • 数值计算:数值计算包含实数和函数的加减乘除、幂运算、开方运算、方程的求解等;
  • 符号推导:符号推导包含代数与各种函数的恒等式、不等式的证明,几何命题的证明等;

计算的两种范式:

  • 计算理论的研究:側重于从数学角度证明表达能力和正确性,比較典型的图灵机lambda演算、pi演算这些都属于这个范畴。
  • 计算模型的研究:側重于对真实系统的建模和刻画,比方冯诺伊曼模型、BSP模型、LogP模型等等。

编程语言的切入点不同,同一时候可能会是两种范式之中的一个或混合,比方 Lisp 側重于前者(Lamda演算),C 注重于后者(冯诺伊曼模型),而很多其它的语言都在寻求某种折衷。

随着计算机硬件和编译技术的发展。流行语言新特性越来越向LISP进行靠拢,语言设计思想逐也渐向Lisp靠拢。

(过程式)C -> (面向对象)C++ -> (反射+垃圾回收,执行时获取类型)Java -> (动态,执行时能够改变类型Python)->(代码能够生成代码,编译时和执行时无绝对区分(Common
Lisp)

图灵完备与等价:

  • Turing completeness:A computational system that can compute every Turing-computable function is called Turing complete (or Turing powerful). Alternatively, such a system is one that can simulate a universal Turing
    machine.
  • Turing equivalence:A Turing-complete system is called Turing equivalent if every function it can compute is also Turing computable; i.e., it computes precisely the same class of functions as do Turing machines.
    Alternatively, a Turing-equivalent system is one that can simulate, and be simulated by, a universal Turing machine. (All known Turing-complete systems are Turing equivalent, which adds support to the Church–Turing thesis.)

编程语言


编程语言的学习

编程语言决定编程思想,是描写叙述算法的基础。算法和其复杂度分析都是相对于某种计算模型。而程序语言就是描写叙述这样的计算模型的符号系统。

算法必须用某种语言表述出来。

学习程序语言,要理解其最核心最精华的原理,这才是本质。

最好方式是写简单的解释器,实现最主要的功能。之后编程语言的新特性你都大概知道能够怎样实现,而不仅仅停留在使用者的水平。推荐用Scheme,非常适合写解释器。

每种语言都有其适用的场合,都有其长处缺点,都有其设计哲学和编程思想。“C++高大上,我就学C++。别的都不学” 这样的想法是绝逼不可取的。

要精通一两门语言没错,可是也要多学其他,学习的能力思想,是最重要的。

编程语言的选择

当选择一门语言来做东西时,要依据项目需求来评估下它的库、文档、工具支持、与操作系统的集成、资源。还有那么一堆事实上和计算机工作原理没什么关系的东西。以及,一堆和怎样让人更好工作的紧密相关的东西。

  • 练习数据结构。使用C++,拥有灵活的指针来操作内存。
  • 入门函数式,最好还是用Scheme,小而纯粹。学习新思想;
  • 平时的积累,就好好学习C++和Java。业界的绝对主流。
  • 平时自己做小东西玩儿,首推Python,方便又高速;
  • 做项目时,项目用什么,就学什么;

编辑器与IDE

这是个旷日持久的论战,一不小心就被喷死。我还是要在这里说一下自己的看法:

对于编辑器:

  • Emacs 是最牛逼的编辑器,难度最大,内置的是牛逼闪闪的lisp语言。Linus,马克·扎克伯格等一堆大牛都在用。
  • Vim 比較纯粹,编辑功能非常强大,难度比Emacs小,扩展性不如Emacs;
  • Sublime 尽管和上面的两个不能比,可是内置了Python,可开启Vim模式。GUI最华丽,简单;

对于IDE:

  • Windows下最好的是Visual Studio。写 C# 和 C++;
  • 对于Java IDE,最好的是 JetBrains 的IntelliJ IDEA。
  • 对于Python IDE,最好的是 JetBrains 的 Pycharm;

參考


  1. 巴别塔-编程语言之旅
  2. Lisp的永恒之道
  3. 为什么Lisp语言如此先进?
  4. 王垠-怎样写一个解释器
  5. 王垠-什么是语义学
  6. 王垠-怎样掌握程序语言
  7. 90分钟实现一门编程语言——极简解释器教程
  8. 跟vczh看实例学编译原理
  9. 做编译器或操作系统哪个更有趣味?
  10. 怎样设计一门语言(一)——什么是坑(a)
  11. 想做 C++ 方面开发,是基于 Linux 还是基于 Windows 平台?
  12. 怎样理解「面向对象编程的精髓在于将操作绑定在数据上」?
时间: 2024-12-29 23:48:26

从计算的本质到编程语言的相关文章

有序对《计算的本质,深入剖析程序和计算机 Understanding ComputationFrom Simple Machines to Impossible Programs》

有序对的作用是存储两个值,并在之后根据需要再次提供 PAIR = -> x { -> y { -> f { f[x][y] } } } LEFT = -> p { p[ -> x{ -> y { x } }] } RIGHT = -> p { p[ -> x{ -> y { y } }] } 读第一遍的时候对这几行Ruby代码很不理解,就模仿写了一段JavaScript PAIR = function(x){return function(y){ re

编程语言的语法和语义

http://blog.csdn.net/gengzhikui1992/article/details/50762309 为了完整地定义编程语言,我们需要: 语法,描述程序看起来是什么样的: 语义,描述程序的含义. 语法 语法的定义 每一种编程语言都有一系列规则,描述在那种语言中什么样的字符串被认为是有效程序.这些规则定义了这种语言的语法.通过语言的语法规则,我们能把像 y = x + 1 这样可能有效的程序与像 >/;x:[email protected] 这样毫无意义的字符串区分开. 抽象语

《软件故事:谁发明了那些经典的编程语言》

<软件故事:谁发明了那些经典的编程语言> 基本信息 作者: (美)史蒂夫.洛尔 译者: 张沛玄 出版社:人民邮电出版社 ISBN:9787115355089 上架时间:2014-6-19 出版日期:2014 年6月 开本:16开 页码:1 版次:1-1 所属分类:计算机 > 软件工程及软件方法学 > 综合 更多关于>>><软件故事:谁发明了那些经典的编程语言> 编辑推荐 聆听软件行业发展的精彩故事 领悟软件巨擘的深邃思想 放飞想象力,通过编码改变世界

大数据学习笔记7&#183;城市计算(1)

前言 众所周知,快速的城市化使得很多人的生活变得现代化,同时也产生了很多挑战,如交通拥挤.能源消耗和空气污染. 城市的复杂性使得应对这些挑战看起来几乎是不可能的.近来,传感技术和大规模计算基础设施的进步产生了各种各样的大数据,从社会化媒体数据到交通数据,从地理数据到气象数据.如果使用得当,我们可以使用这些数据去应对城市中面临的各种挑战. 受到这个机会的激励,我们提出了城市计算的解决方案.它把城市传感.城市数据管理.城市数据分析和服务提供变成一个对人的生活.城市运行系统和环境进行不断重复但不显眼的

计算思维

Abstract 本文扯了一扯计算思维的相关内容.应XX要求,还特补充了点关于与本科生教育有关的内容. 引言 任何一门学科都有其核心思想.数学中,公理化的数理思维居于核心:工程学里,近似化的工程思维乃是黄金准则:法学上,权利与义务的思维则贯穿始终:经济学内,有着理性人的概念作为基本假设.一门学科的学习过程,相比知识的积累,更为重要的便是这种思维的培养.一门学科的思维,蕴含着整个学科理论体系的世界观与方法论,是整个学科研究经验的高度凝练与概括,真正可以称之为精华的东西. 那么对于计算机科学,我们又

全球导航网格码(GNGC)计算模型的进一步研究

全球导航网格码(GNGC)计算模型的进一步研究 李  滨 (北京大学遥感与地理信息系统研究所,北京 100871,[email protected]) 著名的数学软件Mathematica的发明人是数学家.物理学家.计算机学家沃尔夫勒姆博士(Stephen Wolfram,1959-).他在二零零二年出版了一本专著:<A New Kind of Science>.在这本书中他系统的表达了他的理念:自然界的本质是计算,但计算的本质必须用实验探索.无论是简单或复杂的数学问题(如对2开平方),还是普

Java中的浮点型(Double&amp;Float)计算问题

在刚刚做完的一个项目中,遇到了double型计算不精确的问题.到网上查找后,问题得到解决.经验共享,在这里总结一下. Java中的浮点数类型float和double不能够进行精确运算.这个问题有时候非常严重.比如,经过double型直接计算,1.4×1.5有时会得出2.0999999999999996的结果,但实际上,应该得到2.10.而且,类似的情况并不仅限于乘法计算. 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有.所以,在商业计算中我们要用:java.math.Big

阿里云朱照远:边缘计算,无处不在

摘要: 在2018杭州云栖大会19号下午的论坛上,朱照远对边缘计算进行了深入的阐述,他认为边缘计算是云计算的一部分,是对云计算边界的拓展,云和边缘.终端协同,是万物智联时代的基本形态,这一组合,将满足企业低成本低延时的计算需求. 在2018杭州云栖大会19号下午的论坛上,朱照远对边缘计算进行了深入的阐述,他认为边缘计算是云计算的一部分,是对云计算边界的拓展,云和边缘.终端协同,是万物智联时代的基本形态,这一组合,将满足企业低成本低延时的计算需求. 万物智联的时代,将有百亿乃至千亿级设备的接入.朱

编程入门指南

前言 如今编程成为了一个越来越重要的「技能」:作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容:作为创业者,技术创始人的身份则会让你的很多工作显得更容易.而作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始:入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步:你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目:你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么. 这篇文章的内容对此不仅会有一些方向性的建议,