标准输入是如何实现的?

Sid*_*bra 1 haskell operating-system

在任何编程语言中,当我们要求用户输入时会发生什么?

假设在 Haskell 中我们有以下代码。

name <- getLine
putStrLn ("Hey " ++ name)
 
Run Code Online (Sandbox Code Playgroud)

将如何实施 getLine会是什么样子?

假设是正确的,这以某种方式侦听键盘中断,当按下 Enter 键时,该函数停止执行?如果是这样,那么它如何等待?是否有某种while循环?

Dan*_*ner 6

哇。在现代计算机上,这实际上是一个相当复杂的问题。该按键在进入等待它的程序之前经过了大量计算!

这是一个稍微简化的版本。

首先,程序向操作系统询问输入的块。如果自上次程序询问以来有一些输入,操作系统会立即返回该输入,并且您的程序会以愉快的方式继续运行。如果没有,操作系统会挂起程序并将其放在一个特殊的监视列表中。然后,操作系统切换到其他需要在处理器上运行的程序,或者,如果当前没有,则让计算机休眠几纳秒。计算机继续正常运行,处理其他程序并在没有可用程序时休眠,直到操作系统检测到应该进入您的程序的键盘输入。当它这样做时,它会参考它的观察列表,唤醒你的进程,并用它接收到的输入将控制权返回给你的程序。

所以这是一个循环:操作系统循环它的程序列表,等待各种事情(包括那些只是等待更多计算时间的程序),直到它接收到键盘输入。然后在你的程序中有第二个循环,它不断要求更多的输入块,直到其中一个包含换行符。

了解这两个循环很重要的原因,而不是仅仅说“是的,您的程序中有一个等待循环”,原因是:由于这种架构,您的程序不需要实现挂起计算直到键盘的逻辑中断火灾。等待那个中断的循环都是在操作系统中实现的。