满足此标准的语言?

时间:2012-04-10 05:09:12

标签: python programming-languages ocaml interpreter static-typing

我已经完成了一些Java编程以及很少的C和PHP编程。最近我开始学习Python,因为语言似乎很有趣。

但SO上的几篇文章似乎指出Python不适合并发编程。与那些拥有编译器的语言相比,它也更慢。我也喜欢静态类型语言的优点,但Python是动态类型的。所以我的问题是,是否有一种语言符合以下标准。

1)有一名翻译(为了加快发展)

2)有编译器(因为编译的代码运行得更快)

3)具有OO能力

4)静态输入

我遇到了满足上述标准的OCaml。但SO上的帖子让我相信OCaml不适合并发编程。所以第五个标准是

5)适合并发编程。

PS: - 我不是编程语言方面的专家,所以如果我上面的任何观察结果有误,请耐心等待。

7 个答案:

答案 0 :(得分:5)

是的,OCaml适合并发编程。它有一个Thread模块,允许您像在Java中一样对网络应用程序进行编程。

请注意,它目前不支持真正的并行性(你不会有两个并行运行OCaml代码的线程),但是无关紧要,因为OCaml比许多其他语言快得多(例如,在QuadCore上,语言大战显示OCaml甚至优于具有多核功能的Haskell。

答案 1 :(得分:5)

OCaml适用于并发编程。标准库支持两种concurrency模型:具有共享内存的线程(mutexescondition variables用于同步),events基于John Reppy's Concurrent ML

OCaml不包括对对称多处理器并行性的支持。运行时在单个处理器上执行。如果要利用多核计算机,则需要为每个处理器运行至少一个运行时,并在运行时之间使用消息传递。消息传递具有更高的延迟,但比共享内存更难获得。作为奖励,程序可以分布在网络上的多台计算机上,除了运行时启动时彼此找到的方式之外,不会发生任何变化。

JoCaml是OCaml的扩展,具有更好的并发和分发模型(join calculus)。它不像官方的OCaml发行版那样优雅,但具有提供透明通信(在通道上发送消息而不用担心对方是在同一个运行时还是在同一台机器上)和大多数类型的通信框架的优点多个程序之间。

答案 2 :(得分:3)

根据您对适合并发编程的意思,我建议使用OCaml或SML(标准ML):

  1. 多个线程,无需等待I / O(网络/文件系统/ ..);拿OCaml - 它的编译器生成非常快的代码并且有很多优秀的库
  2. 如果并发意味着允许您在同一共享内存段中的一台机器上使用多个内核的本机线程;采用SML(polyml) - 它有一个不错的编译器并支持本机线程
  3. 请注意,使用任一解决方案,您都将开始使用类型推断!一旦你习惯了它,用任何语言编程都会让你哭泣! ;)

答案 3 :(得分:1)

除了静态类型之外,Python满足了您的大多数需求,但是,由于它的设计,它有一些叫做GIL或Global Interpreter Lock的东西。这意味着python线程不会真正单独执行。这可能解释了您在参考python和并发编程时所提到的批评。但是,python有multiprocessing模块,它提供api来使用线程等进程。另外在不同的vm下运行的python的实现没有GIL,如果你已经熟悉Java,也许你应该研究Jython,它是一个在JVM上运行的python实现。

同样不明显但值得注意的是Python确实编译为字节代码。它是在第一次导入任何脚本时执行的,这意味着如果编译和导入python源文件,它将被编译一次,所有进一步尝试导入同一模块都会使用字节编译版本,并且不会重新执行脚本。这种行为更像是java而不是PHP,它在每次运行时都会重新解释源代码。

答案 4 :(得分:1)

