[language] 只恨haskell的一个地方

coolspeed 2008-12-02
haskell都很好,可就是为什么不用虚拟机实现?
这样岂不弄得像每个编译出来的程序都自带虚拟机一样繁冗?
dogstar 2008-12-03
引用
haskell都很好,可就是为什么不用虚拟机实现?
是为什么用,还是为什么不用?两句话,前后矛盾呀.haskell没用过,但是我估计是有虚拟机的,虚拟机是实现某些语言特性和功能的必需装备.lock-free data structure,貌似就必须vm.听牛人解答吧
coolspeed 2008-12-04
dogstar 写道
引用
haskell都很好,可就是为什么不用虚拟机实现?
是为什么用,还是为什么不用?两句话,前后矛盾呀.haskell没用过,但是我估计是有虚拟机的,虚拟机是实现某些语言特性和功能的必需装备.lock-free data structure,貌似就必须vm.听牛人解答吧


它是编译执行的,实际上是编译成C/C++源文件,进一步编译成native代码。貌似我说的没有矛盾吧?
CloudiDust 2008-12-14
Haskell有虚拟机的。

生成本地码应该是为了性能~

像ghci或者hugs也可以实现“解释”的说~
lhyasia 2008-12-17
why vm?
fredchen 2008-12-21
我觉得编译成native code挺好的,这样虽然可执行文件大一点,但可以直接在没有安装haskell的电脑上执行,方便编写一些小工具给别人使用。
当然如果haskell能像ocaml那样,既有native compiler,也有bytecode compiler,那自然更好,但如果要我只选一项,我宁愿选择native的

要说haskell的不好,我觉得也真不少,其中最让我头疼的还是命名的冲突,例如用到ByteString时,就会有很多函数跟Prelude和System.IO里的名字冲突,只好小心翼翼的import,例如使用qualified import,或者加上hiding,或者用哪个函数就import哪个函数,需要的时候再加新的。这虽然好像是个微不足道的小问题,写代码的时候却是个大麻烦。
像面向对象语言在这方面就好多了,因为除了package/module/namespace的命名控制外,还有class这一层的控制,命名方面好控制多了
不知道各位有没有什么方法可以解决或者绕开这个问题?
pascal4123 2009-01-07
fredchen 写道
我觉得编译成native code挺好的,这样虽然可执行文件大一点,但可以直接在没有安装haskell的电脑上执行,方便编写一些小工具给别人使用。
当然如果haskell能像ocaml那样,既有native compiler,也有bytecode compiler,那自然更好,但如果要我只选一项,我宁愿选择native的

要说haskell的不好,我觉得也真不少,其中最让我头疼的还是命名的冲突,例如用到ByteString时,就会有很多函数跟Prelude和System.IO里的名字冲突,只好小心翼翼的import,例如使用qualified import,或者加上hiding,或者用哪个函数就import哪个函数,需要的时候再加新的。这虽然好像是个微不足道的小问题,写代码的时候却是个大麻烦。
像面向对象语言在这方面就好多了,因为除了package/module/namespace的命名控制外,还有class这一层的控制,命名方面好控制多了
不知道各位有没有什么方法可以解决或者绕开这个问题?


命名冲突本没有万全之策,package/module/namespace之类只是减小冲突概率而已。
起名字还是不要偷懒为根本。
Magicloud 2009-01-24
fredchen 写道
我觉得编译成native code挺好的,这样虽然可执行文件大一点,但可以直接在没有安装haskell的电脑上执行,方便编写一些小工具给别人使用。
当然如果haskell能像ocaml那样,既有native compiler,也有bytecode compiler,那自然更好,但如果要我只选一项,我宁愿选择native的

要说haskell的不好,我觉得也真不少,其中最让我头疼的还是命名的冲突,例如用到ByteString时,就会有很多函数跟Prelude和System.IO里的名字冲突,只好小心翼翼的import,例如使用qualified import,或者加上hiding,或者用哪个函数就import哪个函数,需要的时候再加新的。这虽然好像是个微不足道的小问题,写代码的时候却是个大麻烦。
像面向对象语言在这方面就好多了,因为除了package/module/namespace的命名控制外,还有class这一层的控制,命名方面好控制多了
不知道各位有没有什么方法可以解决或者绕开这个问题?

我想按import的先后顺序覆盖最简单,但这和haskell的原则相违背。
glacjay 2009-02-18
coolspeed 写道
dogstar 写道
引用
haskell都很好,可就是为什么不用虚拟机实现?
是为什么用,还是为什么不用?两句话,前后矛盾呀.haskell没用过,但是我估计是有虚拟机的,虚拟机是实现某些语言特性和功能的必需装备.lock-free data structure,貌似就必须vm.听牛人解答吧


它是编译执行的,实际上是编译成C/C++源文件,进一步编译成native代码。貌似我说的没有矛盾吧?


就 GHC 这个实现而言,它有一个解释器,就是那个 ghci,同 python 的命令行,同时你也可以解释执行某个 Haskell 源文件,不过得用 runhaskell 或者 runghc 。

然后,GHC 这个编译器的后端不是 C 也不是 C++,而是 C--,这是 SPJ 那家伙领导的一个项目,目的是实现一个比 C 更好的后端型语言,处在与 LLVM 相互竞争的层面上。而 C-- 就进一步的编译成本地代码。这样编译出来的程序就可以直接以二进制的形式来发布了。

至于 lz 所谓的 vm,这个甚至连 C 都有啊,就是 runtime library 嘛,只不过 C 的 runtime 不管在哪个操作系统上都是事先就有装,Haskell 的事先没装罢了,那就静态链接好了,方便发布。
glacjay 2009-02-18
fredchen 写道
我觉得编译成native code挺好的,这样虽然可执行文件大一点,但可以直接在没有安装haskell的电脑上执行,方便编写一些小工具给别人使用。
当然如果haskell能像ocaml那样,既有native compiler,也有bytecode compiler,那自然更好,但如果要我只选一项,我宁愿选择native的

要说haskell的不好,我觉得也真不少,其中最让我头疼的还是命名的冲突,例如用到ByteString时,就会有很多函数跟Prelude和System.IO里的名字冲突,只好小心翼翼的import,例如使用qualified import,或者加上hiding,或者用哪个函数就import哪个函数,需要的时候再加新的。这虽然好像是个微不足道的小问题,写代码的时候却是个大麻烦。
像面向对象语言在这方面就好多了,因为除了package/module/namespace的命名控制外,还有class这一层的控制,命名方面好控制多了
不知道各位有没有什么方法可以解决或者绕开这个问题?


这个没什么问题啊,Haskell 的 import 默认相当于 Java 的 import xxx.*; Java 不就是不提倡这种写法嘛。如果说 Java 的命名空间的基本单位是 class 的话,那 Haskell 的就是 module 了。
Global site tag (gtag.js) - Google Analytics