有几种类型的编程语言?[关闭]


30

基本上,我想学习很多编程语言以成为一名优秀的程序员。我知道只有极少数的深度和我希望有人能详细阐述了多少类型的编程语言有。就像您必须分组学习时,如何将它们组合在一起。

来自Java背景,我熟悉静态类型,但是我知道,除了动态类型之外,可用语言还必须有如此多的种类,如果可能的话,我希望可以对其进行分类。


2
说“哪个类型..”而不是多少个更好?
阿米尔·雷扎伊

好吧,我了解到Prolog和C之类的东西在根本上是不同的,所以我以为它们各自对应于不同种类的编程语言,并且我希望能掌握其中的几种。
sova,2010年

7
2:做您想要的类型和不做的类型
Matt Ellen

1
学习不同类型的编程语言绝对 是建设性的!您可能会争辩说,应该将此作为重复项而关闭,但我认为它们是足够不同的问题,可以分开。
彼得·布顿

1
@Sova,我建议您首先选择新语言,以尝试一些不使用基于c的语法的东西。这将使您更加专注于它的工作方式以及与您最了解的人的不同之处。
艾里克·雷彭

Answers:


73

这取决于您要如何对语言进行分类。从根本上说,语言可细分为两种类型:必须在您指示计算机语言如何做一个任务,并声明中,你告诉计算机语言是什么做的。声明性语言可以进一步分解为功能性语言,在该功能性语言中,通过组合函数和逻辑来构建程序编程语言,其中通过一组逻辑连接构建程序。命令式语言更像是解决问题的步骤列表,有点像食谱。命令性语言包括C,C ++和Java。功能语言包括Haskell;逻辑编程语言包括Prolog。

命令式语言有时分为两个子类:诸如C之类的过程语言和面向对象的语言。但是,由于存在面向对象的功能语言(OCaml和Scala是示例),因此面向对象的语言与分组有点正交。

您还可以通过输入以下语言对语言进行分组:静态动态。静态类型的语言是在运行程序之前(通常在编译阶段)检查(通常是强制执行)类型的语言;动态类型语言会将类型检查推迟到运行时。C,C ++和Java是静态类型的语言。Python,Ruby,JavaScript和Objective-C是动态类型的语言。也有未键入的语言,其中包括Forth编程语言。

您还可以按照语言的类型划分语言:类型(支持隐式类型转换)和类型(禁止隐式类型转换)。两者之间的界线有点模糊:根据某些定义,C是一种弱类型的语言,而其他人则认为它是强类型的。无论如何,纪律并不是对语言进行分组的真正有用的方法。


1
将会提出类似的内容,但是将+1并添加评论。每个类别或组合还具有通过关注特定元素而产生的众多衍生产品。例如,OOP会生成:基于原型的OOP,面向方面的编程,基于组件的编程等。功能范式也有衍生产品,例如语言,其中异步进程或线程是基本单元,您可以通过将并行进程组合在一起来进行编程。
CodexArcanum 2010年

脚本语言(例如VBScript)如何适合于此?它可能有点程序性,又有点OO,因为它可以创建各种类型,那么这会使其成为一种混合吗?
JB King 2010年

这正是我想要的。非常感谢你。
sova,2010年

3
@JB King OOP语言通常是程序性的,至少在方法主体之内。同样,人们普遍认为OOP意味着“对象”。许多语言都有数据类型和对象。关于OOP的确切定义有很多争论,但是它通常包含继承和/或封装(私有状态)作为主要主题。没有任何一种形式的语言将很难归类为OOP语言。
CodexArcanum 2010年

2
@sova我只能想到两种类似的语言。Erlang很大程度上基于并行处理,但是如果您想要更像我刚才所说的那样,则应该研究Polyphonic C#。这是一种基于Pi-Calculus的研究语言(现已折叠为C-omega)(例如FP如何基于lambda calc)Pi-calc基于流程单元,您可以声明流程以及同步和异步的组合呼吁他们。还要研究FP中的Arrows,尤其是Haskell。箭头非常像那样。
CodexArcanum 2010年

12
  • 部件
  • 程序
    • 基本的
    • C
  • 面向对象
    • C#
    • 爪哇
  • 陈述式
    • 序言
    • 的SQL
  • 功能性
    • Lisp
    • 哈斯克尔

这些是主要的,但是还有许多其他范例,它们之间有很多重叠之处。


声明式(例如Prolog,SQL)如何?
Bruce Alderman 2010年

@Bruce,现在得到他们。

