Qual é a linguagem de programação mais ortogonal? [fechadas]

46

Sinto-me repetidamente aborrecido por ter que ensinar calouros sobre regras especiais de linguagem (como decaimento de array para ponteiro) que não têm absolutamente nada a ver com a programação em si. Então eu me perguntava:

Qual é a linguagem de programação com o menor número de regras especiais de linguagem, onde tudo é de primeira classe e pode ser composto sem restrições técnicas irritantes? Essa língua não seria a linguagem de ensino perfeita?

Nota do moderador

Estamos procurando respostas longas que forneçam alguma explicação e contexto. Não basta listar um idioma: explique por que você acha que o idioma responde à pergunta. Respostas que não explicam nada serão excluídas. Consulte Subjetivo bom, Subjetivo ruim para obter mais informações.

fredoverflow
fonte
1
Tente usar o Unlambda - existe quase o menor número possível de blocos de construção de idiomas. Resposta um pouco mais séria: esquema (R5RS especificamente).
SK-logic
@ SK-logic, Unlambda não é ortogonal porque I=SKK. O máximo em idiomas ortogonais são idiomas de instrução única, como Jot e RSSB.
Peter Taylor
11
@ Peter - Eu não acho que ele significa estritamente mínimo. Uma linguagem mínima acaba com todas as definições extras da biblioteca, para que os alunos tenham que aprendê-las de qualquer maneira. O modo como leio essa pergunta é "qual idioma melhor segue o princípio da menor surpresa?".
precisa saber é o seguinte
1
@ Peter Taylor: você poderia dar um exemplo em que Timtowtdi entra em conflito com a ortogonalidade?
keppla
1
Eu acho que "ortogonalidade" é uma má escolha de palavras aqui. Como Peter e Steve estabeleceram, o que você realmente quer dizer é "princípio da menor surpresa" ou alguma qualidade intimamente relacionada.
Konrad Rudolph

Respostas:

53

Quando se trata de "muito poucas regras", eu argumentaria que Lisp ou Smalltalk venceria. A sintaxe vazia pode ser escrita em uma guia de cerveja.

Mas, na minha experiência, a simplicidade do Lisp e do Smalltalk não significa que eles sejam simples de entender e fáceis de ensinar. Embora não seja o caminho "puro", na minha experiência, o estilo de lista de tarefas das linguagens imperativas é o mais fácil de entender para iniciantes.

Portanto, sugiro Python, Ruby ou algo de abstração semelhante : você encontra (quase) todos os conceitos básicos neles (OK, sem ponteiros), mas não precisa entendê-lo desde o início para fazer algo funcionar.

keppla
fonte
33
trabalho impressionante que mede a sintaxe em unidades de uma guia de cerveja.
Psr
3
E não se esqueça do Perl. Muito mais Perl por aí do que a maioria das pessoas pensa, e a comunidade de usuários é enorme .
Randal Schwartz
20
Perl pode ser muito poderosa, mas um cara que acha o caminho mais fácil para a programação deve ter o equivalente a túneis templos de Indiana Jones como principal corredor de seu quarto para seus chuveiros ...
Kheldar
9
A sintaxe de Perl poderia caber em uma guia de cerveja, desde que você bebesse bastante cerveja.
Dave Sherohman
4
@Randal, a pergunta pede uma linguagem ortogonal . A filosofia de Perl é ser não ortogonal - "há mais de uma maneira de fazer isso".
Peter Taylor
41

Eu diria que o LISP, ou Scheme ou uma linguagem dessa família seria a mais ortogonal. Com let, lambda, define, if, cons, list, e ( )você pode ensinar praticamente qualquer coisa que você iria querer em um curso de introdução. Também não há necessidade de diretivas de pré-processamento ou int main()coisas do tipo que os alunos apenas incluam, mas não veem uma razão para isso.

Nos meus cursos introdutórios de CS, fizemos muitas coisas realmente interessantes com o Scheme: implementar uma máquina de Turing, implementar um computador TC-201, escrever uma gramática livre de contexto, usar recursão, escrever mesclagem e inserção, implementar somadores e toneladas de outras coisas.

