帮助我对编程语言进行一些排序

时间:2010-06-11 09:26:03

标签: python c ruby programming-languages

几天前我在这里问过C#及其原理。现在,如果可以的话,我对一些语言有一些额外的一般性问题,因为像我这样的新手,似乎有点令人困惑。确切地说,我想要更多地了解语言功能而不是语法等。

说实话,它只是困扰我的这些特殊功能让我如此困惑。例如,C有它的printf(),Pascal有writeln()等等。我知道基本上这些函数的汇编程序中的输出类似,每种语言都或多或少都有其特殊功能。对于控制台输出,文件操作等。但是所有这些函数实际上都是其OS API的一部分,所以为什么例如在C中区分C标准库函数和(在Windows上)甚至printf()时的WinAPI函数使用一些Windows功能,调用它的一些功能实际上在控制台窗口上显示所需的文本,因为实际的“显示”是由操作系统完成的。语言功能和系统API之间的界限在哪里?

现在语言我不太了解 - Python,Ruby等。更具体地说,我知道它们与java和C#类似,它们被编译成字节码。但是,我不知道它在构建GUI应用程序方面的能力是什么。我看到了使用Ruby在Linux和Windows上编写GUI应用程序的教程。但这不仅仅是某种升级吗?我的意思是fram其他教程看起来这些语言最初是用于小脚本而不是构建大型应用程序。

我希望你理解为什么我感到困惑。如果你这样做,请帮我解决一下,我没有人问。

6 个答案:

答案 0 :(得分:2)

C 便携式。这意味着在不同的系统上,printf的汇编器输出将是不同的......这是编译器基于目标系统所做的事情。编写C代码并编译为Linux应用程序,输出将与Win32应用程序不同,也不同于为iPhone编写完全相同的代码或类似代码。

在内部,当您调用printf时,C标准库可能包装对Win32 API的调用,但在大多数情况下,这并不是您真正关心的问题。 C标准库(如printf和其他文件和东西的I / O)包装执行所需操作所需的低级操作系统或硬件代码。

值得注意的是,在Java中会发生同样的效果,但是以不同的方式。从广义上讲:在Java中,您编写的代码始终编译到相同的字节代码。但是当JVM运行此字节代码时,JRE会在运行时将其转换为特定于机器的指令,而不是在C上的编译时。

答案 1 :(得分:2)

在底部,您拥有操作系统内核本身 - 以特殊CPU模式运行的代码,允许直接访问其他受保护的资源。除非你是一名操作系统开发人员,否则你将永远不必处理这个问题。

然后是来自“用户空间”的“内核空间”。您作为“普通”开发人员所做的一切都是在用户空间完成的。

OS内核将有限数量的非常基本的功能导出到用户空间,称为“系统调用”。例如,打开一个文件,读/写一些字节,关闭文件。

因为这些系统调用通常需要一些汇编程序代码开发人员不想被打扰,所以它们“包装”在(通常)C代码函数中:open(),read(),write(),close()

现在开发人员可以使用两个 API集:OS API和标准语言API。

标准语言API提供可在支持该语言的任何平台上使用的函数:fopen(),fputc(),fgetc(),fclose()。它还将提供更高级别的功能,使生活更轻松:例如fprintf()。

OS API提供了自己的一组功能。这些不可移植到不同的操作系统,但可能更直观易用,或更强大,或仅仅是不同。 OpenFile(),ReadFile(),WriteFile(),CloseFile()。同样,更高级别的功能可能是可用的,即PrintLn()。

这两组功能可能部分依赖于彼此,或直接进行系统调用,但这不应该让您烦恼太多。但应该,然后决定事先您想要用于项目的哪些功能集,因为混合这两组 - 虽然本身并不是错误 - 会打开一个整体新的蠕虫病毒(即潜在的错误)。

答案 2 :(得分:1)

所以

对于您的第一个问题,C API和OS API之间的接口是C运行时。在Windows上,这是MSVCRT.DLL的一些化身,而在Linux上,这是glibc。

对于第二种,大多数GUI工具包的本机语言是C或C ++。寻求使用它们的高级语言需要在语言和C / C ++ API之间来回转换的绑定。

对于第三种,这些高级语言似乎只用于“小脚本”。简单的事实是它们比C或C ++更具表现力,这意味着它们具有与C或C ++程序相同或更多的能力,而用较少的代码行编写。

答案 3 :(得分:1)

如果我认为这是您的核心问题:

  

语言功能和系统API之间的界限在哪里?

然后想象一下你是否会这样比喻:

OS API系统调用就像lego brick和lego组件。

编程'功能'仅仅是许多乐高积木的排列。这样组合就会产生一种工具。

因此,不同的语言可能以不同的方式“安排”和创建工具。

如果我要求你用lego制作一辆车,你可以想出很多不同的设计。

答案 4 :(得分:0)

C printf()是一个包装器。您可以在任何操作系统下使用它并编译代码,但生成的机器代码会有所不同。在Windows中,它可能会在Windows API中调用某些函数。在Linux中,它将使用Linux API。你问为什么Windows API可以区分。这是因为,如果您正在为Windows编程,您可以使用它来执行某些特定于操作系统的操作,例如创建GUI,操作控制台文本而不仅仅是打印,请求操作系统资源以及类似的东西。对于Linux和Mac(我猜所有其他操作系统)也存在这样的API,它们让你做或多或少相同的事情。但与printf()不同,它们不可移植。

您问语言功能和系统API之间的界限是什么。语言函数只需调用OS的API。你可以自己调用它们,但是你将无法在不同的系统上编译代码。

Python和Ruby(以及其他一些)被解释。它们在幕后编译为字节码,但所有用户看到的是双击源文件将运行它。无需编译。显然,这意味着它们比编译语言慢。然而,它们的动态性质使得开发更快,因为你通常需要更少的代码来做同样的事情(我说通常)。

这并不意味着这些语言不能用于“大”应用程序:它们有GUI库。那是因为这些是通用语言,不像其他一些像Bash。

答案 5 :(得分:-2)

  

更具体地说,我知道它们与java和C#类似,它们被编译成了   字节码。

Ruby和Python都是解释语言http://en.wikipedia.org/wiki/Interpreted_language,并且在执行之前它们的代码不会被转换为字节码。