扩展 Mono C# 编译器:有任何文档或先例吗?

2024-05-06

我目前正在参与一些有趣的编程语言研究,到目前为止,这些研究的重点是通过一些非常强大的基于程序员生产力的功能来扩展即将推出的 Java 7.0 编译器。这项工作应该同样适用于 C# 等相关编程语言。

我目前正在研究用于对该功能的 C# 端口进行原型设计的选项。我更喜欢开源选项,以便可以与最广泛的受众分享这项工作的成果。因此,Mono C# 编译器似乎是最明显的起点。我是一名经验丰富的 C# 开发人员,因此编写代码不是问题。我主要关心以可维护和受支持的方式扩展编译器。在有关该主题的 Mono 常见问题解答中(link http://www.mono-project.com/FAQ%3a_Technical)其中指出“Mono 已经被用作尝试 C# 语言新想法的基础(有三四个编译器源自 Mono 的 C# 编译器)”。不幸的是,没有比这更多的线索了,到目前为止,谷歌搜索还没有找到任何结果。

我想知道是否有人有这方面的信息。做mcs/gmcs/dmcs有标准的可扩展性模型吗?具体来说,我将对程序的抽象语法树执行一些有趣的转换。是否有一种标准机制可以将功能插入到抽象语法树生成和类型检查器以及代码生成之间的编译器链中?

到目前为止,我已经为代码编写了一些临时扩展(主要在代码生成器中),但这似乎不是一个可维护的解决方案,特别是考虑到我打算使我的扩展与 Git 主干保持同步尽可能单声道。此外,如果能够更新我的扩展,而不必每次进行更改时都重新编译整个编译器,那就太好了。我希望能够将所有 AST 操作包装到一个 .NET 程序集中,该程序集可以通过以下方式动态加载:mcs/gmcs/dmcs无需直接破解核心编译器代码。

任何关于扩展 Mono C# 编译器的想法或指示将不胜感激!

更新(2010 年 10 月 23 日)

为了回答我的问题,我决定开始研究 Mono 的一个分支,以便为编译器创建一个简单的可扩展性模型。它还处于早期阶段,但它位于 GitHub 上:

http://github.com/rcook/mono-extensibility http://github.com/rcook/mono-extensibility

主要提交是:http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01 http://github.com/rcook/mono-extensibility/commit/a0456c852e48f6822e6bdad7b4d12a357ade0d01

如果有人有兴趣合作这个项目,请告诉我!


不幸的是,我无法充分回答您的问题,但如果您查看 Miguel de Icaza 博客上的 C# 扩展示例,您会发现它们全部采用编译器补丁的形式,而不是插件或扩展。这似乎表明没有这样的API。

请注意,所有这些示例的范围都比您正在处理的范围小得多:

  • 无参数匿名方法 http://themonkeysgrinder.blogspot.com/2009/07/cer.html(这篇文章实际上明确提到了对此类语言扩展的可维护性的担忧)
  • 字符串插值 http://tirania.org/blog/archive/2009/Dec-20.html
  • 元组的解构赋值 http://tirania.org/blog/archive/2009/Dec-23.html
  • 语法糖IEnumerable http://evain.net/blog/articles/2010/08/09/a-river-of-t

这些大多是本地化的语法糖,没有“有趣”的行为。例如,第四个补丁实现了 Cω 的语法糖:IEnumerables,但没有任何使该语法变得有趣的 Cω 语义。如果你看一下这个补丁,你会发现它确实做了愚蠢的语法扩展~TIEnumerable<T>,与 Cω 相反,其中成员访问和方法调用通过流正确提升。

微软研究院的 Phoenix 编译器管道 https://connect.microsoft.com/Phoenix曾经被明确吹捧为此类可扩展性问题的解决方案,但现在看来它主要侧重于代码生成后端中 IR 级别的优化和分析。事实上,我什至不确定这个项目是否还存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展 Mono C# 编译器:有任何文档或先例吗? 的相关文章

  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 如何在 Qt 应用程序中通过终端命令运行分离的应用程序?

    我想使用命令 cd opencv opencv 3 0 0 alpha samples cpp cpp example facedetect lena jpg 在 Qt 应用程序中按钮的 clicked 方法上运行 OpenCV 示例代码
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析

