程序员如何使用高级语言处理低级软件开发?


20

我对编程有些陌生,而提出这个问题的最佳方法是举一个例子。

我知道如何用Java和C#做基本的事情。诸如小型Windows窗体应用程序之类的东西或使类成为通用类。我基本上一直在学习,并且还没有尝试做任何大的事情。无论如何,我一直很好奇事情在幕后的完成方式,我想你会说。

我知道所有内容都归结为1和0,并且汇编语言基本上为1和0的模式提供命令,但是似乎从那里跳到了:为此使用一个库作为该库。在我看来,没有库就可以执行的所有C#操作都是算术和二进制逻辑。要获取输入或输出,请使用库等。

我知道这个问题对某些人来说似乎很明显,我知道我有很多东西要学,但我什至不知道从哪里开始这样的问题。谢谢。

所以我的问题是这样的:

如果有人要制作虚拟机或Playstation仿真器,操作系统或驱动程序,或将mp3支持添加到媒体播放器,或者制作自己的文件类型,等等。我看不到用C#或Java来完成的方式。

换句话说,如果我读WROX的《 Professional C#》或OReilly的《 Programming C#》之类的书,我会知道该怎么做吗?还是您必须学习汇编语言或诸如C ++这样的低级语言?


7
了解“幕后”情况的一种技巧是集中精力并使用段落来使事情易于阅读和理解。请编辑此问题,以使其更易于阅读。
S.Lott

1
出于您的兴趣,您可能希望获取Charles Petzold的《代码:计算机硬件和软件的隐藏语言》的副本。这是一本好书。 amazon.com/Code-Language-Computer-Hardware-Software/dp/...
DKnight

@ S.Lott进行救援:-)
Martin Wickman

@Martin Wickman:虽然做得非常好,但对@ fender1901进行编辑或聚焦有帮助吗?
美国洛特

1
@马丁·威克曼:撤销更改不是重点。鼓励他人边做边学是我的观点。您显然已经知道。@ fender1901需要边做边学。我的问题是:“对@ fender1901进行编辑或聚焦有帮助吗?” 你怎么看?
S.Lott

Answers:


9

有趣的问题!您会发现Java和C#之类的语言实际上支持相当低级的编程。例如,查看Java OpenJDK中的一些I / O源代码。您会看到,较高级别的方法是通过较低级别的套接字技术,字节数组和位旋转实现的。

对于C#和Java,这些语言可编译为字节码,然后在虚拟机上执行。实际上,您可以非常愉快地查看和学习字节码(例如,查看Java如何处理串联的String对象)。

如果您正在开发的环境没有托管这些较高级别的VM之一(通常是由于空间和性能要求而定),则您需要使用“较低级别”的语言。

我相信C / C ++仍然会在编写低级驱动程序等方面占据主导地位,因为您可以将内存管理和数据结构调整到第n级。

如今,组装是非常专业的,最好至少学习一门快速的课程,以了解在该级别上发生的事情。当您编写一些Assembly以在清空时回填寄存器时,您会开始意识到每种编程语言层必须使用的长度。

高温超导


您可以实际使用中间语言编程还是仅在中间语言进行检查?
fender1901 2011年

您是否在问是否可以编写“字节码”源代码?
Martijn Verburg

我认为。我想知道您是否可以像使用Java或C#一样开始使用字节码或il进行编码?
fender1901 2011年

Java或C#,很少有人会使用字节码,但是更多的人确实在看他们特定的更高级别代码归结为什么字节码
Martijn Verburg

4

大多数“低级”编程基本上相当于直接与操作系统连接。在您看来,您似乎不喜欢采用一种“显而易见的”方法来执行此操作的原因是,通常来讲,像Java这样的高级语言都在努力简化易用性和可移植性。直接与操作系统连接的代码通常要少得多高于级别的代码可移植的,除非它被包裹在一种抽象。

在诸如C和C ++的低级语言中,可以直接访问操作系统API(很大程度上是由于大多数操作系统都是用C编写的,因此它们通过C语言公开了API)。例如,在UNIX系统上的C中,您可以调用ioctl函数以直接与设备接口。

当然,诸如Java和C#之类的高级语言也需要与操作系统进行对话。每次打开文件或从网络套接字读取数据时,您都在与操作系统进行接口。只是Java和C#将低级OS系统调用包装在更高级别的抽象中,例如Socket对象。这种更高级别的方法的优势在于,相同的Java代码将在不同的平台上运行。而在UNIX上用C打开套接字的方式与在Windows上打开套接字的方式大不相同。

