小编Pau*_*rth的帖子

多核汇编语言是什么样的?

曾几何时,为了编写x86汇编程序,你会得到一条说明"加载EDX寄存器的值为5","递增EDX"寄存器等的指令.

对于具有4个核心(甚至更多)的现代CPU,在机器代码级别上它看起来就像有4个独立的CPU(即只有4个不同的"EDX"寄存器)?如果是这样,当你说"递增EDX寄存器"时,是什么决定了哪个CPU的EDX寄存器递增?现在x86汇编程序中是否存在"CPU上下文"或"线程"概念?

核心之间的通信/同步如何工作?

如果您正在编写操作系统,那么通过硬件公开哪种机制可以让您在不同的内核上安排执行?这是一些特殊的特权指示吗?

如果您正在为多核CPU编写优化编译器/字节码VM,那么您需要具体了解x86,以使其生成能够在所有内核中高效运行的代码?

对x86机​​器代码进行了哪些更改以支持多核功能?

cpu x86 assembly multicore smp

231
推荐指数
7
解决办法
4万
查看次数

在C#中创建一个空文件

在C#/ .NET中创建空文件的最简单/规范方法是什么?

到目前为止我能找到的最简单的方法是:

System.IO.File.WriteAllLines(filename, new string[0]);
Run Code Online (Sandbox Code Playgroud)

.net c#

177
推荐指数
4
解决办法
14万
查看次数

什么是函数式编程中的点自由风格?

我最近注意到的一个短语是"无点"风格的概念......

首先,有这样的问题,也是这一个.

然后,我在这里发现他们提到"另一个可能值得讨论的话题是作者不喜欢点自由风格."

什么是"免费"风格?有人可以给出简明的解释吗?它与"自动"曲线有关吗?

为了了解我的水平 - 我一直在教自己Scheme,并编写了一个简单的Scheme解释器...我理解"隐含"currying是什么,但我不知道任何Haskell或ML.

scheme functional-programming coding-style pointfree

87
推荐指数
4
解决办法
2万
查看次数

如何使用反射来确定数组的嵌套类型(元素类型)?

我有一个System.Type实例,其中"IsArray"返回true.

如何确定数组类型的"嵌套类型"?

