Programmeringsspråk för prototyping

Permalänk
Medlem

Programmeringsspråk för prototyping

Vad använder ni för programmeringsspråk när ni ska göra "enkla" saker eller prototyper där prestanda inte är viktigt? Python är väl det språk som jag tänker på först men finns det något annat språk? Kanske till och med något med en kompilator som gnäller om man gör en tabbe?

Jag gjorde ett litet experiment där jag skulle göra ett program som:
* "Rekurserar" ner i en vald katalog och tar fram en lista med filer som har angivna filändelser
* Blandar listan
* Skapar en temporär fil(playlist) med innehållet ovan med en fil per rad
* Startar mpv(mediaspelare) och matar playlisten till den

Jag gjorde det här i C++, D och Python. Det gick ungefär som jag trodde det skulle.

C++ "bråkar" som vanligt. Man får skriva egna funktioner/lambdas för de mest banala sakerna och gå till boost eller andra bibliotek för annat. Kan tillägga att C++ är det språk jag är mest erfaren med(jobb).

D gick bättre än väntat då jag inte har kodat något i det förut och allt bara funkade. Jag hittade ingen "NamedTemporaryFile" men whatever.

Python strulade lite mer än väntat men gick snabbast att få ihop, dock kör jag en glob per filändelse nu. Glob verkar inte klara .*{mkv,mp4} som D men det går väl att lösa med en "manuell" os.walk() istället. Sen råkade jag glömma paranteser på min tmpFile.close och det varnade inte python om vad jag kan minnas. Detta gjorde att playlisten var tom när mediaspelaren fick den. Det hade kanske upptäckts om jag haft någon fin python IDE eller en linter men det är lite därför jag egentligen vill ha en kompilator.

TL;DR Vilket språk är du mest produktiv med och varför?

Visa signatur

"I do not know with which weapons WWIII will be fought, but WWIV will be fought with sticks and stones."
Albert Einstein

Permalänk
Medlem
Skrivet av engywook:

Vad använder ni för programmeringsspråk när ni ska göra "enkla" saker eller prototyper där prestanda inte är viktigt? Python är väl det språk som jag tänker på först men finns det något annat språk? Kanske till och med något med en kompilator som gnäller om man gör en tabbe?

Jag gjorde ett litet experiment där jag skulle göra ett program som:
* "Rekurserar" ner i en vald katalog och tar fram en lista med filer som har angivna filändelser
* Blandar listan
* Skapar en temporär fil(playlist) med innehållet ovan med en fil per rad
* Startar mpv(mediaspelare) och matar playlisten till den

Jag gjorde det här i C++, D och Python. Det gick ungefär som jag trodde det skulle.

C++ "bråkar" som vanligt. Man får skriva egna funktioner/lambdas för de mest banala sakerna och gå till boost eller andra bibliotek för annat. Kan tillägga att C++ är det språk jag är mest erfaren med(jobb).

D gick bättre än väntat då jag inte har kodat något i det förut och allt bara funkade. Jag hittade ingen "NamedTemporaryFile" men whatever.

Python strulade lite mer än väntat men gick snabbast att få ihop, dock kör jag en glob per filändelse nu. Glob verkar inte klara .*{mkv,mp4} som D men det går väl att lösa med en "manuell" os.walk() istället. Sen råkade jag glömma paranteser på min tmpFile.close och det varnade inte python om vad jag kan minnas. Detta gjorde att playlisten var tom när mediaspelaren fick den. Det hade kanske upptäckts om jag haft någon fin python IDE eller en linter men det är lite därför jag egentligen vill ha en kompilator.

TL;DR Vilket språk är du mest produktiv med och varför?

Jag gör sådant i Python, jag tycker det är underbart för det! Men du kanske skulle prova på Groovy, det är förhållandevis likt Python men kompileras till bytekod och körs på Samma JVM som Java.

Jag skulle vilja tipsa om att använda with-nyckelordet för att öppna filer i python, då slipper du tänka på att stänga dem.

with open('output.txt', 'w') as f: f.write('Hi there!')

Visa signatur

/M

Permalänk
Medlem
Skrivet av Marowak:

Jag gör sådant i Python, jag tycker det är underbart för det! Men du kanske skulle prova på Groovy, det är förhållandevis likt Python men kompileras till bytekod och körs på Samma JVM som Java.

Jag skulle vilja tipsa om att använda with-nyckelordet för att öppna filer i python, då slipper du tänka på att stänga dem.

with open('output.txt', 'w') as f: f.write('Hi there!')

Ja, det är kanske lika bra att köra på Python då det har stort community. Tack för tipset om with. Filen stängs när "f" går ur scope antar jag?

Aldrig hört talas om Groovy men ska kolla upp det, tack.

Visa signatur

"I do not know with which weapons WWIII will be fought, but WWIV will be fought with sticks and stones."
Albert Einstein

Permalänk
Datavetare

@engywook: en väldigt bra "språk" för prototyper är ju BASH. I ditt specifika fall går det ju att göra en väldigt enkel lösning

