O que é uma linguagem "poderosa"?


22

Eu sempre vi pessoas brigando por saber que seu idioma favorito é mais "poderoso" do que outros. Quando se trata de descrever uma linguagem de programação, eu posso entender o que é uma linguagem orientada a objetos ou o que é uma linguagem dinâmica, mas ainda não consigo descobrir o que é exatamente uma linguagem "poderosa". Quais são seus pensamentos?


5
Uma linguagem é tão poderosa quanto seu usuário.
ysolik

6
@ysolik não é necessariamente verdade. eu poderia dar a alguém uma linguagem de baixa qualidade e ver até onde eles chegam. tem um op, NOOP! =)
Mark Canlas

2
@ Mark se estamos falando de extremos, então você está certo. No entanto, se você considerar os idiomas mais ou menos utilizados hoje, o usuário será uma grande parte dele.
ysolik

1
PowerBASIC: Não pode ser mais poderoso que isso. ^^
gablin 6/10/10

1
@ syolik: seria mais preciso dizer "uma linguagem não pode ser mais poderosa que seu usuário".
Duncan Bayne

Respostas:


32

Não podemos definir o que é uma linguagem "poderosa" sem antes definir a palavra "poderosa".

A definição literal de poder seria "potência", e acho que todos podemos concordar que a grande maioria dos compiladores - e até mesmo muitos intérpretes que não são completos em Turing - fazem um trabalho igualmente bom em fazer com que o processador execute suas instruções . Portanto, quanto à definição literal, a resposta para a pergunta seria "quase qualquer idioma".

Praticamente, realmente devemos parar por aí; definir uma "linguagem poderosa" é como definir uma "pessoa boa" ou um "produto de qualidade". Não há absolutamente nenhuma definição objetiva dessas palavras que você possa fazer com que todos, ou mesmo a maioria dos especialistas, concordem, e a maioria das definições simplesmente acaba implorando a pergunta . Dependendo de quem você fala, o poder pode ser um dos seguintes:

  • Uma estrutura ou biblioteca de uso geral rica para executar uma ampla variedade de tarefas comuns
  • Uma sintaxe sofisticada específica de domínio que "faz uma coisa e faz bem"
  • Acesso direto às funções da máquina, ou seja, a capacidade de escrever código de baixo nível
  • Abstraindo conceitos de nível de máquina, ou seja, a capacidade de escrever código de alto nível
  • Um sistema de tipo muito rico que permite estratégias avançadas como reflexão, DI e análise estática
  • Um sistema do tipo muito frouxo que permite que os programadores o executem (coerção do tipo etc.)
  • A capacidade de tratar tudo como um objeto , que oferece verificação conceitual
  • A capacidade de tratar tudo como uma função , que oferece verificação matemática
  • Memória automática e gerenciamento de recursos (GC, RAII), levando a menos erros
  • Memória manual e gerenciamento de recursos, potencialmente levando a desempenho otimizado
  • Uma quantidade mínima de ruído sintático , levando a uma melhor legibilidade
  • Uma sintaxe mais parecida com o inglês , que oferece uma curva de aprendizado mais superficial
  • A capacidade de escrever código muito conciso (ou seja, operador ternário, coalescência nula, extensão nula)
  • A incapacidade de escrever código potencialmente confuso (ou seja, sem operadores ternários, etc.)

Todo mundo vê o que está acontecendo aqui? Praticamente todo recurso de marcador pode ser interpretado como um sinal de "poder", e o mesmo pode ser exatamente o contrário!

Alguém, em algum lugar, obviamente pensou que variáveis ​​variáveis eram uma ideia incrível que tornaria a linguagem muito poderosa . Não julgarei; Eu não sou um cara de PHP.

Proponho que, em vez de todo esse absurdo da guerra santa, todos usemos essa definição realmente simples:

O idioma mais poderoso é o que permite enviar o produto da mais alta qualidade pelo menor custo e no menor tempo possível.

Vago? Pode apostar. É por isso que quem quer se chamar profissional precisa entender os conceitos de programação e o domínio do projeto. Essa é a única maneira de você decidir o que é "poderoso" para você.

Caso contrário, você pode estar apenas trazendo uma faca realmente grande para um tiroteio.