随机推荐

  • 如何在 UNIX / Linux 操作系统下使用 sed 替换带有换行符 (\n) 的模式?

    我有一个 txt 文件 其中包含 Some random text here This file has multiple lines Should be one line I use sed q N s n sl g t q file1
  • Android:随着设备移动在mapv2上绘制路径

    我正在制作一个应用程序 我必须在其中当我的设备移动时在地图上绘制路径 我搜索了我的教程但都显示在两点之间绘制路径但是我要当我的设备移动时绘制路径 任何有关此的帮助将不胜感激 当你的设备移动时 你的意思是什么 无论哪种方式 您都必须使用位置侦
  • 为什么在 Javascript 中添加两位小数会产生错误的结果? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 的数学有问题吗 https stackoverflow com questions 588004 is javascripts math broken 为什么 JS 搞砸了这个简
  • PHP 中的 ebXML\ebMS 实现

    中是否有任何示例 测试用例或定义PHP实施 ebXML 它被推广为 B2B 数据传输方式 但信息 讨论和工具却无处可寻 我是否找错了地方或者使用 PHP 来解决这个错误 None
  • 我的所有 UIAlertController 消息都变成了单行

    我不确定这是否是罪魁祸首 但我对这个项目所做的最大改变是几天前升级到 Swift 4 我知道我的 UIAlertController 消息在需要时显示多行 但今天我偶然意识到它们全部变成了单行并且末尾有省略号 由于我从 API 显示这些消息
  • QGroupBox边框

    经过一段时间的搜索后 我发现在组框上设置可见边框的方法是使用 StyleSheet 属性 我补充道 border 2px solid gray 但有几个问题 1 组框内的所有内容也继承此设置 2 边框在标题附近有一个小洞 碎片缺失 Here
  • Python 有哪些 SOAP 客户端库,它们的文档在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 matplotlib 中查看然后自动关闭图形?

    我必须检查我的参数设置是否正确 因此我需要绘制许多图 为了绘制这些图 我选择使用 matplotlib 每次检查后 我需要单击左上角的关闭按钮 这很微不足道 那么有没有什么方法可以让剧情在3 5秒左右显示并且无需点击就自动关闭呢 我知道关于
  • 错误 LNK2019:无法解析的外部符号

    好的 所以我在尝试找出代码中的问题时遇到问题 我有很多代码 所以我只会发布编译时出现混乱的相关部分 我在类中有以下函数 它将编译并且一切都会正常运行 直到我调用函数 CalculateProbabilityResults 并运行其中的第 7
  • 不需要 VPC 运行的 AWS 服务列表

    谷歌再次让我失败 或者可能是我的问题不太清楚 有没有一种简单的方法 或者更确切地说 我们如何确定哪些服务是 VPC 绑定的 哪些服务是非 VPC 的 例如 EC2 RDS 需要 VPC 设置 Lambda S3 是公开可用的服务 不需要 V
  • okhhtp3 模拟服务器 java.lang.NoClassDefFoundError: okhttp3/internal/concurrent/TaskRunner$RealBackend

    Maven 依赖
  • 使用 Android 浏览器的 HTML5 离线存储

    我正在研究如何使用 Android 设备来创建需要离线使用的网站 我还没有找到很多关于Android浏览器如何处理HTML5的localStorage和WebSQL的信息 有人知道这些的尺寸限制吗 它们是否可以更改 我知道移动 Safari
  • 旋转后获取线的新位置

    我需要在一条线上使用 RotateTransform 方法找到旋转后线的新坐标 例如 在这一行之后 line RenderTransform new RotateTransform 25 0 0 line X1其他三个属性不会改变 我找到了
  • 我怎样才能修复这段代码中的这个错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我运行 jUnit 测试时 我在 testSetName 上遇到错误 这是为什么 因为测试是为了查看名称是否为 ferndown 以及它
  • 我的本地 postgresql 数据库 url 的形式是什么?

    我正在学习 Flask sqlalchemy 教程https pythonhosted org Flask SQLAlchemy quickstart html a minimal application https pythonhoste
  • Java从数据库中以字节流的形式加载图像并加载到xsl中

    图像作为字节流保存在数据库中 我必须在 xsl 中加载该图像 在xsl中是否可以从数据库加载图像 如果可以的话可以怎样做 在xsl中我们过去只加载静态图像 但我需要加载动态内容 假设您有一些数据库并且正在存储可以通过某种方式检索的图像 该图
  • 如果 jQuery 验证失败,JSLint 有什么用?

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 MySql 返回最后插入的 id

    我在执行以下查询时遇到了一些问题 START TRANSACTION SET LASTID 0 INSERT INTO Accounts Col1 col2 col3 col4 VALUES param1 param2 param3 par
  • Struts 2 动态变量

    我正在尝试使用 set 标签在 Struts2 中创建动态变量
  • 扩展 Mono C# 编译器:有任何文档或先例吗?

    我目前正在参与一些有趣的编程语言研究 到目前为止 这些研究的重点是通过一些非常强大的基于程序员生产力的功能来扩展即将推出的 Java 7 0 编译器 这项工作应该同样适用于 C 等相关编程语言 我目前正在研究用于对该功能的 C 端口进行原型