(trap 'rm -f .mpv.playlist' EXIT; find <DIR> -iname '*.mkv' -o -iname '*.mp4' | shuf > .mpv.playlist; mpv --playlist=.mpv.playlist)

Inte ett "program" i sin rätt bemärkelse, men så pass enkelt att ett program kanske är onödigt.

Har själv programmerat en hel del Python och det är lätt att göra saker i språket. Dock tycker jag det känns lite som att vissa saker mer bara "hänt" än faktiskt designats med någon större bakomliggande tanke.

Ett rejält WTF är detta

x = 'en slank han hit' if lyrics == 'en slank han dit' else 'och en slank han ner i diket'

Uttryck brukar ha någon form av enhetlig ordning för evaluering, vem kom på ordningen: evaluera mitten först, är det sant gå vänster annars gå höger?

Stödet för OOP är inte heller någon höjdare i Python. Men det går absolut snabbt att få saker gjorda i språket!

Ett annat alternativ är Ruby, blir ju inte jättelångt från Python-programmet. Ruby har en av de bästa stöden för OOP jag sett, är i nivå med Smalltalk. Tycker också det rent generellt är långt mer koherent i sin design jämfört med Python.

Det lyckas dock med konststycket att exekvera långsammare än Python i många fall. Det är en konsekvens av att man alltid valt den väg som ger "renast" design, man har aldrig tänk på om det är effektivt för en dator.

require 'docopt' require 'tempfile' doc = <<DOCOPT Create a playlist of all files with matching set of extensions. Usage: #{__FILE__} [--filter=<csv>] DIRECTORY Arguments: DIRECTORY Recurse from this directory Options: --filter=<csv> Use files with these extensions [default: mkv,mp4]. DOCOPT begin args = Docopt::docopt(doc) baseGlob = File.join(args['DIRECTORY'], '**/*.') filter = args['--filter'] Tempfile.open('mpv.playlist') do |playlistFile| filter.split(',').reduce([]){|files,ext| files + Dir[baseGlob + ext]}.shuffle.each{|fn| playlistFile.puts(fn)} playlistFile.close `mpv --playlist=#{playlistFile.path}` end rescue Docopt::Exit => e puts e.message end

Edit: var några tecken som fallit bort i koden

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

@engywook: en väldigt bra "språk" för prototyper är ju BASH. I ditt specifika fall går det ju att göra en väldigt enkel lösning

(trap 'rm -f .mpv.playlist' EXIT; find <DIR> -iname '*.mkv' -o -iname '*.mp4' | shuf > .mpv.playlist; mpv --playlist=.mpv.playlist)

Inte ett "program" i sin rätt bemärkelse, men så pass enkelt att ett program kanske är onödigt.

Mjo, det är ett dåligt exempel egentligen men tog med det för att jag hade det "liggande". Min "fundering" om produktivitet triggades av det här när jag bara skulle testa hur stökigt det skulle vara att göra i C++.

Coolt med trap, det var jag inte medveten om.

Citat:

Har själv programmerat en hel del Python och det är lätt att göra saker i språket. Dock tycker jag det känns lite som att vissa saker mer bara "hänt" än faktiskt designats med någon större bakomliggande tanke.

Ett rejält WTF är detta

x = 'en slank han hit' if lyrics == 'en slank han dit' else 'och en slank han ner i diket'

Uttryck brukar ha någon form av enhetlig ordning för evaluering, vem kom på ordningen: evaluera mitten först, är det sant gå vänster annars gå höger?

Heh, jo den buggen hade jag åkt på.

Citat:

Stödet för OOP är inte heller någon höjdare i Python. Men det går absolut snabbt att få saker gjorda i språket!

Ett annat alternativ är Ruby, blir ju inte jättelångt från Python-programmet. Ruby har en av de bästa stöden för OOP jag sett, är i nivå med Smalltalk. Tycker också det rent generellt är långt mer koherent i sin design jämfört med Python.

Det lyckas dock med konststycket att exekvera långsammare än Python i många fall. Det är en konsekvens av att man alltid valt den väg som ger "renast" design, man har aldrig tänk på om det är effektivt för en dator.

require 'docopt' require 'tempfile' doc = <<DOCOPT Create a playlist of all files with matching set of extensions. Usage: #{__FILE__} [--filter=<csv>] DIRECTORY Arguments: DIRECTORY Recurse from this directory Options: --filter=<csv> Use files with these extensions [default: mkv,mp4]. DOCOPT begin args = Docopt::docopt(doc) baseGlob = File.join(args['DIRECTORY'], '**/*.') filter = args['--filter'] Tempfile.open('mpv.playlist') do |playlistFile| filter.split(',').reduce([]){|files,ext| files + Dir[baseGlob + ext]}.shuffle.each{|fn| playlistFile.puts(fn)} playlistFile.close `mpv --playlist=#{playlistFile.path}` end rescue Docopt::Exit => e puts e.message end

Edit: var några tecken som fallit bort i koden

