Jaki język programowania wybrać

Szczawik

1 Określenie żądanych cech języka
     1.1 Krok 1: Cel
     1.2 Krok 2: Przeznaczenie
     1.3 Krok 3: Platforma
     1.4 Krok 4: Środowisko programistyczne
2 Wybór na podstawie przedsięwzięcia
     2.5 Krok 1: Wyznaczone zadanie
     2.6 Krok 2: Programowanie wspólnie z inną osobą
     2.7 Krok 3: Metodyka tworzenia oprogramowania
3 Propozycja dla początkujących
     3.8 Krok 1: Zrozumienie idei programowania
     3.9 Krok 2: Zrozumienie działania systemu
     3.10 Krok 3: Specjalizacja zadań
     3.11 Krok 4: Poznanie teorii i doskonalenie
4 Cechy popularnych języków programowania
     4.12 Języki ogólnego przeznaczenia
          4.12.1 Assembler
               4.12.1.1 Kompilatory i środowiska
               4.12.1.2 Metodologie
               4.12.1.3 Wsparcie programowania multimediów
               4.12.1.4 Programowanie systemów operacyjnych i urządzeń peryferyjnych
               4.12.1.5 Komentarze
          4.12.2 Pascal, ObjectPascal
               4.12.2.6 Kompilatory i środowiska
               4.12.2.7 Metodologie:
               4.12.2.8 Wsparcie programowania multimediów
               4.12.2.9 Programowanie systemów operacyjnych i urządzeń peryferyjnych
               4.12.2.10 Komentarze
          4.12.3 Delphi, Delphi .NET
               4.12.3.11 Kompilatory i środowiska
               4.12.3.12 Metodologie
               4.12.3.13 Wsparcie programowania multimediów
               4.12.3.14 Programowanie systemów operacyjnych i urządzeń peryferyjnych
               4.12.3.15 Komentarze
          4.12.4 C/C++
               4.12.4.16 Kompilatory i środowiska
               4.12.4.17 Metodologie
               4.12.4.18 Zastosowania
               4.12.4.19 Komentarze
          4.12.5 C#
               4.12.5.20 Kompilatory i środowiska
               4.12.5.21 Wsparcie programowania multimediów
               4.12.5.22 Komentarze
          4.12.6 Java
               4.12.6.23 Kompilatory i środowiska
               4.12.6.24 Metodologie
               4.12.6.25 Wsparcie programowania multimediów
               4.12.6.26 Programowanie systemów operacyjnych i urządzeń peryferyjnych
               4.12.6.27 Wsparcie dla aplikacji sieciowych
               4.12.6.28 Komentarze
          4.12.7 Python
               4.12.7.29 Kompilatory/interpretery
               4.12.7.30 Metodologie
               4.12.7.31 Najczęstsze zastosowania
               4.12.7.32 Komentarze
     4.13 Języki do obsługi stron internetowych - po stronie serwera
          4.13.8 PHP: Hypertext Preprocessor
               4.13.8.33 Środowiska
               4.13.8.34 Metodologie
               4.13.8.35 Wsparcie programowania technologii
               4.13.8.36 Programowanie urządzeń peryferyjnych
               4.13.8.37 Komentarze
     4.14 Języki opisu oraz przetwarzania tekstu i danych
          4.14.9 Regex (wyrażenia regularne)
               4.14.9.38 Kompilatory/interpretery
               4.14.9.39 Metodologie
               4.14.9.40 Komentarze
          4.14.10 [[XSL]] ([[XHTML]], [[XSLT]], [[XSL]], [[XPath]], [[XQuery]], [[XSQL]])
               4.14.10.41 Kompilatory/interpretery
               4.14.10.42 Metodologie
               4.14.10.43 Komentarze:

Porada ta znalazła się tutaj, gdyż stanowi sedno działu FAQ (Frequently Asked Questions - Często Zadawane Pytania). Jest jednym z najczęściej zadawanych pytań, jakie okazje mają gościć na tym forum. Niniejszy tekst ma za zadanie pomóc Tobie, użytkowniku, w odpowiedzi na to pytanie, jednak sam nie zawiera bezpośredniej odpowiedzi, a jedynie wskazówki, czym się kierować, przy podejmowaniu decyzji.

Określenie żądanych cech języka

Krok 1: Cel

Określenie celu jest podstawowym pytaniem, od którego należy rozpocząć wybór języka. Z bardzo dużym prawdopodobieństwem zaliczasz się do przynajmniej jednej z kategorii:
#Chcesz się uczyć programowania z własnej, nieprzymuszonej woli.
#Masz ochotę zrealizować określony projekt.
#Interesują cię nowe technologie lub zagadnienia
#Chciałbyś zaimponować kolegom, znajomym, wykładowcom.
#Potrzebujesz się nauczyć programowania do szkoły, na studia, na egzamin, etc.
Jeśli nie zaliczasz się do 5 z wyżej wymienionych grup, polecam zapoznanie się z całą treścią porady. W przeciwnym wypadku, został Tobie prawdopodobnie narzucony język programowania oraz środowisko, a niejednokrotnie nawet i styl programowania. W takiej sytuacji raczej postaraj się zapoznać ze stawianymi wymaganiami, zamiast samemu podejmować decyzję. Oczywiście, jeśli mimo wszystko chcesz wybrać język programowania samemu, zapraszam do dalszej lektury.

Krok 2: Przeznaczenie

Języków programowania jest bardzo dużo. Ich zastosowanie jest również niebywale szerokie. Na poniższym plakacie możesz poznać najpopularniejsze z języków oraz czas ich opracowania:

Plakaty:
*O'Reilly - History Of Programming Languages (do stycznia 2004)
*Computer Languages History (uaktualniany)