通常,语言越高级,您对程序与操作系统的接口的控制就越少。就是说,您提到的许多事情可以用高级语言来完成。例如,没有理由不能用Java或C#编写虚拟机。


2

好消息是,它可以使用Java或C#完成。您需要知道的唯一问题是如何做。基本上,您需要了解有关硬件体系结构的一些小知识(不是必需的PC,但如果您要模拟的话是Playstation)。恐怕您需要深入学习,例如汇编语言和机器语言。
所有的ALU,寄存器,MMU和内容都可以使用高级语言进行抽象和仿真。您甚至可以调用底层函数来获取硬件支持(例如,了解PInvoke和JNA)。

但是,由于您是初学者,因此不建议开始如此艰巨的任务。我建议您学习C / C ++,了解有关Linux(或其他类似Unix的操作系统,例如FreeBSD),计算机体系结构以及汇编程序的知识,这可能需要几年时间,所以...
您真正需要的是动力和耐心。


2

我所做的工作是学习高级语言(Java)的,然后,就像您一样,对低级语言和硬件越来越感兴趣。在最原始的状态下,计算机就是电子设备。1和0只是电荷(开和关)的数字。一旦我开始理解处理器背后的逻辑以及算术逻辑单元内部的内容,事情就真的到位了。
我认为你应该开始学习使用布尔逻辑(“与”,“或”,“异或”等)之类的东西,然后开始设计小型ALU,并研究内存和寄存器如何作用于事物。之后,学习一些汇编语言,然后您将了解编译的工作方式。很快,高级语言似乎很无聊!:) 开玩笑。一切都变得如此美好,这应该很有趣,而且学习起来应该很有趣。一旦开始遵循好奇心之路,您很快就会发现。


2

尽管您可以使用C#或Java(或大多数其他语言)来做底层工作,但大多数人却不行。因此,您选择其中任何一本相当受欢迎的书都将忽略低级内容。它们可能涵盖了您需要的语言功能,但不能以您好奇的方式应用它们。同样,有关低级内容的书籍可能会使用C语言,并带有一些汇编语言。

对于C#程序员来说,学习C本身并不困难,除了指针操作外,尽管学习其中的内容会花费更长的时间。由于C是一种比C#更具表达力的语言,因此某些您必须知道如何在C#中高效执行的事情将必须以与C完全不同且通常较笨拙的方式来完成。

接下来您应该寻找的是关于您想学习的较低层次的东西的书。例如,有关于Linux内核的书籍,但是如果没有一些背景知识,将很难掌握内核级编程,因此您可能需要首先学习操作系统基础知识。


我认为我目前最大的问题是,由于我没有背景知识,因此很难理解很多这些主题。我想,我需要通往这些领域的桥梁。
fender1901 2011年

@ fender1901:那可能是个问题。Linux内核所做的某些事情对于不了解操作系统功能的人来说确实很奇怪。您所提到的东西中的仿真器可能最容易理解,并且那里有简单的仿真器,通常用于早期的微型计算机。
David Thornley

1

您必须确定,是否可以使用所使用的平台/语言来执行低级功能:

  • 将字节存储到变量中
  • 按字节读取/写入文件,
  • 建立一个字节数组,访问元素,
  • 使用真正的程序功能,OOP,
  • 访问屏幕,键盘和插座。

嗯,听起来选择语言应该是随机的。


-2

这个问题有几个答案:1. Java和C#是高级语言,它们是在管理内存的现有操作系统上开发的,用于应用程序开发(这也使得制作可以在不同系统上运行的混合程序成为可能)。2.需要低级编程的领域是OS开发,驱动程序开发,AAA游戏开发等。通常,低级编程不是使用Java或C#进行的,而是使用C / C ++和汇编语言进行的。

仅凭这两点,我们可以说低级编程是单独完成的,在高级编程中不需要低级编程。需要低编程的部分(例如I / O)由解释器执行,解释器本身是用低级语言编写的(例如,java的JVM用C编写)。

您问题的主要答案是,这些东西不是使用Java和C#开发的,而是在C和Assembly中完成的,因此,与其寻找用Java和C#实现的方法,您不如学习C和Assembly,因为它们是编程,是的,最大的好处是,底层编写的程序小而快速。


对于几年前发布的先前6个答案所提出的观点,这似乎并没有提供任何实质性建议
gnat 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.