ti-enxame.com

Por que não pode haver uma linguagem de programação "universal" que serve a todos os propósitos?

por que não combinar os melhores recursos de todas as linguagens de programação existentes e encaixá-la em uma linguagem de programação universal?

60
killown

Pela mesma razão, você não usa um canivete suíço para esculpir uma galinha ...

http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/My_swiss_army_knife.JPG/800px-My_swiss_army_knife.JPG

O canivete suíço geralmente possui uma lâmina, além de várias ferramentas, como chaves de fenda, abridores de latas e muitas outras. Esses acessórios são armazenados dentro do cabo da faca através de um mecanismo de ponto de articulação ...

O design da faca e sua flexibilidade levaram ao reconhecimento mundial ...

116
David_001

Porque

  1. ninguém quer reescrever todo o código legado.
  2. É difícil concordar com todos os propósitos
  3. Depois de reunir uma lista abrangente de propósitos, eles mudam antes que você possa construí-lo.
  4. Alguém começaria uma linguagem completamente diferente devido a um novo objetivo.
  5. Microsoft
  6. Apple
  7. Código aberto
  8. O que faríamos com todos os peixes Babel?
  9. Não foi possível nem universalizar o SQL.
80
JeffO

O que você tem na programação é um domínio de problemas muito grande. Esse domínio varia extremamente e em várias direções.

É por isso que os controladores de vôo incorporados são escritos em C e os sites são escritos em PHP, Java, Rails, .NET e muitos outros.

Para o controlador de vôo incorporado, tenho cerca de 128k de memória para trabalhar e, além disso, se meu código for uma exceção sem tratamento, o avião cair, 200 pessoas morrem e eu sou processado no valor de US $ 1 bilhão, e tenho que enviar engenheiros para todos aeroporto do mundo para consertar aeronaves aterradas, perdendo meus clientes em US $ 10 milhões/dia. Eu tenho que trabalhar com uma linguagem muito rígida e com um pequeno número de partes móveis que podem dar errado.

Para meu aplicativo Web, tenho vários GB de memória para trabalhar, mas a velocidade da rede é limitada (em menor grau todos os dias, mas esse é provavelmente o maior limite da Web). Eu vou estar olhando para uma linguagem que me oferece muitos recursos e produz resultados que podem ser transmitidos o mais rápido possível. Eu realmente não me importo se meu site for desativado, talvez eu perca algumas vendas (US $ 100) e precise corrigir o caso de uso que bombardeou, não é grande coisa.

Os sites não são escritos em C há mais de 15 anos (alguém faz algum script cgi?) E, até onde eu sei, os controladores de vôo estão apenas começando a olhar para C++, mas mesmo assim de maneira muito restrita.

38
Bill Leeper
  1. Vá para a sua garagem (ou a garagem dos seus pais).
  2. Abra a caixa de ferramentas.
  3. Se você vir mais de uma ferramenta, pense em como isso se aplica à sua pergunta.

Se você não possui uma caixa de ferramentas ou apenas um desses pequenos martelos com as pontas da chave de fenda na alça oca, então eu tenho uma grande simpatia por você.

A sério. Se você for a uma oficina, seu mecânico tem apenas uma única ferramenta "faça tudo" em seu baú? Ele (ou ela) é um profissional, com ferramentas de nível profissional projetadas especificamente para executar várias tarefas de reparo de automóveis.

Da mesma forma, os desenvolvedores profissionais de software devem possuir um conjunto suficiente de ferramentas para realizar seu negócio. Se você abrir a caixa de ferramentas e vir apenas [o software equivalente a] uma chave de fenda Philips, não poderá se considerar um profissional.

Você pode girar um parafuso com uma chave de boca, uma chave de caixa, uma chave de catraca ou uma chave ajustável. Você pode até girar um parafuso com um alicate, de maneira desajeitada, com danos menores a graves. Mas é bastante difícil girar um parafuso com uma marreta.

24
brettmjohnson

Um tipo diferente de resposta para os outros - eu realmente acho que existe um potencial para que uma linguagem se torne "universal", permitindo as características e paradigmas de muitas outras línguas, embora talvez não seja uma linguagem estritamente projetada em que você possa estar pensando.

Para usar analogia de brettmjohnson acima, a idéia de que cada linguagem de programação é a ferramenta dentro de uma caixa (ou em um canivete suíço) é a suposição que todo mundo está fazendo, mas é realmente uma suposição defeituosa.

