小编Cod*_*ous的帖子

什么时候新语言是适合这项工作的工具?

很长一段时间以来,我一直在尝试使用不同的语言来查找我想要的功能集,而我却找不到它.我的语言非常适合我的各种项目,但我想出了这些语言的交集,这使我能用一种语言完成99.9%的项目.我想要以下内容:

  • 建立在.NET之上或具有.NET实现
  • 在编译时和运行时都很少依赖于.NET运行时(这很重要,因为其中一个主要用例是嵌入式开发,其中.NET运行时是完全自定义的)
  • 编译器是100%.NET代码,没有非托管依赖项
  • 支持任意表达式嵌套(见下文)
  • 支持自定义运算符定义
  • 支持类型推断
  • 优化尾调用
  • 有明确的不可变/可变定义(准确 - 我喜欢这个,但没有它可以生活)
  • 支持用于强元编程的真实宏(绝对必备)

我一直在使用的两种主要语言是Boo和Nemerle,但我也玩过F#.

针对Nemerle的主要投诉:编译器有可怕的错误报告,实现是错误的,因为地狱(编译器和库),宏只能在函数内部或作为属性应用,并且它是相当重的依赖性(虽然不够,它是一个交易破坏者).
针对Boo的主要投诉:没有任意表达式嵌套(dealbreaker),宏很难写,没有自定义运算符定义(潜在的交易破坏者).
针对F#的主要投诉:难看的语法,难以理解的元编程,非自由许可(epic dealbreaker).

所以我想的越多,我就越想开发自己的语言.

优点:

  • 获取我想要的确切语法
  • 获得更快的周转时间; 难以量化,但我不会惊讶地看到1.5倍的开发人员生产力,特别是由于测试基础设施可以实现某些项目
  • 我可以轻松地向编译器添加自定义功能,以便与我的运行时很好地配合
  • 我得到了一些设计和完全按照我想要的方式工作的东西- 就像听起来像NIH一样,这将使我的生活更轻松

缺点:

  • 除非能够普及,否则我将不得不承担维护的责任.我知道我至少可以让Nemerle的人过来,因为我觉得每个人都想要更专业的东西,但这需要一个村庄.
  • 由于第一个骗局,我担心在专业环境中使用它.也就是说,我已经在使用Nemerle并使用我自己的自定义修改编译器,因为它们根本不能很好地维护它.
  • 如果它没有获得普及,找到开发人员会更加困难,在某种程度上保罗格雷厄姆可能甚至不会宽恕.

因此,基于所有这些,一般的共识是什么 - 这是一个好主意还是一个坏主意?或许更有帮助,我是否错过了任何重大利弊?

编辑:忘记添加嵌套示例 - 这是Nemerle中的一个案例:

def foo = 
    if(bar == 5)
        match(baz) { | "foo" => 1 | _ => 0 }
    else bar;
Run Code Online (Sandbox Code Playgroud)

编辑#2:想象一下如果存在将转换为该语言的代码类型的例子并不会受到影响(单独的S.Lott的回答可能足以让我远离这样做).代码大量使用自定义语法(操作码,:=,quoteblock等),表达式嵌套等.你可以在这里查看一个很好的例子:这里.

boo nemerle

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

替换系统命名空间中的类

我目前正在努力破解我的.NET操作系统在MS.NET/Mono之前运行(之前它只运行裸机),我遇到了一个小障碍.我需要实现我自己的System.Console,它与我的服务基础架构对话,我找不到一个好的方法来替换它,而不是1)没有链接到mscorlib(会很好地做),或者2)使用NotQuiteSystem替换的命名空间,会破坏兼容性.

有没有一种机制可以干净地替换System类而无需执行其中一项操作?

编辑:一个想法是使用Mono.Cecil重写对System.Console的引用到Renraku.System.Console或其他一些,但我更愿意在框架内工作,如果可能的话.

.net

14
推荐指数
1
解决办法
996
查看次数

在GTK中将页面重新连接到Notebook

我正在使用Notebook小部件来拉出选项卡式文件视图,并且我添加了代码以允许从现有Notebook中分离页面,这会生成一个带有单独Notebook的新窗口,只包含该页面.但是,我希望能够在多个笔记本之间移动页面.

Notebook.WindowCreationHook委托给我的页面从何而来,页面插件的笔记本电脑,以及x和y坐标它是在下降,但我不知道我怎么能告诉什么笔记本它被跌落到,如果有的话.这种重新附着是否有内置机制,或者我必须通过坐标?如果我必须使用坐标,那么获取它们并获取Notebook小部件的最佳方法是什么?如果需要的话,我可以存储我已经浮动的笔记本列表,但即使这样,代码也可以找出哪一个会有点难度(考虑到z顺序和所有有趣的东西).

gtk#

10
推荐指数
1
解决办法
609
查看次数

堆栈机器代码的SSA