Języki programowania - szeroko rozumiane - można podzielić na następujące kategorie:
#skryptowe (np.: skrypty powłoki systemu operacyjnego)
#obsługi stron internetowych - po stronie serwera (np.: PHP, JSP)
#obsługi stron internetowych - po stronie klienta (np.: JavaScript (EcmaScript), JScript, VBScript, ActionScript)
#opisu dokumentów (np.: HTML, TeX)
#opisu danych (np.: XML)
#przetwarzania tekstu i danych (np.: AWK, Perl)
#programowania baz danych (np.: PL/SQL)
#ogólnego przeznaczenia (np.: C++, C#, Delphi, Java, Assembler)
Powyższy podział nie jest formalną kategoryzacją, ale orientacyjnym zestawieniem, głównie dla osób początkujących, które decydują się na wybór języka. Wiele języków ma bardzo podobną składnię (na przykład C++ oraz PHP). Jeśli po prostu chcesz tworzyć programy i powyższy podział nic Ci nie mówi, zapewne zainteresują Cię języki ogólnego przeznaczenia lub języki obsługi stron internetowych. Podjęcie określonej decyzji na tym etapie może narzucać dalszy wybór, więc - jeśli jeszcze nie podjąłeś decyzji - zapoznaj się z dalszą częścią tego opracowania.

Krok 3: Platforma

Jako platformę przyjmijmy ogół programowania systemowego oraz dodatkowego, wraz ze sprzętem, na których bazował będzie stworzony przez Ciebie program. Platformą może być sam sprzęt (np.: Assembler na procesory 8051), system operacyjny (większość języków ogólnego przeznaczenia), specjalne oprogramowanie tworzące 'maszynę wirtualną' (np.: Java), oprogramowanie dedykowane (języki skryptowe, języki obsługi stron internetowych, języki programowania baz danych), system operacyjny z określonymi dodatkowymi bibliotekami (np.: języki z rodziny .NET).

Możesz skupić się na określonym rozwiązaniu, na przykład wybierając programowanie wyłącznie pod systemy Windows lub pisanie skryptów pod powłoki dla systemów Linux, albo możesz skierować swoje działania w stronę rozwiązań przenośnych (crossplatform - wieloplatformowych) (np.: Java, języki opisu danych, języki obsługi stron internetowych), albo wręcz rozwiązań mobilnych (np.: Java - JME).

Krok 4: Środowisko programistyczne

O tym, jakie wybierzesz środowisko programistyczne, w dużej mierze zadecydują nie tylko twoje chęci, ale również zasobność portfela. Jeśli chcesz pisać skrypty dla aplikacji, musisz liczyć się z tym, że twoja platforma docelowa nie będzie darmowa. Tak samo jest w przypadku języków ogólnego przeznaczenia - środowisko programistyczne, kompilator oraz debugger mogą być kosztowne.

Jeśli chcesz się tylko pobawić w programowanie lub nauczyć i korzystać wyłącznie do własnych potrzeb, rozejrzyj się za darmowymi środowiskami, a nawet oprogramowaniem open-source. W przypadku tego segmentu rynku aplikacji, open-source nie koniecznie musi oznaczać oprogramowanie gorsze lub uboższe, a niejednokrotnie oznacza właśnie oprogramowanie bardziej popularne i dostępne. Warto przemyśleć taki wybór.

Wiele dużych korporacji również wydaje wersje darmowe swoich produktów. Często - choć nie zawsze - są one ograniczone pod względem funkcjonalności lub licencji, ale czy naprawdę potrzebujesz zaawansowanych modułów lub bibliotek, kiedy uczysz się podstaw? Sądzę, że nie. Jednak warto zwrócić uwagę na treść licencji: czy zezwala na wykorzystanie komercyjne lub rozpowszechnianie.

Pewne języki programowania mogą nie być dostępne pod niektóre platformy, lub nie mieć darmowych środowisk programistycznych. Wybierając narzędzie dostosowane dla swoich potrzeb, weź to pod uwagę.

Wybór na podstawie przedsięwzięcia

Krok 1: Wyznaczone zadanie

Często zdarza się tak, że zdecydowałeś już, co chcesz robić, a jedynym znakiem zapytania jest język programowania. Zanim zaczniejsz realizować zadanie, zastanów się, czy wybrane narzędzie jest dla ciebie najlepszym. Poniżej znajdziesz kilka porad, zastanów się nad każdą z nich:
#Wybierz język, który jest podobny do czegoś, co znasz. Jeśli znasz doskonale język C, może lepiej będzie zrealizować projekt w C++ zamiast w Delphi, albo w PHP zamiast CGI - zależnie jaki projekt realizujesz.
#Wybierz język, do którego środowisko jest popularne i dostępne - będziesz miał większą szansę, że ktoś odpowie na twoje pytania lub znajdziesz dla siebie odpowiednią publikację.
#Wybierz język, do którego dostępne są biblioteki, przykłady lub moduły, mogące pomóc w realizacji zadania. Zwróć uwagę na ich dostępność, zgodność, poprawność działania i licencję.
#Zastanów się, czy przy wykonaniu projektu nie będzie potrzebna dodatkowa nauka, której początkowo nie przewidziałeś. Jeśli znasz jakiś język z rodziny .NET, z bardzo dużym prawdopodobieństwem w innym języku .NET określone zadanie realizuje się w podobny lub taki sam sposób.
#Wybierz język, który oszczędzi Ci pracy - po co pisać w assemblerze, skoro skrypt (*.bat) dla systemu Windows wykona zadanie równie dobrze, a jego kod będzie krótszy i mniej skomplikowany - co ułatwi ewentualną modyfikację.

Krok 2: Programowanie wspólnie z inną osobą

Gdy pisanie programu będzie wspierane fragmentami kodu, stworzonymi przez inną osobę, lub będzie ona współtworzyła program na bieżąco, warto zainteresować się trzema rozwiązaniami:
#Wybrać wspólny język, który jedna z osób zna najlepiej.
#Wybrać języki pozwalające na tworzenie bibliotek lub modułów i i wykorzystanie tych, stworzonych w innych językach.
#Wybrać języki, które potrafią ze sobą współpracować (np.: PHP + JavaScript)
Powyższe rozwiązania mogą być przydatne nawet wtedy, gdy aplikację tworzy tylko jedna osoba. Pewne elementy łatwiej tworzyć w określonych językach i środowiskach, inne w innych.

