基本上,我想学习很多编程语言以成为一名优秀的程序员。我知道只有极少数的深度和我希望有人能详细阐述了多少类或类型的编程语言有。就像您必须分组学习时,如何将它们组合在一起。
来自Java背景,我熟悉静态类型,但是我知道,除了动态类型之外,可用语言还必须有如此多的种类,如果可能的话,我希望可以对其进行分类。
基本上,我想学习很多编程语言以成为一名优秀的程序员。我知道只有极少数的深度和我希望有人能详细阐述了多少类或类型的编程语言有。就像您必须分组学习时,如何将它们组合在一起。
来自Java背景,我熟悉静态类型,但是我知道,除了动态类型之外,可用语言还必须有如此多的种类,如果可能的话,我希望可以对其进行分类。
Answers:
这取决于您要如何对语言进行分类。从根本上说,语言可细分为两种类型:必须在您指示计算机语言如何做一个任务,并声明中,你告诉计算机语言是什么做的。声明性语言可以进一步分解为功能性语言,在该功能性语言中,通过组合函数和逻辑来构建程序编程语言,其中通过一组逻辑连接构建程序。命令式语言更像是解决问题的步骤列表,有点像食谱。命令性语言包括C,C ++和Java。功能语言包括Haskell;逻辑编程语言包括Prolog。
命令式语言有时分为两个子类:诸如C之类的过程语言和面向对象的语言。但是,由于存在面向对象的功能语言(OCaml和Scala是示例),因此面向对象的语言与分组有点正交。
您还可以通过输入以下语言对语言进行分组:静态和动态。静态类型的语言是在运行程序之前(通常在编译阶段)检查(通常是强制执行)类型的语言;动态类型语言会将类型检查推迟到运行时。C,C ++和Java是静态类型的语言。Python,Ruby,JavaScript和Objective-C是动态类型的语言。也有未键入的语言,其中包括Forth编程语言。
您还可以按照语言的类型划分语言:弱类型(支持隐式类型转换)和强类型(禁止隐式类型转换)。两者之间的界线有点模糊:根据某些定义,C是一种弱类型的语言,而其他人则认为它是强类型的。无论如何,纪律并不是对语言进行分组的真正有用的方法。
这些是主要的,但是还有许多其他范例,它们之间有很多重叠之处。
有关编程语言(范例)的类型,请参见此处:http :
//en.wikipedia.org/wiki/Programming_paradigm
有关编程语言(例如类型系统)的其他特征,请参见此处:http : //en.wikipedia.org/wiki/Programming_language
您应该查看Peter Van Roy 编写的傻瓜编程范例:每个程序员都应该知道的内容。这将为您提供有关外部情况的概述。
如果想走得更远,可以阅读《计算机编程的概念,技术和模型》。您不会通过这种方式学习大量的语言,但是您将学习各种语言背后的范例。因此,学习新语言对您来说将更加容易。
程序:汇编,Java,C#,F#,Lisp,Fortran。
基于集合:SQL。
基于模式:Perl,Regex,Snobol。
基于树:XSLT。
基于数组:APL。
有不同的答案方法,但可以将它们归类为:
机器语言:机器语言是一种低级编程语言。它很容易被计算机理解,但很难被人们阅读。这就是为什么人们使用高级编程语言的原因。用高级语言编写的程序也可以编译和/或解释为机器语言,以便计算机可以执行它们。
汇编语言:汇编语言是机器语言的表示。换句话说,每个汇编语言指令都转换为机器语言指令。尽管汇编语言语句是可读的,但是这些语句仍然是低级的。汇编语言的一个缺点是它不可移植,因为每个平台都带有特定的汇编语言。
高级语言:高级语言是当今大多数程序员使用的语言。诸如C,C ++和Java之类的语言都是高级语言。高级语言的优点是它们非常易读和可移植。高级语言的一个缺点是它们不如汇编语言强大。因为高级语言中的单个语句被翻译成许多机器语言语句。
高级语言可以进一步分类为:
功能语言:在功能语言中,程序分为功能定义。功能语言是一种声明性语言。它们主要基于带有常量的类型化lambda微积分。一些著名的函数语言是Scala,F#,Clojure和Lisp。
程序语言:在程序语言中,程序是按照一系列步骤编写的,应遵循这些步骤来产生结果。COBOL,FORTRAN和C是一些过程语言。
面向对象的编程语言:在OOP语言中,程序分为包含数据的对象和对数据进行操作的方法。Java,C#和C ++是OOP语言。
逻辑编程语言:逻辑语言用于创建使计算机能够进行逻辑推理的程序。例如:逻辑语言
要进行深入研究,请查看:
我倾向于从功能方面考虑:
句法:
基于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开发人员往往一点都不了解彼此,我认为这与这两种语言在此特定设计领域的近对面有很大关系。我不希望您保护我免受自己或团队中其他开发人员的侵害。我想用更少的代码做更多的事情,并根据情况以完全不同的方式(但对于给定的域是一致的)来完成所有这些工作。两者都有绝对的权衡,许多语言倾向于更多地落入中间。
我认为所有这些的捷径是学习足够的Lisp来做一些半有用的事情。这些范例中的大多数都是从使用Lisp的方式开始的,因此这是一种尝试的简单方法。
周围有许多种“语言”,但总是会出现新的语言。基本上,语言的目的是尽可能直接地编码思想,概念或需求。为此,在某些情况下可能需要现有的范例,可能需要一个新的范例。
一种观察方法是表面结构。它如何直接使您简洁地编码思想,这样,如果您改变了想法,对代码的相应更改也很容易,几乎没有机会引入错误。
另一种看待它的方法是控制结构。当执行语言(如果是)时,事情发生的顺序是什么,以完成您想要的?示例包括:简单的直接执行,递归,回溯,并行性。我发现(微弱的咳嗽)是差别执行。
另一个有用的观点是,只要设计了数据结构,就诞生了一种语言。数据是由梳理数据并执行操作的应用程序“执行”的,就像程序只是一堆数据(如字节码)一样,解释程序使用这些数据来执行操作。
我必须补充说,有针对特定应用程序的编程语言。我想到的是APT(自动编程工具),一种用于机床制造的语言。