type
Post
status
Published
date
Nov 28, 2019
slug
summary
最近学习了下 Unity,使用了一段时间 C#,身为一个多语言开发者,发现各种编程语言变得越来越像了
tags
从入门到放弃
category
学习思考
icon
password
最近学习了下 Unity,使用了一段时间 C#,身为一个多语言开发者,近年来发现各种编程语言变得越来越像了。我之前在 python 中看到装饰器,结果 JavaScript 新的标准也提出装饰器;我在 swift 中发现 optional chain,结果 JavaScript 也马上要支持 optional chain;而最近学习 C#,发现了协程(Unity 提供),也不禁对比 JavaScript 中的协程。我发现这种对比学习,很容易把两种语言的相通知识点都掌握了,就像我之前分享过 Javascript 与 python 的区别一样,我想分享一下 JavaScript 与 C#的一点区别,也作为 Unity 学习的一段小结。

基本概念

1.动态 VS 静态,脚本 VS 高级?

JavaScript 是
  • 解释型语言:就像之前分享过的 Shell 一样,JavaScript 需要有解释器(V8)解释执行,python 同样也是
  • 动态类型
  • 脚本语言
C# 是
  • 编译型语言
  • 静态类型
  • 高级语言
可是我不禁有一个疑问,我们知道 Unity 是支持 Javascript 和 C#作为脚本语言的,咦?发现不对没有,C#怎么又成了脚本语言了。所以我会在脚本 VS 高级打个问号。其实脚本还是高级我们常常是在指它的使用场景,而且开篇也提到了,各种语言正在进化的越来越像,是解释型还是编译型还是很明确的区别,但是脚本还是高级语言区别就很模糊了。比如,JavaScript 原来在网页端,作为操作 dom 的、调用浏览器 API 的一门语言,我们就称它为脚本语言;C#在 Unity 中作为调用 Unity API 的一门语言,在这个场景里我们称它为脚本语言;而现在有了 node,JavaScript 可以运行在服务端,我们还能简单的说他叫脚本语言吗,或许我们应该换掉这种说法了,我们可以说 javascript 和 C#都可以写脚本。

2.跨平台,C#、.net、mono、Unity 之间的关系

那到底什么是写脚本,我们经常听到这个词,我没有去查解释,而是根据我的记忆和经验,做个总结:脚本就是在特定平台或环境(操作系统/浏览器/Unity 引擎)使用某种语言(shell/JavaScript/C#)调用该平台或环境提供的 API(os/dom api/unity api)去完成某些功能(用命令行使用操作系统/操作 dom 网页开发/开发游戏)的代码片段。这里称作代码片段而没有称作程序,是因为程序=算法+数据结构,但脚本有长有短,长的可以做游戏,短的可以是让电脑自动关机用不着什么算法数据结构。 Javascript 相关的平台和 API 比较熟悉了,这里还是着重说下 C#。 C#和 Unity 的发展包括其跨平台历史比较曲折,可以看这篇文章
简单说来就是 Unity 一开始其实支持各种语言作为脚本语言调用其 API: C#、Javascript 甚至 python。其中对 C#的支持使用了当时的一个运行时 mono(这也是为什么现在 unity 中的类都叫 monobehavior),这个运行时是跨平台的,因为当时还没有.net core,当时是.net framework 不能跨平台,当时跨平台还是指 pc 和主机之间,还没有后来的 Android、ios。但是即便是主机,我们也知道市面上主机很多,跨平台完全交给 mono,unity 发展肯定受限,所以 unity 也会自己魔改 mono。详细的就看我前面分享的文章。我们说到一开始 unity 支持各种语言,但是一段时间以后,大家发现市面上 c#写的游戏多、性能好、好玩(这个当然是巧合)。于是 unity 慢慢收缩支持的语言,也慢慢优化 c#的支持,才发展到现在这个样子。

编程范式

为什么当时 C#受欢迎了?其实答案和为什么现在 Javascript 开始流行了?为什么语言越来越像了?这些问题的答案一样。当然就是程序员觉得好用嘛(就是今年很多人爱提的 DX),我们就继续看看它有什么好用的特点。

1. OO

我们知道 JavaScript 也可以面向对象,但是不是真正的面向对象,我这说不是好用的面向对象,即便现在有了 class 语法糖,写法上看起来都很像了,我认为最重要的一点区别就是:私有属性和方法。
javascript 没有真正意义上的私有属性和方法,在 class 之外仍能取到 class 内部定义成 static 的属性或方法,这个 static 是假的!这点想想就不是很安全。
Node12 居然支持了,使用#表示私有成员变量

2. 函数式

3. 泛型

python 没有泛型,js 也没有泛型,我们可以和 ts 对比

线程模型

C#多线程

数据类型

语法

1. 风格

2. 作用域

3. 包管理

4. 操作符

其他

1. 协程

原理区别

2. 装饰器

EChartsNode CLI 工具开发和原理