【问题标题】:Distinction between programming language and framework编程语言和框架的区别
【发布时间】:2014-02-19 17:25:08
【问题描述】:

我是一名学生,开始在 VB.Net 中开发一些项目,我非常喜欢它。但是,我向一些同事提出了这个问题,他们无法回答。甚至我的老师也无法弄清楚 VB 和 .Net 到底是什么。我检查了this question here,但即使是接受的答案也让我有些怀疑。

例如这里的这段代码

Class Example
    Private _value As Integer

    Public Sub New()
    _value = 2
    End Sub

    Public Function Value() As Integer
    Return _value * 2
    End Function
End Class

Module Module1
    Sub Main()
    Dim x As Example = New Example()
    Console.WriteLine(x.Value())
    End Sub
End Module

语言如何与框架分离?我知道语言是语法,但框架在哪里?

我读过框架包含库:库到底是什么?语言(语法和所有)我可以看到它,它可以看到,但是框架也可见吗?如果有,在哪里?

所以在 VB.Net 应用程序中,当我查看代码时,我只能看到 VB:C#.Net 应用程序也是如此。

也许是愚蠢的例子:例如,要使汽车发挥作用,所有部件都必须良好——从轮胎到引擎盖、发动机、燃料——但所有这些都是可见的,而从外部我们可以看到。看不到内部运行的油或燃料或活塞的工作,如果我们愿意,我们可以看到它们。

查看 VB/C# .Net 应用程序时是否可以查看所有组件?我的意思是,看代码并清楚区分什么是VB或C#和.Net?

谢谢

【问题讨论】:

  • 那个示例并没有充分利用 NET 框架 - console.writeline 是一个 NET Class.method(Integer 也是一个网络 Type)。其他人是String.Split, Convert.ToInt32 or myCollection.Contains()。所有框架部分都在对象浏览器中可见(F2 - 没有它就不要离开家)
  • 那么,那些方法不是 VB/C#?
  • 否 - 它们可通过 NET 用于 VB/C#,但不属于语言规范。 F2 将向您显示哪些 NameSpace 内容来自。 VB 特定的东西是Select Case vs C# switch 或IF/THEN/ELSE vs if(){...}。这似乎很模糊,因为像 System 这样的东西为两者提供了很多相同的东西(比如 Int32)。
  • 这些是语法差异,我知道。 string.split 或 collection.contains() 之类的方法是否为 VB、C# 以及使用 .Net 框架的任何其他语言编写的相同方式?
  • 它不仅仅是语法,它是语言。 VB 不知道switch 来自字符串的表单。 NET 中的类型和方法对于任何 NET 语言都是相同的(VB 与其他任何东西都没有单独的字符串类型或字符串方法)。

标签: vb.net frameworks programming-languages


【解决方案1】:

.NET 框架包含三个主要部分:

  • 编译器 (MSBuild)
  • 运行时环境 (CLR) - 虚拟机、垃圾收集器等
  • 支持库 (FCL)- System、ADO.NET、LINQ、WPF、WCF 等。

上述所有三个都包含在免费分发的 .NET Framework 中。 .NET Framework 一词是对所有这些东西的统称,但它们各自扮演着非常不同的角色。对于每个部分,您的问题的答案都不同。

编译器

