这是一个可能无聊的问题,我应该知道它的答案.
十五年前左右,我所看到的很多C代码在平台特定的#ifdefs 中有大量的整数typedef .似乎我看过的每个程序或库都有自己的,互不兼容的typedef汤.我当时并不知道很多关于编程的内容,只是为了告诉编译器你想要使用什么类型的整数,它似乎是一个奇怪的箍.
我已经在脑海中编写了一个故事来解释那些typedef是关于什么的,但我实际上并不知道它是否属实.我的猜测基本上是当C首次开发和标准化时,没有意识到能够平台独立地获得特定大小的整数类型是多么重要,因此所有原始C整数类型可能是不同的不同平台上的尺寸.因此,每个尝试编写可移植C代码的人都必须自己编写代码.
它是否正确?如果是这样,如何被程序员预计将使用C整数类型?我的意思是,在一个低级别的语言中,有很多有点麻烦,能说"这是一个32位整数"并不重要吗?自从该语言在1989年被标准化以来,肯定有人认为人们会尝试编写可移植代码吗?
GHC具有类型级字面Nats.我可以阅读一些关于它们的内容,例如:
https://ghc.haskell.org/trac/ghc/wiki/TypeNats
不幸的是,似乎没有关于它们的文档,我尝试用它们几乎没有任何实际工作.
本页的评论18 提到了这个大小参数化Vecs的简单例子(我添加了LANGUAGE编译指示和一个import语句):
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
import GHC.TypeLits
data Vec :: Nat -> * -> * where
Nil :: Vec 0 a
(:>) :: a -> Vec n a -> Vec (n+1) a
(+++) :: Vec n a -> Vec m a -> Vec (n+m) a
Nil +++ bs = bs
(a :> as) +++ bs = a :> (as +++ bs)
Run Code Online (Sandbox Code Playgroud)
它当时没有工作,但后来认为实施被修改,以便这起作用.那是5年前......但它不适用于我的GHC 7.10.1: …
我希望能够使用Sierra 10.12.4在我的Mac上编写和调试x64程序集.人们会认为这不是一个特别困难或模糊的愿望,但尽管经过了数小时的努力和大量的在线搜索,我还没有成功,我也没有找到任何其他人.
我更喜欢使用NASM汇编程序,但如果必须,我会使用GAS或任何具有Intel语法的东西.(顺便说一句,请注意gdb和lldb都可以正常使用gcc编译的C文件.)
这是我的情况和我尝试过的:
NASM不起作用
我可以组装和链接文件并验证它是否有效.
$ nasm -f macho64 -g -F dwarf hello2.s -o hello2.o
$ gcc hello2.o -o hello2
$ ./hello2
Hello, world!
Run Code Online (Sandbox Code Playgroud)
但我不能用gdb调试它(注意我确实做了所有必要的代码签名):
$ gdb hello2
GNU gdb (GDB) 8.0
<snip>
Reading symbols from hello2...done.
(gdb) list
1 section .data
2
3 msg: db "Hello, world!", 0
4
5 section .text
6 global _main
7 extern _puts
8
9 _main:
10 push rbp
(gdb) break 10
Breakpoint 1 at 0x0: file hello2.s, line 10.
(gdb) run
Starting …Run Code Online (Sandbox Code Playgroud) 这是我真正问的一般问题的具体情况:假设我处于性能关键的代码部分并且我收到了一个值
x :: Maybe Int
Run Code Online (Sandbox Code Playgroud)
我知道这是一个Just Int而不是一个Nothing,但由于我的控制代码,我不能安排Int直接接收实际.我想要做
case x of
Just i -> whatever i
Run Code Online (Sandbox Code Playgroud)
但我不希望GHC插入任何检查或错误处理或跳转或任何东西; 只是将这些位解释为它们的形式Just i并让我处理后果.
这可能吗?(是的,我知道这是不应该经常做的事情.)
我正在尝试使用 C API 实现一个小示例。我收到一条错误消息,指出函数上下文与模块上下文不匹配,我无法弄清楚。
这是我的代码:
#include <stdio.h>
#include <llvm-c/Analysis.h>
#include <llvm-c/Core.h>
#include <llvm-c/Target.h>
#include <llvm-c/TargetMachine.h>
int
main() {
LLVMInitializeNativeTarget();
LLVMInitializeNativeAsmPrinter();
char* triple = LLVMGetDefaultTargetTriple();
char* error;
LLVMTargetRef target_ref;
if (LLVMGetTargetFromTriple(triple, &target_ref, &error)) {
printf("Error: %s\n", error);
return 1;
}
LLVMTargetMachineRef tm_ref = LLVMCreateTargetMachine(
target_ref,
triple,
"",
"",
LLVMCodeGenLevelDefault,
LLVMRelocStatic,
LLVMCodeModelJITDefault);
LLVMDisposeMessage(triple);
LLVMContextRef context = LLVMContextCreate();
LLVMModuleRef module = LLVMModuleCreateWithNameInContext("module_name", context);
// LLVMModuleRef module = LLVMModuleCreateWithName("module_name");
LLVMTypeRef param_types[] = {LLVMIntType(32), LLVMIntType(32)};
LLVMTypeRef func_type = LLVMFunctionType(LLVMIntType(32), param_types, 2, 0);
LLVMValueRef func = …Run Code Online (Sandbox Code Playgroud)