• 从计算的本质到编程语言


    计算的本质


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

    抽象地说,就是从一个符号串 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. 怎样理解「面向对象编程的精髓在于将操作绑定在数据上」?
  • 相关阅读:
    使用CDN后,PHP如何获取用户的真是IP?
    git常用命令整理
    svn常用命令
    Ansible 运维自动化(一)
    grep 简单笔记
    sed 笔记
    awk命令笔记
    无限极分类(一)获得树结构
    php自定义函数求取平方根
    class path resource [config.xml] cannot be opened because it does not exist
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6952416.html
Copyright © 2020-2023  润新知