Krok 3: Metodyka tworzenia oprogramowania

Jeśli już znasz jakieś języki programowania, może przywykłeś do określonej metodyki programowania. Jeśli jesteś początkującym, łatwiej będzie się Tobie dostosować do narzuconego podejścia, a możliwości są następujące:
#Programowanie liniowe
#Programowanie proceduralne
#Programowanie stanowe
#Programowanie funkcyjne
#Programowanie deklaratywne
#Programowanie strukturalne
#Programowanie obiektowe
#Programowanie aspektowe
#Programowanie logiczne
#Programowanie generyczne
#Programowanie intencyjne
#Programowanie ekstremalne
#Programowanie zdarzeniowe
#Programowanie agentowe
#Programowanie wieloparadygmetowe
Określone języki programowania nie zezwalają lub po prostu nie dają możliwości użycia niektórych z powyższych podejść, faworyzując inne. Ucząc się kolejnego języka, zwróć uwagę, czy nowy język programowania wspiera podejście, do którego jesteś przyzwyczajony.

Propozycja dla początkujących

Jeśli, mimo przeczytania powyższego tekstu, nie wiesz co wybrać, programowanie wciąż kojarzy Ci się wyłącznie z tworzeniem plików wykonywalnych, a pojęcie metodyka jest Ci całkowicie obce, w tym artykule znajdziesz wskazówki, jak możesz zacząć. Ponieważ podejście do tego tematu jest całkowicie subiektywne, należy je traktować wyłącznie jako propozycję dla początkujących.

Krok 1: Zrozumienie idei programowania