Eu tinha feito Java na AP compi antes da faculdade, mas Scheme era ótimo porque eu podia reduzir a confusão e me concentrar nos conceitos reais do meu programa. Foi uma ótima aula e eu recomendo que você experimente para ensinar.

BlackJack
fonte
5
Aceita. A raquete (anteriormente PLT Scheme) é uma variante do Scheme um pouco mais amigável que a nossa escola usa com grande sucesso nas aulas introdutórias.
NickAldwin
3
E o Haskell? Não conheço muito Haskell, mas esperaria que fosse uma linguagem ortogonal.
Giorgio
4
@Giorgio: A sintaxe Haskell é bem mais complicada, embora apenas um subconjunto possa ser exposto, eu acho. O fato de você precisar interagir com as mônadas de IO desde o início para obter qualquer programa interessante é um pouco irritante, dado o objetivo do OP.
Matthieu M.
4
Para "ortogonal", voto no Scheme, particularmente na implementação do Racket . O ambiente do Racket é projetado para facilitar o caminho do aluno do que algo como Common Lisp bruto. A linguagem é limpa, com poucas regras, de fato. Há muito tempo, o MIT decidiu usar o Scheme para ensinar os alunos do primeiro ano, usando o livro SICP . Os alunos que sobreviveram parecem ter um bom desempenho no mercado. No entanto, essa abordagem não ensinará diretamente aos alunos como escrever código de nível comercial nos idiomas mais usados.
precisa
2
Sim! O fato de o Scheme ser radicalmente diferente da maioria das linguagens "reais" permite que você se concentre na programação e não nas APIs. Esquema de aprendizagem é como a " cera, cera " da codificação; parece uma perda de tempo até você perceber que tem um entendimento mais profundo do computador do que antes.
benzado
17

Pascal foi projetado especificamente para ensinar programação. É fácil de aprender (foi uma das primeiras linguagens de programação que aprendi).

Henrik
fonte
3
Também aprendi a programar usando Pascal e acho que é uma linguagem muito limpa. O único recurso não ortogonal em que posso pensar é a sintaxe dos procedimentos writeln () e readln (), que possuem um número variável de argumentos e permitem especificar a formatação.
Giorgio
Eu achei uma linguagem muito frustrante. Mas posso estar projetando, pois tive um instrutor muito, muito ruim.
greyfade
14

Logo: ainda está vivo e chutando !

; draws a triangle
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120
FORWARD 100
RIGHT 120

Pode parecer mais um brinquedo do que uma linguagem de programação, mas não seria um primeiro passo ruim para muitas pessoas. A sintaxe é muito simples, mas a tartaruga fornece uma forma mais concreta de feedback do que a maioria dos idiomas / ambientes. Tentar criar uma forma específica é uma ótima maneira de aprender o processo de pensar adiante para resolver um problema.

Se você tem aversão às tartarugas, acho que Scheme é o caminho a seguir.

benzado
fonte
1
Acredite ou não, o Logo é um Lisp, assim como o Scheme. A maioria dos usuários não vai além do simples gráfico de loop e tartaruga para aprender isso.
Sean McSomething
@SeanMcSomething Isso é interessante, dado o foco em efeitos colaterais (mover a tartaruga) ao invés de avaliação de expressões.
precisa
10

Eu proporia o SML e o Haskell. A ortogonalidade tem sido o principal ponto de projeto para ambos. Em particular, o núcleo do SML (ou seja, a parte da linguagem que não se preocupa com a modularidade) é praticamente um cálculo lambda digitado. Como resultado, a maioria dos recursos de idioma é orientada por tipos e os tipos, por sua vez, orientam os formulários de introdução e eliminação dos valores. Isso é praticamente ideal.

Existem algumas verrugas não-teóricas em ambos os idiomas (eqtypes em SML, seq em Haskell), mas elas ainda superam qualquer coisa por aí em termos de interações bizarras de recursos de linguagem não relacionados.

Lambdageek
fonte
7

Qualquer que seja a escolha, eu recomendaria fortemente o ensino de uma linguagem "real" . O ensino de línguas de brinquedo funciona para algumas pessoas, mas para outras é muito, muito frustrante devido à desconexão com o mundo real. Algumas pessoas precisam de relevância no mundo real como motivação para o aprendizado, e não é nosso lugar para julgar essa estratégia de aprendizado (na verdade, esse é um equívoco comum).

