Existem linguagens de programação que seguem uma abordagem de desenvolvimento minimalista?

26

Acho que quando os idiomas são considerados iguais aos softwares comerciais, há sempre uma necessidade constante de adicionar novos recursos para justificar novos lançamentos.

Pode haver ou existem idiomas em que a versão 1.0 é a versão final? É claro que as correções de erros estão isentas disso, mas o conjunto de recursos sempre permanece o mesmo?

Dessa forma, todos os recursos do idioma se encaixam muito bem e não parecem estar aparafusados ​​após o fato de os recursos obsoletos ainda existirem por causa da compatibilidade com versões anteriores.

Eu suponho que algumas línguas acadêmicas são assim? Mas existem idiomas comercialmente bem-sucedidos que seguem essa idéia? A biblioteca que acompanha também é livre para obter novos recursos, mas o idioma sempre permanece constante.

Um exemplo que posso dar é: um dos meus idiomas favoritos em C #, que eu uso com bastante frequência, mais e mais recursos são adicionados a cada versão. Para tirar proveito disso, tenho que deixar as tarefas reais em mãos e gastar um tempo considerável aprendendo-as, em vez de poder pegar conceitos triviais e combiná-los para resolver problemas mais complexos com facilidade.

Então, acho que estou procurando uma abordagem minimalista em que tudo seja consistente, faça sentido e seja o mais ortogonal possível.

Joan Venge
fonte
7
Um campo de trabalho da maioria dos desenvolvedores é resolver problemas de maneira eficaz. Eficácia requer aprender coisas novas, constantemente. Novos recursos de linguagem, novas estruturas, novas ferramentas são desenvolvidas para serem mais eficazes. Ao aprendê-los, você está realmente se concentrando no seu trabalho.
Arseni Mourzenko
4
Bem, nem todo mundo que programa é necessariamente um programador em tempo integral. É apenas mais uma ferramenta para muitas outras profissões.
Joan Venge
4
Então, novamente, ninguém o força a aprender nada. Se o C # 1.0 resolver seus requisitos, não perca seu tempo aprendendo algo que você não precisa.
Arseni Mourzenko
11
Penso que a pergunta é legítima: por que devemos aplicar os princípios KISS e YAGNI a artefatos de software, mas não a linguagens de programação? Quando um idioma possui recursos principais suficientes, o desenvolvimento adicional é (IMHO) principalmente devido ao marketing (concorrência com outros idiomas que força as empresas a encher idiomas com recursos para manter seus clientes).
Giorgio
2
@MainMa: "Efetividade requer aprender coisas novas, constantemente.": Uma linguagem de programação complexa, repleta de recursos demais, pode diminuir a eficácia em vez de aumentá-la. Por exemplo, em uma equipe, isso pode levar diferentes desenvolvedores a usar subconjuntos diferentes do idioma, tornando menos eficientes as análises de código, a correção de erros e a manutenção.
Giorgio

Respostas:

32

Lisp, Smalltalk. Coincidentemente, esses também são os melhores idiomas do grupo.

Tanto o Lisp quanto o Smalltalk são linguagens que são construídas em torno de uma forte metáfora unificadora. A metáfora de Lisp é "tudo é uma lista; essa lista representa dados e código (como funções)". A metáfora de Smalltalk é "tudo é um objeto; a única maneira de invocar um comportamento é passar uma mensagem para um objeto". Essas metáforas permitem que os idiomas sejam estáveis, mínimos e poderosos. O resto está na biblioteca.

As coisas que são chamadas de "estruturas de controle" em todas as linguagens não mínimas (eu queria escrever "inchado") são partes da biblioteca aqui (como um exemplo: condfunção em lisp; ifTrue:/ ifFalse:família de mensagens no Smalltalk implementam uma condição, onde outros idiomas possuem ifpalavras-chave).

Pode-se observar que o Lisp / Smalltalk é uma incorporação quase mínima de seu paradigma e nada mais (Lisp: programação funcional; Smalltalk: programação orientada a objetos).

