为什么科学编程语言如此怪异?[关闭]


9

在我看来,与通用语言相比,用于科学和工程的编程语言一直很奇怪。我脑海中浮现出一些例子:

  • 在Matlab中,每个函数都必须放在单独的文件中
  • 在R中,<-是赋值运算符,与几乎所有其他语言中的=相对
  • Matlab,R,Julia等都被1索引
  • Matlab使用%进行注释,而不是标准的#或//

当然,这些语言都具有几种设计功能,实际上使它们更易于用于科学应用,例如更自然的矩阵符号。尽管如此,他们全都莫名其妙地做出了所有这些奇怪的选择,这些选择并没有使任何事情变得容易,并且如果语言设计者只是选择做其他99%的语言所做的事情,就很容易避免。是供应商锁定的原因吗?缺乏与更广泛的软件开发社区的联系?还有吗

我阅读了主题,但并没有找到令人满意的解释。仅仅因为R被设计为科学语言并不意味着它必须完全忽略约定并使用<-代替=。


6
简短的答案:因为它们是为科学家而不是程序员设计的。
Bart van Ingen Schenau 2014年

19
答案很简单:因为你认为每一种语言都是正常是由共同的祖先,C.影响
罗斯帕特森

3
我想你会很难找到任何跨语言的约定。这取决于他们的遗产。
罗比·迪

6
没什么奇怪的。只是不同而已。因为除了使用特定语言的特定作者所使用的语法外,没有其他选择特定语法的特殊原因。
2014年

8
您的99%是错的。如果您仅了解C及其派生语言,您可能会这么想,但是50%以上的非C语言在赋值,索引和/或注释方面使用的方式有所不同。
david.pfx 2014年

Answers:


21
  • 有不同的约定。IT中的数学,逻辑和应用科学惯例以及惯例。第一个年龄大得多。
  • 科学的语言使他们的生活更加便利。用户被视为科学家,他们可以不时地实现某种算法或检查某些理论,而无需学习真正的新知识。因此,科学家的语言必须符合非IT标准。因为它们不适合IT人员使用。它们符合其他标准,这很好,因为目标听觉很好。因为良好的SW UI(语言是SW UI)必须根据用户而不是编码人员的需求来完成。
  • 我们的IT标准是行业标准。IT是行业。科学不是工业。科学家为此感到自豪。他们会不情愿地将我们实践中的任何事情带入他们的实践中。他们根本不喜欢标准。没有人喜欢外国标准。因此,即使有人客观地使用符合科学标准的科学语言,即使客观上比较方便,但由于不喜欢目标听觉,因此很难卖得很好。

即使我们仅根据IT标准进行判断...对不起,您指的是什么标准?您是否尝试过用APL或SNOBOL编写编?恕我直言,这两种语言在相应的字段(计数和字符串)中功能最强大。但是语法是非常奇怪的(并且有效),读取APL代码行可能需要几天的时间。另一方面,这条线是SW的重要组成部分。您会如释重负地回到Mathlab。

至于“ =”,许多人习惯于不是平等而是分配。顺便说一句,在Pascal中,它是相等的,赋值为“:=”。

您真的认为==对于平等更自然吗?相反,混合=和==是C编程中最常见的错误,即使在具有自动控制功能的现代IDE中也经常发生。

关于从1开始的索引-这是唯一自然的索引。小时候,您学习过诗歌和歌曲,并在其中进行计数:1、2、3 ...而不是0,1,2 ...在学校数学中,我们研究了从1开始计数,从0开始计数不属于自然数/计数数。只有在函数定义中,非自然索引才会出现。毕竟,“ 0”是我们祖先举起手指几千年后才发明的。

0-start更易于实现,并在C出现后立即进入IT实践。但是在第一语言Fortran中,使用了1索引。与工业时代之前的其他语言相同。

是的,我读过Dyjkstra关于基于0计数的自然性的文章。并且完全不同意他的论点。对于音乐家来说这很自然。甚至有0位创建C和Java编译器的爱好者,也从1开始统计代码的行数!


1
在Smalltalk中也使用“:=”进行赋值和基于1的索引。
罗里·亨特

1
我不认为基于0的索引是因为易于实现(FORTRAN几乎证明了这一点)。cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html给出了一些人们可能更喜欢基于0的索引的原因,但是请注意,选择是相当随意的。
jk。

2
FORTRAN具有基于1的索引。PASCAL允许基于任意值的索引:您可以声明其索引范围介于-42到+57之间的数组。(参见en.wikipedia.org/wiki/...为一个例子,其中,这是有用的。)
约翰·R·斯特罗姆

1
@Gangnus我认为将现代语言与C进行比较,并认为它是故意难以阅读的,这是一个错误。它被设计为低级语言的高级替代品。
罗比·迪

1
FORTH是基于堆栈的语言。想想惠普计算器。它非常紧凑和快速,但是很难编写不易理解的代码。在FORTH中,您很少使用变量,而是将内容压入堆栈并使用对堆栈起作用的运算符。
Gort机器人

