各种语言的区别汇总
编程语言类型
区别总结
类型 | 原理 | 优点 | 缺点 | 语言 |
---|---|---|---|---|
编译型语言 | 通过专门的编译器,将所有源代码一次性转换成特定平台(Windows、Linux 等)执行的机器码(以可执行文件的形式存在)。 | 编译一次后,脱离了编译器也可以运行,并且运行效率高。 | 可移植性差,不够灵活。 | C、C++、OC、Golang、Pascal(Delphi)、汇编、swift |
解释型语言 | 由专门的解释器,根据需要将部分源代码临时转换成特定平台的机器码。 | 跨平台性好,通过不同的解释器,将相同的源代码解释成不同平台下的机器码。 | 一边执行一边转换,效率很低。 | python、js、php、shell、ruby、 |
混合型 | Java字节码在java虚拟机中解释执行,更类似解释型语言; c#更接近编译型语言 | java、c# | ||
动态语言 | oc的runtime机制(消息转发)、c#反射机制、python运行中给类绑定属性,方法、 | iOS的热修复、灵活 | 性能较低 | OC、C#、js、php、python、erlang、ruby |
静态语言 | 更安全;IDE的代码感知能力强,对开发更有保障; | java、c、c++ | ||
标签语言 | HTML、XML、XSLT、VML | |||
动态类型语言 | 指在运行期间才去做数据类型检查的语言 | Python、Ruby、js、swift、php、perl、erlang | ||
静态类型语言 | 数据类型,在编译阶段决定 | c、c++、c#、java、oc | ||
强类型语言 | 一旦变量类型确认,除强制类型转换,都不可转变为其他类型 | 更安全 | java、oc、c#、python、ruby | |
弱类型语言 | 数据类型可以忽略,一个变量可以赋值一种类型,也能赋值另一种类型 | 更灵活 | swift、js、php | |
面向对象 | 任何事物都能抽象成一个对象,有自己的属性和行为 | C++、oc、java、dart | ||
面向过程 | 最初的主要过程式编程语言出现在大约1957年至1964年,包括Fortran、ALGOL、COBOL、PL/I和BASIC[2],后来的Pascal和C发表于大约1970年至1972年。 | 执行快 | 难维护 | c、fortran、basic |
函数式编程 | 一种编程范式,纯粹的函数式编程语言编写的函数没有变量,函数即参数,返回也可是函数(匿名函数)。 | 代码简介,快速开发,接近自然语言,易于理解 | flutter | |
面向切面编程 | 一种编程范式,把中间的非主流程的代码(比如:验证、事务管理、缓存、日志记录等)) 横向抽取出来放在一个公共的类中,也就是切面。可以通过Spring框架来配置该切面。 | |||
编译型语言or解释型语言
编译型语言又称编程语言、静态编译、AOT,解释型语言又称脚本语言、动态解释、JIT
我们所写的程序最终都要运行在计算机中的,但是计算机只认识01也就是机器码,而我们所写的程序都是各语言的源码,要在计算机中运行,都需要将他们转换成计算机能识别的机器码,基于转换的时机,就分成了编译型和解释型两种语言。
- 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器。
- 有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell 等,这种编程语言称为解释型语言,使用的转换工具称为解释器。
编译器的主要工作:词法分析、语法分析、语义分析、性能分析、生成可执行文件。
iOS的文件编译过程:
- 预处理,import头文件的导入,宏拆开
- 代码符号化
- 抽象语法树
- 静态检查,语法检查,拼写检查,方法的申明检查(是否实现的检查是在运行时处理)
- 生成llvm ir
- 优化
- 生成汇编
- 生成二进制文件可执行文件
对比
编译型语言:在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言就不用再进行翻译了。C/C++、OC
解释型语言:是在运行的时候将程序翻译成机器语言。Java,C#。java在程序运行之前,也有一个编译过程,是编译成字节码(中间语言),运行的时候JVM将字节码翻译成机器语言。
又叫脚本语言:都有相应的脚本引擎来解释执行,边解释边执行。python、js、asp、php、perl、nuva
编译型程序比解释型程序消耗的内存更少。但是编译器比解释器要难写很多。
编译型语言很难调试,例如空指针异常很难定位,但是解释型语言就没有这个问题,例如Java运行环境不仅指明了异常的性质,而且给出了异常发生位置具体的行号和函数调用顺序(堆栈跟踪信息)
编译型程序是面向特定平台的,因而平台依赖的,不适合开发Web应用。而解释型程序是平台独立的。
编译型语言不支持跨平台表现主要分为可执行程序不能跨平台和源代码不能跨平台。比如windows的可执行.exe在mac上就运行不了。不同平台的基础类型长度不一样,比如long,有些是4字节,有些是8字节。
解释型语言能够跨平台,就是因为语言设计的官方,针对不同的平台开发了不同的解释器,在不同的平台下,解释器会将相同的源代码转换成不同的机器码(适应当前平台)。
编译型程序不支持代码中实现安全性,因为他可以访问内存的任何区域。但是解释型程序能够保证高度的安全。
编译型程序比解释型程序占用资源少,运行速度快。就是因为解释器消耗了大量的资源,去做解码-抓取-执行的动作,也导致他会慢很多。而且他会做很多代码优化,运行时的安全性检查,这一步也降低了速度。
Java和C#是一种比较奇葩的存在,它们是半编译半解释型的语言,源代码需要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾执行效率;C# 是后来的跟随者,但是 C# 一直止步于 Windows 平台,在其它平台鲜有作为。
脚本语言
其实就是解释型语言,需要脚本引擎来解释执行,一行一行读取代码,边解释边执行。
AOT JIT
编译型又称为静态编译,通常将这种类型称为AOT (Ahead of time compiler)即 “提前编译”。如C、C++。
解释型又称为动态解释,一句一句边翻译边运行,通常将这种类型称为JIT(Just-in-time)即“即时编译”。如JavaScript、Python。
Dart即可JIT,又可以AOT:
- Dart在开发过程中使用JIT,因此每次改都不需要再编译成字节码。节省了大量时间。
- 在部署中使用AOT生成高效的ARM代码以保证高效的性能。
动态语言or静态语言
真正绝对意义上的动态语言或者静态语言是不存在的
动态语言:在一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。oc、c#、js、php、phthon、ruby、erlang
静态语言:与动态语言相对,运行时结构不会变化。java、c、c++。(fishhook能动态修改c,从mach-o层面)
动态类型语言or静态类型语言
在编译期就确定变量类型的是静态类型语言,在运行期才确定变量类型的则是动态类型语言。
动态类型语言:运行是才能确定数据的类型,变量在使用之前无需申明具体类型,如js中的 var s
。常见语言有:js、php、asp、python、ruby、perl、swift
静态类型语言:在编译期间就确定的或者说是在运行之前确定的,编写代码的时候要明确确定变量的数据类型。常见语言有:c、c++、c#、java、oc
解释型语言并不都是动态类型语言,编译型语言并不都是静态类型语言。swift是编译型语言但是它也是动态类型语言。
Static Binding And Dynamic Binding
C中的函数调用方式,是使用的静态绑定(static binding),即在编译期就能决定运行时所应调用的函数。而在Objective-C中,如果向某对象传递消息,就会使用动态绑定机制来决定需要调用的方法。而对于Objective-C的底层实现,都是C的函数。对象在收到消息之后,调用了哪些方法,完全取决于Runtime来决定,甚至可以在Runtime期间改变。
强类型语言or弱类型语言
编译器有很少(合理)隐式类型转化的是强类型语言,有较多(过分)隐式类型转化的是弱类型语言
弱类型语言,数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。
强类型语言,如果不经过强制类型转换,那么他就永远是这个数据类型。
Python是动态类型语言,是强类型语言。JavaScript是动态类型语言,是弱类型语言。Java是静态类型语言,是强类型语言。
Python 到底是强类型语言,还是弱类型语言?:这里说是强类型
面向对象or面向过程or面向切面
面向过程,c语言是最典型的面向过程编程。注重的是完成实际功能的过程,先做什么,再做什么,最后做什么。举个例子,每天早上起床,如果用面向过程的思想为:1、起床 2、收拾屋子 3、洗脸刷牙 4、工作。这些需要按照顺序一步步的执行。
面向对象,都懂,不过多解释,万物都可抽象为对象,有自己的属性和行为。以上面的例子就是抽象出一个人的对象,有四个行为,四个行为的执行并没有固定顺序。
面向切面,是一种编程范式,提取公共方法,给其他模块使用。假设把应用程序想成一个立体结构的话,OOP的利刃是纵向切入系统,把系统划分为很多个模块(如:用户模块、文章模块等等),而AOP的利刃是横向切入系统,提取各个模块可能都要重复操作的部分(如:用户验证、权限检查、日志记录等等)。通俗讲,AOP思想就是把中间的非主流程的代码(比如:验证、事务管理、缓存、日志记录等)) 横向抽取出来放在一个公共的类中,也就是切面。可以通过Spring框架来配置该切面。
函数式编程or响应式编程or声明式编程or指令式编程
指令式编程
我们常用的就是指令式编程
1
2
3
4
5
6
var results = [Int]()
for num in values {
if num %2 != 0 {
results.append(num)
}
}
函数式编程or声明式编程
函数式编程就是一种抽象程度很高的编程范式(如何编写程序的方法论),纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!(匿名函数)
函数式编程也叫声明式编程如下,使用的swift高阶函数都是函数式编程的代表
1
var results = values.filter { $0 % 2 != 0 }
响应式编程
响应式编程见Apple的Combine和ReactiveX对应的Swift版本RxSwift,可以看这篇文章
响应式编程也叫做函数响应式编程范式
响应式编程是一种面向数据流和变化传播的声明式编程范式
Apple 为官方基础库中的很多常用类提供了 Combine 拓展 Publisher,如 Timer, NotificationCenter, Array, URLSession, KVO 等。
通用编程语言
在计算机软件中,通用编程语言指被设计为各种应用领域服务的编程语言。通常通用编程语言不含有为特定应用领域设计的结构。
相对而言,特定域编程语言就是为某一个特定的领域或应用软件设计的编程语言。比如说,LaTeX就是专门为排版文献而设计的语言。
基本上我接触到的都是通用编程语言
各编程语言汇总
区别总结
语言使用排行榜见:TIOBE
语言 | 出生简介 | 编译型/解释型 | 动/静态 | 强/弱类型 | 面向对象 | 函数式编程 | 垃圾回收 | 泛型 |
---|---|---|---|---|---|---|---|---|
c | 于1969年至1973年间,美国 | 编译型 | 静 | 强 | ||||
c++ | 20世纪80年代,丹麦。有STL | 编译型 | 静 | 强 | ✓ | ✓ | ||
c# | 微软 | 混合(更接近编译型) | 动 | 强 | ✓ | ✓ | ✓ | |
oc | 1986年,基于Smalltalk写的,美国 | 编译型 | 动 | 强 | ✓ | ✓ | ||
Java | 1995年,加拿大 | 混合 | 静 | 强 | ✓ | ✓ | ✓ | |
Html | 1982年,创建网页的标准标记语言 | |||||||
JavaScript | 1995,美国 | 解释型 | 动 | 弱 | ✓ | ✓ | ✓ | |
AngularJS | 2009年,google维护的开源js库 | |||||||
TypeScript | 2012,微软,js的超集,添加了类型系统的 JavaScript,适用于任何规模的项目。 | 先编译成js | 静 | 弱 | ✓ | ✓ | ✓ | |
Angular | 基于TypeScript,重写了AngularJS | ✓ | ||||||
react | 2011年部署在脸书,2013年开源,js库,借鉴的PHP的html框架XHP | |||||||
Vue | 2014年,js框架,曾angularjs的开发人员写的,提取的angularjs的他认为好的部分 | |||||||
nodejs | 2009年,是用的google开发的V8引擎,可以运行在服务端的js代码,V8引擎可将js编译成机器代码 | |||||||
weex | 可以使用js或是vue和rax来开发三端,Android iOS Web | |||||||
perl | 1987,美国,借用C、sed、awk、shell脚本、Lisp。集成正则表达式 | |||||||
ruby | 1995年,日本人,基于smalltalk和perl演变而来的 | 解释型(脚本) | 动 | 强 | ✓ | ✓ | ✓ | |
python | 1991年,荷兰人,python的解释器CPython是用c写的 | 解释型(脚本) | 动 | 强 | ✓ | ✓ | ✓ | |
lua | 1993年,巴西 | 解释型(脚本) | 动 | 弱 | ✓ | |||
dart | 2013年,google为了替换js出生的,是V8引擎的领导者主持开发的 | 开发解释型,发布编译型 | 静 | 强 | ✓ | ✓ | ✓ | |
flutter | google的,用dart写的,skia渲染 | |||||||
react native | 脸书研发,React Native基于React.js,用js写移动端 | |||||||
swift | 苹果 | 编译型 | 动 | ✓ | ✓ | |||
Kotlin | 2011年,俄罗斯,JetBrains开发团队所发展出来的编程语言 | 静 | ||||||
go | ||||||||
vba |
C
面向过程编程
C是一种通用的编程语言,广泛用于系统软件与应用软件的开发。于1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇与肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。
C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为最近25年使用最为广泛的编程语言[2]。目前,C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
二十世纪八十年代,为了避免各开发厂商用的C语言的语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。二十世纪八十年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。
特点:
- C 语言是为了编写 UNIX 操作系统而被发明的。
- C 语言是以 B 语言为基础的,B 语言大概是在 1970 年被引进的。
- C 语言标准是于 1988 年由美国国家标准协会(ANSI,全称 American National Standard Institute)制定的。
- 截至 1973 年,UNIX 操作系统完全使用 C 语言编写。
- 目前,C 语言是最广泛使用的系统程序设计语言。
- 大多数先进的软件都是使用 C 语言实现的。
- 当今最流行的 Linux 操作系统和 RDBMS(Relational Database Management System:关系数据库管理系统) MySQL 都是使用 C 语言编写的。
C++
C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
C++ 被认为是一种中级语言,它综合了高级语言和低级语言的特点。
C++ 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,最初命名为带类的C,后来在 1983 年更名为 C++。随后,C++不断增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多继承(multiple inheritance)、标准模板库(standard template library, STL)、异常处理(exception)、运行时类型信息(runtime type information)、名字空间(namespace)等概念逐渐纳入标准。1998年,国际标准组织(ISO)颁布了C++程序设计语言的第一个国际标准ISO/IEC 14882:1998,目前最新标准为ISO/IEC 14882:2020。根据《C++编程思想》(Thinking in C++)一书,C++与C的代码执行效率往往相差在±5%之间[1]。
C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
C#
从Java改进而来
在互联网时代,微软的老派作风使得对新技术和新思想的响应速度不如开源社区,尤其是对Linux和开源社区并不明朗的态度,这使得.NET诞生的这十几年来一直未能取代Java,甚至让后者做大做强。C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。
C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。
C# 是专为公共语言基础结构(CLI)设计的。CLI 由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。
Objective-C
OC面向对象,扩展了标准c,是在SmallTalk的基础上演变来的,有他的消息传递机制
OC不支持多重继承 c++可以
OC通过消息传递实现函数调用,c++直接进行函数调用
OC runtime, 动态类型
JAVA
Java 语言是简单的:
Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
Java 语言是面向对象的:
Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
Java语言是分布式的:
Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
Java 语言是健壮的:
Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
Java语言是安全的:
Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
Java 语言是体系结构中立的:
Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
Java 语言是可移植的:
这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。
Java 语言是解释型的:
如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
Java 是高性能的:
与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。
Java 语言是多线程的:
在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。
Java 语言是动态的:
Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
HTML
超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计网页、网页应用程序以及移动应用程序的用户界面[3]。网页浏览器可以读取HTML文件,并将其渲染成可视化网页。HTML描述了一个网站的结构语义随着线索的呈现,使之成为一种标记语言而非编程语言。
HTML元素是构建网站的基石。HTML允许嵌入图像与对象,并且可以用于创建交互式表单,它被用来结构化信息——例如标题、段落和列表等等,也可用来在一定程度上描述文档的外观和语义。HTML的语言形式为尖括号包围的HTML元素(如<html>
),浏览器使用HTML标签和脚本来诠释网页内容,但不会将它们显示在页面上。
HTML可以嵌入如JavaScript的脚本语言,它们会影响HTML网页的行为。网页浏览器也可以引用层叠样式表(CSS)来定义文本和其它元素的外观与布局。维护HTML和CSS标准的组织万维网联盟(W3C)鼓励人们使用CSS替代一些用于表现的HTML元素[4]。
JavaScript
JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言[8]。JavaScript是一门基于原型、头等函数的语言[9],是一门多范式的语言,它支持面向对象程序设计,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化[8]。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。
JavaScript与Java在名字或语法上都有很多相似性,但这两门编程语言从设计之初就有很大的不同,JavaScript的语言设计主要受到了Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言)的影响[9]。在语法结构上它又与C语言有很多相似(例如if条件语句、switch语句、while循环、do-while循环等)[10]。
在客户端,JavaScript在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的HTML5和CSS3语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如Node.js。
AngularJS
AngularJS 是一个 JavaScript 框架。它可通过
AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑定数据到 HTML。
jQuery
封装了一些js常用的方法,我们主动的调用这些方法 – 提高了代码的利用,以及代码后期的维护React
React
2013年开源,是一个为数据提供渲染为HTML视图的开源JavaScript 库。由Facebook 的软件工程师Jordan Walke创建。他受到PHP的HTML组件框架XHP影响。[6]该框架首先于2011年部署于Facebook的 newsfeed,随后于2012年部署于Instagram。它于2013年5月在JSConf US开源。
VUE
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,开源JavaScript框架,也是一个创建单页应用的Web应用框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
历史:在为AngularJS工作之后,Vue的作者尤雨溪开发出了这一框架。他声称自己的思路是提取Angular中为自己所喜欢的部分,构建出一款相当轻量的框架。
Vue 2.x加入了 Virtual-DOM 和预编译器的设计,使得该框架在运行时能够脱离 HTML 和 CSS 解析,只依赖 JavaScript;同时 Virtual-DOM 也使得 Vue 2.x 渲染成原生 UI 成为了可能。
TypeScript
Typed JavaScript at Any Scale. 添加了类型系统的 JavaScript,适用于任何规模的项目。
- TypeScript 是添加了类型系统的 JavaScript,适用于任何规模的项目。
- TypeScript 是一门静态类型、弱类型的语言。
- TypeScript 是完全兼容 JavaScript 的,它不会修改 JavaScript 运行时的特性。
- TypeScript 可以编译为 JavaScript,然后运行在浏览器、Node.js 等任何能运行 JavaScript 的环境中。
- TypeScript 拥有很多编译选项,类型检查的严格程度由你决定。
- TypeScript 可以和 JavaScript 共存,这意味着 JavaScript 项目能够渐进式的迁移到 TypeScript。
- TypeScript 增强了编辑器(IDE)的功能,提供了代码补全、接口提示、跳转到定义、代码重构等能力。
- TypeScript 拥有活跃的社区,大多数常用的第三方库都提供了类型声明。
- TypeScript 与标准同步发展,符合最新的 ECMAScript 标准(stage 3)。
Angular
基于TypeScript的,重写angularjs
Angular (通常是指 “Angular 2+” 或 “Angular v2 及更高版本”)[4][5] 是一个基于 TypeScript 的 开源 Web 应用框架 由 Google 的 Angular 团队以及社区共同领导。
Angular 是由 AngularJS 的同一个开发团队完全重写的。
一套基于MVC结构的JavaScript开发工具。
核心功能就是对现有HTML编码以指令方式进行扩展,并使扩展后的HTML编码可以通过使用元素声明的方式来构建动态内容。因此,这样的扩展具有划时代的意义,这也是Angular框架自诞生起就备受关注的重要原因。
Angular内部的两项技术点,一个是数据的双向绑定,另一个是依赖注入。
在设计上,Angular 是 AngularJS 的完全重写。
- Angular 没有“作用域”或控制器的概念,其架构中的主要角色是一些层次化的组件。[6]
- Angular 具有不同的表达式语法,主要是用
"[ ]"
来表示属性绑定,以及用"( )"
来表示事件绑定[7] - 模块化 – 许多核心功能都已模块化
- Angular 建议使用 Microsoft 的TypeScript语言,该语言引入了如下特性:
- TypeScript 是 ECMAScript 6 (ES6) 的超集,并且与 ECMAScript 5 (即: JavaScript) 向下兼容。
- 动态加载
- 异步模板编译
- RxJS 提供了迭代式回调。RxJS 在状态可见性和调试方面有局限,不过可以使用诸如 ngReact 或 ngrx 之类的响应式第三方库来解决这些问题
- 支持 Angular Universal,它可以在服务器上运行 Angular 应用程序
nodejs
Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台 JavaScript 运行环境。Node.js 由Node.js Foundation(已与JS Foundation合并为OpenJS Foundation[4])持有和维护[5],亦为 Linux 基金会的项目[6]。Node.js采用Google开发的V8运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。这些技术通常用于资料密集的即时应用程序。
V8是一个由Google开发的开源JavaScript引擎,用于Google Chrome及Chromium中[2]。Lars Bak是这个项目的组长,以V8发动机为其命名[3]。V8在运行之前将JavaScript编译成了机器代码。
Weex
Weex 致力于使开发者能基于通用跨平台的 Web 开发语言和开发经验,来构建 Android、iOS 和 Web 应用。简单来说,在集成了 WeexSDK 之后,你可以使用 JavaScript 语言和前端开发经验来开发移动应用。
Weex 渲染引擎与 DSL 语法层是分开的,Weex 并不强依赖任何特定的前端框架。目前 Vue.js 和 Rax 这两个前端框架被广泛应用于 Weex 页面开发,同时 Weex 也对这两个前端框架提供了最完善的支持。Weex 的另一个主要目标是跟进流行的 Web 开发技术并将其和原生开发的技术结合,实现开发效率和运行性能的高度统一。在开发阶段,一个 Weex 页面就像开发普通网页一样;在运行时,Weex 页面又充分利用了各种操作系统的原生组件和能力。
iOS底层还是通过JSCore来实现的调用native的原生控件的逻辑
python
Python由Guido van Rossum于1991年创建。
https://cloud.tencent.com/developer/news/7021
lua是基于寄存器的虚拟机实现(更简单,更高效),python是基于堆栈的
都是动态数据类型
python有自己的库,是基于自身独立开发的,lua离开c/c++的话没法开发,lua更类似是一层封装
lua,python都是解释型语言
应用领域:
1、Web 开发- Django、Flask、Pyramid、Tornado 等一些流行的 Web 框架可以让我们轻松地开发和管理复杂的 Web 程序。
2、网络爬虫- Python 自带的 urllib 库,第三方的 requests 库和 Scrappy 框架让开发爬虫变得非常容易,是大数据行业获取数据的核心工具。
3、计算与数据分析- NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用, 这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。
4、人工智能- 最流行的神经网络框架如 Facebook 的 PyTorch 和 Google 的TensorFlow 都采用了 Python 语言。
5、云计算- 云计算的平台的 IasS 服务的 OpenStack 就是采用 Python 的。
Ruby
Ruby是由日本计算机科学家松本行弘(Yukihiro Matsumoto)于1995年创建的。
Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言。在20世纪90年代中期由日本计算机科学家松本行弘(Matz)设计并开发。
Ruby的作者认为Ruby > (Smalltalk + Perl) / 2[来源请求],表示Ruby是一个语法像Smalltalk一样完全面向对象、脚本运行、又有Perl强大的文字处理功能的编程语言。
Ruby已经几乎拥有了所有梦幻般的语言特性,神奇的动态能力,强大的支持库,内置的跟Perl可以比肩的正则表达式,Smalltalk级别的纯而又纯的面向对象特征,简洁明快的风格,跨语言整合也非常容易,唯一的缺点就是速度慢。
所谓”魔幻语言“,主要代表作品有C++、Perl、Javascript和Ruby。这些语言拥有丰富的特性,聪明的技巧和意想不到的奇效,永远有发掘不完的奇技淫巧,总能找到让人匪夷所思的”yet another way”。
“简约语言”崇尚清晰直接,够用就行,要求从代码容易理解,宁可笨一点、累一点、多写一点代码,反对出人意料的技巧,反对故弄玄虚。C、PHP、Python和Lua这一派语言的代表作。
而Java和C#从语言设计来说,一开始还是比较简约的,但是近来越来越魔幻,而且标准库设计相当繁复。
VB的传统是典型的简约,老式的VB6和VBA都是典型的简约派,新的VB.NET虽然也能玩出魔幻来,但是根本上还是更亲近简约语言。
lua
Lua是一种轻量语言,它的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快。它用ANSI C语言编写[8],并以源代码形式开放,编译后的完整参考解释器只有大约247kB[8],可以很方便的嵌入别的程序里。和许多“大而全”的语言不一样,网络通信、图形界面等都没有默认提供。但是Lua可以很容易地被扩展:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。事实上,现在已经有很多成熟的扩展模块可供选用。
Lua是一个动态弱类型语言,支持增量式垃圾收集策略。有内建的,与操作系统无关的协作式多线程支持。Lua原生支持的数据类型很少,只提供了数值(缺省是双精度浮点数,可配置)、布尔量、字符串、表格、函数、线程以及用户自定义数据这几种。但是其处理表和字符串的效率非常之高,加上元表的支持,开发者可以高效的模拟出需要的复杂数据类型(比如集合、数组等)。
Lua是一种多重编程范式的程序设计语言:它只提供了很小的一个特性集合来满足不同编程范式的需要,而不是为某种特定的编程范式提供繁杂的特性支持。例如,Lua并不提供继承这个特性,但是你可以用元表格来模拟它。诸如名字空间、类这些概念都没有在语言基本特性中实现,但是我们可以用表格结构(Lua唯一提供的复杂数据结构)轻易模拟。Lua可以在运行时随时构造出一个函数,并把它看作一个对象(正所谓头等函数),这个特性可以很好的满足函数式编程的需要。正是提供了这些基本的元特性,我们可以任意的对语言进行自需的改造。
waxpatch https://blog.csdn.net/LVXIANGAN/article/details/78456140
lua和c的交互原理https://blog.csdn.net/Andy_93/article/details/79401602
https://www.jianshu.com/p/410851a5355f
Lua: C和lua的交互关键是虚拟栈
轻量小巧的脚本语言,用C编写并源码开放,设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
轻量:编译后只有一百余k
嵌入式脚本语言
都高可扩展:Lua可使用C,扩展能力由C的接口提供
lua支持面向过程和函数式编程;C面向过程编程
lua自动内存管理,使用自动垃圾收集机制,C要求显示的分配和释放内存
lua使用动态数据类型,C使用静态类型
Dart
Google开发的通用的编程语言,最开始的理由是替换js,所以很多特性写法和js挺像的。
万物都为对象,连基础类型int、float都是对象,包括函数、null都是对象,都是Object的子类。
有自己的DartVM和JAVA的JVM类似。
Dart是AOT(Ahead Of Time)编译的,可编译成快速,可预测的本地代码。
Dart可以JIT(Just In Time)编译,开发周期快,为Flutter热重载提供基础。
函数式编程
swift,dart,lua
都是动态类型变量
https://zhuanlan.zhihu.com/p/106841081
Swift 是一种支持多编程范式(面向对象,函数式,泛型编程)和编译式的开源编程语言
dart 单进程异步事件模型(isolate实现多线程操作)
dart 万物皆是对象
dartVM
http://gityuan.com/2019/06/23/dart-vm/
Dart虚拟机拥有自己的Isolate,完全由虚拟机自己管理的,Flutter引擎也无法直接访问。Dart的UI相关操作,是由Root Isolate通过Dart的C++调用,或者是发送消息通知的方式,将UI渲染相关的任务提交到UIRunner执行,这样就可以跟Flutter引擎相关模块进行交互。
Isolate之间内存并不共享,而是通过Port方式通信,每个Isolate是有自己的内存以及相应的线程载体。从字面上理解,Isolate是“隔离”,isolate之间的内是逻辑隔离的。Isolate中的代码也是按顺序执行,因为Dart没有共享内存的并发,没有竞争的可能性,故不需要加锁,也没有死锁风险。对于Dart程序的并发则需要依赖多个isolate来实现。
Flutter
Flutter是一个由谷歌开发的开源移动应用软件开发工具包,用于为Android、iOS、Windows、Mac、Linux、Google Fuchsia开发应用[5]。
Flutter第一个版本支持Android操作系统,开发代号称作“Sky”。 它于2015年4月的Flutter开发者会议上被公布[6],宣称其目标为实现120FPS的渲染性能[7]。在上海Google Developer Days的主题演讲中,Google宣布了Flutter Release Preview 2,这是Flutter 1.0之前的最后一个重要版本。2018年12月4日,Flutter 1.0在Flutter Live活动中发布,是该框架的第一个“稳定”版本。[8]2019年12月11日,在Flutter Interactive活动上发布了Flutter 1.12,宣布Flutter是第一个为环境计算设计的UI平台[9]。
Flutter的引擎主要使用C++开发,通过Google的Skia图形库提供底层渲染支持,亦提供平台相关的SDK,例如Android和iOS[10]。Flutter引擎是用于托管Flutter应用的可移植的运行环境。它实现了Flutter的核心库,包括动画和图形、文件和网络I/O、可访问性支持、插件架构以及Dart运行环境和编译工具链。大多数开发人员将通过Flutter框架与Flutter进行交互,该框架提供了一个现代、响应式的框架,以及一组丰富的平台、布局和基础组件。
Kotlin
Kotlin是一种在Java虚拟机上运行的静态类型编程语言,它也可以被编译成为JavaScript源代码。它主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言,其名称来自于圣彼得堡附近的科特林岛。[3]2012年1月,著名期刊《Dr. Dobb’s Journal》中Kotlin被认定为该月的最佳语言。[4]虽然与Java语法并不兼容,但在JVM环境中Kotlin被设计成可以和Java代码相互运作,并可以重复使用如Java集合框架等的现有Java引用的函数库。Hathibelagal写道,“如果你正在为Android开发寻找一种替代编程语言,那么应该试下Kotlin。它很容易在Android项目中替代Java或者同Java一起使用。”
在Google I/O 2017中,Google宣布在Android上为Kotlin提供最佳支持。
参考文章
编译型语言、解释型语言、静态类型语言、动态类型语言、强类型语言、弱类型语言概念与区别
Runtime机制:oc的runtime实现机制就是消息转发