是的,这是我在学习过程中某个地方学到的一般想法。
sevenseacat

6
不应该将汇编视为程序性的吗?
MattDavey 2012年

2
串联(基于堆栈)编程语言(例如Forth和Factor)怎么样?您可以将其视为一种函数式编程,但是它可能与众不同,值得一提。en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux 2014年



6
  • 程序:汇编,Java,C#,F#,Lisp,Fortran。

  • 基于集合:SQL。

  • 基于模式:Perl,Regex,Snobol。

  • 基于树:XSLT。

  • 基于数组:APL。


2
+1用于使用其他类型的分类,也用于识别“过程”实际上包含其他大多数人的分类。(当然,这仅表示该词含义不大,而肉就属于此类细分)
Javier 2010年

4

有不同的答案方法,但可以将它们归类为:

机器语言:机器语言是一种低级编程语言。它很容易被计算机理解,但很难被人们阅读。这就是为什么人们使用高级编程语言的原因。用高级语言编写的程序也可以编译和/或解释为机器语言,以便计算机可以执行它们。

汇编语言:汇编语言是机器语言的表示。换句话说,每个汇编语言指令都转换为机器语言指令。尽管汇编语言语句是可读的,但是这些语句仍然是低级的。汇编语言的一个缺点是它不可移植,因为每个平台都带有特定的汇编语言。

高级语言:高级语言是当今大多数程序员使用的语言。诸如C,C ++和Java之类的语言都是高级语言。高级语言的优点是它们非常易读和可移植。高级语言的一个缺点是它们不如汇编语言强大。因为高级语言中的单个语句被翻译成许多机器语言语句。

高级语言可以进一步分类为:

  1. 功能语言:在功能语言中,程序分为功能定义。功能语言是一种声明性语言。它们主要基于带有常量的类型化lambda微积分。一些著名的函数语言是Scala,F#,Clojure和Lisp。

  2. 程序语言:在程序语言中,程序是按照一系列步骤编写的,应遵循这些步骤来产生结果。COBOL,FORTRAN和C是一些过程语言。

  3. 面向对象的编程语言:在OOP语言中,程序分为包含数据的对象和对数据进行操作的方法。Java,C#和C ++是OOP语言。

  4. 逻辑编程语言:逻辑语言用于创建使计算机能够进行逻辑推理的程序。例如:逻辑语言

要进行深入研究,请查看:


3

我倾向于从功能方面考虑:

句法:

基于C或您拥有什么。Java具有基于C的语法。我强烈建议您尝试使用Python或Ruby之类的方法来使您的语法摆脱困境,并更多地考虑给定语言如何工作的基础知识。我认为没有语法比基于C的语法更庞大,并且围绕空白的构建块也没有问题。

编译与解释w。构建过程与解释/控制台:

我对编译时与运行时环境的关注不甚了解,但是我发现那里有很多我很少考虑的关注。

同样,有许多解释型语言仍具有像Java一样在虚拟机中运行的编译过程。您仍然必须重新构建才能看到更改。

然后是JavaScript和Python,您可以在实时环境中的控制台中逐个命令地执行它们。这三种方式都可能导致完全不同的代码编写方式。

动态与严格输入:

我倾向于将两者视为设计折衷。当您处于较低水平并且性能至关重要时,静态类型很有用。我从未理解过这种说法比另一种说法“更安全”的概念,但是我想到的是一种非常可塑性/动态的语言,您在这里只学习打字系统的工作原理和基本期望。在JS中,类型恶作剧对我来说很少有问题。在某些方面,灵活性可以使事情变得更健壮,尽管如果您不了解该语言的某些缺陷,可以承认,对于更高级别的Jr.开发人员而言,这可能会更加神秘。

块级范围与功能范围与?:

块级是最常见的(在大多数基于c的语法语言中,{}之间的任何值)。JavaScript范围是围绕函数构建的(函数也用于构建对象,因此也可以有效地构建对象)。从内部范围到外部范围,您具有哪种访问方式也有很大的不同。我不熟悉其他范围界定方案,但我确定它们存在。

古典OOP与原型OOP与Almost-OOP(C语言中的结构)与非OOP:

即使在基于类的OOP中,也存在很大的变化空间。是否可以进行多重继承(ew,过量,ew),定义接口等...

在JavaScript中,我们有一种发育迟缓的混合原型OOP,其中对象更加简单,高度易变,但是我们仍然能够将接口与内部关注点分离,这是IMO封装的重要方面。