E se a linguagem de programação fosse a caixa de ferramentas?

Quero dizer, e se você puder adicionar e remover recursos do idioma como quiser e ter sua própria caixa de ferramentas com as ferramentas necessárias - mesmo que as ferramentas sejam para propósitos diferentes.

O conceito já existe parcialmente. Por exemplo, idiomas como Nemerle permitem que você adicione sintaxe ao idioma e, como tal, você poderá obter "o melhor recurso do idioma X" e adicionar para Nemerle (ou o seu). Isso não significa necessariamente escrever suas próprias macros o tempo todo - cada idioma (ou paradigma) pode ser definido dentro de uma macro em uma biblioteca padrão - de forma que você possa import Haskell; import Prolog; e comece a escrever os dois idiomas como se fosse parte do seu idioma?

A questão então é: como você consegue que os recursos de diferentes linguagens/paradigmas funcionem entre si? Embora eu não possa responder isso, estruturas como .Net e JVM oferecem algumas das soluções - as linguagens são pelo menos parcialmente compatíveis devido à maneira como são compiladas. Você pode pegar qualquer código escrito em C #, por exemplo, e usá-lo no F # sem queixas.

O 'problema' com a solução como ela é hoje é que o uso dessas linguagens juntas exige que você as crie como projetos separados, que não podem se referir um ao outro - você só pode ter uma referência unidirecional. A barreira do idioma é que cada projeto compila todos os seus arquivos separadamente no Common Intermediate Language antes que qualquer outro projeto possa acessá-lo.

