Delphi, Smalltalk, Java, C++? Qual destas não é OO?

[quote=juliocbq]Melhor você prestar atenção no que está dizendo, esses macros também estão presentes em c++. Sobre o papel de c++ não pergunte para mim, pergunte para a Adobe, Corel, Apple, Intel, Sun, CISCO, Microsoft… e lá vai mais um monte, para não dizer que todas usam c++ como padrão de desenvolvimento. Pergunte para eles.

Leia sobre preprocessadores e #define.

Não estou aqui para discutir a melhor linguagem de programação, até porque no meu trabalho, eu tenho poder de escolha, e não preciso ficar me agarrando a marketing para conseguir fatia de mercado.[/quote]

Você parece estar muito mal informado, preprocessador é outra gambiarra maldita. Tosqueira total. Macros de Lisp não tem nada a ver com isso.

Se informe melhor antes de falar besteira. Empresas usam o que bem entenderem, mas isso não significa nada. Esse seu argumento “mas todo mundo usa”, além de não ter nada para suportar tais afirmações, é falta de argumento.

Que o C++ é tosco, isso é fato.

[quote=marcosalex]Engraçado, não sou expert no assunto, mas em todo congresso de compiladores que participei o pessoal citava que uma das maiores desvantagens do Lisp e Clojure sobre o C++ era na performance.

O único dialeto que trabalhei do Lisp foi Scheme na faculdade, mas nunca desenvolvi um aplicativo que poderia avaliar isso, mas gostei da linguagem, embora tenha preferido fazer o mestrado com Haskell.[/quote]

