在没有图形IDE的情况下编写程序


18

我不确定这是否可能,但是我看了一些带有编程示例的视频,其中似乎是在某种命令提示符下而不是在漂亮的图形化IDE中编写程序。我只是对这些视频中可能发生的事情感到好奇。是否可以在没有IDE的情况下编写程序?

这是两个示例:http : //www.youtube.com/watch?v= hFSY9cWjO8o (@ 6分钟) http://www.youtube.com/watch?v=tKTZoB2Vjuk(@ 5分钟)

谁能解释这是怎么做的?

谢谢大家的宝贵意见!


48
显然,您可以在没有IDE的情况下编写程序。您如何看待第一个IDE的编写方式?
查尔斯·萨尔维亚

34
这些天孩子们!认为如果没有精美的IDE,他们将无法编写程序!为什么,在我这一天,我们不得不自己编译机器编码,在雪地上双向上走……
JSBձոգչ2010年

33
这个问题使我难过。甚至比普通人认为软件和硬件具有魔力的人还要多-您是一名程序员,应该更了解!(根据记录,我可能会算是使用机器代码的人的孩子。)

10
这不是命令行,而是基于终端的文本编辑器。两种最流行的文本编辑器vi和emacs在终端中运行。(如今,GUI也是如此)。
Lennart Regebro 2010年

4
@ jas-感谢您的建设性和有见地的评论。
马特2010年

Answers:


22

编写程序所需的只是一个文本编辑器和一个编译器(如果您使用的是非编译语言,则可以使用解释器)。代码通常只是纯文本。确实,您可以使用Windows记事本和命令行C编译器编写任何可以想象的程序。

许多程序员甚至不使用IDE。在我最终改用Eclipse之前,我个人使用Gedit(带有语法突出显示功能的基本Linux文本编辑器)的时间最长。

实际上,当我想编写一个简单的程序时,我仍然使用Gedit。有时候,如果我想快速编写脚本,甚至会只使用nano,因为我太耐心了,无法等待IDE加载。


2
我是Gedit和KATE的忠实粉丝。我在远程编辑代码时使用Nano。
蒂姆·波斯特

8
我喜欢记事本++。:)
Mateen Ulhaq 2010年

我+1到nano和vi!
crodjer 2011年

4
实际上,您甚至都不需要文本编辑器。在UNIX中,您可以cat在Windows中使用编写代码,more 显然您必须在第一时间正确编写代码。当然,真正的程序员会使用蝴蝶;)xkcd.com/378
OscarRyz 2011年

1
@OscarRyz-“当然,有一个emac命令。” +1到记事本++
杰蒂2011年

11

@Matt,它比看起来简单。让我们看第二段视频:他们正在编写一个python程序。Python是一种解释性语言-意味着用python编写的程序不需要编译,只需解释即可运行。

如果您有一个简单的编辑器,例如记事本(windows)或nano(linux),则可以编写一个简单的文本文件,命名为"program.py",然后从命令行运行解释的文件,如下所示:

python program.py

例如,如果要在Lua中编程,则可以编写一个"program.lua"使用记事本nano命名的简单文本文件,并在文本文件上写一行,如下所示:

print("my first program in lua")

然后转到命令提示符(在Windows上为cmd,在Linux中为终端)并运行命令:

lua program.lua