1
+1 Esta é a única definição que tenta incluir todas as várias noções de poder da linguagem. Gosto especialmente de como você mostra que os recursos conflitantes podem ser considerados poderosos. Ciência da Computação é a ciência dos trade-offs, mesmo na escolha do idioma.
CodexArcanum

11

Talvez eu seja tendencioso porque sou programador de sistemas. Eu acho que uma linguagem de programação usada para toda a programação de kernel, sistema, servidor e aplicativo, ou suporta múltiplos paradigmas de programação, ou ambos podem ser chamados de "poderosos".

C, C ++, D são poderosos, mas obviamente essa é apenas minha humilde opinião.


Você usaria Java para programação no nível do kernel ou estou entendendo mal você?
Davy8

@ Davy8, você está certo, por minha própria definição, eu não deveria ter incluído o Java.
grokus

5

Existem algumas definições de poder além da abrangência de Turing. Mark citou o que costumo pensar como "a definição de Paul Graham". É uma definição muito boa, com uma falha séria: está errada. Teoricamente, é uma definição muito boa do poder da linguagem, mas você sabe o que eles dizem sobre a diferença entre teoria e prática ...

Se todo mundo fosse capaz de escrever um código perfeito, não apenas perfeitamente livre de erros, mas também perfeitamente à prova de futuro, de forma consistente, a definição de Paul Graham estaria correta. Mas obviamente não é esse o caso. No mundo real, a maior parte do tempo e esforço dedicados à engenharia de software não é ocupada pela criação inicial do produto, mas pela manutenção posterior. Dependendo de quais estatísticas você escuta, (e provavelmente varia um pouco de projeto para projeto), a manutenção pode representar de 60% a 90% do esforço total que entra em um programa.

A manutenção geralmente é executada por outras pessoas que não a pessoa que escreveu o código inicialmente, e freqüentemente meses ou mesmo anos após a escrita inicial do código, o que significa que, mesmo para o codificador original, ele também pode ser o "código de outras pessoas". ponto. Se você deseja ser produtivo durante a manutenção, precisa verificar rapidamente a intenção original do código lendo-o.

Portanto, uma linguagem mais poderosa é aquela que facilita a leitura rápida do código , e não uma linguagem que facilita a gravação rápida do código . Tende a haver uma justa quantidade de sobreposições entre os dois, mas os conceitos também costumam ter objetivos diferentes, pois a sintaxe concisa geralmente omite os detalhes que um compilador / intérprete é capaz de deduzir com muito mais facilidade do que um programador de manutenção.

EDIT: Há outro ponto importante na descrição do poder de uma linguagem: a variedade de conceitos que você é capaz de expressar e a facilidade com que consegue atingir as duas extremidades. Paul Graham gosta de avaliar este em qual nível de abstração você pode alcançar, mas isso é apenas metade. Qualquer linguagem que imponha um limite inferior de abstração, abaixo do qual você não pode ir quando necessário, é prejudicada porque os detalhes que estão sendo abstraídos estão lá por uma razão. Essa é a diferença entre uma linguagem de brinquedo de fácil leitura, como COBOL, e uma linguagem poderosa de fácil leitura: COBOL não tem ponteiros nem acesso a montagem em linha, onde é possível expressar qualquer cálculo, mesmo aqueles aos quais o COBOL não é adequado.

O COBOL também não é particularmente bom em atingir o limite máximo do espectro de abstração. Segundo a Wikipedia, "não possui tipos definidos pelo usuário nem funções definidas pelo usuário", o que dificulta a criação de algoritmos e estruturas de dados.


1
O problema que tenho com isso é que parece apontar o COBOL como uma linguagem muito poderosa.
David Thornley

2
Presumo que você não conhece o Lisp? :)
dash-tom-bang

1
@ Matt: Essa é a coisa. Que língua é usada para é limitado pelo que uma língua pode ser usado para, e há muito menos que pode fazer com Python do que com uma linguagem que não abstrair detalhes da memória-relacionado.
Mason Wheeler

3
-1 Devido à noção implícita de que um código mais curto e mais expressivo é mais difícil de manter. Você adotou os dois significados comuns do poder da linguagem (expressividade versus abertura) e os fundiu em um conceito que apenas metade expressa as duas idéias originais.
CodexArcanum 04/11/2010