Isso desqualifica idiomas como logotipo, mas também idiomas específicos de domínio como processamento . Enquanto o último é extremamente útil para certas coisas (por exemplo, produzindo gráficos de informação), o uso é muito restrito para a maioria dos usos (e, portanto, a maioria dos usuários). Isso também exclui o Gofer , um subconjunto inútil de Haskell. Ele também exclui Pascal porque, embora o último tenha sido usado em projetos reais, ele não é mais relevante e simplesmente não possui recursos essenciais (por exemplo, seqüências de caracteres embutidas).

Das linguagens práticas, eu concordo com as já mencionadas: dialetos Lisp ou Scheme modernos, Haskell, Python ou Ruby. Pessoalmente, eu provavelmente usaria Python, mas todas essas opções têm sua parcela de vantagens e desvantagens.

Konrad Rudolph
fonte
2
É uma falácia afirmar que ensinar uma linguagem "real" é a maneira de fornecer relevância no mundo real. O trabalho do professor é mostrar como a linguagem "brinquedo" se relaciona com as habilidades do mundo real. Aprender a fazer malabarismos começando com facas não significa que você está aprendendo habilidades de malabarismo mais relevantes.
benzado 26/08
3
@benzado Você entendeu mal o meu ponto. Se você aprende um idioma de brinquedo, precisa transferir suas habilidades para torná-las relevantes para os problemas do mundo real. Meu argumento principal era que essa transferência é um indireto adicional que impede ativamente que algumas pessoas aprendam . Pessoas diferentes aprendem de maneiras totalmente diferentes, e algumas pessoas realmente precisam desse imediatismo. Aprender a fazer malabarismos com facas não é a mesma coisa. A verdadeira analogia seria aprender a programar escrevendo um sistema de orientação de mísseis ao vivo como o primeiro projeto, e eu nunca sugeri isso.
Konrad Rudolph
3
Eu entendi o seu ponto. Nós apenas discordamos. Eu acho que a transferência é importante, exige que o aluno tenha um entendimento mais profundo do que aquele que tem uma estratégia de adivinhação bem-sucedida (por exemplo, alguém que "resolve" problemas de palavras escolhendo números e inserindo-os nas fórmulas no início do capítulo) ) Em outras palavras, se eles não podem transferir o que aprenderam, nunca aprenderam isso em primeiro lugar. Para manter os alunos motivados, basta escolher os problemas certos, o que é importante, independentemente do idioma, "real" ou "brinquedo".
benzado 29/08
Transferência @benzado é importante, não há argumento lá. Mas é toda uma outra disciplina que precisa ser ensinada, e alguns alunos não a possuem. Além disso, a parte do "entendimento mais profundo" também é verdadeira, mas também é importante: este já é um estado avançado que precisa ser alcançado . Uma vez que os alunos tenham aprendido, eles podem transferi-lo. Mas primeiro eles precisam aprender e, para fazer isso, alguns alunos precisam de relevância. A transferência vem mais tarde.
Konrad Rudolph
No ensino da matemática (onde eu tenho uma pequena quantidade de experiência), "Aprender sem Entender" é um grande problema: um foco em como fazê-lo sem o porquê . Minha afirmação é que, se você ensinar os conceitos de programação, uma linguagem de brinquedo funcionará bem, e se você conseguir , a transferência para uma linguagem "real" não será difícil. (Se a transferência é difícil, você ensinou procedimentos, não conceitos.) Um ambiente de brinquedo não impede que as pessoas aprendam, mas exige um bom planejamento de aula para se envolver. (I como esta discussão, mas eu acho que nós já cruzou o território de discussão e os moderadores serão desagradou.)
benzado
6

O Tcl possui 12 regras que governam o idioma inteiro.

[1] Commands. 
[2] Evaluation. 
[3] Words. 
[4] Double quotes. 
[5] Argument expansion. 
[6] Braces. 
[7] Command substitution. 
[8] Variable substitution.
[9] Backslash substitution.
[10] Comments. 
[11] Order of substitution. 
[12] Substitution and word boundaries.

