Wat zijn de programmeertalen. Verschillende programmeertalen en hun toepassingsgebieden. Lezing in Yandex. Abstracte semantische grafiek

Zalina 13 januari 2016 om 15:42

Verschillende talen programmering en hun toepassingsgebied. Lezing in Yandex

  • Yandex-bedrijfsblog,
  • Website ontwikkeling,
  • Programmeren,
  • Industriële programmering

We besloten dit jaar onze eerste post te wijden aan een heel basaal onderwerp, een lezing die werd gegeven in de Small SHAD. Middelbare scholieren die geïnteresseerd zijn in technologie zijn ermee bezig, vandaar de specificiteit van de presentatie - de lezing zal vooral interessant zijn voor degenen die net beginnen met programmeren en nadenken over de richting waarin ze zich willen ontwikkelen. Voor hen heeft Yandex een cursus "Inleiding tot programmeren (C ++)", die kan worden gevolgd op het Stepic.org-platform.

Docent Mikhail Gustokashin - Curator van academische programma's bij Yandex, directeur van het Centrum voor Studentenolympiades, Faculteit Computerwetenschappen, HSE. Mikhail heeft tientallen winnaars en prijswinnaars van de All-Russian Programming Olympiades opgeleid.

In het kader van de lezing wordt verteld wat programmeertalen zijn, hoe ze verschillen, hoe ze verschenen en welke beter en welke slechter zijn. In het begin zullen we het hebben over de geschiedenis van talen - hoe ze verschenen, hoe mensen begonnen te programmeren, hoe alles zich ontwikkelde, wat er nu gebeurt. In het tweede deel wordt ingegaan op voor welke taken welke taal geschikt is, hoe u "uw favoriete taal kunt kiezen en van het leven kunt genieten". De docent zal ook een beetje vertellen hoe je dit naar zijn mening allemaal kunt leren en vervolgens aan een baan kunt komen.

Zoals altijd bevindt zich onder de snit een gedetailleerd transcript van de lezing, zodat u door de inhoud ervan kunt navigeren.

Geschiedenis van programmeertalen

Laten we bij het begin beginnen. In het begin hadden computers niet eens een toetsenbord! Dat wil zeggen, alles was erg slecht - ze hadden geen toetsenbord of scherm, ze hadden ponskaarten (dit zijn dingen met gaten of geen gaten). Dienovereenkomstig werden ofwel de pinnen daar gestoken, ofwel schenen ze daar met licht. Als er een gat is (of omgekeerd), betekende dat nul of één. En programma's in die tijd werden geschreven met machinecodes - elke bewerking in een computer (optellen, aftrekken, sommige complexere bewerkingen) had een soort machinecode. Mensen kozen zelf deze code van het plaatje, allerlei adressen in het geheugen, ze klopten het er allemaal uit met hun handen en duwden het in de lezer - en het werd allemaal geteld. Natuurlijk was het werk van een programmeur toen waarschijnlijk niet erg interessant - gaten maken - en met de ontwikkeling van wetenschap en technologie begonnen ze natuurlijk met allerlei meer "interessante" dingen te komen. Bijvoorbeeld assembler (Assembler), die het leven al een beetje makkelijker maakte.

Wel, hoe heeft hij het leven gemakkelijker gemaakt? In plaats van te onthouden dat er een soort "magische" code voor het team was, werden allerlei woorden gebruikt die op "mens" leken Engels- sommigen optellen of verplaatsen - en vervolgens werden de registers of geheugengebieden, de variabelen waarmee deze bewerkingen moeten worden uitgevoerd, opgesomd. Maar het is duidelijk dat dit in het algemeen ook een voldoende grote hoeveelheid mentale inspanning vergde om in gedachten te houden in welk register we hebben wat er ligt, waar welke variabelen en wat er in het algemeen gebeurt. Waarom is dit gebeurd? Omdat computers "dom" waren en niets meer "slim" konden begrijpen. Eigenlijk, en bouwen vanuit assembler machine code kost ook tijd, geheugen (in die tijd was er natuurlijk niet genoeg van).

Gaandeweg werd duidelijk dat het ontwikkelen van zulke grote complexe programma's erg moeilijk. De productiviteit van de programmeur bij deze opdrachten was extreem laag - dat wil zeggen, hij schreef meerdere regels per dag (betekenisvol) en elke regel deed niets bijzonders - enkele eenvoudige rekenkundige bewerkingen. En mensen wilden talen veel meer laten lijken op de menselijke taal, met name op het Engels, om het schrijven van programma's gemakkelijker en handiger te maken. En daar gaan we!

Oude en dode talen

Fortran werd een van de eerste talen. Trouwens, hij werd ook uitgeschakeld op ponskaarten - er waren speciale ponskaarten om Fortran-programma's uit te schakelen. Maar als je deze Fortran nu neemt, is het naar mijn mening zelfs ergens tussen de 50-60. verscheen - en probeer er iets op te schrijven, het zal erg onaangenaam voor je zijn, dat garandeer ik je! Het moderne Fortran leeft nog steeds, maar het is heel anders dan het vroeger was.

Andere talen - nu zal ik één ding schrijven waar je waarschijnlijk van hebt gehoord, dan alleen op evenementen waar ze vertellen over de geschiedenis van programmeren - dit is COBOL. Het was een taal voor het schrijven van zakelijke applicaties. Wat zijn zakelijke toepassingen? Alle transacties bij banken, iets anders, dit alles werd in Kobol geschreven. Het is natuurlijk niet erg populair bij ons. Ik denk dat je nauwelijks een programmeur zult vinden op Kobol, in Moskou. En ergens niet in Moskou - met nog meer moeite. Maar verrassend genoeg was zelfs 10 jaar geleden meer dan de helft van alle door de mensheid geschreven code in Cobol geschreven. En tot nu toe wordt een aanzienlijk deel van alle banktransacties uitgevoerd met programma's die erin zijn geschreven (COBOL), en nog steeds schrijven mensen er iets op.

Er is ook een "grappige" taal, het heette Algol (de 68e versie, die het jaar van zijn oprichting kenmerkt). Het is een algoritmische taal. Over het algemeen konden ze daar iets doen, maar nu zijn we niet erg geïnteresseerd in wat ze kunnen doen. En dit is waar onze excursie naar de oudheid en naar relatief ongebruikte talen kan eindigen en doorgaan naar wat nog leeft (en actief leeft).

Oude maar levende talen

Algol is uitgevonden in Europa en Fortran werd voornamelijk in de Verenigde Staten gebruikt - er zijn geen grote verschillen. Welke trend is zichtbaar? In het begin was alles moeilijk en om te schrijven moest je bijna een ingenieur zijn, een elektrotechnisch ingenieur, begrijpen waar welke contacten zijn gesloten en iets anders voor het programmeren. Ook toen was het nodig om bij de bladeren te zitten en de herinnering te tellen, ervoor te zorgen. En geleidelijk werd alles eenvoudiger, eenvoudiger, eenvoudiger en dan nog gemakkelijker voor de programmeur - zo min mogelijk denken voor een persoon, zoveel mogelijk automatisch doen. Ongeveer aan het einde van deze periode (de docent wijst op Algol en Kobol) beginnen talen te verschijnen die in zekere zin tot op de dag van vandaag "overleefd" hebben.

BASIS. Misschien schrijven sommige mensen er nog iets op, ik zag tenminste dat ze in sommige instellingen lesgeven op QBasic - zo'n blauw venster waar "1989" staat. Over het algemeen leeft hij "met macht en kracht"! Het is uitgevonden als een taal voor niet-programmeurs. In die tijd was de programmeur zo'n zeer gespecialiseerd beroep. En hier zeggen ze tegen je: "Hier hebben we een coole" Basistaal, en elk redelijk persoon zal er gemakkelijk een programma op nemen en erop schrijven." Nogmaals, die BASIC en moderne BASIC is een enorm verschil. Al deze regels genummerd om de 10, allerlei soorten GOTO en andere horror - ze hebben niets te maken met moderne BASIC en hebben zelfs weinig te maken met BASIC van 89.

Een ander grappig verhaal is de Pascal-taal, algemeen bekend in universitaire kringen, vooral in Rusland en in de landen van vroeger Sovjet Unie... Het is en wordt nog steeds verrassend gebruikt als: taal onderwijzen... In de rest van de wereld komt het minder vaak voor, maar het is ook springlevend. Er is zo'n persoon Wirth - hier is hij een wetenschapper, een theoreticus. Hij nam deel aan de discussie over Algol, hij vond het niet leuk wat er gebeurde, en hij bedacht zijn eigen taal - Pascal. En toen nam de firma Borland (en daarvoor vele andere firma's - vooral Apple was erbij betrokken) alles in beslag en verpestte het. Hij had een mooie theorie, slank - "alles komt goed" - en ze namen en propten daar wat mensen nodig hebben voor hun werk. Nou, het ging niet zo goed als hij wilde.

En tenslotte,. Xi is uitgevonden door ingenieurs. Als Pascal is uitgevonden door een wetenschapper, dan is C uitgevonden door Kernighan en Ritchie, ze werkten als ingenieurs bij Bell. Hoe is het ontstaan? In die tijd was het onmogelijk om iets systemisch in deze talen te schrijven (de docent wijst op Fortran, COBOL, Algol). Wat is "systemisch"? Bijvoorbeeld een besturingssysteem, sommige stuurprogramma's, iets anders. Deze talen waren bedoeld voor wiskundige berekeningen, voor zakelijke berekeningen, voor dat alles. En al het andere was geschreven in Assembler. Er waren enkele talen, die zijn nu dood, dat wil zeggen, de C-taal verscheen niet onmiddellijk uit Assembler, maar door wat tussenliggende dingen.

Wat is de essentie? Kernighan en Ritchie speelden graag met het Asteroids-speelgoed - vliegen ruimteschip, en er zijn asteroïden, hij schiet op ze, en ze vallen uit elkaar. Ze hadden een server waarop ze speelden, maar er waren veel mensen en het speelgoed vertraagde. En ze ontdekten ergens in hun kantoor dat ze een computer hadden die niemand gebruikt. Maar er was een probleem: het had een andere architectuur en het spel was geschreven in Assembler.

Ze hebben het natuurlijk herschreven, ze hebben zelfs enkele functies ingekort om erop te kunnen spelen. Maar dit bracht hen op het idee om te herschrijven onder nieuwe architectuur elke keer is niet erg slim. En ze besloten een taal als deze te schrijven hoog niveau, die geschikt zal zijn voor systeemprogrammering, dat wil zeggen, waarin het mogelijk zal zijn om het geheugen te beheren, waarin het mogelijk zal zijn om te begrijpen waar iets is en hoe toegang te krijgen tot deze stukjes geheugen. En zo verscheen de C-taal, die later een enorme impact op alles had. Allemaal (de docent wijst op Algol, Fortran en andere genoemde talen) hadden een grote invloed, maar C - ja ...

Het was dan ook de hoofdtaal in Unix - een besturingssysteem dat toen nog populairder was dan nu. En rond de jaren 80 was de situatie ongeveer zo (de docent laat zien in Basic, C en andere genoemde talen). Laten we zeggen dat dit allemaal stiekem is gestorven (de docent wist verwijzingen naar Assembler, Fortran en Algol) ... En in de jaren 80 werden computers kleiner, slimmer, goedkoper, en mensen wilden allerlei eigenaardigheden, om om nog beter te leven, om nog leuker te leven.

Talen afkomstig uit de jaren 80

Een van de eerste eigenaardigheden was de C++-taal. De C-taal heeft een groot aantal tekortkomingen (nou ja, gewoon een enorme in het algemeen) - je kunt er alles mee doen, inclusief jezelf in het been schieten, jezelf in het been schieten met een fictie, in het andere been, schieten met de ene voet in het andere been, in het algemeen - dat u wilt doen. Maar tegelijkertijd worden daar sommige architecturale dingen nogal moeilijk gedaan - opnieuw, zoals in Assembler, moeten we bijhouden waar we zijn, wat en welk geheugen we hebben toegewezen; het is er de hele tijd dat dit geheugen ergens "vloeit" - dat wil zeggen, we hebben geselecteerd, vergeten te verwijderen, het verkeerde verwijderd, uit het geheugen geraakt, in het algemeen - we hebben een heleboel problemen.

