奇怪的问题,但在这里。现代语言“自动化”的编程概念是什么?我的意思是你以前手动做的概念。这是一个例子:我刚读过C语言,你手动进行垃圾收集;然而,对于“现代”语言,编译器/解释器/语言本身会处理它。你知道其他任何一个,还是已经没有了?
答案 0 :(得分:22)
<强>优化。强>
最长的时间,有必要手工完成。现在大多数编译器可以比任何人都更好地完成它。
注意:这并不是说仍然没有完成手工优化,正如评论中所指出的那样。我只是说,过去手工完成的一些优化现在都是自动的。
答案 1 :(得分:15)
数据收集
哈希表,链表,可调整大小的数组等
所有这些必须在此之前手工完成。
答案 2 :(得分:15)
我认为编写机器代码值得一提。
答案 3 :(得分:12)
迭代:
foreach (string item in items)
{
// Do item
}
数据库访问,查看Ruby中的ActiveRecord模式。
邪恶转到。
答案 4 :(得分:11)
内存管理,任何人?我知道明确地分配和释放你自己的内存会更有效,但是当它没有正确完成时它也会导致缓冲区溢出,并且它非常耗时 - 许多现代语言将自动分配和垃圾收集。
答案 5 :(得分:10)
活动系统
在你必须自己实现观察者模式之前。今天(至少在.NET中)你可以简单地使用“delegates”和“events”
答案 6 :(得分:8)
行号
没有更多的BASIC,没有更多的卡牌!
答案 7 :(得分:8)
在C和C ++等单通道编译器语言中,声明必须先于函数的使用。更现代的语言使用多遍编译器,不再需要声明。不幸的是,C和C ++的定义很糟糕,因为多路传输编译器是可行的,所以它们不能弃用声明。
答案 8 :(得分:8)
列表中的第一个,扩展方法。促进流畅的编程
异常,程序尝试做什么(尝试阻止)以及如果出现故障(catch阻止)它将会做什么的区分,使得编程更加精简。而在此之前,您应始终保持警惕,以便在程序语句之间进行散布错误处理
属性,使语言非常以组件为中心,非常现代。但遗憾的是,这会让Java变得不现代。
Lambda,捕获变量的函数。而之前,我们只有函数指针。这也排除了对嵌套函数的需求(Pascal具有嵌套函数)
方便循环收集,即foreach,而在你必须为obj-> MoveNext制作设计模式之前,obj-&gt; Eof
使用现代构造(如break,continue,return)进行无字节编程。而在之前,我记得在Turbo Pascal 5中,没有中断继续,VB6有退出Do / For(类似于break),但它没有继续
C#-wise,我喜欢out
和ref
的区别,因此编译器可以更早地捕获编程错误
反射和属性,使程序/组件能够发现彼此的功能,并在运行时调用它们。而在C语言之前(我不知道在现代C中,很长一段时间没有使用C),这件事是不可思议的
远程方法调用,如WebServices,Remoting,WCF,RMI。计算机之间通信的低级TCP / IP管道的日子已经一去不复返了
答案 9 :(得分:4)
模式匹配和匹配表达式
在现代语言中,您可以使用比pattern matching
语句更强大的switch
,if
操作的重叠ternary
语句:
E.g。这个F#表达式返回一个字符串,取决于myList的值:
match myList with
| [] -> "empty list"
| 2::3::tl -> "list starts with elements 2 and 3"
| _ -> "other kind of list"
在C#中,您必须编写一个不太可读/可维护的等效表达式:
(myList.Count == 0) ? "empty list" :
(myList[0] == 2 && myList[1] == 3 ? "list starts with elements 2 and 3" :
"other kind of list")
答案 10 :(得分:2)
有些语言支持动态打字,就像Python一样!这是有史以来最好的事情之一(对于某些应用领域)。
答案 11 :(得分:2)
如果你回到集会,你可以找到更多,比如类的概念,你可以在某种程度上模仿,很难实现......甚至在一行中有多个语句,比如说“int c = 5 + 10/20;”实际上是许多不同的“指令”放在一行。
除了简单的汇编之外你可以想到的任何东西(范围,继承和多态,重载等概念,“运算符”除了基本汇编之外的任何东西都是由现代语言,编译器和解释器自动化的东西。)< / p>
答案 12 :(得分:2)
<强>功能强>
过去需要手动将所有参数放到堆栈中,跳转到定义函数的代码段,然后手动处理它的返回值。现在你只需编写一个函数!
答案 13 :(得分:2)
使用一些现代IDE(例如Xcode / Interface Builder),只需点击几下即可找到文本编辑器或地址簿。
答案 14 :(得分:1)
还有用于排序的内置函数(例如冒泡排序,快速排序......)。 特别是在Python中,“容器”是一种功能强大的数据结构,在其他高级和现代编程语言中也需要几行才能实现。您可以在Python描述中找到许多此类示例。
答案 15 :(得分:1)
多线程
对语言中多线程的本机支持(比如java)使得它比将其添加为外部库(例如C中的posix线程层)更“自然”。它有助于理解这个概念,因为有许多示例,文档和工具可用。
答案 16 :(得分:1)
类型推断
在F#或Haskell等语言中,编译器会推断出类型,使编程任务变得更加容易:
Java:float length = ComputeLength(new Vector3f(x,y,z));
F#:let length = ComputeLength(new Vector3f(x,y,z))
这两个程序都是等效和静态类型。但是F#编译器知道ComputeLength
函数返回一个float
,因此它会自动推断出length
的类型等。
答案 17 :(得分:1)
良好的字符串类型使您不必担心弄乱字符串代码,
除了c之外的大多数语言,偶尔使用c ++(取决于它们的存在方式)还有更好的字符串,然后是c样式的char数组,最后带有'\ 0'(更容易使用,更不用担心缓冲区溢出,等等。 C字符串很糟糕。
我可能没有使用c字符串足以给出如此严厉(好吧不是那么苛刻但是我想更加苛刻)但是在阅读this之后(特别是有关saner看似pascal字符串数组的部分)使用了第0个元素标记字符串的长度,以及strcpy / strcat最好使用的一堆火焰战(较旧的strn *第一次安全增强工作,openbsd strl *或microsoft str * _s)I只是真的不喜欢他们。
答案 18 :(得分:1)
一大堆设计模式。许多设计模式,如Observer(如KroaX提到的),Command,Strategy等,都存在于模拟一流函数,因此更多的语言开始本地支持它们。与其他概念相关的一些模式,例如Lock和Iterator,也被内置到语言中。
答案 19 :(得分:0)
内置调试器怎么样?
有多少人记得“过去的好日子”,他不得不在整个计划中添加打印线来弄清楚发生了什么?
答案 20 :(得分:0)
变量输入
Ruby,Python和AS将允许您声明没有类型的变量,如果这是您想要的。让我担心这个特定对象的Print()实现是否正确,就是我所说的。
答案 21 :(得分:0)
上下文切换。
大多数现代编程语言使用本机线程模型而不是协作线程。协作线程必须主动控制让下一个线程工作,本机线程由操作系统处理。
作为示例(伪代码):
volatile bool run = true;
void thread1()
{
while(run)
{
doHeavyWork();
yield();
}
}
void thread2()
{
run = false;
}
在协作系统上,如果没有while循环中的yield(),thread2将永远不会运行。
答案 22 :(得分:0)
操作系统shell脚本,bash / sh /甚至更糟糕的批处理脚本在很大程度上可以用python / perl / ruby替换(特别是对于长脚本,至少目前对于某些核心操作系统来说更少)。 / p>
你可以拥有大部分同样的能力,抛弃几行脚本将各种东西粘合在一起,同时仍然使用“真正的”编程语言。
答案 23 :(得分:0)
数据绑定。当然,要减少布线,以便手动将数据移入和移出UI元素。
答案 24 :(得分:0)
动态库
动态库自动在进程之间共享公共代码,从而节省RAM并加快启动时间。
插件
一种非常简洁有效的扩展功能的方法。
答案 25 :(得分:-1)
<强>愚蠢强>
这是我从现代编程语言中获得很多帮助的事情。一些编程语言开始时很乱,所以你不需要花费精力在没有理由的情况下改变现状。优秀的现代库通过强制程序员在其框架内并编写冗余代码来强制执行愚蠢。 Java特别通过强迫我进入OOPS框来帮助我愚蠢。
答案 26 :(得分:-2)
自动类型转换。
我甚至没有意识到语言对我有用,除非我因错误的类型转换而出错。
所以,在现代语言中你可以:
Dim Test as integer = "12"
并且应该正常工作......
尝试在嵌入式编程的C编译器中执行类似的操作。你必须手动转换所有类型的转换!这是很多工作。