Herby
fonte
4
Boas implementações de Lisp podem competir com C, boas implementações de Smalltalk podem competir com C ++. Heck, a JVM HotSopt da Oracle, a VM mais rápida do planeta, é uma VM Smalltalk, que nem usa informações de tipo estático para otimizações.
Jörg W Mittag
9
Essa resposta é pequena demais para ser construtiva. Falta detalhes ou evidências de apoio.
Jimmy Hoffa
2
-1 Lisp? LISP ? A sério? Após as Guerras LISP da década de 1970, as repetidas tentativas de uma Unidade LISP e, finalmente, Common Lisp? Não, mesmo o LISP não conseguiu "concluir" na versão 1.0.
Ross Patterson
1
Acho que você apontou uma ideia muito importante: que uma linguagem seja construída em torno de uma (ou algumas) metáforas fortes e unificadoras, ou seja, uma linguagem de programação deve oferecer uma maneira de organizar seus pensamentos. Penso que a complexidade de algumas línguas se deve parcialmente à falta de uma metáfora: essas línguas continuam crescendo incorporando novos recursos porque não possuem uma visão unificadora subjacente.
Giorgio
6

O TeX , o sistema de composição tipográfica, tem sido muito estável desde a versão 3.

Desde a versão 3, o TeX usa um sistema de numeração de versão idiossincrático, em que as atualizações são indicadas adicionando um dígito extra no final do decimal, para que o número da versão se aproxime assintoticamente de π. Isso reflete o fato de que o TeX agora é muito estável e apenas pequenas atualizações são esperadas. A versão atual do TeX é 3.1415926; foi atualizada pela última vez em março de 2008. O design foi congelado após a versão 3.0 e nenhum novo recurso ou alteração fundamental será adicionado; portanto, todas as versões mais recentes conterão apenas correções de bugs. Embora o próprio Donald Knuth tenha sugerido algumas áreas nas quais o TeX poderia ter sido aprimorado, ele indicou que acredita firmemente que ter um sistema inalterado que produzirá a mesma saída agora e no futuro é mais importante do que a introdução de novos recursos. Por esse motivo, ele afirmou que o "

Não vou afirmar que cumpre o seu "Então, acho que estou procurando uma abordagem minimalista, onde tudo seja consistente, faça sentido e seja o mais ortogonal possível". , mas atende a maioria dos outros critérios.

Steven Schlansker
fonte
6

C e Fortran são línguas que vêm à mente. Eles são muito estáveis ​​e sua sintaxe é facilmente contida na mente. Além de escrever um código incorreto, há muito poucas surpresas ao usar esses idiomas. Mas eu não os consideraria ótimos idiomas para o rápido desenvolvimento de aplicativos.

Prefiro o rápido avanço de idiomas com recursos que, depois de dedicar um pouco de tempo, tornam meu trabalho consideravelmente mais fácil e o código menos complexo, mantendo a expressividade.

Peter Smith
fonte
1
Concordo com o design minimalista de C. Mesmo que a linguagem tenha sido atualizada durante os anos, o modelo básico de programação e design da linguagem ainda é reconhecível (outras linguagens passam por uma revolução a cada 5 a 10 anos). Obviamente, C não é uma linguagem de uso geral, como costumava ser, porque foi substituída por outras linguagens em domínios de aplicativos específicos (aplicativos de desktop, aplicativos da Web etc.).
Giorgio
@Giorgio: Nem todos. Os mínimos (como os que eu mencionei) não. Não houve alteração na sintaxe do Smalltalk desde a sua criação, exceto uma, trazida por Squeak: as matrizes computadas com chaves. A biblioteca também é muito estável no núcleo ( Behaviore Collectionhierarquias). Parece-me que C é muito menos estável com todos aqueles C89, C99 e outros enfeites.
Herby
1
@herby: Você provavelmente está certo de que outras linguagens como Smalltalk são mais estáveis ​​que C. No entanto, o modelo básico de programação de C é o mesmo que era, digamos, há 20 anos. Outros idiomas passaram por profundas mudanças. Portanto, novamente, não afirmo que C seja a linguagem mais estável, mas, na IMO, é muito mais estável do que muitas outras linguagens convencionais.
Giorgio
6