关于OOP的事情是,实际上可以有很多东西是面向OOP的,而从技术上来说并不是OOP。当然有纯粹主义者,但归根结底,设计模式是要实现在某些情况下可以很好地工作的某些抽象。不要太快地假设基于OOP的语言的想法在面向过程的东西中没有用。而且我不是在谈论JavaScript。它完全不受基于OOP范例的高飞版本的限制。

一流的功能:

对于我来说,放弃这些语言是一件很难的事情。您可以像传递数据那样在其他上下文中使用函数。这使事件处理方案特别容易实现,但也使调整语言以您希望的方式工作变得非常容易。尽管我在两周内就设计了JavaScript,并且将Java近似语法作为一种营销方案打在了它上面,但使JavaScript最终获得成功的东西比我怀疑的要多。

关闭时间:

我不确定Java的争论在哪里,但是我知道一两年前很多Java开发人员都在呼吁使用此功能。在非闭包语言中,当一个函数关闭时,任何能够以某种方式从该函数内部引用内容的东西都将无法访问它,因为它是垃圾收集的。在闭包中,执行上下文是受约束的,这样,如果您能够从另一个范围(如返回的对象或函数)中引用该闭包函数中的内容,则基本上可以得到那些与函数关闭时相同的变量。这就像在垃圾收集的门上a脚,尽管我怀疑它的实现方式更像是将这些var的副本制作为引用实体的本地var。

刚性/严格/安全与为您提供所需的绳索:

JS开发人员和Java开发人员往往一点都不了解彼此,我认为这与这两种语言在此特定设计领域的近对面有很大关系。我不希望您保护我免受自己或团队中其他开发人员的侵害。我想用更少的代码做更多的事情,并根据情况以完全不同的方式(但对于给定的域是一致的)来完成所有这些工作。两者都有绝对的权衡,许多语言倾向于更多地落入中间。


e,谢谢 不加解释地努力投票赞成真是太好了。
埃里克·雷彭

2

我认为所有这些的捷径是学习足够的Lisp来做一些半有用的事情。这些范例中的大多数都是从使用Lisp的方式开始的,因此这是一种尝试的简单方法。

周围有许多种“语言”,但总是会出现新的语言。基本上,语言的目的是尽可能直接地编码思想,概念或需求。为此,在某些情况下可能需要现有的范例,可能需要一个新的范例。

一种观察方法是表面结构。它如何直接使您简洁地编码思想,这样,如果您改变了想法,对代码的相应更改也很容易,几乎没有机会引入错误。

另一种看待它的方法是控制结构。当执行语言(如果是)时,事情发生的顺序是什么,以完成您想要的?示例包括:简单的直接执行,递归,回溯,并行性。我发现(微弱的咳嗽)是差别执行

另一个有用的观点是,只要设计了数据结构,就诞生了一种语言。数据是由梳理数据并执行操作的应用程序“执行”的,就像程序只是一堆数据(如字节码)一样,解释程序使用这些数据来执行操作。


凉。我将学习LISP并获得启发。令人兴奋的:D
sova

但是,如果您说使用数据结构的行为创建了一种新的中间语言,那么您还可以辩解说,每种算法都诞生了一种新语言(所有操作都必须在数据结构上完成),而归纳起来就是一种新语言。诞生于每一行代码。我想您是说别的意思,但我不确定我是否理解?
sova 2010年

@sova:对我来说,信息论是一个伟大的启示(香农和科莫哥洛夫都如此)。它涉及含义如何通过信道进行编码和传递,以及带宽,错误检测,最小编码,随机性等概念。因此,数据对信息进行编码,而算法就是信道。程序对信息进行编码,而编程是一个渠道。那么,什么信息被编码?它从哪里来?什么时候来?去哪儿 错误(噪声)的来源是什么?他们如何纠正?我发现了一个有用的观点。
Mike Dunlavey 2010年

@sova :(续)您不必掌握所有令人反感的数学。对我而言,重要的是它为我提供了思考事物的框架。
Mike Dunlavey 2010年

1

我必须补充说,有针对特定应用程序的编程语言。我想到的是APT(自动编程工具),一种用于机床制造的语言。


我记得那个。我可能已经用过了。男孩,这是最先进的。您无需手动引导铣床,只需按启动按钮。如果有一个错误,所有的地狱都会崩溃。
Mike Dunlavey 2010年

我已经研究了为铣床生成gcode的程序。我从字面上来看,经常看到编程错误的结果。
David Thornley,2010年

我花了20年的时间在系统的主体上安装后处理器。
戴夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.