A aprendizagem C é essencial para a Ciência da Computação? [fechadas]

15

Sou desenvolvedor front-end que mal vê um arquivo com extensão .hou .cextensão. Conheço a sintaxe básica do C, aprendi isso no Unreality, mas nunca me interessei por uma programação de baixo nível, porque era simplesmente muita configuração para coisas simples.

Estou muito interessado em aprender todos os aspectos da Ciência da Computação, mas quero acreditar que realmente não preciso conhecer um idioma específico para entender a maioria dos conceitos em Ciência da Computação. No entanto, quando começo a ler livros e artigos sobre conceitos fundamentais de Ciência da Computação, como Estruturas de Dados e Design de Algoritmos, parece que tenho que aprender C, porque todos os exemplos e até lições estão em C (e às vezes em Java).

Minha pergunta é: C é uma linguagem de programação essencial para a Ciência da Computação ou acabamos de ter todos os nossos recursos em CS escritos em C? Alguém pode aprender Ciência da Computação sem aprender C?

Mohsen
fonte
4
Aqui está a opinião de Joel Spolsky sobre isso: joelonsoftware.com/articles/CollegeAdvice.html É discutível, mas acho que ele tem seus pontos de vista.
Doc Brown
2
Os puristas argumentam que a ciência da computação não é sobre computadores, o que torna desnecessárias as linguagens de programação.
Blrfl
1
O que você quer dizer com "Ciência da computação"? O que você descreve é ​​principalmente a parte de Engenharia de Software da ciência da computação, eu acho. Além disso, não consigo ver como todos os recursos são escritos em C. Eu li alguns livros sobre algoritmos / estruturas de dados e nenhum deles usou C. Quase todos eles usavam algum tipo de linguagem de pseudocódigo, facilmente compreensível para todos (bem, exceto TAOCP que usa montagem ... mas isso é outra história)
Bakuriu
Irrealidade? Deveria ser uma peculiaridade de auto-correção da Universidade ou é alguma escola de magia negra? Eu conheço a Universidade Invisível, no entanto: [
Deer Hunter

Respostas:

31

Eu vou contra o fluxo aqui e digo que sim, você precisa aprender C. Na verdade, eu concordo com os pontos de muitas das outras respostas, mas você faz uma afirmação muito forte de que

Estou muito interessado em aprender todos os aspectos da Ciência da Computação, mas quero acreditar que realmente não preciso conhecer um idioma específico para entender a maioria dos conceitos em Ciência da Computação.

(ênfase minha)

Bem, sistemas operacionais e pilhas de rede são dois aspectos enormes da Ciência da Computação, e todos os sistemas operacionais dominantes e pilhas de rede estão escritos amplamente em C. Se você quiser entendê-los, deve aprender C. Sim, algumas escolas conseguem ensinar suas classes de SO em Java, mas é como ler Homer em inglês.

Além disso, C não é tão grande assim. Se você realmente quer aprender todos os aspectos da ciência da computação, deve dar de ombros e dizer 'meh', 'qual é mais uma linguagem?'

Charles E. Grant
fonte
Eu geralmente concordo com isso, embora, para mim, "aprender" C signifique que sou essencialmente fluente o suficiente no idioma para escrever nele programas não triviais sem assistência. Não tenho certeza se esse nível de entendimento é um pré-requisito para sistemas operacionais e programação de rede.
Telastyn
3
@ Telastyn: significa que você é fluente o suficiente para entender e modificar o código dos sistemas operacionais e o código de rede - os domínios em que C é usado, e é isso. Isso não significa que você precisa saber como escrever jogos em C, criar aplicativos de interface do usuário e gráficos bonitos em C, gráficos ou mecanismos de inteligência de máquina em C; porque para todos os outros domínios do CS existem outras opções de idioma.
Rwong
12

Durante muito tempo, durante o auge da ciência da computação como ciência, e não como vocação, houve algumas escolhas limitadas para um idioma que funcionava em todos os sistemas que todas as diferentes universidades usavam.

De longe, as universidades tendiam a usar sistemas Unix. Convenientemente, isso foi programado em C. Pode-se começar aprendendo C em qualquer máquina e, eventualmente, entrar no código-fonte unix em C. Em casa, os alunos podem usar um compilador C como o Borland Turbo C no Windows ou MPW em um computador. Mac - funcionou em todos os lugares.

Pascal era outra opção, mas isso costumava ter o problema de que, em um determinado momento da programação, não era suficiente uma linguagem para fazer o que você realmente precisava fazer (programar um sistema operacional em pascal seria doloroso).

Algumas das escolas mais antigas aprenderam o Fortran, mas novamente, em muitos casos, não era uma linguagem suficientemente poderosa para poder dar aulas de CS de nível superior (teoria da IA ​​no fortran? Possível, mas dolorosa).

E assim, por um longo tempo, C foi a escolha.

Não é a única opção e agora há muitas faculdades que ensinam em outros idiomas para encobrir alguns dos internos e aprender conceitos de nível superior sem ter que lidar com a feiúra do gerenciamento de memória e coisas do gênero. Alguns acham que isso é bom, outros acham que isso é ruim .


Portanto, não, aprender C não é essencial para aprender ciência da computação. Você pode encontrar muitos outros livros por aí que ensinam ciência da computação em Java ou Python. É que, durante muito tempo, C foi a escolha e os livros acadêmicos se movem lentamente.


fonte
Para o registro, o treinamento de IA era tradicionalmente feito com o companheiro de cabeça de cabeça de C nos anos 70 e 80, LISP, mas a resposta está na cabeça.
jwrush
@jwrush, minha resposta foi mais parecida com a de que você também pode estudar AI em C, em comparação com os outros idiomas da época (não o LISP - e eu participei de uma aula de língua cega nos anos 90 para IA). É verdade que, na época, o MIT (lar dos intelectuais) ensinava muitas aulas no LISP - e certamente era outra opção, mas não tão prática em outras áreas. No ensino, era importante trabalhar da mesma base em cada turma, para que não houvesse que passar a primeira semana ou duas ensinando aos alunos outra língua especializada nessa turma.
12

Admito que se pode conseguir um emprego bem remunerado e ser produtivo sem nunca tocar em C, mas recomendo o aprendizado de C para qualquer pessoa que leve a sério a compreensão sólida da ciência da computação.

Embora a ciência da computação seja sobre conceitos, que podem ser aprendidos independentemente de qualquer linguagem de programação específica, há campos que podem ser muito melhor compreendidos pela aprendizagem C ou pela aprendizagem desse campo usando C.

  • Algoritmos e Estruturas de Dados. O padrão C não possui quase nenhum deles - já que eles já foram implementados no idioma ou em sua biblioteca padrão tendem a ser desmotivacionais para os alunos: " Por que devo me preocupar em implementar algo prontamente disponível?"Observando um pedaço de código C, você vê imediatamente seu custo algorítmico, já que tudo em C compila apenas algumas instruções da máquina. Linguagens de alto nível (por exemplo, Perl ou Python) geralmente usam estruturas de dados avançadas sob o capô de uma sintaxe leve. O código parece leve, mas não é. Você já precisa de muito conhecimento para raciocinar corretamente sobre a complexidade algorítmica dessas partes de código. Portanto, essas linguagens não são tão adequadas para aprender algoritmos e estruturas de dados, e muitos programadores que estavam sempre vivendo em idiomas de alto nível, tendem a ser incapazes de lidar com problemas de desempenho, quando os encontram.

  • Sistemas operacionais. A maioria dos sistemas operacionais é escrita em C. Como você deseja entender a criação de processos sem precisar chamar fork? A camada de abstração da Java VM não ajuda aqui. E apenas falar sobre isso sem nunca criar um processo é ainda pior ... Como você pode escrever um software como o Eclipse, que pode redirecionar a saída padrão para uma de suas janelas? Você precisa entender os conceitos no nível do SO para isso e pode tocá-los diretamente apenas em C.

  • Indirection. Você não pode fazer C sem lidar com ponteiros. Os indicadores o forçam a pensar em dois níveis, e isso amplia suas habilidades de abstração.

Existem também algumas vantagens técnicas do conhecimento em C:

  • Interoperabilidade entre idiomas. Você deseja integrar um ótimo módulo Ruby ao seu projeto Python (substitua duas linguagens arbitrárias aqui). As chances são de que a única maneira de fazer isso seja através do C, porque os dois idiomas têm uma interface estrangeira para o C.

  • Escrevendo software crítico de desempenho. Não se pode deixar de ir de baixo nível para fazer isso.


Não digo que todo programa deva ser escrito em C. Mas C pode ajudá-lo ao conhecimento, o que é útil em qualquer idioma em que você programa.

Miklós Homolya
fonte
A aritmética dos ponteiros é fundamental para entender os sistemas operacionais, pois leva ao porquê. Por exemplo, por que são pilhas e pilhas diferentes, por que a memória virtual executar bem ou mal, por que alguns laços trabalhar mais rápido do que outros, etc.
Michael Shopsin
6

Eu também irei contra a corrente aqui e tentarei fazer um argumento estético (um pouco humorístico) para C. Embora algumas pessoas possam chamá-lo de "feio" por diferentes razões, como a falta de construções de nível superior, como classes ou sua dependência de indicadores, acho que não é o meu caso .

TL; DR : Na minha opinião, C é simples, bom C é legível e há uma certa alegria em ser encontrado.

C é simples

O padrão C define apenas alguns tipos e mecanismos básicos para criar funções, ponteiros e matrizes a partir deles. Além disso, há um pequeno número de construções de composição para criar tipos mais complexos das primitivas (como estruturas e uniões). Observe como descrevi a maior parte do idioma em duas frases. Isso significa que você não precisa manter muitas regras e formas sintáticas em sua mente durante a codificação.

Simples é lindo .

C não é misterioso

Ao contrário de muitas linguagens de nível superior, seria difícil encontrar muitos símbolos estranhos e ininteligíveis em C. No mundo C, o principal recurso para abstração e "compressão sintática" é a função - semanticamente, é muito simples e construto auto-explicativo. O bom estilo C incentiva a beleza quase poética e legível. Para ilustrar, vamos tentar ler o seguinte trecho do kernel do Linux. Mesmo sem entender as estruturas de dados subjacentes e os detalhes da implementação, podemos entender muito o seguinte:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

O meio da função diz "no caso improvável de que a corrente esteja congelando, pergunte ao refrigerador se o congelamento realmente aconteceu". Dr. Seuss não poderia ter escrito melhor.

Legível é lindo .

C é transparente

A menos que uma instrução C inclua uma chamada de função, geralmente você pode ter uma idéia muito boa do custo em tempo de execução e dos efeitos colaterais. C dá ao programador controle e, finalmente, confia que ele fará o que é certo. Podemos ter uma ideia do que acontece quando esse trecho (ligeiramente reformatado para o SE) da implementação strlen()na biblioteca GNU C é executado, porque todo operador possui semântica bem definida. Não há sobrecarga em C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Para fins de "otimização", essa propriedade é ótima. Pode-se argumentar que algumas linguagens de nível superior tornam mais fácil a expressão concisa de algoritmos de nível superior (como C ++ com classes e sobrecarga), mas para os propósitos que o C foi projetado - agindo como um montador portátil - C é o ideal. Às vezes, após a execução bem-sucedida do código de baixo nível, um programador pode se sentir um com a máquina, em certo sentido (ou zero - é um detalhe de implementação). Isso não quer dizer que outros idiomas sejam ruins, não sejam "zen" o suficiente ou algo parecido com isso, apenas que o IMO C pode ser interessante de maneiras que muitos outros idiomas optaram por não ser, por muitos motivos válidos.

Na minha opinião, os três pontos apresentados acima tornam gerenciável a criação de sistemas complexos - mas eficientes -, incorporados em minha mente pelo Linux. Acho que este mundo apela às minhas sensibilidades estéticas e aconselho qualquer pessoa que considere C como seu próximo alvo a considerar esses pontos. Eu sinto que os argumentos sobre sistemas operacionais e outros enfeites são mais bem sustentados, declarando-os explicitamente, porque certamente não é necessário entender os kernels para ser um programador bem-sucedido, mas é possível que esses campos sejam subjetivos.

idobia
fonte
3

A linguagem de programação que você usa para discutir a ciência da computação é amplamente irrelevante para a tarefa de aprender os meios e a ciência da computação.

O (sem dúvida) trabalho seminal sobre Ciência da Computação, A Arte da Programação de Computadores , não usa nenhum idioma existente para informar o assunto. Em vez disso, Donald Knuth optou por definir um computador fictício e uma linguagem de máquina fictícia (e uma linguagem assembly associada) em termos dos quais ele discute todos os tópicos.

Outro trabalho conceituado sobre o assunto, A Estrutura e a Interpretação de Programas de Computador , adotou uma abordagem semelhante, desenvolvendo um dialeto simplificado da linguagem de programação LISP para atuar como seu próprio contexto. Essa linguagem é o que conhecemos agora como esquema.

Ainda outro trabalho muito bom sobre Ciência da Computação, The Elements of Computing Systems (que na verdade é partes iguais de Engenharia da Computação e Ciência da Computação, e muito breve), adota a abordagem mais fundamental do ensino da lógica digital, a partir da qual constrói a máquina, as ferramentas , e o idioma, antes de ensinar Ciência da Computação elementar.

Portanto, não, C não é necessário para a compreensão da Ciência da Computação. O que importa é a sua compreensão dos principais conceitos dos algoritmos e sua aplicação.

greyfade
fonte
2

Comecei uma carreira em programação aprendendo o vb3 com os manuais fornecidos com os disquetes que surgiram. Aprendi um pouco de java e fui capaz de produzir alguns programas respeitáveis, mas até estudar C na universidade senti que realmente entendia o que estava acontecendo "sob o capô". Agora, trabalho apenas com .net e nunca me preocupo com ponteiros, endereços inválidos ou estouros - mas eu os entendo, isso informa as decisões que tomo diariamente e algumas das coisas da velha escola ainda existem nas linguagens interpretadas modernas , operações pouco inteligentes, lógica booleana, todas as ferramentas poderosas e muito eficientes.

Aprenda C. Ele o manterá em boa posição. Guardei uma cópia do manual dos programadores c durante anos e li Kernighan e Ritchie de capa a capa. Não importa em que idioma você trabalha no Entendimento C, definitivamente ajudará.

Matt
fonte
1

Alguém pode aprender Ciência da Computação sem aprender C?

A resposta é sim. Sou formado em CS e não precisava aprender C, mas sim Java. Pelo menos na minha escola, a ênfase estava no aprendizado da Programação Orientada a Objetos, com alguns ensinamentos sobre Linguagem Assembly, Estruturas de Dados e Design de Banco de Dados.

PhillyNJ
fonte
7
Tem certeza de que seu diploma abrangeu " todos os aspectos" do CS?
SK-logic
Eu diria todos os aspectos necessários. Nenhum diploma abrange todos os aspectos de um programa de graduação. Além disso, "tudo" é subjetivo.
PhillyNJ
1
Como você define "necessário"? Tudo é tudo - significado, cobrindo toda a aplicação CS possível. Não é "subjetivo", é bastante quantificável.
SK-logic
Defino 'necessário' no contexto em que o CS abrange o estudo da computação e da tecnologia, hardware e software da computação e não qualquer linguagem específica, que está respondendo à pergunta original.
PhillyNJ
Ok, e como você vai cobrir o hardware sem os idiomas de baixo nível? Como você cobrirá o histórico das linguagens de programação (que é uma parte excepcionalmente importante de "todos" o CS) sem essa linguagem-chave? Como você abordará a semântica da linguagem de programação sem pelo menos uma linguagem com aritmética de ponteiro? De um jeito ou de outro, mas um idioma semelhante ao C deve estar presente em qualquer currículo abrangente de CS.
SK-logic
0

Realmente depende do que você quer fazer com o que está aprendendo. Definitivamente, é verdade que muitos algoritmos são dados em C ou em seus descendentes. No entanto, ao longo dos anos, vi mais exemplos de C ++, C # e Java. O que o CS deve ensinar é uma compreensão geral da computação e, portanto, como aprender ou criar um idioma apropriado para a tarefa em questão.

No entanto, ainda existem muitas pessoas cuja primeira e última linguagem é uma variação de C ou Java, e nem todas terão o treinamento para entender qualquer linguagem fornecida por um diploma de CS. Até alguns graduados em CS têm problemas com a programação. Portanto, você pode precisar ter um entendimento suficientemente bom desses idiomas para poder se comunicar com eles, dependendo da sua carreira. Se você planeja seguir a academia, terá ainda mais barreiras linguísticas para se contentar, especialmente em áreas interdisciplinares (onde as pessoas usam prólogo, lisp, haskell, mathematica etc.)

jzx
fonte
-1

Se você realmente aprender "todos os aspectos da Ciência da Computação" (plano ambicioso!), Terá que lidar com várias linguagens assembly diferentes e pelo menos um HDL (e praticar a codificação no nível netlist).

E como um passo de nível superior para abordar essas coisas realmente fundamentais, você teria que pegar algo como C ou Pascal, é inevitável. Pular etapas em uma escada de abstração é contraproducente.

Enfim, duvido que essa pergunta valha a pena perguntar. Afinal, C é apenas uma linguagem minúscula. Você poderia ter aprendido o básico em menos tempo do que perdeu refletindo se precisa aprender C ou não.

SK-logic
fonte