小编Jon*_*rop的帖子

是否可以完全以托管.NET语言编写JIT编译器(本机代码)

我正在编写一个编写JIT编译器的想法,我只是想知道理论上是否有可能在托管代码中编写整个东西.特别是,一旦你将汇编程序生成为字节数组,你如何跳转到它开始执行?

.net c# f# jit

82
推荐指数
4
解决办法
5777
查看次数

C#vs F#用于程序化WPF GUI

我正在尝试决定在企业软件开发中使用F#和C#的方法.数学代码的F#是不费吹灰之力的.我喜欢F#用于GUI工作,即使它缺乏GUI设计器支持,但当然,C#GUI人员在工业中有更多的资源可用性.但是,我不太熟悉C#+ XAML GUI开发,所以我担心引入偏见.

在一个客户端的情况下,他们有许多类似的静态(每年更改)的GUI和一些非常动态的其他GUI(例如业务规则引擎).他们已经拥有F#代码并且已经投资F#培训,因此技能可用性不是问题.我的印象是C#+ XAML可以让你轻松地构建静态GUI(一些滑块,几个文本框等),但我看不出GUI设计师如何帮助像业务规则引擎这样的程序化GUI.我是否正确地认为维持一组大多数静态GUI(例如向100个单独的GUI添加新字段)需要手工劳动?也,

c# wpf xaml f#

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

在F#中同时进行Lexing和解析

在使用fslex和fsyacc时,是否有一种简单的方法可以让lexing和解析同时运行?

f# parsing fsyacc fslex

37
推荐指数
1
解决办法
1244
查看次数

解析器组合器可以提高效率吗?

大约6年前,我在OCaml中对自己的解析器组合器进行了基准测试,结果发现它们比当时提供的解析器生成器慢〜5倍.我最近重新审视了这个主题,并对Haskell的Parsec和一个用F#编写的简单的手动优先攀爬解析器进行了基准测试,并惊讶地发现F#比Haskell快25倍.

这是我用来从文件中读取大型数学表达式的Haskell代码,解析并评估它:

import Control.Applicative
import Text.Parsec hiding ((<|>))

expr = chainl1 term ((+) <$ char '+' <|> (-) <$ char '-')

term = chainl1 fact ((*) <$ char '*' <|> div <$ char '/')

fact = read <$> many1 digit <|> char '(' *> expr <* char ')'

eval :: String -> Int
eval = either (error . show) id . parse expr "" . filter (/= ' ')

main :: IO ()
main = do
    file <- …
Run Code Online (Sandbox Code Playgroud)

f# haskell parsec parser-generator parser-combinators

33
推荐指数
4
解决办法
6967
查看次数

现代x86成本模型

我正在编写一个带有x86后端的JIT编译器,并且随时学习x86汇编器和机器代码.大约20年前我使用ARM汇编程序,并对这些体系结构之间的成本模型差异感到惊讶.

具体来说,内存访问和分支在ARM上很昂贵,但在x86上等效的堆栈操作和跳转很便宜.我相信现代x86 CPU比ARM内核做更多的动态优化,我发现很难预测它们的影响.

编写x86汇编程序时要记住什么是好的成本模型?哪些指令组合便宜又昂贵?

例如,如果它总是生成用于加载整数或跳转到偏移的长格式,即使整数很小或偏移量接近但这会影响性能,我的编译器会更简单吗?

我还没有做任何浮动点,但我很快就会接受它.普通代码和浮动代码之间的相互作用有什么不明显的吗?

我知道有很多关于x86优化的参考文献(例如Michael Abrash),但我有一个预感,而不是几年前的任何东西都不适用于现代的x86 CPU,因为它们最近发生了很大的变化.我对么?

floating-point performance x86 assembly micro-optimization

30
推荐指数
2
解决办法
2607
查看次数

引导集合以提高性能

在他的开创性论文中,Chris Okasaki描述了数据结构自举技术.如果有的话,使用这种技术来改善数据结构的局部性有什么用呢?

例如,平衡二叉树通常用于创建纯函数集和字典,但由于改进的局部性,小数组的散列特征通常明显更快.

collections bootstrapping data-structures

25
推荐指数
1
解决办法
926
查看次数

纯功能并发跳过列表

跳过列表(Pugh,1990)提供了具有对数时间操作的排序字典,如搜索树,但跳过列表更适合并发更新.

是否有可能创建一个有效的纯功能并发跳过列表?如果没有,是否有可能创建任何类型的高效纯函数并发排序字典?

f# haskell scala clojure purely-functional

24
推荐指数
3
解决办法
5662
查看次数

在.NET上更快地解析数字

我编写了两个函数,将一串以空格分隔的整数转换为int数组.第一个函数使用Substring然后应用于System.Int32.Parse将子字符串转换为int值:

let intsOfString (s: string) =
  let ints = ResizeArray()
  let rec inside i j =
    if j = s.Length then
      ints.Add(s.Substring(i, j-i) |> System.Int32.Parse)
    else
      let c = s.[j]
      if '0' <= c && c <= '9' then
        inside i (j+1)
      else
        ints.Add(s.Substring(i, j-i) |> System.Int32.Parse)
        outside (j+1)
  and outside i =
    if i < s.Length then
      let c = s.[i]
      if '0' <= c && c <= '9' then
        inside i (i+1) …
Run Code Online (Sandbox Code Playgroud)

c# performance f# parsing

23
推荐指数
4
解决办法
3998
查看次数

struct元组的性能

下面的F#程序定义了一个函数,该函数返回表示为struct tuples的两对int中的较小者,并且运行需要1.4s:

let [<EntryPoint>] main _ =
  let min a b : int = if a < b then a else b
  let min (struct(a1, b1)) (struct(a2, b2)) = struct(min a1 a2, min b1 b2)
  let mutable x = struct(0, 0)
  for i in 1..100000000 do
    x <- min x (struct(i, i))
  0
Run Code Online (Sandbox Code Playgroud)

如果我将CIL反编译为C#,我会得到以下代码:

    public static int MinInt(int a, int b)
    {
        if (a < b)
        {
            return a;
        }
        return b;
    }

    public static System.ValueTuple<int, int> MinPair(System.ValueTuple<int, int> _arg2, …
Run Code Online (Sandbox Code Playgroud)

c# performance f# tuples algebraic-data-types

20
推荐指数
1
解决办法
895
查看次数

连接红黑树

OCaml标准库有一个很棒的Set实现,它使用非常有效的分而治之算法来计算union两组.我相信它从一个集合中获取整个子树(不仅仅是单个元素)并将它们插入到另一个集合中,在必要时进行重新平衡.

我想知道这是否需要OCaml使用的AVL树中保存的高度信息,或者是否也可以使用红黑树.例如,是否可以更有效地连接一对红黑树,而不是简单地迭代第二棵树,将其元素附加到第一棵树的末尾?

algorithm red-black-tree data-structures

19
推荐指数
1
解决办法
6827
查看次数