Skip navigation.

自一个人默默走

从 C 的角度使用 C++,而不是反切入 C——这样会简化很多的问题

Posts tagged with ".NET"

无题

, , , ...

早晨吃饭的时候总结了几个事情:
  • 公司使用的 CXCentaur 框架,几乎和现在市面上使用的 Java VM, .NET Framework 的架构理念是一样的;换句话说,CXCentaur 实现了一个非常快速的虚拟机环境;
  • 原先我一直在考虑从 C/C++ 中调用脚本的方法问题,实际上那个是错误的思路——也就是说 C/C++ 通常做为脚本的下层出现,从理论上并不会去关心脚本中有什么内容;
  • Python 是一种复杂的脚本,因为它要提供的东西太多了;而相比之下,公司内部使用的在 CXCentaur 之上的 LPC 脚本就非常的简洁——但问题在于 LPC 太过于 C 化了,以至于所有的调用都是 procedure call 的封装——不过目前没有发现有什么缺点;

补充:
  • 刚刚想到,从 C/C++ VM 中调用脚本的方法是可能的,VM 不会;主动去关心脚本的内容,但是脚本可以在 VM 中注册方法,让 VM 进行回调;
  • LPC 全部使用全局函数调用,在现在看来不是缺点;相比之下,C 的语法虽然不美观,但是目的非常明确;广泛地使用全局调用,在 C++ 看来是一种名称污染,但是就目前来看,这样的方法也没有产生什么问题;

JavaScript 祭

, , , ...

可以说我是一个懒人,比如说我曾经学过 js 所以就希望用它来做更多的事情。

因为之前的 js 非常简单,所以我想用它嵌入更多的程序中进行开发。

然而这种想法在今天晚上,我对 js 的发展失去了信心,之前,在看了 m$ 的 jscript.net 手册应该就有想法了,但以为是 m$ 又一独断的做法,今天晚上却发现,ecmascript 4 的标准,由 adobe, m$, yahoo 等多家公司共同制订。

最让我失望的地方在于 es4 是强类型语言,而且语法非常严谨,有 java 的风格。但很多人需要的是一个强大的脚本,而不是一个复杂的语言。mozilla 声称 es4 的 tamarin vm 会比以往的所有 js vm 都快,但可以肯定的是,性能并不是大多数用 js 编码的人最需要的。

js 需要自己的标准库,需要自己的 byte-compiler,需要自己的简洁——但并不需要复杂。

当然了,es4 也可以像 vb 一样,仅使用 variant 类型。我们暂且把 es4 的类型问题放到一边,另一方面,它引入了太多的关键字、表达式之前的东西,更强大地支持了 html, xml 等 web 创作,但很明显地——它更复杂了。也许你说我懒得接受新的事物,也许它们可以带来好处——是的,我可以回答你,在过去写 js 的过程中,曾经碰到一些问题,但是以为的 js 代码仍然工作得很好——我不需要那些新添加的功能来做更细的工作——我仅把 js 当作一种脚本,当 js 力所不能及时,我会考虑用 c++ 等更复杂的语言对其进行扩充。

当然,我不希望这个文章会引来 es4 fans 的批判,纯属个人观点,在 es4 那么复杂的情况下,也许我会更倾向于使用 python。

为什么我要与众不同?

, , ,

是的,我一直在问自己这个问题。
今天早晨写一个文章的开篇,我也这么问自己——在大家都使用 OOP 编程的时候我使用 GP;在大家认为的一些公理前,我发展自己实践(比如在有些设计上,我站在与 STL 的对立上)……老娘经常说,发现我喜欢与众不同。
很多人误解道:我的存在是为了证明与众不同的道路仍然会成功——一段时间我自己也这么认为——但是很快就被自己推翻了——与众不同不是因为我刻意要“与众不同”,在实践中,我发现了现实中执行的“公理”存在着许多问题,而试图去修正这些问题,就造成了与众不同的现象。
以前有个朋友和我说,什么赚钱就往什么发展。很不幸,我没有听进去——虽然有思考过这个问题,但是现实中,我不能容忍自己被金钱而迷惑了设计。比如很多 C++ 大师们喜欢的 .NET Framework 我就不喜欢,因为我不喜欢它代码的组织方式——就 GP 需要使用 OOP 的方式来组织代码,我还没有一个完全的概念。