关键概念:

  • 原始程序是一个文本文件。编写程序真正需要的只是一个文本编辑器。
  • 如果您选择的语言是经过解释的语言,则需要解释器来运行程序(Lua,Basic,Python等)。此解释器必须安装在您的计算机上;
  • 如果您选择的语言是经过编译的语言,则需要安装工具链(主要是编译器和链接器),以将源代码转换为机器可理解且可运行的二进制代码。每种语言(C,Java,C ++,C#,VB.Net等)都有自己的工具链。

希望能有所帮助。


4
Notepad ++在语法突出显示方面要好得多!而且不要忘了EMACS:D
K-RAN 2010年

Haskell是一种编译语言(还具有解释器)。
jsternberg,2010年

我发现Notepad2(或Notepad2-Mod)比Notepad ++更好。; P code.google.com/p/notepad2-mod
Spoike 2011年

@jsternberg,感谢您在Haskell上的投入...我真的不知道该说什么语言。
马查多

1
@ K-RAN:除非我使用XCode进行iPhone编程,否则我只使用Emacs。使用TRAMP势不可挡!
乔什(Josh)

10

耶稣,我现在觉得年纪大了,我什至不必打扰打孔卡或批处理。地狱,我在大学生涯中只需要使用一两次硬拷贝终端。

这就是我们在白垩纪晚期(大约1986年)所做的事情。我正在通过VT220基于琥珀色字符的终端处理VAX / VMS,该终端可以80x24或132x24的分辨率显示。

首先,启动文本编辑器:

$ EDIT/EDT HELLO.C

EDT与VMS等效,相当于DOS edlin和Notepad之间的功能。您输入了程序文本

#include <stdio.h>

int main(void)
{
  printf("Hello, Stupid\n");
  return 0;
}

将其保存到文件中,然后退出编辑器。

然后,您通过编译器运行代码:

$ CC HELLO

这样就翻译了HELLO.C中的源代码,并生成了目标文件HELLO.OBJ。目标文件包含该程序的机器代码,但尚未采用可执行形式。一方面,该printf调用的实际二进制代码不存在。只有一个占位符。您仍然必须通过链接器运行目标文件,该链接器结合了标准库(以及您需要的任何其他库)中的二进制代码并对文件进行了格式化,以便可以将其识别为可执行文件:

$ LINK HELLO

此步骤的结果是文件HELLO.EXE,它是程序的可执行版本。

在任何现代系统上,该过程几乎都是相同的。只是特定的工具链不同。例如,典型Linux系统上的命令序列为

$ vi hello.c
$ gcc -o hello hello.c 

要么

$ vi hello.c
$ gcc -c hello.c 
$ ld -o hello hello.o -lc

自从我在这种环境中长大以来,我从不了解有人如何只需要 IDE来编写他们的代码。但是,从今年年初开始我就开始使用Java,尽管Eclipse有很多缺点,但我可以理解有人如何严重依赖IDE来完成工作。由于Java与C相比具有如此巨大的语言,并且由于我仍在尝试降低语法的精髓,因此它有助于拥有一个智能的开发环境,该环境知道特定类型所包含的程序包并帮助我组织导入。


很抱歉,您在如此年轻且容易受到影响的年龄中暴露于(V)省略(M)aking(S)系统。我希望它不会导致任何持久的后果……
蒂姆·波斯特

2
@Tim Post:你在开玩笑吗?对我来说,那是美好的时光。从那以后一直走下坡路。
约翰·博德2010年

也许我确实有点苦。但是,在我的辩护中,我必须通过令牌环将非常特殊的Novell驱动的3270网络捆绑在一起的人。尽管经过了多年的治疗,但我仍然对此感到忧虑。
蒂姆·波斯特

“世界”的有趣拼写。

6

是的,是的。

就像可以在不同时使牛奶起泡沫的同时煮咖啡,无需打电话也无需缴税就能开车去上班,或者不听环绕声系统上的“大黄蜂飞行”而凝视星空一样,在不运行编辑器,调试器,代码分析系统和蛇游戏的情况下编译代码。

但是...谁真的想沉默地凝视星星?


1
您愿意解释一下吗?
马特2010年

1
@Matt:每个任务一个程序...在编辑器中编写代码,使用编译器进行编译,使用调试器进行调试,休息一下然后玩
Shog9

2
-1我认为这不是建设性的。
stytyfootersdude”,2010年

1
+1,不是破坏性的,只是一个隐喻。不要害怕幽默。
ern0

6

编辑?我不需要臭气熏天的编辑器或IDE来编写代码:

cat << EOF > hello.c
/* This IS an example of writing code from the command line */
#include <stdio.h>

int main(void)
{
    puts("Hello, World!");
    return 0;
}

EOF

但是,以后有一些东西可以编辑文件很好。IDE(集成开发环境)的存在时间比许多人的答案要长得多。我唯一真正喜欢的IDE是Turbo C附带的一个,它在DOS上运行。对于那些被迫与埃德林混为一谈的人来说,这就像氧气。

我曾尝试过许多不同的IDE“套件”,这些都是来自朋友的推荐,他们不停地狂热地节省了多少时间,使一切变得多么方便。每次我坐下来尝试使用它时,我发现与它战斗比使用它更多。

在大多数情况下,我只使用最简单的文本编辑器。我最喜欢的是KDE,它是KDE附带的。这些是我喜欢的功能:

  • 语法突出显示
  • 代码折叠
  • 简单的基于正则表达式的搜索/替换
  • 内联外壳窗口
  • 内联编译器窗口/调试器窗口
  • 片段库
  • 符号查看器
  • 极轻的内存占用量(我的一些项目有数百个源文件)
  • 简易标签页/分割视窗
  • 简单的会话,而不是复杂的“项目”
  • (半)简单的插件架构

仅凭这些基本功能,我感觉自己快被宠坏了。

使用功能丰富的IDE时,我的工作效率实际上降低了,而且很庆幸的是,我从未开发过对它的依赖。


作为记录,您提到的大多数功能都可以在任何现代程序员的文本编辑器中使用,而不仅仅是IDE。
熊恰亚诺夫,2011年

讨厌将其破坏给您,但是这些功能才是IDE的关键。
devshorts 2014年

4

IDE不是编译器,调试器或类似的东西,它实际上是使您可以访问所有这些(通常是单独的程序)的前端。在Visual Studio的幕后,有一个编译器,您可以将其作为单独的程序进行访问,可以从命令提示符处编译程序,还可能有一个调试器,该调试器也可以单独访问,依此类推-我对它的基础结构不太熟悉因为我不使用它。

根据您的要求,IDE可能非常有用,或者会妨碍您的发展。它还取决于您所写的内容,大小,编码样式等。我一方面并没有真正感到需要使用IDE太多的感觉,但是我认为它可以更好地处理某些任务(或者,根据您的看法,我太懒了,无法编写脚本) / macros,代表我自己)。