Não gosto de Scheme porque é muito simples, além de ter umas coisas estranhas (#f, () e nil não são a mesma coisa). Foi projetado para ser simples, e por isso faltam muitas features essenciais. Acho que até pouco tempo atrás não existiam namespaces diferentes por exemplo.

O Clojure eu não sei, mas a julgar pelo seus proponentes acredito que seja mais uma dessas “linguagens rockstar” que nada acrescenta em termos de usabilidade. Até agora não vi nenhum usuário de Clojure explicar em que ela é melhor, apenas citar algumas escolhas sintáticas duvidosas como “vantagens”. Eles dizem que não há interesse em compatibilidade com o passado do Lisp, mas parece que nesse processo jogaram o bebê fora e mantiveram água do banho.

Sobre a performance vai depender da implementação. Common Lisp pode ser compilado para código nativo, o que permite por exemplo que seja usado em jogos de videogame. http://ynniv.com/blog/2005/12/lisp-in-games-naughty-dogs-jax-and.html

Se tiver interesse dê uma olhada em Common Lisp.

[quote=Thiagosc][quote=juliocbq]Melhor você prestar atenção no que está dizendo, esses macros também estão presentes em c++. Sobre o papel de c++ não pergunte para mim, pergunte para a Adobe, Corel, Apple, Intel, Sun, CISCO, Microsoft… e lá vai mais um monte, para não dizer que todas usam c++ como padrão de desenvolvimento. Pergunte para eles.

Leia sobre preprocessadores e #define.

Não estou aqui para discutir a melhor linguagem de programação, até porque no meu trabalho, eu tenho poder de escolha, e não preciso ficar me agarrando a marketing para conseguir fatia de mercado.[/quote]

Você parece estar muito mal informado, preprocessador é outra gambiarra maldita. Tosqueira total. Macros de Lisp não tem nada a ver com isso.

Se informe melhor antes de falar besteira. Empresas usam o que bem entenderem, mas isso não significa nada. Esse seu argumento “mas todo mundo usa”, além de não ter nada para suportar tais afirmações, é falta de argumento.

Que o C++ é tosco, isso é fato.
[/quote]

Falar que c++ é tosco, para mim não tem importância nenhuma. O que é preocupante é uma pessoa falar que uma empresa como a Adobe usa c++ por usar. Isso é caso de demência. Como você é melhor que todas elas, deve ser milionário, e sua empresa deve possuir melhores produtos que os destas citadas.

Sobre lisp e preprocessadores, dê uma lida e veja quem está falando besteira.
A única diferença é que linguagens lisps foram desenhadas para funcionar como preprocessadores.
Esse papo de performance, gambiarra que falou não existe.
Faça o seguinte, prove que linguagens lisp são melhores que c++, e deixe de papo furado.


http://en.allexperts.com/e/p/pr/preprocessor.htm

Desde quando na área de computação empresas usam tecnologias por mérito tecnológico? A mera existência da Microsoft, depois de tanto software porcaria e de baixa qualidade que ela produz e produziu, mostra que melhor tecnologicamente não implica sucesso. A fonte da quantidade de idiotas que usam C++ se dá exclusivamente por ignorância, assim como você agora está tentando argumentar com Wikipedia.

Construa um argumento decente.

[quote=juliocbq]Sobre lisp e preprocessadores, dê uma lida e veja quem está falando besteira.
A única diferença é que linguagens lisps foram desenhadas para funcionar como preprocessadores.
Esse papo de performance, gambiarra que falou não existe.
Faça o seguinte, prove que linguagens lisp são melhores que c++, e deixe de papo furado.


http://en.allexperts.com/e/p/pr/preprocessor.htm
[/quote]

Fontes erradas. São duas coisas distintas que funcionam de formas distintas.

Toda a conversão é feita em nível de expressão, isto é, ao contrário de C e outras linguagens onde essa transformação é feita em nível de string de caracteres. Assim como funções abstraem computação, objetos abstraem dados, macros abstraem estruturas de programas baseados em sua representação. Isso permite aos programador imaginar e implementar uma linguagem apropriada para o domínio que deseja descrever (pois no final das contas as macros transformarão o código na representação apropriada).

Continue construindo as suas teses com o Wikipedia. Credibilidade zero.

#define, #ifdef, #endif? Pffff. Pára de viajar. Isso é porcaria. Simplesmente exclui-se strings. Ou substitui-se de uma forma bem primitiva.

Faça o seguinte consulte este livro:

Lisp in small pieces
Christian Queinnec
ISBN: 0 521 54566 8

Essa choradeira de Java e C++, onde algumas pessoas ficam implorando por novas features, jamais existiria em Lisp, porque você pode implementar o que bem entender como bem entender. Por exemplo, na nova especificação do C++ onde excluiram Concepts da versão final e já tinha choradeira na internet. Em Lisp qualquer um poderia implementá-lo sem precisar pedir permissão. AOP? Tranquilo. E por aí vai.

Essas linguagens derivadas de C fazem o programador depender da boa vontade alheia além de não serem flexíveis e nem poderosas o suficiente.

"

Desde quando na área de computação empresas usam tecnologias por mérito tecnológico? A mera existência da Microsoft, depois de tanto software porcaria e de baixa qualidade que ela produz e produziu, mostra que melhor tecnologicamente não implica sucesso. A fonte da quantidade de idiotas que usam C++ se dá exclusivamente por ignorância, assim como você agora está tentando argumentar com Wikipedia.

Construa um argumento decente.

[quote=juliocbq]Sobre lisp e preprocessadores, dê uma lida e veja quem está falando besteira.
A única diferença é que linguagens lisps foram desenhadas para funcionar como preprocessadores.
Esse papo de performance, gambiarra que falou não existe.
Faça o seguinte, prove que linguagens lisp são melhores que c++, e deixe de papo furado.


http://en.allexperts.com/e/p/pr/preprocessor.htm
[/quote]

Fontes erradas. São duas coisas distintas que funcionam de formas distintas.

Toda a conversão é feita em nível de expressão, isto é, ao contrário de C e outras linguagens onde essa transformação é feita em nível de string de caracteres. Assim como funções abstraem computação, objetos abstraem dados, macros abstraem estruturas de programas baseados em sua representação. Isso permite aos programador imaginar e implementar uma linguagem apropriada para o domínio que deseja descrever (pois no final das contas as macros transformarão o código na representação apropriada).

Continue construindo as suas teses com o Wikipedia. Credibilidade zero.

#define, #ifdef, #endif? Pffff. Pára de viajar. Isso é porcaria. Simplesmente exclui-se strings. Ou substitui-se de uma forma bem primitiva.

Faça o seguinte consulte este livro:

Lisp in small pieces
Christian Queinnec
ISBN: 0 521 54566 8

Essa choradeira de Java e C++, onde algumas pessoas ficam implorando por novas features, jamais existiria em Lisp, porque você pode implementar o que bem entender como bem entender. Por exemplo, na nova especificação do C++ onde excluiram Concepts da versão final e já tinha choradeira na internet. Em Lisp qualquer um poderia implementá-lo sem precisar pedir permissão. AOP? Tranquilo. E por aí vai.

Essas linguagens derivadas de C fazem o programador depender da boa vontade alheia além de não serem flexíveis e nem poderosas o suficiente.[/quote]

Continuar com esse tipo de discução não vai me trazer conhecimento nenhum, já que, você posta e não dá uma referência sequer, confiável ou não, de que dialetos lisp, são melhores que quaisquer outras linguagens.

Sobre a wiki, anos atrás ela já era do nível da Enciclopédia Britânica, para artigos científicos.

Se essas referências não forem confiáveis, existem n outras disponíveis. Basta pesquisar no google:

http://ultimahora.publico.clix.pt/noticia.aspx?id=1242013&idCanal=
http://ciberia.aeiou.pt/gen.pl?p=stories&op=view&fokey=id.stories/3952
http://www1.folha.uol.com.br/folha/informatica/ult124u19402.shtml

Pessoal, e a Orientação a Objetos?

Para a linguagem suportar OO, ela deve possuir uma maneira de trabalharmos com OBJETOS, seja por classes (Java), mimic types (Ioke) ou simplesmente um bloco de código (Javascript).

Quanto ao conceito de Interfaces, nada mais é do que uma classe 100% abstrata e ela meio que te força a usar a maior vantagem da Herança (que NÃO é reaproveitamento de código, já que o acoplamento gerado caga tudo), mas sim a possibilidade de tratar seus objetos com tipos diferentes. Assim como na vida real (já que a OO visa “imitar” a vida real), uma pessoa pode ser tratada como um funcionário ou como um animal (haueheau), dependendo do contexo.

Não sei se é requisito para a linguagem ser considerada OO compliant, mas tem também o polimorfismo (que pode ser implementado utilizando a herança e a sobrescrição de métodos) e encapsulamento (utilizando-se de escopos e níveis de acesso).

[quote=marcosalex]
Você deve odiar fazer sites usando o W3C, né? Já que é contra padrões, se postar em um fórum em inglês, você escreveria em brasileiro?

Qualquer um pode implementar e distribuir os recursos que quiser em Java, ele é GPL hoje. O que você pode não conseguir é que sua implementação conste na especificação oficial. [/quote]

Não, não pode. Java não permite que você acrescente quaisquer features. Para adicionar o que quiser você precisará fuçar na OpenJDK, que não é escrito em Java, e no caso do C++ você precisará criar o seu próprio compilador ou fuçar no GCC.

Lisp permite a adição do que você bem entender sem precisar descer ao nível de compilador ou VM. A linguagem é flexível o suficiente para isso.

São dois mundos diferentes. Entenda a diferença.

[quote=Thiagosc]

Não, não pode. Java não permite que você acrescente quaisquer features. Para adicionar o que quiser você precisará fuçar na OpenJDK, que não é escrito em Java, e no caso do C++ você precisará criar o seu próprio compilador ou fuçar no GCC.

Lisp permite a adição do que você bem entender sem precisar descer ao nível de compilador ou VM. A linguagem é flexível o suficiente para isso.

São dois mundos diferentes. Entenda a diferença.[/quote]

sim, são coisas diferentes mesmo. Ela foi feita para agir como um preprocessador, e mesmo assim, nada que eu eu não possa implementar com

#define #define begin {
#define end }

pronto, agora uso c++ como pascal.

[quote=marcosalex]
Você deve odiar fazer sites usando o W3C, né? Já que é contra padrões, se postar em um fórum em inglês, você escreveria em brasileiro?

Qualquer um pode implementar e distribuir os recursos que quiser em Java, ele é GPL hoje. O que você pode não conseguir é que sua implementação conste na especificação oficial. [/quote]

Não alimente trolls.

[quote=juliocbq]Continuar com esse tipo de discução não vai me trazer conhecimento nenhum, já que, você posta e não dá uma referência sequer, confiável ou não, de que dialetos lisp, são melhores que quaisquer outras linguagens.

Sobre a wiki, anos atrás ela já era do nível da Enciclopédia Britânica, para artigos científicos. [/quote]

Seja humilde, reconheça que não conhece algo e procure se informar melhor.

Para complementar. Por “representação” eu quero dizer a AST. Em uma linguagem derivada de Algol existe uma gramática arbitrária definida pelo projetista da lingua. Com base nessa gramática um parser é gerado, que transforma as produções em uma AST (Abstract Syntax Tree). A partir dessa AST é que a compilação é feita, podendo ela ser para outra linguagem, código nativo, vm, etc.

Assim é Java, C++, C#, etc.

Lisp é uma AST. Você trabalha diretamente com a árvore. Existem diversas vantagens, como por exemplo a gramática ser super simples e permitir coisas como macros.

No caso do C o preprocessador não está trabalhando com a representação em árvore do código, mas sim com strings. Ele simplesmente substitui texto a partir de regras muito simples. Em Lisp você recebe uma árvore por parâmetro, retorna uma árvore como resultado e esse novo ramo substitui a chamada da macro na árvore de representação.

Funciona mais ou menos assim a grosso modo:

C

  • preprocessador atualiza texto;
  • parser transforma o resultado em uma AST;
  • compilador compila para alguma plataforma.

Lisp

  • o reader transforma o código em uma árvore;
  • as macros são expandidas, e seus respectivos locais de chamada na árvore são substituídos por sub-árvores;
  • é interpretado ou compilado para alguma plataforma;

Isso permite por exemplo:

código original:                             código transformado

- rotina1                                         - rotina1
-- instrução 1                                 -- instrução 1
-- instrução 2                                 -- instrução 2
-- macro (setf (car x) y)                  -- rplaca x y
-- instrução 3                                 -- instrução 3
-- instrução 4                                 -- instrução 4

- rotina1                                         - rotina1
-- instrução 1                                 -- instrução 1
-- instrução 2                                 -- instrução 2
-- macro (setf (symbol-value z) y)  -- setq x y
-- instrução 3                                 -- instrução 3
-- instrução 4                                 -- instrução 4

E dentro da macro setf ele inspeciona os parâmetros passados e se for car ele retorna uma instrução (poderia ser uma seqüência de instruções) e se for outra coisa ele retorna outra coisa.

Dá para criar classes, objetos, funções, etc, desse jeito. Portanto dá para otimizar o código em formas que são impossíveis em linguagens como C++.

"

[quote=Thiagosc]

Seja humilde, reconheça que não conhece algo e procure se informar melhor.

Para complementar. Por “representação” eu quero dizer a AST. Em uma linguagem derivada de Algol existe uma gramática arbitrária definida pelo projetista da lingua. Com base nessa gramática um parser é gerado, que transforma as produções em uma AST (Abstract Syntax Tree). A partir dessa AST é que a compilação é feita, podendo ela ser para outra linguagem, código nativo, vm, etc.

Assim é Java, C++, C#, etc.

Lisp é uma AST. Você trabalha diretamente com a árvore. Existem diversas vantagens, como por exemplo a gramática ser super simples e permitir coisas como macros.

No caso do C o preprocessador não está trabalhando com a representação em árvore do código, mas sim com strings. Ele simplesmente substitui texto a partir de regras muito simples. Em Lisp você recebe uma árvore por parâmetro, retorna uma árvore como resultado e esse novo ramo substitui a chamada da macro na árvore de representação.

Funciona mais ou menos assim a grosso modo:

C

  • preprocessador atualiza texto;
  • parser transforma o resultado em uma AST;
  • compilador compila para alguma plataforma.

Lisp

  • o reader transforma o código em uma árvore;
  • as macros são expandidas, e seus respectivos locais de chamada na árvore são substituídos por sub-árvores;
  • é interpretado ou compilado para alguma plataforma;

Isso permite por exemplo:

código original:                             código transformado

- rotina1                                         - rotina1
-- instrução 1                                 -- instrução 1
-- instrução 2                                 -- instrução 2
-- macro (setf (car x) y)                  -- rplaca x y
-- instrução 3                                 -- instrução 3
-- instrução 4                                 -- instrução 4

- rotina1                                         - rotina1
-- instrução 1                                 -- instrução 1
-- instrução 2                                 -- instrução 2
-- macro (setf (symbol-value z) y)  -- setq x y
-- instrução 3                                 -- instrução 3
-- instrução 4                                 -- instrução 4

E dentro da macro setf ele inspeciona os parâmetros passados e se for car ele retorna uma instrução (poderia ser uma seqüência de instruções) e se for outra coisa ele retorna outra coisa.

Dá para criar classes, objetos, funções, etc, desse jeito. Portanto dá para otimizar o código em formas que são impossíveis em linguagens como C++.[/quote]

Numa boa thiago, eu nunca disse que dialetos lisp não funcionavam dessa maneira, aliás disse o contrário, que elas são como preprocessadores. Da mesma maneira não fico pregando sobre linguagens. O que eu disse, é que o preprocessador me permite mudar as sintaxes da linguagem c++, da mesma maneira que lisp permite. O link que te passei sobre preprocessadores mostra isso.

Sobre c++, essas empresas citadas a usam até hoje devido a alta otimização de código, que seu compilador pode gerar no assembler final(executável pequeno, mínimo overhead, etc…), baixo nível(assembler inline) e flexibilidade da mesma. O melhor exemplo é o compilador INTEL, que é imbatível. A própria MS usa o INTEL em seus SOs. Lisps não são úteis para isso.

Para falar que uma linguagem ou compilador, são ruins, no mínimo você precisaria ser doutor na área de compiladores.
cada pessoa se adapta na linguagem que se sente mais confortável.

[quote=juliocbq][quote=mochuara]
Sério que todas essas empresas usam C++ como “padrão” de desenvolvimento?

Alguém precisa te dizer, C != C++.[/quote]

E qual das que eu citei usam c?[/quote]

Até relógio cuco roda C, o fato da Intel usar C++ não diz nada sobre portabilidade de coisa alguma.

Vc não sabe nem mesmo a diferença entre C e C++ que dira o que essas empresas usam. Empresa de ponta usa a melhor ferramenta para cada problema, não existe essa de linguagem padrão.

[quote=marcosalex]
Engraçado, não sou expert no assunto, mas em todo congresso de compiladores que participei o pessoal citava que uma das maiores desvantagens do Lisp e Clojure sobre o C++ era na performance.

O único dialeto que trabalhei do Lisp foi Scheme na faculdade, mas nunca desenvolvi um aplicativo que poderia avaliar isso, mas gostei da linguagem, embora tenha preferido fazer o mestrado com Haskell.[/quote]

Performance de que? Execução?

Deve ter sido a muito tempo, antes de inventarem linguagens compiladas.

Eu também mexi com Scheme quando meu professor passou como trabalho de final de semestre escrever um programa que calculasse a derivada de uma função (!). E tive um contato muito breve com Haskell, tão breve que nem me lembro mais como é.

Clojure perde em alguma coisa para todos esses dialetos?[/quote]

O fato de ja ter sido um Lisper te da vantagem pelo fato de todos os Lisp compartilharem do mesmo “DNA”. Mas é como qualquer outra linguagem moderna que serve tanto pra script quanto para programação concorrente e alta performance na JVM e .NET.

[quote=marcosalex]
Yes, we can

http://openjdk.java.net/legal/

Você pode acrescentar o que quiser, inclusive criar o “Tava” (Thiago Java), a única coisa que vai acontecer é que a Sun pode não usar sua feature.
…[/quote]

Esse aí se finge de mal entendido. Metaprogramação e Lisp nada tem a ver com programar compiladores. Não é a toa que Lisp é conhecido como “The programmable programming language”.

Scheme de fato já foi mais utilizado em inciacao cientifica e clojure parece que não tem muitos adeptos aqui no fórum apesar de falarem bastante em outros foruns. Pelo que vi ela parece ter tudo que um Lisp precisa ter. Obviamente não estou falando dos seus proponentes.

[quote=mochuara][quote=juliocbq][quote=mochuara]
Sério que todas essas empresas usam C++ como “padrão” de desenvolvimento?

Alguém precisa te dizer, C != C++.[/quote]

E qual das que eu citei usam c?[/quote]

Até relógio cuco roda C, o fato da Intel usar C++ não diz nada sobre portabilidade de coisa alguma.

Vc não sabe nem mesmo a diferença entre C e C++ que dira o que essas empresas usam. Empresa de ponta usa a melhor ferramenta para cada problema, não existe essa de linguagem padrão.[/quote]

Vai me responder ou não, qual das citadas usam c?
Qual das citadas não é empresa de ponta?

fala-se muito, prova-se pouco aqui. Fui.

Chegando tarde, mas enchendo o saco. Seguinte:

  • Linguagem que usa conceito de objetos, mas não permite herança e polimorfismo, está “classificada” do jeito errado. Não é ORIENTADA a objetos, é BASEADA em objetos (como foi Javascript um dia).
  • Declarar um ‘class’ não quer dizer que aquilo seja realmente uma classe, ora bolas. A linguagem (como foi dito por alguém antes de mim, aqui) Java é classificada, de 1 a 5 (regular… ótima) como uma linguagem nível 2, RUIM. Não vou enumerar os fatores, eu lembro que até fiz um trabalho disso na faculdade. Em matéria de legibilidade, por exemplo, Python transforma Java em aramaico… dá um baile. Só que a PLATAFORMA é que transforma o trabalho com Java um negócio legal.
    Se eu enfiar TUDO num método main, como foi dito antes, a coisa funciona, certo? Certo. Vai ficar uma naba, mas funciona. E a máquina virtual executa o programa de que forma? Uma máquina de pilha. Ele reconhece os passos como… métodos. Área de métodos, como ‘text segments’. Isso aí. GOTO.
    Isso faz com que algumas fontes citem Java como uma linguagem orientada a MÉTODO, e não a objeto.
    Obviamente, trabalhar com OO e Java, pra mim tá ótimo e me dou muito bem… mas lendo, pesquisando e levando opiniões prós e contra… eu concordo.
    Orientada a Objeto MESMO? Pelo conceito, de verdade… SmallTalk e Ruby… de resto, a gente faz OO pq tem juízo e não quer se arrombar depois.
    Abraço!