C ++ is oorspronkelijk gemaakt als een reeks toevoegingen aan de C-taal die de ontwikkeling zouden vergemakkelijken. In die tijd kwam objectgeoriënteerd programmeren in de mode en mensen besloten dat alles in de vorm van een hiërarchie kan worden beschreven, dat wil zeggen, je hebt een bal (abstract), je erft een voetbal, een volleybal, nog een abstracte bal . Het was toen in de mode dat "nu we alles in de vorm van een soort hiërarchie schrijven, en alles komt goed, het leven zal verbeteren, alles komt goed en alles." In zekere zin implementeerde C ++ deze objectbenadering - het was niet de eerste objectgeoriënteerde programmeertaal, maar het werd behoorlijk populair en allerlei functies begonnen erin te verschijnen. Tegelijkertijd behield C++ (op dat moment) bijna volledige compatibiliteit met de C-taal, een programma geschreven in C werd in 99% van de gevallen met succes als C++ gecompileerd en werkte zelfs op dezelfde manier. Dit was bedoeld om het makkelijk te maken om van C naar C++ te migreren.

Naast de objectbenadering (in C++) ontstond al snel de Standard Template Library (STL). Ik denk dat degenen die Pascal nog lesgaven op school ontdekten dat je daar in de eerste plaats geen ingebouwde sortering had (in het oude, blauwe Borland Pascal, nu bestaat het al in moderne versies) - er is een voorbeeld (bron) van sorteren, u kunt deze kopiëren en plakken. Maar als je hier gehele getallen wilt sorteren, hier wil je reële getallen, en hier zijn strings die met elkaar kunnen worden vergeleken, je moest drie verschillende soorten schrijven die precies hetzelfde doen, ze hebben alleen verschillende datatypes. Dit is niet erg goed, en sjablonen die niet meteen in C++ verschenen, maakten dit probleem veel gemakkelijker. Dat wil zeggen, je had een abstract programma dat met succes iets sorteerde dat met elkaar kan worden vergeleken.

Scripttalen uit de jaren 90

Maar de tijd heeft niet stilgestaan, in de jaren 80 gebeurden er veel interessante dingen. Maar ergens rond het begin van de jaren 80 en 90 werden computers zo goed dat het al mogelijk was om heel vreemde en zeer ineffectieve dingen te doen. Dit waren met name scripttalen die niet in machinecode werden gecompileerd, maar geïnterpreteerd. BASIC werd ooit ook geïnterpreteerd, maar deze scripttalen waren vooral bedoeld voor tekstverwerking - bijvoorbeeld Perl, Python (het was toen niet erg beroemd), PHP, Ruby - dit zijn de scripttalen die in één of in een andere mate leven ze nog steeds (ze zijn er allemaal in geslaagd om vóór 2000 te verschijnen, zelfs veel eerder).

Laten we ze een beetje doornemen, want dit zijn specifieke dingen en nu worden ze op veel plaatsen gebruikt. Wat is het idee? Als we niet compileren, kan er veel meer worden toegestaan. Een programma kan bijvoorbeeld naar zijn code kijken en deze op de een of andere manier gebruiken; ze weet wat er in haar omgaat en daardoor kan ze veel interessante dingen doen.

Perl is ontworpen voor tekstverwerking - in die tijd was er al zoveel geheugen in computers dat het mogelijk was om er wat tekst in te proppen en er iets nuttigs mee te doen (bijvoorbeeld woorden tellen, zoeken naar een soort). Maar naar mijn mening is het ontworpen door mensen die een beetje gek waren, omdat er zo'n grap over hem bestaat: "Elke set tekens die is geschreven, is een correct programma in Pearl." Volgens mij kun je er alleen op schrijven, niet lezen. Als ik naar de code in Perl kijk en probeer iets uit te zoeken, begrijp ik er niets van. Als ik hem beter zou kennen, zou ik misschien iets begrijpen, maar zoals ik hoorde van mensen die het nog weten, zeggen ze dat het gemakkelijker te herschrijven is. Dat wil zeggen, de programma's zijn kort en echt gemakkelijker te herschrijven dan uit te zoeken wat er is en het te repareren.

Rond deze tijd, halverwege de jaren 90, verscheen het internet. In het begin was het mail, sites met statische HTML, maar mensen wilden daar een soort van dynamiek toevoegen zodat alles dynamisch voor ons zou gebeuren, sommige formulieren konden worden ingevuld, gastenboeken te doen, en nog iets anders. Dienovereenkomstig vereiste dit een soort van interactie, ze kwamen met een protocol, hoe het interageert en, belangrijker nog, het genereren van deze statische (voorwaardelijk) pagina's die naar de gebruiker worden "uitgespuwd" als reactie op zijn verzoek.

Over het algemeen paste niets anders dan Pearl in die tijd niet. Het was een slecht idee om de handler in pure C of C++ te schrijven. En bij gebrek aan een betere taal in die tijd (en lang genoeg), was Pearl een populaire taal voor webontwikkeling. Natuurlijk is de schaal niet te vergelijken met wat er nu gebeurt.

PHP is ontstaan ​​als ... per ongeluk. Een persoon stopte hier snel mee - hij maakte een soort van eigen pagina, hij had een soort gastenboek, iets anders, wat dingen. En hij schreef een soort macro's voor Pearl, die op C leek, omdat hij wist hoe hij C moest gebruiken, gewoon omdat hij zich zo op zijn gemak voelde. En ik noemde het Persoonlijke HomePage. Gedeeld en gezegd: "Mensen, kijk eens welk stuk ik heb geschreven, alles is hier veel duidelijker dan op Pearl en je kunt het bewerken." En mensen vonden het leuk.