Początek przygody z programowaniem warto rozpocząć od wysokopoziomowego programowania w języku ogólnego przeznaczenia (na przykład C/C++, C#, Java czy Delphi) z wykorzystaniem środowiska RAD (Rapid Application Development). Z jednej strony, łatwość skomponowania aplikacji z gotowych komponentów i kontrolek pozwala na szybkie osiąganie widocznych efektów i nie zniechęca. Z drugiej, podstawowym na tym etapie nie jest wcale poznanie dostępnych komponentów i ich właściwości, ale zrozumienie budowy programu komputerowego, jego zadań oraz sposobów opisu jego działania. Celem jest zrozumienie takich konstrukcji jak pętle, warunki, funkcje czy wykorzystanie zmiennych i stałych. Dlatego też niepolecanym jest rozpoczynanie nauki od języków bez ścisłego typowania (PHP, języki skryptowe) - trudniej przyzwyczaić się potem do "ograniczeń" innych języków.

Po pierwsze, naucz się pisać programy Hello world!. Są to proste aplikacje, których jedynym zadaniem jest pokazanie użytkownikowi napisu o określonej treści. Musisz zrozumieć, że cztery podstawowe funkcje programu komputerowego to:

  1. wypisanie danych na urządzenie wyjściowe (ekran, drukarka, etc),
  2. wczytanie danych z urządzenia wejściowego (klawiatura, myszką),
  3. prowadzenie obliczeń,
  4. obsługa urządzeń.

Program Hello world! pokaże Ci, jak wykonuje się pierwszą z nich.

Po drugie, sięgaj do kursów - nie jesteś jedyną osobą, która uczyła się danego języka programowania. Na pewno znajdziesz opis krok po kroku, jak zacząć programować; zapoznaj się z językiem i poczytaj o nim, zanim zaczniesz o niego pytać innych.

Po trzecie, znajdź i poznaj dokumentację. To chyba najważniejsze i najtrudniejsze zadanie w nauce programowania. Nie da się programować, nie znając dostępnych procedur czy komponentów. Często dokumentację znajdziesz w samym środowisku programowania lub instalowaną razem z kompilatorem, czasem będziesz musiał pobrać ją z internetu. Naucz się z niej korzystać sprawnie.

Krok 2: Zrozumienie działania systemu

Z czasem zaczniesz się zastanawiać dlaczego coś działa tak, a nie inaczej, albo jak wykonać jakieś zadanie. Na tym etapie nie tylko dokumentacja do języka programowania może być przydatna, ale również opisy architektury komputerów czy systemu operacyjnego. Typowymi problemami na tym etapie mogą być na przykład zaobserwowanie niedokładności obliczeń na liczbach rzeczywistych (zmiennoprzecinkowych) czy zbyt małe rozmiary typów zmiennych.

Zamiast zakładać, że tak po prostu jest, dowiedz się dlaczego. Może znajdziesz opis w dokumentacji do języka programowania, może w odpowiedzi na jakimś forum, a może na Google.

Krok 3: Specjalizacja zadań

W pewnym momencie dostrzeżesz, że w tematach zadań, które starasz się realizować pojawiają się pewne standardy pokrewne (z przechowywaniem danych wiążą się między innymi języki zapytań SQL lub dokumenty XML; z generowaniem stron internetowych PHP czy JSP, a z ich prezentacją HTML czy Java Script). Zacznij z nich korzystać: nie dość, że ułatwią realizację Twojego zadania, to jeszcze poszerzą Twoją wiedzę.

Cóż z tego, że jest to inny język? Skoro wykonałeś dwa powyższe kroki, znasz mechanizmy i ideę działania komputerów oraz programowania - pozostaje tylko poznać podejście do zagadnienia oraz polecenia nowego języka. W pewnym momencie dojdziesz do wniosku, że języki tworzą pewne rodziny o podobnej składni lub z dostępnymi tymi samymi funkcjami, a tylko odmiennym zastosowaniu.

Krok 4: Poznanie teorii i doskonalenie

Ostatni krok jest niezbędny do opanowania programowania, a jednocześnie bardzo często pomijany przez osoby uczące się samodzielnie.

Każda dziedzina posiada podstawy teoretyczne. Tak samo dziedzina informatyki, jaką jest programowanie - w skład teorii wchodzi nie tylko wykorzystanie języka, nomenklatura (wykorzystywane pojęcia i terminy), ale i projektowanie aplikacji. Tymi pierwszymi zagadnieniami zajmuje się algorytmika, ostatnimi z kolei się dział zwany inżynierią programowania.

Algorytmika pozwala znaleźć dopracowane rozwiązania typowych problemów programistycznych lub matematycznych, w tym sortowania, szukania ekstremów funkcji, synchronizacji zadań. Znajomość kilku języków programowania nie oznacza, że wszystko, co da się napisać, Ty potrafisz stworzyć w sposób optymalny. Warto poznać dostępną literaturę i rozwiązania proponowane przez innych.

Inżynieria oprogramowania definiuje sposoby modelowania i opisu pracy aplikacji, sposoby opisu danych, a nawet interakcji z systemem. Poznanie tej dziedziny daje możliwość szerszego spojrzenia na problem, jego analizy z różnych perspektyw, a także ułatwia komunikację z innymi osobami.

Cechy popularnych języków programowania

Języki ogólnego przeznaczenia

Assembler

Kompilatory i środowiska

*NASM (DOS, Windows, Linux) *FASM (DOS, Windows, Linux, Unix libc, MenuetOS) *MASM32 (DOS, Windows) *TASM (DOS, Windows) *ASM'51 dla Linux (Linux: μC 8051) *MacroAssembler 8051 dla DOS (DOS: μC 8051)

Metodologie

##Najpopularniejsze: liniowa, proceduralna ##Niedostępne: funkcyjna, deklaratywna, generyczna, zdarzeniowa, agentowa

Wsparcie programowania multimediów

*Grafika 2D: **liczne biblioteki dodatkowe *Grafika 3D: **liczne biblioteki dodatkowe *Dźwięk: **liczne biblioteki dodatkowe *Filmy: **liczne biblioteki dodatkowe *Kontrolery gier: **liczne biblioteki dodatkowe

Programowanie systemów operacyjnych i urządzeń peryferyjnych

*Możliwe *Wygodne *Zalecane *Popularne i szeroko propagowane *Popularne programowanie sterowników sprzętowych i mikrokomputerów

Komentarze

*Często nauczany *Trudny do nauki podstaw programowania *Łatwy do nauki podstaw architektury komputerów *Dobrze napisany program może działać bardzo szybko i mieć małe rozmiary *Kod jest na ogół obszerny i mniej czytelny niż kod języków wyższego poziomu *Istnieje możliwość odtworzenia każdego kodu maszynowego do kodu assemblera *W innych językach istnieje możliwość tworzenia wstawek kodu assemblera *Ponieważ programy pisane w assemblerach, dedykowanych systemom operacyjnym komputerów osobistych, bazują bezpośrendnio na rozkazach procesora i funkcjach systemu operacyjnego, możliwe jest wykorzystanie bibliotek tworzonych dla innych języków, na przykład do obsługi multimediów *Popularny

Pascal, ObjectPascal

Kompilatory i środowiska

*[Borland] Pascal (DOS, Windows) *FreePascal (DOS, Windows, Linux, FreeBSD, Mac OS classic, Mac OS X/Darwin, OS/2, Netware classic, Netware libc, MorphOS, SkyOS)

Metodologie:

*Najpopularniejsze: liniowa, proceduralna, strukturalna, generyczna (dostępna w FPC) *Niedostępne: logiczna, deklaratywna, zdarzeniowa, agentowa

Wsparcie programowania multimediów

*Grafika 2D: **[Borland] (DOS) [[Pascal/BGI]] **[Borland] (Windows) [[Pascal/OWL]] *Grafika 3D: **liczne biblioteki dodatkowe *Dźwięk: **liczne biblioteki dodatkowe *Filmy: **brak *Kontrolery gier: **liczne biblioteki dodatkowe

Programowanie systemów operacyjnych i urządzeń peryferyjnych

*Możliwe *Niewygodne *Mało popularne

Komentarze

*Często nauczany *Łatwy do nauki podstaw *Popularny

Delphi, Delphi .NET

Kompilatory i środowiska

*[Borland] Delphi (Windows) *[Borland] Kylix (Linux) *Lazarus oparty na kompilatorze FreePascal - wykorzystanie środowiska Lazarus pozwala wprowadzić do użycia metodologię zdarzeniową i agentową, przez co programowanie w nim jest bliższe Delphi niż ObjectPascal

Metodologie

*Najpopularniejsze: proceduralna, obiektowa, zdarzeniowa, agentowa, generyczna (dostępna w nowych wersjach) *Niedostępne: Logiczna, deklaratywna

Wsparcie programowania multimediów

*Grafika 2D: **[Borland] [[Delphi/VCL]] **liczne biblioteki dodatkowe *Grafika 3D: **liczne biblioteki dodatkowe *Dźwięk: **liczne biblioteki dodatkowe *Filmy: **liczne biblioteki dodatkowe *Kontrolery gier: **liczne biblioteki dodatkowe

Programowanie systemów operacyjnych i urządzeń peryferyjnych

*Nie możliwe

Komentarze

*W niektórych wersjach obsługuje platformę .NET *Wiele nagłówków bibliotek dodatkowych musi być przepisanych spacjalnie dla Delphi, przez co często najnowsze wersje bibliotek nie są szybko dostępne *Często nauczany *Łatwy do nauki podstaw *Łatwy w użyciu *Środowiska są narzędziami RAD *Popularny

C/C++

Kompilatory i środowiska

*Microsoft Visual C++ Toolkit (Windows), Microsoft Visual C++ (Windows) (również jako składnik Visual Studio 2008, darmowe w wersji Express Edition) *GNU Compiler Collection [gcc] (Windows, DOS, Unix, Linux, FreeBSD, OS/2, ELF, ...) - zawiera w sobie g++ *[Borland] C++ Builder (Windows), Borland BuilderX (Windows, Linux, Solaris) *Bloodshed Dev C++ - oparty na gcc *Intel C++ Compiler (Windows, Linux, embedded) *Macintosh Programmer's Workshop (MacOS) *LCC (Windows)

Metodologie

- najpopularniejsze: programowanie proceduralne, programowanie obiektowe, programowanie zdarzeniowe, programowanie generyczne (poprzez wzorce) - dostępna z wykorzystaniem zewnętrznych bibliotek: programowanie aspektowe, programowanie agentowe - niedostępne: programowanie deklaratywne, programowanie logiczne

Zastosowania

- programowanie gui *[Borland] [[Delphi/VCL]] - programowanie aplikacji sieciowych - programowanie gier **[Microsoft] DirectX - analiza gramatyczna (parsing) - obliczenia naukowe, numeryczne, symulacje - programowania multimediów: * grafiki 2D **[DJGPP][[C/Allegro]] **[Microsoft] DirectDraw * grafiki 3D **[Microsoft] Direct3D **[SGI] OpenGL **GLUT * muzyki i dźwięku **[Microsoft] DirectSound, DirectMusic **OpenAL **ALUT **[Creative] EAX **ALSA - programowanie systemów operacyjnych i urządzeń peryferyjnych *Możliwe *Wygodne *Zalecane *Popularne i szeroko propagowane (często we współpracy z assemblerem) *Popularne programowanie sterowników sprzętowych i mikrokomputerów

Komentarze

*W niektórych wersjach obsługuje platformę .NET *Wiele nagłówków bibliotek jest początkowo pisanych dla C/C++, przez co są bardzo szybko dostępne. *W dużej mierze programowanie systemów Linux/Unix opiera się na języku C, podobnie jak WinAPI (które można oczywiście wykorzystać w wielu językach, na przykład w Delphi) *Bardzo często nauczany *Łatwy do nauki podstaw *Łatwy w użyciu *W większości środowiska są narzędziami RAD *Popularny

C#

(zalążek)

Kompilatory i środowiska

*[[C_Sharp/Csc]] darmowy kompilator sterowany z wiersza poleceń, dostępny po zainstalowaniu Microsoft .NET Framework *Microsoft Visual C# (Windows) (również jako składnik Visual Studio 2008, darmowe w wersji Express Edition) *Borland C# Builder (w pakiecie Developer Studio 2006 lub Delphi 2005) *SharpDevelop - open-sourcowe IDE na platformę .NET *MonoDevelop - open-sourcowe IDE na platformę Mono (stworzony na podstawie SharpDevelop)

Wsparcie programowania multimediów

*Grafika 2D: **Managed DirectX **liczne biblioteki dodatkowe *Grafika 3D: **Managed DirectX **OpenGL **liczne biblioteki dodatkowe *Dźwięk: **Managed DirectX **liczne biblioteki dodatkowe *Filmy: **Managed DirectX **liczne biblioteki dodatkowe *Kontrolery gier: **Managed DirectX **liczbe biblioteki dodatkowe - programowanie systemów operacyjnych i urządzeń peryferyjnych: *Niemożliwe tworzenie systemów operacyjnych (aczkolwiek ciekawostkę stanowi system Microsoft Singularity, w większości tworzony w C#)

Komentarze

*Przeznaczony do pisania pod platformą .NET i w jej obrębie całkowicie przenośny *Dostępne środowiska są narzędziami RAD *Coraz bardziej popularny *Bardzo dobrze wyposażona biblioteka standardowa (przestrzeń nazw [[C_Sharp/System]])

Java

Kompilatory i środowiska

*Sun Java 2 Platform (Windows, Linux, Solaris) *GNU Compiler Collection [gcc] (Windows, DOS, Unix, Linux, FreeBSD, OS/2, ELF, ...) - zawiera w sobie gcj *Oracle JDeveloper (wymagana maszyna wirtualna Javy) *NetBeans IDE (Windows, Linux, Mac OS X, Solaris) *Eclipse (wymagana maszyna wirtualna Javy)

Metodologie

*Najpopularniejsze: obiektowa, zdarzeniowa; od wersji 5: deklaratywna, generyczna *Niedostępne: liniowa, logiczna

Wsparcie programowania multimediów

*Grafika 2D: **wbudowane w środowisko **AWT **JFC/Swing **Java2D **liczne biblioteki dodatkowe *Grafika 3D: **wbudowane w środowisko **Java3D **Java OpenGL **Xith3D **liczne biblioteki dodatkowe *Dźwięk: **wbudowane w środowisko **Java Media Framework **liczne biblioteki dodatkowe *Filmy: **Java Media Framework *Kontrolery gier: **JInput **liczne biblioteki dodatkowe

Programowanie systemów operacyjnych i urządzeń peryferyjnych

*Tworzenie systemów operacyjnych jest możliwe, ale część kodu musi być w innym języku, np. JNode *Bardzo popularne programowanie urządzeń mobilnych (w tym telefonów komórkowych) *Popularne programowanie urządzeń o ograniczonych zasobach, w tym sterowników np. AGD

Wsparcie dla aplikacji sieciowych

*Specyfikacja EE (Enterprise Edition) przeznaczona do tworzenia aplikacji sieciowych *Dużo dobrych i rozbudowanych frameworków sieciowych; najpopularniejsze: **Apache Struts **Spring Framework

Komentarze

*Często nauczany *Bardzo popularny *Aplikacje, dedykowane pod maszynę wirtualną, bez ponownej kompilacji uruchamiają się na każdym systemie z zainstalowaną maszyną wirtualną Javy *Programy w trybie maszyny wirtualnej uruchamiają się wolniej niż programy kompilowane pod specyficzny system *Od wersji 6 posiada wsparcie dla języków skryptowych (Ruby, Java Script, Perl itp.) *Maszyna wirtualna Javy zapewnia wysoki poziom bezpieczeństwa, pozwala dokładnie określić przywileje aplikacji *W niektórych wersjach obsługuje platformę .NET

Python

Kompilatory/interpretery

- CPython (DOS, Windows, Unix) - MacPython (MacOS X) - ActivePython (Windows, Unix, MacOS) - Jython (Java Virtal Machine) - IronPython (.NET/Mono) - na urządzenia przenośne: Palm OS, Psion, Sharp Zaurus, Symian OS series 60, Windows CE (Pocket PC), dostępne na oficjalnej stronie Python Software Fundation. - ponadto z oficjalnej strony Python Software Fundation można pobrać wersje dla kilkunastu innych platform, m. in. PlayStation.

Metodologie

- najpopularniejsze: * programowanie obiektowe, * programowanie strukturalne, * programowanie funkcyjne * programowanie zdarzeniowe, * programowanie generyczne, - popularne, dostępne przez zewnętrzne biblioteki: * programowanie aspektowe, * programowanie agentowe, - niepopularne: * programowanie logiczne, * programowanie z ograniczeniami, * programowanie stanowe - niedostępne: * programowanie deklaratywne

Najczęstsze zastosowania

- programowanie gui - programowanie stron internetowych oraz aplikacji sieciowych - programowanie gier - analiza gramatyczna (parsing) - obliczenia naukowe, numeryczne, symulacje - język skryptowy osadzony m. in. w GIMP, Vim, Blender, Maya. Więcej aplikacji... - programowania multimediów: * grafiki 2D * grafiki 3D: PyOpenGL, PySDL, PyGame, PyQt4 * muzyki i dźwięku - programowanie urządzeń peryferyjnych: * możliwość oprogramowania mikrokontrolerów (np. PyMite) oraz niektórych urządzeń zewnętrznych z wbudowanym interpreterem. Istnieje też możliwość oprogramowania sterowników przy wykorzystaniu modułów napisanych w C. Jednak żadne z tych zastosowań nie jest popularne.

Komentarze

- niektóre wersje potrafią działać na platformach .NET (IronPython), Java Virtual Machine (Jython), Parrot, PyPy - bardzo czytelny (konstrukcje zbliżone do pisanego języka angielskiego) i łatwy do nauki podstaw programowania - umożliwia wydajne tworzenie oprogramowania - zawiera dużą bibliotekę modułów - zalecany jako język do tworzenia prototypów (możliwość szybkiego stworzenia działającego oprogramowania) - umożliwia łatwą współpracę z modułami napisanymi w C/C++ (m. in. CPython), dzięki czemu może być wykorzystywany również w systemach wymagających dużej wydajności (pomimo, że program wykonywany jest na maszynie wirtualnej) - zapewnia dużą przenośność - łatwy w osadzaniu w większych aplikacjach jako język skryptowy

Języki do obsługi stron internetowych - po stronie serwera

PHP: Hypertext Preprocessor

Środowiska

*Serwer HTTP (np. Apache, Microsoft IIS lub inny) ze skonfigurowanym silnikiem PHP *Zend Studio - IDE dla Windows, Linux, Macintosh *WinBinder - tworzenie aplikacji z GUI dla Windows

Metodologie

*Najpopularniejsze: proceduralna, strukturalna, obiektowa *Niedostępne: zdarzeniowa

Wsparcie programowania technologii

*Grafika 2D: **PHP GD **PHP Smarty **PHP-GTK *Bazy danych: **ogólna biblioteka PDO **liczne biblioteki dedykowane konkretnym systemom bazodanowym *Usługi sieciowe: **liczne biblioteki dedykowane usługom

Programowanie urządzeń peryferyjnych

*Możliwe generowanie stron dostępnych przez urządzenia przenośne i mobilne (na przykład stron WAP)

Komentarze

*Darmowy silnik rozpowszechniany na zasadach Open-Source *Przejrzysta i łatwa do opanowania składnia z rodziny języków "C-podobnych" *Bardzo popularny, jako język bazowy, do tworzenia dynamicznych serwisów www *Posiada szerokie wsparcie komunikacji z serwerami baz danych i usług sieciowych

Języki opisu oraz przetwarzania tekstu i danych

Regex (wyrażenia regularne)

Kompilatory/interpretery

*mini język osadzany w wielu innych językach i programach m. in. edytorach tekstu (np. VIM, EditPlus), narzędziach systemowych (np. grep, find, sed)

Metodologie

*Najpopularniejsze: deklaratywna

Komentarze

*Występuje w wielu odmianach m. in. Unix, POSIX, Emacs i Perl *Składnia Perl jest jedną z najbardziej rozbudowanych i czytelnych, z tego względu jest stosowana (czasem z niewielkimi zmianami) w wielu językach programowania (m. in. [[PHP/Wyrażenia_Regularne_(Regular_Expression)|PHP]], Python, [[C_Sharp/Regex|C#]]), stąd często są określane mianem PCRE (ang. Perl Compatible Regular Expressions).

[[XSL]] ([[XHTML]], [[XSLT]], [[XSL]], [[XPath]], [[XQuery]], [[XSQL]])

Kompilatory/interpretery

*dostępne poprzez biblioteki języków programowania, m. in. w Perl, [[Python]], [[C]], [[PHP]] *osadzone w przeglądarkach internetowych ([[XHTML]], [[XSL/XSLT]], [[XSL/XPath]], [[XSL/XSL-FO]]) *dostępne poprzez biblioteki serwerów baz danych lub środowisk je obsługujących ([[XQuery]], [[XSQL]] *samodzielne procesory: **Apache FOP, **Apache Xalan, **Sablotron, **Saxon

Metodologie

*deklaratywna, *funkcyjna

Komentarze:

*Wszystkie języki z tej grupy mają składnię zgodną ze standardem [[XML]] (n.p.: [[XSL-FO]]) lub są wykorzystywane poprzez zagnieżdżanie ich instrukcji wewnątrz zapisu zgodnego z [[XML]] (n.p.: [[XSQL]] - język [[SQL]] osadzony w dokumencie zgodnym z [[XML]]). *Zależnie od konkretnego języka opisu, mogą służyć do akwizycji (XQuery, [[XSQL]]), przechowywania (czysta postać [[XML]]), prezentacji ([[XHTML]]) i transformacji ([[XSL]], [[XSLT]]) lub nawigacji ([[XPath]]) w treści lub danych.

26 komentarzy

Chciałbym tylko dodać, że w artykule jest kilkanaście błędów ortograficznych, m.in. "nie możliwe", a powinno być "niemożliwe".

Cały artykuł o tym jest - widać nie czytałeś dokładnie.. :/

Zaproponujcie mi jaki wybrać język i program bo nie mogę sie zdecydować

Postaram się pomóc, ale jak zwykle 10 innych spraw na głowie :P

Co do 2. oraz 3. też już o tym myślałem i doszedłem do podobnych wniosków. Jak znajdę zapał i chęci to to jakoś przeredaguję. (Chyba, że ktoś zrobić to przede mną ;) ).

Widzę, że przeformatowaniu uległa też pozostała część artykułu. Cieszę się.

Jednak mam jeszcze 3 propozycje:

  1. Czy nie lepiej jest stosować terminu np. "programowanie obiektowe" zamiast "metodyka obiektowa", skoro w części wprowadzającej mamy takie sformułowanie? Ponadto łatwiej jest wyrażać niektóre z tych metody jako np. "programowanie z ograniczeniami" (constraint programming) niż "metodyka ograniczeniowa" czy jakkolwiek by to miało brzmieć :P
  2. Moim zdaniem dobrze byłoby podzielić metodyki nie tyle na najpopularniejsze i niedostępne co przynajmniej na te, które są możliwe do zastosowania w języku oraz te, których się nie da. A co najwyżej z tej pierwszej grupy wyodrębnić te najpopularniejsze. Wiele metodyk jest co prawda dostępna często tylko przez oddzielne przez zewnętrzne biblioteki, ale są bardzo popularne, szczególnie w pewnych zastosowaniach. Inne teoretycznie są wspierane przez język, ale są mało popularne w najczęstszych zastosowaniach.
  3. Proponowałbym troszkę inaczej opisać "wsparcie". Chyba bardziej istotną informacją jest w jakich zastosowaniach jest używany język i wtedy ew. wymienić biblioteki wspierające te zastosowania. Bo jeżeli się uprzeć, to prawie każdy język będzie miał "wsparcie" do prawie wszystkiego co sobie wymyślimy. Ale te języki ogólnego przeznaczenia jednak zajęły już pewne obszary informatyki i np. sterowniki najczęściej się pisze w C/C++, chociaż można też w innych, a aplety www najczęściej w Javie lub Flashu, chociaż też można w innych.

I jeszcze takie pytanie nie związane już całkiem: jak w javie można programować deklaratywnie? Wyszukałem jakieś linki na google, ale nie bardzo one przypominały programowanie deklaratywne (chyba, ze ja mam troszkę inne pojęcie o programowaniu deklaratywnym).

Zdarzeniowe jest np. WndProc, które równie dobrze można napisać w assemblerze; 'zdarzeniowo' można imho pisać w każdym języku, nawet w basicu.

To, co odróżnia metodologię zdarzeniową od proceduralnej czy strukturalnej, to właśnie to, czy pętle zdarzeniową musisz pisać ręcznie i w niej wywoływać procedury obsługi zdarzeń dla aplikacji, czy też pętla jest uznawana za niezależną od kodu (najczęściej ukryta w postaci kodu w którejś z bibliotek, choć nie koniecznie). Dodatkowo idea zdarzeniowej metodologii polega na tym, że jedyne co piszesz to obsługa zdarzeń, powiązanych z aplikacją, jak i z jej komponentami - nic więcej.

Assembler po prostu nie udostępnia metodologii zdarzeniowej.

Ani DirectX, ani Allegro, a tym bardziej VCL nie jest dedykowane dla assemblera. DirectX jest dedykowany pod C# (ogólnie pod cały .NET), C++ oraz Visual Basic. Dlaczego? Bo sam producent udostępnia nagłówki do tych języków. Wychodzi nowa wersja DirectX, ściągasz SDK i masz te nagłówki, proste. Natomiast do Delphi musisz czekać, aż jakiś opensource'owiec usiądzie i przetłumaczy - też pytanie czy całość i na ile aktualnie. Dodatkowo, producent nie gwarantuje, że będzie działało pod innymi językami, a ze wspomnianymi na początku tak, bo musi.

Co do metodyk - nie wspiera wszystkich (żadne istniejące środowisko do ASM, jakie znam, nie >wspiera metodologii aspektowej, intencyjnej, agentowej).
Tutaj masz racje, też takich nie znam. Jednakże sam assembler (język) to po prostu bezpośrednie użycie instrukcji procesora, metodologia zalezy tylko od danego kompilatora/assemblera.
Jakość wsparcia dla zdarzeniowej czy logicznej też jest bardzo dyskusyjna.
Zdarzeniowe jest np. WndProc, które równie dobrze można napisać w assemblerze; 'zdarzeniowo' można imho pisać w każdym języku, nawet w basicu.

Co do logicznego, to tak samo jak wcześniej-przy obecnych narzędziach raczej trudno byłoby to osiągnąć.

Co do bibliotek-czy DirectDraw (itd) jest dedykowane pod c/c++? Nie. Jedyna rzecz która jest niejako 'dedykowana' to allegro (no i borland VCL, tutaj już na pewno). Myślę, że w dostępnych bibliotekach należy umieścić te które są dostępne (jak nawet nazwa podkategorii (?) wskazuje) z danego języka, nie dedykowane.
Np. Soldat jest zdaje się napisany w delphi z użyciem DirectX. (nie jestem tego pewny, niemniej jednak zarówno OpenGL jak i DirectX są dostępne z tego języka).

Za to w przypadku Pythona, PHP (javy?) jedyne dostępne to te dedykowane.

Można by stworzyć kategorię 'biblioteki dedykowane' tylko po co?

Ot mam kłopot - co zrobić z poprawkami Fr3m3n'a? Assembler nie ma bezpośredniego wsparcia w żadnych z wyżej wymienionych bibliotek, a że korzystając ze swojej specyfiki potrafi się podpiąć pod biblioteki dowolnego języka kompilowanego (lub ma wręcz dołączone translacje nagłówków) to inna sprawa. Moim zdaniem przy bibliotekach multimediów powinien zostać brak, chyba, że ktoś zna dedykowane, a w komentarzu dopisać tekst o powyższym.

Co do metodyk - nie wspiera wszystkich (żadne istniejące środowisko do ASM, jakie znam, nie wspiera metodologii aspektowej, intencyjnej, agentowej). Jakość wsparcia dla zdarzeniowej czy logicznej też jest bardzo dyskusyjna. O metodologii stanowej już nie wspomnę. Tym bardziej, że jest to parametr 'najpopularniejsze metodologie'.

Poradźcie coś, bo waham się czy nie przywrócić do wersji Kooby.. :/

Java, C#, Python czy Ruby są w programowaniu www stosowane na szeroką skalę.

No, ale jak już tak patrzymy, to można by uznać, że "ogólnego przeznaczenia" mogą być zastosowane też w innych dziedzinach, a te zakwalifikowane do jakiegoś bardziej wyspecjalizowanego podpunktu nie są zbyt popularne w innych zastosowaniach (PL/SQL przy pisaniu kompilatorów ;) )

No rozumiem, ale starałem się tu zachować podział, jaki dałem w rozdziale "Krok 2: Przeznaczenie". Pamiętajcie też, że to porada w dużej mierze dla początkujących, a nie wyjadaczy, którzy, aby ułatwić sobie obsługę server-side, napiszą sobie serwer HTTP w Delphi :P Oczywiście przesadzam, ale przecież tak też się da.. Rozważcie to.

Nie no; jasne, że masz rację, tylko że podziały zawsze są sztuczne i zbyt sztywne. Jakkolwiek, ale poukładane i będzie dobrze. Jakby komuś któreś przyporządkowanie nie pasowało - dawać znać; tylko z rzeczowym komentarzem, proszę.

Mi również nie bardzo pasuje to oddzielenie. Ja strony w pythonie piszę. Ruby, język ogólnego przeznaczenia, jest najbardziej sławny dzięki Ruby on Rails - zastosowanie internetowe.

Również w drugą stronę: php niektórzy stosują tam, gdzie zwykle perl królował - w przetwarzaniu tekstu. Niektórzy nawet kompilatory/interpretery w nim piszą.

Wydaje mi się, że nie należy tutaj dzielić na zastosowania. Po prostu opisywać języki, a czytający z opisu wywnioskuje, do czego można go zastosować

Języki do obsługi stron internetowych - po stronie serwera

Troche nie pasuje.. w Pythonie, C#, Perlu (którego jeszcze nie ma opisanego) a nawet w C można przecież tworzyć strony.. rozumiem intencje stworzenia tej sekcji ale należało by jakoś rozwiac wątpliwosci. Np napisac ze da sie tworzyc strony we wspomnianych jezykach or sth :/

To oddzieliłem od ogólnego przeznaczenia i powinien być już porządek :)

Mimo iż PHP NIE NALEŻY do języków ogólnego przeznaczenia to tak jak napsał Szczawik, cytuje:

<cite>"Dobrze by było, aby każdy z najpopularniejszych języków został opisany."</cite>

Tak i ja też zachęcam do rozwijania arta poprzez krótkie, schematyczne opisy popularnych języków programowania, to napewno pomoże niezdecydowanym początkujęcym.

Dodałem język C#, jest jeszcze trochę informacji do uzupełnienia o nim.
O metodologii nic nie pisałem, ponieważ nie znam wszystkich metod programowania, a nie chce strzelać które z nich są możliwe w C# (domyślam się ze podobne jak w Javie i C++) :P

DHTML to jest takie coś jak AJAX - niewiadomo co to, ale wszyscy tego używają (no, akurat DHTML-a to parę lat temu, teraz nie, teraz jest Web2.0...). Znaczy połączenie W3C DOM + niestandardowe rozszerzenia IE4/NN4 + JavaScript/JScript daje DHTML.

A mobilną Javę zwykle określa się w ogóle jako J2ME, czyż nie?

Do metodyk (chociaż ja bym tego tak nie nazywał) dorzuciłbym programowanie funkcyjne, deklaratywne czy logiczne, aby czytający nie odniósł wrażenia, że tylko w jednym kierunku rozwijają się języki.

Wiem o co chodziło, domyśliłem się i już wcześniej w tekście dałem 'Java - JME'. Jak nie pasuje za bardzo, to może zmień.

Chodzi o to, że "Java JME" to "Java Java Microedition" - chodziło mi o napisanie Java ME jak to się zwykło robić.

Nie traktujcie mnie jak wyrocznię nieomylną. Co do DHTML, to jest to DocumentObjectModel, nie jest to JavaScript (mam gdzieś na dysku tabelę z W3C, które elementy są elementami JS zawartego w W3C DOM, a które dynamicznego HTML z DHTML DOM - z książki JavaScript Bible, 4th Edition by Danny Goodman). Co do tego, czy opis budowy dokumentu to język programowania - może i nie jest, ale jednak zajmujemy się tym jak językami programowania, więc niech to w tekście zostanie.

JME beginnerom nic nie powie, a Java JME jakoś kojarzy się z mobilną Javą. Proponuję to tak zostawić.

Gites. Ale czy język opisu dokumentów/danych to język programowania? W przypadku HTML-a jestem całym sercem za tym, że nie jest on językiem programowania. Co innego PostScript - ktoś napisał nawet w nim serwer WWW ;)

Tego DHTML-a zaraz poprawię.

Możnaby wrzucić na początek spis treści.

obsługi stron internetowych - po stronie klienta (np.: JavaScript, DHTML)
DHTML to określenie Dynamic HTML - czyli odnosi się to do JavaSctipt [i modyfikacji Microsoft: JScript] - sam w sobie nie jest językiem.

(np.: Java JME)
JME to chyba Java MicroEdition więc Java ME :)

Wybierając narzędzie dostosowane dla swoich, weź to pod uwagę.
Zbrakło 'potrzeb' ?

Ogólnie gites!

Zapraszam do rozwijania tego tematu, ale w sposób jak najbardziej obiektywny. Dobrze by było, aby każdy z najpopularniejszych języków został opisany.