1
@ Jörg W Mittag: Você está certo, mas acho que a frase que citei se refere ao controle direto dos recursos de hardware (por exemplo, memória): o C ++ oferece mais controle. Obviamente, se você implementa uma máquina virtual, tem controle total, mas acho que Mason Wheeler se referiu a ter controle da máquina real.
Giorgio

4

Isso foi debatido repetidamente por muito tempo (por exemplo, no comp.lang.lisp, várias vezes). Eu não acho que alguém tenha uma resposta "certa", mas muitas pessoas têm respostas que me parecem obviamente erradas.

Nas respostas que vejo aqui, deixe-me escolher a resposta de Mason Wheeler. Por um lado, as questões que ele cobre são importantes - mas, por outro, não consigo imaginar chamá-las relacionadas a "poder". É um pouco como se ele estivesse dizendo que sua mini-van Honda é mais poderosa que um dragster de alto combustível, porque é mais segura, silenciosa, tem melhor manuseio, mais espaço para os passageiros e uma condução muito mais confortável. Tudo isso é absolutamente verdade e é tudo importante. Esses fatores (entre muitos outros) tornam a minivan muito mais prática e razoável para a maioria das pessoas - mas não mudam o fato de o motor da minivan produzir apenas cerca de 250 HP, enquanto o do dragster produz algo em torno de 8000 HP.

O problema, é claro, é que, com os veículos, existe uma definição clara do que constitui "poder" e o que não. Com as linguagens de programação, parece-me que a discussão acaba sendo equivalente a tratar o manuseio, o conforto, a velocidade, a capacidade de carga e o alcance dos cruzeiros como parte do "poder". O resultado tende a ser threads que funcionam indefinidamente, gerando muito mais calor que luz. A maioria das perguntas que surgem basicamente se resume ao grau de importância que você atribui a recursos ortogonais e completamente não relacionados - por exemplo, é a capacidade de programar o MMU em linguagem assembly mais ou menos "poderosa" do que a capacidade de criar funções de nível superior em Haskell? Pelo menos na IMO, não há uma maneira significativa de comparar as duas e nenhuma resposta significativa seja "

Assim, por mais que eu odeie, devo dizer que, neste caso, a única resposta significativa é basicamente relativística - uma linguagem poderosa é aquela que você acha que ajuda você a realizar o que deseja. As diferenças nos objetivos das pessoas tornam a maioria das medidas "absolutas" do poder sem sentido, na melhor das hipóteses.


3

O equilíbrio certo de brevidade e flexibilidade.

Ótima pergunta. Dado que muitas línguas são "completas de Turing", podemos colocá-las todas em bases iguais em relação ao que elas são teoricamente capazes. Mas não fazemos isso porque os idiomas obviamente diferem um do outro. e qual é a diferença?

A diferença é a capacidade de dizer muitas coisas diferentes com muito pouco . Se pudéssemos ir direto ao extremo, eu poderia criar um idioma que fosse o melhor para inicializar automaticamente um sistema de gerenciamento de conteúdo usando apenas um caractere, 'c'. Mas qual seria o objetivo disso? Claro, é poderoso no sentido de ser muito breve, mas não é flexível. O que você quer é uma linguagem que permita dizer muitas coisas complexas diferentes sem ser muito detalhada. Sem ser como um conjunto, capaz de tudo sob o sol, infinitamente flexível, mas extremamente detalhado.

Uma linguagem poderosa é uma linguagem que permite que você diga muitas coisas diferentes com o menor comprimento possível.


1
-1. Sinto muito, mas isso não é apenas um conceito errôneo, mas perigoso, pois pode prejudicar gravemente a produtividade mais adiante.
Mason Wheeler

@Mason Wheeler: Você poderia elaborar?
Joey Adams

@ Joey: Veja minha resposta a esta pergunta.
Mason Wheeler

1

Quando você conclui Turing completo (e é fácil para um idioma fazer isso), "poder" não significa muito, no sentido de que qualquer coisa que você pode dizer em um idioma completo de Turing, pode dizer em outro. A resposta de Mark Canlas diz: concisão e flexibilidade fazem a diferença.

Dito isto, o artigo de Matthias Felleisen Sobre o poder expressivo das linguagens de programação contribui para uma leitura interessante. Nele, ele tenta formalizar a noção de expressividade nas línguas.