OLEDB

, , , ...

晚上在弄关于数据连接的问题,感悟到 OLEDB 真是个伟大的创举——说伟大是因为众多的数据库厂商都必须支持这个标准——甚至到 .NET 时代,M$ 依然在 .NET Framework 中提供了 OLEDB ADO .NET 连接——你当然可以选择专门针对的 SQL Server 或者 Oracle 等数据产品的连接组件,但是要清楚地认识到,使用专门的组件连接库时,你在获得了一定效率优势的同时,也失去了在多种数据库选择的机会——使用 OLEDB 连接更换数据库产品的代价只是一个连接字符串,而专门的连接代价就大了。
PS: 今天试图下载 IBProvider——Firebird 库的 OLEDB 连接,很可惜,那个东西是 Commercial 的,很不幸没有找到版本 3 的下载;洗澡的时候就想,为什么我不用 Firebird 官方提供的免费 ODBC 连接,然后用 OLEDB - ODBC 连接呢?

MVC

, , , ...

继上个公司一直对 .NET Framework 的 DataSet 有一个全新的理解后;在最近的工作中,对 MFC DataGridADO Recordset 进行的大量编码(包括绑定);我自己打算开发的 AXP 项目;以及据我了解的 Ruby on Rails 框架,有一个概念不断地出现——那就是 MVC。
中午吃饭的时候顿悟,MFC 原来的那种 binary model 应该淘汰了。一个合理的现代的 MVC 框架应该是:
1. M 应该有尽可能一般化的表达形式——如 XML;
2. V 应该能自动绑定到 M,随时根据 M 的变化而改变自己的;
3. C 应该能自动接收来自 V 的事件,并做出相应的处理;更多的事件是来自 V 而不是来自其它编码。
这样条件下出现的一个现代的 MVC 框架就是 .NET Framework 的 DataSet, DataAdapter, DataGrid,很可惜,我并不喜欢 .NET(似乎有别于很多 C++ 高人),所以我一心想要实现一个具备现代特征的 native MVC,这个想法促成了 AXP 项目,但是它的适用于 Web 而不是 Rich-client,并且 on Rails 的思想和 AXP 非常的相似,我不想做一件相同的事——现在的打算很可能就是把 AXP 项目注销了,开始全新的 native AXP 项目。
在这种考虑下,我很可能会放掉启用 Turbo C++ 的打算,它的绑定特性虽然不理想,但是还凑合,因此我很可能因为它造成的惰性,所以不进行 native AXP 的开发。

我的打算

, , , ...

今天早晨在下载 Turbo C++ 2006,现在期望这个 IDE 可以达成我需要的 3 个主要功能:
1. 集成单元测试,就是说可以利用构建后事件,调用 boost.test 程序,然后把结果分析出来;
2. 批量构建,就是说可以不用写 Makefile 来完成构建工作——我现在没有十分的精力来写复杂的 Makefile,最好 IDE 能够具备这样的功能;
3. 较强的调试能力,最好能像 VC 那样的调试能力。
如果能达到上面的要求的话,就可以开始使用 Turbo C++ 了。使用其的好处在于:
1. 可以比较容易地进行 GUI 设计,不需要再专门学习或寻找别的替代;
2. 可以使用 CBD 方法进行代码复用;
3. 可以简化我现在需要进行的 Firebird 编程,不用再去学习 ibpp。

另一方面,我决定不再去学习原来打算的 python, ruby 等等;不再去研究 Emacs 怎么配置、移植到 POSIX 上等等问题;毕竟精力十分有限。

这里插一个题外话:昨天上 MSDN 偶然看到 .NET Framework 3 的下载——微软的这种发展速度是可怕的,但是我决定不跟随这种发展。怎么说呢,C++ 是在一种稳定的状态发展另一种稳定,这也是 Stroustrup 给 C++ 定的基调——优先扩展库而不是语言——C++ 的程序员利用现有的 C++ 条件开发中各种各样的库,而不是优先有什么需要就往语言中添加什么;而 .NET 语言正好相反,所有往往大家还没有完全掌握一门 .NET 语言的时候,其又发展了——所以 .NET 语言在某种程度上是相当臃肿的,且注定不能成为工业级平台,这点同于 Java(别说不知道 JRE 是用 C++ 写的)。

