精华内容
下载资源
问答
  • 编程语言的分类

    2021-07-03 16:24:48
    GO: Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Go的目标是希望提升现有编程语言...

    GO:    Go语言是谷歌2009发布的第二款开源编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Go的目标是希望提升现有编程语言对程序库等依赖性(dependency)的管理,这些软件元素会被应用程序反复调用。由于存在并行编程模式,因此这一语言也被设计用来解决多处理器的任务。该语言设计为一款系统编程语言,可以被用于网络服务器、存储系统和数据库中。 .go语言比较新,特点是多线程 处理的好,CPU 都是多核,多线程处理的好,就意味着效率高

    NET:    .NET就是微软用来实现XML,Web Services,SOA(面向服务的体系结构service-oriented architecture)和敏捷性的技术。   Objective-CSwift:    Objective-C 和 Swift 都只能用于苹果产品的开发,包括 Mac、MacBook、iPhone、iPad、iWatch 等。

    C/C++:    C++ 是在C语言的基础上发展起来的,C++ 包含了C语言的所有内容,C语言是C++的一个部分,它们往往混合在一起使用,所以统称为 C/C++。C/C++主要用于PC软件开发、Linux开发、游戏开发、单片机和嵌入式系统。

    Java:    Java 是一门通用型的语言,可以用于网站后台开发、Android 开发、PC软件开发,近年来又涉足了大数据领域(归功于 Hadoop 框架的流行)。目前像ERP,电商类,管理类的系统用Java多

    Python:    Python 也是一门通用型的语言,主要用于系统运维、网站后台开发、数据分析、人工智能、云计算等领域,近年来势头强劲,增长非常快。爬虫类,批处理,人工智能类用Python比较多,特点是简洁快速

    PHP:    PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用。可以生成Forms,ComboBoxes,Grid,Menus等的组件,并支持将数据转为XML/JSON格式。PHP一般是小团队在用,前后端不强制分离,特点是快

    RUST:    创建这个新语言的目的是为了解决一个很顽疾的问题:软件的演进速度大大低于硬件的演进,软件在语言级别上无法真正利用多核计算带来的性能提升。Rust是针对多核体系提出的语言,并且吸收一些其他动态语言的重要特性,比如不需要管理内存,比如不会出现Null指针等等,Rust是Mozilla开发的注重安全、性能和并发性的编程语言。

    JavaScript:    JavaScript 最初只能用于网站前端开发,而且是前端开发的唯一语言,没有可替代性。近年来由于 Node.js 的流行,JavaScript 在网站后台开发中也占有了一席之地,并且在迅速增长。

    汇编语言:    汇编语言是计算机发展初期的一门语言,它的执行效率非常高,但是开发效率非常低,所以在常见的应用程序开发中不会使用汇编语言,只有在对效率和实时性要求极高的关键模块才会考虑汇编语言,例如操作系统内核、驱动、仪器仪表、工业控制等。

    Scala:    Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言 、并集成面向对象编程和函数式编程的各种特性。    

    展开全文
  • 一文解决现代编程语言选择困难:命令式编程

    万次阅读 多人点赞 2021-04-07 16:22:41
    如何了解某种编程语言的优缺点?某种编程语言是否适用于我的项目?面对此类问题,如果求助于搜索引擎,输入“最佳编程语言”,结果会罗列一堆文章,涵盖 Python、Java、JavaScript、C#、C++、PHP 等,并且大多对各...

    本文转载自 InfoQ,作者:Ilya Suzdalnitski 翻译:盖磊

    如何了解某种编程语言的优缺点?某种编程语言是否适用于我的项目?面对此类问题,如果求助于搜索引擎,输入“最佳编程语言”,结果会罗列一堆文章,涵盖 Python、Java、JavaScript、C#、C++、PHP 等,并且大多对各语言的优缺点表述得模棱两可。我本人很不喜欢去读此类文章,因为其中许多部分内容的表述并不到位,缺少实战借鉴意义,而且行文生硬。因此我试撰本文来做一次深入总结,去伪存真。

    本文概述了当前广为使用乃至可能小众的现代编程语言,力图做到尽量客观、值得一读,并不带个人偏见。各语言按推荐程度从低到高依次列出。

    谨记,并不存在所谓完美的编程语言。有的语言非常适用于后端 /API 开发,而有的语言则非常适用于系统编程。

    文中按当今两大通用语言家族分类,即 C 衍生语言家族和元语言(Meta Language,ML)衍生语言家族。

    对于开发人员而言,编程语言只是工具箱中的工具,更重要的是如何选择合适的工具去完成工作。我衷心希望本文有助于读者选取适合自身项目的编程语言。做出正确的选择,可降低数月甚至数年的开发工作量。

    哪些编程语言特性值得关注?

    很多编程语言排行榜文章,主要对比的是语言使用广泛度、开发人员收入期望值等因素。在软件领域,虽然大规模的社区和生态系统的确有所裨益,但语言的使用情况并非好的排行指标。本文另辟蹊径,采用的评判依据主要考虑语言的强大之处和不足之处。

    为表示所列语言的推荐程度,文中使用“赞”(👍)、“否”(👎)和“尚可”(👌,即不赞也不否)三种 emoji。

    那么应该比较哪些特性?换句话说,除了语言使用广泛性,还有哪些特性更能代表语言的受欢迎程度?

    类型系统(Type System)

    类型系统倍受大量开发人员的青睐,这也是为什么 TypeScript 之类的语言日渐大行其道。在我看来,类型系统去除了大量的程序错误,更容易实现重构。但是否具有类型系统,只是本文考虑的部分评判因素。

    支持类型系统的编程语言,最好同时具备类型推断(type inference)。一个好的类型系统,不用明确地标出函数签名(function signature),也能支持对大部分类型的推断。不幸的是,大多数编程语言提供的仅是基本的类型推断功能。

    更进一步,支持代数数据类型(Algebraic Data Types,ADT)的类型系统评分更高。

    强大的类型系统,还应支持高级类类型(higher-kinded types)。高级类类型是对泛型(generics)的更高阶抽象,支持编程人员在更高的抽象层上编程。

    尽管大家对类型系统寄予厚望,但还有一些比静态类型(static typing)更重要的特性。因此在选择一门编程语言时,不能只看是否支持类型系统,

    学习难度

    即便编程语言是完美无瑕的,如果一位新手上船需要前期投入数月甚至是数年的精力,那么又会有多少人使用呢?另一方面,很多编程范式需要数年的时间才能逐渐完善。

    好的编程语言需对新手友好,掌握它们不应花费大量学习时间。

    空值

    我将 1965 年创建的空值引用(null reference)称为“亿万美元错误”。当时,我正设计首个完全类型系统,用于面向对象语言中的引用。目标是确保所有对引用的使用是绝对安全的,并由编译器自动执行检查。我无法克制添加空值引用的诱惑,完全因为空值引用非常易于实现。近四十年来,这一设计导致了不计其数的错误、漏洞和系统崩溃,可能造成了数十亿美元的痛心损失。

    — 空值引用的创立者 Tony Hoare

    为什么说空值引用是不好的?因为空值引用破坏了类型系统。一旦默认为空值,那么就不能依靠编译器检查代码的有效性。任何空值都是一枚随时可能引爆的炸弹。如果没能想到所使用的值的确为空值,那么会产生什么后果?会出现运行时错误。

    function capitalize(string) { return string.charAt(0).toUpperCase() + string.slice(1);}capitalize("john"); // -> "John"capitalize(null); // 未捕获类型错误:不能读取为空值的属性“charAt”。

    为确保所处理的值并非空值,开发人员必须对运行时做手工检查。即使是静态类型语言,空值引用也破坏了类型系统的很多优点。

    function capitalize(string) { if (string == null) throw "string is required";return string.charAt(0).toUpperCase() + string.slice(1);}

    运行时检查也称为“空值防护”(null guards),在现实中可归为一种不良的编程语言设计。一方面,引入样板代码破坏了编程风格。更糟的是,它并不能确保我们是否检查了空值。

    好的编程语言,应在编译时做类型检查,判断值的存在与否。

    因此,支持空值检查机制的编程语言应加分。

    错误处理

    捕获异常并不是一种好的错误处理方式。抛出异常本身没有问题,但仅适用于程序没有办法恢复而必须崩溃这类异常情况。异常和空值一样,会破坏类型系统。

    如果将异常作为错误处理的首选方式,那么就无法获知函数是返回了期望值,还是发生了故障。抛出异常的函数也无法实现复合(Compose)。

    function fetchAllComments(userId) { const user = fetchUser(userId); // 可能抛出异常。const posts = fetchPosts(user); // 可能抛出异常return posts // posts 可能为空值,这会再次导致异常。.map(post => post.comments) .flat();}

    无法获取部分数据而导致整个程序崩溃,这显然并非一种好的做法。尽管我们不希望发生这种情况,但它的确会发生。

    一种做法是手工检查是否生成异常,但是在编程过程中可能会忘记对异常做检查,因此这种做法是非常不可靠的,而且会在代码中添加大量额外处理。

    function fetchAllComments(userId) {  try {    const user = fetchUser(userId);
        const posts = fetchPosts(user);    
        return posts            .map(post => post.comments)            .flat();  } catch {    return [];  }
    

    目前已有更好的错误处理机制,支持在编译时对潜在错误做类型检查。因此,默认无需采用异常处理的编程语言也应加分。

    并发

    当前业界正处于摩尔定律的末端,即处理器不会再大规模提速。我们身处多核 CPU 时代,所有的现代应用必须能很好地利用多核技术。

    不幸的是,大多数当前在用的编程语言都是设计用于单核计算时代的,本质上并不能有效地支持多核处理。

    一种亡羊补牢的设计,是在后期提供支持并发的软件库。但这只是给语言打了补丁,并非从根本上就针对并发设计,不能称为良好的开发体验。一些现代语言内建了对并发的支持,例如 Go、Erlang 和 Elixir 等。

    不可变性

    我认为大型的面向对象程序,需要解决由于大规模可变对象间关联所导致的复杂图结构。否则在调用方法时,必须得把握并牢记该方法的功能和副作用。

    —— Rich Hickey,Clojure 创建者。

    当前的编程工作中,使用不可变值越来越常见。即便是 React 这样的现代 UI 软件库,也考虑使用不可变值。对支持不可变数值提供一等支持的编程语言,我们会给出更高的评判。这完全是因为不可变性避免了编程中出现许多软件缺陷。

    什么是不可变状态?简而言之,就是数据不会发生改变。例如,大多数编程语言中的字符串。字符串转为大写,并不会去改变原始的字符串,而是返回一个新的字符串。

    为确保任何事情都不发生改变,不可变性对上述理念做了进一步扩展。更改不可变数组,总是会返回一个新的数组,而非原始数组。更新用户名,将返回一个包含更新后用户名的新用户对象,并不改变原始对象。

    不可变状态不做任何共享,因此无需操心线程安全所导致的复杂性。不可变性使得代码更易于并行化。

    不对状态做任何更改的函数,称为“纯函数”(Pure)。纯函数更易于测试和推断。使用纯函数,无需操心函数体之外事情,可聚焦于函数本身。不用像面向对象编程中那样必须牢记整个对象图,这样极大地简化了编程开发。

    生态系统和工具链

    一种编程语言可能本身并没有多少亮点,但如果其具有大型的生态系统,这会令语言更具吸引力。具备良好的软件库,可以节省数月乃至数年的开发工作。

    显著的例子就是 JavaScript 和 Python。

    速度

    语言的编译速度如何?程序的启动速度如何?运行时的性能如何?所有这些都是影响评判中的考虑因素。

    诞生年代

    尽管并非绝对,通常新推出的语言要比原先的语言更好。只是因为新语言会吸取了前辈的经验教训。

     C++    

    图片

    下面从最糟糕、也可能是计算机科学中最大错误的 C++ 语言开始。当然,我并不认为 C++ 是一种很好的现代编程语言。但 C++ 当前依然得到广泛应用,在此必须提及。

    语言家族:C

    👎 语言特性

    图片

    C++ 可称为糟糕透顶的语言……如果项目局限于 C,意味着不会有任何机会被 C++ 愚蠢的“对象模型”搞砸。

    —— Linux 创立者 Linus Torvalds

    C++ 中填充了各种特性,力图无所不能,但在在其中任何一项上都不能说出色。C++ 支持 goto、指针、引用、面向对象编程、操作符重载,以及各种非生产特性。

    为什么说 C++ 不好?在我看来,最大问题在于 C++ 颇具年头了。C++ 是在 1979 年设计的。在当时设计者缺少经验,关注点发散,虽然所添加的特性在当时看来是似乎好的做法。C++ 得到了非常广泛的使用,这意味着为其中支持各种用例而添加了更多特性,导致特性成堆。

    👎 速度

    C++ 的编译时间出奇的慢,甚至比 Java 慢很多,尽管与 Scala 不相上下。

    但在运行时性能和启动时间上,C++ 程序表现非常优秀。

    👎 生态系统和工具

    图片

    上图的推文给出了很好的解释。C++ 编译器的错误信息对新手并不友好。通常并未指出导致错误的确切原因,需要开发人员花时间查找。

    👎👎 垃圾回收

    我曾希望在 C++0x 标准中至少考虑可选地支持垃圾回收,但这在技术上存在问题。

    —— C++ 的创建者 Bjarne Stroustrup

    垃圾回收从未添加到 C++ 中,而手工内存管理非常易于出错。开发人员必须操心如何手工释放和分配内存。我对使用非垃圾回收语言的经历记忆深刻,其中大量的缺陷在当前支持垃圾回收语言中可轻易避免。

    👎 面向对象编程的失败尝试

    我提出了“面向对象”一词,但并没有没有顾及 C++。

    —— 面向对象编程的创建者 Alan Kay

    面向对象编程是一项很好的技术,出现于上世纪六十年代后期,当时 C++ 刚出现。不幸的是,不同于 Smalltalk 等语言,C++ 在实现面向对象编程中出现了几个致命错误,导致好的理念变成噩梦。

    好的一方面是,不同于 Java,至少在 C++ 中面向对象是可选的。

    👎👎 学习难度

    图片

    C++ 是一种复杂的低层(low level)语言,不具备任何自动内存管理机制。由于特性纷杂,初学者必须花费大量时间学习。

    👎 并发

    C++ 设计用于单核计算时代,只支持简单的并发机制,这还是在近十年中添加的。

    👎 错误处理

    抛出并捕获错误是 C++ 的首选错误处理机制。

    👎 不可变性

    未内置对不可变数据结构的支持。

    👎 空值

    C++ 中所有引用均可为空值。

    评判

    图片

    C++ 的初衷是成为更好的 C 语言,但这一初衷并未实现。

    系统编程是 C++ 的最适合使用场景。但考虑到已具有 Rust 和 Go 等更好、更现代的替代语言,系统完全可以不用 C++ 实现。不管读者同意与否,我不认为 C++ 具有任何优点。

    是该终结 C++ 的时候了。

      Java    

    图片

    Java 是自 MS-DOS 以来计算机领域中最令人困扰的事情。

    —— 面向对象编程创始人 Alan Kay

    Java 出现在 1995 年,比 C++ 晚了 16 年。Java 是更简单的编程语言,由此得到广泛使用。

    语言家族:C。

    👍 垃圾回收

    相比 C++,Java 的最大优点是具有垃圾回收,这极大地消除了各类软件缺陷。

    👍 生态系统

    Java 已经存在很长时间,在后端开发领域形成了大型生态系统,极大地降低了开发负担。

    👎 面向对象语言

    本文不会深入探讨面向对象编程的不足。详细分析可阅读本文作者的另一篇文章,“面向对象编程:亿万美元灾难”。

    在此给出计算机科学中一些最为杰出人士的看法:

    抱歉,我多年前使用了“对象”一词。该词使得很多人聚焦于一个更狭义的理念,虽然更广义的理念是消息传递。

    —— 面向对象编程的创始人 Alan Kay

    Alan Kay 是对的,许多主流面向对象编程语言并未找准关注点。它们聚焦于类和对象,而忽视了消息传递。幸运的是,Erlang 和 Elixir 等一些现代编程语言找准了方向。

    受面向对象编程影响的编程语言,会导致计算机软件冗长、可读性不好、描述性差、难修改和维护。

    —— Richard Mansfield

    所有使用 Java、C# 等面向对象编程语言的开发人员,如果曾具有使用非面向对象编程语言的经验,对此应深有体会。

    👌 速度

    大家都知道,Java 运行在 JVM 之上,而 JVM 的启动速度是出名的慢。我曾看到有运行在 JVM 上的程序耗时 30 多秒才启动起来。对于现代云原生程序,这是不可接受的。

    一个大型项目,如果编译速度慢,就会对开发人员的生产效率产生显著影响。Java、Scala 等 JVM 语言存在同样的问题。

    但从好的一面说,JVM Runtime 的性能还算不错。

    👎 学习难度

    尽管 Java 是一种相当简单的语言,但 Java 以面向对象编程为主,这使得 Java 很难做到优秀。编写一个简单的 Java 程序可信手拈来,但是掌握如何编写可靠、可维护的面向对象代码,则需要十数年的 Java 功力。

    👎 并发

    Java 设计于单核计算时代,和 C++ 一样,仅支持基本的并发特性。

    👎 空值

    Java 中,所有引用均可为空值。

    👎 错误处理

    抛出并捕获错误是 Java 的首选错误处理机制。

    👎 不可变性

    未内置对不可变数据结构的支持。

    判定

    图片

    Java 在刚推出时,的确是一种很好的编程语言。但遗憾的是不同于 Scala 等语言,Java 始终专注于面向对象编程。Java 编程严重受模板代码的影响,冗余代码多。

    Java 应该退居二线了。

       C#      

    图片

    C# 和 Java 并没有本质上的差异。C# 的早期版本,就是微软的 Java 实现。

    C# 具有 Java 的大部分优点。C# 于 2000 年推出,比 Java 晚 5 年,借鉴了 Java 的经验教训。

    语言家族:C

    👌 语法

    C# 在语法上一直保持略微领先 Java。尽管是一种面向对象语言,但 C# 在解决模板代码问题上比 Java 有所改进。很高兴看到 C# 每个新版本都能改进语法。例如,添加了表达体函数成员(expression-bodied function members)、模式匹配、元组等特性。

    👎 面向对象语言

    和 Java 一样,C# 主要针对面向对象编程。面向对象编程的缺点如上所列,在此不再详述。下面列出一些知名人士的观点。

    我认为相比函数式语言,面向对象语言中缺失可重用性。问题在于,面向对象语言需要处理其所提供的所有隐含(implicit)环境。尽管我们想要的只是一根香蕉,但却得到了一只握着香蕉的大猩猩,甚至是整个丛林。

    —— Erlang 的创建者 Joe Armstrong

    我完全同意这个说法,相比函数式编程,命令式编程非常难以重用面向对象代码。

    面向对象编程提供了对正确做法的一个反面教材……

    —— 计算机科学先驱 Edsger W. Dijkstra

    从我自己使用面向对象和非面向对象编程的经验看,我完全同意面向对象代码更难以正确实现功能。

    👎 多范式(Multi-paradigm)

    C# 声称是一种多范式语言,尤其是声称支持函数式编程,但我并不同意。对函数提供一流支持(first-class functions),并不足以称之为函数式语言。

    那么什么语言可称为具备函数式特性?应至少内置支持不可变数据结构、模式识别、组合函数的管道操作符、代数数据类型(ADT)等特性。

    👎 并发

    和 Java 一样,C# 创立于单核计算时代,仅提供基本的并发支持。

    👎 空值

    NullsC# 中,所有引用均可为空。

    👎 错误处理

    抛出并捕获错误是 C# 的首选错误处理机制。

    👎 不可变性

    未内置对不可变数据结构的支持。

    评判

    尽管我本人的职业生涯中主要使用的是 C#,但还是对这种语言评价不高。与对 Java 的评判一样,我建议读者寻找更现代的替代语言。C# 在本质上依然是 Java,只是具有更现代的语法。不幸的是,C# 本身并不“sharp”。

    Python

    图片

    Python 早在 1991 年提出,和 JavaScript 并称当前使用最广的两种语言。

    语言家族:C

    👍 生态系统

    Python 软件库几乎无所不能。不同于 JavaScript,Python 不能用于 Web 前端开发,但大规模的数据科学软件库弥补了这方面的不足。

    👍 学习难度

    Python 语言非常简单,初学者数周就能上手。

    👎 类型系统

    Python 是动态类型的,因此谈不上需要类型系统。

    👎 速度

    Python 是一种解释性语言,性能慢。对性能有严格要求的程序,可使用 Cython 替代原生的 Python。

    相对于原生语言,Python 的启动也相当慢。

    👎 工具

    对比其他的现代编程语言,难免会对 Python 的依赖管理颇为失望。目前存在 pip、pipenv、virtualenv、pip freeze 等工具。相比之下,JavaScript 只需要 NPM 这一种工具。

    👎 并发

    Python 在创建时并未全面考虑并发,仅提供基本的并发特性。

    👎 空值

    Python 中所有引用均可为空。

    👎 错误处理

    抛出并捕获错误是 Python 的首选错误处理机制。

    👎 不可变性

    未内置对不可变数据结构的支持。

    评判

    图片

    很不幸,Python 并不提供对函数式编程的支持。函数式编程非常适合处理数据科学所面对的问题。即便是在 Python 擅长的 Web 爬虫领域,Elixir 等函数式语言表现更好。

    我并不推荐使用 Python 完成大型项目,该语言在构建中并未充分地考虑软件工程。

    如果有更好的选择,不推荐在数据科学之外使用 Python。在数据科学领域,Julia 可能是 Python 的很好替代,尽管相比 Python 而言,Julia 的生态系统近乎不存在。

       Rust   

    图片

    Rust 是一种现代低层语言,最初设计用于替代 C++。

    语言家族:C

    👍 速度

    运行快速是 Rust 设计所秉持的初衷。在编译性能上,Rust 程序要慢于 Go 程序,但运行时性能比 Go 稍快。

    👍 空值

    至此,本文推荐列表中终于出现支持现代空值的语言了。Rust 中没有 null 或 nil 值,开发人员使用 Option 模式。

    // 源代码: https://doc.rust-lang.org/rust-by-example/std/option.html// 返回值或者是 T 类型的 Some,或是 None。enum Option{ Some(T), None,}// 整数除法不会出错。fn checked_division(dividend: i32, divisor: i32) -> Option{ if divisor == 0 { // 错误表示为 None。None } else { // 结果使用 Some 封装。Some(dividend / divisor) }}// 该函数用于处理失败的除操作。fn try_division(dividend: i32, divisor: i32) { // 与其他枚举一样,Option 值可模式匹配。match checked_division(dividend, divisor) { None => println!("{} / {} failed!", dividend, divisor), Some(quotient) => { println!("{} / {} = {}", dividend, divisor, quotient) }, }

    👍 错误处理

    Rust 的错误处理引入了现代函数式方法,使用特定的 Result 类型,声明可能会产生失败的操作。Result 模式非常类似于 Option 模式,只是在 None 的情况下依然有值。

    // 结果或者是 T 类型的 OK 函数值,或是 E 类型的 Err 函数值。enum Result<T,E> { Ok(T), Err(E),}// 存在失败可能的函数。fn random() -> Result<i32, String> { let mut generator = rand::thread_rng(); let number = generator.gen_range(0, 1000); if number <= 500 { Ok(number) } else { Err(String::from(number.to_string() + " should be less than 500")) }}// 处理函数的结果。match random() { Ok(i) => i.to_string(), Err(e) => e,

    👎 内存管理

    在本文列出的现代编程语言中,Rust 是唯一不提供垃圾回收的。Rust 迫使开发人员去考虑如何实现底层的内存管理,这影响了开发人员的效率。

    👎 并发

    由于 Rust 中缺少垃圾回收,因此实现并发是相当困难的。开发人员必须考虑“装箱”(boxing)和“钉住”(Pinning)。这在具有垃圾回收机制的语言中,通常是自动完成的。

    👎 不可变性

    未内置对不可变数据结构的支持。

    👎 低层语言

    作为一种低层语言,开发人员的生产效率无法其他高层语言相比。同时,语言的学习难度明显增大。

    评判

    图片

    Rust 非常适合系统编程。尽管比 Go 更复杂,但 Rust 提供了强大的类型系统。Rust 提供了现代的空值替换和错误处理方法。

    为什么本文将 Rust 排在 TypeScript 和 JavaScript 之后?Rust 是一种设计用于系统编程的低层语言,并非后端和 Web API 开发的最适合选项。Rust 缺少垃圾回收机制,未内置对不可变数据结构的支持。

    TypeScript

    图片

    TypeScript 语言编译为 JavaScript,通过对 JavaScript 添加静态类型,意在成为一种“更好的 JavaScript”。类似于 JavaScript,TypeScript 同样用于前端和后端开发。

    TypeScript 由同是 C# 设计者的 Anders Hejlsberg 设计的,因此代码看上去非常类似 C#,可认为是一种用于浏览器的 C#。

    语言家族:C。

    👎 JavaScript 的超集

    TypeScript 将自己定位为 JavaScript 的超集,这有助于人们采用。毕竟大多数人对 JavaScript 耳熟能详。

    但作为 JavaScript 的超集,更多程度上是一种缺点。这意味着 TypeScript 继承了 JavaScript 的全部问题,局限于 JavaScript 所有的不良设计决策。

    例如,应该没有开发人员喜欢 this 关键词吧。但 TypeScript 依然刻意原封照搬。

    再有,其类型系统时常令人感到奇怪。

    [] == ![]; // -> 为真NaN === NaN; // -> 为假!

    换句话说,TypeScript 具有 JavaScript 的所有缺点。一种糟糕语言的超集并不会变身成为一种优秀的语言。

    👍 生态系统

    TypeScript 完全分享了 JavaScript 庞大的生态系统。这是其最大优点。特别是相比 Python 等语言,NPM 非常好用。

    缺点在于,并非所有的 JavaScript 软件库都可在 TypeScript 中使用,例如 Rambda/Immutable.js 等。

    👌 类型系统

    个人感觉,TypeScript 的类型系统毫无亮点。

    好的一面是甚至提供对 ADT 的支持。例如下面给出的差别联合(discriminated union)类型:​​​​​​​

    // 源代码来自 https://stackoverflow.com/questions/33915459/algebraic-data-types-in-typescriptinterface Square { kind: "square"; size: number;}interface Rectangle { kind: "rectangle"; width: number; height: number;}interface Circle { kind: "circle"; radius: number;}type Shape = Square | Rectangle | Circle;function area(s: Shape) { switch (s.kind) { case "square": return s.sizes.size; case "rectangle": return s.heights.width; case "circle": return Math.PI * s.radius ** 2;

    下面是使用 ReasonML 实现的同样代码:​​​​​​​

    type shape = | Square(int) | Rectangle(int, int) | Circle(int);let area = fun | Square(size) => sizesize | Rectangle(width, height) => widthheight | Circle(radius) => 2piradius;

    差别联合类型是在 TypeScript 2.0 中增添的,TypeScript 的语法尚未企及函数式语言的高度。例如,在 switch 中的字符串匹配易于出错,编译器无法在大小写错误时给出警告。

    TypeScript 仅提供基本的类型推断。此外在使用 TypeScript 时,any 关键字的出现频次难免过高。

    👌 空值

    TypeScript 2.0 添加了对不可为空(non-nullable)类型的支持,使用编译器选项 --strictNullChecks 启用。但使用不可为空类型并非编程默认,也并非 TypeScript 的惯用做法。

    👎 错误处理

    TypeScript 中,使用抛出和捕获异常处理错误。

    👎 新的 JavaScript 特性

    新酷特性首先在 JavaScript 中得到支持,然后才是 TypeScript。实验特性可使用 Babel 在 JavaScript 中得到支持,而在 TypeScript 中则无此功能。

    👎 不可变性

    TypeScript 对不可变数据结构的处理,要显著劣于 JavaScript。JavaScript 开发人员可使用支持不可变性处理的软件库,但 TypeScript 开发人员通常必须依赖原始数组或对象展开操作符(spread operator),即写入时复制(copy-on-write)。​​​​​​​

    const oldArray = [1, 2];const newArray = [...oldArray, 3];const oldPerson = { name: { first: "John", last: "Snow" }, age: 30};// 执行对象深拷贝(deep copy)非常繁琐。const newPerson = { ...oldPerson, name: { ...oldPerson.name, first: "Jon" }

    正如上面代码所示,原生扩展操作符并不支持深拷贝(deep copy),而手工扩展深度对象非常繁琐。大型数组和对象的拷贝的性能也非常不好。

    但 TypeScript 中,readonly 关键字非常好用,用于定义属性是不可变的。虽然如此,TypeScript 要对不可变数据结构提供很好支持,依然需要很多工作。

    JavaScript 提供了一些操作不可变数据的很好软件库,例如 Rambda/Immutable.js。但是,实现此类软件库对 TypeScript 的支持并非易事。

    👎 TypeScript 对比 React

    相比 Clojure 等从设计上考虑到不可变数据处理的语言,在 JavaScript 和 TypeScript 中不可变数据的处理相对更为困难。

    —— 原文引用自 React 官方文档

    继续说缺点。前端 Web 开发推荐使用 React。

    React 并未针对 TypeScript 设计。最初,React 是针对函数式语言设计的,本文稍后会详细介绍。二者在编程范式上存在冲突,TypeScript 是面向对象编程优先的,而 React 是函数优先的。

    React 中,函数参数 props 是不可变的;而 TypeScript 中,没有内置提供适用的不可变数据结构支持。

    在开发中,TypeScript 相比 JavaScript、React 的唯一优点是,无需操心 PropTypes。TypeScript 是否是 JavaScript 的超集?这取决于开发人员的认识。至少我认为是的。做为超集的最大优点,是可接入整个 JavaScript 生态系统。

    为什么 JavaScript 的超集语言备受关注?这与 Java、C# 广为采用是同样的原因,是因为背后有市场营销预算充足的大厂在提供支持。

    评判

    图片

    尽管 TypeScript 常被认为是“更好的 JavaScript”,但我依然评判其劣于 JavaScript。TypeScript 相比 JavaScript 的优点被夸大了,尤其是对于使用 React 做前端 Web 开发。

    TypeScript 保留了 JavaScript 的所有不足,实际上也继承了 JavaScript 中数十年积累不良设计决策,的确并非一种成功的交付,

    Go    

    图片

    Go 设计上主要考虑了提高多核处理器和大规模代码库的编程效率。Go 的设计者们当时任职于谷歌,因对 C++ 的共同不喜而得到灵感。

    语言家族:C。

    👍 并发

    并发是 Go 的杀手级特性。Go 从本质上就是为并发而构建。和 Erlang/Elixir 一样,Go 使用邮箱模型(Mailbox)实现并发。不幸的是,goroutines 并未提供 Erlang/Elixir 进程那样的统一容错特性。换句话说,goroutine 中的异常将导致整个程序宕机,而 Elixir 进程中的异常只会导致当前进程终止。

    👍 👍 速度编译

    速度是谷歌创建 Go 的一个重要考虑。有个笑话,谷歌利用 C++ 编译代码的时间就创建出了 Go。

    Go 是一种高效的语言。Go 程序的启动时间非常快。Go 编译为原生代码,所以运行时速度也非常快。

    👍 学习难度

    Go 是一种简单的语言,如果得到有经验前辈的指导,新手能在一个月内掌握。

    👍 错误处理

    Go 并不支持异常,由开发人员显式处理各种可能的错误。和 Rust 类似,Go 也返回两个值,一个是调用的结果,另一个是可能的错误值。如果一切运行正常,返回的错误值是 nil。

    👍 不支持面向对象编程

    虽然这么说有人会反对,但我个人认为,不支持面向对象特性是很大的优势。

    重申 Linux Torvalds 的观点:

    C++ 是一种很糟的(面向对象)语言……将项目局限于 C,意味着整个项目不会因为任何愚蠢的 C++“对象模型”而搞砸。

    —— Linux 创建者 Linus Torvalds

    Linus Torvalds 公开对 C++ 和面向对象编程持批评态度。限制编程人员在可选的范围内,是他完全正确的一面。事实上,编程人员的选择越少,代码也会更稳定。

    在我看来,Go 可以回避了许多面向对象特性,免于重蹈 C++ 的覆辙。

    👌 生态系统

    一些标准库的确很笨重。大部分并不符合 Go 返回带外(out-of-band,OOB)错误的自身哲学。例如,有的库对索引返回 -1 值,而非 (int, error)。还有一些库依赖全局状态,例如 flag 和 net/http。

    Go 的软件库缺少标准化。例如在错误时,有的库返回 (int, error),也有软件库返回 -1 等值。还有一些库依赖标识等全局状态。

    Go 的生态系统规模远比不上 JavaScript。

    👎 类型系统

    图片

    几乎所有的现代编程语言都具有某种形式的泛型,其中包括 C# 和 Java,甚至是 C++ 也提供模板类。泛型支持开发人员重用不同类型的函数实现。如果不支持泛型,那么开发人员就必须对整型、双精度和浮点型单独实现加法函数,这将导致大量的代码冗余。换句话说,Go 缺失对泛型的支持导致了大量冗余代码。正如有人指出的,“Go”是“去写一些模板代码”(Go write some boilerplate)的缩写。

    👎 空值

    不幸的是,即使更安全的空值替代方案已存在数十年,Go 依然在语言中添加了空值。

    👎 不可变性

    未内置对不可变数据结构的支持。

    评判

    图片

    Go 并非一种好的语言,但也谈不上不好,只是不够优秀。使用一种并不优秀的语言时需谨慎,因为这可能会导致我们在随后的二十年中陷入困境。

    Will Yager 的博客文章“Why Go Is No Good”

    如果你并非供职于谷歌,也没有面对类似谷歌的用例,那么 Go 可能并非好的选择。Go 是一种最适合系统编程的简单语言,但并非 API 开发的好选择。原因是因为我们有更多更好的替代语言,本文稍后介绍。

    我认为总体而言,尽管 G 的类型系统略弱,但比 Rust 还是略好。Go 是一种简单的语言,非常快,易于学习,并且具有出色的并发功能。当然,Go 成功地实现了做为“更好的 C++”这一设计目标。

    最佳系统语言奖授予 Go

    图片

    实至名归,Go 是系统编程的理想选择。Go 是一种低层语言,使用 Go 构建的大量成功项目,例如 Kubernetes,Docker 和 Terraform,证明其非常适合系统编程。

     

    JavaScript

    图片

    作为当前最流行的编程语言,JavaScript 无需过多介绍。

    当然,将 JavaScript 排在 Rust、TypeScript 和 Go 之前是正确的。下面给出原因。

    语言家族:C

    👍 👍 生态系统

    生态系统是 JavaScript 的最大优势。我们能想到的所有,,包括 Web 的前端和后端开发,CLI 编程、数据科学,甚至是机器学习,都可使用 JavaScript。JavaScript 可能具有提供任何功能的软件库。

    👍 学习难度

    JavaScript 和 Python 都是非常容易学习的编程语言。几周就能上手做项目。

    👎 类型系统

    和 Python 类似,JavaScript 是动态类型的。无需过多解释,但是其类型系统时常看起来很奇怪:

    [] == ![] // -> 为真NaN === NaN; // -> 为假[] == '' // -> 为真[] == 0 // -> 为真

    👌 不可变性

    在 TypeScript 一节中已经介绍,展开操作符(spread operator)会影响性能,甚至并没有在拷贝对象时执行深拷贝。尽管有 Ramda/Immutable.js 等软件库,但 JavaScript 缺少对不可变数据结构的内建支持。

    👎 JavaScript 并非针对响应式设计的

    在 JavaScript 中使用 React,必须借助 PropTypes。但这也意味着必须去维护 PropTypes,这会导致灾难性后果。

    此外,如果在编程中不加注意的话,可能会导致严重的性能问题。例如:

    <HugeList options=[] />

    这个看上去无害的代码会导致严重性能问题。因为在 JavaScript 中, [] != []。上面的代码会导致 HugeList 在每一次更新时重渲染,尽管 options 值并未发生变化。此类问题会不断叠加,直到用户界面最终无法响应。

    👎 关键字 this

    关键字 this 应该是 JavaScript 中的最大反特性。其行为持续表现不一致,在不同的情况下可能意味完全不同,其行为甚至取决于谁调用了指定的函数。使用 this 关键字通常会导致一些细微而奇怪的错误,难以调试。

    👌 并发

    JavaScript 使用事件循环支持单线程并发,无需考虑加锁等线程同步机制。尽管 JavaScript 在构建时并未考虑并发性,但与大多数其他语言相比,更易于实现并发代码。

    👍 新的 JavaScript 特性

    相比 TypeScript,新特性能更快地在 JavaScript 中支持。即便是实验性特性,也可使用 Bable 支持在 JavaScript 中使用。

    👎 错误处理

    Error handling抛出并捕获错误是 JavaScript 的首选错误处理机制。

    评判

    图片

    JavaScript 并非一种很好设计的语言。JavaScript 的最初版本仅用十天就拼凑出来,尽管在后期版本中修正了许多缺点。

    抛开上述缺点,JavaScript 依然是全栈 Web 开发和很好选择。如果加以适当的代码修炼和分析,JavaScript 是一种很好的语言。

    原文链接:

    These Modern Programming Languages Will Make You Suffer

    https://www.infoq.cn/article/9VXbENMFH9Y65VCOI4D1

    展开全文
  • 编程语言 软件和硬件——计算机要作为一个整体看待 语言的江湖 语言不是回事 多平台上的精彩 3.4 学编程拘于语言,学语言限于平台 学习程序设计,我们总是从一门语言学起。学什么语言,学了几门语言,这...

    返回到【全文目录

    目录

    3.4 学编程不拘于语言,学语言不限于平台

    编程语言

    软件和硬件——计算机要作为一个整体看待

    语言的江湖

    语言不是回事

    多平台上的精彩


    3.4 学编程不拘于语言,学语言不限于平台

    学习程序设计,我们总是从一门语言学起。学什么语言,学了几门语言,这常常成为初学者最关心和最在意的一个问题。稍一打开视野就会发现,程序设计语言之多,令人咋舌。将来要从事的工作中,到底要用哪一种语言?如果工作中用B语言,我现在学的是A语言,这岂不是白学了?可恶的学校,居然就是在教A语言!再进一步,这个平台,那个框架,究竟哪个属于我,或者说,我应该属于哪一个?

    学计算机,就要学语言。学哪个语言,如何去学,还真是个问题。

    编程语言

    按语言的一般分类,编程语言有机器语言、汇编语言和高级语言三类。

    机器语言直接用0、1表示的代码编程序。如同刚刚诞生的婴儿只有能力消化乳汁一般,那时个头挺大的家伙,也只能“吃”得下0、1直接写就的程序。只苦了那一代的计算机科学家,用手拨弄着开关,那是在输入程序,把打了孔的纸带上的输出转抄出来,由此读出了计算的结果。前人就是这样栽树的,我们在轻松输出“Hello World”的时候,不知是否能感觉到阴凉?

    后来有了汇编语言。指定让两个数加起来,不再是0110之类的一连串的二进制,指令写成了ADD,只是指令中要牵涉到寄存器、地址、端口,和具体的机器还是走得很近。但是汇编语言不得了,有了ADD之类的助记词,写程序的难度已经降低了很多。这种伴随年幼的计算机一起成长起来的语言,在今天仍然独占一方,要提到底层开发,需要超高的效率,必须想到它。

    后来有了高级语言,其他的不消说,要将两个数加起来,也终于能写成人类熟悉的a+b了。使人变得轻松的背后,编译程序(或解释程序)在默默地奉献着,帮助人检查着词法和语法错误,将人能读懂的程序翻译成机器能懂的二进制指令序列。同样奉献的还有连接程序,帮忙将七零八脑的二进制文件连接成一个整体,成为一个可以执行的文件。

    高级语言形成了一个热闹的大家庭。老大是Fortran,一帮子小兄弟COBOL、Algol带来了新风,BASIC乘着微型机的大船游遍天下,多能的Pascal结构严谨成了教学的首选,千年不遇的C语言精灵刚一出世就震惊天下,老牌的LISP把守着高端,自从Smalltalk找了对象,从C中长出了C++,Java挟着互联网之风呼啸而来,水果帮的Objective-C得了新宠,直译式的Python冷眼观瞧。这一大家子就这样热闹着,各自有自己的粉丝,相互之间的不服气、互相之间的看不惯成了一道风景,任凭TIOBE世界编程语言排行榜排来排去,粉丝们却也没有什么脾气。

    表3–2中列出了TIOBE在2013年4月公布的近25年来名列前茅的语言1。叹新“人”辈出的背后,看到的是顺应发展趋势而生的新语言的强大冲击力——1995年诞生的Java语言适应的是互联网中跨平台的需求,Objective-C火爆完全是因为苹果Mac OS X平台和iPhone平台移动开发的热度升高,2000年诞生的C#强势而来,代表了微软从Java中抢得互联网份额的决心。

    1 http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 

    表3–2 近25年来名列前茅的语言(2013年4月公布)

    语言

    2013年4月

    2008年4月

    1998年4月

    1988年4月

    C

    1

    2

    1

    1

    Java

    2

    1

    3

    C++

    3

    3

    2

    5

    Objective-C

    4

    42

    C#

    5

    8

    PHP

    6

    4

    (Visual)Basic

    7

    5

    4

    8

    Python

    8

    7

    28

    Perl

    9

    6

    6

    21

    Ruby

    10

    10

    LISP

    13

    16

    12

    2

    Ada

    21

    17

    14

    3

    注:划“—”的语言在排名时还没有正式面世。

    软件和硬件——计算机要作为一个整体看待

    程序设计语言是用来开发软件的。软件已经成为我们这个时代耳熟能详的一个词汇。我那三岁半的小外甥拿起我的智能手机,笑嘻嘻地使坏:“我要卸载你的软件。”

    软件是用来指挥计算机运行的各种程序的总和,再加上开发、使用和维护这些程序需要的各种技术资料。软件与语言密切相关,软件开发、软件维护,离不了计算机语言的支持。

    和软件相对应,硬件是在计算机系统中能够用眼睛看得见的那些设备,芯片、电路板、连接线,排列整齐,却让人感觉目眩。计算机硬件建立了计算机应用的物质基础,而软件则是提供了发挥硬件功能的方法和手段。软件能扩大计算机的应用范围,并能改善计算机的操作界面,方便用户使用。形象地,我们可以认为硬件就是计算机的“躯体”,而软件是计算机的“灵魂”。没有软件的硬件被称为“裸机”,犹如僵尸一般没有多少实用价值;没有硬件的软件,无从附着,好像就是幽灵。

    从计算机体系结构的角度,有一个硬件和软件等效定律:任何可以利用软件实现的事情可以利用硬件来实现,反之,任何可以利用硬件来实现的事情也可以利用软件来实现。不同的方案之间在性能、价格以及实现的难易程度上不同,因而实际的计算机产品常常是软硬件结合完成。

    我在买第一台486计算机的时候,专门多花了2000元,配了一块视频解压卡,解压多媒体数据,必须用“硬解压”的方法。那时候计算机的速度听起来已经够快的了,但要处理多媒体数据,用软件的方式根本无法正常播放视频。如今播音乐、放视频,没有见还需要增加什么设备,一个播放器软件解决问题。20多年前计算机要处理汉字,需要专门买一块“汉卡”插到计算机的扩展槽,而现在更多语言的处理工作也完全由软件完成。可以发现,软件的便宜、方便、灵活占尽了优势,也越来越受到重视。但也并不意味着硬件的市场就被剥去。新的结构、需求仍然不断地产生,有一些在品质上有特殊要求的设备,比如游戏玩家需要的高性能显卡,音乐发烧友需要高品质的声卡,工业控制中需要的专门功能模块等,仍然要靠着硬件支撑。除了通用计算机的外围设备,专用的新产品需要不断开发出来,这都大量需要能在硬件层面上工作的人才。

    软件和硬件之间,于是形成了一个明显的互动:软件实际能实现的功能受制于硬件,硬件性能的提高,可以为软件创造出更好的开发环境,并在此基础上可以开发出功能更强的软件。比如微型计算机的市场上,CPU的每一次升级,产生了微型机的新产品,操作系统软件的版本也随之提高,并产生出一系列新版的应用软件。反过来,软件的发展对硬件提出更高的要求,促使硬件性能的提高,甚至产生新的硬件。在软件和硬件共同的推动下,新产品不断推出,当然,用户需要不断地花钱购买新的软件和硬件,形成了经久不衰的IT行业和市场。

    将计算机分成软件、硬件两个部分是必要的,但不可以将两者独立开来去看。一说起搞软件的就是编程序、敲代码;而搞硬件的,就是设计电路图,或者就是电烙铁、螺丝刀上阵比划。实际上软件和硬件之间的联系密不可分,唯有合二为一才能看清计算机的本来面貌。在计算机的学习路线上,可以有所侧重软件或者硬件,但不可以走向学软件就不要硬件,学硬件就不要软件的极端。对于关注软件的,理解了硬件系统,会帮助你理解保证计算效率的程序设计技术,写出优质的软件。而对于偏重于学习硬件的,并不是成天就是和各种芯片、电路板打交道,合适的工作要让软件去做,更方便、更灵活、更廉价,何乐而不为?况且,开发底层驱动程序,在操作系统的层面上做工作,这需要软硬件都过关的技术人员。具备这样能力的人,也自然是行业中能够稳固立足的人。

    在大学阶段不可以过早地将自己归到了软件或者硬件的阵营。大学阶段的学习只是一个很基础的阶段,培养方案中的软、硬件技术都只是基本的知识,过早的“归口”,对大学阶段的学习非常有害,缩小了未来的发展空间,更使自己的知识结构限制在一个个的“知识孤岛”上。而有些软件工程专业的学生动辄就说“我是学Java的”,“我是学.NET的”,这更是一个更窄化的认识了。一个人的职业生涯会有几十年,要去穿越不同的时代,更需要对硬件和软件都熟悉的复合型人才。在大学中接受计算机类专业学习的同学,将计算机作为一个整体进行理解,不必要厚此薄彼地对待软件、硬件的问题。

    语言的江湖

    语言,是用于交流思想、传达信息的工具。人类社会的发展,产生了众多的自然语言,汉语、英语、德语、法语……语言是各民族优秀文化的代表。随着人类文明的发展和科学的进步,也诞生了数不清的人工语言。例如,阿拉伯数字是数学语言中的最基本最简单的部分;H2O代表着我们时刻都离不开的那种物质,分子式、反应方程式是化学的语言。依此展开,五线谱是音乐语言,图纸是工程语言,几乎所有的学科在发展过程中都提炼出了需要的一组符号,以及使用这些符号的语法规则,人们可以利用这些符号表述学科中特有的规律和规则。

    计算机语言是人与计算机之间通信的人工语言。为了让计算机能进行工作,采用一套数字、字符和语法规范,组成了各种指令(或语句),编写成程序由计算机去执行。有趣的是,旧时土匪、帮会、秘密组织使用的黑话也可以称为人工语言,在不少对计算机保持神秘的人士看来,计算机专业人员用来和计算机对话的语言,大致也与我们听不懂的江湖黑话一样不可捉摸呢。

    据统计,目前已有的计算机语言已经达到了一千多种。主流的语言在不断变化,新语言产生的浪潮还将继续下去。对于一名优秀的程序员,精通几门,熟悉十几门语言,实在不是一件稀罕的事。这也引发了一些初学者的恐慌:如此多的语言何时才能学完?岂不是要学死人了?这种担心大可不必,这么多人也都还在好好活着。

    有人在吐槽这个行业为何总要出现新的语言,成天变来变去,为什么就不能有一种语言一统天下?而事实上,人们曾经试图发明集所有语言之优点的语言,但这种努力已经停止。我们看到的,是随着新需求的提出和技术的发展,老英雄依然横刀立马,新俊杰精彩不断。“古老”的语言中,沙子已经被强力洗去,留下的金子在适应其产生背景的领域里依然熠熠生辉。“中年”的语言是中流砥柱,用他们的成熟支撑着整个的产业,成为目前广大初学者竞逐的目标。而世界是年轻人的,年轻的语言也在开拓新的疆域中不断崭露头角,引领着未来的世界,也接受着该有的考验。

    FORTRAN是第一门高级程序设计语言,广泛应用于科学和工程计算领域,其最大特性是接近数学公式的自然描述,这与计算机发展初期主要用于科学计算的背景相关。当今流行的MATLAB是商业数学软件,是用于算法开发、数据可视化、数据分析以及数值计算的高级计算语言和交互式环境。COBOL也是最早的高级程序设计语言之一,是世界上第一个面向商业的语言,代表了计算机由科学计算到事务管理的转变,直至现在还广泛用于数据处理领域。LISP是一种函数式编程语言,Prolog是一种逻辑编程语言,它们被广泛地应用在人工智能的研究中,可以用于专家系统建造、自然语言理解、智能知识库的建设等。Pascal是第一个结构化的编程语言,是一种计算机通用的高级程序设计语言,语法严谨,层次分明,程序易写,具有很强的可读性,产生于软件工程诞生初期。BASIC是设计给初学者使用的程序设计语言,随着微型计算机的兴起而普及,承载着比尔•盖茨“让每个人桌子上都有一台电脑”的梦想。C语言是世界上最流行、使用最广泛的高级程序设计语言之一,在操作系统等系统软件的开发,以及需要和硬件打交道的场合,C语言相对其他高级语言有明显优势。当面向对象程序设计技术兴起的时候,各门传统语言纷纷增加了面向对象的机制,由C有了C++,在需要性能保证的场合仍挑大梁,Pascal生出Delphi,曾经在数据库应用系统开发中风光无限,VB(Visual Basic)源于Basic,让应用开发的门槛降了下来。

    桌面计算的时代让位给了互联网。Java是互联网时代的英雄,拿手好戏是编写跨平台应用软件。通用、高效、可移植、安全等诸多特性,使Java迅速拥有了全球最大的开发者专业群体,足迹踩遍个人计算机、数据中心、游戏控制台、超级计算机、移动电话和互联网各大领域。蓝色巨人Microsoft向来行动缓慢但从来不吃素,踏入互联网领域佩带的屠龙刀是C#(读作C Sharp),继承了C和C++强大功能,综合了VB简单的可视化操作和C++的高运行效率,以强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。基于浏览器的web应用是一块巨大的蛋糕,立住脚跟的是JSP和PHP。JSP出身名门,由Sun公司倡导,是由许多公司参与一起建立的一种跨平台的动态网页技术标准。相对而言,PHP更像是草莽英雄,高举开源的大旗,和同样开源的操作系统Linux、web服务器Apache、数据库MySQL并肩组成LAMP组合,占领了web开发的大半江山。此界的后起之秀是Python和Ruby,志在通用语言,志在简化编程难度、提高人的效率,虽然年岁不大,但为计算机语言世界带来了新的思路,成了最受欢迎的新型程序设计语言。在互联网中,还有一大帮子的语言默默无闻地支撑着信息描述、信息表达和信息显现的重任,然而有时人们更愿意把它们只当作标准而非语言,它们中的代表是超文本标记语言HTML、可扩展标记语言XML、层叠样式表CSS,还显稚嫩的HTML5华丽而来,脚本语言中的杰出代表JavaScript借此更加风采动人。

    移动计算、云计算是业界新的热点。沉寂多年有Objective-C年岁已是不小,帮助苹果再次崛起,也让自己成了近年来风头最劲的语言,以坐着火箭的速度强势杀入了编程语言排行榜前三甲。生于谷歌的Go语言被寄予厚望,这个志在通吃服务器端和用户设备端的少侠还没有在江湖走动,重速度、重安全,想在多核处理器的并行处理上所作为,我们等着看这门新语言交出的答卷。

    天下大势,就在这些新、老语言的争相斗艳中变来变去。新生的语言,再不是全靠自身魅力立足,一个好爸爸为其划好地盘也是少不了的条件。正当大家追捧新星之际,闻听某老将却配备了新装备再次杀回。洗牌之后的局面一时难辨,却发现某爷爷级语言的地盘仍然稳如磐石。这就是语言的江湖。各种语言的粉丝奋起而互掐,各种语言的变迁及恩怨是业界老人的谈资,唬得小辈们只能是瞪着眼睛不住点头。

    于是,很多的初学者,弱弱地问出了一个不能回避的问题:我该学哪门语言?

    语言不是回事

    我该学哪门语言?这是一个没有办法直接给出答案的问题。

    没有一门语言能够一直实用下去,没有一门语言能够满足一个人整个职业生涯的需要。更严重的是,在实际工作中,甚至一个项目都可能会用到不止一门语言。

    所以,一个可以让人悲观事实是:学语言是一个没有完的事情。另一个让人能有些信心的事实是:IT技术人员,一人精通几门语言,熟悉十几门语言,这种情况并不罕见。这也是一个能让人兴奋和自豪的事。我们所处的行业的确是个常变常新的行业,终身学习,对IT人更现实,我们在引领着世界发展的潮流。熟悉多门语言其实算不得多大的挑战,语言无非是上阵时要用双节棍还是柳叶刀的问题,内功高深的人方为俊杰。IT人更需要坚决地打破旧有的学习观念,树立新的学习品格,而在此过程中获得的战斗力,将使我们有能力应对一切的变化。

    然而,这些事实,也的确给很多的初学者带来压力。事实上,计算机语言之间有差异,但共同的成分更多一些。基本的无非是三种控制结构、有限的几种语句、输入输出,再加上子程序(有些语言称为函数、过程)机制,支持一些数据结构,有些语言加入了面向对象的机制。仅此而已。学过了一门语言,再学第二门时,都能体会到这一特点。计算机语言的学习,某种程度上讲,一通百通。如果第一门语言需要投入100小时,第二门语言只需50小时,再往后学其他语言,所需要的投入将会快速下降。

    如果将学编程看作学开车,语言就是那车。学车时在驾校开捷达,学会了开自家的比亚迪,很自然的事。开车的方法会了,开车中需要的对速度和空间的感知有了,开什么车都一样。学会的一门语言没有市场了,是否会面临淘汰?我们要知道,“开了五年比亚迪,现在改开奥迪了,哥还是老司机!”

    既然第一门语言无所谓,最现实的一种选择是,你所在的学校给你开哪一门语言,你就将这种语言学好。纵观国内的高校,第一门程序设计语言一般选择C、C++或者Java,都有其道理,也有极少数引入国外部分高校的模式,从Python学起。

    学习第一门语言时,初学者往往会觉得有些困难。这个困难其实并不全是来自于语言,而是受限于编程序的概念正在建立,编程的方法、调试的手段也是从无到有,这中间需要的突破远远多于学语言本身。很多的教材名称叫做“×语言程序设计”,从中可以看到,学习的首先是程序设计,其次是用某一门语言作为表达方式的程序设计。作为初学者,是将所有问题混在一起看待,学编程起步中的所有问题,也就归到了语言的身上。

    在学好第一门语言的基础上,我建议同学们可以自学,或者通过选修课的方式学习第二门语言。这是体验程序设计语言“一通百通”的机会,除了掌握语言本身,对程序设计的体会也将加深。同时学习几门语言对老手来讲很正常,但正在学习第一门语言的同学,不建议同时学第二门语言。编程的基本过程、基本概念尚未建立,其间带来的迷惑,以及可能存在的概念冲突,都可能会妨碍学习的效果和感受,使学习热情和兴趣受到打压。

    建议在学好第一门语言的基础上再学习第二门语言,用第一门语言中习得的程序设计方法支持用第二门语言的程序设计。需要忌讳的学法是一门语言学个半截就又转而去学另一门语言。这种学法将使人永远处在只知道一点点的状态,久久不能得门而入,甚至最终打了退堂鼓。更糟糕的是,老师在教着A语言,听某人说B语言流行,放下A语言去独自攻打B语言,如此没有几天必去转学Q语言。最大的收获是,短短一年,能用多种语言输出hello world,用浮在表面的话题能吹牛唬唬外行而已。对于计算机语言,只要先将一门学精了,学会了解决问题的一般方法,就像学会了开车一样,上其他车稍加熟悉也就能上路了。

    大学四年的时光,光两门语言,也真是不够,需要逐步地拓展,再学到其他语言,体验用其他语言的编程,学会做出一些“项目”来。大学四年中,在学习语言上的节奏,我建议前两年,目标定为只会用两种语言即可,一门精通,另一门了解。第三门语言完全可以按“因为用到所以要学”的思路去选择。进入到了大三,编程方法有了基础,眼界也拓宽了,选择一个自己感兴趣的方向,学习这个方向上惯用的语言,以做出一个小项目当就业敲门砖为目标,借此树立自己的特色。对语言的兴趣可能会在学习过程中换一换,但是不要换得太勤。一个方向,仅靠一门语言可能不够,而是需要学习相关的一组语言,用着什么学什么,不必犹豫太多。对于一些简单的,但应该是常识性的语言的学习,如HTML等,可以在四年当中随时启动。有些语言,在培养方案中会安排老师授课,你的计划可以与培养方案接轨,也可以自主安排。

    在编程学习中常见的哀叹是:好好学了两年C++,最后做Java了,白学了,可惜了,我好杯具。对此要反问的是,如果真是这样,有哪一天Java的工作机会也不再有了,是否自己也跟着进到博物馆?还是前面所讲的道理,不管用什么语言,学的是编程。练出的功夫不只是体现在拳脚上,而是无论哪里发力,使什么样的兵器,丹田之气都能随之跟进。当需要换语言之时,用丰富的编程经历与体验迎接新语言的到来,无论何时需要新语言加入到你的知识体系中,坦然接受即可。这样的焦虑,只对学了一两门语言的初学者存在,对于已经窥到门径的人来说已经不是问题。初学者也倒是可以放心地投入进去,不要被这种阶段性的顾虑束住了手脚。

    初学编程,常常关注的是C++、Java这样的通用编程语言。实际上,在计算机类专业的培养方案中,还会有不少的语言不会单独设课,而是包含在某门课程中。例如计算机组成原理、微机原理等课程中要涉及指令系统、汇编语言。目前,即使进行电路设计这样的纯硬件工作,也通过高级语言实现,常用的是硬件描述语言VHDL。在数据库中离不开SQL语言,这是所有关系型数据库操纵的通用标准语言,在数据库原理课中学习。学习有关操作系统、计算机网络时,不可避免地要使用命令行,需要用脚本语言写一些批处理。语言不仅指编程时用的语言,还有在设计阶段用到的语言,比如面向对象分析与设计中使用的统一建模语言UML,并不是要用它编出程序来,却是在编出程序之前描述设计方案的。诸如程序流程图、数据流图之类的图形工具,也属于设计语言的范畴,是软件工程中离不开的工具。再拓展开来,理论计算机中用到的形式语言,包括用于表示程序设计语言这样的上下文相关语言,也包括用来描述自然语言这样的上下文无关语言,这些都是语言。学习了计算机,将语言的概念拓展开来,才能深深地体会到语言就是用于交流思想、传达信息的工具这一本质。

    回到程序设计语言上来。其实还有不少语言,是可以用来学着玩的。众所周知的Logo语言,用简单的指令,指使着一只小海龟行走,画出不同的图案来,这一直是幼儿学习程序设计的启蒙语言。我前几年科研中用过的NetLogo,广泛用于多智能体系统的仿真,其主要的阵地却在中小学教育中,方便地模拟各学科中涉及的自然、社会现象,用于辅助教学。RoboMind是一个简单的教育性质的编程环境,能让初学者对机器人编程。这些语言语法简单、资源丰富,有闲时可以搜索并下载来玩一玩,定给你带来意外的享受,丰富编程的体验。

    在大学阶段对语言的学习,注重对编程的理解。起步学的第一门语言,是为了学会编程;而确定专业方向后学习的一组语言,是为了能够在一段时期内从事实际工作所用。在进入工作阶段后,语言的学习不会停下,要根据工作的实际需求选择语言。有了大学中所学的专业基础和理论,这样的自学能力可以有,这也是大学的价值所在。对于一个计算机类专业的大学生而言,老师教过的语言课就是那么两三门,学生是否学会取决于他自己在学习中的投入和表现。大学中的专业核心课程,无论其表现形式是什么,都是围绕对计算机的理解而开设,能够落实和体现到编程能力上来,使学生能够理解语言的原理,学会设计,学会解决问题的方法。一名真正合格的毕业生,已然是具备了自学语言的基础,能够充分、从容地面对语言的变化。

    这么说来,语言是个事,但也真不用把语言太当回事。

    多平台上的精彩

    就在“写出程序”的层面,语言也仅仅是其中的一个方面。选定了语言,开发和运行都需要有平台的支持。这些与语言有关,事关编程的质量和效率,会给编程者带来不同的感受。

    程序是计算机执行的指令序列。早年用机器码写程序时,每台机器上运行的程序,编写方式都不一样,程序完全受运行程序的硬件平台的限制。有了高级语言,用高级语言写出程序的过程中,一般不用考虑运行在什么硬件平台、软件环境中。高级语言程序通过编译程序“翻译成”的机器代码,在各种操作系统(如Linux和Windows)上有差异,但这可以由各操作系统使用不同的编译程序来保证。对于同一种高级语言,比如C语言,在不同操作系统中使用的编译程序会不同,于是在不同操作系统下,生成的目标代码不同,适合各自的要求。不过,这样的差别在初学者刚学编程的角度看,可以暂时不必过分关注。主要是在产品开发时,尤其是开发跨平台的软件时,对这种问题才需要给予足够的重视。

    除了程序的运行平台,编程初学者更关心程序的开发平台。我们在编程时,常常使用集成开发环境(Integrated Development Environment,IDE),这是开发平台中初学者能够直接感知到的部分。IDE是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具,是集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套件。学习C和C++的同学用VC++6.0、C++Builder,学习Java的同学用Eclipse、NetBeans,设计网站时使用的HomeSite、DreamWeaver等,这些都是IDE。其实,支持C++的还有DEV C++、CodeBlocks、Qt,Eclipse加上插件也能支持C++。所以一种语言可以用多种IDE编程,一种IDE也可能支持多种语言。IDE可视化的操作界面、漂亮的语法着色、所见即所得的设计过程、语法错误的随时反馈、单步执行等调试工具,这给编程者带来了好的感受,很多IDE还提供了协作开发等功能,极大地提高了生产效率,甚至自动处理各种运行平台的差异。各种IDE也有自己的粉丝,照样诸多互相看不惯:Qt的小资,CodeBlocks的洋气,让用老旧VC++6.0的不敢多说话。

    实际上,很多初学者不知道,任何语言的程序都可以只用记事本之类的简单编辑器就可以进行编辑,用命令行,可以完成程序的编译、连接和运行。至今,还有不少高手在安心地利用vi一类的老式行编辑器工作,而对界面友好的新式IDE中繁杂的菜单选项频频吐槽。事实上,新加入到行业中的新人,实在用不着玩酷回到那个年代的方式中去了,用好方便的IDE即可。

    初学者最关心开发平台选择的问题。学C语言的说,老师要我们用VC,但有人说该用CodeBlocks;学Java的说,配置Eclipse很麻烦,某高手就是记事本加命令行。那究竟应该怎么办?

    前面我们谈过“语言不是回事”。初学程序,不限于用哪一种语言。涉及开发平台,也自然没有那么多的约束,哪个方便用哪个即可。进一步的建议是,在学习一门语言的过程中,可以体验不同的开发环境,让自己会用多种开发平台,具备适应不同开发环境的能力。学会灵活使用开发平台,最后做到驾驭自如,不要让不同IDE中菜单和快捷键上的差异,成为束缚编程思维和编程过程提高的障碍。做这件事,其实并不难,只要去尝试,就会有结果。从中得到的,就是那种很宝贵的“感觉”。

    会开比亚迪,就能开奥迪;走过了国道,咱也能上高速。此所谓“学编程不拘于语言,学语言不限于平台。

    返回到【全文目录】【下一节

     

    展开全文
  • 我适合学什么编程语言呢? 大家好,我是鱼皮,今天聊聊编程语言的选择问题,通过对 10+ 主流编程语言的特点、优劣、应用场景、发展前景等简单分析,希望帮还在迷茫的小伙伴们选择最适合自己的语言去学习。 编程语言...

    我适合学什么编程语言呢?

    大家好,我是鱼皮,今天聊聊编程语言的选择问题,通过对 10+ 主流编程语言的特点、优劣、应用场景、发展前景等简单分析,希望帮还在迷茫的小伙伴们选择最适合自己的语言去学习。

    编程语言选择

    本文大纲:

    编程语言选择 - 鱼皮

    前言

    先来看张最新的 TIOBE 编程语言排行榜,C 第一、Python 第二、Java 第三:

    2021-08 TIOBE 编程语言排行

    那可能就会有一些 “追求极致” 的同学说了,我要学编程,就学最牛逼的 C 语言!

    千万别!排行榜的统计方式、人群多种多样,并不代表一切,不要盲目跟风。

    我们做事一定要有目的,先想清楚自己学编程是为了什么?

    单纯出于好奇、感兴趣?为了搞钱?想多门手艺、提高工作效率?想开拓视野?想创业做自己的产品?还是只是碰巧选了计算机专业呢?

    有不少转专业、其他行业的在职同学都想学编程,但切记:没有目标是绝对学不下去的!

    下面介绍下主流编程语言,大家可以跟据自己的目标进行选择。

    语言介绍

    此前做过一个投票,大多数朋友学编程还是为了找工作,那我们就先说说如今最适合找工作、企业需求量最大的两个方向:Java 和前端。

    Java

    Java 本身是一门相对高级的语言,成熟稳定,写出来的程序可以跑在不同的操作系统上。

    但真正促使 Java 被推向神坛、内卷之王、培训机构赚钱宝典的呢,还是他丰富的应用场景和生态。后端、桌面程序、安卓 APP、大数据等等,但凡你能想到的东西,Java 都有现成的开发工具和方便的类库框架,就是让你写更少的代码、更快地完成开发。

    而且只要是你学 Java 时人类可能会遇到的问题,在网上都能搜到答案。

    这些正好符合企业的需求:老板给钱,就是希望你能够快速完成工作,而且最好不出意外事故。

    再加上前几年我国移动互联网的发展,安卓 APP 大肆开道那会儿,Java 作为安卓的主要开发语言,被大推了一波。

    前端

    前端,简单来说就是写网站界面(大多数情况下),它其实包含了三种语言:HTML、CSS 还有最重要的 JavaScript。

    Web 前端入门相对简单,优点是写出代码能立刻看到效果,适合培养兴趣。

    那为啥说它适合找工作呢,毕竟大部分公司做产品就是要给用户使用的,所以界面是必须的,因此需求量大。

    此外,现在前端的应用越来越广泛了,像大前端,你可以用同一套代码开发出网页、桌面程序、安卓、IOS APP、小程序等,大大节省了开发成本。

    大前端

    提到小程序,这玩意的数量已经超过了 APP!它有很多优点,免安装、方便、易分享、基于微信用户量大等,再加上开发成本很低,所以是很适合创业的一个产品形态。

    也是因为小程序、大前端的发展吧,让 Android 和 IOS 移动端、甚至还有客户端的开发前景逐渐变差。就现在来看呢,IOS、Android 开发供过于求,往以后看呢,完全看不到 APP 他的增量在哪里?毕竟除了一些主流的 APP 外,主动安装 APP 的人真是越来越少了。没有市场,新人怎么入行,怎么生存?

    所以想开发界面同学,网页也好、小程序和 APP 也罢,都建议先从前端学起,像布局、组件化、模块化,很多方法和思想是类似的。

    C 语言

    再说说大多数计算机专业同学接触的第一门语言 —— C 语言。

    有句话说的好,任何比 C 语言高级的语言都能用 C 语言来代替,任何比 C 语言低级的语言都不足以完整抽象一个计算机系统,这足以证明它的地位。

    为啥它那么牛逼呢?

    且不说他的语法灵活,最关键的是他足够底层,底层到所有的操作系统(Windows、Linux)都是用它实现的。所以学习 C 的过程中能让我们接触到更多底层的概念(比如自己分配和维护内存),有助于我们日后写出性能更高的程序。也是因为这点,C 语言很适于操作系统、底层软件、各种嵌入式系统和软硬件开发。

    C++

    C++ 在 C 语言的基础上增加了一些能力和思想,比如经典的面向对象编程,让开发者有更好的开发体验,能够提高代码的重用和开发效率。

    它本身就是 C 语言的超集,因此性能也很高。

    综合这两点呢,C++ 的应用场景也是非常之广,常用于后台开发、桌面程序、语言、框架开发(Java 都是C++开发的)、图像处理、音视频处理等计算任务、3D 引擎等。

    C# .NET

    提到引擎,就必须要说下 C# 和 .NET,千万别读成 “C 井” 和 “点 NET” 啊!

    .NET 是一个框架和环境,而 C# 是运行在其上的编程语言之一,此外还有 VB .NET 等。

    虽然最近几年 C# 在国内流行度一般,但仍是 Unity(游戏、VR、AR 开发平台)主要使用的编程语言,所以还是有用武之地的。

    下面再聊几个有争议的语言。

    Python

    首先是 Python,入门简单、生态好、很多现成的代码类库能直接用,因此在工作中适合编写小的脚本和工具,像文件表格处理,能提高办公效率。

    它也是啥都能做,还是爬虫、数据分析、数据挖掘、人工智能的一流语言。铺天盖地的 Python 广告、小学生都开始学 Python 了,这些都反映了 Python 的重要性和易学性,真的是每个人都可以学 Python。

    但是呢,它并不是企业开发的推荐语言,想找开发工作,就不要去重点研究 Python 了,把它当成工具或者入门培养兴趣的语言就好。因为同等开发效率下,Python 作为一门解释执行的动态语言,运行效率实在是太低了,甚至可以比 C++ 慢 100 倍!

    PHP

    曾经热火朝天的 PHP,他有一个美称 “世界上最好的编程语言”。

    但是如今 PHP 却逐渐走向衰落,不再受到大公司的青睐。

    为啥?

    以前 PC 网站时代,拿 PHP 做个网站,弱类型很灵活,开发起来贼快贼方便,用 Java 写 5 天的程序,用 PHP 1 天就能搞定。

    但如今,互联网的产品形态逐渐倾斜于移动端,而非传统网站,PHP 虽然能也做服务端开发,但它的性能太低了!而且随着 Java 和其他后台语言的发展,它们的开发效率也上来了,都能花同样的时间完成开发,谁还会选择性能更低的 PHP 呢?

    Go

    近几年 Go 语言在国内发展迅猛。

    他语法简单,且天然支持高并发、性能贼高,因此很适合开发现在主流的云原生应用。像大名鼎鼎的 Docker 容器、还有 B 站都是拿 Go 语言写的。

    再加上国内 Go 语言的生态也越来越好,类库和轮子多了、最佳实践也多了,使得开发成本大大降低。同等时间开发个性能更高的应用,它不香么?

    像字节跳动和腾讯等互联网大公司早就拥抱了 Go 语言,可以想象未来两三年, Go 的未来将是一片光明。

    SQL

    SQL 是数据库查询语言,可以从数据库中查询数据、操作数据。想从事后台开发、数据库管理相关工作的同学必须把它学好。

    除了程序员,现在很多产品经理都要学 SQL 了,别看程序员卷,那产品经理更是神仙打架。

    此外,还有一些程序员常用的语言。像 Linux Shell 脚本编程语言,和 Python 类似,当成工具学就好了。还有 Kotlin、Scala、Rust 等较新的编程语言,都有自己的应用场景,大家可以自行了解、按需学习。

    总结

    综上,目的、时间、前景、学习成本都是我们选择编程语言的重要因素。

    如果想快速就业,可以直接学前端或后端。更倾向于所写即所得、尽快看到效果,就选前端;更想锻炼思维逻辑能力,就首选后端 Java 或 Go 语言。

    还在学校,时间充足,想打好基础,就老老实实从 C 语言开始学起。

    如果对编程只是出于兴趣,或者想做些小工具,就学 Python 或者前端吧~


    最后,希望大家记住,第一门编程语言并不等于你找工作的语言。时间允许就大胆尝试,想学就学,先培养兴趣,等到后面再深入学习一门语言,学会一门再学其他的也会很轻松了。

    也根本不存在什么最好的编程语言,没有银弹可以通杀,不同的个体、项目、团队都应该有自己的选择,解决问题、应用落地才真正提现了编程语言的价值,适合自己的才是最好的。

    我是鱼皮,最后再送大家一些 帮助我拿到大厂 offer 的学习资料

    跑了,留下 6T 的资源!

    欢迎阅读 我从 0 自学进入腾讯的编程学习、实习、求职、考证、写书经历,少走弯路不迷茫!

    我学计算机的四年,共勉!

    以上就是本期分享,有帮助的话点个赞吧 ❤️

    展开全文
  • 2017年编程语言排名

    万次阅读 2018-01-17 10:02:48
    https://spectrum.ieee.org发布了2017年编程语言排名,这个榜单是对数十种流行的编程语言进行排名。请参考: https://spectrum.ieee.org/static/interactive-the-top-programming-languages-2017 可以对排名规则...
  • 关注编程语言

    2016-10-27 09:10:22
    2009年11月10日,谷歌发布了一种全新的编程语言——GO。Go将主要定位于系统程序开发,支持泛型编程,内存管理,数组安全,并且编译快速,可以被用于网络服务器、存储系统和数据库及其它领域。使用它开发速度可超过...
  • C#.NET编程语言详解

    2017-10-25 18:32:54
    c#.net是微软创建的一种开发语言,其主要对手就是java,所以语法结构跟java很像。c#.net和java一样都是面向对象的开发语言,其常用的开发工具是VS,现在我们来学习利用VS来进行C#.net的编程
  • 主流编程语言优劣考

    2009-10-11 12:09:00
    主流编程语言优劣考前言 本文的目的并非是想挑起语言之争,而是希望通过客观地分析每一种主流语言的能力,辨明其长短,让程序员能够扬长避短,有效地使用各种语言。让各种语言能够各安其位,为你更好的服务。程序员...
  • 程序员常用的计算机编程语言介绍

    千次阅读 2019-03-25 21:37:36
            ...以下是对八种主流编程语言或脚本的对比,希望对大家了解编程语言有帮助。 C语言     【概述】     ...
  • 如何快速学习并掌握一门编程语言

    千次阅读 2019-06-23 17:02:57
    工欲善其事必先利其器,编程语言就是程序员手中的“器”,用来实现软件编程的工具。学习和掌握编程语言的能力是基本功,也是技术进阶的先决条件。 计算机现代编程语言基本从上世纪50年代就开始成型,起初的目的就是...
  • 那么哪种编程语言的需求最经久不衰?我们统计了一些在2014年仍能保持竞争力的编程语言,下面按照排名一一道来。10.?ASP.NETASP.NET是服务器端的Web应用程序框架语言,目的是为Web开发制作设计动态网页。它是由微软...
  • 第一阶段 ...注意事项:编程语言和编程工具是两回事情,编程语言是指C++、Basic、Object Pascal等。程序设计语言,它们是像汉语、英语一样的抽象的语法规则,编程工具是指Visual C++ 6.0、Visua
  • 世界主流编程语言有哪些优势呢 Java C C++ Python Visual Basic NET MATLAB 让我们先来看看近期编程语言排行吧 从图表上明显看出java在近几年跃居第一位,c语言并无增长优势,而近几年虽然python人工智能传的很...
  • 24种编程语言的Hello World程序

    千次阅读 2015-12-08 21:44:36
    这篇文章主要介绍了 24 种编程语言的 Hello World 程序,包括熟知的 Java、C 语言、C++、C#、Ruby、Python、PHP 等编程语言,需要的朋友可以参考下。 Hello World,几乎是程序猿学习各种语言的第一个程序。心血来潮...
  • java作为目前的主流编程语言,它的特点主要是简单性,分布性,跨平台性,安全性,多线程,面向对象等。 1.简单性:java源代码的书写受限于特定的环境,可以用记事本,文本编辑器等软件来实现,然后编译源文件,...
  • 文末有福利,一定要看到文末前阵子,我看到国外开发者平台 HackerRank 发布了一份开发者技能报告,其中有一项关于《2019年你最想学的编程语言是哪个》的调查结果如下...
  • 前阵子, 看到国外开发者平台 HackerRank 发布了一份开发者技能报告,其中有一项关于《2019年你最想学的编程语言是哪个》的调查结果如下: 海风教育在线辅导0元一对一试听课等你来领取,领取课程方法: 1、私信留下...
  • 教育编程语言(转)

    2011-09-25 09:28:29
    主要是介绍了一些适合于教育的编程语言,分别适合于不同的个人需求。   详细内容如下:   许多教育性质的程序设计语言都提供建议的学习顺序,即是学习一组编程语言的顺序,每种语言都建立在其他语言的基础上,...
  • 常用编程语言简介

    千次阅读 2019-03-26 20:00:39
    C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 年,布莱恩·柯林汉(Brian Kernighan)和...
  • 1.Java语言是简单的 Java语言的语法与C语言和C++语言很接近,使得大多数...Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 2.Java语言是面向对象的
  • 常用编程语言的特点以及应用 编程语言有很多种,以下就是对一些常用的编程语言的简单介绍和特点以及他们的一些应用领域。希望对你能有所帮助。 在介绍各种编程语言前,我们先来看一下下面这个图,从图中可以明显看...
  • 为什么我说Rust是靠谱的编程语言

    万次阅读 多人点赞 2015-05-16 02:59:21
    序言:本文试图帮您解答“我要不要(投入大量时间和精力)学习Rust语言?”这个问题。作者尽量较少的谈及Rust语言本身,反而尝试从Rust语言周边入手,长时间、大范围、多角度地考察,研判Rust语言是否靠谱,并给出尽...
  • .net与各种编程语言

    千次阅读 热门讨论 2013-01-15 09:33:30
    它不是什么编程方法,更不是什么编程语言之类的。  通常我们所说的.NET Framework(.net框架)主要包括:.net类库和CLR。  .net类库为我们提供了丰富的类,当然这些都是已经封装好的,我们可以直接使用...
  • 1..NET 编程语言C#

    千次阅读 2017-11-29 17:50:41
    .net统一了编程类库,提供了对下一代网络通信标准,可扩展标记语言的完全支持,使应用程序的开发变得更容易、更简单; 简而言之,.net是一种面向网络、支持各种用户终端的开发平台环境。* 2.简要说明.net的战略...
  • 在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java...让我们一起来了解编程语言中,Java语言的特殊地位。  1、J
  • Atitit prgrmlan 编程语言主题列表 \0 it impttech topic\prgrmlan topic编程语言专题\AOP拦截器 表达式写法.docx \0 it impttech topic\prgrmlan topic编程语言专题\Atitit attilax编程艺术 艾龙著.docx \0 ...
  • 半字节编程语言 [nibblelang.io]()| [doc]( )| [changelog]( ) 介绍 Nibble是一种静态类型的编译型编程语言,旨在从,和获得所有好处。 半字节设计已受到C ++,Java,Kotlin,Haskell,Rust和Python的影响。 ...
  • 它由美国贝尔研究所的D.M.Ritchie于1972年推出,1978年后,C语言已先后被移植到大、中、小及微型机上,它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写依赖计算机硬件的应用程序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,629
精华内容 21,451
关键字:

net编程语言不包括