Hur lär jag mig C-programmering och grunderna i operativsystem på ett praktiskt sätt?

Programmeringsikon

Det finns många sätt att göra lära sig att programmera, det finns många webbsidor med handledning, kodexempel, etc. Du kan också hitta ett stort antal böcker om programmering, både C och många andra språk. Det finns också programmeringskurser online eller ansikte mot ansikte där du kan börja förstå dessa tekniker för att skapa din egen programvara från grunden till en avancerad nivå.

Å andra sidan finns det några fysiska tränare med vissa mikroprocessorer eller mikrokontroller som du kan programmera för att lära dig denna konst nästan genom att spela och skapa projekt. Ett mycket bra exempel är själva Raspberry Pi, Parallaz-korten eller de nationella som du hittar i MKElectronics-butiken eller det välkända kortet Arduino, Scratch. Men om du vill fokusera mer på mjukvaruutveckling, rekommenderar jag alltid samma: läsa och ändra kod.

I det här inlägget Jag kommer inte att försöka ge dig programmeringskurser, eftersom det är ett ämne som jag skulle ge för många artiklar som detta förklarar från grunderna för programmering till den mest avancerade programmeringen. Jag vill bara ge dig några resurser eller sätt att börja stärka din kunskap. Och jag försäkrar er att de är mycket effektiva. Du vet också att du kan börja med vilken GNU / Linux-distribution som helst, med de nödvändiga paketen för programmering som en textredigerare eller en IDE, även GCC och GDB, om du vill felsöka ... Eller använd också lite distribution för programmerare. Jag tror också att du redan känner till eller borde känna till den här typen av verktyg som du har till ditt förfogande.

Hur man börjar

Källkod på skärmen

Du kan hitta kodavsnitt i nätverket till miljoner, det vill säga kodfragment som kan användas eller modifieras för att göra mycket specifika uppgifter. Dessa källkoder är grunden för inlärning, eftersom de är mycket grundläggande funktioner som hjälper dig att förstå hur programmen fungerar och du kan ändra några parametrar för att få dem att göra något annorlunda. Och så börjar det!

När du går framåt kan du hoppa in läs källkod, som om det är väl kommenterat kommer att vara särskilt näringsrikt för din kunskap. Tyvärr har inte alla utvecklare en god vana att kommentera de linjer de skriver, och i vissa fall är kommentarerna knappa eller förvirrande även för erfarna människor. Men lyckligtvis har vi en stor del av samhället som kommenterar sina projekt ganska bra.

Plattformar där mjukvarukod som GitHubTill exempel, även om det finns många fler, är de mycket viktiga källor till visdom. Jag rekommenderar faktiskt att när du väl har fått lite flyt med utdrag eller dina små program, gå till dessa typer av plattformar och få tillgång till källkoden för enkla projekt. Du kan använda filter- och sökmotorfunktionerna för att hitta specifik kod i en programmeringsspråkSom C och välj sedan en som är enklare.

Så smått kan du gå öka komplexiteten i programmen för att höja din kunskap till en ganska avancerad nivå. Börja inte med projekt med många rader, annars blir du frustrerad över att inte förstå vad den här stora mängden kod är för eller vad den gör. Det börjar med små program på några dussin rader, sedan för några av 100 eller mer och så vidare tills du småningom når mer komplexa program.

Dessutom råder jag dig att leta efter program som du känner ganska bra när det gäller deras användning. Tänk dig till exempel att du använder en viss öppen källkodsredigerare eller en kalkylator. Att veta vad detta program gör i praktiken blir det lättare för dig att relatera de källkodslinjer som du kommer att se med de funktioner som programmet har. Å andra sidan, om du väljer en kod som du inte har någon aning om, bara med hjälp av din grundläggande programmeringskunskap och de kommentarer som du hittar i kodfilerna räcker inte.

Ta till exempel en titt på det andra exemplet som visas i min sökning efter beräkningsprogram i språk C av följande bild. Beskrivningen visar att det är ett kommandoradsprogram som implementerar en enkel kalkylator. Det här är en bra kod att börja med, inte bara på grund av kodens enkelhet, utan för att vara textbaserad har du inte kodfiler relaterade till GUI, etc., allt som distraherar dig och gör inlärningen ganska svår:

Github

Om vi ​​går in i det här projektet för att se dess kod kommer vi först att hitta de filer som utvecklaren har laddat upp till denna plattform. Liksom detaljerna i LICENSlicensen, filen med information par excellence README, etc. Men märker att det finns rubriker filer som helpers.h och struct.h, dessa två är viktiga, och även de två .c, som är de som har den faktiska C-källkoden för detta program:

Rubriker

Om vi ​​får åtkomst till en av rubrikerna eller .h, kommer vi att se att det är ett enkelt program utan för många rader. Du hittar dessa typer av filer många gånger, såvida det inte är ett ganska enkelt program som inte behöver dem, men det är en inkludera fil där vissa detaljer eller ytterligare filer ingår som kompilatorn måste bearbeta för att bilda programmets slutliga binär.

I en rubrikfil hittar du direktklassdeklarationer, underrutiner, definierade variabler och andra. Ibland är de här Bibliotek som du kan använda från huvudkodfilen (.c) med direkt hänvisning till vad som deklareras i dessa rubriker utan att behöva upprepa hela strukturen varje gång det behövs:

Kodrubrik

När det gäller själva källkoden, som calc.c-filen från vårt exempel hittar du fler rader. Cirka 400 något, och i detta specifika fall kommenteras de inte. Vilket allvarligt hindrar att förstå koden. Att vara ett program så enkelt som en miniräknare kan du dock läsa och ändra det utan problem, eftersom det kommer att vara intuitivt:

kom ihåg, läs koden och modifiera den. De där är nycklarna till att lära sig programmera på bästa möjliga sätt ...

Ett steg till: kärnan

Linux Kernel

Nu, när du redan har förvärvat några grundläggande programmeringsfärdigheter på C-språket, kan du ta ett steg längre och gå in i den fascinerande världen av operativsystem och datorarkitekturer. För detta måste du ha lite högre kunskap om hur datorer fungerar, men återigen kan de befintliga open source-projekten hjälpa oss mycket.

Analysera kärnkällkod det kan få oss att förstå på ett bättre sätt hur denna värld av operativsystem fungerar, och det kommer också att bli en mästarklass att få vår "doktorsexamen" i C-programmering, eftersom det är något av stora ord. Du kanske tror att det bästa projektet att lära sig detta skulle vara Linux-kärnan.

Istället är de nuvarande dimensionerna av senaste Linux-kärnversionerna de är för komplexa för att vara begripliga för de flesta dödliga. Speciellt för stor mängd kod för andra delsystem och drivrutiner som du hittar läggs till vad som är själva kärnan. Det kan få dig att tro att i kernel.org kan du hitta mer primitiva versioner av kärnan, till exempel den "historiska" där det finns några "gamla versioner" som Linux 0.01, den första där koden är mycket mer reducerad och enkel att analysera.

Fånga Kernel.org

Och även om C-koden som du hittar i Linux-kärnan är utsökt, Jag rekommenderar inte Linux-kärnan på grund av att det vanligtvis knappast kommenteras vid många tillfällen. Jag säger inte att utvecklarna har en dålig kommentarpolicy, men det kan vara förvirrande för någon som precis börjat. Så spara Linux-kärnan och LKML för senare ...

Och det är sant att de finns några mycket bra böcker och kurser för att lära dig mer om kärnan, modulerna och drivrutinerna, men kanske inte det bästa stället att börja. Några exempel är (några av dem, som Gregs, kan du ladda ner gratis eftersom de har släppts):

  • Linux Kernel Development 3:e upplagan av Robert Love.
  • Förstå Linux Virtual Memory Manager av Mel Goman, även om den senare bara fokuserar på kärnminneshantering.
  • Linux-enhetsdrivrutiner 3:e upplagan av Greg Kroah-Hartman, även om det är fokuserat på 2.6-kärnan, men det är ett fantastiskt arbete att förstå drivrutinerna och kärnmodulerna.
  • Linux-kärna i ett nötskal är en annan av den stora Greg Kroah-Hartman som ger dig en mycket mer global vision.

Du kan också hitta några mycket väldigt intressanta webbplatser, utöver dina egna information och dokumentation som du hittar på kernel.org, som:

Ett annat av de stora projekt som fortfarande studeras och fungerar som lärande är UNIX 6: e, vars kod analyseras på ett extraordinärt sätt i böcker som Lions kommentar till UNIX 6: e upplaganav John Lions. Jag lämnar det till dig som en annan alternativ idé, även om jag fortsätter att rekommendera följande som jag ska kommentera ...

Men jag tror det den bästa resursen du har till ditt förfogande är att studera och analysera MINIX-källkoden. Det är ett mycket enklare system där Linux ursprungligen inspirerades men som har utformats speciellt för lärande och studier. Att vara avsedd för framtida operativsystemarkitekter att lära sig, den feedback den har är extraordinär för de som precis börjat.

Mer information - MINIX3

Där hittar du mycket information och dokumentation om projektet. Och du kan ladda ner själva operativsystemet, men har också till ditt förfogande en bra Wiki där det också finns texter för utvecklare. Men eftersom det handlar om att lära sig C och analysera hur ett operativsystem består, hänvisar jag dig direkt för att ladda ner den första versionen av MINIX 1-källkoden:

Källkod - MINIX1

Till exempel om du går till huvudfil main.cDu kommer att se att koden här är väldigt annorlunda än hur du hittar den i Linux eller i det räknarprogram som jag använde som ett exempel i början av detta inlägg. I det här fallet kommer du att märka att antalet kommentarer är mycket rikligare:

MINIX källkod

Här är nästan varje rad eller varje fragment comentado. Gör din läsning och förståelse. Jag insisterar igen, det handlar inte bara om att läsa och förstå, det handlar också om att modifiera. Gör dina egna modifieringar och tester, kompilera sedan och se resultatet. Det blir den bästa programmeringsmästaren du kan hitta. Jag försäkrar er, som jag alltid berättar för mina elever, att läsa och ändra kod är den bästa datorklassen du ska ha ...

Inte bara kommer du att kunna analysera kärnan i operativsystemet utan även andra hjälpelement som utgör hela operativsystemet och också kommandon som du kan köra i skalet. Det är ett utmärkt sätt att lära sig från "inuti" hur dessa kommandon som ls, cat, cp, grep, echo, etc., som du utför dagligen, även med ganska väl kommenterade kodarbete ...

Kommandokällkod - MINIX1

Slutligen känner jag en kille som har skapat en kärna från grunden. Han heter Luis och du kan hitta hans projekt på den här adressen GitHub, ett annat bra studieexempel som jag skulle rekommendera. Hans system kallas Indien, det är ganska enkelt och perfekt att skaffa sig grundläggande kunskaper. Vem vet? Kanske kommer du att vara nästa att våga skapa en kärna ...

Om du vill lära dig monterare eller ASM, ett intressant språk tillsammans med C för att programmera på låg nivå och särskilt för operativsystem ... finns det också mycket intressanta projekt som fallet med KolibriOS, ett gratis system skrivet i samlare. Att vara i ASM är det mycket mer komplicerat, men det ger också en god uppfattning om hur maskiner fungerar på en mer intim nivå med avseende på hårdvara.

Självstudie: Skriv ut källkod för att studera den på papper

PDF med färgglad källkod

Om du är en av dem som inte gillar att spendera timmar framför en skärm och titta på den, kanske du föredrar papper. Jag ska visa dig en liten handledning om hur du kan skriva ut alla dessa källkoder som vi har pratat om eller de som du vill analysera. Så du kan ha en PDF med syntax markerad redo att skriva ut på din skrivare och läsa på papper, där du kan göra dina kommentarer och mer.

För att göra detta kommer det första att vara installera nödvändiga paket i vår distro:

 

sudo apt-get install texlive-latex-extra latex-xcolor textlive-latex-recommended

När vi har dessa filer, vi kommer att använda LATEX För att omvandla källkoden till en PDF, och för detta måste vi spara det här skriptet, ge det körningstillstånd och köra det i Bash:

#!/usr/bin/env bash

tex_file=$(mktemp) ## Random text file name

