我们经常听说C是一种低级语言,但它有多低?我所知道的最低级别是使用指针的内存管理.我还有更进一步的发现水平吗?"靠近硬件"是什么意思?"靠近硬件"的C怎么样?
我试图从macos App模拟鼠标点击iphone模拟器,因为我正在使用CGEvents.
iPhone模拟器的进程ID为33554
let point = CGPoint(x: 500 , y:300)
let eventMouseDown = CGEvent(mouseEventSource: nil, mouseType: .leftMouseDown, mouseCursorPosition: point, mouseButton: .left)
let eventMouseUp = CGEvent(mouseEventSource: nil, mouseType: .leftMouseUp, mouseCursorPosition: point, mouseButton: .left)
eventMouseDown?.postToPid(33554)
eventMouseUp?.postToPid(33554)
Run Code Online (Sandbox Code Playgroud)
我也注意到,当ios模拟器窗口被聚焦时它模拟鼠标点击并且仅适用于此工具栏但不适用于模拟器,例如,如果我将CGPoint更改为(0,30)它将单击模拟器选项
但当我提供CGPoints点击iOS模拟器内的应用程序时它无法正常工作

但是,我可以使用键盘事件发送到模拟器
let keyboardDown = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: true)
let keyboardUp = CGEvent(keyboardEventSource: nil, virtualKey: 6, keyDown: false)
keyboardDown?.postToPid(33554)
keyboardUp?.postToPid(33554)
Run Code Online (Sandbox Code Playgroud) 那么,至少有两种低级方法可以确定给定的数字是否是偶数:
1. if (num%2 == 0) { /* even */ }
2. if ((num&1) == 0) { /* even */ }
Run Code Online (Sandbox Code Playgroud)
我认为第二种选择更加优雅和有意义,而这正是我经常使用的选择.但这不仅仅是品味问题; 实际性能可能会有所不同:通常按位操作(例如logial和here)比mod(或div)操作更有效.当然,你可能会争辩说有些编译器无论如何都能优化它,我同意......但有些人不会.
另一点是,对于经验不足的程序员来说,第二个可能有点难以理解.关于这一点,我回答说,如果这些程序员花很短的时间来理解这种语句,它可能只会让每个人受益.
你怎么看?
只有当num无符号整数或具有二进制补码表示的负数时,给定的两个片段才是正确的. - 正如一些评论所说的那样.
我发现了很多关于这个影子空间的话题,但我找不到答案,所以我的问题是:
在进入程序之前,我需要从堆栈指针中减去多少字节?
我应该在减去"阴影空间"之前将过程参数推送到堆栈吗?
我已经拆解了我的代码,但我找不到逻辑.
在信息学理论中,我一直听到并阅读有关高级和低级语言的知识.
但我不明白为什么这仍然相关,因为除了今天使用的汇编程序之外没有任何(相关的)低级语言.
所以你得到:
低级别
绝对不是低级别的
高水平
如果汇编程序是低级别的,你怎么能把例如C放到同一个列表中.我的意思是:与汇编程序相比,C是非常高级的.即使对于COBOL,Fortran等也是如此.
我想知道,是否有可能将haskell强大的类型系统集成到像C这样的语言中,并且仍能够进行高效的低级编程?
我对Scala非常满意,只是喜欢它:)
但有时我真的想要更低级别,没有JVM并使用"酷"CPU等功能,如SSE等.
那么除了Scala之外什么是第二语言呢?
它应该是:
所以基本上我想要一个Scala,我可以在我想要的时候抛出内联汇编程序:)我认为,这样的语言不存在,但也许有一些接近.
那么什么是一个好的选择?C++?,D?,OCaml?
我用C++(15年前)编写了一些编程,而使用OCaml则编程很少.在这两种情况下,我只解决了一些问题,而且从来没有对语言本身进行过"深入".
我有一个用C++编写的服务器应用程序.启动后,它在x86 Linux上使用大约480 KB的内存(Ubuntu 8.04,GCC 4.2.4).我认为480 KB是一个过多的内存:服务器甚至没有做任何事情,没有客户端连接到服务器.(另请参阅下面的评论,其中我解释了为什么我认为480 KB是大量内存.)服务器在初始化期间唯一做的事情就是产生一个或两个线程,设置几个套接字,以及其他简单的东西.非常记忆密集.
请注意,我在谈论实际内存使用情况,而不是VM大小.我通过在空闲笔记本电脑上启动我的服务器的100个实例来测量它,并在启动服务器实例之前和之后用"免费"测量系统内存使用情况.我已经考虑了文件系统缓存和类似的东西.
经过一些测试后,看起来C++运行时中的某些东西会导致我的服务器使用这么多内存,即使服务器本身没有做任何事情.例如,如果我插入
getchar(); return 0;
Run Code Online (Sandbox Code Playgroud)
之后
int main(int argc, char *argv[]) {
Run Code Online (Sandbox Code Playgroud)
然后每个实例的内存使用量仍为410 KB!
我的应用程序仅依赖于Curl和Boost.我有很多C编程经验,我知道C库在使用之前不会增加内存消耗.
我发现的其他事情:
我的结论如下:
我记得几年前关于C++动态链接器问题的一些KDE讨论.之后的Linux C++动态链接器导致KDE C++应用程序启动时间慢,内存消耗大.据我所知,这些问题已在C++运行时修复.但类似的东西可能是我所看到的过度记忆消耗的原因吗?
来自gcc /动态链接专家的答案非常感谢.
对于那些好奇的人,有问题的服务器是Phusion Passenger的日志记录代理:https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp
我理解currying的概念是什么,并且知道如何使用它.这些不是我的问题,而是我很好奇这个实际上是如何在比Haskell代码更低的层次上实现的.
例如,当(+) 2 4curried时,是一个指向2维持的指针,直到4传入?甘道夫是否会缩短时空?这个魔法是什么?
low-level ×10
c++ ×4
c ×2
haskell ×2
64-bit ×1
assembly ×1
currying ×1
elf ×1
high-level ×1
libraries ×1
macos ×1
mouseevent ×1
numbers ×1
pointers ×1
readability ×1
scala ×1
swift ×1
type-safety ×1
type-systems ×1