Um passo em direção à remoção dessa barreira seria permitir que códigos de diferentes idiomas (por exemplo, C # e F #) fossem compilados dentro do mesmo projeto. Em teoria, você pode compilar cada arquivo separadamente (ou em grupos - se eles tiverem tipos parciais ou referências circulares) e, em seguida, compilar arquivos de um idioma diferente que possa acessar os objetos já compilados (CIL). Você precisaria definir estritamente a ordem de compilação para que isso funcione - mas a ordem de compilação já é necessária no caso de F #.

Enfim, não estou dizendo "definitivamente pode haver uma linguagem universal". Estou sugerindo que existe o potencial para uma interoperabilidade muito melhor entre os idiomas do que o que existe atualmente. Na realidade, não é provável que melhore muito em breve, apenas devido à enorme quantidade de trabalho necessário para implementar uma linguagem e as bibliotecas, as ferramentas etc. necessárias para usá-lo.

20
Mark H

Os melhores recursos de alguns idiomas conflitam com os melhores de outros.

Por exemplo: reflexões com reconhecimento de tipo são um recurso muito bom, mas não valeria muito em uma linguagem de tipo fraco, mas a digitação solta também pode ser um benefício real às vezes.

Mesmo em um idioma, você nem sempre pode usar todos os melhores recursos ao mesmo tempo, porque eles conflitam.

10
Bill

"Jack de todos os comércios, mestre de ninguém." vem à mente.

Alguns programas exigem velocidade, outros grandes quantidades de memória ou acesso rápido ao disco. Alguns idiomas são bons em um, mas ruins em outro - não acho que você tenha um idioma que seja bom.

Portanto, enquanto você pode escrever praticamente qualquer programa em qualquer idioma, o que você recebe não é garantido como o "melhor" programa que você poderia escrever para resolver esse problema.

7
ChrisF

Os idiomas moldam a maneira como as pessoas pensam. Isso é verdade para idiomas naturais. Se uma criança conhece apenas um idioma com os números "um, dois, muitos", ensinar matemática a criança é ... difícil. (Desculpe, não tenho o link). Em inglês, falamos de momentos diferentes como se fossem lugares - portanto, é possível imaginar o conceito de viagem no tempo. Em alguns outros idiomas, a idéia de viagem no tempo nunca ocorreria aos seus falantes.

Isso também vale para linguagens de programação.

Portanto, se tivermos uma única linguagem de programação, todos pensarão em todas as tarefas computacionais exatamente da mesma forma. Portanto, não exploraremos alternativas, e a melhor maneira de fazer algo permanecerá desconhecida.

O mais próximo que temos de uma linguagem universal é o C. C mapeia muito de perto os conceitos subjacentes de hardware (como as coisas realmente são feitas no hardware) e os programas em todos os * idiomas são conversíveis em C. (Veja como o CFront usou compiladores C para assembler O problema com C é basicamente que as conversões acima mencionadas não fariam sentido do ponto de vista dos programadores em C.

"Lambdas" sempre foram possíveis em C. A sintaxe está desativada, incluindo o código espalhado por todo o projeto/arquivo, portanto, não era uma solução preferida. Com uma versão no-capture/upvalue/etc, defina uma função em outro lugar e passe um ponteiro para a função. (consulte qsort ()) Para usar lambdas com valores capturados, a quantidade e a complexidade do código que você precisa escrever aumentam muito - até onde eu sei, ninguém realmente escreveu o código a ser usado este método de programação em C. Ao contrário de linguagens em que lambdas fazem parte da linguagem e são basicamente usadas em todos os lugares.

A principal diferença entre C e C++ é como você pode pedir ao C++ para cuidar de coisas para você; mas você não poderá mais ver, a partir de apenas uma única linha de código, o quanto realmente está pedindo. A resposta é: depende (de todo esse outro código).

Algumas linguagens de programação são excelentes para tarefas específicas, mas onde a maioria dos programas atuais em uso em todo o mundo simplesmente não faria sentido se programados nessa linguagem. Ou seja, se a linguagem pudesse ser usada para implementar esse programa, o que não é um dado.

5
MaHuJa

Há sim. Nenhuma ferramenta é a melhor para tudo, mas algumas ferramentas, como muitas linguagens de programação, servir para todos os fins, não melhor para todos.

Você pode escolher a melhor ferramenta para o trabalho, mas existem linguagens de programação que podem ser usadas para todos os fins e você pode escolhê-las. Eu não recomendo, mas é possível.

4
Maniero

É um erro pensar que "combinar todos os recursos" criará uma linguagem melhor.

É mais provável que você acabe com uma bagunça inchada, complexa e ilegível.

Um bom design de linguagem requer escolhas e trocas a serem feitas. Indiscutivelmente, os melhores/mais revolucionários/mais bem-sucedidos idiomas são aqueles que extraem algo e fornecem uma alternativa melhor ao invés de adicionar coisas novas.

  • Linguagens de programação estruturada (C, Pascal) - remove "goto", substitui por procedimentos e loops estruturados etc.
  • Java - remove "gerenciamento manual de memória", substitui por GC/memória gerenciada
  • Haskell/Clojure - remove "estado mutável não controlado"
  • LISP - remove a maioria das "sintaxes da linguagem", substitui por uma árvore homoicônica flexível de expressões-s

Há uma grande conversa sobre este top pelo tio Bob Martin - a última linguagem de programação

4
mikera

A impossibilidade por mérito técnico de se ter uma linguagem universal? Isso é total absurdo. Você poderia possui uma linguagem universal que cobre todas as bases. O problema é principalmente histórico: idiomas diferentes foram inventados para fazer coisas diferentes e serem usados ​​em comunidades diferentes. Muitos deles ficaram presos. Adicione a essas preferências (vi! Emacs! Wait, eu quis dizer Java! C #, espere, quis dizer Microsoft, Open Source, etc. etc. etc.) e incorporação geral de acidentes históricos ... Veja as linguagens naturais em uma pequena área massa como alguns países europeus para ver o quão louco esse tópico pode se tornar. Algumas cidades têm seu próprio orgulho e alegria, um pequeno dialeto que apenas eles falam. Nações e comunidades de programação não são tão diferentes, nem as comunidades de programação são mais racionais. Se fossem, todos nós falaríamos esperanto e programaríamos na Universal alguma coisa ...

4
Dan Rosenstark

Por causa de algo que chamo de "paradoxo de generalização/especialização", que provavelmente tem outro nome e realmente não é um paradoxo

Quanto mais generalizada a linguagem de programação, mais código é necessário para realizar alguma coisa. Quanto mais especializada a linguagem, menos você pode realizar com ela.

4
Homde

Com tudo o que está escrito até agora, é difícil acrescentar muitas justificativas novas, mas vou apresentar algumas.

  • Evolução: Não são apenas os sistemas biológicos que são introduzidos, sofrem mutações e passam por uma competição de sobrevivência do mais apto por recursos e um nicho a ser chamado. A competição é boa e leva as coisas adiante.

  • Maturidade: produzimos linguagens de computador há provavelmente menos de um século. Ainda não podemos ter a resposta, porque ainda nem sabemos todas as perguntas.

  • Gênese separada: Não tenho certeza da palavra certa para isso, mas no mundo existem muitos sistemas de escrita iniciados em muitas regiões geográficas. Pense no cuneiforme que foi ditado em parte pelas exigências de esculpir em tabletes de argila. Pense nos alfabetos sânscrito, grego, hebraico, romano e árabe. Hieróglifos, o método chinês de escrever com mais de 6000 símbolos, compartilhado em muitos países do leste asiático. Pense em alfabetos mistos mais modernos com base fonética como cirílico, katakana e hirigana. Eu não sou lingüista, então não chame as imprecisões muito severamente, mas quando as culturas em todo o mundo precisam de algo, elas o criam e o fazem por necessidade. As linguagens de computador surgiram quando havia muita comunicação em todo o mundo e, como os sistemas Imperial e Métrico, vinham de lugares com poderosa liderança de idéias. Porém, as linguagens de programação atendem a muitas culturas diferentes (algumas delas culturas corporativas), portanto refletem as pessoas que as criaram. As linguagens de computador vêm com legados culturais que moldaram seu design e uso. Na cultura do kernel do SO, é improvável que C e C++ sejam preteridos em breve por Java (ou o contrário)) porque eles permitem geração de código nativo, acoplamento próximo/eficiente com hardware para criar abstração de hardware camadas e possui uma base instalada considerável.

  • Design do design: linguagens de programação surgem usando diferentes paradigmas organizacionais. COBOL e Ada eram de comitês que faziam parte do DOD, que tinham muita hierarquia. Se bem me lembro, C, C++, Java e provavelmente muitos outros vieram de um ou de um pequeno número de designers. Fred Brooks compara os resultados do comitê versus as abordagens baseadas no Visionary em seu artigo, o Design of Design (http://www.youtube.com/watch?v=pC-DlX-PaF4). Se hoje nos sentássemos para selecionar um Da Vinci ou um comitê para definir a linguagem de programação universal, saberíamos quem ou o quê por qual método ele deveria ser arquitetado?

0
DeveloperDon

Talvez um pouco diferente de tudo isso:

O que é um idioma? Para ser ridiculamente simples, é vocabulário, sintaxe e semântica.

Qual é a primeira coisa que você faz com uma linguagem de programação?
Você define coisas - classes, variáveis, métodos - amplia o vocabulário e a semântica.

Por quê? Então agora você pode dizer coisas que não podia dizer antes.
Goste ou não, você criou uma nova linguagem para fins especiais.

IMHO, o que procurar em uma linguagem de uso geral é se isso facilita a criação de linguagens de finalidade especial.

0
Mike Dunlavey

Não há nenhuma ferramenta que possua todos os melhores recursos. Por exemplo, um bom recurso de Javascript e Scheme é que eles são pequenos; portanto, se você começar a compactar recursos, já terá perdido um.

Ainda Cobra parece promissor na direção de ter todos os recursos do Nice de outros idiomas. :-)

0
Andrea

Além do argumento do canivete suíço (que tem um ponto - é mais difícil projetar uma boa linguagem de amplo espectro do que um domínio- específico - mas isso não significa que esse idioma não seria possível e é uma boa ideia), há problemas em "combinar os melhores recursos":

  • Para os recursos de linguagem, "melhor" é subjetivo ou pelo menos (interminavelmente) discutível.
  • Alguns recursos não são compatíveis; um bom recurso de um idioma pode explodir quando combinado com um bom recurso de outro.
  • Ainda não terminamos de apresentar novos recursos.

Em resumo, o design da linguagem é mais difícil e complicado do que isso. Embora, você pode querer dar uma olhada em Scala .

0
comingstorm

Porque se você criar um idioma assim, será outro idioma novo. Você pode ter uma grande base de fãs, mas todos os outros idiomas ainda existirão.

C ainda existe, embora muitos novos idiomas tenham sido inventados desde então.

Você poderia dizer que python é uma linguagem universal, mas também há Ruby.

A razão pela qual existem muitas linguagens é simplesmente porque existem muitos programadores e alguns deles gostam de criar novas linguagens.

A razão pela qual não existe uma linguagem universal única com a qual todos concordam é que a programação como um ofício não é ditada por alguma instituição que toma toda a decisão. Todo mundo é livre para fazer o que quiser.

Isso é uma coisa boa.

0
hasen