Różnica między językami i pracą w nich

0

Czy jest jakaś różnica w poziomie trudności między językami programowania np. c# a php i pracą w tych językach,
czy zależy to tylko od pracy

0

Nie ma żadnej. Jeśli znasz jeden - znasz wszystkie. Polecam zacząć naukę od brainfucka albo assembly.

1

Każdy język ma swoje smaczki i trudności. I tak aseembler na przykład jest do bólu prosty, wszystko jest napisane explicite i jest szybki, za to zbyt rozwlekły, żeby napisać w nim jakikolwiek czytelny kod produkcyjny w dzisiejszych czasach (może poza kawałkami firmware'u, choć i to ostatnio robi się w C++). Za to java jest potworna, długo się łąduje, dużo rzeczy dzieje się implicite, a jak sypnie wyjątkiem to stacktrace'y ci przewiną kilka ekranów, no ale za to jest przenośny i zwięzły. Coś za coś. Z javą jest też ten problem że wymusza praktyki OO, co czyni ją super językiem dla korpo, ale ja bym polecał najpierw zrozumieć po co OO zostało wynalezione, podobnie z maszynami wirtualnymi, itp. PHP z kolei nie jest językiem ogólnego przeznaczenia, więc jest z nim troche inaczej, nie nadaje się do niczego poza tworzeniem dynamicznych stron www i tu problemem jest pewna niekonsekwencja twórców. Gdbybym miał pomóc sobie zacząć od zera, zacząłbym od C i podstaw assemblera, co by zrozumieć na czym ta zabawa polega, zanim się zabiorę za super-hiper-niewiadomoco. Ja miałem fart, że zaczynałem w czasach gdy assembler jeszcze nie był aż takim tabu.
Co do opinii, że jak znasz jeden to znasz wszystkie to się tyczy raczej seniora. Nie wystarczy jeden. Tak naprawdę to jest raczej kwestia znajomości najważniejszych technik. Wtedy język jest rzeczywiście na tyle przejrzysty, że nie robi różnicy. Chyba że jest to LISP, Haskell czy FORTH (z całym szacunkiem dla tych języków, po prostu są inne)

3

A ja bym zaczął zupełnie odwrotnie do tego, co mówi Elwis. Zaczynając od języków niskiego poziomu (asm, C, C++) możesz się zniechęcić. Ja proponuję zacząć od wysokiego poziomu (np. C#) i jak już załapiesz o co chodzi w programowaniu, to wtedy schodzić niżej, aż dotrzesz z ciekawości do ASM i zobaczysz, jak to wszystko naprawdę działa. I warto to poznać, ale nie na początku.

1

To może kwestia czasów. aseembler i C dobrze mi szły jak byłem dzieciakiem. Java i C# są napełnione całą masą rzeczy, których zastosowania zrozumie dopiero senior. znajomość assemblera przynajmniej pokazuje, że to wszystko jest proste, w zasadzie wszystko co się dzieje to read i write z miejsca na miesce, czasem jakaś operacja na rejestrach. Aczkolwiek przyznaję, że metody uczenia assemblera mogą zniechęcić, bo na studiach np. zabierają się do tego beznadziejnie i jeśli nie masz dobrego, komunikatywnego hakera pod ręką rzeczywiście złym koniecznym może być nauka języka wysokiego poziomu.

Jeszcze co do pytania po co assembler — jak nie znasz assemblera, to twoja znajomość C jest średnia. Akurat to jest wspaniałe w C, że można dobrze przewidzieć wykonywalny kod. Naprawdę nie wiele jest tych szczegółów, ale są barzo ważne. To jak implementowane są funkcje (ramka stosu, rejestr ebp, instrukcje ret i call), jak implementowane są zmienne lokalne, globalne i statyczne. Kładę nacisk na to, bo nikt już nie używa „przenośności” C tylko przewidywalności i prostoty, a to wiąże się bezpośrednio z assemblerem.

BTW. to zabawne, że C++ już jest językiem niskiego poziomu. Jeszcze 15 lat temu ludzie mieli wątpliwości, czy C nim jestm xD

1

To zależy głównie od pracy, ale to język jest wybierany pod projekt i zwykle jest tak że PHP to w większości małe proste projekty,a c# bardziej skomplikowane. Oczywiście są wyjątki, ale na nie nie ma co patrzeć.

Za to java jest potworna, długo się łąduje, dużo rzeczy dzieje się implicite, a jak sypnie wyjątkiem to stacktrace'y ci przewiną kilka ekranów, no ale za to jest przenośny i zwięzły

Ja od dawna nie jest wolna ani tym bardziej zwięzła.

Z javą jest też ten problem że wymusza praktyki OO, co czyni ją super językiem dla korpo,

To chyba kolega nie wiedział korpo kodu w Javie. Obiektowość to jest może w nazwie.

Kto napisał coś sensownego, czego używa, w C albo assemblerze i poleca te języki na start niech pierwszy rzuci kamień. Uczyłem się C lata temu i wydawał mi się spoko. Ale jakiś czas temu wróciłem do niego żeby zrobić amatorski projekt na AVR. Skoro miałem do dyspozycji tylko 8Kb ROM i 1Kb RAM, wybrałem C. Projekt skończyłem, zajmował finalnie jakieś 6Kb po kompilacji i powiedziałem sobie że to ostatni raz. Następny będzie chociażby C++ ze składnia sprzed 20 lat, ale czyste C jest tak nieczytelne i pełne globalnych gówienek, że człowiek musi ogarniać cały projekt naraz. I dobra, da się przemęczyć jak to ma być tak mała skala jak podstawowe AVR, ale jeżeli ktoś proponuje naukę C nie w kierunku stricte elektroniki, to albo nie widział w życiu normalnego języka, albo jest zwykłym masochistą.

Assembler z kolei, zostawiam osobom wybitnie zaawansowanym, którzy program z C kompilowany do 9Kb chcą upchnąć w 8Kb, albo każdy cykl zegara ma dla nich znaczenie.

0
elwis napisał(a):

To może kwestia czasów. aseembler i C dobrze mi szły jak byłem dzieciakiem. Java i C# są napełnione całą masą rzeczy, których zastosowania zrozumie dopiero senior.

Ja zaczynałem od Basic'a na Atari i to też wszystko było proste. Jak przechodziłem na Turbo Pascala, to wszystko było takie skomplikowane i dziwne... ;)

Ale tak naprawdę to kwestia odpowiedniej nauki. Przełożenia linearnego ludzkiego sposobu myślenia na obiektowy. I to jest chyba największa trudność. Potem zostaje tylko nauka pewnych specyficznych mechanizmów języka. No i inżynieria oprogramowania.

BTW. to zabawne, że C++ już jest językiem niskiego poziomu. Jeszcze 15 lat temu ludzie mieli wątpliwości, czy C nim jestm xD

Spotkałem się ze stwierdzeniami, że C++ może być językiem zarówno wysokiego jak i niskiego poziomu. Zależy pod jakim kątem na to patrzymy (to samo tyczy się wszystkich innych języków).

Ja optuję jednak za takim rozróżnieniem:

  • język niskiego poziomu to język kompilowany, który potrzebuje do pracy jedynie systemu operacyjnego*
  • język wysokiego poziomu... no to w sumie wszystkie inne. Potrzebują do pracy innych programów (warstwy pośredniej)

*Nie wiem, czy assembler wymaga JAKIEGOKOLWIEK systemu, czy można go puścić niejako bezpośrednio na procesorze. Czy może tylko BIOS potrafi go ogarnąć. Ale w takim przypadku BIOS pełni rolę systemu operacyjnego. Więc jeśli można to zrobić bez jakiegokolwiek systemu, to wtedy język niskiego poziomu nie musi mieć systemu, ale może. W takim przypadku można by wprowadzić rozróżnienie na języki niskiego, średniego i wysokiego poziomu :D

0
Juhas napisał(a):

Ja optuję jednak za takim rozróżnieniem:

  • język niskiego poziomu to język kompilowany, który potrzebuje do pracy jedynie systemu operacyjnego*
  • język wysokiego poziomu... no to w sumie wszystkie inne. Potrzebują do pracy innych programów (warstwy pośredniej)

*Nie wiem, czy assembler wymaga JAKIEGOKOLWIEK systemu, czy można go puścić niejako bezpośrednio na procesorze. Czy może tylko BIOS potrafi go ogarnąć. Ale w takim przypadku BIOS pełni rolę systemu operacyjnego. Więc jeśli można to zrobić bez jakiegokolwiek systemu, to wtedy język niskiego poziomu nie musi mieć systemu, ale może. W takim przypadku można by wprowadzić rozróżnienie na języki niskiego, średniego i wysokiego poziomu :D

Żaden język nie jest rozpoznawany bezpośrednio przez procesor. Zawsze musi być skompilowany do kodu maszynowego, bez względu czy to ASM, C czy Python. Więc patrząc pod tym względem to żaden język nie jest językiem niskiego poziomu.

Zakładając jednak że chodziło Ci o to że skompilowany program z danego języka można odpalić bez systemu operacyjnego, to może warto olać PC i skierować się ku mikrokontrolerom, bo te zwykle go nie mają. I tak można odpalić kod z ASM, C, C++ czy nawet Java (link), więc idąc tym tokiem rozumowania nawet ta ostatnia jest językiem niskiego poziomu.

0

Zamiast zaczynać naukę na rok 2018 w C, może lepiej wystartować od Rust? Najbardziej lubiany język programistów.

1

BTW. to zabawne, że C++ już jest językiem niskiego poziomu. Jeszcze 15 lat temu ludzie mieli wątpliwości, czy C nim jestm xD

Podział "wysokiego / niskiego poziomu" pochodzi jeszcze z czasów, kiedy wybór polegał na tym, czy piszemy tradycyjnie w kodzie maszynowym lub czymś co trywialnie przekłada się na kod maszynowy (asm) czy może użyjemy któregoś z tych nowych, akademickich, ekstrawaganckich języków, jak C lub Fortran, w których (o zgrozo!) słowo pisane nie przekłada się w prosty sposób na kod maszynowy. Wtedy podział na języki niskiego poziomu i wysokiego poziomu miał sens.

Teraz jednak poziomów abstrakcji jest dużo więcej i kategoria języków wysokiego poziomu bardzo się rozrosła, a prawie nikt nie pisze wprost w kodzie maszynowym. W oryginalnym znaczeniu terminu "język wysokiego poziomu", C jest nadal jezykiem wysokiego poziomu, ale jednak w porównaniu z nowoczesnymi językami sprawia wrażenie języka bardzo prymitywnego, niskopoziomowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1