Hmm, Ruby då tänker jag rails direkt =). Ser dock ganska trevligt ut. Jag får titta runt lite och smälta den där filter.split onelinern. Hur ser det ut med libbar osv så att man "slipper göra allt själv". Jag ser att det finns bindings till ZMQ och Qt(4) t.ex.

Edit: Min Rubyversion blev:

require 'docopt' require 'tempfile' doc = <<DOCOPT randMov. Usage: #{__FILE__} [--filter=<csv>] DIRECTORY Arguments: DIRECTORY Recurse from this directory. Options: --filter=<csv> Use files with these extensions [default: mkv,mp4] DOCOPT begin args = Docopt::docopt(doc) dir = args['DIRECTORY'] filter = args['--filter'] fileList = Dir[dir + '**/*.{' + filter + '}'] fileList.shuffle! tmpFile = Tempfile.new('playlist') for file in fileList tmpFile.write(file + "\n") end tmpFile.close `mpv --playlist=#{tmpFile.path}` tmpFile.unlink rescue Docopt::Exit => e puts e.message end

Visa signatur

"I do not know with which weapons WWIII will be fought, but WWIV will be fought with sticks and stones."
Albert Einstein

Permalänk
Medlem

Beror lite på vad du har för krav skulle jag säga, själv sitter jag mycket runt databas samt logik largret och för min del gör jag de mesta prottyping i LINQPad i både C# samt SQL (Går att använda F# samt VB där också om man så vill )

Dessutom skaffar du en riktig licens till programmet kommer du åt alla nuget paket, debugging, intellisense o.s.v och kan snabbt slänga ihop ett demo eller test av något på nolltid. Funkar även utmärkt att inkludera dina egna bibliotek för att leka runt med också.

Men programmerar du inte mycket i Microsoft värld så är nog inte detta verktyg det bästa för din del dock för min del är programmet mer eller mindre guld värt.

Samt skrev ihop ett test i linqpad http://pastebin.com/9udy6p5T, notera att du inte har arguments här, samt så finns inte spelaren mpv men annars funkar det. Hade förvisso skrivit en egen shuffler men onödigt för prototyping skull.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Medlem
Skrivet av MugiMugi:

Beror lite på vad du har för krav skulle jag säga, själv sitter jag mycket runt databas samt logik largret och för min del gör jag de mesta prottyping i LINQPad i både C# samt SQL (Går att använda F# samt VB där också om man så vill )

Dessutom skaffar du en riktig licens till programmet kommer du åt alla nuget paket, debugging, intellisense o.s.v och kan snabbt slänga ihop ett demo eller test av något på nolltid. Funkar även utmärkt att inkludera dina egna bibliotek för att leka runt med också.

Men programmerar du inte mycket i Microsoft värld så är nog inte detta verktyg det bästa för din del dock för min del är programmet mer eller mindre guld värt.

Samt skrev ihop ett test i linqpad http://pastebin.com/9udy6p5T, notera att du inte har arguments här, samt så finns inte spelaren mpv men annars funkar det. Hade förvisso skrivit en egen shuffler men onödigt för prototyping skull.

Mitt främsta krav är produktivitet. Det vill säga att jag inte vill spendera/"slösa tid" på specialfall/"corner cases" eller "krångliga" APIs. Syftet är att bredda mig lite då jag inte pluggade data. Jag sitter mest på Linux i en terminal även om nästa jobb antagligen blir på Windows 10 men där kanske jag kan fixa bash eller en VM. Microsofts produkter håller jag mig helst borta ifrån.

Några exempel på saker jag kanske kommer göra, är som du nämde, något runt en databas för jag har bara erfarenhet av en gammal och egenhackad sådan från jobbet. Någon form av makrobenchmark för körtid, minnesanvändning etc för program/simuleringar med tillhörande statistik. Möjligtvis implementera någon sorteringalgoritm. Något annat jag kanske ska prova lite är GPU programmering.

Visa signatur

"I do not know with which weapons WWIII will be fought, but WWIV will be fought with sticks and stones."
Albert Einstein

Permalänk
Medlem

@engywook: För enkla saker, små "en-funktions" program med eller utan gui, att parsa filer, diverse automation och liknande kör jag med macro scheduler. Det räcker för mina krav.

Permalänk
Inaktiv

Mest VBA i Excel. På frågan varför så får man ett bra grässnitt på köpet, där användaren enkel kan filtrera information, addera, ta bort delar etc.

Sedan Powershell då det för windows är kraftfullt..

Sist C# för att det är väldigt enkelt, jag tycker t.o.m. enklare än powershell men man får en exe fil som man ej alltid vill ha. Om jag väljer powersheller eller C# beror lite på syftet med verktyget.

Python och liknande enkla språk i all ära, men för min del känner jag varför lära sig en syntax till? Det går för mig snabbare att då bara göra saken i C#.

Permalänk
Medlem

Jag jobbar med Scala och använder bland annat https://scalafiddle.io för att testa enkla grejer eller bara dela med mig av kodsnippets till kollegor.

Så här t ex: https://scalafiddle.io/sf/L4OxL4x/1

Visa signatur

Kom-pa-TI-bilitet