.NET和动态语言

2008 年 11 月 04 日

在今后的数月和数年内,动态语言将成为.NET 平台上越来越重要的角色。微软在动态语言和 CLR 之间的集成作了大量的投资。

在我们进入集成工作之前,需要花点时间来讨论一下开源。在.NET 平台上最重要的动态语言是 IronPython 和 IronRuby。这两种语言都采用的是开源协议,它们并不按照正常的计划修改语言。所有由微软支持的开源语言都有两个发布周期。针对开源项目会有发布前 / 发布的通常计划,这会有许多的展示版本。与此同时还会有正式的微软首选的进行过深入测试的版本。公司和开发人员可以选择任一种发布方式的版本,它们都是基于同样的代码。

至于集成,都是围绕着 IDynamicObject 接口。这种方法作为一个方法绑定器以允许每个对象使用的这些语言的语义。开箱即用的语言包括 IronPython,IronRuby,JScript 和 COM。是的,COM 被认为是后期绑定和动态方法调用方面的一门动态语言。

在特定的语言绑定器之外,开发人员可以在单一的类上使用特别规则。最简单的方法是从使用抽象类 DynamicObject 开始。下面是可以被重写自定义行为的动作清单。你看这个清单的时候,你会发现你所使用的语言的语法并不支持某些动作。

  • GetMember
  • SetMember
  • DeleteMember
  • UnaryOperation
  • BinaryOperation
  • Convert
  • InvokeMember
  • Invoke
  • CreateInstance
  • GetIndex
  • SetIndex
  • DeleteIndex

开发人员并不需要实现所有的这些方法。例如,它们可以只通过支持 SetMember 和 GetMember 来创建一个属性包。正是这样设计的方式,一个真正动态的类可以用任何语言来编写,甚至是像 C#那样静态类型的语言。

IronPython 在最初是有它自己语言特定的语言抽象语法树。在 DLR 的开发过程中发现在不同语言之间的差异事实上是很小的。最后,确定 LINQ 表达式树(LINQ Expression)是任何动态语言所需要的东西。

将在.NET 4 上增加所缺少的特性是分配、流程控制(循环和 goto)以及动态调度节点。动态调度节点是语言特定和用于方法调用和重载决策的特定于语言的规则。

特定于语言语义的一个示例是 2 乘以 20 亿的结果。如果表达式树表达 IronRuby 或者 IronPython 的语义,它将返回 40 亿。使用 C#的默认语义将会溢出以及 VB 的语义将抛出一个异常。也许想知道为什么,IronRuby 和 IronPython 在可能发生溢出的时候会自动转换 Int32 到 BigInteger。

为了提高性能,DLR 使用一种新的 call site 机制。DLR 中的 Call sites 是动态调用基于委托的静态类型化的表示。由于创建委托的开销是很大的,委托被缓存到一个列表中。对于每一个调用,从列表中找到一个匹配的。如果看到一个之前没见过的类型,一个新的基于共享抽象语法树的类型被添加到列表中。

要确定一个参数类型是否看到过,每个语言需要提供一个 MetaObject。这用于检查参数类型是否与过去所见过的类型匹配以及如果类型匹配的话如何处理。

创建新的 MetaObject 的能力允许开发人员替换掉昂贵的基于哈希表的名称,而去查找代表了被调用的方法的实际表达式树。这取决于它是如何编写的,甚至可以超过静态语言世界中所看到的性能。

查看英文原文:.NET and Dynamic Languages

2008 年 11 月 04 日 21:481037
用户头像

发布了 45 篇内容, 共 48920 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

美国区块链政策大盘点

CECBC区块链专委会

区块链 政策 货币

Flutter Bloc模式

码爷

flutter ios 程序员

文科妹子都会用 GitHub,你这个工科生还等什么

沉默王二

GitHub

高交会科技盛宴:“科技改变生活,创新驱动发展”

WX13823153201

高交会

阿里大牛说:你凭什么搞不懂SpringBoot,Cloud,Nginx与Docker

小Q

Java 学习 编程 架构 面试

阿里P8架构师“墙裂”推荐:Java程序员必读的架构进阶热门书籍,值得学习!

Java成神之路

Java 程序员 架构 面试 编程语言

HTTPDNS开源 Android SDK,赋能更多开发者参与共建

应用研发平台EMAS

android 阿里云 开源 httpdns 移动研发平台

数字投票时代即将到来

CECBC区块链专委会

数字投票

【Swift实现代码】iOS架构模式之MVP

码爷

ios swift 架构

握草!美团P8整理的280页超详细Docker实战文档简直太香了,让你对如日中天的Docker有更深入的了解。

Java架构之路

Java 程序员 架构 面试 编程语言

IMC总决赛精彩对战应接不暇,英特尔酷睿极致性能燃爆比赛现场!

intel001

作为一名Java程序员,技术栈的广度深度都不够还想要高薪?请先把这些技术掌握再说。

Java成神之路

Java 程序员 架构 面试 编程语言

2 w字长文带你深入理解线程池

Java架构师迁哥

AliP9整理出微服务笔记:Spring微服务不止架构和设计

周老师

Java 编程 程序员 架构 面试

Teambition 网盘 VS 阿里云盘:阿里这个浓眉大眼的也开始玩赛马了?

郭旭东

阿里云 阿里云网盘

云图说|多模态AI开发套件HiLens Kit:超强算力彰显云上实力

华为云开发者社区

人工智能 开发者 物联网 机器人 华为云

数据结构与算法系列之递归(GO)

书旅

go 数据结构与算法

JVM真香系列:方法区、堆、栈之间到底有什么关系

田维常

Java JVM 堆栈 方法区 Java虚拟机

《精通Tomcat:Java Web应用开发、框架分析与案例实战》.pdf

田维常

tomcat

企业级软件的核心价值

Philips

敏捷开发 企业应用

LeetCode题解:剑指 Offer 22. 链表中倒数第k个节点,双指针,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

轻松云上揽胜中华,靠的就是这份聪明的“地图”!

华为云开发者社区

MySQL 数据库 postgresql AI 地图

一位Java大牛结合自己的业务和平台多年来在Netty实践中积累的经验总结《Netty进阶之路:跟着案例学Netty》。

Java成神之路

Java 程序员 架构 面试 编程语言

接口文档生成详细教程

测试人生路

接口文档

区块链有了几个新“标准”!

CECBC区块链专委会

区块链 版权保护

java-File对象

Isuodut

双11购物节国外剁手党同狂欢 阿里云视频云电商直播实时字幕

阿里云视频云

云直播 直播 直播带货 语音识别

手把手教你本地 k8s 集群搭建云原生 Tekton CICD 流水线

比伯

Java 大数据 编程 架构 计算机

亲测三遍!8步搭建一个属于自己的网站

华为云开发者社区

MySQL Linux 开发者 网站 华为云

DeFi质押挖矿系统开发技术

薇電13242772558

区块链 defi

加快脑动脉瘤检测,AI来了

华为云开发者社区

人工智能 学习 算法 华为云 医疗AI

.NET和动态语言-InfoQ