Qual é a melhor maneira de fazer a transição para C de linguagens de alto nível?

votos
1

Eu sou um programador web: I desfrutam atualmente AS3 e lidar com PHP. Eu possuo um Nintendo DS e quero dar C ir.

A partir de um nível mais elevado, o que as coisas básica / conforto estão a ir faltando? Não consigo encontrar [for ... in] laços, assim que eu supor que eles não estão lá. Parece que eu vou ter de declarar as coisas religiosamente, e eu suponho eu não tenho objetos (que eu tratadas em PHP há um tempo atrás).

As tabelas de hash? tipos engraçados de dados?

Publicado 19/05/2009 em 14:57
fonte usuário
Em outras línguas...                            


12 respostas

votos
9

Para resumir, você basicamente obter:

  • variáveis ​​digitadas
  • Funções
  • ponteiros
  • bibliotecas padrão

Então, você faz o resto - que podem ser um pouco simplificada, mas isso é uma ideia aproximada do que a face.

Pode ser assustador para começar e pode haver uma curva de aprendizado para superar. Aqui está uma velocidade alguns solavancos que podem ocorrer:

Corda? Que corda?

Um grande coisa a se acostumar com seria cordas. Não existe tal coisa como um stringem C. Uma cadeia é uma " nullmatriz terminadas em caracteres" (por vezes chamado de cadeias C ), a qual significa basicamente uma matriz do tipo charcom o elemento final que é uma \0( charvalor 0).

Na memória, uma charmatriz de comprimento 4 contendo Hi!apareceria como:

char[0] == 'H'
char[1] == 'i'
char[2] == '!'
char[3] == '\0'

Além disso, as cordas não sabe seu próprio comprimento (há tal coisa como "objetos" que vêm de graça em C), de modo que o uso de chamada biblioteca padrão strlenseria necessária, que mais ou menos é um forloop que atravessa a corda até ela atinge um \0personagem. (Isto significa que é um O (N) operação - mais a corda, que leva mais tempo para encontrar o comprimento, ao contrário de O (1) operação de mais stringaplicação em línguas modernas.)

Coleta de lixo?

Não há tal coisa é como um coletor de lixo em C. Na verdade, você precisa alocar e desalocar memória a si mesmo:

/* Allocate enough memory for array of 10 int values. */
int* array_of_ints = malloc(sizeof(int) * 10);

/* Done with the array? Don't forget to free the memory! */
free(array_of_ints);

Deixar de limpar depois de alocação de memória pode levar a coisas chamadas vazamentos de memória que eu tenho certeza que você já ouviu antes.

Ponteiros!

E como sempre, quando falamos de C, não podemos esquecer ponteiros . Todo o conceito de referências a variáveis e ponteiros dereferencing pode ser um conceito sério indutores de dor de cabeça, mas quando você começa um jeito, não é realmente muito ruim.

Exceto para os momentos em que você espera que ele funcione de uma maneira, mas você descobrir que você não entendeu muito bem ponteiros bem o suficiente e ele realmente faz outra coisa - como se costuma dizer, estado lá, feito isso.

Ah, e os ponteiros são provavelmente vai ser uma das primeiras vezes que você vai realmente ver um acidente de programa ruim o suficiente para que o sistema operacional irá gritar com você. A falha de segmentação é não algo que o computador gosta muito .

tipos

Todas as variáveis em C terão tipos. C é uma linguagem estaticamente digitada , o que significa que tipos de variáveis serão verificados em tempo de compilação. Isso pode levar algum tempo para se acostumar no começo, mas também pode ser visto como uma coisa boa, uma vez que pode reduzir erros de execução, tais como erros de tipo onde você tentar atribuir um número a uma string.

No entanto, é possível realizar typecasts , por isso, é possível transmitir um inttipo (que são valores inteiros) para um doubletipo (um valor de tipo flutuante). No entanto, não é possível tentar lançar uma intdiretamente para uma string como char*.