Type GetArrayType(Type t)
{
    if(t.IsArray)
    {
        //  What to put here?
    }
    throw new Exception("Type is not an array");
}
Assert.That(GetArrayType(typeof(string[])), Iz.EqualTo(typeof(string));
Assert.That(GetArrayType(typeof(Foo[])), Iz.EqualTo(typeof(Foo));
Run Code Online (Sandbox Code Playgroud)

.net c# reflection

49
推荐指数
1
解决办法
1万
查看次数

穷人为C#"lexer"

我正在尝试用C#编写一个非常简单的解析器.

我需要一个词法分析器 - 让我将正则表达式与标记相关联的东西,所以它读取正则表达式并给我回符号.

看起来我应该能够使用正则表达式进行实际繁重的工作,但我看不出一个简单的方法.首先,Regex似乎只能处理字符串,而不是流(为什么会这样!?!?).

基本上,我想要一个以下接口的实现:

interface ILexer : IDisposable
{
    /// <summary>
    /// Return true if there are more tokens to read
    /// </summary>
    bool HasMoreTokens { get; }
    /// <summary>
    /// The actual contents that matched the token
    /// </summary>
    string TokenContents { get; }
    /// <summary>
    /// The particular token in "tokenDefinitions" that was matched (e.g. "STRING", "NUMBER", "OPEN PARENS", "CLOSE PARENS"
    /// </summary>
    object Token { get; }
    /// <summary>
    /// Move to the next token …
Run Code Online (Sandbox Code Playgroud)

c# regex lexer

32
推荐指数
3
解决办法
2万
查看次数

为什么Scheme不支持一流的环境?

我一直在阅读SICP(计算机程序的结构和插入)并且非常兴奋地发现这种奇妙的特殊形式:"make-environment",他们证明它与eval结合使用作为编写模块化代码的一种方式(摘录)关于"包裹"的第4.3节:

(define scientific-library
  (make-environment
   ...
   (define (square-root x)
    ...)))
Run Code Online (Sandbox Code Playgroud)

然后他们演示了它的工作原理

((eval 'square-root scientific-library) 4)
Run Code Online (Sandbox Code Playgroud)

在他们的榜样,他们然后去证明正是我想要的使用-在计划做"OO"风格的优雅简约的方式......他们"利弊"在一起"类型",这实际上是什么由"make-environment"特殊形式(即vtable)和arg("the state")返回...

我非常兴奋,因为这正是我一直在寻找的一种方法,可以在Scheme中"按符号"进行多态调度,而无需编写大量显式代码或宏.

即我想创建一个"对象",其中包含两个函数,我在不同的上下文中调用...但我不想通过"car"和"cdr"来引用它们,我想两个都声明并用它们的象征性名称来评估它们.

无论如何,当我读到这篇文章时,我迫不及待想回家试试看.

想象一下,当我在PLT计划和Chez计划中经历以下事件时,我感到很失望:

> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
Run Code Online (Sandbox Code Playgroud)

在SICP中引用了"make-environment"怎么了?这一切看起来都很优雅,正是我想要的,但它似乎并没有得到任何现代Scheme解释器的支持?

理由是什么?简单地说"make-environment"有不同的名字吗?

稍后会发现更多信息

我看了看在线版:

http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3

我正在阅读的是SICP的第一版.第二版似乎已经用关于非确定性编程和"放大器"运算符的部分取代了关于包的讨论.

scheme racket

18
推荐指数
2
解决办法
2687
查看次数

在SICP中的统一算法中看似不必要的情况

我试图在这里理解SICP中描述的统一算法

特别是,在"尽可能扩展"的过程中,有一个检查(标有星号"*"的第一个地方),它检查右手"表达式"是否是已经绑定到某个东西的变量.当前帧:

(define (extend-if-possible var val frame)
  (let ((binding (binding-in-frame var frame)))
    (cond (binding
       (unify-match
        (binding-value binding) val frame))
      ((var? val)                      ; *** why do we need this?
       (let ((binding (binding-in-frame val frame)))
         (if binding
             (unify-match
              var (binding-value binding) frame)
             (extend var val frame))))
      ((depends-on? val var frame)
       'failed)
      (else (extend var val frame)))))
Run Code Online (Sandbox Code Playgroud)

相关评论指出:

"在第一种情况下,如果我们尝试匹配的变量没有绑定,但我们试图匹配它的值本身就是一个(不同的)变量,有必要检查该值是否绑定,并且如果是的话,要匹配它的价值.如果比赛的双方都没有约束,我们可能会绑定到另一方."

但是,我想不出这实际上是必要的情况.

认为,它正在谈论的是你目前可能有以下框架绑定的地方:

{?y = 4}
Run Code Online (Sandbox Code Playgroud)

然后要求"extendIfPossible"绑定从?z到?y.

当出现"*"检查时,当被要求用"?y"扩展"?z"时,我们看到"?y"已经绑定到4,然后递归地尝试将"?z"与"4"统一,这导致我们用"?z = 4"扩展框架.

没有检查,我们最终只用"?z =?y"扩展框架.但在这两种情况下,只要?z还没有被其他东西绑定,我就没有看到问题.

请注意,如果- Z 已经被绑定到别的东西,然后代码没有达到部分标有"*"(我们早就递归到什么?ž统一已经匹配).

经过深思熟虑之后,我意识到可能存在某种形式的争论,即生成一个"最简单"的MGU(Most General Unifier).例如,您可能希望MGU具有引用其他变量的最少数量的变量...也就是说,我们宁愿生成替换{?x = 4,?y …

scheme computer-science sicp unification

13
推荐指数
1
解决办法
717
查看次数

(Num a)vs Integer类型推断

考虑以下Haskell函数:

sign a
  | a < 0 = (-1)
  | a > 0 = 1
  | otherwise = 0
Run Code Online (Sandbox Code Playgroud)

当我把它加载到ghci我希望:t sign是:

sign :: (Num a, Ord a) => a -> Integer
Run Code Online (Sandbox Code Playgroud)

相反,它推断为:

*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
Run Code Online (Sandbox Code Playgroud)

同样,如果我要求整数的类型5,我期望Integer,但我得到了

*Main> :t 5
5 :: Num a => a
Run Code Online (Sandbox Code Playgroud)

我不了解Haskell的类型.问题是,如果我所知道的返回类型sign是它是Num类型类的一个实例,那么我不应该将它的返回值传递给这个函数:

double :: Integer -> Integer
double x = x * 2
Run Code Online (Sandbox Code Playgroud)

也就是说,我的 …

haskell

13
推荐指数
3
解决办法
1038
查看次数

为什么Linq扩展方法不是IEnumerator而不是IEnumerable?

有很多Linq算法只需要通过输入一次,例如Select.

然而,所有Linq扩展方法都位于IEnumerable而不是IEnumerator上

    var e = new[] { 1, 2, 3, 4, 5 }.GetEnumerator(); 
    e.Select(x => x * x); // Doesn't work 
Run Code Online (Sandbox Code Playgroud)

这意味着您无法在任何正在读取"已打开"的流的情况下使用Linq.

对于我目前正在处理的项目,这种情况发生了很多 - 我想返回一个IEnumerator,其IDispose方法将关闭流,并让所有下游Linq代码对此进行操作.

简而言之,我有一个"已经打开"的结果流,我可以将其转换为适当的一次性IEnumerator - 但不幸的是,所有下游代码都需要IEnumerable而不是IEnumerator,即使它只会执行一次"传递".

即我想在各种不同的来源(CSV文件,IDataReaders等)上"实现"这种返回类型:

class TabularStream 
{ 
    Column[] Columns; 
    IEnumerator<object[]> RowStream; 
}
Run Code Online (Sandbox Code Playgroud)

为了获得"列",我必须已经打开了CSV文件,启动了SQL查询,或者其他什么.然后我可以返回一个"IEnumerator",其Dispose方法关闭资源 - 但所有Linq操作都需要一个IEnumerable.

我所知道的最好的解决方法是实现一个IEnumerable,其GetEnumerator()方法返回唯一的IEnumerator,如果某些东西试图进行两次GetEnumerator()调用,则会抛出错误.

这一切听起来还不错,还是有更好的方式让我以一种易于使用Linq的方式实现"TabularStream"?

.net c# linq

12
推荐指数
2
解决办法
3530
查看次数

.NET反射:检测IEnumerable <T>

我正在尝试检测Type对象的特定实例是否是通用的"IEnumerable"...

我能想到的最好的是:

// theType might be typeof(IEnumerable<string>) for example... or it might not
bool isGenericEnumerable = theType.GetGenericTypeDefinition() == typeof(IEnumerable<object>).GetGenericTypeDefinition()
if(isGenericEnumerable)
{
    Type enumType = theType.GetGenericArguments()[0];
    etc. ...// enumType is now typeof(string) 
Run Code Online (Sandbox Code Playgroud)

但这似乎有点间接 - 是否有更直接/更优雅的方式来做到这一点?

.net generics reflection

11
推荐指数
1
解决办法
3991
查看次数