Original Article: A Very Quick Comparison of Popular Languages for Teaching Computer Programming
Author: Patrick Jordan

Comentários sobre "Uma Comparação Muito Rápida de Idiomas Populares para Ensinar Programação de Computadores"

Eu escrevi um breve artigo comparando C, Java e Python como um primeiro idioma para estudantes de informática novos para programação. Um número de pessoas escreveu com comentários, que adicionei abaixo, juntamente com minhas respostas.

C++

Em 25 de fevereiro de 2005, Terje Slettebo escreveu:
Você também pode querer considerar o C ++ como uma linguagem para o ensino de programação (e acho que é uma alternativa plausível, permitindo a programação de alto nível e baixo nível). Aqui está o programa correspondente em C ++:
#include <iostream>

int main()
{
    int a,b;
    std::cin >> a >> b;
    int c=a+b;
    std::cout << c;
}

%> gcc add.cpp -lstdc++ -o add
%> ./add
Things to explain:

  • #include
  • funções e valores de retorno (e a exceção que main() não precisa retornar explicitamente um valor, ou você pode adicionar "return 0;" no fim))
  • variáveis e tipos
  • fluxos, os operadores de fluxo ("<<" e ">>") e cin/cout, e que ignora qualquer espaço em branco
  • expressões (c=a+b)
  • compilar
Ah, e hora de escrever, testar e depurar: o mesmo que o seu exemplo Python: cerca de um minuto (e tem aproximadamente o mesmo número de linhas, também).

É bastante interessante que o Java - um idioma que se pretende ser _simpler_ do que C ++, realmente torna mais difícil escrever um programa tão simples como este (e outros, também).

Apenas um nit da sua lista de Python, porém: "requer menos linhas de código para qualquer problema dado e é mais legível -, portanto, maior produtividade". Para "qualquer problema dado"? E menos do que? Certamente, você não pode dizer que os programas Python serão sempre mais curtos para qualquer problema, do que o programa correspondente em qualquer outro idioma, mesmo DSLs?

Eu tenho um preconceito contra o C ++, o que devo admitir que pode surgir da ignorância ou do mal entendido, mas fiz uma tentativa bastante séria de usá-lo em um grande projeto no início dos anos 90 e acabei concluindo que a planície C era mais fácil e menos desajeitada. Isso contrasta com o Python, onde eu sabia que dentro de uma hora eu nunca vi um idioma tão bem desenhado e fácil de usar.

É um ponto justo sobre minha afirmação excessivamente ampla - talvez eu deveria ter dito "requer menos linhas de código (e é mais legível) do que qualquer linguagem de uso geral mais popular, para quase qualquer problema."

Conversa fiada

Em 8 de abril de 2005, Doug Clapp escreveu:
Bem, há smalltalk, onde você teria algo como:

x := FillInTheBlank request: 'Enter a number for X'.   
y := FillInTheBlank request: 'Enter a number for Y'.   
Transcript show : x + y.
No começo, eu fui revoltado por isso, mas eu posso ver como ele tem uma limpeza muito detalhada ... Meu favorito seria realmente APL, que tem um caractere em forma de caixa que significa "obter entrada". O programa reduz para três caracteres: box+box

Lisp

Em 20 de abril de 2005, Erling Ellison sugeriu o seguinte Lisp:
(print (+ (read) (read)))
embora pareça falhar alguns problemas importantes, como dar o nome do programa para que você possa executá-lo. Fiquei preocupado por algum tempo que "Weenies orgulhosos de Lisp", como Paul Graham, sabem algo que eu não (bem, ok, isso é altamente provável), mas meus estudos de Lisp até agora não me impressionaram. A comunidade Lisp parece horrivelmente fragmentada, e a própria linguagem (bem, eu olhei para o Common Lisp) tem um "tudo, incluindo a pia da cozinha", também. Além disso, se, como afirma Paul Graham, você só precisa executá-lo em seu próprio servidor, provavelmente é uma boa escolha, mas se você deseja distribuir código aos usuários, tudo parece muito difícil.

No entanto, não posso ajudar a pensar, se Eric Raymond e Richard Stallman pensem que Lisp é uma linguagem importante para aprender, que possivelmente é...

Ruby

Em 7 de abril de 2005, Mark Hubbart escreveu recomendando Ruby, e pouco depois David Morton escreveu um e-mail quase idêntico. Seus argumentos, misturados:
The first program looks like this:
a = gets.to_i
b = gets.to_i
c = a + b
puts c
Tempo para escrever, testar e depurar: menos de um minuto.

Conceitos necessários para aprender:

  • variáveis
  • comandos IO: gets, puts
  • diferença entre inteiro e string (o que acontece se o "to_i" é deixado?)

prós e contras:

  • muitos prós similares como python.
  • Mais indulgente no espaço em branco.
  • Linguagem extremamente orientada a objetos, melhor que o java, mas bastante fácil de explicar.
  • A complexidade pode ser muito simples, como acima, ou moderada, como
  • classes e OO, para variar o complexo, com o código de modificação de lambda e auto (programação de aspecto?)

  • Todas as vantagens de Python mencionadas se aplicam a Ruby, exceto talvez o recurso de estrutura de bloco, que é discutível. (O início do formato de fim de semana de Ruby torna mais fácil perceber o aninhamento impróprio: um "fim" perdido é mais fácil de notar do que um suporte ausente) Além disso, pode-se dizer que Ruby tende a ser mais conciso. Compare Python "sys.stdin.readline ()" para Ruby's "gets".