Existem muito poucos casos especiais, palavras ou caracteres reservados.

Bryan Oakley
fonte
4

Qual é a linguagem de programação com o menor número de regras especiais de linguagem, onde tudo é de primeira classe e pode ser composto sem restrições técnicas irritantes? Essa língua não seria a linguagem de ensino perfeita?

Para expandir meu comentário, no Jot, tudo é de primeira classe (porque é um cálculo lambda) e pode ser composto. Existe apenas uma instrução. É uma linguagem de ensino absolutamente terrível.

Em geral, os tarpits de Turing têm muito poucas regras especiais e exigem que você compreenda bem os fundamentos da computação antes de poder fazer qualquer coisa. A linguagem de ensino perfeita permite que os alunos experimentem sem puxar todo o cabelo, então abstrações de nível superior são realmente boas.

Peter Taylor
fonte
Obrigado por me apresentar o termo 'turing tarpit', sempre precisei de um termo para esse tipo de simplicidade.
keppla
Concordo que os alunos devem ser capazes de experimentar, mas exigir compreensão antes que você possa "fazer qualquer coisa" parece ser o objetivo principal do ensino.
benzado 26/08
@benzado, eu concordo que o objetivo do ensino é transmitir entendimento. Mas com a maioria das pessoas, você precisa começar com os conceitos básicos, deixar que eles pensem nisso e depois ensiná-los conceitos intermediários. Então você quer um idioma em que alguém que entenda um pouco possa escrever programas que o façam um pouco. Há uma razão para a maioria dos cursos de programação não começar ensinando máquinas de Turing ou máquinas de registro Minsky.
22411 Peter
1
Certo, acho que diferimos do que "fazer um pouquinho" significa. Se você quiser (por exemplo) apaziguar o contingente "mostre-me como fazer videogame", poderá fazer algumas coisas, mas elas chegarão a um ponto porque não podem progredir e ficar frustradas, e então é necessário volte para as "partes chatas" para que elas possam entender melhor para seguir em frente. Neste ponto, eles já estão frustrados de uma maneira ruim e podem simplesmente desistir; por outro lado, fazer as "partes chatas" primeiro e construir para cima significa progresso contínuo. Mas, obviamente, você não começa com uma tira de fita semi-infinita.
benzado 26/08
2

Os recursos mais importantes em um idioma que você aprende são:

  • princípio da menor surpresa (PASCAL)

  • legibilidade (Ada)

Na minha opinião, o segundo supera o primeiro, pois a leitura do código é ainda mais importante do que escrevê-lo.

Agora, novamente, eu escrevo C #, Java, Objective-C e Javascript para viver, todos com peculiaridades horríveis: D

Ainda assim, se eu tivesse que escolher um idioma para começar, eu usaria o C #. É relativamente fácil de ler, possui poucas surpresas sérias (elas geralmente estão ocultas nas ferramentas / estruturas do MS ...) e uma quantidade enorme de código a ser lido e documentação, os quais são essenciais para se aprender bem.

Kheldar
fonte
Se é apenas pela legibilidade, e não pela digitação estática e pela segurança do ada, o Python e o Visual basic (sim, eu sei, não da maneira legal das crianças) têm uma sintaxe semelhante à desordem livre, imho.
keppla
Sim, eu concordo com você, mas "se ele compilar no Ada, ele deverá ser executado". Porém, não previne erros de lógica, como Ariane V pode dizer: D
Kheldar
Eu estive pensando se a digitação estática é útil para iniciantes ou não. Dá mais suporte (como rodinhas), mas isso pode ser visto como algo bom e ruim. Afasta alguma responsabilidade do aluno para digitar o sistema.
Aivar 30/11
@Kheldar, nenhuma linguagem de programação pode impedir os f *** ups de gerenciamento como o responsável pela falha de Ariane V. Você deve fazer sua lição de casa neste.
John R. Strohm
@ JohnR.Strohm esse era exatamente o meu ponto: às vezes não é a linguagem, é o fluxo de engenharia (por exemplo, gerenciamento) que é defeituoso. Você poderia ter redigido seu comentário de forma menos agressiva, na minha opinião.
Kheldar