从计算的本质到编程语言
计算的本质
所谓计算,是构建在一套公理体系上的,并且在此基础上不断向上演化。抽象地说,就是从一个符号串 f 变换成另一个符号串 g 。比如说, 从符号串 12+3 变换成15就是一个加法计算。如果符号串 f
是 x^2
,而符号串 g
是 2x
,从
f 到 g 的计算就是微分。定理证明也是如此, 令 f
表示一组公理和推导规则, 令 g
是一个定理,
那么从 f
到 g
的一系列变换就是定理 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;