Ruby - o Python mais limpo? Muitas pessoas me recomendaram nos últimos meses Ruby que eu tenho que tentar por algum tempo em breve. Eu não estou convencido de que começar ... o fim é uma melhoria no espaço branco significativo que eu vim amar, mas, da mesma forma que é burro para pular Python por espaços brancos significativos, seria burro para ignorar Ruby porque faltava isso. O único comentário que eu realmente posso fazer é que Ruby não parece ter o apoio da biblioteca que a Python faz, nem as perspectivas de trabalho. Mas estes parecem estar mudando rapidamente. Alguns bons documentos do Ruby são: Chris Pine: "Aprenda a programar: um tutorial para o programador futuro" e o "pickaxe"

Perl

Em 28 de abril de 2005, Steven Cayford escreveu:
Gostei do seu artigo e dos comentários. Eu pensei que eu iria jogar perl também.

Primeiro conceito, demorou cerca de um minuto principalmente porque esqueci a precedência do operador entre a concatenação de string "." e adição "+" enquanto os empurra para a função de impressão.

#!/usr/bin/perl
print "enter a: ";
$a = <STDIN>;
print "enter b: ";
$b = <STDIN>;
print $a + $b . "\n";
Segundo conceito sem as sutilezas:

#!/usr/bin/perl
print <STDIN> + <STDIN>;
Things to explain:

  • #!
  • $variables
  • o conceito
  • conversão automática de string para número
  • interpolação e concatenação de cordas
  • precedência de operadores e funções
Eu sei que Perl tem uma reputação de ser bagunçado, o que pode ser considerado um prejuízo para uma aula de início, mas é fácil começar a aprender, tem muita profundidade, a variedade a diverte e existe uma enorme quantidade de código por aí.

Caso contrário, provavelmente pros e contras semelhantes como python e ruby.

Como ex-fã do Perl, só posso dizer que, se eu não tivesse aprendido o Python, esse artigo inteiro teria sido sobre por que Perl é uma boa linguagem para o ensino. Mas o Python é Perl sem o ruído da linha. É Perl limpo para o século 21. É 95% da potência com triplicar a clareza. Adorei Perl, mas o Python é simplesmente melhor. Desculpa.

Shell

Em 31 de maio de 2005, Nathan Laredo escreveu:
I think it's also important to teach good shell programming -- your python example opens the door to all these (examples assume they were typed at a shell prompt):

here's the whole thing for bash/sh/ksh/zsh:

read a; read b; echo $[a + b]

aqui está tudo para awk:

awk 'BEGIN { getline a; getline b; print a + b; exit; }'

or alternatively:

awk '{ a = $0; getline b; print a + b; exit; }'

e aqui está tudo no perl (embora eu não gostei perl mais de C ++):

perl -e 'print <> + <> . "\n"'

Claro que todos os itens acima podem ser formatados conforme necessário quando em um arquivo de script em vez de inserido no prompt do shell. Algumas pessoas escrevem programas simples em linguagens como java e C ++ quando um script de shell trivial teria feito o trabalho em menos tempo.

A ferramenta certa para o trabalho é uma lição importante para aprender, e scripts de shell competentes são uma arte perdida. Se você está perdendo tempo no trabalho com o código java para ler e, em seguida, adicione dois números, seu empregador pode não ser tão feliz, mas, claro, o script shell é claramente o caminho errado para fazer visualizações de órbitas de satélites.

Então, novamente, eu posso ser a última pessoa no mundo que procura desculpas para usar awk...

Eu tenho que dizer que sou cético .... Há definitivamente um lugar para shell scripting - bootscripts, por exemplo - mas qualquer coisa que cheira um pouco como uma aplicação seria melhor feita em Python na minha opinião. Talvez eu esteja tendencioso, mas o script de shell para mim sempre sentiu como bater minha cabeça contra uma parede de tijolos de uma maneira totalmente diferente, mas não menos desagradável, do que a programação em C ++.

Os programadores Unix que funcionam seriamente provavelmente seriam bem atendidos por entender realmente shell e awk, mas acho que, apesar de resolverem o problema acima do que Java, geralmente são tão barrocos que são uma escolha muito pobre para os iniciantes.

Concordo, porém, que é muito importante impressionar os alunos a idéia de que "se tudo o que você tem é um martelo, cada problema parece um prego" - e que eles devem procurar expandir constantemente seu repertório de ferramentas. Eu também acho que uma aula dedicada à escrita de "one-liners" pode não ser uma má idéia - requer mais disciplina mental do que simplesmente desperdiçar a primeira solução inchada que vem à sua frente. Mas novamente - estes não são problemas que os iniciantes devem lidar.

Patrick Jordan - [email protected] - 2005-05-31


...artigo original