主题:【调查】大家都主要用什么写程序? -- 还是不懂
怎么上传图片啦?
http://www.ihere.org/uploads/photos/10.gif
语法如下:
若...则...然...即...
类推
以前在单位写COBOL程序
现在单位用Java写程序
在学校读书的时候主要用C++
业余时间搞网站常用用PHP
在家鼓捣Linux的时候用C
目前正在努力练习Assembler 370...
FORTRAN比C或C++快 - 跟程序优化无关。C的速度现在进步了,大概是FORTRAN的90%,以前好像是70%。这事儿Intel的老田有发言权。
画图我以前用SigmaPlot,当然是盗版的,正版的贵死,学生版的USD680(?)
现在用gnuplot,很爽!!! 以前偶尔也用。现在是EXPERT。gnuplot不是GNU plot。
1、没有SQL的数据库不叫数据库
那年,我们接触了dBaseII,在一种叫做NEC的电脑上实习的。那种机器用的是8寸软盘,是我平生用过的最大的软盘。
那时我们学会了一种叫“全屏幕编辑”的方法,为dBaseII具有如此强大的功能吃惊。在此之前,我们写程序要用edlin,一次一行。dBaseII竟然能够在所有变量赋值框之间来回移动,比一句一句的input方便多了。
后来我们开始接触dBaseIII,这时已经用上了PC机了。见到了3.5英寸的软盘,嘿嘿,这个小巧的盘比5寸盘还存储更多东西,真不可思议。
我们可以使用中文了,我们编写的dBaseIII程序可以处理中文字符串了。
我们又见到FoxBase,它在DOS下的速度是dBaseIII的6倍!神奇啊神奇。
我们以前用文本文件来顺序存储和查找档案,有了数据库,一下子变得那样的快捷。
在这个水平下,我们停留了许多年,因为FoxBase几乎无所不能。后来的FoxPro也没有让我动心过,直到遇见了SQL小姐。
在我眼中,SQL小姐是完美的,编程语言都能像她这样,程序员才是电脑的主人。
2、OOP是接近完美设计
那时,我们在字面上争论过,为什么Basic语言是高级语言,而不是“基础”语言。
后来,听到一个名词:结构化程序设计。据老师说,无论什么人,用这个方法开发出来的程序都差不多,便于理解和修改。
最近,我们接触了OOP,才知道这才是编程语言的发展方向,感觉它们向着SQL接近了。
一个是Object-oriented world,另一个是relational data和procedure-base的世界。
看了下面的文章,大部分是挺Java的,的确Java同C++相比是领先一代,在下这里要稍微唱一下反调。这个帖子是要说一些Java做不到,但C++可以做到的东西。说的不对的地方,请高手们指出。
先从最简单的一个函数说起,我要实现一个交换两个数的函数,在C++里很容易。
void swap(int &a, int &b)
{
int t = a;
a=b;
b=t;
}
这个函数Java就实现不了,因为Java中没有pointer,而Java的object reference,相当于C++的pointer。Java中没有对应C++的reference的实现,也没有取地址&的操作。扩展一下这个问题,就是Java无法处理多返回值的情况,C++可以通过传入Reference或Pointer来实现,而Java只能将所有返回值group成一个object来返回。
再进一步,如果我想让这个函数对所有type都适用,那么在C++中很简单,用个template就行了,
template<typename T>
void swap(T&a, T&b)
{
T t=a;
a=b;
b=t;
}
这样的话,只要的我的class实现了copy-contructor 和 operator=(),我就可以用这个swap函数,而不局限于int
MyClass a,b;
...
swap(a,b); // exchange value between a and b
这个功能Java更实现不了,因为到目前为止,Java还不能support template,虽然有消息说Java将来会支持template。
不支持template也就无法支持Generic Programming (当然Java developer可以用一些技巧来模拟Generic Programming,但这不是语言本身所支持的)。
现在我们来进一步讨论,我们知道C++有庞大的STL Library, 在STL里包含了各种Container,Iterator,Algorithm等等前人已经帮你完成的东西,大部分情况下,你只需要使用这些东西,而不需要reinvent the wheel,Java Developer会说你说的东西Java也基本能做,比方说Java中也有vector,map什么的Container。但是Java实现不了的(或曰很难实现的)是下列一个情形,假设我要实现一个三元组的Container triplet,<Key, Value1, Value2>,而这个需求并不夸张,因为现实世界有许多3元组关系的对象。用C++的话就很容易实现,
template <typename _Tkey, typename _Tv1, typename _Tv2>
triplet {
......
iterator begin();
iterator end();
// detailed implementation omitted.
......
};
在triplet需要实现begin(), end()返回一个Iterator(实际上是一个struct *,这个struct包含first,second,third三个成员变量,代表key, val1,val2)。(我这里省略了其他具体实现)
具体来说,你需要对这个triplet do some thing,你就可以用STL的算法,
triplet<int, MyClass1, MyClass2> aTriplet;
......
for_each(aTriplet.begin(), aTriplet.end(), DoSomething); //DoSomething 是个function或functor
就可以了,其他各种STL算法都可以应用在这个Container上面。
而要实现这样一个Triplet的功能在Java中是很困难的。
稍微总结一下,Java这些局限是他的主要特点决定的,第一个特点是没有pointer,也就没有取地址&的操作,从程序的reliablity角度来看,是有好处的,因为大部分程序错误跟指针操作有关,但是同时也限制了灵活性。这个是好坏参半,孰优孰劣很难说。第二个特点是没有template,这点我个人觉得是个极大的缺陷,没有template,就失去了Generic Programming的强大武器。虽然很多东西Java也勉强可以做,但毕竟不如C++来得自然。所以Java community一直有将Template引进Java的企图。
(待续〉
据我所知,好像大部分EDA软件的核心算法使用C++,因为:
要表达复杂的数据结构;template!
内存管理直接影响速度和资源使用效率;
有很多软件可以用于探测memory leakage,如rational;
一些格式转化的接口程序用perl写。
java 用于网络方面的特别多?
不过是在编译器级别实现的,而不是在JVM level实现的,所以功能有了,但执行效率没有上去。
C++的Template本质是Code Repalcement。如果想要最好的Generics,那还得说是.NET 2.0的。Runtime级别的Generics,没有C++ code inflating的问题,性能大幅提高(对于ValueType,200%,对于Refrence type, 15%)
你说的Swap在.NET中支持。用什么语言都行。比如用VB.NET.
Public Sub Swap(ByRef x As Int32, ByRef y As Int32) Dim temp As Integer = x x = y y = temp End Sub
目前大型金融机构的许多数据仍然存放在层次性数据库(如IMS)或其他不支持SQL的文件系统(如VSAM)里。这些经过优化处理的数据的存取速度远超过关系型数据库。
Google的数据也没有存放在SQL型的数据库里。
C,偶而用用C++,其实这个地球大部分CPU跑的程序是C写的。
其实C++,Java,C#的出现跟C的设计中出了很多差错有relation,C的出现是革命,以后都是改良了,后来出现de最重要的LANGUAGE应该是smalltalk,c# AND java都不过是在找某种中间的平衡。
所以,加了个Pass-By-Ref参数传递方式。
原文比的是C++和Java。没有涉及C#。
C++的Template还有一个功能,是提供了compile-time polymorphism。
Java我很久没碰了,不太清楚他的Generic如何实现的?还请Highway兄来扫扫盲。
public class swap { public swap(Integer[] a, Integer[] b) { Integer c = null; c = a[0]; a[0] = b[0]; b[0] = c; } static public void main(String[] argv) { Integer[] a = new Integer[1]; Integer[] b = new Integer[1]; a[0] = new Integer(5); b[0] = new Integer(6); System.out.println("a="+a[0]); System.out.println("b="+b[0]); swap s = new swap(a, b); System.out.println("a="+a[0]); System.out.println("b="+b[0]); } }
这里面的swap函数就可以交换两个数,并在调用的主程序里面反映出来......