我正在为堆栈机器(特别是CIL)编译器,我已经将代码解析为基本块的图形.从这里开始,我希望将SSA应用于这些方法,但这并不是太顺利.我的第一次尝试(使用平面列表,而不是图形)是迭代代码并保留一堆SSA ID(即,对于分配目标),在我生成赋值时推送它们,当它们弹出时弹出它们他们被使用了.这适用于单个基本块,但我根本无法弄清楚如何处理生成Φ函数.

我一直在徘徊的想法是将堆栈位置附加到SSA ID,然后在代码路径收敛时查看堆栈中仍然存在的内容,但这似乎不是做事的Right Way(TM).

是否有一种简单的算法可以跟踪多个代码路径中的堆栈操作并在收敛时确定冲突?

compiler-construction stack-machine ssa

9
推荐指数
1
解决办法
2043
查看次数

使用DLR进行(主要)静态语言编译

我正在构建一个针对.NET的编译器,我以前直接生成了CIL,但生成DLR树将使我的生活更容易.我支持一些动态功能,即运行时函数创建和ducktyping,但绝大多数代码都是完全静态的.

所以现在已经解释过,我有以下问题:

  • 除了MSDN博客上的小例子之外,DLR是否已用于静态编译?
  • 如果是这样,取得了什么样的表现?
  • 如果没有,有什么从根本上阻止这种情况?
  • 有没有比使用DLR或直接发射IL更好的生成代码的机制?

任何对此的见解或对博客/代码/会谈的参考将不胜感激.

.net compiler-construction cil dynamic-language-runtime

8
推荐指数
1
解决办法
592
查看次数

x86:ZF并不总是由AND更新?

我在x86上调试我的代码,如果结果不为零,问题跟踪到AND指令有时不会清除ZF标志.这是一段有问题的代码:

0257A9F9  mov         edx,dword ptr [ecx+18h] 
0257A9FC  and         edx,80000h 
0257AA02  int         3    
0257AA03  je          0257AA2A 

我在AND之后添加了一个断点用于调试.当它在断点EDX == 0x80000和ZF == 1时停止.但是如果EDX!= 0,则应清除ZF.当单步进入调试器时,代码完全正常,但在正常运行期间它会一致地失败.

这是调试器会话的屏幕截图.

任何提示?

如果这很重要,代码是由JIT生成的,那么我正在执行数据.

先感谢您.

x86 assembly

7
推荐指数
1
解决办法
678
查看次数

什么是一些良好的刚体动力学参考?

我至少不是数学家,但我对学习刚体物理学感兴趣(为了实现基本的3d物理引擎).在学校我只通过代数II学习数学,但我已经做了3d开发多年,所以我对向量,四元数,矩阵等有了相当不错的理解.我真正的问题是阅读复杂的公式等等,所以我在寻找对于一些体面的刚体动力学参考,将有一些意义.

有人有什么好的参考?

math physics

6
推荐指数
1
解决办法
1771
查看次数

是否有工具允许在正在运行的进程中检查.NET对象?

我正在考虑一种在运行时检查对象的工具,主要用于逆向工程,我想知道是否存在这样的事情.

我想到的方式是你有两个视图,一个对象图和一个类列表.从类列表中,您可以选择一个类,并在列表或图形中查看它的实例.在图中,您可以看到对象之间的连接,适当地注释,例如,哈希表中的键可以是哈希表对象和值之间的边缘上的标签.

您还可以提取对象属性列表并查看/操作其中的值..NET中提供的元数据会使这一点变得相当简单.

有谁知道可以做到这一点的工具?它似乎是一个非常有用的调试和逆向工程工具.

编辑:另外,另一个有用的功能是能够在查看二进制文件时设置名称映射.也就是说,如果你有一个混淆的二进制文件,你就可以交换混淆的占位符或真实姓名.这不会影响实际的二进制文件,只会影响检查器中的视图.

编辑第2部分:该工具应该能够在Vista和XP上运行并且支持x64.

.net reverse-engineering

6
推荐指数
1
解决办法
1540
查看次数

将VirtualKey映射到UWP应用程序中的char,与布局无关

我正在使用C#为HoloLens编写VNC客户端,我很难搞清楚如何处理键盘输入.KeyUp/KeyDown给了我一个Windows.System.VirtualKey对象,但似乎没有一个API将这些VirtualKeys(以及修饰符,例如shift)映射到它们在给定布局上表示的字符.例如,当它只是VirtualKey.F时,VirtualKey.Shift + VirtualKey.F =='F'与'f'.或Shift + 5在美国键盘上给出%.

在win32应用程序中,您将使用MapVirtualKey为您处理键盘布局 - 如何在UWP中处理?

c# keyboard input uwp

6
推荐指数
1
解决办法
1351
查看次数

处理UWP应用程序中的alt键

我正在使用KeyDown和KeyUp处理程序Window.Current.CoreWindow来捕获UWP的VNC应用程序中的击键.这有一个例外:alt(VirtualKey.Menu/LeftMenu/RightMenu)永远不会发送到我的应用程序.此外,alt +字母不会导致发送给处理程序.

我认为这是因为某些加速器处理程序在到达CoreWindow之前正在吃这些事件.有没有办法解决?

c# xaml uwp

5
推荐指数
1
解决办法
899
查看次数