3

那当然是。在第一个视频中,它是关于C编程的。要编写C程序,您需要满足以下条件:

  • 将代码写入其中的某种源文件
  • 一个将这个源文件转换成二进制文件的工具链,这是CPU最终唯一可以理解的东西。

严格来说,您不需要文件,但是我不知道任何不使用C / C ++文件的环境。这样,您需要一个编辑器来编辑源代码。尽管可以使用记事本这样简单的方法来工作,但您确实希望做一些更复杂的事情来进行编码(突出显示代码,同时打开多个文件等)。

第二点,您需要一个编译器(源代码->目标代码)和一个链接器(目标代码合并在一起+启动程序所需的最少支持)。

即使使用IDE,大多数在后台完成的任务也可能是通过命令行完成的:例如,在Visual Studio中,IDE仍会使用文件,并在命令行为您调用编译器,但是它可以通过其他方式工作(并可能进行更多集成)。

那么为什么不使用IDE?有些人对他们的代码编辑器非常熟悉,因为他们真的很了解。例如,我对vi代码编辑器的工作效率很高。如果您需要与IDE无关的东西进行交互,则IDE也受到限制。这里需要权衡取舍,这取决于程序员的能力,项目,编程语言/工具等。某些语言甚至没有像样的IDE,而另一些语言几乎没有一种就无法使用。尽管我自己不使用IDE,但我认为它们非常有用的一个领域是调试C和C ++的集成。


我使用记事本来学习Java编程。不久之后,我得到了Crimson Editor,并在Linux上使用了gedit,但是直到第一次拿起IDE大概两年后才接触到IDE。我目前的工作是作为Java程序员。
Michael K 2010年

是的,Java是一个典型的例子,我很少遇到不使用IDE的人。语言只是一个因素:域,大小,“文化”都是因素。我自己很少使用IDE(如今我主要使用python和C,并且还没有看到像样的python IDE)。
大卫·库纳波

您可以使用TCC编译/运行C程序,而无需创建文件:printf '#include <stdio.h>\nint main() { printf("Hello, World\\n"); return 0; }' | tcc -run -
programmerjake

2

您当然可以在没有图形IDE的情况下编写程序。对于编译语言(例如C或C ++),该过程将如下所示:

  1. 在首选的文本编辑器中编写程序。
  2. 在命令行中,调用将您的程序转换为可执行机器代码的编译器和/或链接器,并提取所需的外部库。(对于这里的链接和编译顺序,我有些困惑,但是我敢肯定有人会立刻纠正我。:)

