Deus nie odchodź! Co my bez Ciebie zrobimy..? 4p już nie będzie takie samo bez Deusa... ;)
MarekR22 napisał(a)
Programista "wysoko pozimowy" ma stworzyć aplikację szybko i niezawodnie, więc kompilator/biblioteki dostarczają mu tonę gotowych uniwersalnych rozwiązań (wyjątki, obiekty, garbege colector). To jest programowanie jak w fabryce.
Nie czuję się, żebym programował jak w fabryce. Codziennie robię coś innego, uczę się ciekawych rzeczy. Jako programista "wysokopoziomowy" robię coś, z czego bezpośrednio będą korzystali ludzie. Zapewnienie im możliwości pracy np. poprzez stworzenie GUI spełniającego ich wszystkie, nieraz dziwne zachcianki nie zawsze bywa szybkie i łatwe. Zwłaszcza że często okazuje się, że te gotowe i uniwersalne rozwiązania w jakiejś realnej sytuacji nie spełniają wymagań.
Programista nisko pozimowy najczęściej musi pracować ze sprzętem i musi dbać o wydajność aplikacji (nie zapominając o obsłudze błędów, która musi zrobić sam, bo nie ma do dyspozycji wyjątków).
A wysokopoziomowy to nie musi dbać o wydajność?! Musi, tylko ta wydajność polega na czym innym - nie wykonywać niepotrzebnych operacji, nie tworzyć zbędnych obiektów, użyć biblioteki/klasy/metody najwydajniejszej w danym zastosowaniu, nie przeciążać bazy danych zbędnymi zapytaniami, itp.
Zaś obsługa błędów to tylko narzędzie i też trzeba umieć jej używać.
Nie ma co kryć zakres wiedzy i sprawność umysłowa takiego człowieka musi być o wiele większa.
Zakres wiedzy jest po prostu inny, a co do sprawności - myślą po prostu o innych rzeczach, tego nie ma jak porównać.
cyber_pl napisał(a)
Co to ma do rzeczy znam niemalze kazdy jezyk, jestem rozgarniety i znam dobrze angielski. A projektow i tak nie wypisze bo nic wam do tego.
A to do tego że w większości twoich postach widzimy że twoje 'doświadczenie' pochodzi z robienia zabawek nie używanych przez nikogo. poza tym takie cechy weryfikuje rzeczywistość (a.k.a. projekty) a nie twoje domniemanie o samym sobie.
Większość osób, z którymi się kłócisz pracują w realnym świecie, dla prawdziwych użytkowników, z nałożonym terminem, uzgodnionym zakresem funcjonalności i określonym budżetem. Każdy z nich już wyrósł z umierania za nieistotne sprawy. Nie mal żaden z nich nie miał takiego tupetu jak ty kiedy dopiero raczkował.
Co do twojego oskarżenia że wszyscy tu leją wodę to chyba wynika z faktu że jak ktoś zada ci konkretne pytanie to go albo unikasz albo ignorujesz.
Programista nisko pozimowy najczęściej musi pracować ze sprzętem i musi dbać o wydajność aplikacji (nie zapominając o obsłudze błędów, która musi zrobić sam, bo nie ma do dyspozycji wyjątków). W praktyce sprowadza się to wyłącznie do obsługo sprzętu (zwykle sterowników).
Wyjątki to potężne narzędzie i wcale nie takie łatwe do użycia. Kiedy rzucić wyjątek, kiedy go obsłużyć, jakie zasoby trzeba pozwalniać przed przepchnięciem wyjątku wyżej itp. Dużo łatwiej zasyfić kod ifami sprawdzającymi kody powrotu. Z resztą nawet tego się specjalnie nie robi. Malloc Linuksa nigdy nie zwróci NULLa - wiesz czemu? Bo twórcy stwierdzili, że i tak nikt nie sprawdza czy malloc się powiódł czy nie więc można wprowadzić leniwą alokację pamięci (przy pierwszym odwołaniu do niej).
A dbać o wydajność aplikacji to praktycznie każdy musi, tyle że w wysokim poziomie nie robi się tego na poziomi instrkucji tylko na poziomie algorytmów i designu. Chyba tylko w aplikacjach desktopowych nie trzeba się tak przejmować wydajnością a i pewnie to stwierdzenie nie jest do końca prawdziwe.
Nie ma co kryć zakres wiedzy i sprawność umysłowa takiego człowieka musi być o wiele większa.
Naprawde nie wiem skąd ten wniosek. Czy żonglowanie bitami według ustalonej specyfikacji jest takie trudne?
Pomijając dyskusję dwóch kolegów.
Moim zdaniem taki asembler a c++/pascal/czy inny podobny język to dwie zupełnie różne bajki, nie da się tego do końca porównywać. Dwa języki, wykorzystywane do w zasadzie dwóch różnych rzeczy. To trochę jak porównywać c++ i PHP, przyczym te języki mają chociaż podobną składnie.
Wbrew temu co uważa wiele osób sam c++, nie generuje kodu znacznie gorsze od kodu w asmie. Owszem zdarza mu się dodawać zbędne instrukcje ale kod jaki generuje nie jest tak zły jak próbują wmówić niektóre osoby. Co więcej kiepski / niedoświadczony programista asma który nie wie co robi xor rax,rax generuje często gorszy kod.
Samo mówienie o językach niższego wyższego poziomy jest bardzo niekonkretne, ponieważ nie jest jasno opisane gdzie zaczynają się języki niskiego poziomu a gdzie zaczynają wysokiego. Jeśli chcemy żeby inni nas zrozumieli lub chociaż uniknąć nieporozumień powinniśmy porównywać języki w jakiś grupach lub jakieś dwa konkretne między sobą.
Sam język czy poziom zależy moim zdaniem od zastosowania, budżetu itp.
To jest jak kopanie dołów, można łopatą(niskopoziomowo) ale można też koparką(wysokopoziomowo). Koparka niby przyspiesza sprawę ale najpierw trzeba się nauczyć ją obsługiwać niemniej nieumiejętnie używana łopata tez moze sie złamać.
Pozdro.
Języki niskopoziomowe są - jak sama nazwa wskazuje - dla niskopoziomowych (intelektualnie) ludzi.
Asembler to najprostszy język programowania ze wszystkich istniejących.
Ja programuję aktualnie w C++/Qt i SQLu,a wcześniej pasjonowałem się asemblerem.
Każdy z tych języków ma swoje mocne i słabsze strony,lecz moim zdaniem nieutrafionym jest tkwić jest na stanowisku,że któryś z języków jest "da best"-może być lepszy,ale tylko w konkretnej sytuacji,i innej lepszy będzie drugi.
Ze swego doświadczenia zaobserwowałem też,że asembler mimo wszystko dobrze jest znać (jakże mnie bawią twierdzenia,że goto jest be,i zawsze trzeba go unikać :-D ),a także technikę programowania hybrydowego asembler-C++,i pisać głównie w C++,z asemblera korzystając w razie potrzeby poprzez np wstawki _asm optymalizujące pętle,albo jakieś zewnętrzne funkcje skompilowane do .obj
Podaj przykład w którym lepiej użyć goto zamiast jakieś strukturalnej konstrukcji.
Ja znam tylko jeden: wyskakiwanie z zagnieżdżonych pętli, wątpie żeby był inny przypadek w którym goto może się przydać.
A ja nie znam - zagniezdzone petle wrzuca sie w metody/funkcje i jest czytelniej i jasniej i do tego bez mydlenia oczu goto.
A co do porownania. Niski poziom ma swoje bolaczki (duuuzo trzeba robic samemu), wyzszy ma swoje - dochodzi kwestia szerszej architektury, czesto wiekszej ilosci warstw, ciezej sie w tym polapac. Ktos, kto twierdzi, ze programowanie na wyzszym poziomie jest latwe, bo wystarczy klikac, nigdy nie widzial projektow pisanych przez co najmniej 3 osoby dluzej niz miesiac. Ani nie musial szukac bledow logicznych a duzej aplikacji, gdzie ktos zwalil architekture. Nie liczy sie wtedy jezyk, a zrozumienie dzialania aplikacji i PRZEDE WSZYSTKIM poprawka taka, zeby nic nie zepsuc.
Ja szukalem zarowno wyciekow czy naruszenia pamieci w duzych aplikacjach c++, jak i bledow logicznych w ladnych aplikacjach c#. I zadne nie jest latwe. A do pierwszego nie przydaje sie znajomosc asma, bo dostaje ladny zrzut pamieci, ktory sobie pozniej odpalam z aplikacja i dostaje na tacy, gdzie i ktory kawalek pamieci juz nie jest dostepny. Tyle, ze to i tak nie wszystko, bo jak zwykle blad tkwi pewnie w instrukcji wykonanej 1000 cykli wczesniej. W duzej aplikacji wielowatkowej nie wyobrazam sobie przegladania kodu asma w poszukiwaniu takiego bledu.
johny_bravo napisał(a)
A ja nie znam - zagniezdzone petle wrzuca sie w metody/funkcje i jest czytelniej i jasniej i do tego bez mydlenia oczu goto.
Wiesz ile cykli procesora i pamięci na stosie marnujesz na takie wywoływanie funkcji? Jaka to ogromna strata wydajności? Nie jesteś pr0 ;P
somekind napisał(a)
johny_bravo napisał(a)
A ja nie znam - zagniezdzone petle wrzuca sie w metody/funkcje i jest czytelniej i jasniej i do tego bez mydlenia oczu goto.
Wiesz ile cykli procesora i pamięci na stosie marnujesz na takie wywoływanie funkcji? Jaka to ogromna strata wydajności? Nie jesteś pr0 ;P
Noooo, az sie przejalem ;P Straszne stracic 5 cykli proca na "optymalizacje", zeby pozniej zyskac roboczogodzine kolegi z pracy na kazde zerkniecie w taki kod ;)
Szczególnie przy nowoczesnych kompilatorach, które mogą kod poskładać bądź podzielić wedle swoich przekonań. O generowaniu kodu w czasie linkowania nawet nie wspominam. Struktura kodu w językach wysokiego poziomu nie ma bezpośredniego przełożenia na niskopoziomową reprezentację.
... napisał(a)
Struktura kodu w językach wysokiego poziomu nie ma bezpośredniego przełożenia na niskopoziomową reprezentację.
milcz heretyku, cyber_pl i tak ci udowodni ze jest inaczej [diabel]
first.cpp:
#include "first.h"
int sum(int x, int y)
{
return x + y;
}
first.h:
#ifndef FIRST_H
#define FIRST_H
int sum(int x, int y);
#endif FIRST_H
second.cpp:
#include "first.h"
#include "second.h"
int callSum()
{
return sum(69, 666);
}
second.h:
#ifndef SECOND_H
#define SECOND_H
int callSum();
#endif
main.cpp:
#include <iostream>
#include "second.h"
int main()
{
std::cout << callSum() << std::endl;
}
listing z debuggera:
int main()
{
std::cout << callSum() << std::endl;
00401000 mov eax,dword ptr [__imp_std::endl (40203Ch)]
00401005 mov ecx,dword ptr [__imp_std::cout (402044h)]
0040100B push eax
0040100C push 2DFh
00401011 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402040h)]
00401017 mov ecx,eax
00401019 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (402038h)]
}
0040101F xor eax,eax
00401021 ret
Prosty projekt budowany pod Visualem. Kod podzielony na kilka funkcji w różnych modułach - podczas generacji kodu w czasie linkowania zredukowane do wyliczonej wartości.
cyber_pl nie udowodni, z jednego z innych serwisów:
cyber - 13-10-19:49 -- znikam z sieci na jakis czas, wyjezdzam w c**** daleko za granice
cyber - 13-10-19:49 -- moze bede za miesiac nie wiem na razie ludzie
Pewnie wyjechał inżyniera robić ;)
Może poszedł za radą somekinda...
somekind napisał(a)
@cyber_pl - masz rację z tym .NET i z tym, że jest beznadziejnie niewydajny. Myślałeś może już o tym, żeby pojechać do Redmont i dokonać aktu samospalenia przed siedzibą M$ w proteście przeciwko temu, że coś takiego wymyślili?