A propósito, isso não é verdade. Eu já vi idiomas que são Turing completos, mas menos poderosos que outros idiomas. Um exemplo simples: considere uma linguagem que tenha apenas números inteiros e seqüências de caracteres como seus tipos de dados, nenhuma maneira de converter entre elas, computação arbitrária em números inteiros e apenas concatenação e comparação de seqüências de caracteres. (Eu trabalhei com essa linguagem.) É Turing completo, mas não pode expressar funções arbitrárias em seqüências de caracteres, portanto, adicionar mais funcionalidade aumentará seu poder computacional.
Reinierpost 28/03

@reinerpost - disse que a linguagem completa de Turing ainda pode calcular funções arbitrárias em strings, apenas tem que representá-las de uma maneira diferente. A integridade de Turing é praticamente ortogonal à pergunta de quais tipos de dados você tem disponível. Por exemplo, algumas linguagens completas de turing não têm tipos de dados e apenas representam tudo com funções - e precisam recorrer a coisas como codificação da igreja para aritmética.
Mikera

1

Parece haver muita discordância sobre o que constitui poder linguístico. É concisão, legibilidade, adaptabilidade ou simplesmente perfeição de Turing? Eu acho que todos esses fatores entram em jogo, então talvez a melhor maneira de ver isso seja em termos de pontos estatísticos. Sim, estou falando de RPG de caneta e papel, aqui.

A idéia é que cada idioma tenha (aproximadamente) o mesmo número de "pontos", que podem ser distribuídos arbitrariamente por várias categorias. Para fins de discussão, digamos que os únicos fatores sejam brevidade, legibilidade e flexibilidade. Uma linguagem então pode ser extremamente concisa e flexível, mas consequentemente muito difícil de ler; ou muito legível e flexível, mas extremamente detalhado.

(Indiscutivelmente, o número de pontos que uma linguagem precisa distribuir é definido pela habilidade do designer e implementador, mas vamos fingir que todos os designers de linguagem são igualmente bons no que fazem.)

Quando um designer de idioma decide aumentar a força de um idioma em uma categoria, logicamente retira uma fração dessa força potencial de todas as outras categorias. É por isso que é dito com tanta frequência que o design da linguagem de programação tem tudo a ver com trade-offs. Desse ponto de vista, o poder geral de um idioma ainda não é definível e precisamos voltar ao método testado e verdadeiro de categorizar idiomas com base em seus pontos fortes. Não é satisfatório? Que pena.

Você pode argumentar de duas maneiras: que uma linguagem poderosa é aquela com uma distribuição relativamente uniforme de pontos (valete de todos os negócios, mestre de nenhum), ou com o máximo de pontos possível em uma área sem deixar os outros sem supervisão (especialista). Não existe uma linguagem do "homem renascentista", com domínio perfeito em vários campos. E se essa é a sua definição da linguagem mais poderosa possível, você está sem sorte.

Para uma leitura mais aprofundada, este artigo (coincidentemente também por Paul Graham, que parece ter opiniões contraditórias) aborda a idéia de que, por mais difícil que seja determinar como , as linguagens de programação realmente variam de poder. Ele argumenta de maneira bastante convincente que é muito fácil ver como uma linguagem é menos poderosa do que a sua preferida - falta o recurso X -, mas é muito difícil ver como uma linguagem genuinamente mais poderosa é realmente isso - é basicamente equivalente à linguagem X, mas com um monte de outras coisas jogadas. Deixo-vos com uma citação desse papel:

Por indução, os únicos programadores em posição de ver todas as diferenças de poder entre as várias linguagens são aqueles que entendem a mais poderosa. (É provavelmente o que Eric Raymond quis dizer sobre Lisp fazer de você um programador melhor.) Você não pode confiar nas opiniões dos outros, por causa do paradoxo Blub: eles estão satisfeitos com o idioma que usam, porque dita o a maneira como eles pensam sobre os programas.

Não concordo com o seu modelo de que toda linguagem necessariamente tem um número igual de pontos em sua distribuição. Vamos dar o exemplo extremo de brainf * ck e podemos facilmente dizer que não é comparável a nenhuma linguagem moderna, mesmo que seja apenas pelo número total de pontos. isto é, não é um jogo de soma zero na linguagem de programação - a linguagem não começa com x pontos e os distribui, eles começam com 0 e ganham pontos dependendo dos recursos. É claro que existe algum compromisso a ser tomado, é claro, mas todas as opções não são iguais (pelo menos na minha opinião).
N1ckp 07/10/10