对于PHP或Python之类的解释型语言,您可以在首选的文本编辑器(或诸如Python附带的交互式shell)中编写代码,然后由解释型程序执行代码。例如,要调用Python脚本,您可以运行python.exe myScript.py

Python不是纯解释性语言,因为它确实会首先编译,但是该编译形式是由Python解释器运行的,因此它仍然符合定义。其他语言(例如PHP)可以完全解释。


1

是的,您可以在没有编译器和IDE的情况下编写代码。它只是在写。文本。


2
您愿意解释一下吗?
马特2010年

7
您在键盘上键入。
马修(Matthew)

Matthew的意思是,您可以编写程序,但没有用。:)
Abimaran Kugathasan 2010年

2
@Abimaran我不确定100%的意思,但是您当然可以在没有编译器或IDE的情况下运行/使用程序。语言可以被解释,而不仅仅是编译。
马修(Matthew)

1
@迈克尔,我不同意。它只不过是分析引擎解释其齿轮位置的解释。
马修(Matthew)

1

我认为您指的是集成开发环境(IDE)。它们提供代码提示和语法突出显示等功能。编译器只是获取文件并将其编译为机器代码或字节代码。IDE通常通过向编译器发送命令来编译文件来使用编译器。

无需编译器就可以编写。这些语言使用“解释器”并在运行时处理脚本。


1
您愿意解释一下吗?
马特2010年

或者,您也可以使用二进制程序进行编程:)
Michael K 2010年

或使用CIL ..:P Matt从我看到的视频中,您可以安装BASIC之类的东西,并通过命令行键入和运行语句
Ross,2010年

1

IDE的全部工作就是在一个方便的位置提供几个工具,然后使某些过程自动化。这些工具通常是...

  • 文字编辑器
  • 编译器
  • 调试器
  • 文档查看器

要编写源代码,您可以使用任何可产生纯文本的文本编辑器,例如。NotePad,Word或专用代码文本编辑器。

将源文件保存在文本文件中之后,您可以通过传递测试文件的命令行来启动编译器,例如cc my_program.c。这将生成一个可以执行的目标文件。

要调试程序,请通过传递程序的命令行启动调试器,例如。gdb my_program然后,您可以设置断点,逐步执行程序,检查内容等。

使用IDE,所有这些操作都是通过在幕后按下按钮来完成的,并且IDE在其所有内容上都放置了精美的UI。

PS。真正的程序员使用命令行


2
真正的程序员使用打孔卡,并使用MOSFET前晶体管构建自己的CPU。他们还会用混凝土制成的棋子,每块至少重25磅。
作业

1
@Job,晶体管用于sissis,真正的交易是:en.wikipedia.org/wiki/Vacuum_tube
Machado 2010年

我以为我们是w弱的人,不能举起鼠标,更不用说下棋了。
Michael K 2010年

2
真正的程序员使用磁化的针和稳定的手。xkcd.com/378
Goran

1

我用vim编辑器(基本文本编辑器)编写日常代码,并且可以向您保证它运行顺利(我的大部分代码是PHP)。特别是因为我的开发环境是基于Dev的Linux发行版,所以我充分利用了shell工具。我已经进行了一年这样的编程,这在处理远程应用程序部署和产品修改方面大有帮助,而您通常可以通过ssh访问* Nix控制台。


1

自1950年代以来一直使用数字存储程序计算机,而图形用户界面实际上仅在1960年代后期才出现(对于1980年代的最终用户而言)。在此之前,人们不得不以某种方式使用和编程计算机。

尽管其中包含一些不准确之处(并非每个平台的用户界面都位于命令行系统之上),但您应该阅读Neal Stephenson的短篇小说《 Beginning Was the Command Line》

它将使您真正想到计算机上的工作原理,以及在没有IDE的情况下如何“可能”进行编程,通过命令行完成实际工作,等等。


1

您实际上只需要一个文本编辑器(地狱,记事本就可以)和一个编译器/解释器(更重要的事情)。

您说过如何通过命令行执行此操作?狗屎听起来很疯狂,但很有可能。我的意思是,仅使用Windows内置的命令提示符,您就可以通过写入文件,echo "some codez" > target_file.sauce但是您必须

A)善于做自己的事

B)编写一个简单的程序

C)疯狂击球


1
...或试图打动某人。
Michael K 2010年