您可能知道,您不能直接运行 VB.NET 代码。它必须首先编译成可执行文件,可以作为 Windows 进程启动。编译器用于将各种高级语言(如 VB.NET 和 C#)编译成程序集(如 EXE、DLL)。但是,与本机编译器不同,.NET 程序集不包含本机机器代码。相反,.NET 编译器编译成包含 MSIL 代码的 .NET 程序集。 MSIL 是一种略高于机器代码的语言,理论上它可以由任何平台上的虚拟机运行。

编译器显然在您的代码中不可见。显然,您的代码中没有任何地方可以说“那是编译器”。相反,编译器是您用来编译所有代码的工具。但是,编译器确实规定了您可以使用哪些语言。如果 .NET 框架不包含 Ruby 编译器,那么您就不能很好地用 Ruby 编写 .NET 应用程序。因此,这样一来,您的代码完全是用 VB.NET 或 C# 编写的这一事实表明它将使用 .NET Framework 进行编译。

您可能会想,“编译器不是框架的一部分,而是 Visual Studio 的一部分。”但如果你这么想,那你就错了。编译器作为 .NET 框架的一部分安装。从技术上讲,您不需要 Visual Studio 来编译 .NET 应用程序。您可以使用记事本以任何 .NET 语言编写应用程序,然后使用 .NET Framework 编译和运行它,而无需安装 Visual Studio。

.NET Framework 的编译器部分称为MSBuild。

运行时环境

由于编译器将您的高级代码编译成 MSIL 程序集,而不是编译成本机机器代码二进制文件,因此您必须安装 .NET Framework 才能运行任何 .NET 应用程序。当您运行 .NET 应用程序时,框架负责将 MSIL 代码即时 (JIT) 编译为机器代码,以便它可以在您当前的平台上执行。它还提供了垃圾回收等内存管理功能。

所有 .NET 语言共享相同的运行时环境(因为所有 .NET 语言都编译为 MSIL 代码)。因此,它既不是 VB.NET 运行时环境,也不是 C# 运行时环境,而是 MSIL 运行时环境。实际上,每个平台都有一个运行时环境,而不是每种语言都有一个运行时环境。必须为每个处理器架构和运行框架的每个操作系统定制一个单独的环境。

框架的这一部分对您和您的代码来说基本上是不可见的。您可以调用一些方法来访问 GAC、垃圾收集器或 .NET 安全系统,但除此之外,您甚至不知道它的存在。除非没有安装框架,否则——在这种情况下,很快就会清楚它的必要性。

.NET Framework 的运行时环境部分称为Common Language Runtime (CLR)。

支持库

.NET Framework 包含许多非常有用的库 (DLL)。例如,每个应用程序都引用了mscorlib.dll 和System.dll 库,它们在System 命名空间中提供了许多核心数据类型。您可以根据需要选择在项目中引用许多其他库。

这些支持库作为已编译的 MSIL 程序集提供,因此它们都可以被以任何 .NET 支持的语言编写的项目引用和使用。当您在 VB.NET 中调用 Console.WriteLine("Hello World") 和在 C# 中调用 Console.WriteLine("Hello World"); 时,您调用的是完全相同的 .NET Framework 库。 Console 类在 mscorlib.dll 库中定义。不管你用哪种语言来称呼它,它总是做同样的事情。

支持库在您的代码中非常明显。任何时候您在自己的代码中使用未明确定义的任何内容时,您都在使用框架(当然,除非它来自第三方库)。在上面的示例代码中,您使用的是Integer 和Console。这两种类型均由 .NET Framework 的支持库定义(均由 mscorlib.dll 定义)。换句话说,语言是您用来调用框架的所有语法。其他一切都是框架。

如果您想“查看”支持库,最好从 Visual Studio 入手。您可以使用 对象浏览器 浏览您当前在项目中引用的库定义的所有类型。如果您想引用更多 .NET Framework 库,请转到 Project Properties 设计器的 References 选项卡,单击 Add... 按钮,然后选择 Asseblies > Framework 选项。这将列出作为 .NET Framework 的一部分提供的所有支持库。如果您想了解更多关于这些库提供的任何功能的信息,最好的资源是MSDN(当然还有 Stack Overflow)。

.NET Framework 的支持库部分称为Framework Class Library (FCL)。

【讨论】:

  • 谢谢你,辛苦了!一个问题:为什么你指的是"VB.Net" or "C#"而不是"VB.Net" or "C#.Net"?我问是因为我不止一次看过它,例如:“VB.Net 和 C# 中的编码之间的差异” - 为什么“.Net”旁边的“C#”不像“VB.Net”那样“C#”也使用“.Net”框架?
  • 在 .NET 之前有 许多 个不同版本的 VB(例如 VB6、VB5、VBA、VBScript)。由于 VB.NET 是一种与其前身完全不同的语言(但显然是基于它们),因此决定将该语言的名称命名为 VB.NET,以便将其与其他 VB 语言和版本区分开来。另一方面,C# 首次与 .NET Framework 的第一个版本一起发布。它是一种专门为 .NET 设计的新发明语言。没有真正的非 .NET C# 来区分它,因此没有必要在 C# 中添加 .NET。
【解决方案2】:

这是我对两者的设想

  • 框架是可供该语言使用的库、API 和运行时组件的集合
  • 语言是访问框架的语法

在许多情况下,很难将两者分开,因为使用的语言几乎总是访问框架的某些部分。以这个非常简单的定义为例

Class Example

End Class

尽管没有说明,但此定义取决于具有System.Object 定义的目标框架。这对于语言为Example 设置适当的基类是必要的。

【讨论】:

  • 我需要更具体的见解,正如我所说,我希望(如果可能的话)真正“了解”VB 和 .Net 的位置
  • @user3329200 那么您将不得不重新提出您的问题。不清楚你想看到什么。
  • 我编辑了我的问题。当我查看一些代码时,我想看到的是“哦,这是 VB”和“这部分是 .Net”,如果可能的话
【解决方案3】:

您必须记住,如果您使用的是编程语言,在某些时候它必须归结为二进制 1 和 0。

这意味着当您的程序被编译和运行时,它正在使用 C# 编译器。 C# 编译器是用本地语言(可能是 c 或 c++)编写的程序。该程序允许将您的程序转换为 .net 框架运行时可以理解的内容。本质上,您的 C# 代码变成了某种中间字节码。

同样,在您的程序编译成这个中间字节码后,它会在虚拟机(Java 的 JVM 或 C# 的 .net 框架运行时)之上运行。此虚拟机是用本地语言(c 或 c++)编写的预编译程序,它允许您的程序以双方都能理解的方式与计算机的处理器交互。

所有这些预先编写、预先编译的部分都是框架的一部分。它们安装在您的计算机上的某个特定位置(这就是为什么它们可能不会被您的其余代码和资产轻易看到的原因)并为任何想要使用它们的东西提供 API。

API 类似于油门踏板和发动机之间的理解。由于有人踩下油门踏板,发动机会接受更多的燃料。从某种意义上说,发动机会与油门踏板“对话”,并且知道如果您用力踩下踏板,发动机应该会通过向燃烧室喷射更多的汽油来做出响应。

这些单独的部分及其“理解”代表了一个框架。您可以添加一个可以操作油门踏板的“驱动程序”作为您的“C# 应用程序”。

【讨论】:

  • 仅从程序员的角度来看,我不想深入到 0 和 1
  • 我明白了,我刚才说的是为了展示依赖关系链、库和框架可以走多远。我的观点是这些“依赖部分”通常代表另一个框架的一部分。
  • C#编译器是自举的,所以实际上是用C#写的。
【解决方案4】:

语言如何从框架中分离出来?

例如...以英语为例,英语是一种语言,而一本书则是一种框架。在这个例子中,你可以用英语写任何你想写的东西,但你不能用“霍比特人”来写,因为它是一本书,而不是一种语言。

但是,您可以参考这本书。例如,您可以谈论 Trolls,而不必定义它的行为或外观,因为本书已经为您定义了它们。

框架在哪里?

框架存在,只要你引用它。在 Trolls 的例子中,如果你问“你知道 Trolls 长什么样吗?”,我需要一个上下文,它可能是哈利波特的,托尔金的,魔兽世界之类的,我给你编译错误,因为我看不懂你。

但是,如果我们“使用”相同的“框架”(书),或者如果您之前告诉我它们,我将能够回复您(编译)。

框架也可见吗?如果有,在哪里?

VB/C# 是语言,您无法“真正看到”它在哪里,因为您编写了它。这就像问英语在哪里。但是,您可以编译它,这就是您可以“找到”的东西,就像您可以找到打印机一样。

框架是一组库/实用程序,已经打包在一个漂亮的黑匣子中,您可以下载并信任您的生命。

VisualStudio 帮了你很多,它会隐藏“复杂的东西”,想象它是一部名为指环王的电影,它会删除很多你做不到的东西除非你读过书,否则真的要好好研究一下。

您无法真正深入了解“.NET 在内部做什么”,因为它是封闭软件。想象一下,我烧毁了所有的书,而你必须相信这部电影。
但是您可以使用诸如Struts(JavaEE 框架)之类的开源示例,因为它是开源的(不应在开源示例中烧录书籍)。

【讨论】:

  • 很好,很好的解释。最后一个问题,你不是说“框架”而不是“语言”吗?使用你的好例子,我不是在问“英语在哪里?”,而是“书在哪里?”
  • 这本书会在您从亚马逊订购的包装中(您从微软网站下载的巨大文件,几乎总是包含在 VisualStudio 中)
  • 那么,在检查代码时,我看不到框架?
  • 在这个特殊的 .NET 案例中,不,你真的不能,因为它不是开源的。我想不出一个例子:( ...也许你从亚马逊订购的盒子无法打开,并且外面有一条消息说“改为观看电影”(意思是“阅读 API”) .
【解决方案5】:

这是一个抽象的例子。

语音类似于一个框架,你有发声,发出声音; 谐振;语调、音高变化等。这些都是沟通的基石。

要说一种特定的语言,你必须利用音韵、词法、语言句法、正确的语法;语义等 - 该语言的所有规则。

...

在编程框架中,您有可能需要完成编程任务的构建块(代码库、依赖文件、特定文件夹/文件布局等)。

编程语言是您必须遵守的一组规则,您的应用程序才能正常工作。

....

在 Java 编程语言中,我可以打开记事本并编写 Java 代码、编译它,然后在任何安装了 JVM 的机器上运行它。

Java Server Faces (JSF) 是一个框架,其中存在模型-视图-控制器 (MVC) 范式作为运行 Web 应用程序的基础。您有必要的依赖文件(如 web.xml),服务器必须存在这些文件才能正确实现、类文件的结构化布局以及其他库的实现/配置。从本质上讲,您的文件仍然是用 Java 编程语言编写的,并且您的语法必须正确,但是如果您想使用该框架构建 Web 应用程序,则必须遵守那些其他特定的模式和约束。

【讨论】:

  • 谢谢,现在好多了
  • @user3329200 抱歉,我可能没有回答您的问题,但很高兴它对您有所帮助。如果您觉得它很有用,您可能想为可能偶然发现您的帖子的其他人投上一票。
猜你喜欢
  • 2011-04-15
  • 2016-11-24
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2015-07-28
  • 2011-03-29
  • 2010-12-03
相关资源
最近更新 更多