Eu não disse que todas as línguas necessariamente têm o mesmo número de pontos. Eu disse que todos os idiomas em consideração (ou seja, idiomas projetados para uso real) têm aproximadamente o mesmo número. As línguas esotéricas são um caso patológico porque não foram projetadas para serem úteis em primeiro lugar. Eu estava simplificando por uma questão de argumento, já que não é útil tentar diferenciar idiomas com base no "número de recursos", se os recursos forem contáveis.
quer

desculpe, reli sua postagem e tenho que concordar que li um pouco rápido demais ... mas ainda discordo que todos os idiomas (mainstream) têm aproximadamente os mesmos pontos. Vamos pegar Java e c ++ porque eles são uma linguagem que eu conheço um pouco bom. Tenho certeza de que posso afirmar que o c ++ é mais poderoso que o Java, apenas porque o c ++ desativa basicamente tudo o que o Java faz (exceto o gc - mas o java também não oferece gerenciamento manual de memória) MAIS (modelos reais FTW). Que o que tanto o ponto que eu queria fazer eu penso: Não, não é toda a linguagem mais ou menos iguais em programação terra de fadas, mesmo
n1ckp

ao comparar apenas os principais idiomas.
N1ckp 08/10/10

0

Linguagens de programação são ferramentas - nada mais, nada menos. Algumas ferramentas são extremamente especializadas e adequadas para fins específicos; outros são generalizados e simplificados ao ponto de quase inutilidade.

Eu argumentaria que a linguagem mais "poderosa" é a que permite alcançar seus objetivos com um investimento mínimo de tempo, energia e outras pesquisas; isto é, o idioma que fornece o maior ROI. Em algumas situações, pode ser C; em outros, Java; em outros ainda, Haskell.

A melhor coisa a fazer seria se familiarizar com uma grande variedade de idiomas e para o que eles são úteis. Então, quando chegar a hora de começar um novo projeto, você poderá tomar uma decisão informada sobre qual seria o mais apropriado.


-1

Discussões sobre linguagens de programação são - como o IMHO - discussões sobre clientes de email em alguns grupos de notícias do Linux: elas tendem a ser uma guerra de chamas. Lembro-me de quando o VB6 era popular. Havia pessoas até argumentando que não era uma linguagem de programação, enquanto outras criavam aplicativos impressionantes.

Eu acho que as linguagens de programação já diferem no conceito, pois os criadores tinham coisas diferentes em mente quando criaram / projetaram a linguagem. Portanto, uma linguagem que se encaixa a um propósito - e sob essa circunstância é poderosa - pode não se encaixar em outro. Nomear o idioma como poderoso ou não é então puramente subjetivo. Dito isto, não acho que exista uma métrica que possa ser aplicada.


+1 para combater votos negativos inexplicáveis ​​e porque geralmente concordo com isso. Use um idioma para a tarefa para a qual foi projetado. Não escreva GUIs complexas em C, não escreva algoritmos ou sistemas operacionais complexos em VB6
Gerry

-1

São todas as ferramentas no seu baú de ferramentas. Um martelo pode ser poderoso, mas não se você precisar de uma chave inglesa. O C / C ++ é ótimo se você é um programador de sistemas, mas o Adobe Flash é provavelmente o melhor ajuste para o site de jogos que você deseja criar.


-1

A linguagem de programação mais poderosa é a que resolve o seguinte problema de programação linear :

Maximizar

      Rapidez de desenvolvimento
    + Facilidade de leitura de código
    + Facilidade de depuração
    + Sucessão / brevidade de expressão
    + Facilidade de aprendizado / ensino
    - uso da CPU
    - Requisitos de memória