或者,您正在尝试从繁琐的系统中恢复某些信息,而您又没有时间更换显示器。去过也做过。
亩太短了2010年

1

您确实需要认为IDE只是编辑器+编译器+(某种程度上)Makefile +调试器(有时)+图形UI构建器(有时),因此您当然可以选择完全不使用IDE,然后替换它们带有您选择的编辑器(vim,emacs,gedit,notepad ++,[insert_others_here]),编译器(用于Java,gcc,平台SDK的jdk或用于C ++的[insert_Cpp_toolchain_here]),Python解释器或您的语言所拥有的任何工具链),某种makefile(例如autoh ...工具,cmake,ant,maven等),某种调试器(通常包含在编译器中),以及是否需要图形用户界面生成器(想到的是glade) ,您可以在没有IDE的情况下拥有自己的IDE。哪种方法最好取决于您(我认为今天的IDE有点被高估了)


1

眨眼

他正在使用pico(纳米克隆)。我偶尔使用它。通常我使用emacs,它的用处不大,但功能更多。

根据经验,我不使用IDE。有时,我会去调试它们,或者因为很难找到命令行工具链(看着Xilinx)。在做GUI的极少数情况下,我还使用它们来绘制C#。但是从我的经验来看,IDE并不是一个很好的编辑器:僵硬,奇怪的字符和弦,不易使用,不支持多种语言,占用太多内存。

我宁愿使用emacs。

您应该研究计算的历史。它写的相当容易,将为您提供有关我们工作的绝佳视角。


1

您甚至不需要文本编辑器。:) :)

如果您在Windows中,请尝试以下操作:

more > hello.c 
#include <stdio.h>

main()
{
   printf ("Hello World!\n");
}
Ctrl-C

如果您在UNIX中

cat > hello.c <<. 
#include <stdio.h>

main()
{
   printf ("Hello World!\n");
}
.

然后,使用您最喜欢的命令行编译器进行编译。:)

显然,您必须在第一时间正确地编写它。

请记住,真正的程序员使用蝴蝶:http : //xkcd.com/378/


0

有趣的是:哈佛扩展学院正在教授没有IDE的编程方法...除非telnet + pico是IDE的意思。

最简单的方法是使用基本的文本编辑器编写Java程序,然后使用FTP程序将文件传输到FAS系统,通过telnet连接,然后在FAS上编译并运行它们(fas.harvard.edu-Java已安装那里)。他们必须使用FAS才能提交作业。要使用此方法,您可能需要了解有关Unix文本编辑器之一的足够知识,以便能够对文件进行任何所需的快速更正,或者计划在本地更新文件并重新传输它。有关传输文件的更多信息,请参见“常见问题”页面。

请勿使用文字处理器,例如Word或WordPerfect!它们添加了许多您看不到的格式化字符,但是这将阻止您的程序进行编译。在Windows上,您可以使用记事本或写字板,并确保将文件另存为扩展名为.java的“文本文档”。如果系统尝试添加“ .txt”后缀,请在“保存”框中在文件名和扩展名两边加上引号,以防止出现这种情况。您也可以在“有用的下载”部分中尝试使用任何一种编辑器(强烈建议在PC上使用的一种是Programmers File Editor)。在Mac上,使用BBEdit Lite(也在“资源”页面上链接),或使用“终端”窗口中可用的内置Unix编辑器之一。您可以获取一个安全的telnet程序,或者使用已有的telnet程序进入FAS系统,并在系统上编写和编辑程序。您可以尝试三种Unix编辑器:pico,emacs和vi。一旦编写了程序并将其保存,则如上所述,您可以在FAS上编译并运行它

http://www.fas.harvard.edu/~libe50a/homework.html http://www.fas.harvard.edu/~libe50a/faq.html http://www.fas.harvard.edu/~libe50a /java.html

如果您问我,他们在折磨孩子,但这没关系。在任何一年中,哈佛都不能接受更多的斯巴达人,更不用说Mothakes,Perioikoi和Helot了。


对的,这是可能的。我想像记事本之类的东西是没有IDE的,但是emacs和Textpad(我都用于C,Java课程)都被认为是IDE。现在...在VS2010中用WinForms和所有其他语言在VS2010中用C#编码后,我不想回到工作中的文本编辑器了-我会因为不做废话而大喊大叫。