Assim, por exemplo, em algumas línguas é permitido o seguinte:

// Example of a very weakly-typed pseudolanguage with implicit typecasts:
number n = 42
string s = "answer: "
string result = s + n  // Result: "answer: 42"

Em C, um teria que chamar uma itoafunção para obter uma char*representação de um int, então use strcatpara concatenar duas strings.

Conclusão

Essas coisas disse, aprendendo C proveniente de uma linguagem mais elevada pode ser muito olho-abertura e, provavelmente, um desafio para começar, mas uma vez que você começa um jeito dele, ele pode ser muito divertido para trabalhar.

Eu recomendo começar a experimentar com um compilador C, e têm um bom livro ou de referência.

Eu acho que muitas pessoas vão recomendar o livro K & R , que é realmente um excelente livro.

No início, eu não acho recomendando K & R como o primeiro livro C seria uma boa idéia, pois pode ser um pouco sobre o lado difícil, mas pensando bem, acho que é um livro muito abrangente e bem escrito que pode ser bom para entrar em C se você já tem alguma experiência em programação.

Boa sorte!

Respondeu 19/05/2009 em 16:12
fonte usuário

votos
6

Bem ... Você pode estar em algo como um choque cultural. Estas são as 32 palavras-chave padrão em C, e que inclui os tipos básicos.

biblioteca padrão do C é bastante funcional (mais do que as pessoas talvez esperar), mas muito, muito fino, quando comparado com o que linguagens de alto nível dar-lhe. Não existe uma tabela hash em vista, e você está correto supor que C não tem suporte sintática ou semântica para objetos.

É possível escrever código orientado a objetos bem de qualquer maneira, mas você vai ter que saltar através de algumas aros, e fazer muito mais manualmente, pois a linguagem não vai ajudá-lo. Ver, por exemplo, o GTK + UI Toolkit para um exemplo de uma orientada para o objecto C biblioteca / API bem desenhado.

Respondeu 19/05/2009 em 15:01
fonte usuário

votos
2

Eu sou um programador web: I desfrutam atualmente AS3 e lidar com PHP. Eu possuo um Nintendo DS e quero dar C ir.

Por que você quer fazer programação C? Quais são as suas razões, o que você espera alcançar? É a fim de escrever software para a Nintendo DS?

A partir de um nível mais elevado, o que as coisas básica / conforto estão a ir faltando?

Dado o seu fundo, eu acho que você vai pessoalmente perder a falta de apoio tipagem dinâmica, em outras palavras, você vai ter que ser muito explícito em seus programas C, os dados devem ser especificados com os tipos adequados, de modo que o compilador sabe que tipo de dados que você está trabalhando. Isto também se aplica a qualquer tipo de gerenciamento de memória, ou seja, basicamente qualquer coisa uma vez que você começar a trabalhar com estruturas de dados que não são PODs.

Por exemplo, quando você faria algo como isso em php:

function multiply(x) {
 return (x*x);
}

Você teria que fazer algo assim em C:

int multiply(int x) {
 return (x*x);
}

Embora estas possam parecer bastante semelhantes, existem grandes diferenças, nomeadamente digitação restrições: a versão php também irá trabalhar com valores de ponto flutuante, enquanto que em C, você teria que fornecer explicitamente versões para diferentes tipos e faixas de valores (tipos C são obrigados a certas gamas).

Não consigo encontrar [for ... in] laços, por isso assumir que eles não estão lá

em C, ele se parece mais com o seguinte:

int c; para (c = 0; c <= 10; C ++) {// corpo do ciclo}

parece que eu vou ter de declarar as coisas religiosamente

Sim, muito - muito mais, do que você vai apreciar

e eu suponho que eu não tenho objetos (que eu tratadas em PHP há um tempo atrás).

correta, nenhum objeto - mas OOP ainda pode ser emulado usando outras formas, tais como a função (obj struct)

Dependendo de seus objetivos e motivação, eu acho que você pode achar C uma linguagem muito frustrante para iniciar a programação séria com, você pode querer olhar para algumas das alternativas relacionados, como por exemplo o Java.

Respondeu 19/05/2009 em 15:24
fonte usuário

votos
1

Eu estava apenas fazendo uma pesquisa on-line, e parece que há uma possibilidade viável para usar lua para o desenvolvimento no "Nintendo DS", este pode ser de fato a maneira mais fácil para alguém familiarizado com linguagens de alto nível para começar a fazer o desenvolvimento integrado, sem sacrificar muito poder HLL e sem experimentar o choque cultural inevitável ao migrar de um HLL para C: microlua , aqui estão os docs API .

Então você pode querer dar-lhe um ir, possivelmente usando um emulador para começar.

Mantenha-nos informados!

Respondeu 19/05/2009 em 16:37
fonte usuário

votos
1

Você vai perder particularmente gerenciamento automático de memória e tipos de dados semanticamente significativas, tais como cordas, mesas e c. No entanto, aprender bem C é bastante instrutiva, embora você provavelmente não quer usá-lo para a programação em nível de aplicativo, então eu sugiro que você pegar um "K & R" (livro seminal de Kernighan e Ritchie) e dar-lhe um ir - você vai encontrar uma abundância de bibliotecas livres na web para usar e estudar à medida que avançar para além de que, embora você vai ter que disciplinar-se para usar heurística de gerenciamento de memória adequados ... aprendizagem feliz!

Respondeu 19/05/2009 em 15:26
fonte usuário

votos
1

matrizes dinâmicas e coleta de lixo. Não é construído para C então você precisa para rolar seus próprios ou usar uma solução pré-existente.

O procedimento padrão é que você gerenciar a memória mesmo que possa soar como algo horrível, mas ele realmente não é. Por exemplo, em AS3 e PHP você pode criar uma matriz e esquecê-lo quando você está feito com ele. Em C você terá que certificar-se de retirar a atribuição-lo sozinho ou memória vai vazar e coisas ruins pode / vai acontecer.

Respondeu 19/05/2009 em 15:02
fonte usuário

votos
0

Precisamos de mais desenvolvedores homebrew. Eu sou um GBA / NDS e muitos outros desenvolvedor plataforma embarcada e esperamos ver que você continuar com isso. Eu diria pular para armar montador e depois de volta para C ou qualquer outra linguagem que você gosta, uma vez que você sabe como funciona o processador, as línguas são apenas sintaxe.

Eu assumo a sua experiência prévia abrange a mentalidade de programação, quebrar as coisas em pedaços de mordida de tamanho e, em seguida, escrever código para executar esses pedaços. Em seguida, um outro módulo que liga os juntos e assim por diante. Então C é apenas uma outra linguagem, uma linguagem muito simples, não há necessidade de mergulhar nos cantos da mesma, conduzir no meio. É um bom hábito de declarar variáveis, etc, e aqui você terá que. Os compiladores irá dizer-lhe quando você tiver esquecido alguma coisa. Você não vai precisar de grandes conceitos, estruturas grandes, mágica linguagem, este é incorporado, você é recurso limitado, escrever alguns bytes aqui, ler um registo lá, extrair um pouco a partir dos dados para ver se um botão foi pressionado, escrever um registo em resposta a mover um sprite, etc.

Eu acho que você vai encontrar o NDS muito mais difícil do C no início, há dois processadores e algumas infra-estruturas para obter o mais simples dos binários de trabalho. Concedido há muitos exemplos lá fora também. Eu geralmente (e ainda fazem) recomendo começar com o GBA, em seguida, mudar para o NDS. morder pedaços de tamanho.

Respondeu 24/05/2009 em 15:31
fonte usuário

votos
0

C é o próximo nível acima assembler reta e permite operar perto do metal. Isto dá poder para fazer coisas incríveis, mas também para atirar-se facilmente no pé!

Um exemplo é o acesso directo à memória e os perigos e as maravilhas da aritmética de ponteiro. Os ponteiros são muito poderoso, rápido e prático, contudo, exigir uma gestão cuidadosa. Veja esta questão SO para um exemplo.

Além disso, como mencionado por outros usuários com respostas que você terá que fazer seu próprio gerenciamento de memória. Novamente poderosa e dolorosa.

Eu recomendaria estudando um bom livro e encontrar algum código de exemplo de qualidade. O importante é aprender os padrões que fazem tudo isso se juntam corretamente e elegante (bem, tanto quanto possível). Um bom depurador também vai realmente ajudar e se familiarizar com as bibliotecas padrão C também.

Você pode notar suas aplicações quebrando na queda de um chapéu inicialmente, mas perservere como C é definitivamente vale a pena, pelo menos brincar. Você vai entender algumas das abstrações surpreendentes linguagens de alto nível fornecem e o que realmente está acontecendo sob o capô.

Respondeu 19/05/2009 em 15:45
fonte usuário

votos
0

Movendo-se directamente a partir de uma linguagem de execução de nível superior em uma máquina com recursos efetivamente infinito para um DS vai ser um desafio, e não apenas por causa da língua.

O Nintendo DS tem apenas 4 MB de RAM, um 66MHz ARM-7, nenhum sistema operacional, e as bibliotecas de desenvolvimento disponíveis (como libnds) fornecem apenas uma abstração fina sobre o hardware em si.

Assim, além de ter que lidar com o gerenciamento de memória manual, uma linguagem mais simples com menos conforto, tipagem estática, a falta de objetos e a necessidade de executar um passo de compilação antes que você possa ver todas as mudanças, você também tem que lidar com a memória fragmentação, uma CPU muito lento para os padrões modernos, e que necessitam de interagir com o hardware diretamente, a fim de fazer qualquer coisa útil.

Escrever código para o DS, a única outra opção é C ++. Você não pode usar um monte de recursos avançados que tornam C ++ pena em um sistema tão limitado. Você estaria escrevendo código C usando um compilador C ++.

Dito isto, é muito divertido. Você pode andar com o hardware o quanto quiser, e não há necessidade de interface com o sistema operacional, porque não há um.

Respondeu 19/05/2009 em 15:38
fonte usuário

votos
0

O que você vai realmente perder é a capacidade de rapidamente protótipo e testar as alterações. Você não pode simplesmente mudar uma linha de código e correr. Mesmo usando construir ferramentas como "fazer" uma recompilação muitas vezes pode levar vários minutos. Este é ainda pior quando você considera que é muito fácil cometer erros em C / C ++. Em grandes projetos que eu acho que eu gastar mais tempo de compilação do que realmente codificação. Como um usuário de longo prazo de linguagens de script este é o meu maior problema com o uso C.

Respondeu 19/05/2009 em 15:29
fonte usuário

votos
0

Eu tenho certeza que você quer estar a olhar para C ++, não C. C ++ é basicamente orientada a objeto C.

Respondeu 19/05/2009 em 15:21
fonte usuário

votos
-2

Um monte de coisas de OOP é o mesmo ou quase o mesmo em PHP e C #.

Você não joga com ponteiros em C # (em comparação com C ++), então eu recomendaria definitivamente indo com C # se você quiser jogar com C.

O C você está falando?

C #

foreach(string item in itemsCollection)
{
...
}

PHP

foreach($itemsCollection as $key=>$value)
{
...
}

etc.

Eu gosto de C #, porque é fortemente digitado e seus tipos são verificados automaticamente enquanto você escreve um código ... A possibilidade de tentar salvar inteiro em corda ou vice-versa é zero, em comparação com PHP onde você pode salvar qualquer coisa em qualquer coisa ...

Respondeu 19/05/2009 em 15:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more