代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

帮我整理一下编程语言[关闭]

  •  3
  • B.Gen.Jack.O.Neill  · 技术社区  · 15 年前

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

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

    现在我不太了解语言——python、ruby和类似的语言。更具体地说,我知道它们类似于Java和C语言,它们被编译成字节码。但是,我不理解它在构建GUI应用程序方面的功能。我看过使用Ruby在Linux和Windows上编程GUI应用程序的教程。但这不是某种升级吗?我的意思是fram其他的教程,看起来这些语言最初是为小脚本设计的,而不是构建大应用程序。

    我希望你能理解我为什么困惑。如果有,请帮我整理一下,我没人要问。

    6 回复  |  直到 15 年前
        1
  •  2
  •   DevSolar    15 年前

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

    然后出现了一个不交叉线将这个“内核空间”与“用户空间”分开。作为“普通”开发人员,您所做的一切都是在用户空间中完成的。

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

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

    现在来 开发人员可用的API集:OS API和标准语言API。

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

    OS API提供了自己的一组函数。它们不可移植到不同的操作系统,但使用起来可能更直观,功能更强大,或者只是有所不同。openfile(),readfile(),writefile(),closefile()。同样,可以使用更高级别的函数,即println()。

    这两组函数可能部分地相互依赖,或者直接进行系统调用,但这不会给您带来太多麻烦。你 应该 但是,决定 事先 您希望在项目中使用哪一组函数,因为将这两组函数混合在一起(而本身并不是一个错误)会打开一个全新的蠕虫罐头(即潜在错误)。

        2
  •  2
  •   Mr. Boy    15 年前

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

    在内部,C标准库 可以 调用时包装对win32 api的调用 普林特 但在大多数情况下这不是你真正关心的。C标准库(如 普林特 以及其他文件和资料的I/O) 包裹 底层操作系统或硬件代码需要执行您想要的操作。

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

        3
  •  1
  •   Ignacio Vazquez-Abrams    15 年前

    所以。

    对于第一个问题,C API和OS API之间的接口是C运行时。在Windows上,这是msvcrt.dll的某种体现,而在Linux上,这是glibc。

    第二,大多数GUI工具包的本地语言是C或C++。更高级的语言试图使用它们,需要在语言和C/C++接口之间来回转换的绑定。

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

        4
  •  1
  •   Darknight    15 年前

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

    语言函数和系统API之间的界限在哪里?

    那么想象一下,如果你将这个类比:

    OS API系统调用类似于乐高积木和乐高组件。

    编程“功能”只是许多乐高积木的一种安排。这样组合就产生了一个工具。

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

    如果我让你用乐高玩具造一辆车,你可以想出很多不同的设计。

        5
  •  0
  •   Javier    15 年前

    C氏症 printf() 是包装器。您可以在任何操作系统下使用它并编译代码,但得到的机器代码将不同。在Windows中,它可能调用Windows API中的某个函数。在Linux中,它将使用LinuxAPI。您会问为什么Windows API与众不同。这是因为,如果你在为Windows编程,你可以用它来做一些特定于操作系统的事情,比如创建gui,操作控制台文本而不仅仅是打印,请求操作系统资源等等。类似这样的API也存在于Linux和Mac(我猜所有其他操作系统)中,它们允许你做或多或少相同的事情。不像 Primff() 不过,它们不是便携式的。

    您会问语言函数和系统API之间的界限是什么。语言函数只是调用操作系统的API。你 可以 您可以自己调用这些代码,但这样您就无法在不同的系统上编译代码。

    解释了python和ruby(以及其他一些)。它们被编译为幕后的字节码,但是用户看到的只是双击源文件将运行它。不需要编译。很明显,这意味着它们比编译语言慢。但是,它们的动态特性有助于更快的开发,因为您通常需要更少的代码来完成相同的事情(我说过 通常 )

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

        6
  •  -2
  •   mamoo    15 年前

    更具体地说,我知道它们和Java和C语言是相似的,因为它们是编译成的。 字节码。

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