Pěkný úvod, díky.
Vypadá to, že není vůbec důležité, jaké jazyk používá závorky nebo odsazení, ale jaký styl myšlení svým programátorům navozuje. Pro mě je Go na nejlepší cestě být novodobou verzí Javy se všemi nectnostmi a nevýhodami. Java místo aby použila systémovou knihovnu a volala tak jiný jazyk, tak si raději všechno reimplementuje sama. Takže pak instalujete aktualizace cojávím úložiště certifikátů pro celý systém kromě Javy, a zvlášť pro Javu. Nebo konfigurace pro časové zóny - jednou pro systém, jednou pro Javu. Taky javoví programátoři fungují stylem "zkopíruju vše co potřebuju do svého projektu a už to nikdy neaktualizuju", namísto toho, aby věnovali minimální úsilí směrem k použití toho, co v systému už i tak je. No a program v Go v podstatě odpovídá staticky linkovanému programu v C, což byla doporučovaná forma sestavování programů tak někdy kolem roku 1990. Takže za mě - čím méně se Go rozšíří, tím lépe.
-Yenya https://www.fi.muni.cz/~kas/
To já samozřejmě nevím, mně by stačilo, kdyby Java byla aspoň natolik multiplatformní, abych nemusel ke každému Javovému programu složitě hledat přesně tu správnou verzi Javy, se kterou ho mám spouštět, aniž by blil na stderr tuny chybových hlášek a backtraců, nebo u některých aspoň aniž by padal a aspoň nějak fungoval.
-Yenya
Tak nějak všechny, které jsem měl příležitost spouštět. Například freemind. Nebo různé javové applety, které generují webové vizualizace různých technologických zařízení (vzduchotechnik, chlazení, záložního napájení a podobně).
Jako jo, _teoreticky_ jde nejspíš napsat Javový program který funguje správně na různých verzích Javy, neblije souvislý proud backtraců na stderr, a vůbec se chová způsobně. Problém je, že prakticky se takto javové programy podle mých zkušeností prostě nechovají.
-Yenya
No vidíte, a přitom je spousta zařízení, které koupite letos, v roce 2018, a u kterých se očekává funkčnost v řádech desítek let, a tato zařízení mají primární způsob ovládání ve formě toho údajně mrtvého Javového appletu. Ne že by na tom pět let stará zařízení (očekávaná doba provozu dalších minimálně 15 let) byla lépe. Je teda pravda, že když budete na dodavatele dostatečně drsní, tak většinou připustí i existenci nějakého Modbusu, SNMP nebo BACnetu, nebo aspoň RS232/422/485 s nějakým proprietárním ovládáním, ke kterému po další dávce výhružek je ochoten vydat i nějakou dokumentaci (nebo teda zbude reverse engineering komunikace toho appletu).
Ale to už fakt odbočujeme od tématu Go. O Javě můžeme diskutovat jinde.
Zpátky ke Go: s tímto jazykem jsem se potkal u jednoho relativně triviálního projektu (firmware uploader pro RC vysílačku), kde na githubu v repozitáři měli zdroják, ale taky .exe a linuxovou binárku(!}. Zdroják se nepodařilo přeložit, protože (pokud si dobře pamatuju) to mělo snahu stahovat nějakou knihovnu/balík, která ale v systému už byla nainstalovaná z repozitářů Fedory. Linuxová binárka fungovala (dokonce i .exe pod Wine fungoval), tak jsem to dál neřešil, jen jsem si učinil mentální poznámku, že Go asi není to co bych chtěl používat.
-Yenya
Nicméně aplikace na vzduchotechniku mají obrovskou setrvačnost a natolik specifické požadavky, že je nejlepší je pouštět na PC vyčleněném přímo pro ně. Nedivil bych se, kdyby běžely v nejlepším na 10 let staré Javě a Windows Serveru 2003 s admin právy a Internet Explorerem 6. Aspoň taková je moje dávná zkušenost, když jsem o ně zavadil.
Diky za info. Ty applety ... ok, ty neznam. Ale Freemind pouzivam od Javy 6 (Fedora, Mint, eeebuntu, Windows XP) a tedy nevsiml jsem si, ze by padal nebo vyzadoval konkretni verzi. Pise to jen par hlasek typu:
STDOUT: User patterns file /home/tester/.freemind/patterns.xml not found. STDOUT: User patterns file /home/tester/.freemind/patterns.xml not found.Nov 2
Já jsem freemind zkoušel používat tak kolem roku 2010, a nakonec jsem našel verzi Javy, se kterou fungoval, i když občas padal. Je pravda, že aktuálnější informace nemám. Pak jsem objevil vimoutliner, a od té doby pro podobné účely používám místo freemindu ten. Má to výhodu, že .otl soubor je lidsky čitelný a jde ho commitovat do gitového repozitáře tak, aby i jednotlivé změny v git diff dávaly smysl.
-Yenya
Potom i kradu, ze? Neprogramuji pro Javu. Ale musim nejake Java aplikace provozovat, tazke mam jen prakticke zkusenosti. Uz jsem se naucil, ze si musim pohlidat, aby dodavatel nemel aplikace prelozene poslednim kompilatorem, ale kompatibilni s nasazenou verzi Javy. A ti programatori to porad nechapou, porad maji predstavu, ze nejnovejsi je nejlepsi. A proto mam radsi skriptovaci jazyky... Nejvetsi riziko je, kdyz dodavaji jen "drobnou" opravu na starsi SW.
Podobnou zkusenost mam i s go, tam jen jeste nevim, co je zdrojem nekompatibility...
Pro programátory samozřejmě nejnovější je nejlepší, protože to má nejvíc vlastností, které jim něco usnadní – např. nemusí danou věc sami programovat, snáze se jim ladí, provádí další kontroly kódu apod. Výhody to má i pro uživatele, protože novější JVM má třeba lepší GC nebo lepší optimalizace. Takže pokud aplikace funguje s novější verzí JVM, snažil bych se používat co nejnovější. Samozřejmě pokud to jde, v posledních verzích se dost pročišťovalo a aplikace používající např. třeba nějaké interní implementace Oraclu/Sunu v novějších verzích nemusí fungovat.
golang ma, teoreticky, jen minimalni pozadavky na kernel, ale ty pozadavky jsou specifikovane velmi vagne (kernel novejsi nez 2.6.23). Dusledkem je, ze funkcni program prelozeny novejsi verzi prekladace prestava na casti systemu fungovat. Ten probem se objevuje znovu a znovu, zeptejte se Google na "runtime epoolwait failed". Ano, problem postihuje jen starsi systemy, takze pokud mate vzdy nejnovejsi distribuci, tak jste za vodou...
Ad 1) Hm, starší verze než 6 přijme jako platný argument, ale při kompilaci vypíše chybu. Zvláštní postup.
Ad 2) To s verzemi vůbec nesouvisí. JVM při startu samozřejmě nemůže kontrolovat, zda má k dispozici všechny třídy, protože neví, jaké všechny třídy budete používat. Kdyby nic jiného, můžete se pokusit třídu načíst přes reflexi.
Cache musí být při přepnutí procesů (aplikací) invalidována z bezpečnostních důvodů, obsahuje citlivá data procesu, ke kterým se nesmí dostat jiný proces. Cache přímo vyčíst nelze, ale postranními kanály ano. TLB v případě statického linkování žádnou režii nemá, protože celý kód je v rámci jednoho virtuálního adresového prostoru.
Co se týká výkonu, je statické linkování výhodnější než dynamické, protože se vůbec neuplatňuje dynamický linker, dohledávající funkce podle jména v dynamické knihovně. Taky se dají se statickým linkováním udělat některé optimalizace (https://en.wikipedia.org/wiki/Interprocedural_optimization), které s dynamickým linkováním nejsou možné.
> TLB v případě statického linkování žádnou režii nemá, protože celý kód je v rámci jednoho virtuálního adresového prostoru.
Opravdu? TLB přece figuruje při překladu virtuálních na fyzické adresy. Jeden virtuální adresový prostor mají jak staticky tak dynamicky linkované programy. A i ty staticky linkované musí přes tlb protáhnout záznam pro každou použitou stránku.
Je vedle sebe jen ve virtuálním adresovém prostoru, ne? Fyzicky jsou stránky rozstrkané po fyzické paměti dost náhodně. Takže statiké linkování ušetří akorát pár stránek na hranicích dynamických knihoven.
A u dynamického linkování je možné v tlb nechat kusy pro sdílené části adresového prostoru. Třeba libc a podobně. Při statickém linkování znamená každé přepnutí procesu kompletní výmaz tlb.
"Když se volá funkce, tak se statickým linkováním je nějaká pravděpodobnost, že bude ve stejné stránce. "
- Toto je snad ten nejhloupější argument, který jsem na téma static vs dynamic linking kdy slyšel. Ale můžeš v něm pokračovat a zkusit tu pravděpodobnost nějak dokázat a taky změřit jaký dopad to má celkově na výkon. Asi už znám výsledek - 0, protože procesor má cache (a instruction cache line je 64 bajtů a ne celá stránka) a je mu úplně jedno, kde ten kód je. Jo, kdybys zmínil např. .got (global offset table) overhead , TLS access overhead, a další věci, kde nastává overhead při dynamickém likování, tak bych to pochopil, ale stránkování IMO není problém a pokud tvoje aplikace nemá limit 4kB tak je to naprosto irelevantí.
Já ti to nebudu znovu vysvětlovat, když jsi to nepochopil. Zkus třeba i jiné zdroje, třeba ti to dojde: https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/com.ibm.aix.performance/when_dyn_linking_static_linking.htm
A more subtle effect is a reduction in "locality of reference." You may be interested in only a few of the routines in a library, and these routines may be scattered widely in the virtual address space of the library. Thus, the total number of pages you need to touch to access all of your routines is significantly higher than if these routines were all bound directly into your executable program. One impact of this situation is that, if you are the only user of these routines, you experience more page faults to get them all into real memory. In addition, because more pages are touched, there is a greater likelihood of causing an instruction translation lookaside buffer (TLB) miss.
Tak je pomerne drsny, kdyz clovek s doktoratem s MUNI, co tam vyucuje programovani v UNIXu napise takovy blabol.
Jednoduche proceduralni GO nema s objektovou Jawou (rizlou lambdama) spolecneho lautr nic.
To co je "v systemu" jsou vetsinou ceckove knihovny (Linux), ve woknech na winapi jeste .Net VM, v OS X treba navic Cocoa.
Tudiz pro potreby multiplatformniho jazyka vicemene nepouzitelne.
Java si svoje potreby reimplementuje sama, zrovna GO casto pouziva systemova volani via jeho interni C binding.
Zrovna nedavno jsem psal v GO program, ktery ovladak mys, klavesnici a snimal obrazovku.
Byla na to GO knihovna podporujici Lin/Win/Mac, ktera interne volala ceckove syscally.
Ostatne neni sebemensi problem si i v Jave owrapovat systemove volani, tim zrusit multiplatformnost a vystavit se bugum microsoftu - konkretne v pripade certifikatu
Viz https://www.oracle.com/technetwork/articles/javase/security-137537.html
https://stackoverflow.com/questions/34166304/accessing-windows-certificate-store-certs-via-java
Akorat nevim, k cemu to ma byt dobre, osbne si vlastni TrustManager pisu, jenom kdyz potrebuju ofejkovat kontroly certifikatu v rozjebanem systemovem prostredi, muj TrustManager rika OK na libovolny pozadavek.
Apropos, dnesni java programy se pisou s vyuzitim Mavenu, aktualizace knihoven v projektu je zmena jednoho cisilka v pom.xml.
Přijde mi, že mindset programátorů je více ovlivněn fenomény o kterých mluví "Uncle" Bob Martin v přednášce "The Future of Programming" https://www.youtube.com/watch?v=ecIWPzGEbFc (pozor, je to spíše historie, ale podle mě vysvětluje srozumitelně stávající stav) než jazykem, který používají.
Dříve jsem si myslel, že téměř nejdůležitější je dělat věci správě (např. programovat správě). Proto jsem nechápal, jak někdo může nepovažovat za nejrozumnější funkcionální programování a ANSI Common Lisp a stále "plýtváme" zdroji s procedurálním programováním (tam kde Alan Turing začal). Proč jsme se nebyli schopni reálně úrovní posunout ?
Nyní se přikláním k názoru, že mnohem důležitější než dělat věci správě, je dělat je srozumitelně a použitelně pro "hodně" lidí. To mě vede k přesvědčení, že minimalismus a "user space" samostatnost Go je jedou ze správných cest.
Ad "systémová knihovna" - co to vlastně je ? :-) Kernel (Linux) je také knihovna. Hranice mezi user space knihovnami a kernelem není ostrá (nezřídka dělají obdobné věci a umístění funkcionality kernel vs user space je dáno spíše historicky, mnohá funkcionalita se také překrývá - např. API logování). Budeme "kárat" user space knihovny a kernel za duplicity ?
Domnívám se, že běhové prostředí aplikace by měl mít aplikační programátor více pod kontrolou, čemuž "brání" stávající pojetí distribucí, kde běhové prostředí aplikace značně ovlivňuje package maintainer. No a proč nutit uživatele řešit závislosti knihoven, když nemá pro svou aplikaci balíček distribuce ? Nebo proč nutit dělat aplikačního programátora binárky (balíčky) pro řadu distribucí, když stačí binárka per architektura/platforma ?
Proč nám vlastně vadí spouštět binárky (důvěřovat autorovi aplikace), když důvěřujeme jeho kódu a kódu knihoven co aplikace používá ?
Je lepší mít hromadu verzí dynamických knihoven (a evidovat v distribuci závislosti) nebo je lepší aby každá aplikace měla běhové prostředí svoje, to co otestoval a připravil autor aplikace ? Mě přijdou lepší binární "aplikační kontejnery" (staticky linkované binárky), než noční můra závislostí, hromada mrtvého kódu (to co je v dynamicky linkovaných knihovnách) s nezbytností se o něj starat a patchovat všechny verze. Či bizáry typu Virtualenv pro Python. Nedejbože když je třeba stejná verze dynamické knihovny přeložená s jinými parametry - to už je teprve schiza :-(
Go samozřejmě umí využít "systémové" úložiště certifikátů, viz např. https://medium.com/@pierreprinetti/the-go-1-11-dockerfile-a3218319d191 Na úrovni clusterů je pak jistě lepší používat rozumnější správu konfigurace než distribuce na jednotlivých serverech - tedy něco jako etcd, Consul atp - k tomu budeš "systémové knihovny" přemlouvat těžko, ale v Go je to otázka cibulové struktury API (bez vlastní implementace knihoven by to bylo velmi obtížné).
Kontejnerově distribuované aplikace s minimalizací povrchu pro útoky je myslím také rozumná strategie.
Proto si dovolím nesouhlasit s přirovnáním k Javě a prohlásit čím více se Go rozšíří (obecněji strategie přístupu méně je více, osvobození od dynamických závislostí), tím lépe.
Když moje oblíbená distribuce nemá balíček pro aplikační program, je fajn když binárka "just works" a to i na několika platformách, dva malé příklady:
https://github.com/peco/peco
https://github.com/asciimoo/wuzz
Řada aplikací z https://github.com/avelino/awesome-go by tu asi nebyla nebo ne v tak skvělé formě.
Já např. mohu doporučit (všechny najde na GitHubu):
https://grafana.com/
https://www.influxdata.com/time-series-platform/
https://traefik.io/
https://prometheus.io/
https://emitter.io/
BTW sdílím tvoji bolest s běhovým prostředím Java.
K minimalizaci nepoužívaného kódu běhového prostředí (zejména pro menší devices) směřují další iniciativy i na úrovni kernelu, např. https://next.redhat.com/2018/11/14/ukl-a-unikernel-based-on-linux/
Michal Mühlpachr
SW i HW v leteckém průmyslu musí splnit regulační podmínky, což prakticky znamená že nesmí překročit určitou poruchovost, což se před regulátorem prokazuje velmi různorodým a rozsáhlým testováním s měřením metrik např. MTBF. Neboli SW do letadla nemusí pracovat správně, stačí když pracuje správně do určité míry (obdobně jako HW). Důležitější je, aby SW byl použitelný.
Použitelně pro "hodně" lidí nemusí znamenat "hodně instalací", může to znamenat hodně pasažérů, kteří létají na SW a HW co prošel kritérii regulátora (ten v případě leteckého průmyslu často SW ani nerozumí a není to zásadní problém, letecká doprava je nejspolehlivější).
Není mi znám postup/technologie umožňující vyrobit 100% spolehlivý HW (fyzikální zákony - termodynamika, atd).
U SW takové postupy existují a jsou matematicky prokazatelné (používají se např. pro důvěryhodné výpočetní báze).
Existují výrobci leteckého HW (např. GE s motory pro malá letadla), kteří se v produktech vyhýbají zařazení SW do smyček řízení leteckého HW, protože dosažení potřebné spolehlivosti se zařazením SW je neekonomické (neúměrně nákladné).
Kam až nás v zásadě jednoduchá úvaha odnesla ;-)