孙广东 2016.4.3 (为什么是这个日期, 是我存入笔记的日期)
http://blog.csdn.NET/u010019717
回想一下, 其实编程语言基础到了很多, 大学时的 C, C++, C# , Java, 数据库SQL, 汇编。 毕业后的 Lua, Python , Golang, Ruby , javaScript, TypeScript 等 很多只是接触皮毛而已。
首先要知道语言是属于哪种范类: 强类型/弱类型 , 动态语言/静态语言, 编译/解释
强类型/弱类型
如果一门语言很少隐式转换类型,说明它是强类型语言;如果经常这么做,说明它是弱类型语言。 Java, C++ 和Python是强类型语言, PHP, JavaScript 和 Perl是弱类型语言。 强类型定义语言带来的严谨性能够有效的避免许多错误。
强类型,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了, 不允许两种不同类型的变量相互操作。 强类型定义语言是类型安全的语言。
比如在Python中不能:
动态语言/静态语言
在编译时检查类型的语言是静态类型语言,在运行时检查类型的语言是动态类型语言。 静态类型需要声明类型。 强类型能及早发现问题缺陷。 能为IDE等提供更好的之前。 我是特别喜欢静态类型语言。
在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
静态类型语言 在写程序时要声明变量的数据类型。
Python跟Ruby、javaScript类似是动态语言,类型根据=右面的值。
而C、C++等语言则不属于动态语言。
动的:
优点:方便阅读,不需要写非常多的类型相关的代码;
缺点:不方便调试,命名不规范时会造成读不懂,不利于理解等
静的:
优点:结构非常规范,便于调试,方便类型安全
缺点:为此需要写更多类型相关代码,不便于阅读、不清晰明了
python这样的代码是不会报错的: x的类型是动态改变的!!!!
x = 1 x = "shjkg" print(x) |
我在想,对于js, lua ,python 下面这种命名方式不是更好么?一看就知道类型,方便别人使用和阅读。但是在C# , Java 中是不推荐,但是她们是静态类型啊!!!!
编译型语言 和 解释型语言
编译型语言
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。
C、C++、Pascal、Object-C以及最近很火的苹果新语言swift
解释型语言
解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。
JavaScript、Python、Erlang、PHP、Perl、Ruby
有两个特殊的语言: 既然编译型和解释型各有缺点就会有人想到把两种类型整合起来,取其精华去其糟粕。就出现了半编译型语言。C#在编译的时候不是直接编译成机器码而是中间码. Java先生成字节码(这个字节码不是编译型语言的机器码)再在Java虚拟机中解释执行(解释器)。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。 所以C# 最终执行接近编译, java 最终执行接近解释。 Unity和 Mono的技术在ios 上除外。
C# , Java
多说一句:
Java字节码的执行有两种方式:
1.即时编译方式:解释器先将字节码编译成机器码,然后再执行该机器码。(这是C#采用的!)
2.解释执行方式:解释器通过每次解释并执行一小段代码来完成Java字节码程序的所有操作。(通常是这一种)
=============================================================================================================
每个语言都有他优美的地方,讨厌的地方。 我是最不爱参与“xxx是最牛x, 最叼的语言, 是世界上最好的语言”。 说明他一直在井里!
每个语言基本上都是多重范式的组合。
多重编程范式: 并发编程,约束编程,数据流编程(Dataflow programming),声明性编程,分布式的编程,函数式编程,泛型编程,命令式编程,逻辑编程,元编程,面向对象编程,和响应式编程(Reactive programming)
注: 一下内容链接, 可能需要科学上网,!
编程范型 : https://zh.wikipedia.org/zh-cn/%E7%BC%96%E7%A8%8B%E8%8C%83%E5%9E%8B
元编程
metaprogramming 。根据百度百科的 介绍 ,是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。 最早听说到这个概念是在 C# .Net 平台中有所使用,因为有反射。 一门语言同时也是自身的元语言的能力称之为反射。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。
反射是促进元编程的一种很有价值的语言特性。支持泛型编程的语言也使用元编程能力。
常见的开发语言均能做到元编程,Lisp这货就不用多说了,C的Marco,C++的Template、宏,Java的Annotation,C#的Attribute、Reflection、 CodeDom 和 IL Emitter, 各种脚本语言python(元编程:特性、描述符、类装饰器和元类等等),、Ruby , Elixir ,甚至连Unix/Linux的shell脚本也能。Javascript 中,eval、new Function()便是两个可以用来进行元编程的特性。
元编程常见的应用场景很多,扩展(重构)语法、开发DSL、生成代码、根据特定场景自动选择代码优化、解决一些正交的架构设计问题、AOP等等。
链接: https://www.zhihu.com/question/22572900/answer/21828721
《元编程艺术》 系列文章, 《Ruby元编程》,
我在学习的时候好奇过,就搜索了一下 【Python的decorater,与C#的attribute和Java的annotation有何异同? - 知乎】, 结论就是完全不是一回事儿。
https://www.zhihu.com/question/40618143
命令式编程 和 声明式编程
可以对比的(Imperative vs Declarative)
命令式编程: 应该是所有 C语言系的 ,有普通函数的语言都算。
声明式编程语言:SQL 、 d3.js , Python的 推导或内涵 ,C#中的特性 等等吧
网上流传着 这样的总结:
命令式编程: |
命令“机器”如何去做事情(how),这样不管你想要的是什么(what),它都会按照你的命令实现。 |
声明式编程: |
告诉“机器”你想要的是什么(what),让机器想出如何去做(how)。 |
响应式编程
例如,在命令式编程环境中,a := b+c 表示将表达式的结果赋给,而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。
电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。
例如,在MVC软件架构中,响应式编程允许将相关模型的变化自动反映到视图上(数据绑定),反之亦然。
来自
未完, 待续。。。。。
孙广东 2017.8.3
http://blog.csdn.NET/u010019717