cat<<EOF >$tex_file   ## Print the text file header
\documentclass{article}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{color}  %% Allow color names
\lstdefinestyle{customasm}{
  belowcaptionskip=1\baselineskip,
  xleftmargin=\parindent,
  language=C++,   %% Change this to whatever you write in
  breaklines=true, %% Wrap long lines
  basicstyle=\footnotesize\ttfamily,
  commentstyle=\itshape\color{Gray},
  stringstyle=\color{Black},
  keywordstyle=\bfseries\color{OliveGreen},
  identifierstyle=\color{blue},
  xleftmargin=-8em,
}        
\usepackage[colorlinks=true,linkcolor=blue]{hyperref} 
\begin{document}
\tableofcontents

EOF

find . -type f ! -regex ".*/\..*" ! -name ".*" ! -name "*~" ! -name 'src2pdf'|
sed 's/^\..//' |                 ## Change ./foo/bar.src to foo/bar.src

while read  i; do                ## Loop through each file
    name=${i//_/\\_}             ## escape underscores
    echo "\newpage" >> $tex_file   ## start each section on a new page
    echo "\section{$i}" >> $tex_file  ## Create a section for each filename

   ## This command will include the file in the PDF
    echo "\lstinputlisting[style=customasm]{$i}" >>$tex_file
done &&
echo "\end{document}" >> $tex_file &&
pdflatex $tex_file -output-directory . && 
pdflatex $tex_file -output-directory .  ## This needs to be run twice ## for the TOC to be generated  </pre><pre>

Efter att ha sparat den i en fil med namnet pdf.sh, du kan ge det behörigheter och köra det på ett enkelt sätt:

chmod +x pdf.sh
./pdf.sh

Och resultatet blir en PDF med texten markerad i färg för en bättre läsning av källkodsfilerna i den aktuella katalogen. Namnet på PDF-dokumentet kommer att vara alla.pdf. Nu är det klart för dig att lägga det i din utskriftskö för att få det på papper.

Förresten, det enda problemet är det källkodsfilerna Katalogen där du kör det här skriptet som innehåller mellanslag i deras namn fungerar inte med det här skriptet. Så om det finns några kan du ändra deras namn eller ändra manuset för att stödja dem ...

Glöm inte att lämna dina kommentarerJag svarar gärna på alla frågor du har om det eller lyssnar på feedback som du har för att förbättra inlägget. Och jag hoppas att det har fungerat som en guide för att komma igång i denna värld ...


Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för data: AB Internet Networks 2008 SL
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.

  1.   Slam sade

    Mycket bra inlägg ... !!!
    Jag har bara problem med manuset, det röstar för fel på rad 5.

  2.   Xavier sade

    Hej god natt här i Mexiko, det skulle vara bra för dig att fortsätta skriva genom detta medium och, om möjligt, fortsätta fylla med kunskap. Å andra sidan, tack för att du ägnar din tid och erfarenhet som vi har kvar hälften. Mitt fall som jag hade är att jag lämnade min karriär på grund av problem nu arbetar jag för att försörja mig själv. Så småningom plockar jag upp saker i denna mening, verkligen totalt tack.

  3.   ängel martinez sade

    Hur får jag all information om programmering

  4.   Älskvärd isma sade

    Problemet med rad 5 möjligen (för att jag inte har provat det ännu xd) beror på att det är skrivet så här:

    katt < $ tex_file ## Skriv ut textfilens rubrik

    när det ska vara så här:

    cat <$ tex_file ## Skriv ut textfilens rubrik

    Eller så föreställer jag mig: U ...

    Hälsningar.

  5.   Älskvärd isma sade

    Åh helvete den här gången gjorde han det rätt>: v

  6.   Gregory ros sade

    Grattis till artikeln, jag älskade den! Sluta programmera sedan .... xD nästan trettio år, otaliga gånger funderade jag på att ta upp det igen och på grund av brist på tid och särskilt LATTIGHET skjuter jag alltid upp det. Jag erkänner att dokumentationen som finns nu är fantastisk, synd att det mesta är på engelska, jag vet att nu vill alla förstå det, men min kunskap är begränsad till lite mer än de två dussin ord som används i programmering. Finns det en handledning om kernell på spanska? Jag lovar inte att återuppta programmeringen, jag lämnade det för många gånger för att tro att jag kunde göra det nu, men om det finns något som jag aldrig förlorade var det nyfikenhet. Tack för artikeln och vänliga hälsningar.