16

从1开始的索引并不奇怪,除了程序员之外,它是完全正常且可以预期的,因为程序员已被期望以C为基础从0开始计数(这是由处理器体系结构的属性决定的)。

评论用不同的语言以许多不同的方式表示。有没有标准的方式,每一种语言选择是不是已经采取了符号或有向图。

除了程序员,分配同样是一个奇怪且不可理解的概念。大多数人一点也不在乎它是否是=:=<-,他们很难理解的意思(对他们来说,其实它是更好地没有在使用=,因为这强调,分配不公平-对非程序员最常见的障碍了解代码)。

简而言之,旨在供专业程序员以外的其他人使用的编程语言看起来有所不同,因为使用它们的人最希望这样做。


4
我不同意从1开始的索引并不奇怪。在数学上,0索引至少与1索引一样普遍,并且显然在Matlab或S / R出现之前的很多年中,它一直是编程的常态。
haroba 2014年

9
@Aqwis哦,是的,我已经看到婴儿在数零,一,二...最自然的方式,真的。
Gangnus

4
婴儿不写代码。有充分的理由使用零索引(请参阅:Dijkstra),并且在数学中零索引也很常见的情况下,我看不出使用1-索引的许多理由。
haroba 2014年

1
@Aqwis用您自己的话回答。什么是怪异的,不是。从婴儿期就可以通过数学设定的东西(自然数不包括零),从任何角度都不能怪异。与之矛盾的是奇怪的。与您习惯了其他内容无关紧要。这些语言根本不是为您或我而设计的。
Gangnus 2014年

1
@phresnel答案的解释:从1开始索引是正常的。除程序员外,因为他们已经习惯了C的期望[从0开始索引]
Robbie Dee 2014年

5

存在三个问题:

  1. 您没有意识到某些传统,也没有做出某些选择的充分理由。
  2. 您过分强调语法,而过分强调语义。
  3. 工程师和科学家没有语言设计方面的经验,导致语法问题。

现在到您的特定要点:

  • 我不了解Matlab,因此无法评论文件组织的要求。请注意,Java希望您为每个公共类使用一个文件。

  • 在R中,=也可以用作赋值运算符。请注意,它需要多个赋值运算符<-<<-处理其范围定义的概念(<<-在外部范围内分配给符号,而不是在函数内部创建新符号)。箭头可以在另一个方向上被使用过,潜在地使得更干净的代码:complex_calculation() -> x

  • 基于1的索引是数学的标准,这是Matlab和R的用户比C更满意的方法。Julia遵循Matlab以获得更好的学习曲线。

  • %注释也用于TeX / LaTeX中。这#只是Unix脚本语言及其后代的约定。

您还忽略了“真正的”编程语言有很多奇怪的部分。为什么不使用Scheme =?代替:

(define foo 5)

*^x在其他传统中明显使用插入号时,为什么要使用C 进行取消引用?


“我不了解Matlab,因此我无法评论文件组织的要求。请注意,Java希望您为每个公共类使用一个文件。” 我认为使用该语言将您的项目分为几个文件是完全合理的。但是,类通常是相对大量的代码。功能不是必须的。通过为每个函数强制使用一个单独的文件,Matlab阻止您创建小函数,而升级大型单片函数。
haroba 2014年

1
除了p.3,我几乎同意所有内容。科学家不讲他们的语言,而是对它们进行排序。他们是客户,用户,而不是其创建者。如果有人,那么他/她已经是IT极客。而且任何一种语言的语法都是可疑的,没有人是所有任务的理想选择。
Gangnus

Matlab可根据需要实时编译函数/文件。它没有真正的程序概念,只有一堆函数。如果我正在运行一个调用foo()的函数,则它将在其路径中搜索名为foo.m的文件,对其进行编译并运行。无需事先告诉Matlab我打算使用哪些文件集。
西蒙B

1

我想这取决于您是否接触其他语言。从我的头顶上:

  • C / C ++具有单独的源文件(.c / .cpp和.h)
  • ->字符在C#中用于lambda表达式
  • VB的旧版本使用1作为默认索引(尽管可以通过Option Base进行更改)

1
在C和C ++中,可以在一个文件中定义任意数量的函数。
haroba 2014年

我只是想指出,将模块拆分为多个文件并不罕见。如果愿意,可以使用带有部分类构造的.NET语言将所有函数放在单独的文件中。
罗比·迪

1
当然,将模块拆分为多个文件并不罕见,并且在许多情况下都是可取的。但是在Matlab中,您必须将每个函数放在其自己的文件中,这意味着,如果您具有一千个函数,则需要一千个文件
haroba 2014年

3
HTML中的注释看起来像<!-- ... -->。百分号用于URL编码:http://example.com/()变为http://example.com/%28%29
阿蒙2014年

抱歉,是我的错。
罗比·迪
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.