Outros já disseram Lisp, então devo falar sobre Forth . É muito fácil de implementar e as regras da linguagem são simples de seguir.

É um idioma baseado em pilha com um dicionário de "palavras". Você pode estender o idioma facilmente usando alguns recursos herdados.

Um exemplo MUITO conciso de gráficos de tartarugas:

\ 8.8 fixed point sine table lookup
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c,
: s abs 3C mod dup 1D > if 3C swap - then dup E > if
  -1 1E rot - else 1 swap then n + c@ 1+ * ;

0 var x 0 var y 0 var a
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen
: k >r 50 + 8 << r> ! ;
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing)
: g y k x k ; \ go to x,y coord
: h dup a ! dup s w ! 2D + s q ! ; \ heading
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels
  dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ;
: e key 0 vmode cls ; \ end
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin
: t a @ + h ; \ turn n-degrees

Em seguida, executá-lo : squiral -50 50 g 20 0 do 100 f 21 t loop ;fornece:

espiral

Crédito para o blog deste funcionário da Microsoft .

Austin Henley
fonte
1
Como isso foi votado novamente? Quarto pode ser um bom candidato, mas o exemplo dado não é muito melhor que o ruído da linha executável; um excelente exemplo de por que a obsessão da PLT com a tez é contrária ao que os profissionais realmente precisam.
Telastyn
4
@Telastyn Essa não era a pergunta dele.
Austin Henley
4

Embora Lisp tenha sido mencionado, a linguagem mais minimalista que conheço é o esquema . Tive dificuldade para entender isso nos cursos universitários onde precisava. Mas isso mudou minha maneira de pensar sobre programação e é muito mínima. Tão mínimos quanto toda a sintaxe são Parênteses ()e espaços.

A única mudança na linguagem foi a decisão de converter os primitivos como +, define(e alguns outros) para built-ins. Isso significa que eles estão disponíveis no lançamento, mas podem ser redefinidos durante o tempo de execução.

Ramzi Kahil
fonte
2

Tcl, que foi projetado para ser minimalista em primeiro lugar

A partir daí, na página http://www.tcl.tk/about/features.html , um dos recursos é que é muito fácil aprender e onde programadores casuais ou mesmo não programadores podem usá-lo.

Egryan
fonte
3
Isso me parece exato, mas respostas de linha única, sem informações ou detalhes de suporte, são de qualidade muito baixa para serem úteis a qualquer pessoa. Por favor, adicione alguns bons detalhes (e não apenas um link sem resumo) e você receberá um voto positivo
Jimmy Hoffa
ok, fará embora devido à pergunta que está sendo fechado não sei quanto esforço vale a pena
Egryan
1
Com sorte, será reaberto a partir de votos. É uma boa pergunta. Posso postar no Meta para tentar reabri-lo se não for reaberto em breve pela comunidade.
Jimmy Hoffa
Concordo e eu pretendo adicionar mais para o poste uma vez que eu saio do trabalho, eu não estou tendo sorte rápida de encontrar os links relevantes
Egryan
Pesquise no Google por "Um estudo de caso sobre linguagem TCL", "Tcl: uma linguagem de comando incorporável" e tcl.tk/about/history.html - eles fornecem alguns pontos-chave. No entanto, não estou certo de que o backup desejo do OP - parece que TCL foi alargado de seu original 1.0 (ver wiki.tcl.tk/1721 )
2

Existem poucas línguas que permaneceram relativamente inalteradas desde a sua criação fora das línguas esotéricas que dificilmente serão o que é desejado (eu odiaria tentar escrever algo significativo no Befunge (embora ele também tenha sido modificado desde o seu 1.0 original lançamento)).

