编程语言
人与机器¶
人通过存储程序控制计算机解决可计算性问题。
"位 + 上下文" 是计算机表示与处理信息的底层逻辑—语言与机器的分际——机器语言。
引入助记符,通过查表(操作码表/符号表),将汇编语言翻译成机器语言,语言向人的一侧偏移——汇编语言。
指令集——语言与机器的规约。
由此,汇编语言 -> 高级语言,自举。
图灵与邱奇¶
图灵创造了图灵机,邱奇创造了 lambda 演算,两者都可以表达计算的方式——图灵机和 lambda 演算是逻辑等价的。
图灵机是计算机的发端,更有助于学习计算机组成原理,更偏向硬件。
lambda 演算是最小的通用的编程语言,更有助于学习编程原理,更偏向软件。
语法与语义¶
lambda 演算在语法和语义上是最小化且完备的。
lambda 演算引入的概念:表达式、变量(自由变量/约束变量)、函数、应用、alpha-转换、beta-规约。
算法描述¶
正如,语言是思维的物质外壳。
算法是问题的解决方案,程序是对算法的描述,编写程序的语言只是一个工具。
算法是具有思想性的,程序员选择合适的编程语言表达自己的思想。
糖衣语法¶
几乎所有的主流语言都是图灵完备的,而形式不一。
不同的语言都着一身不同的糖衣。
语法糖,让人感到快乐!Ruby 就是这样的编程语言,Elixir 也不错!
语言优势¶
先天优势¶
开发效率?运行效率?工程效率?
工作语言?个人语言?
原型应用?CPU 密集?IO 密集?
主流的编程语言都有着某种先天优势,如 Go、Rust。
生态优势¶
当一门编程语言有了一个杀手级应用时,围绕它的生态也正在形成。
组合创新要比原始创新更加省力。
社区优势¶
有人对地方,就有江湖。有技术人的地方,就有技术社区。
总有人,会挠自己的痒,利己利人。
语言学习¶
语言抽象¶
世界是物质的,物质是运动的,运动是有规律的,规律是可认知的,认知是可发展的。
语言是用来描述世界的!!!
由物质和运动,我们可以把握一系列抽象。
物质层面的语言抽象:操作数,数据结构,范畴……
运动层面的语言抽象:操作码,函数,映射……
编程范式¶
解题步骤:操作数 + 操作码,变量 + 函数,对象 + 消息,范畴 + 映射,……
由抽象层次体系,我们可以把握一系列编程范式:命令式编程、面向对象编程、函数式编程……
语言生态¶
面向文档!面向谷哥!面向社区!面向未来!
编程工具¶
面向文档编程,面向示例编程,面向项目编程。
Z 用语言¶
工作语言:JavaScript/Python/Ruby/Scala/Java/Bash/Lua/SQL
个人语言:Go/Lua/Bash
兴趣语言:Scheme/Elixir/Erlang/Haskell
思维模式¶
多范式编程语言的优势在于为开发者提供了不同的思维模式。
学习一门编程语言,相较语言特性而言,思维模式的价值更大。
应用领域¶
每一门编程语言都是有设计缺陷的,也就决定了它的应用领域。
认知工具¶
世界是物质的,物质是运动的,运动是有规律的,规律是可认知的,认知是可发展的。
世界 := 物质 + 运动,是思维的起点,也是语言的起点——语言是思维的物质外壳。
由此,编程语言表征了编程的思维方式。
人机交互¶
人用计算机解决可计算性问题的过程是人机交互的过程,是关联问题空间与解题空间到过程。