Sujeito a

  • Deve ser Turing Complete.
  • Ele deve ser multiparadigmático : funcional, orientado a objetos, programação lógica, programação de restrições, concorrência, computação distribuída, etc.
  • Ele deve ser versátil , permitindo a criação de interfaces de linha de comando, bibliotecas de componentes, servidores, GUIs e aplicativos da web.
  • Ele deve ser portátil , ou seja, fácil de portar e manter em uma configuração de plataforma cruzada.
  • Ele deve ser adaptável , ou seja, aberto a mudanças e capaz de evoluir à medida que novos equipamentos (chips quânticos), novos paradigmas e outras inovações tecnológicas ocorrerem.
  • Ele deve incentivar o desenvolvimento de bibliotecas (como CPAN, CTAN e CRAN).
  • Deve ser gratuito e de código aberto .

(E sim, eu sei, eu já postei uma resposta completamente contraditória. Isso é porque eu sou dialeto.)


-2

Isso foi escrito em relação às linguagens naturais, mas acho que é apropriado também as linguagens de programação:

A crença de que algumas línguas são intrinsecamente superiores a outras é generalizada, mas não tem base em fatos lingüísticos. É claro que algumas línguas são mais úteis ou prestigiosas do que outras, em um período específico da história, mas isso se deve à preeminência dos falantes naquele momento e não a quaisquer características lingüísticas inerentes.
- David Crystal (ed.). A Enciclopédia de Cambridge da Linguagem 2 / e (1997). p.7

O "poder" simplesmente não é atribuível a um idioma em detrimento de outro. Seria bobagem dizer "o chinês é uma língua mais poderosa que o coreano". Da mesma forma, é bobagem dizer "APL é uma linguagem mais poderosa que COBOL".

Houve várias tentativas de equiparar o poder linguístico a alguma medida objetiva. Eu acredito que essas tentativas falham:

  • Pode ser mais fácil conseguir um emprego nos EUA se você falar inglês americano do que dizer maori. Da mesma forma, é sem dúvida mais fácil conseguir um emprego programando Java ou C, em vez de LISP ou J. Mas essa vantagem econômica certamente não reflete algum tipo de poder inato da linguagem. É sobre o poder dos falantes da língua.
  • "Oi" não é melhor que "ni hao" ou "shalom" porque é mais curto. Da mesma forma, embora uma função possa ser expressa de forma mais sucinta no APL do que no COBOL, isso também não reflete algum tipo de poder inato da linguagem.

Minha opinião é que discussões sobre "o poder de uma língua sobre outra" são expressões veladas dos sentimentos de superioridade do falante sobre outro grupo. Em suma, seu preconceito e estereótipos. Obviamente, as pessoas que são preconceituosas realmente acreditam realmente em seus estereótipos, e é improvável que você possa convencê-las a mudar de idéia.


Discordo. Por um exemplo fácil, acho que ninguém diria o contrário, a não ser que exista mais linguagem poderosa do que brainf * ck (digamos), mesmo que teoricamente esteja completo (eu acho). O ponto é que 'poderoso' é uma certa qualidade que nada tem a ver com o fato de que todos são 'completos'. Concordo que pode ser um pouco subjetivo, mas dizer que toda a linguagem é igual no que diz respeito à "plenitude poderosa" parece muito improvável.
N1ckp 07/10/10

1
@ n1ck: Você está dizendo Poder = Legibilidade? E:. A falta de legibilidade do BF implica sua falta de poder? O APL e o J também têm legibilidade muito baixa, mas são extremamente úteis e sucintos (embora eu certamente não esteja equiparando utilidade ou sucessão com poder também). Indo na direção oposta, COBOL é muito legível; é totalmente verboso; mas, novamente, isso dificilmente o torna mais poderoso que o APL ou o BF. BF é altamente divertido; tem o poder de divertir; mas isso não é poder qua poder. O problema é que ninguém parece ter uma boa teoria do poder por trás da qual eles podem obter um consenso.
Outro

1
Não, eu não quis dizer que poder = legibilidade. Apenas discordo da sua opinião de que todas as línguas são iguais e que não podemos comparar a linguagem em "poder total", no entanto você a define. Na minha opinião, é necessário um básico de legibilidade para dar algum poder à linguagem, mas não é realmente a questão. Se realmente quisermos responder à pergunta, é claro que precisaríamos definir a plenitude do poder primeiro, mas, na minha opinião, isso não é o mesmo que "o melhor em todas as situações", cuja resposta parece sugerir que você a interpretou dessa maneira (ou seja, não é o melhor idioma para tudo, o que eu meio que concordo).
N1ckp 08/10/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.