朋友调侃我是个善变的人,没办法,我是在各种因素中寻找一个自己的平衡点(对了,复杂认为世界是不平衡的,不管了,反正平衡不平衡,我现在就是没有过多精力)。

TestHelper

, , , ...

我估计这个类在 VS2005 已经实现了,重新造个轮子,但是在 VS2003 上非常重要:
1. 它可以让单元测试不依赖于直接在 VS 中使用对项目的引用。换句话说,VS2003 是不允许引用非 .dll 后缀的项目的,它只须通过目标文件的全路径就可以反射项目。
2. 前一点也说过,它是通过反射来调用方法属性的,也就是说它可以任意地调用 private, protected 成员,在 C# 语言的框架内要从外部调用私有成员是不可能的。
3. 有了其帮助,我可以任意地对各种目标 .NET Assembly 进行单元测试,甚至没有源码都可以进行。

Visual C++ 2005

, , , ...

我最终还是装了 VC,利用 Visual Assist X 的便捷进行 C++ 开发。当然装 VC2005 的目的不是为了进行 C++/CLI .NET 开发,而是要进行 native C++ 编码,然后再转到 GCC 上。在 Windows 上确实没有什么好的 GCC 开发环境(Windows 上的 Code::Blocks 都比 Linux 上的差了几个档次;在 Windows 上使用 VIM,天啊,饶了我吧)。
等不进行 C# 开发了,我很愿意到 Ubuntu 上从事专门的 C++ 编码,然后购买本 Unix 内核编程。在抽象思想上 GP 比 OOP 要先进些,一方面因为 GP 才刚开始流行(国内听说过 GP 的人不多,使用 GP 开发的人是少之又少),所以 GP 的作品相当少;但另一方面 GP 的设计具备了足够的弹性,需要再进行些研究,我个人认为是可以进行分布式计算的。

Windows & Ubuntu

, , , ...

非常遗憾,从 Ubuntu 上运行 Windows 失败!一方面是 Xen 对 Windows 并不完全支持;另外则是我现在机器的配置不行——用 Wine 跑 IE 就惨不忍睹了。没法,最终还是要装上 Windows XP。

现在的打算是:用 .NET Framework 开发程序,但同时进行 C++ 的研究,计划是开发一个基于 native code 的 managed C++,享有 GC 等高级功能,但是不失 native C++ 本身的速度。研究 C# 的 reflect 机制,估计会让我在 C++ 的反射方面有所突破吧。

现在头疼的是选择一个 C++ IDE。用 Visual C++ 或许不错,但是我想基于 GCC 进行开发,这个问题还要思考一下。

.NET Framework

, , , ...

因为工作的需要,我要告别 Java 开发,从事 .NET Framework 的开发。
我决定在家里继续使用 Ubuntu,但卸掉 eclipse 等工具,不再学习 Java 了。考虑使用 VIM 进行 C++ 的开发(G++, GDB/DDD, GNU Make)。
白白了 Spring, Structs, JSF, ...

关于学习 Java

, , , ...

其实我本来是想学 C# 的,但有一些重要的因素决定了我最终选择 Java:
1. C# 几乎要绑定在 Windows 上,而我越来越不喜欢使用 Windows 了——不给用户太多的自由;
2. 我本来选择 C#/.NET Framework 是因为 C++/CLI 可以运行在 .NET 上,这样 C# 和 C++ 可以共用一个类库,避免再学习。事实上,我发现所谓的 C++/CLI 调用 .NET 只不过是个谎言——为了调用 .NET 做出了多么大的牺牲——这还是 C++ 吗?
3. Java 正如它所说的,简化(注意不是精化)了 C++;C# 却在简化 C++ 的同时把使用者带入了另一种复杂;
4. 我使用 Ubuntu 来进行开发,Java/Eclipse 在上面跑得非常好;C# 在 Ubuntu 上只能依靠 Mono 框架和 MonoDevelop:我见识过 Mono——跟理想的 .NET Framework 差距太大了;MonoDevelop 我没装过,以前似乎是因为某个羞于启齿的原因,所以没装成,但我敢肯定和 Visual Studio 没有可比性。