我想介绍三种语言,这些语言可能在很大程度上满足您正在寻找的所有功能

  1. 的Haskell

    • 有一名翻译(为了加快发展):Ghci和Hugs翻译
    • 有编译器(因为编译的代码运行得更快):Glasgow Haskel编译器
    • 具有OO功能:在某种程度上,请阅读文章Haskell vs OOP
    • 静态类型:是,不需要类型声明
    • 适合并发编程:Yes, of course
  2. 二郎

    • 有一个解释器(为了更快的开发):Erlang工作的方式,你可能没有REPL,但是并不总是解释器可以帮助更快的开发。但在某种程度上,您可以将erl用于此目的。
    • 有编译器(因为编译的代码运行得更快):是的
    • 具有OO功能:不,但有可用的实验性扩展。但是如果你在Erlang中开发,你最好坚持使用函数式编程
    • 静态输入:否
    • 适合并发编程:是的,这就是Erlang所熟知的。
  3. Groovy的

    • 有翻译(为了更快的发展):是的
    • 有编译器(因为编译的代码运行得更快):是的
    • 具有OO功能:是的,毕竟它基于Java
    • 静态输入:否
    • 适合并发编程:是的,它继承自Java。
  4. 最后

    • Java有一些名为BeanShell的东西可以作为Java解释器使用,如果这就是阻止你使用Java的东西。

    • Python中有twisted可以为语言添加并发性。

    如果您想进一步研究,请使用以下wiki链接

答案 5 :(得分:1)

首先考虑其他资源更重要。

1)有一个翻译(为了更快的发展) - imo un true

2)有编译器(因为编译后的代码运行得更快) - 真的吗?如何在开发和服务器机器和部署上使用不同的arch?

3)有OO能力 - 为什么?函数式语言更适合并行编程

4)静态输入 - 为什么?如果它在类型系统中具有“null”值,那么这个和非静态类型的imo之间没有区别。

更好的标准是

  1. 有多少优质图书馆和框架可供您使用。
  2. 如何部署此解决方案
  3. 将新开发人员带入项目是多么容易
  4. 社区的质量是什么:)

    • Ocaml是一种很棒的语言,使用Lwt库,即使在轻松处理1个进程的情况下也可以执行异步代码。 Ocaml也很快!这似乎是很好的解决方案,但是你没有很多生产就绪的框架。

    • Erlang拥有库,它很酷,速度快,似乎是满足您需求的最佳解决方案。

    • Ruby和Ruby On Rails不会让你轻松编写并发代码,但你可以快速构建解决方案并开始赚钱:)我的意思是比其他语言快10倍因为你有准备好的块。在这种情况下,部署也是最简单的。

    • Node.js速度快,易于拾取语言(javascript)但是开发的早期阶段因此没有多少生产就绪的东西。

  5. 现在这就是我处理解决方案的方式:

    就业绩而言,您的交易是

    1. 内存上限
    2. CPU上限

      • 内存上限(ram)意味着用这种语言编写的解决方案将消耗越来越多的ram,最后你必须快速购买新盒子,而且规模化的盒子必须是“胖”的。)
      • CPU上限意味着该解决方案具有非常强大的垃圾收集器,并分配了许多经常清理的小对象。
    3. 此上下文中的Node.js和Rails是内存上限,Rails将在生产时每个工作人员平均消耗~250mb ram。 Ocaml / Oscigen,Erlang / Webmachine是CPU上限,大多数功能语言将走这条路。

      我使用i5 CPU https://gist.github.com/1996858在macbook pro上对webmachine进行了小测试 这个资源每次都从redis中提取简单的json而没有缓存。

      100万个请求     总计:连接1000次请求1000000回复1000000测试持续时间463.413 s

      Connection rate: 2.2 conn/s (463.4 ms/conn, <=1 concurrent connections)
      Connection time [ms]: min 390.6 avg 463.4 max 3245.7 median 453.5 stddev 101.6
      Connection time [ms]: connect 0.1
      Connection length [replies/conn]: 1000.000
      
      Request rate: 2157.9 req/s (0.5 ms/req)
      

      现在最好的部分是监控内存使用情况。它大约是19.3 mb ram。

      如果你问我,我会在Rails中构建应用程序原型,然后提取json api并使用webmachine在Erlang中构建它们。或者只是使用webmachine在Erlang中构建应用程序,并使用一些像capistrano这样的ruby库的一些不错的功能进行部署:)

答案 6 :(得分:0)

  1. 了解Scala。
  2. 如果不满意并且您愿意使用MS Visual Studio,请学习F#。
  3. 如果不满意,你可以重新考虑你的观点(3),学习Haskell。
  4. 如果不满意并且您可以重新考虑您的观点(5),请学习OCaml。
  5. 请注意,OCaml程序可以相对轻松地在不同的进程中工作,因为它甚至可以封送闭包。