Os idiomas com maior probabilidade de satisfazer o desejo de não precisar aprender nada de novo são os idiomas especializados em "cola" entre outros programas. Idiomas como jcl , bash e similares. Linguagens de script simples também podem se encaixar nisso - awk é um dos líderes.

Uma vez que alguém sai deste reino, o desenvolvimento acontece. A linguagem ou os frameworks. Em algumas situações, é 'difícil' codificar para o idioma sem obter parte de alguma estrutura que está revertendo rapidamente.

Muitos idiomas têm algum grau de compatibilidade com versões anteriores. Ainda é possível escrever o Java 1.4 hoje, embora provavelmente não seja recomendado - as estruturas que as pessoas escrevem para ele estão mudando mais rapidamente que a linguagem. Ainda é possível encontrar os compiladores f77 e f90 por aí para uma especificação de idioma que não mudou em 20 ou 40 anos. C, Objetivo C, C ++ ainda podem ser codificados para especificações mais antigas da linguagem - não é necessário continuar atualizando o código porque uma nova especificação foi lançada ou uma nova estrutura está disponível.

Algumas línguas têm uma história inalterada bastante longa, porque a própria linguagem é suficientemente poderosa para fazer o que se quer. Lisp é o principal candidato nesta área. Em seguida, também cai no campo "não mudou muito".

Indo para linguagens de script mais tradicionais, veja TCL, Perl e Python. Evite coisas que estão atualmente no domínio 'moda' que estão experimentando uma explosão de popularidade por algum motivo ou outro (ruby e javascript, estou olhando para você). O TCL mudou ao longo dos anos , embora um de seus objetivos seja tentar manter a consistência do design. O Perl e o Python modernos têm alguma consistência no design, apesar de admitir que novos recursos podem parecer atraídos (embora não seja necessário usá-los).


fonte
2

Eu acho que o Python é um candidato razoável para uma linguagem com o minimalismo como um de seus objetivos de design. Ele é baseado em torno de um número relativamente pequeno de conceitos fundamentais, ea versão 3 tentou, entre outras coisas, simplificar a linguagem um pouco por remover alguns recursos.

(É verdade que não é o mesmo que um conjunto de recursos que permaneceu o mesmo da versão 1, mas acho que é uma maneira bastante arbitrária de avaliar idiomas, já que os autores podem chamá-lo de versão 1 sempre que quiserem.)

Paul D. Waite
fonte
A data de resposta de dezembro de 2012 fornece um passe livre, porque desde então temos a monstruosidade conhecida como Python 3, que rivaliza com o C ++ em querer adicionar uma pilha de lixo de detritos e remover a simplicidade. Agora é uma das linguagens mais estranhas e infestadas de complementos da computação.
Thomas Browne
-1

Eu acho que a abordagem de design "minimalista" seria exemplificada pelo Tcl. Como exemplo, você pode usar o comando {catch} com os valores {return -code n} para implementar qualquer estrutura de controle que sua imaginação possa conceber; o Perl teve que esperar uma década para (oficialmente) obter {switch} - (não que o Perl sempre precisou). Você também verá que o Dodekalogue http://wiki.tcl.tk/10259 cobre completamente a gramática do Tcl - o resto, qualquer que seja o paradigma de programação com o qual você deseja trabalhar, pode ser expresso nessa gramática.

user132043
fonte
esta apenas repete ponto feito e explicado em uma resposta postada há dois anos
mosquito
Referindo-me ao post original, acho que só posso dizer ortogonalidade = história (a família de idiomas C) e recente assimilação entre idiomas; Vi em todo o sistema operacional uma abordagem entre todos os idiomas para estruturas da Web MVC generalizadas, corotinas etc. Fora dessa tendência, posso observar a adição notável de fechamentos ao C11 e ao próximo Java lambda (que refletem o desenvolvimento nos idiomas de "script" do SO).
User132043 21/04