• 编程语言的概念


    在网络中很容易引发一场编程语言孰优孰劣的争论,这是极其幼稚的。因为使用的语言不同而分成不同的阵营,一定要争个高下优劣是极其不应该的,这不仅离架构 师有遥远的距离,离一个高产的程序员尚有不小的距离。但并不是说关于编程语言的讨论是不应该的,编程语言也是人设计的,缺陷必然有的,需要的是在更高层次 上的探讨。一个达到架构师程度的程序员可以有偏爱的语言和讨厌的语言,但是面对编程语言时不应该有障碍,站在一个更高的层次上,任何语言都能够在一周之内学会,对任何语言也能够有一个客观的评价和选择。

    任何主流程序语言无外乎输入、输出、逻辑控制结构这三要素;虽然有面向过程、面向对象等不同的分类,这也仅仅是这三个要素的组织形式。逻辑控制结构包括顺序、选择、循环、[直接]跳转。选择和循环本质上都是逻辑判断+跳转。 只需要选择和循环这两种形式的跳转,再加上顺序就能够实现所有的控制结构了,所以直接跳转在有些语言里就被抛弃了。

    考察任何一段代码块都是有输入和输出 的。输入有什么?函数或方法的参数、创建或申明的变量、直接量、输入流等。输出又有什么呢?函数或方法的返回值、函数或方法的引用或指针类型的参数、变量 赋值、输出流等。看这样一个简单的赋值语句`int a = b*12;`。这就是一个简单的顺序结构,从高级语言层面上可以简单的看作一步,从汇编和机器语言上看包含了按顺序执行的一系列操作;在这个操作中a就是输出,b是变量类型的输入,12是直接量类型的输入。

    当前如果一种编程语言仅仅考虑这三个基本的要素,是没有必要的存在意义的,尤其是在机器语言、汇编语言逐渐少有人会的时候,甚至是C语言。所以在设计一种编程语言的时候必然会考虑到如何组合这三种要素如果解决一些开发中不得不面对的问题。如何组合这三种要素目前仅需要考虑面向对象这一种。开发中不得不面对的问题有两个最关键的----内存管理和程序执行方式。程序执行方式有编译成执行文件后执行,从源代码直接执行两种。

    这两类问题具体怎么解决的,构成了一种编程语言的最大特色。 比如,java和C#对第一个问题的解决方案是:单一继承、一切都被类包装、接口;C++对第一个问题的解决是:多重继承、类和函数并行。java、 C#、C++在执行方式上并无本质的区别,都需要编译出结果然后执行;java和C#虽然多个虚拟机或者运行时的东西,如果把这两个东西和操作系统集成到 一起,这三种语言使用上并没有什么区别。而Python、Perl这些语言可以在执行环境中从源代码直接运行。在内存管理方式上,java、C#与C++ 有显著的区别。java和C#将类型和类型的存储方式绑定在一起了,class(引用类型)一定是存放在堆上的并且能够自动释放,struct和基本类型 (值类型)一定存放在栈上(当然是自动释放的);引用类型的对象创建之后就获得了一个指示这个对象位置的值类型对象,这个具有位置指示器作用的值类型对象 的类型叫做引用;值类型的对象创建之后获得这个对象本身。而C++的类型和类型的存储方式不是绑定的,任何类型都可以存储堆上或者栈上;存储在堆上的对象 所占据的内存是需要明确在代码中编码释放的。

    注意前面的用词,“任何主流程序语言”而不是“任何程序语言”,这是因为主流的程序语言都是命令式的,只有命令式语言才包含逻辑控制结构这一要素。命令式语言特点是需要告诉计算机以怎么样的步骤完成功能,有逻辑控制结构才能有步骤。当然还存在另外两种语言----声明式语言、函数式语言。声明式语言的特点就是不需要告诉计算机解决问题的步骤,仅输入需要什么然后等待结果的输出,那么声明式语言是没有逻辑控制结构的,在当前的这种冯·诺依曼体系结构的机器上更准确的说法是声明式语言隐藏了逻辑控制结构,一般情况声明式语言是由命令式语言实现的。 声明式语言最擅长的是数据处理,声明式语言无法完成命令式语言能完成的所有事情。一个很典型的例子就是SQL,使用SQL在进行查询的时候没有指明“读取 所有数据然后一个个的比对是否符合要求再返回”之类的步骤,而是通过“SELECT what FROM table WHERE condition”这种语句输入了“从什么地方查找符合什么条件什么东西”这种需求。为了提高编程效率,很多面向对象的编程语言都加入“声明式编程”的 特性——其实就是通用的分解动作已经被语言或者语言的库包内置了,比如C#的linq。

  • 相关阅读:
    Java实现 LeetCode 784 字母大小写全排列(DFS)
    Java实现 LeetCode 784 字母大小写全排列(DFS)
    Java实现 LeetCode 783 二叉搜索树节点最小距离(遍历)
    Java实现 LeetCode 783 二叉搜索树节点最小距离(遍历)
    Java实现 LeetCode 783 二叉搜索树节点最小距离(遍历)
    Java实现 LeetCode 781 森林中的兔子(分析题)
    一种机制,与js类似
    图片热区
    我对 aspnetpager和repeater以及查询条件的封装
    我对webform的整改。
  • 原文地址:https://www.cnblogs.com/tgis/p/4717569.html
Copyright © 2020-2023  润新知