但是,对于学术项目,当示例很小时,不使用IDE是有意义的。请记住:在入门编程类中,不存在许多实际问题。您可能不必将.xml文件作为资源添加到dll。您可能不需要太多调试,也不需要使用代码协定,也不需要从不受管理的C ++到C ++ / ClI,再到C#,然后再返回。学术任务不必太杂乱,因为它们可以从头开始,并以人日/周为单位进行衡量。所有文件都可以只是一个项目的一部分(甚至对于编译器或OS类而言)。像Visual Studio这样的IDE实际上会在简单的makefile起作用时阻碍您。想一想必须配置的无数选项。与Eclipse相同-它是一种可无限定制的过度设计的编辑器。您只需要一个简单的makefile和两个简单​​的C文件。实际上,当您自己指定每个标志时,您倾向于以这种方式进行更多控制。我曾经在大学实验室里这样编码过。这很有趣,但是其中一台“嵌入式”(意味着它必须非常小,可以装在飞机上)计算机没有GUI,也没有鼠标:)我仍然能够登录,编辑,编译和调试C程序,以及添加驱动程序并重新编译内核。


我实际上同意这种方法。尽管我不会强迫telnet-只是命令行和文本编辑器。
Michael K

0

对于数据库工作,您只需要一个文本编辑器(notepad ++)和一个命令行客户端,例如osql或sqlcmd。甚至没有编译器。


0

这不仅是可能的,而且-一生中至少有一次-您必须在没有IDE的情况下进行编程。它将帮助您了解编译过程和库的使用-也许会让您大开眼界,了解编程的真正含义。

另外,我认为一个好的文本编辑器要比IDE更好。对于MS-Windows,我建议使用PSPad(如MS-DOS时代的MultiEdit那样强大),对于GNU / Linux,请尝试Geany(也许在发行版的存储库中)。


0

我使用99美分的笔记本电脑和可靠的Pilot Gel Pen编写程序。

我只是将它们重新输入到Visual Studio中。

编写程序和编码是两件事(对我而言)。


您是先在纸上手写完整的程序吗?

@Thorbjørn-我早在一天之前就已经做到了(大多数是短时间游戏),当我在研究算法时,我通常会用白板来勾勒出它们的轮廓,而不是用笔和纸。
rjzii 2011年

是的,我手工编写了很多代码。不是整个程序,因为Visual Studio可以自动执行很多操作。
Pablo

0

不使用IDE进行编程是了解正在发生的事情的好方法。

我们从学校开始用简单的语法彩色文本编辑器进行编程。编译是通过命令提示符(或通过简单的批处理脚本)进行的。

只有了解了编程的基础后,我们才转向功能更强大的编辑器,例如Eclipse或Visual Studio。


0

正如预期的那样,所有答案都说相同的事情:“当然可以!它只是文本!文本文本是文本文本!” 通常来说,这是对的,并且是对您问题的最佳答案。大多数IDE只是操纵文本。

但这并不总是正确的,在某些情况下,脱离纯文本模型会带来很大的进步。这些进步通常被纯文本的纯粹主义者所拒绝(这是大多数人,因为它也应该是如何...不是巧合吗?!)。IBM Visual Age是一个非常酷的例子,它死得很惨。

想到的另一个例子非常流行,它是用于创建Mac和iOS产品的Interface Builder。它的输出不是文本程序,而是序列化的对象,因此如果不使用IB或编写自己的IB,就无法创建NIB。

纯粹主义者会说:“是的,但是Interface Builder是用文本代码编写的!” 所以?

我坚信,如果我们能够超越纯文本范式,CS作为一个领域将会大大进步。除此之外,我认为我们最终会朝这个方向发展,但这将需要数十年的时间。首先,我们必须找出哪个更好,vi或者emacs....


0

最近我已经升级到vim。我喜欢它以我使用的任何语言突出显示关键字的方式。叹气,只有当我可以使用真实的操作系统而不使用记事本时。

我的妻子使用edlin编写了COBOL。我认为这很有趣。

对我们过去使用的按键卡进行了这样的改进,并在24小时内停止了操作,只是发现我们有错字。

我在阁楼的某处有编码表格。

您有1和0?我们必须通过0画一条线。

但是你今天告诉年轻人,他们不会相信你。

j。

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.