- 浏览: 3053330 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
原本我一直以为nop对程序语义应该没什么影响的,呜,我错了。
之前一直觉得很奇怪,为什么不开/o(/optimize,优化)开关来编译C#程序的话,生成的IL代码里会有很多nop。后来才知道那些nop是在一些语句或者表达式片段的边界放的,目的是为了提供更好的调试体验:有些代码被编译之后可能会变得比较难下断点,所以插入nop来占位,使得原本难下断点的地方能被设置断点。
但是插入nop的代价不只是使程序的运行速度降低;更糟糕的是,它可能会改变程序的语义使本来应该正常的程序变得无法正确运行。
Eric Lippert在去年的一篇blog里提到了这点。他举的例子是C#里的lock语句:
会被编译成类似这样:
这本来没什么问题,但是当C#编译器在Enter()与try之间插入nop时问题就来了:如果另外一个线程在当前线程刚获取锁在nop的时候引发了线程终止异常,那么finally子句就永远不会被执行,于是就是……死锁。
据说这个问题在C# 3.0里也没解决。不过还好遇到这种问题的可能性很小。
Hmm。果然遇上多线程之后很多“常识”都得重新想想。
之前一直觉得很奇怪,为什么不开/o(/optimize,优化)开关来编译C#程序的话,生成的IL代码里会有很多nop。后来才知道那些nop是在一些语句或者表达式片段的边界放的,目的是为了提供更好的调试体验:有些代码被编译之后可能会变得比较难下断点,所以插入nop来占位,使得原本难下断点的地方能被设置断点。
但是插入nop的代价不只是使程序的运行速度降低;更糟糕的是,它可能会改变程序的语义使本来应该正常的程序变得无法正确运行。
Eric Lippert在去年的一篇blog里提到了这点。他举的例子是C#里的lock语句:
lock(expression) statement
会被编译成类似这样:
temp = expression; System.Threading.Monitor.Enter(temp); try { statement } finally { System.Threading.Monitor.Exit(temp); }
这本来没什么问题,但是当C#编译器在Enter()与try之间插入nop时问题就来了:如果另外一个线程在当前线程刚获取锁在nop的时候引发了线程终止异常,那么finally子句就永远不会被执行,于是就是……死锁。
据说这个问题在C# 3.0里也没解决。不过还好遇到这种问题的可能性很小。
Hmm。果然遇上多线程之后很多“常识”都得重新想想。
发表评论
-
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22410(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对象的重量
2011-08-21 17:15 0http://domino.research.ibm.com/ ... -
GetCustomAttribute()每次都返回新Attribute实例
2009-11-10 10:30 0Jeffrey Zhao: 一次失败的尝试(上):原来GetC ... -
委托与方法和隐藏参数
2009-09-07 15:32 3312之前正好发了些帖子是关于CLR里的委托的,然后看到老赵说事件也 ... -
要让CLR挂掉的话(第二弹)……
2009-09-04 03:26 12880(Disclaimer:如果需要转 ... -
要让CLR挂掉的话……
2009-09-02 16:53 4786(Disclaimer:如果需要转载请先与我联系。 作者:Re ... -
趣味编程:函数式链表的快速排序
2009-08-31 08:53 3451(恢复自2009-08-28的备份 ... -
事件处理器导致内存泄漏
2009-08-25 15:03 0Memory leak via event handlers ... -
C# 3.0的类型推导
2009-08-23 12:24 0Howard Dierking: Lambda, Lambda ... -
把lock的意思给弄混了 T T
2009-08-20 17:49 2605悲剧啊……前几天有个同学不停问我Java里的同步问题,今天写C ... -
把IEnumerable<T>和IObservable<T>粘起来?
2009-07-23 03:02 0Channel 9: Expert to Expert: Br ... -
Scott Peterson: Variance, Thy Name is Ambiguity
2009-07-01 23:49 1639原文作者:Scott Peterson 原文地址:http:/ ... -
void无法协变
2009-06-30 11:17 0Eric Lippert The void is invari ... -
同一个表达式算出来的浮点数结果会不相等?
2009-05-30 03:27 0浮点数有很多可把玩的地方。例如下面这段C程序: #includ ... -
C#开始默认引用Microsoft.CSharp.dll
2009-05-20 16:14 0记得VB6的运行时么?留意到VB.NET的程序都需要额外的VB ... -
反射与显式实现接口的方法
2009-05-20 11:43 4063在前一帖里,我用到了下面三处Expression.Call() ... -
看到一个关于ref参数与多态的问题,记一下
2009-05-18 10:48 1945刚才读到Alan McGovern的一帖,问为什么形式参数是r ... -
C#的+=运算符两例
2009-05-06 18:18 2041刚偶尔看到了justjavac写的java解惑 - 半斤八两( ...
相关推荐
NOP指令在程序设计中有着重要的作用,尤其是在调试、延迟、对齐代码或填充空间时。 描述中提到的“延时和键盘显示功能”是指通过NOP指令来实现程序的延时效果,并且可能涉及到键盘输入的处理和显示。在实际编程中,...
以下是对"Ollydbg篇NOP位移法"这一主题的详细说明。 **什么是NOP指令?** NOP(No Operation)是汇编语言中的一种指令,它在执行时不做任何操作,通常用作填充空间或调整指令地址。在16位x86架构下,NOP指令通常...
标题中的“nop19中文包”多次重复,可能是指一个针对NOP19编程语言或框架的中文资源包。NOP19可能是一个特定的版本或者一个专门为学习或开发目的设计的工具。由于信息有限,我们首先假设这是一个编程环境或库的中文...
此外,使用NOP指令进行延时会占用宝贵的CPU资源,如果需要执行其他任务,则可能会影响程序的响应速度和效率。在现代的嵌入式程序设计中,往往会使用定时器/计数器、中断、以及外围硬件提供的定时功能来实现更为精确...
作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用...
"单片机C语言中nop函数使用及延时计算" 单片机C语言中nop函数使用及延时计算是指在单片机C语言编程中使用nop函数来产生短延时的效果。nop函数相当于汇编语言中的NOP指令,延时几微秒。NOP指令为单周期指令,可以由...
单片机C语言中_nop_函数使用及延时计算 单片机C语言中_nop_函数使用是指在单片机的C语言编程中使用_nop_函数来产生短延时的效果。标准的C语言中没有空语句,但是在单片机的C语言编程中,经常需要用几个空指令产生短...
Nop平台低代码前端设计源码:该项目基于Javascript开发,包含1549个文件,主要使用TypeScript、...nop-chaos是Nop平台的前端部分,采用了Vue3.0、ant-design-vue、百度AMIS、logicflow、xspreadsheet等技术实现。
"单片机c语言中nop函数的使用方法和延时计算" 单片机C语言中NOP函数的使用方法和延时计算是单片机编程中非常重要的一个方面。NOP函数是一个空指令,它不执行任何操作,但可以产生短延时的效果。在Keil C51中,可以...
总结来说,"slf4j-nop-1.5.8-sources.jar.zip" 提供的是SLF4J NOP绑定的源代码,适用于不需要日志记录或者对性能有极致追求的场景。了解并使用SLF4J可以帮助开发者创建更加灵活、可维护的项目,并能轻松地调整日志...
国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基于...综合能力远远高于国内的一些程序架构糟糕的.net商城程序
小小nop有何作用?可以延时,等待清空缓存位,清除flag位……
hibernate 3.5必需包。。 The slf4j NOP binding
3. **性能优化**:在不需要日志的地方,SLF4J-NOP避免了执行日志记录方法的开销,有助于提高应用程序的性能。 在实际项目中,通常会在开发和测试阶段使用更详细的日志实现,如Logback或Log4j,以便于调试和问题追踪...
标准的C语言中没有空语句。但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。 这在汇编语言中很容易实现,写几个nop就行了。
NOP开源项目是一个基于C#开发的电子商务平台,它为在线商家提供了一套全面的解决方案,集成了购物车、订单管理、库存控制、客户关系管理等多个关键功能。该项目以开源、免费的形式提供,允许开发者根据自身需求进行...
1 NOP 程序起始命令(空指令) 2 *cycle 注释:循环运行 3 MOVJ C00000 VJ=100.00 point :距对中台大概150mm的位置 4 PULSE OT#(68) T=0.50 RB时间测量point11 (取出待机位置) 5 *Loop1 abel:Loop1 6 ...
slf4j-nop-1.7.30,开发的时候找了好久,好东西当然需要分享,希望大家能喜欢!!!good
"slf4j-nop-1.5.2.jar"是SLF4J的一个特定实现,称为"No Operation"或NOP logger。这个实现实际上不做任何日志记录,只是简单地忽略所有的日志请求,适用于那些不需要日志功能或者希望最小化运行时依赖的应用。 在...
### TM1812程序实例解析 #### 一、概述 本篇文章将深入解析一个基于51单片机实现的TM1812驱动程序实例。该实例代码展示了如何通过控制信号来驱动TM1812 LED显示模块,并实现动态显示效果。TM1812是一种用于控制LED...