Toen liet hij de zaak vallen. Als gevolg hiervan begon deze PHP over het algemeen te leven en werd na verloop van tijd veel populairder dan Perl. Maar dit 'geboortetrauma' van hem (het idee is als een set macro's voor Pearl) speelde een nogal wrede grap met hem uit. De taal bleek vreemd te zijn. Dat wil zeggen, het ontwikkelde zichzelf, niemand ontwierp het, niemand beheerde het ontwikkelingsproces (noch het bedrijf noch een persoon), maar er waren veel groepen, die elk zaagden wat ze leuk vonden. Daardoor worden de functies daar anders genoemd, er is niet eens een stijl, alles is door middel van onderstrepingstekens, in het algemeen zijn de instellingen hier en daar, en hoe het allemaal zal werken is niet erg duidelijk. Maar je kunt in twee uur gaan zitten en schrijven in PHP, want zo heeft hij het bedoeld.

Python en Ruby: Ruby is nu minder populair, Python is op de een of andere manier beter "geknipt", laten we het er later over hebben. Het is duidelijk dat dit in die tijd (de docent wijst op Perl, Python, Ruby, PHP) zeer gespecialiseerde talen waren voor zeer gespecialiseerde doeleinden. Over het algemeen was er destijds geen systeemprogrammering, geen bedrijfslogica in geschreven, en nu doet het er niet veel van.

Gecompileerde talen uit de jaren 90

We zullen ongeveer dezelfde tijd gaan, maar in de andere richting. In die tijd gebruikten we C++ voor bijna alles wat geschreven moest worden, niet voor het web, niet voor tekstverwerking, maar voor eenvoudige toepassingen, voor besturingssystemen, voor speelgoed - in het algemeen voor alles. Maar C++ is eigenlijk een enge taal. Waarom? Omdat hij ten eerste erfde vanwege: achterwaartse compatibiliteit alle C-problemen. Er kunnen nog steeds een miljoen doden vallen verschillende manieren, dezelfde die in C waren (natuurlijk zijn er nieuwe manieren toegevoegd in C ++). Tegelijkertijd, als je alles goed en correct schrijft, zoals bedacht door de auteurs van C ++, dan was het natuurlijk onmogelijk om zelfmoord te plegen met de oude methoden, en het lijkt erop dat er minder van waren. Het had echter een heel vreemd objectmodel. De verdeling van het programma in modules, in een soort van stukjes, kwam over het algemeen van C (als je in C of C ++ kunt schrijven - in feite was het bedacht als het simpelweg invoegen van de tekst van de bibliotheek in je programma, in de einde, als je een heleboel insluitsels schrijft, heb je alles - als het "primitief" is, zoals het was in het allereerste begin - alles wordt in één bestand ingevoegd en dan duurt het allemaal vreselijk lang om te compileren, omdat het gaat meerdere keren rond. latere versies nog beter geworden.

Over het algemeen heeft C++ veel nadelen. De kwalificaties van een programmeur moesten hoog zijn om in C++ te schrijven, en dergelijke programmeurs waren duur (zowel opleiding als iets anders, dat wil zeggen, het is moeilijk om programmeurs op de markt te vinden, ze moeten veel betalen, nou ja, in het algemeen is dit niet het geval ...). En onze computers tellen steeds sneller, ze worden goedkoper, mensen kopen nieuwe computers en willen meer apps, meer speelgoed voor je telefoon, meer plezier in het algemeen.

Zo is Java (Java) ontstaan. Ook daar is een nogal grappig verhaal verbonden, hoe de naam in deze taal verscheen. Er zijn programmeurs, die drinken altijd koffie en in die tijd was het in de mode om koffie te drinken, dat groeide op het eiland Java. De taal is opgevat als een taal voor inbouwapparatuur, in het bijzonder voor een koffiezetapparaat. Zo is de naam ontstaan...
Wat begon met haar, wat was er goed aan haar en waarom werd ze zo populair? Ten eerste hebben ze Sishny's nalatenschap volledig verwijderd. Geen wegwijzers, veel minder manieren schiet jezelf een deel van het lichaam en breek alles. Ten tweede introduceerden ze veel recentere ideeën in termen van het objectmodel - dat wil zeggen, C++ verscheen veel eerder dan Java en gebruikte een meer archaïsch, "wild" objectmodel. Welnu, hier (de docent wijst op Java) was het toen al meer uitgedacht, en in theorie dacht men, en in de praktijk pasten en deden ze alles veel cooler.

En tot slot de derde. Onze Java-programma's werden niet geassembleerd tot machinecode, maar tot code voor een virtuele machine. Dat wil zeggen, u had een JVM virtuele machine (VM) - Javovsky. Je programma's werden verzameld in een soort tussenpresentatie en vervolgens, met behulp van deze machine, al uitgevoerd. Wat deed het? Ten eerste vertraagde het, en ten tweede at het geheugen met verschrikkelijke kracht, en ten derde was het overal (theoretisch) draagbaar - zelfs naar een koffiezetapparaat, zelfs naar een koffiemolen, zelfs naar een computer, zelfs naar een mobiele telefoon. Aan de ene kant is dit goed, dat wil zeggen, je hebt net een implementatie van een virtuele machine geschreven, en dan draai je overal je Java-programma's. Maar aan de andere kant is het erg dat dezelfde telefoon op dat moment weinig geheugen had, er waren lage prestaties en dit alles begon bovendien saai en langzamer te worden.

Maar zelfs dit is niet de belangrijkste reden waarom de taal in het algemeen is uitgevonden. De Java-taal is uitgevonden om de vereisten voor de kwalificaties van programmeurs te verminderen. Dat wil zeggen, armere programmeurs zouden kunnen schrijven goede programma's in Java omdat het je niet toestaat om slechte programma's te schrijven - er is geen manier om slechte programma's te schrijven. Daar kun je alleen maar goede programma's schrijven. Welnu, in het begrip van de makers van de taal.

Dat wil zeggen, als we in C, in C ++, in Python, op wat dan ook, een soort griezelig afval uit ons project kunnen oplossen, waar we alles door elkaar hebben gehaald, urenlang verzameld en daar nog iets anders. In Java kun je de prullenbak ook oplossen, maar hiervoor moet je al wat moeite doen. Dat wil zeggen dat het standaard geen "prullenbak" blijkt te zijn, andere problemen doen zich voor, dat iets daar is geërfd of geërfd - in het algemeen zijn er voor één zinvolle regel tien niet erg zinvolle regels. Aan de andere kant kan zo'n gemiddeld geschoolde programmeur misschien een redelijk hoogwaardige code schrijven.
We zijn bijna aan het einde. Bij ons is het volgende dat is verschenen .Net (zal bereiken), nou ja, en in het bijzonder zijn we geïnteresseerd in C # (bijna hetzelfde [de docent wijst op Java], dat wil zeggen, er zijn verschillen in details, als u kiest tussen hen - kijk waar u meer geld betaalt).

En nog een ding is JavaScript. Heeft niets te maken met de Java-taal, verscheen in hetzelfde jaar - het woord was in de mode, ze gaven een licentie handelsmerk gebruiken.

Wat is het belangrijkste om op te letten? (De docent tekent pijlen van C++ naar Java, .Net, C#, JavaScript en PHP). Om een ​​eenvoudig programma te schrijven in een van deze talen, en in vele andere - als je C ++ kent, hoef je over het algemeen niets anders te weten - je neemt en schrijft in C ++, en voegt dan dollars toe aan het begin , iets anders doe de kleine dingen en het begint voor jou op alles te werken (de docent wijst naar de talen waaraan de pijlen uit C++ waren toegewezen). Dat wil zeggen, ze lijken in sommige opzichten erg op elkaar simpele dingen... Als je een aantal schoolproblemen, educatieve taken of iets anders oplost (niet ontwerpen) groot project- je hebt één bestand dat getallen leest, getallen weergeeft in de console, iets anders doet), dan is er bijna geen verschil tussen deze talen. Het is duidelijk dat JavaScript en PHP gespecialiseerd zijn, ze hebben alles een beetje anders. En hier (de docent wijst op Java en C#) is er over het algemeen weinig verschil.

Sindsdien zijn er allerlei andere interessante dingen verschenen, maar het is niet duidelijk of ze met succes zullen leven of sterven. Wat gebruiken ze nu, voor welke taken?

Taalkeuze afhankelijk van de taak

Stel dat u voor de taak staat om een ​​stuurprogramma voor een videokaart te schrijven. Welke taal ga jij vandaag gebruiken? (Schreeuw van het publiek: Java!) Waarom ... Java is geweldig, maar waarom niet Ruby of PHP? (De docent spreekt sarcastisch.)

Programmeren op laag niveau

Als je iets op een laag niveau schrijft, dan de beste keuze- dit is C, maar eigenlijk heb ik iets gehoord (maar niet gezien) dat C++ hiervoor wordt gebruikt. Maar ik geloof hier nauwelijks in, omdat je in C duidelijk kunt controleren - aangezien je zoveel bytes geheugen hebt gegeven, zal dat zo zijn. En in C ++ (STL), hoe wordt een string geïmplementeerd? Nou ja, op de een of andere manier geïmplementeerd. En uiteindelijk weten we niet hoe en wat daar gebeurt, misschien hebben we onvoldoende geheugen op onze videokaart of gebeurt er iets anders. Daarom leeft C nog steeds en sterft niet, dergelijke systeemprogrammeertaken bestaan ​​​​nog steeds - schrijf een besturingssysteem, schrijf stuurprogramma's, schrijf iets anders - C is hier geweldig voor. Daarnaast zijn er nu allerlei apparaten (het internet der dingen belooft dat het eraan komt) die op batterijen leven (en dat zullen er natuurlijk miljoenen zijn, alles zal met dit internet der dingen worden opgehangen) , ze moeten erg goedkoop zijn en heel weinig elektriciteit verbruiken. Dienovereenkomstig zal er 2 KB geheugen zijn, een 5 kHz-processor, nou ja, wat moet je er natuurlijk in schroeven? virtuele machine of scripttaal in de nabije toekomst zal het niet werken - het betekent dat je iets in C moet schrijven. En zelfs nu, bijvoorbeeld, berekeningen op een videokaart (OpenCL of een andere technologie) - ze bedenken geen nieuwe taal om programma's voor hen te schrijven - doen ze daar C met enkele grote beperkingen. Waarom iets nieuws leren, alleen omdat mensen het al weten? Formeel is dit waarschijnlijk ook, in zekere zin, C.

webprogrammeren

Stel dat u een nieuwe Facebook wilt schrijven ( sociaal netwerk). Waar ga je dit op schrijven? (Vanuit het publiek hebben ze het over HTML en CSS.) HTML, CSS is design, en we willen foto's kunnen toevoegen, vrienden kunnen toevoegen, opmerkingen kunnen achterlaten.

Voor het scriptgedeelte - dat wil zeggen, wat er aan de clientzijde gaat gebeuren - is het JavaScript. En soms wordt JavaScript in een andere taal gegenereerd en verzonden (het gebeurt zo dat het script wordt gegenereerd ... omdat het soms gemakkelijker is om op deze manier enkele wijzigingen in de logica aan te pakken).

Verrassend genoeg is het geschreven in PHP - en Facebook en vele andere grote projecten. Natuurlijk moest ik sommige van mijn eigen dingen schrijven zodat het nog steeds goed werkte, en niet zoals de "tyap-blooper" was gedaan, maar ze deden het. In principe maakt het niet echt uit wat je schrijft, maar ik raad Perl niet aan. Hier en nu schrijft natuurlijk niemand iets voor het web. Iedereen schrijft een soort raamwerk of zoiets. Online winkelen? We hebben een raamwerk voor een online winkel gedownload - nou ja, dat was het, we schreven een online winkel.

Zakelijke programmering

Vervolgens wil je een saaie bankapplicatie schrijven. Of heeft u bijvoorbeeld iemand die simkaarten verkoopt? Misschien heb je ooit een telefoon of iets anders gekocht en zeiden ze tegen je: "Het systeem hangt, we kunnen niets doen." Waar ga je zo'n aanvraag op schrijven? (Een kreet uit het publiek over Python) Zoiets kun je niet schrijven in Python, wat ben je?! Het is niet de moeite waard om iets voor zaken in Python te schrijven. Waarom? Want als je iets in Python schrijft, kun je tijdens het schrijven geen significant aantal bugs vinden. Python wordt op alle mogelijke manieren dynamisch getypt, en in het algemeen kun je daar een bug verbergen zodat deze opduikt in een dergelijke situatie dat je niet eens kunt begrijpen wat deze frauduleuze gebruikers daar hebben gedaan, dat alles voor je kapot is. Dat wil zeggen, het is beter om kleine scripts voor jezelf te schrijven in Python - je begrijpt wat daar gebeurt en wat er wordt gedaan. Nou ja, of iets dat niet jammer is om weg te gooien: je wilt iets eerder uitrollen dan je concurrenten, dus wat als het om de andere keer kapot gaat. Je schreef in Python en dat was het - je nam de markt over. En als je iets voor een lange tijd schrijft, bijvoorbeeld een soort banktoepassing (zodat het leningen goedkeurt, iets anders), dan schrijf je het in Java. Omdat er een serieuze zaak is, stukjes papier, geld, documenten, iets anders, maar je kunt er niet zoveel in verpesten dat alles kapot gaat, anders worden mensen beledigd - hun geld is weg en heeft nergens meer bereikt, de moment dat de tekenreeks in een getal veranderde of omgekeerd. Het betekent dus dat je methodisch Java gebruikt en schrijft, schrijft ... Nou ja, of op.Net, dergelijke situaties komen in principe ook voor. Daar kun je natuurlijk ook in de problemen komen, maar toch is de kans hierop wat kleiner.

Programmeren voor het leger, ruimtevaart

Stel je nu voor dat ze besloten je in een raket naar de maan te sturen. Wat zou je liever gebruiken om de code te schrijven die de raketmotoren bestuurt? Laten we zien. Dit is waarschijnlijk (de docent laat zien in Perl, Python, PHP, Ruby) het niet waard - het vertraagt, er gebeurt iets anders, nou ja, in het algemeen zou ik het niet eens zijn om op zo'n raket te vliegen. In C++? Eerlijk gezegd zou ik mij ook niet vertrouwen, want er zijn te veel manieren om zelfmoord te plegen in C++. Als je ergens in de ruimte bent, is het niet erg goed.

Op Java misschien? Het lijkt erop dat alles daar redelijk betrouwbaar is en de architectuur goed is, geen wildtypes, geen overtollig geheugen. Laten we zeggen dat het meest cruciale moment is aangebroken en dat onze Java besloot afval voor ons op te halen. We moeten landen, vertragen, en ze zegt: "Nee, er is afval aan de gang." Over het algemeen ook niet erg goed.

Eerlijk gezegd zou ik dit programma liever in Pascal laten schrijven. Ik hou natuurlijk niet echt van Pascal, maar op de een of andere manier zou het in zulke zaken heel cool zijn.

Meerdere talen tegelijk gebruiken voor softwareontwikkeling

Welnu, wat moet er in het algemeen gezegd worden over moderne talen. Tegenwoordig leven veel projecten niet in één taal, dat wil zeggen, sommige leven in de ene taal, andere in een andere en andere in een derde. Als u bijvoorbeeld een soort webtoepassing hebt die enorme hoeveelheden informatie verwerkt, is de toegang tot schijven (zelfs niet tot databases, ze zijn zo groot dat zelfs een database een reeds geschreven versie niet ondersteunt) waarschijnlijk in een of andere dan lage -niveau C om enorm snel naar schijf te schrijven en zo. Natuurlijk is het niet de moeite waard om het hele project in C te schrijven. Misschien is er een soort van tussenliggende logica geschreven in Java die Cis-functies aanroept voor snelle oproepen. Welnu, de frontend (waar de gebruiker naar kijkt) is natuurlijk al ergens in geschreven, in sommige scripts, in iets dat direct door de browser wordt uitgevoerd (JavaScript). En dit alles leeft samen en interageert succesvol.

Wat doen mensen soms bij de ontwikkeling van sommige applicaties, zelfs grote? Ze nemen en schrijven een prototype in Python (hoe alles zal werken), schetsen, denken over een soort architectuur na. Erop schrijven is echt heel snel - ze gooiden een prototype in, experimenteerden ermee en zeiden: "Wo! Dat is zo cool! " En helemaal herschreven. Het lijkt erop dat ze het werk twee keer hebben gedaan, het duurde twee keer zo lang (nou ja, anderhalf). Maar nee! Het blijkt vaak dat deze methode niet slecht is, want als je meteen ergens in schrijft, bijvoorbeeld in Java, en dan besluit: "Nee, laten we refactoren, de architectuur volledig veranderen en zo," - dan zul je besteden 10 keer meer tijd... Zulke dingen bestaan ​​en leven ook.

Voorwaarden voor het succes van elke programmeertaal

Laten we het nu hebben over waarom sommige mooie talen het niet hebben overleefd of in een zeer beperkte ruimte leefden. Toen Wirth zag wat de slechte bedrijven Apple, Borland en alles wat met zijn Pascal deden, bedacht hij een nog betere taal - Oberon. Het was gewoon enorm minimalistisch - dat wil zeggen, er waren heel weinig commando's (Strings? Waarom hebben we strings nodig? We zullen een reeks karakters maken!). Wel, iets werkte niet voor hem, voor zover het kon.

Nog een ding. Het Amerikaanse leger vroeg hen ook een coole taal te ontwikkelen, waarin alles werkt en alles kan worden geschreven. Het resultaat is een nogal monsterlijke taal genaamd Ada, waarin ze echter nog steeds iets schrijven, maar nogmaals - alleen voor het leger.

Wat is het probleem? Waarom hebben sommige talen zoals Python, die in het begin geen enkel bedrijf ondersteunde, de markt overgenomen. PHP, dat ook slecht is ontworpen, nam ook zelf de markt over en veroverde (het meeste ervan). En er werden allerlei miljarden dollars geïnvesteerd (de docent wijst op Ada) en gingen nergens heen, er gebeurde niets. Wat is hiervan de reden? Dit is te wijten aan het feit dat er geen infrastructuur rond deze talen is. Dat wil zeggen, de taal kan uitstekend zijn, maar zolang er geen documentatie is, zolang er geen gemeenschap is die vragen kan beantwoorden (op Stack Overflow) en, ten slotte, het allerbelangrijkste, zolang er niet een groot aantal is van bibliotheken, schiet de taal niet. Dat wil zeggen, u wilde bijvoorbeeld een website over Oberon schrijven. Waarom niet? En de verwarring begint ... U kunt uw webserver niet op Oberon verhogen om licht te testen, u kunt geen bibliotheken verbinden, omdat ze niet op Oberon staan. En dit alles wordt gedaan door middel van een soort krukken, de krachten verdwijnen, en in het algemeen spuug je en schrijf je je site in pure C in plaats van Oberon. En die talen die bibliotheken uit andere talen kunnen gebruiken, leven goed. Dezelfde Python op die plekken waar het langzamer gaat. Nou, in het algemeen zijn allerlei standaard dingen zoals sorteren en iets anders geschreven in C, en hij (Python) weet hoe hij ermee moet omgaan.

Java heeft ook een Java Native Interface. Dit is in wezen C, dat wil zeggen, daar (naar mijn mening willen ze de hele tijd verbieden, maar het lijkt erop dat ze nog niet hebben verboden) deze talen kunnen communiceren met reeds bestaande bibliotheken (voornamelijk Sishny-bibliotheken). En hierdoor nemen en werken ze. Het idee dat ik je probeer over te brengen is duidelijk, toch? Schrijf niet in talen die niet weten hoe ze verbinding moeten maken met de C-bibliotheek. Nou, als je van iets cools wilt genieten. Welnu, en geleidelijk aan worden ze (talen) overwoekerd met hun eigen soort infrastructuur. En ze leven op de een of andere manier goed.

Programmeertaal en loopbaanbegeleiding

Laten we het nu hebben over hoe je kunt begrijpen wat je wilt in het leven. Wat zijn toffe dingen? Je kunt iets doen systeemprogrammering, Ja? Het is cool om deze fietsen daar te tellen, je wilt quadcopters lanceren, wat camera's en iets anders om te doen. Dan is C waarschijnlijk jouw keuze.

Als je wilt schrijven, misschien niet de meest interessante applicaties in het leven, maar het is cool voor jou om ze te ontwerpen, erover na te denken en veel geld te verdienen door de meeste tijd te zitten en te vervelen (je moet hiervoor betalen als je bent van hoge kwaliteit juffrouw), hier zijn ze - Java, .Net. Je gaat werken bij een bank, schrijft, gaat om negen uur werken in een wit overhemd, krijgt een goed salaris en schrijft volgens de aanbevelingen van de beste Java-bronnen, .Net-schapen en zo...

Als je applicaties, een browser, wat speelgoed, iets anders wilt schrijven, dan is C ++ geweldig. Als je websites wilt schrijven, hier zijn ze, de talen van je keuze (de docent laat zien in Perl, Python, PHP, Ruby), er is niet veel verschil. Het enige is dat PHP eerder sterft dan Python, dus als je lui bent om nieuwe dingen te leren, leer dan Python. Groot verschil je merkt er niets van, maar je gaat wel langer mee.

Wat er met Ruby aan de hand is, is ook onduidelijk. Nou, je kunt ook PHP, als je het al hebt geleerd, omdat ze zo eenvoudig zijn dat het niet zo lang duurt om daar opnieuw te leren.

En ten slotte is er nog een ander toepassingsgebied van programmeertalen - dit is wanneer een niet-programmeur ze gebruikt. Laten we zeggen dat je een wiskundige, natuurkundige, scheikundige, analist, wie dan ook bent, en dat je snel iets moet berekenen, wat gegevens moet analyseren (voor biologen bijvoorbeeld hoeveel poolvossen er op de Commander-eilanden leven). Je kunt dit alles in Excel in een tabel omzetten of ergens mee analyseren. Python is hier ook geschikt voor, het weet hoe het met tekst moet werken en bibliotheken zitten vol met allerlei soorten, statistische en zo. Als je een soort Machine Learning wilt doen, wat data wilt verwerken, voorspellen, dan gaat dit nu ook het snelst in Python. Er moet echter worden opgemerkt dat de taken zeer verschillend zijn. Als u bijvoorbeeld direct op de beurs wilt handelen in omstandigheden waarin koersen voortdurend veranderen, dan hebben mensen die het in iets snellers hebben geschreven, de tijd om alles eerder te kopen, hoe cool Machine Learning u ook schrijft in Python. terwijl je wordt geteld, zelfs als hun algoritmen slechter zijn. Daarom vereisen zelfs deze machine learning-taken (sommige) hoge prestaties (en extreem hoge), en dienovereenkomstig andere talen.

De enige manier om te weten wat je wilt, is door alles te proberen. Nu zal ik het zeggen als een van de visioenen van hoe je alles kunt proberen. Hoe word je een programmeur, en een gelukkige? Dus. MET schone lei beginnen. Hier studeer je op school je wiskunde, Russische taal en andere verplichte en keuzevakken, en je kennis op het gebied van programmeren wordt weergegeven op het bord (de docent wijst naar een leeg bord) op dit moment... En je wilt een gelukkig mens worden, doen waar je van houdt, veel geld verdienen en jezelf niets ontzeggen en gelukkig zijn.

Een manier om dit te doen. Er zijn natuurlijk allerlei inspirerende verhalen over mensen die helemaal niet naar de universiteit gingen, of ze verlieten en miljardairs werden, bedrijfseigenaren, enzovoort. Maar het moet worden opgemerkt dat de meeste mensen die misschien geen miljardair zijn geworden, maar ook goed leven, op een gegeven moment toch zijn afgestudeerd aan de universiteit.

Wat is onze situatie met toelating tot de universiteit (nu studeer je op school)? Terwijl je op school zit, moet je begrijpen dat de volgende stap is om je in te schrijven en ervoor te zorgen. Slaag voor het examen of win de Olympiade. Op het examen kun je Pascal, C ++ (inclusief pure C), Python gebruiken (ik zal ze niet verder noemen). Op de Olympiade - dezelfde Pascal, dezelfde C ++, dezelfde Python (we zullen nu over zijn problemen praten) en meestal is er Java. Afhankelijk van de Olympiade kan er nog van alles gebeuren, maar niet de essentie.

Hoe ziet de grafiek van de verdeling van talen eruit op de All-Russian Olympiade in Informatics? Mensen die deelnemen aan de All-Russian, de coolste Olympiade, waar schrijven ze op? Het ziet er zo uit (hier betekent het Pascal, en hier is het ongeveer 2000, en hier is het ongeveer nul, hier is C ++, en hier is het 2015).

In 2000 schreef bijna niemand in C++. Vijftien jaar later schrijft bijna niemand in Pascal, ondanks dat Pascal modern is. Dit is een taal die bijna alles hetzelfde kan. Alleen is iedereen te lui geworden om dit te leren, elke nieuwe trend, en iedereen blijft schrijven in Borland Pascal, wat natuurlijk niets kan. In C ++ schrijven mensen een aantal sorteeralgoritmen (STL) - geweldig, ze schreven sort () en dat is alles. Op Pascal, op normaal, op oud - dit is een probleem. Ze schreven een set (nodig) - geweldig, ze schreven het in C ++, in Pascal is de kwelling weer continu. Op de nieuwe Pascals kan dat natuurlijk wel, maar die kosten eigenlijk geld. Het is je misschien niet opgevallen, maar het is wel zo.

Er is ook Java, maar Java heeft veel letters. Het is voor grote projecten, maar voor kleine wegwerpprogramma's blijkt het best wel mee te vallen, want er staan ​​veel onnodige letters in. Maar ook sommige mensen schrijven, je kunt er op leren schrijven. Maar op het Unified State Exam is dat niet het geval en zal het Unified State Exam nog grotendeels gehaald moeten worden.

Wat is het beste voor het examen? Voor het examen kun je het beste (als je niets weet en ze leren je niets op school) Python leren. Sommige taken van het examen zijn er perfect op opgelost. Op de Olympiade blijkt in het algemeen dat C++ wordt (gebruikt), omdat Python erg traag is, daar wordt niet alles opgelost.

Je hebt dus een kleine subset van de taal en enkele algoritmen (mogelijk) bestudeerd en veel problemen opgelost om een ​​diploma van je Olympiade te behalen en naar de universiteit te gaan om hoger onderwijs te volgen.

Nu zal ik je vertellen over hoe we bij HSE de cursus bouwen, in welke volgorde de talen gaan, hoe ze worden bestudeerd in toegepaste wiskunde en informatica van de faculteit Technische Natuurwetenschappen, wat we doen met Yandex. In het eerste semester - Python (niet volledig, over hoe je op school moet leren) en C++ (breder, veel breder dan het gewoonlijk op scholen wordt onderwezen). Laat me het je meteen vertellen, zodat je niet bang wordt, als je plotseling naar binnen wilt, zeg: “Waarom, ik weet dit allemaal al, waarom ga ik ergens studeren? Ik ga liever ergens anders heen." Voor degenen die al goed kunnen programmeren, is er een mogelijkheid om direct naar de studie van algoritmen te gaan, en in een vrij theoretische training. We kijken er nu niet naar, dit (wijst naar het bord) is voor degenen die medium of helemaal niet programmeren.

In het eerste semester bestuderen ze de basis van Python, zodat mensen leren programmeren en niemand zich bijzonder beledigd voelt. Python wordt zelden op scholen onderwezen, meestal komen mensen met kennis van Pascal of C++. Eigenlijk zelfs Pascal, als het een massaschool is. Nou, zodat niemand beledigd was, leert iedereen een nieuwe taal (alsof ze op gelijke voet staan). En C++ simpelweg omdat je dan overal vanuit C++ heen kunt.

Dan komt de cursus "Algoritmen" en een apart cursusproject. Klassieke algoritmen met implementatie. Niet dat we in theorie iets hebben genomen, de complexiteit hebben berekend. Bij de lezing namen we het, berekenden de complexiteit, op het seminar - namen het, implementeerden het algoritme. Een project gaat over leerlingen die iets afmaken. Een van de projecten was bijvoorbeeld: tellen ... Laten we zeggen dat je veel appartementen in Moskou hebt en je begrijpt: “Oh, ik heb veel onnodige dingen, ik zal er een paar huren. En ze bepalen een prijs, en niemand wil een appartement van je huren - waarschijnlijk te duur. Of ze trokken een prijs op, ze deden het meteen weer af en je denkt: "Oh, ik heb het waarschijnlijk goedkoop uitgedeeld", en jij raakt ook van streek. Dat wil zeggen, het was nodig om te berekenen hoeveel het kostte om een ​​appartement te huren? U rijdt gegevens binnen - het maakt een schatting voor u. Zo'n site, die uit verschillende dingen bestond: suggesties aannemen, ontleden, een soort machine learning-algoritme toepassen (waarschijnlijk) pretentieloos en een mooi webgezicht maken waarin je iets kunt kiezen, iets naar binnen kunt rijden, enkele meters, een willekeurig aantal kamers , het aantal sauna's, het aantal jacuzzi's in uw appartement en een ruwe schatting van de kosten. Dat wil zeggen, een soort van voltooid, niet erg ingewikkeld ding. Hier betekent het (de docent wijst op de cursus over algoritmen) zo'n krachtige C++, met console I/O. Welnu, hier (de docent wijst op het opschrift "project") is iets onder begeleiding van een mentor, mogelijk met databases, misschien met het ontleden van teksten en met iets anders.
Dan komt het derde semester - een cursus genaamd "Computersystemen". Er is nogal wat assembler om (heel weinig) te begrijpen en dan, iets dat lijkt op pure C en interactie met besturingssystemen, systeemprogrammering in wezen. En een project voor een seminar is ook iets over het onderwerp van alle netwerkinteracties, vrij laag niveau: ontwikkel een hulpprogramma, bijvoorbeeld rsync (synchronisatie, misschien weet je dat. In pure C, min of meer, schrijf een analoog van rsync, die u zult hebben via de netwerksynchronisatiemappen met alle bestandstoegangen, enzovoort).

En tot slot de vierde. Ik weet niet eens hoe ik het moet noemen, dit is zo'n vinaigrette van technologieën die nodig zijn voor echte ontwikkeling, bijvoorbeeld voor webontwikkeling. Dat is dit praktisch gebruik databases, weer iets dat lijkt op wat er in het project is gedaan (de docent verwijst naar het 2e cursusproject) maar meer diepgaand. Dat wil zeggen, zulke min of meer concrete dingen zijn al praktisch programmeren. Parallel hieraan is er een theorie, nou, hier zijn ze ook bezig met wetenschap.

En na twee cursussen verspreiden mensen zich om te doen waar ze in geïnteresseerd zijn, omdat dit ding vrij breed dergelijke basisprincipes van programmeren omvat en mensen op dit moment al begrijpen dat ze dat niet willen doen computersystemen in geen geval (ze hielden bijvoorbeeld niet van systeemprogrammering), maar ze willen omgaan met enkele theoretische algoritmen, de moeilijkheid van rekenen, nieuwe dingen bedenken, gedistribueerd of iets anders. Of, integendeel, ze denken dat ze hier niet veel hebben ( docent wijst naar de eerste cursusregel met Python en C ++) ga dan ( docent wijst naar een derde cursusregel, met systeemprogrammering) - als je niet wilt, tel bytes en stel allerlei beperkingen in op lezen-schrijven, streams, threads en iets anders doen. En in overeenstemming hiermee kiezen mensen een richting en leren ze. Dat is in principe zo dat je geen "eendjesyndroom" ontwikkelt - je zag eerst je Pascal en zegt nu "Pascal is macht"; of meer geavanceerd - je zag C ++ en begon over iedereen te zeggen dat C ++ krachtig is en dat al het andere niet erg goed is.

Hier moeten we dit (de docent wijst naar de lijst met cursussen op het bord) breder bekijken - dit is een van de methoden die met name op HSE is gekozen (deze is onlangs verschenen, dus vrij modern). Er zijn andere manieren om elkaar te leren kennen. Bij andere goede universiteiten worden in een iets andere volgorde en andere accenten gelegd. Maar ze proberen mensen ook vertrouwd te maken met alles wat ze hebben.

Hoe een programmeur een baan zoekt

Jij bent dit ( de docent wijst naar de lijst met vakken) deed alles, studeerde aan de universiteit, studeerde nog twee jaar iets productiever en je moet aan het werk. Hoe kies je iets om mee te werken? Eerst leerde je alles kennen, ging ergens diep en weet al waar je van houdt. Je moet natuurlijk kiezen waar je van houdt. Want als je liefhebt, investeer je energie, heb je motivatie en over het algemeen komt alles goed. Want het gaat niet alleen om geld, het gaat erom het voor jou interessant en prettig te maken. Nou, en je wilt in een cool bedrijf komen, zoek een baan. Wat voor persoon zou ik persoonlijk graag zien? Er komen bijvoorbeeld honderd studenten naar me toe - ik moet er twee of één meenemen naar mijn werk. Waarom komen ze, ik begrijp helemaal niet wie ze zijn, wat zijn ze, hoe gaat het? V beste geval ze zullen me het diploma laten zien dat ze aan de universiteit hebben behaald, en ik zal zeggen: “Wo! Dit is een tof diploma, maar zo tof is het niet!” En trouwens, ik kan het mis hebben. Misschien had de persoon veel vrije tijd en leerde hij veel beter.

Wat zou geweldig zijn? Eerst een open source-project dat je van begin tot eind hebt geschreven. Het is wenselijk, als ik een soort van infrastructuur doe zodat de gegevens snel kunnen worden gelezen, of iets anders, dan zou ik natuurlijk geïnteresseerd zijn om iets open source naar mij te laten schrijven. Geen website gemaakt, maar iets over het onderwerp. Waarom ben ik hierin geïnteresseerd? Ik kan naar je code kijken, ik kan zien hoe vaak je hebt gecommitteerd, ik kan zien hoe je reageerde op bugs van gebruikers, bugs van ontwikkelaars die het gebruiken - alles staat opgeschreven, ik kijk naar alles en denk: "Wauw, deze bug is hier al twee jaar niet meer. gesloten, hier heb je de gebruiker onbeleefd geantwoord, dan neem ik niet iets anders ". Dat wil zeggen, dit is uw persoonlijke project.

Wat zou er dan nog meer cool zijn? Ik zou graag willen zien hoe je het teamwerk hebt gedaan. Dat wil zeggen, je komt naar mij voor een gesprek en zegt: “De jongens van de universiteit en ik hebben een goede aanvraag gedaan. Ik was daar een database aan het maken, ze maakten daar een soort mobiele applicatie, en we hadden ook een man die daar werkte, een meisje-ontwerper, een jongen van technische ondersteuning. We waren met z'n vijven en we hebben een geweldig project gedaan." Nou, ik zie wat echt jouw project is, ik zeg: "Wat is het jouwe?" Ik kijk nog eens naar de code en begrijp dat je weet hoe je in een team met mensen moet werken.

Een programmeur is niet degene die alleen (zo'n indie) in de garage zit, ergens met het licht uit, met niemand praat, een baard krijgt en schrijft. Toch is er een soort interactie met mensen. Met een baas bijvoorbeeld die wel eens tegen je mag schelden (bazen, ze zijn zo, niet altijd even aardig). En ik zie dat je weet hoe je met mensen moet werken en het maakt me blij als je een goed team hebt. Zelfs als het niet goed is, is het beter dan het niet te hebben.

Wat zou ik persoonlijk nog meer willen? Als je jezelf liet zien in grote projecten. We hebben bijvoorbeeld iets vastgelegd in de Linux-kernel, als je systeemprogrammering doet, hebben we een bug opgelost. Dat wil zeggen, ze hebben laten zien dat je de code van iemand anders kunt lezen en er enkele wijzigingen in kunt aanbrengen. Ik kijk: "Oh, inderdaad, je hebt iets ingewikkelds bedacht en een paar bugs opgelost!" En ik begin er heel blij mee te worden. Omdat ik... nou ja, ik weet het niet... mijn programmeur is gestopt omdat concurrenten hem een ​​hoger salaris boden, en ik moet dringend iemand de mond snoeren - jij. Ik zie eruit alsof je pas helemaal opnieuw hebt geschreven, maar je weet niet hoe je de code van iemand anders moet lezen en bewerken, en ik raak van streek.

En tot slot zijn er, afhankelijk van de specifieke functie, nog diverse andere zaken. Als u een baananalist bent, zou ik graag willen dat u gegevensanalysetaken op Kaggle oplost. Als je algoritmische dingen doet, wil ik dat je dat doet sportprogrammering we hebben wat algoritmen gedaan. En tot slot, als je over het vak hebt nagedacht, gelezen hoe de sollicitatiegesprekken worden gevoerd, heb je ondervonden dat sommige mensen daar grote onvrede uiten: “Ik ben gekomen en ze vragen wat mijn hobby is. Ik zit als een uil en antwoord niet, want ik heb geen hobby', en ze denken dat HR's dit doen. In feite proberen ze erachter te komen hoe vriendelijk en gepast je bent. Als je onvriendelijk en onbekwaam bent, dan zal het voor het team moeilijk zijn om met je samen te werken, hoe geniaal en workaholic je ook bent, een taaie specialist met veel kennis, en je zult het project niet alleen voor elkaar krijgen. Bovendien, zelfs als je je uitrekt, kun je je voorstellen wat een belasting voor het bedrijf. En dat je morgen komt en zegt: "Verhoog mijn salaris 10 keer, anders ga ik weg." Het is begrijpelijk dat bedrijven niet in deze situatie willen belanden. Daarom is het opvoeden van adequaatheid en goede wil in jezelf net zo belangrijk (minstens) als de ontwikkeling van een soort professionele vaardigheden.

Om samen te vatten, wat kun je zeggen? Welke talen zijn goed en welke slecht? Welnu, binnen een groep talen, bijvoorbeeld tussen Ruby, Python en PHP, welke te kiezen? Het juiste antwoord is natuurlijk Python, maar in feite zit het verschil tussen hen in het aantal toegestane bugs, in de hoeveelheid van iets anders - 5%, nou ja, misschien 10%. Dat wil zeggen, als je al hebt voltooid project is geschreven in PHP, dan zal niemand bij zijn volle verstand zeggen: "Laten we alles herschrijven in Python." Ze zullen zeggen: "Laten we meer PHP-ontwikkelaars inhuren en in PHP blijven schrijven." Prima, dat is geen slechte keuze. Het is duidelijk dat als je ineens een project gaat schrijven, het misschien verstandig is om nu voor Python te kiezen. Hoewel, het hangt er ook van af. Misschien heb je een stel goedkope PHP-ontwikkelaars op de markt, maar Python-ontwikkelaars zijn duur, en je denkt: "Ja, de technologie is cooler, maar ik zal geld besparen op kant-en-klare ontwikkelaars." En dat is alles, geweldig, je komt er al werken.
Hoe kies ik tussen Java en C++? Ja, hetzelfde gebeurt. Ik denk dat tegen de tijd dat je beslist in welke taal je aan een nieuw groot project begint, je kennis op je vakgebied zult opdoen en de juiste keuze zult kunnen maken. Op dit moment hoef je die keuze nog niet te maken en daarom raad ik je aan te doen wat je leuk vindt.

Basisprincipes, zoals ik al zei, de zeer, zeer basisprincipes van programmeren (wat is een functie, wat zijn als's, for's, arrays, iets anders) kunnen min of meer in elke taal worden geleerd. Bijvoorbeeld in C ++, omdat het op veel dingen lijkt, en de details erin (op dit niveau) het minst zijn, en de letters het minste om onnodig te schrijven. Welnu, als je een aantal complexe architectonische dingen leert, leer dan hier te veel over en maak je er te veel zorgen over. Dat wil zeggen, het belangrijkste is - probeer, zoek naar wat je leuk vindt, en wanneer je je realiseert dat het al 4 uur 's morgens is, en je zit voor de lol en schrijft omdat je het leuk vindt - het is waarschijnlijk op dit moment dat je je...

Door programmeur William W. Wold

De afgelopen zes maanden heb ik gewerkt aan de creatie van een programmeertaal (PL) genaamd Pinecone. Ik zou het niet compleet durven noemen, maar je kunt het al gebruiken - het bevat hiervoor genoeg elementen, zoals variabelen, functies en door de gebruiker gedefinieerde datastructuren. Als je er vertrouwd mee wilt raken voordat je het leest, raad ik je aan de officiële pagina en repository op GitHub te bezoeken.

Invoering

Ik ben geen deskundige. Toen ik aan dit project begon te werken, had ik geen idee wat ik aan het doen was en heb ik nog steeds geen idee. Ik heb nooit doelbewust de principes van het creëren van een taal bestudeerd - ik las alleen wat materiaal op het web en zelfs daarin vond ik bijna niets nuttigs voor mezelf.

Ik heb echter een geheel nieuwe taal geschreven. En het werkt. Ik denk dat ik iets goed doe.

In dit artikel zal ik proberen je te laten zien hoe Pinecone (en andere programmeertalen) broncode omzetten in wat velen als magie beschouwen. Ik zal ook aandacht besteden aan situaties waarin ik compromissen moest zoeken en uitleggen waarom ik de beslissingen heb genomen die ik heb genomen.

De tekst beweert niet echt een complete gids te zijn voor het maken van een programmeertaal, maar voor nieuwsgierigen zal het een goed startpunt zijn.

De eerste stappen

"Waar te beginnen?" is een vraag die andere ontwikkelaars vaak stellen als ze erachter komen dat ik mijn eigen taal schrijf. In dit deel zal ik proberen om het in detail te beantwoorden.

Samengesteld of geïnterpreteerd?

De compiler analyseert het hele programma, verandert het in machinecode en slaat het op voor latere uitvoering. De interpreter ontleedt en voert het programma regel voor regel in realtime uit.

Technisch gezien kan elke taal zowel worden gecompileerd als geïnterpreteerd. Maar voor elke taal is de ene methode geschikter dan de andere, en de keuze van het paradigma in de vroege stadia bepaalt het verdere ontwerp. In algemene zin is interpretatie flexibel, en compilatie biedt hoge productiviteit, maar dit is slechts het topje van een uiterst complex onderwerp.

Ik wilde een eenvoudige maar performante taal maken, die er niet veel zijn, dus besloot ik vanaf het begin om Pinecone compileerbaar te maken. Desalniettemin heeft Pinecone ook een tolk - aanvankelijk was de lancering alleen mogelijk met zijn hulp, later zal ik uitleggen waarom.

Ca. vert. Trouwens, we hebben Korte beoordeling is een geweldige oefening voor iedereen die Python leert.

Taal selectie

Een soort metastap: een programmeertaal is zelf een programma dat in een of andere taal moet worden geschreven. Ik koos voor C ++ vanwege de prestaties, grote set functionaliteit en gewoon omdat ik hem leuk vind.

Maar over het algemeen kan het advies als volgt worden gegeven:

  • geïnterpreteerd PL sterk aanbevolenschrijven op gecompileerde taal (C, C ++, Swift). Anders zal het prestatieverlies sneeuwballen zolang de meta-tolk uw tolk interpreteert;
  • gecompileerde programmeertaal kan schrijven op geïnterpreteerde taal (Python, JS). De compilatietijd zal toenemen, maar niet de uitvoeringstijd van het programma.

Architectonisch ontwerp

De structuur van een programmeertaal heeft verschillende fasen, van de broncode tot het uitvoerbare bestand, waarbij de gegevens op een bepaalde manier worden geformatteerd, evenals functies om tussen deze fasen te schakelen. Laten we hier meer in detail over praten.

Lexicale analysator / lexer

De regel met broncode gaat door de lexer en wordt een lijst met tokens.

De eerste stap in de meeste programmeertalen is lexicale analyse. In eenvoudige bewoordingen is het een uitsplitsing van tekst in tokens, dat wil zeggen taaleenheden: variabelen, functienamen (identifiers), operators, getallen. Als we de lexer dus een regel geven met de broncode als invoer, krijgen we een lijst met alle tokens die hij aan de uitvoer bevat.

doet een beroep op broncode zal niet meer gebeuren in de volgende stappen, dus de lexer moet alle informatie teruggeven die hij nodig heeft.

Buigen

Bij het maken van de taal was het eerste wat ik deed een lexer schrijven. Later verkende ik tools die lexicale analyse gemakkelijker konden maken en bugs konden verminderen.

Een van de belangrijkste tools is Flex, een generator voor lexicale analysatoren. Het accepteert een bestand met een beschrijving van de grammatica van de taal als invoer en maakt vervolgens een programma in C, dat op zijn beurt de string ontleedt en het gewenste resultaat oplevert.

Mijn beslissing

Ik besloot de analysator die ik schreef te verlaten. Uiteindelijk zag ik geen speciale voordelen in Flex, en het gebruik ervan zou alleen maar extra afhankelijkheden creëren die het bouwproces bemoeilijken. Bovendien biedt mijn keuze meer flexibiliteit - u kunt bijvoorbeeld een operator aan de taal toevoegen zonder meerdere bestanden te hoeven bewerken.

Parser / Parser

De lijst met tokens gaat door de parser en verandert in een boom.

De volgende stap is de parser. Het zal transformeren brontekst, dat wil zeggen, een lijst met tokens (rekening houdend met haakjes en volgorde van bewerkingen) in een abstracte syntaxisstructuur waarmee u de regels van de taal die wordt gemaakt structureel kunt weergeven. Het proces zelf is eenvoudig te noemen, maar met de toename van het aantal taalconstructies wordt het veel ingewikkelder.

Bizon

In deze stap dacht ik er ook aan om een ​​bibliotheek van derden te gebruiken, waarbij ik Bison in overweging nam om de parser te genereren. Het lijkt veel op Flex - aangepast bestand met syntaxisregels is gestructureerd met behulp van een programma in C. Maar opnieuw gaf ik de automatisering op.

Voordelen van aangepaste programma's

Met de lexer was mijn beslissing om mijn eigen code te schrijven en te gebruiken (ongeveer 200 regels lang) vrij duidelijk: ik ben dol op puzzels, en deze is ook relatief triviaal. Het is een ander verhaal met de parser: nu is de code ervoor 750 regels, en dit is al de derde poging (de eerste twee waren gewoon verschrikkelijk).

Ik besloot echter om de parser zelf te doen. Dit zijn de belangrijkste redenen:

  • het minimaliseren van contextwisseling;
  • vereenvoudiging van de montage;
  • verlangen om de taak zelf aan te pakken.

Ik was overtuigd van de doelmatigheid van de oplossing door de verklaring van Walter Bright (de maker van de D-taal) in een van zijn artikelen:

Ik zou het gebruik van lexicale en parsergenerators of andere zogenaamde "compiler-compilers" niet aanraden. Het schrijven van een lexer en een parser duurt niet lang, en het gebruik van een generator zal je er stevig aan binden in verdere werkzaamheden(wat van belang is bij het overzetten van de compiler naar een nieuw platform). Daarnaast onderscheiden generatoren zich door de uitgifte van irrelevante foutmeldingen.

Abstracte semantische grafiek

Van een syntaxisstructuur naar een semantische grafiek gaan

In dit deel heb ik een structuur geïmplementeerd die inherent het dichtst bij de "tussenvertegenwoordiging" in LLVM ligt. Er is een kleine maar belangrijk verschil: tussen een abstracte syntaxisboom (AST) en een abstracte semantische grafiek (ASG).

ASG versus ASD

Grofweg is een semantische grafiek een syntaxisboom met een context. Dat wil zeggen, het bevat informatie zoals welk type de functie retourneert of waar dezelfde variabele wordt gebruikt. Omdat de grafiek al deze context moet herkennen en onthouden, heeft de code die deze genereert ondersteuning nodig in de vorm van veel verschillende verklarende tabellen.

Rennen

Als de grafiek eenmaal is opgesteld, wordt het starten van het programma een vrij eenvoudige taak. Elk knooppunt bevat de implementatie van een functie die gegevens als invoer ontvangt, doet wat is geprogrammeerd (inclusief: mogelijke uitdaging helperfuncties), en retourneert het resultaat. Dit is de tolk aan het werk.

Compilatie opties

Je vraagt ​​je waarschijnlijk af waar de tolk vandaan kwam als ik Pinecone oorspronkelijk definieerde als een gecompileerde taal. Het punt is dat compilatie veel gecompliceerder is dan interpretatie - ik heb eerder gezegd dat ik bij deze stap een aantal problemen tegenkwam.

Schrijf je eigen compiler

In het begin vond ik deze gedachte leuk - ik hou ervan om dingen zelf te doen, en bovendien wilde ik al heel lang assembler leren. Maar het maken van een cross-platform compiler vanaf het begin is moeilijker dan het schrijven van machinecode voor elk element van de taal. Ik vond dit idee volkomen onpraktisch en de investering niet waard.

PROGRAMMEERTAAL EN ZIJN SOORTEN

Een programmeertaal is een formeel tekensysteem dat is ontworpen om te schrijven computerprogramma's... Een programmeertaal definieert een reeks lexicale, syntactische en semantische regels die het uiterlijk van het programma bepalen en de acties die de uitvoerder (computer) onder zijn controle zal uitvoeren.

Een programmeertaal op hoog niveau is een programmeertaal die is ontworpen voor snelheid en gebruiksgemak door de programmeur. Het belangrijkste kenmerk van talen op hoog niveau is abstractie, dat wil zeggen de introductie van semantische constructies die dergelijke gegevensstructuren en bewerkingen daarop kort beschrijven, waarvan de beschrijvingen in machinecode (of een andere programmeertaal op laag niveau) zeer lang en moeilijk te begrijpen.

Programmeertaal op laag niveau (programmeertaal op laag niveau) - een programmeertaal die dicht in de buurt komt van rechtstreeks programmeren in machinecodes die worden gebruikt door een echte of virtuele (bijvoorbeeld Java, Microsoft .NET) processor. Een geheugensteuntje wordt meestal gebruikt om machine-instructies aan te duiden. Hiermee kunt u opdrachten onthouden, niet in de vorm van een reeks binaire nullen en enen, maar in de vorm van betekenisvolle afkortingen van woorden in de menselijke taal (meestal Engels).

PROGRAMMEERTALEN OP LAAG NIVEAU

De eerste computers moesten in binaire machinecodes programmeren. Op deze manier programmeren is echter een nogal bewerkelijke en complexe taak. Om deze taak te vereenvoudigen, begonnen programmeertalen op laag niveau te verschijnen, waardoor het mogelijk werd om machine-instructies in een meer voor mensen leesbare vorm in te stellen. Om ze naar binair te converteren, speciale programma's- vertalers.

Figuur 1. Een voorbeeld van machinecode en de weergave ervan in assembly

Vertalers zijn onderverdeeld in:

    compilers - zet de programmatekst om in machinecode, die kan worden opgeslagen en vervolgens zonder compiler kan worden gebruikt (een voorbeeld zijn uitvoerbare bestanden met de extensie *.exe);

    interpreters - verander een deel van een programma in machinecode, voer het uit en ga dan verder met het volgende deel. In dit geval wordt de interpreter elke keer dat het programma wordt uitgevoerd, gebruikt.

Een voorbeeld van een taal op laag niveau is assemblage. Talen op laag niveau zijn gericht op een specifiek type processor en houden rekening met de eigenaardigheden ervan, daarom moet het bijna volledig worden herschreven om een ​​assembleertaalprogramma naar een ander hardwareplatform te porteren. Er zijn ook bepaalde verschillen in de syntaxis van programma's voor verschillende compilers. Toegegeven, centrale processors voor computers van AMD en Intel zijn praktisch compatibel en verschillen alleen in enkele specifieke opdrachten. Maar gespecialiseerde processors voor andere apparaten, bijvoorbeeld videokaarten, telefoons, bevatten aanzienlijke verschillen.

Voordelen:

Talen op laag niveau worden gebruikt om efficiënte en compacte programma's te maken, aangezien de ontwikkelaar toegang krijgt tot alle mogelijkheden van de processor.

nadelen

    Een programmeur die met talen op laag niveau werkt, moet hooggekwalificeerd zijn en een goed begrip hebben van het microprocessorsysteem waarvoor het programma wordt gemaakt. Dus als een programma voor een computer is gemaakt, moet u de structuur van de computer kennen en vooral het apparaat en de kenmerken van de processor;

    het resulterende programma kan niet worden overgebracht naar een computer of apparaat met een ander type processor;

    aanzienlijke ontwikkeltijd voor grote en complexe programma's.

Talen op een laag niveau worden in de regel gebruikt voor het schrijven van kleine systeemprogramma's, apparaatstuurprogramma's, modules voor interfaces met niet-standaard apparatuur, het programmeren van gespecialiseerde microprocessors, wanneer de belangrijkste vereisten compactheid, snelheid en de mogelijkheid om rechtstreeks toegang te krijgen tot hardwarebronnen .

Assembler is een taal op laag niveau die vandaag de dag nog steeds veel wordt gebruikt.

PROGRAMMEERTALEN OP HOOG NIVEAU

De eerste programmeertaal op hoog niveau wordt overwogen computer taal Plankalkül, ontwikkeld door de Duitse ingenieur Konrad Zuse in de periode 1942-1946. Er bestond echter pas in 2000 een vertaler voor. De eerste taalvertaler op hoog niveau ter wereld is PP (Programming Program), ook bekend als PP-1, met succes getest in 1954. PP-2 vertaler (1955, 4e in de wereld) vertaler) was al aan het optimaliseren en bevatte zijn eigen loader en debugger, een bibliotheek met standaardprocedures, en de PP-vertaler voor Strela-4-computers bevatte al een linker van modules. Het wijdverbreide gebruik van talen op hoog niveau begon echter met de opkomst van Fortran en de creatie van een compiler voor deze taal (1957).

Talen op hoog niveau streven er niet alleen naar om de oplossing van complexe programmatische taken maar ook om het overdragen van software te vereenvoudigen. Door het gebruik van een verscheidenheid aan vertalers en tolken kunnen programma's die in talen op hoog niveau zijn geschreven, communiceren met verschillende besturingssystemen en hardware, terwijl hun broncode idealiter ongewijzigd blijft.

Dit soort isolatie van talen op hoog niveau van de hardware-implementatie van een computer heeft naast vele voordelen ook nadelen. Met name is het niet mogelijk om eenvoudige en nauwkeurige instructies voor de gebruikte apparatuur op te stellen. Programma's die zijn geschreven in talen op hoog niveau zijn gemakkelijker te begrijpen voor de programmeur, maar minder efficiënt dan hun tegenhangers die zijn geschreven in talen op laag niveau. Een van de gevolgen hiervan was de toevoeging van ondersteuning voor een of andere low-level taal (assemblagetaal) in een aantal moderne professionele high-level programmeertalen.

Voorbeelden: C, C ++, C #, Java, Python, PHP, Ruby, Perl, Pascal, Delphi, Lisp... Talen op hoog niveau hebben de mogelijkheid om met complexe datastructuren te werken. De meeste hebben geïntegreerde ondersteuning voor stringtypes, objecten, operaties bestand I / O enz. Het nadeel van talen op hoog niveau is de grotere omvang van programma's in vergelijking met programma's in talen op laag niveau. Daarom worden voornamelijk talen op hoog niveau gebruikt voor ontwikkeling software computers en apparaten met veel geheugen. En verschillende subtypes van assembler worden gebruikt voor het programmeren van andere apparaten, waarbij de grootte van het programma cruciaal is.

Dwingende talen zijn gebaseerd op verschillende belangrijke ideeën, waaronder de weergave van acties in de vorm van wiskundige formules, het concept van gegevenstype en de structurele transformatiestelling.

Een programma in een imperatieve taal is opgebouwd uit functies (subroutines). Assemblagetaalprogramma's kunnen ook uit subroutines bestaan ​​en dit is niets nieuws, maar talen op hoog niveau zorgen ervoor dat u niet hoeft na te denken over zaken als oproeporganisatie, overdracht van initiële gegevens en teruggave van resultaten. De functiebeschrijving bestaat uit een naam, een lijst met parameters (initiële gegevens), het type resultaat en de acties die leiden tot de ontvangst van dit resultaat. Een van de functies van het programma is de belangrijkste, de uitvoering ervan is het werk van het programma.

Een eenvoudig voorbeeld is een functie die de sinus van een getal berekent. Het kan sin worden genoemd, de initiële gegevens bestaan ​​uit één reëel getal, het resultaat is ook een reëel getal dat wordt verkregen door een segment van een bekende oneindige reeks op te tellen (of door het fsin-commando van de wiskundige coprocessor uit te voeren).

De reeks acties die binnen een functie kunnen worden uitgevoerd, is zeer beperkt. Het bestaat uit het berekenen van formule-uitdrukkingen, aanroepen van andere functies (wat geen afzonderlijke actie is - een functieaanroep is vaak opgenomen in een uitdrukking), toewijzingen, vertakkingen (een groep acties die alleen wordt uitgevoerd als een bepaalde voorwaarde waar is) en loops (een groep acties die meerdere keren wordt uitgevoerd, het aantal herhalingen hangt af van een bepaalde voorwaarde). Acties kunnen in elkaar worden genest. Het lijkt misschien dat de set takken en lussen te klein is, maar dat is het niet. Het is bewezen dat elk algoritme dat is samengesteld uit functionele blokken (op een laag niveau - rekenkundige opdrachten en opdrachten voor gegevensoverdracht), voorwaardelijke en onvoorwaardelijke overgangen kan worden omgezet in een equivalent algoritme dat alleen bestaat uit gestructureerde voorwaardelijke blokken - functionele blokken, vertakkingen en lussen met einde . Deze claim is geformuleerd in het artikel van Corrado Bohm en Giuseppe Jacopini "Flow diagrams, turing mashines and languages ​​​​with only two formulation rules" (Communications of ACM, Volume 9 / Number 5 / May 1965).

Als u tussenresultaten ergens moet opslaan om de benodigde acties uit te voeren, worden speciale beschrijvingen met de namen van variabelen en mogelijk andere informatie in de functie geplaatst. De adressen van de RAM-cellen worden er automatisch aan toegewezen. Sommige talen bevatten ook constante- en typedefinities binnen functies. In Pascal-achtige talen is een functie als een programma en kan definities bevatten van niet alleen constanten, typen en variabelen, maar ook van andere functies.

Een gegevensdeclaratie is een lijst met benoemde objecten. Deze objecten worden variabelen genoemd. In een aantal talen moet het type van een variabele worden gespecificeerd, wat de hoeveelheid geheugen bepaalt die nodig is om deze te plaatsen en de reeks bewerkingen waaraan deze kan deelnemen. Maar dit is niet per se het geval, er zijn talen waarin het type van een variabele niet is gespecificeerd en kan veranderen tijdens de uitvoering van het programma.

Doorgaans bieden programmeertalen een vrij beperkte reeks vooraf gedefinieerde typen variabelen en een manier om nieuwe typen te maken. Sommige van de volgende typen zijn vooraf gedefinieerd:

    natuurlijke en gehele getallen van verschillende groottes;

    echte getallen;

    symbolen - letters, cijfers, tekens van rekenkundige bewerkingen, enz.;

    tekenreeksen;

    booleaanse waarden;

    aanwijzingen

Acties op gegevens kunnen worden uitgevoerd met behulp van functies en operators.

In de C-taal zijn symbolen, strings en booleans bijvoorbeeld niet gedefinieerd. Het char-type is eigenlijk een kort geheel getal en kan rekenkundig zijn.

Nieuwe typen worden gevormd door verschillende elementen van hetzelfde type (een array, elk van de elementen heeft een rangtelwoord) of elementen van verschillende typen (structuur, elk van de elementen heeft een eigen naam) tot één geheel te combineren. In de meeste talen worden complexe getallen bijvoorbeeld niet gedefinieerd, maar kunnen ze wel worden gedefinieerd:

In sommige talen (bijvoorbeeld in C++) kunnen ook operators worden gedefinieerd voor gemaakte typen, wat het mogelijk maakt om variabelen van deze typen op dezelfde manier te gebruiken als variabelen van vooraf gedefinieerde typen.

Er zijn andere manieren om nieuwe typen te maken. Bijvoorbeeld, in Pascal het is mogelijk om te creëren:

    bereiktypen (door een bereik van waarden op te geven);

    opsommingstypen (door mogelijke waarden op te sommen);

    soorten instellen

Variabelen van type-sets kunnen worden gebruikt om informatie over een set eigenschappen van sommige objecten op te slaan. Iets dergelijks kan worden gedaan met behulp van integer-variabelen, waarvan de bits zijn ingesteld om de aanwezigheid van de bijbehorende eigenschappen aan te geven. Blijkbaar is het gebruik van sets beter bestand tegen programmeerfouten.

Programmeertaal

Programmeertaal- een formeel tekensysteem voor het vastleggen van computerprogramma's. Een programmeertaal definieert een reeks lexicale, syntactische en semantische regels die het uiterlijk van het programma bepalen en de acties die de uitvoerder (computer) onder zijn controle zal uitvoeren.

  • Functie: een programmeertaal is bedoeld voor het schrijven van computerprogramma's die worden gebruikt om instructies naar een computer te verzenden om een ​​of ander uit te voeren computerproces en het organiseren van het beheer van individuele apparaten.
  • Taak: een programmeertaal verschilt van natuurlijke talen doordat het is ontworpen om opdrachten en gegevens van persoon naar computer over te dragen, terwijl natuurlijke talen worden gebruikt om tussen mensen te communiceren. Het is mogelijk om de definitie van "programmeertalen" te generaliseren - het is een manier om commando's, bevelen, duidelijke richtlijnen voor actie over te brengen; terwijl menselijke talen ook dienen om informatie uit te wisselen.
  • Executie: een programmeertaal kan speciale constructies gebruiken om datastructuren te definiëren en te manipuleren en het rekenproces te beheersen.

Standaardisatie van programmeertalen

Een programmeertaal kan worden weergegeven als een set specificaties die de syntaxis en semantiek bepalen.

Voor veel van de wijdverbreide programmeertalen zijn internationale standaarden opgesteld. Specifieke organisaties actualiseren en publiceren regelmatig de specificaties en formele definities van de relevante taal. In het kader van dergelijke commissies gaat de ontwikkeling en modernisering van programmeertalen door en worden problemen met het uitbreiden of ondersteunen van bestaande en nieuwe taalconstructies aangepakt.

Gegevenstypen

Modern digitale computers zijn meestal binair en gegevens worden opgeslagen in binaire (binaire) code (hoewel implementaties in andere getalsystemen mogelijk zijn). Deze gegevens weerspiegelen meestal informatie uit de echte wereld (namen, bankrekeningen, metingen, enz.) die concepten op hoog niveau vertegenwoordigen.

Het speciale systeem waarmee de gegevens in het programma zijn georganiseerd, is: type systeem programmeertaal; de ontwikkeling en studie van typesystemen staat bekend als typetheorie. Talen kunnen worden geclassificeerd als systemen statisch getypt en talen met dynamisch typen.

Statisch getypeerde talen kunnen verder worden onderverdeeld in talen met verplichte aangifte waarbij elke variabele en functiedeclaratie een verplichte typedeclaratie heeft, en talen met afgeleide typen... Soms worden dynamisch getypte talen genoemd latent getypt.

Data structuren

Typesystemen in talen op hoog niveau maken de definitie mogelijk van complexe, samengestelde typen, zogenaamde datastructuren. Typisch worden structurele gegevenstypen gevormd als het cartesiaanse product van basis (atomaire) typen en eerder gedefinieerde samengestelde typen.

Basisgegevensstructuren (lijsten, wachtrijen, hashtabellen, binaire bomen en paren) worden vaak weergegeven door een speciale syntaxis in talen op hoog niveau. Dergelijke gegevens worden automatisch gestructureerd.

Semantiek van programmeertalen

Er zijn verschillende benaderingen om de semantiek van programmeertalen te definiëren.

De meest voorkomende varianten van de volgende drie zijn: operationeel, derivationeel (axiomatisch) en denotationeel (wiskundig).

  • Bij het beschrijven van semantiek binnen werkend benadering, wordt de uitvoering van constructies van een programmeertaal meestal geïnterpreteerd met behulp van een denkbeeldige (abstracte) computer.
  • afgeleide semantiek beschrijft de gevolgen van het uitvoeren van taalconstructies met behulp van de taal van de logica en het stellen van pre- en postcondities.
  • denationale semantiek werkt met concepten die typisch zijn voor wiskunde - verzamelingen, overeenkomsten, maar ook oordelen, uitspraken, enz.

Het programmeerparadigma

De programmeertaal is gebouwd in overeenstemming met de een of de ander basismodel computer- en programmeerparadigma.

Ondanks het feit dat de meeste talen zijn gericht op het imperatieve rekenmodel dat wordt gespecificeerd door de computerarchitectuur van von Neumann, zijn er andere benaderingen. We kunnen talen noemen met een gestapeld rekenmodel (Fort, Factor, PostScript, enz.), evenals functionele (Lisp, Haskell, enz.) en logisch programmeren (Prolog) en de REFAL-taal, op basis van de berekening model geïntroduceerd door de Sovjet-wiskundige A A. Markov Jr.

Op dit moment zijn ook probleemgerichte, declaratieve en visuele programmeertalen actief in ontwikkeling.

Manieren om talen te implementeren

Programmeertalen kunnen worden geïmplementeerd zoals gecompileerd en geïnterpreteerd.

Een programma in een gecompileerde taal met behulp van een compiler (speciaal programma) wordt geconverteerd (gecompileerd) in machinecode (een set instructies) voor van dit type processor en vervolgens geassembleerd tot een uitvoerbare module, die kan worden gestart voor uitvoering als een afzonderlijk programma. Met andere woorden, de compiler vertaalt de broncode van het programma van een programmeertaal op hoog niveau naar: binaire codes instructies van de processor.

Als het programma in een geïnterpreteerde taal is geschreven, dan voert (interpreteert) de tolk de brontekst direct uit zonder voorafgaande vertaling. In dit geval blijft het programma in de originele taal en kan het niet gestart worden zonder een tolk. Een computerprocessor kan in dit opzicht een tolk voor machinecode worden genoemd.

De indeling in gecompileerde en geïnterpreteerde talen is voorwaardelijk. Dus voor elke traditioneel samengestelde taal, zoals Pascal, kun je een tolk schrijven. Bovendien voeren de meeste moderne "pure" tolken taalconstructies niet rechtstreeks uit, maar compileren ze in een of andere intermediaire representatie op hoog niveau (bijvoorbeeld met variabele dereferentie en macro-uitbreiding).

U kunt een compiler maken voor elke geïnterpreteerde taal — een native geïnterpreteerde Lisp-taal kan bijvoorbeeld zonder enige beperking worden gecompileerd. De code die tijdens runtime is gemaakt, kan ook tijdens runtime dynamisch worden gecompileerd.

Gecompileerde programma's werken in de regel sneller en vereisen geen aanvullende programma's, aangezien ze al vertaald zijn naar machinetaal... Tegelijkertijd moet elke keer dat de programmatekst verandert, deze opnieuw worden gecompileerd, wat het ontwikkelingsproces vertraagt. Bovendien kan een gecompileerd programma alleen draaien op hetzelfde type computers en in de regel onder hetzelfde besturingssysteem waarvoor de compiler is ontworpen. Er is een nieuwe compilatie vereist om een ​​uitvoerbaar bestand voor een ander type machine te maken.

Geïnterpreteerde talen hebben een aantal specifieke extra mogelijkheden (zie hierboven), daarnaast kunnen programma's daarin direct na wijziging worden gestart, wat de ontwikkeling vergemakkelijkt. Een vertaald taalprogramma kan vaak worden uitgevoerd op verschillende soorten machines en besturingssystemen zonder extra inspanning.

Geinterpreteerde programma's zijn echter merkbaar langzamer om uit te voeren dan gecompileerde programma's; bovendien kunnen ze niet worden uitgevoerd zonder een tolkprogramma.

Deze benadering stelt u in zekere zin in staat om de voordelen van zowel interpreters als compilers te benutten. Opgemerkt moet worden dat er talen zijn die zowel een tolk als een compiler (Forth) hebben.

Gebruikte symbolen

Moderne programmeertalen zijn ontworpen om ASCII te gebruiken, dat wil zeggen de beschikbaarheid van alle grafisch ASCII-tekens zijn een noodzakelijke en voldoende voorwaarde voor het vastleggen van elke taalconstructie. managers ASCII-tekens worden in beperkte mate gebruikt: alleen regelterugloop CR, regelinvoer LF en horizontale tab HT zijn toegestaan ​​(soms ook verticale tab VT en overgang naar volgende bladzijde FF).

Vroege talen, die teruggingen tot het 6-bits karaktertijdperk, gebruikten een beperktere set. Het Fortran-alfabet bevat bijvoorbeeld 49 tekens (inclusief spatie): A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 = + - * / (). , $ ":

Een opvallende uitzondering is de APL-taal, die veel speciale tekens gebruikt.

Het gebruik van niet-ASCII-tekens (zoals KOI8-R-tekens of Unicode-tekens) is implementatieafhankelijk: soms zijn ze alleen toegestaan ​​in opmerkingen en teken-/tekenreeksconstanten, en soms zijn ze alleen toegestaan ​​in identifiers. In de USSR waren er talen waar iedereen trefwoorden werden in Russische letters geschreven, maar dergelijke talen wonnen niet veel populariteit (de uitzondering is de 1C: Enterprise embedded programmeertaal).

De uitbreiding van de tekenset wordt beperkt door het feit dat veel softwareontwikkelingsprojecten internationaal zijn. Het zou erg moeilijk zijn om met een code te werken waarbij de namen van sommige variabelen in Russische letters, andere in het Arabisch en weer andere in Chinese karakters zijn geschreven. Tegelijkertijd, om met tekstgegevens te werken, ondersteunen programmeertalen van de nieuwe generatie (Delphi 2006,, Java) Unicode.

Klassen programmeertalen

zie ook

Notities (bewerken)

Literatuur

  • Hal Abelson, Gerald Jay Sussman. Structuur en interpretatie van computerprogramma's
  • Robert W. Sebesta. Basisconcepten van programmeertalen = Concepten van programmeertalen / Per. van Engels - 5e druk. - M.: Williams, 2001 .-- 672 d. - 5000 exemplaren. - ISBN 5-8459-0192-8 (Russisch), ISBN 0-201-75295-6 (Engels)
  • Wolfenhagen V.E. Constructies van programmeertalen. Methoden van beschrijving. - M.: Centrum YurInfoR, 2001 .-- 276 d. - ISBN 5-89158-079-9
  • Parondzjanov VD Hoe het werk van de geest te verbeteren. Algoritmen zonder programmeurs - het is heel eenvoudig! - M.: Delo, 2001 .-- 360 d. - ISBN 5-7749-0211-0
  • F. Biancuzzi, C. Warden. Pioniers van programmeren. Gesprekken met de makers van de meest populaire programmeertalen. - SPb. : Symbol-Plus, 2010 .-- 608 p. - ISBN 978-5-93286-170-7

Links

  • De talenlijst (Engels) - meer dan 2500 talen met een korte beschrijving
  • Geschiedenis van computertalen (Engels) - geschiedenis van programmeertalen (van 1954 tot mei 2004) (bevat een regelmatig bijgewerkt diagram)
  • Voorbeelden - programmeervoorbeelden in 162 talen
  • Populariteit programmeertaal - 2004 studie van de populariteit van programmeertalen
  • 10 programmeertalen om te leren (2006)
  • Programming Community Index (eng.) - regelmatig bijgewerkte beoordeling van de populariteit van programmeertalen
  • Computertaal Shootout Benchmarks - Vergelijking van programmeertalen op efficiëntie
  • Programmeertalen die geliefd zijn (eng.) - vergelijking van programmeertalen voor "liefde" en "haat" voor hen

Wikimedia Stichting. 2010.

De machine verstaat geen mensentaal. We hebben het natuurlijk niet over Siri en andere stemherkenners - we hebben het over het maken van nieuwe software. Om een ​​rekenmachine te maken, moet de machine een taak instellen op dezelfde manier als de voorman de arbeiders uitlegt hoe ze moeten metselen. Maar "Vasya, ept, nou, het zou soepeler moeten zijn!" moet worden beschreven in een programmeertaal. Waar kwamen deze talen vandaan?

Het beginpunt moderne computer- De analytische machine van Babbage, maar talen werden eerder uitgevonden: in de 19e eeuw werden de mechanische piano en het weefgetouw uitgevonden, waarvoor ingenieurs de logica van werk beschreven. Deze set instructies is het prototype van wat programmeurs tegenwoordig schrijven.

In het midden van de 20e eeuw verschijnt de Turingmachine, dan de eerste computers en de eerste moderne taal Plankalkül-programmering. De eerste sprong in ontwikkeling vond plaats toen het leger de aandacht vestigde op computers - DARPA en anderen zoals zij begonnen actief te investeren in de jonge industrie. De tweede kwam met de verspreiding van internet - hoe dieper mensen in het digitale tijdperk duiken, hoe meer vraag er is naar de belangrijkste makers van de omgeving van dit tijdperk - programmeurs. En steeds meer mensen willen mee.

Het verlangen is redelijk en begrijpelijk, maar de eerste vraag in mijn hoofd wordt vaak een onoverkomelijke barrière - met welke taal moet ik beginnen met programmeren? De angst om de verkeerde keuze te maken is gebaseerd op de angst om tijd te verspillen. Als gevolg hiervan is een beginnende programmeur al enkele jaren op zoek naar zijn "eigen" taal zonder enige vooruitgang te boeken in de richting van het gekoesterde doel. Dus wat kies je in godsnaam je taal?

Criteria voor het kiezen van de eerste programmeertaal

De taalkeuze hangt af van de taken die de programmeur wil oplossen. Voor internetprojecten is Python populair, wat wordt gebruikt in hun Google-projecten en Facebook, voor mobiele applicaties voor Android beste vriend- Java, en voor iOS - Swift.

Het echte probleem van keuze is gebrek aan specifieke taak... Dit is normaal, omdat je alleen kunt begrijpen wat je wilt doen als je in de omgeving bent. Experts raden daarom aan om als eerste taal de taal te nemen die kan worden gebruikt om de meest uiteenlopende problemen op te lossen.

Natuurlijk zijn zeer gespecialiseerde talen beter in het oplossen van de problemen waarvoor ze zijn aangescherpt, maar dit is de volgende stap. De beginner heeft nog keuzevrijheid nodig.

In aanvulling op universaliteit, er zijn meer criteria:

  • Eenvoud- struikelen over complexe syntaxis en vast komen te zitten in de jungle van onleesbare code is geen prettig begin om te leren.
  • populariteit- de taal moet regelmatig worden bijgewerkt, een grote gemeenschap van ontwikkelaars hebben, veel gevraagd zijn in grote bedrijven... Een ander pluspunt is dat hoe populairder de taal, hoe makkelijker het is om het antwoord te vinden op de werkvraag die is gerezen.

Deze drie beschrijvingen zijn het meest geschikt Python-talen, C#, Java en Ruby.

Ontwikkeld in de jaren 80 door de Nederlandse programmeur Guido van Rossum. Grote techbedrijven werken met Python: Yandex, Google, Facebook en YouTube. Dit is de zogenaamde scripttaal - het wordt gebruikt om te schrijven wat het programma onder de motorkap heeft. Het wordt gebruikt voor webapplicaties, game-ontwikkeling, serversoftware ...

Eenvoud populariteit Veelzijdigheid

De code is goed leesbaar en heeft een duidelijke structuur. Standaard tools zijn voldoende om te beginnen met leren.

Gerangschikt op nummer 1 in basisprogrammeringsonderwijs aan Amerikaanse universiteiten.

Regelmatig bijgewerkt - elke 2,5 jaar. Het is opgenomen in de top vijf van populaire talen volgens het analytische bedrijf TIOBE Software voor januari 2016.

Bijna alles is geschreven in Python: scripts voor systeembeheer, websites, machine learning-systemen, games.

De taal is eind jaren 90 ontwikkeld op basis van C++ en Java. Meestal gebruikt voor grote ondernemingsprojecten, maar niet alleen daartoe beperkt. Scripts in de Unity-game-engine zijn bijvoorbeeld geschreven in C #.

Eenvoud populariteit Veelzijdigheid

Structureel dicht bij C ++ en Java - syntaxis (structuur programmacode:) is moeilijker dan Python en Ruby, maar het kost minder tijd om verwante talen te leren. De bibliotheekinterfaces passen goed bij ontwerppatronen, waardoor het gemakkelijk te leren is.

De laatste update was in 2015.

C # is geschreven onder Windows telefoon, iOS en Android. Een groot aantal van documentatie, maar er zijn niet veel bibliotheken met een gratis licentie - dit betekent dat een programmeur voor training de code van iemand anders kan gebruiken, maar voor gebruik in commercieel product jij moet betalen.

De taal is uitgevonden door programmeurs van Microsoft voor het ontwikkelen van Windows-applicaties. Desondanks wordt het ook in andere systemen gebruikt. Werkt ook op embedded, desktop- en serverplatforms.


Robijn

Gemaakt door een Japanse ontwikkelaar beïnvloed door de Perl-taal. Gelanceerd in 1995. Geschreven in Ruby zijn Shopify, Github, Groupon, Yellow Pages, Twitter en Slideshare. Het wint aan populariteit, maar het komt vaker voor bij startups dan bij grote bedrijven. Goed voor het maken van een eenvoudig internetproject.

Eenvoud populariteit Veelzijdigheid

Net als Python is de code gemakkelijk te lezen. De structuur is ook identiek aan Python. In vergelijking met andere talen is de keuze aan standaardbibliotheken geringer - u moet tijd besteden aan het zoeken.

Een grote en loyale ontwikkelaarsgemeenschap - rondt de top tien van meest populaire talen af ​​volgens TIOBE Software. Veel bibliotheken zijn vrij beschikbaar.

De minst veelzijdige van de vier - meestal geschikt voor webontwikkeling. Aan de andere kant kun je er binnen internetprojecten heel verschillende en hele toffe dingen mee doen.


Java

De eerste versie van de taal werd uitgebracht in mei 1995. Java wordt gebruikt door Amazon, eBay, LinkedIn en Yahoo!

Eenvoud populariteit Veelzijdigheid

Zoals eerder vermeld, hebben Java en C # een zeer vergelijkbare syntaxis - je hebt de ene geleerd, je kent de andere bijna. Maar net als in het eerste geval is de syntaxis complexer dan die van Ruby en Python.

Er zijn 3 miljard Android-smartphones in de wereld, wat betekent dat Java nog lang in trek zal zijn. Eerste meest populaire door TIOBE Software.

Meestal gebruikt voor bedrijfsontwikkeling en Android-applicaties.


Voorbereidingsoverzicht

Het is moeilijk om een ​​conclusie te trekken. Aan de ene kant lonkt de mogelijkheid om twee vliegen in één klap te slaan en Java of C# te nemen, maar Python lonkt met zijn veelzijdigheid, en Ruby - met zijn eenvoud.

We aarzelden en gingen praten met ervaren ontwikkelaars - ze adviseren je nog steeds om op Python te blijven. Dit is wat Grigory Petrov, professionele ontwikkelaar, VoxImplant-evangelist, zegt:

"Taal Python-programmering vaak aangeduid als "uitvoerbare pseudocode" omdat de syntaxis van de taal en de standaardbibliotheken de nadruk leggen op leesbaarheid en begrijpelijkheid. Voeg daarbij de breedste selectie van ontwikkeltools, bibliotheken, trainingsmateriaal - en we krijgen er een van beste talen programmeren voor beginners".

Uitgang: hoewel er geen duidelijke taken en duidelijke doelen zijn, maar er is alleen een verlangen om te coderen, is het de moeite waard om te stoppen bij Python - het is eenvoudig, populair en universeel. Nikita Sobolev, een programmeerleraar voor beginners bij #tceh, vindt de keuze van deze taal ook optimaal voor een beginner - het educatieve programma bleek ingewikkelder en langer dan in de Ruby-cursus, maar de vrijheid in het kiezen van een richting is de moeite waard het.