6

作为一名程序员,我经常查看我当前使用的语言的一些特性,并自言自语“这对程序员来说很难做到,并且可以由机器自动处理”。

这种特性的一个例子是内存管理,它在各种语言中已经自动化了一段时间。虽然在大多数情况下手动进行内存管理并不难,但是在不泄漏内存的情况下在整个应用程序中完美地进行管理是非常困难的。自动化再次使它变得容易,因此我们程序员可以专注于更关键的问题。

您认为编程语言是否应该自动化任何功能,因为奖励/难度比率太低(例如并发)?

这个问题旨在就编程的未来会是什么样子进行头脑风暴,以及语言可以为我们做些什么让我们专注于更重要的任务,所以即使你认为自动化不实用,也请发表你的愿望/可行的。好的答案将指出在许多语言中真正难以做到的事情,而不是单一语言的烦恼。

4

16 回答 16

9

无论语言可以自动为我做什么,我都会想要一种为自己做的方式。

于 2009-05-03T14:49:08.447 回答
7

(半)自动化的并发编程/并行性,而不是必须搞乱线程、回调和同步。能够并行化 for 循环,例如:

Parallel.ForEach(fooList, item =>
{
    item.PerformLongTask();
}

只是赢了。

然而,某些语言已经在一定程度上支持这种功能。值得注意的是,F# 具有异步工作流。随着 .NET 4.0 的发布,并行 扩展库将使 C# 和 VB.NET 中的并发性变得更加容易。我相信 Python 也有某种并发库,虽然我个人没有使用过它。

还很酷的是纯函数式语言中的全自动并行性,即无需稍微更改代码并自动使其在多个内核上以接近最佳的方式运行。请注意,这只能使用函数式语言(例如 Haskell,但不能使用 CAML/F#)来完成。尽管如此,像上面给出的例子这样的结构对于自动化面向对象和其他语言的并行性来说是非常方便的。

我可以想象,随着台式计算机开始从 2 核到 4 核再到 8 核,面向简单和高级并行支持的库、设计模式甚至整个编程语言将变得越来越普遍。自动化并发的优势变得更加明显。

于 2009-05-03T15:08:27.820 回答
5
exec("Build a system to keep the customer happy, based on requirements.txt");
于 2009-05-03T14:49:46.510 回答
5

在 Java 中,我想要一个使整个类不可变的关键字。

例如

public immutable class Xyz {
}

如果任何不变性条件被破坏,编译器会警告我。

于 2009-05-03T14:53:10.947 回答
5

在 Java 中,创建 bean 时不那么冗长。

例如:

bean Student
{
    String name;
    int id;
    type1 property1;
    type2 property2;
}

这将创建一个 bean 私有字段、默认访问器、toString、hashCode、equals 等。

于 2009-05-03T16:28:18.580 回答
4

并发。这是我问这个问题时的主要想法。随着时间的推移,这将变得越来越重要,因为当前的 CPU 已经拥有多达 8 个逻辑核心(4 个核心 + 超线程),而 12 个逻辑核心将在几个月内出现。将来,我们将拥有大量的内核供我们使用,但大多数编程语言只让我们一次使用一个内核变得容易。

大多数编程语言所公开的线程+同步模型是非常底层的,并且非常接近于 CPU 所做的。对我来说,当前的并发语言支持水平大致相当于 C 中的内存管理支持:没有集成,但有些事情可以委托给操作系统(malloc,free)。

我希望某种语言能提出一个合适的抽象,使线程+同步模型更容易,或者完全为我们隐藏它(就像自动内存管理使 Java 中好的旧 malloc/free 过时一样)。

一些函数式语言(例如 Erlang)以具有良好的多线程支持而闻名,但是进行函数式编程所需的大脑转换并没有真正让整个考验变得更容易。

于 2009-05-03T15:12:10.963 回答
4

。网:

使用诸如Replace不将值(新字符串)返回给变量之类的方法操作字符串时的警告,因为如果您不知道字符串是不可变的,这个问题会让您感到沮丧。

于 2009-05-03T15:38:42.930 回答
2

在C++中,变量声明的类型推断,这样我就不用写了

for (vector<some_longwinded_type>::const_iterator i = v.begin(); i != v.end(); ++i) {
    ...
}

幸运的是,它以 C++1x 的形式出现auto

for (auto i = v.begin(); i != v.end(); ++i) {
    ...
}
于 2009-05-03T14:54:54.983 回答
2

咖啡。我的意思是这种语言叫做Java——所以它应该可以煮咖啡!我讨厌从编程中起床,走到咖啡壶前,然后发现营销部门的人已经喝了最后一杯,而没有再煮一壶。

于 2009-05-25T06:18:24.827 回答
2

持久性,在我看来,我们编写了太多代码来处理持久性,而这确实应该是一个配置问题。

于 2009-05-25T06:25:35.690 回答
1

在 C++ 中,枚举到字符串。

在 Ada 中,该语言将枚举类型的 'image 属性定义为一个函数,该函数返回与枚举值的文本表示相对应的字符串。

C++ 没有提供这样干净的工具。需要几行非常神秘的预处理器宏黑魔法才能获得粗略的等价物。

于 2009-05-03T15:19:44.533 回答
0

对于提供运算符重载的语言,当只定义一个运算时,为对称运算提供自动生成的重载。例如,如果程序员提供了一个等式运算符但没有提供一个不等式运算符,那么该语言可以很容易地生成一个。在 C++ 中,复制构造函数和赋值运算符也可以这样做。

我认为自动生成对称操作的一侧会很好。当然,我肯定希望能够在需要时明确表示不要这样做。我想提供双方的实现,其中一个是私有的和空的可以完成这项工作。

于 2009-05-03T15:00:14.033 回答
0

LINQ 所做的一切。C# 宠坏了我,我现在发现很难用任何其他语言处理集合。在 Python 中,我经常使用列表推导,但它们不如 LINQ 强大。我还没有找到任何其他语言可以让使用集合像在 C# 中一样简单。

于 2009-05-03T15:28:31.627 回答
0

在 Visual Studio 环境中,我希望“删除未使用的使用”在项目中的所有文件中运行。我发现必须手动打开每个单独的文件并以文件为基础调用此操作会浪费大量时间。

于 2009-05-03T15:34:26.480 回答
0

从动态语言的角度来看,我希望看到更好的工具支持。Steve Yegge 在这方面有一篇很棒的文章。例如,在很多情况下,工具可以查看各种代码路径并确定方法或函数是否存在,并提供编译器冒烟测试的等价物。显然,如果您使用大量真正的动态代码,这将不起作用,但事实是,您可能不会,因此如果 Python 会告诉您 .ToLowerCase () 在编译时不是一个有效的函数,而不是等到你点击 else 子句。

s = "a Mixed Case String"
if True:
   s = s.lower()
else:
   s = s.ToLowerCase()
于 2009-05-03T16:42:06.193 回答
0

简单:像 C# 一样在 C/C++ 中初始化变量。它可以让我在其他人的代码中进行多次调试。

当然,当您特别不想初始化 var 时,会有一个关键字。

noinit float myVal; // undefined
float my2ndVal;     // 0.0f
于 2009-05-03T17:02:32.057 回答