mboost-dp1

TP 40 år


Gå til bund
Gravatar #2 - larsp
5. dec. 2023 10:10
Jeg har altid syntes at Pascal faldt lidt mellem to stole. Er det et low level sprog der kan bruges i stedet for C til max performance og rå hardware tilgang? Eller er det et højniveau sprog der skal gøre det nemt og hurtigt at skrive business logic?

Nu har jeg aldrig brugt DOS Turbo Pascal, men jeg har prøvet et par Borland produkter under Windows, f.eks. Delphi. Ikke min kop te. Jeg fandt det en irriterende, bøvlet og generelt mindre effektiv IDE sammenlignet med VB6.

Og så var jeg tvunget til at bruge Borland C/C++ builder en enkelt gang. Ewwww. Men det var nok mest pga. Windows' generelt forfærdelige API.
Gravatar #3 - arne_v
5. dec. 2023 14:23
#2

Man kan sige at Pascal er mindst 3 forskellige produkter med 3 forskellige formål.

1) Original Pascal blev udviklet af Wirth med det formål at lære studerende god programmering. Gennem mange år (måske 1975-1995) var Pascal det mest brugte sprog til at lære datalogi studerende basal programmering og data strukturer & algoritmer (double linked list, tree, quick sort etc.). Til seriøs brug udviklede Wirth Modula-2.

Jeg syntes at det var godt til formålet. Og jeg har undervist i det. Men sproget blev forældet da man skulle til at undervise i OOP/GP/FP.

2) Hejlsberg og Borland udviklede TurboPascal (og Borland Pascal) med det formål at lave et sprog og et udviklingsmiljø for low level programmering under DOS. Så der blev fjernet en del checks og tilføjet en masse ekstra for at kunne "assembler programmere i HLL". Det var enormt successfuldt og måden at lave IDE blev inspiration for alle fremtidige IDE'er.

Jeg har aldrig selv brugt TP/BP. Jeg arbejdede på VMS ikke DOS dengang.

3) Borland udviklede Delphi med det formål at gøre det nemt at lave GUI frontend til business applikationer på Windows. En form editor til design og kode tilknyttet form. Historien viser at det var den rigtige tilgang til GUI (C X, C Win32, C++ MFC, Java AWT, Java Swing etc. er bare for dyre at udvikle den slags GUI business code i). Konkurrenterne var MS VB6 og Prolifics Jyacc. Delphi blev solgt som "lige så nemt som VB6 - lige så hurtigt som MSVC++". Delphi havde en del success (omend VB6 var klart størst) indtil MS kom med .NET og Borland gik i hundene.

Jeg har heller aldrig brugt Delphi i noget nævneværdigt omfang. Jeg er slet ikke GUI person (dårlige erfaringer med X i assembler og Prolifics Jyacc).
Gravatar #4 - arne_v
5. dec. 2023 14:28
#3

Måske kan man sige at der var en fjerde variant:

4) Apple Pascal og Object Pascal var hoved programmerings sprog på Apple Lisa og M68K baserede Apple Macintosh tilbage i 80erne.
Gravatar #5 - larsp
7. dec. 2023 07:39
#3 #4 Så Pascal har faktisk forsøgt sig på alle planer, low level, undervisning, OOP, GUI, i forskellige varianter.

Jeg kiggede på https://en.wikipedia.org/wiki/Object_Pascal#Sample... - og blev endnu engang forbløffet over hvordan man kan bruge så mange karakterer på så lidt. Der er godt nok meget ordskvalder i det sprog.

Tilsvarende Python kode, 4 linjer:

class THelloWorld:
. def Put(self):
. print("Hello, World!")
THelloWorld().Put()

Pascal eksemplerne ligger på ca. 15 linjer og op.

Jeg synes ikke Pascal's syntaks har ældet særligt godt. Der er alt for mange keywords der ikke har noget egentlig formål. I moderne sprog har næsten hvert eneste keyword en betydning og kunne ændre programmet i en meningsfuld måde hvis det blev skiftet ud med et andet. I Pascal forekommer det mig at mindst halvdelen er ren "filler".

Jeg tænker at det er en af grundende til at den sprogfamilie blev valgt fra. For meget carpal tunnel syndrome for for lidt funktionalitet.
Gravatar #6 - larsp
7. dec. 2023 08:12
Borland Ltd. was founded in August 1981 by three Danish citizens – Niels Jensen, Ole Henriksen, and Mogens Glad

Endnu engang danskere der har haft stor indflydelse på udviklingen af programmeringssprog :) Mon ikke vi kan prale af at være den nation der har haft mest indflydelse pr. capita i den sammenhæng.
Gravatar #7 - arne_v
7. dec. 2023 14:15
#6

Uden tvivl.

Peter Naur (Algol)
Bjarne Stroustrup (C++)
Anders Hejlsberg (Pascal/Delphi, J++, C#, TypeScript)
David Heinemeier Hansson (Ruby)
Rasmus Lerdorf (PHP)
Lars Bak (Java, JavaScript)
Gravatar #8 - arne_v
8. dec. 2023 00:35
larsp (5) skrev:

Jeg kiggede på https://en.wikipedia.org/wiki/Object_Pascal#Sample... - og blev endnu engang forbløffet over hvordan man kan bruge så mange karakterer på så lidt. Der er godt nok meget ordskvalder i det sprog.

Tilsvarende Python kode, 4 linjer:

class THelloWorld:
. def Put(self):
. print("Hello, World!")
THelloWorld().Put()

Pascal eksemplerne ligger på ca. 15 linjer og op.


Nu er der nogle ting man skal tage hensyn til:
- kode stil
- fast program overhead vs delta for ny funktionalitet

Ingen tvivl om at Python er kortere end Delphi.

Men Python og Delphi er ikke samme type sprog.

Jeg lavede en lille test (kode følger) og fandt:

Delphi (faktisk FPC men ...): 13 + 14 * N
Python: 0 + 6 * N
C++: 8 + 14 * N
Java: 4 + 7 * N
C#: 8 + 10 * N
PHP: 4 + 8 * N

Så en hello world klasse:

Python 6
Java 7
PHP 8
C# 10
C++ 14
Delphi 14
Gravatar #9 - arne_v
8. dec. 2023 00:38

program HW(input, output);

{$mode objfpc}{$H+}

uses
Classes;

type
THelloWorld1 = class(TObject)
public
procedure Put;
end;
THelloWorld2 = class(TObject)
public
procedure Put;
end;
THelloWorld3 = class(TObject)
public
procedure Put;
end;

procedure THelloWorld1.Put;

begin
writeln('HelloWorld1 in Delphi');
end;

procedure THelloWorld2.Put;

begin
writeln('HelloWorld2 in Delphi');
end;

procedure THelloWorld3.Put;

begin
writeln('HelloWorld3 in Delphi');
end;

var
o1 : THelloWorld1;
o2 : THelloWorld2;
o3 : THelloWorld3;

begin
o1 := THelloWorld1.Create;
o1.Put;
o1.Free;
o2 := THelloWorld2.Create;
o2.Put;
o2.Free;
o3 := THelloWorld3.Create;
o3.Put;
o3.Free;
end.



class HelloWorld1(object):
def put(self):
print("HelloWorld1 in Python")

class HelloWorld2(object):
def put(self):
print("HelloWorld2 in Python")

class HelloWorld3(object):
def put(self):
print("HelloWorld3 in Python")

o1 = HelloWorld1()
o1.put()
o2 = HelloWorld2()
o2.put()
o3 = HelloWorld3()
o3.put()



#include <iostream>

using namespace std;

class HelloWorld1
{
public:
void put();
};

void HelloWorld1::put()
{
cout << "HelloWorld1 in C++" << endl;
}

class HelloWorld2
{
public:
void put();
};

void HelloWorld2::put()
{
cout << "HelloWorld2 in C++" << endl;
}

class HelloWorld3
{
public:
void put();
};

void HelloWorld3::put()
{
cout << "HelloWorld3 in C++" << endl;
}

int main()
{
HelloWorld1 *o1 = new HelloWorld1();
o1->put();
delete o1;
HelloWorld2 *o2 = new HelloWorld2();
o2->put();
delete o2;
HelloWorld3 *o3 = new HelloWorld3();
o3->put();
delete o3;
return 0;
}



public class HW {
public static class HelloWorld1 {
public void put() {
System.out.println("HelloWorld1 in Java");
}
}
public static class HelloWorld2 {
public void put() {
System.out.println("HelloWorld2 in Java");
}
}
public static class HelloWorld3 {
public void put() {
System.out.println("HelloWorld3 in Java");
}
}
public static void main(String[] args) {
HelloWorld1 o1 = new HelloWorld1();
o1.put();
HelloWorld2 o2 = new HelloWorld2();
o2.put();
HelloWorld3 o3 = new HelloWorld3();
o3.put();
}
}



using System;

public class HelloWorld1
{
public void Put()
{
Console.WriteLine("HelloWorld1 in C#");
}
}

public class HelloWorld2
{
public void Put()
{
Console.WriteLine("HelloWorld2 in C#");
}
}

public class HelloWorld3
{
public void Put()
{
Console.WriteLine("HelloWorld3 in C#");
}
}

public class HW
{
public static void Main(string[] args)
{
HelloWorld1 o1 = new HelloWorld1();
o1.Put();
HelloWorld2 o2 = new HelloWorld2();
o2.Put();
HelloWorld3 o3 = new HelloWorld3();
o3.Put();
}
}



<?php

class HelloWorld1 {
function put() {
echo "HelloWorld1 in PHP\r\n";
}
}

class HelloWorld2 {
function put() {
echo "HelloWorld2 in PHP\r\n";
}
}

class HelloWorld3 {
function put() {
echo "HelloWorld3 in PHP\r\n";
}
}

$o1 = new HelloWorld1();
$o1->put();
$o2 = new HelloWorld2();
$o2->put();
$o3 = new HelloWorld3();
$o3->put();

?>


Bemærk at både min Delphi kode og min Python kode er lidt anderledes i stil end originalerne.
Gravatar #10 - larsp
8. dec. 2023 07:17
#9 Heh. Hvordan får du python klassen til 6 linjer?

Hello world klasse i C med "gør det selv OOP" i den stil jeg plejer at bruge. Jeg måtte tilføje en member variable, ellers er klassen meningsløs.

Jeg får det til: 7 + 15 * N (men det er lidt unfair pga. member variablen, i python ville der have været en __init__ funktion f.eks.)

#include <stdio.h>
#include <malloc.h>

typedef struct {
int Var;
} helloWorld_t;

void helloWorld_init(helloWorld_t *self, int var)
{
self->Var = var;
}

void helloWorld_put(helloWorld_t *self)
{
printf("HelloWorld in C: %d\n", self->Var);
}

int main(int argc, char *argv[])
{
helloWorld_t *obj = malloc(sizeof(helloWorld_t));
helloWorld_init(obj, 42);
helloWorld_put(obj);
free(obj);
return 0;
}

Gravatar #11 - larsp
8. dec. 2023 08:07
.. Det for mig til at tænke på en ting. Kan man ikke i C med "gør-det-selv OOP" gøre ting man ikke kan i C++ og andre sprog, fordi man manuelt allokerer og senere kalder "constructoren"?

F.eks. at allokere en masse klasser på én gang, f.eks. i rod niveauet i et kodemodul:

helloWorld_t HelloWorlds[10];

eller ved bruge en opskaleret malloc:

helloWorld_t *hello_worlds = malloc(sizeof(helloWorld_t) * 10);

I C++ er man vel tvunget til at allokere dem én af gangen med new, og kun i det øjeblik man er klar til at kalde constructoren. Eller?

P.S. I embedded programmering med meget resourcebegrænsede chips og nogle gange helt uden malloc support, er det faktisk en nøglefeature at kunne ovenstående og det gør at man kan lave en fin ultra-light OOP struktur i koden. Det kunne man ikke have gjort med C++.
Gravatar #12 - arne_v
8. dec. 2023 14:13
larsp (10) skrev:

Heh. Hvordan får du python klassen til 6 linjer?


class
def
print
empty line
...
instantiate
call

larsp (10) skrev:

Hello world klasse i C med "gør det selv OOP" i den stil jeg plejer at bruge. Jeg måtte tilføje en member variable, ellers er klassen meningsløs.

Jeg får det til: 7 + 15 * N (men det er lidt unfair pga. member variablen i python ville der have været en __init__ funktion f.eks.)


Man kan godt have en tom struct. Ikke meget pointe, men det er der vel strenget taget heller ikke i klasser uden fields.

Og når klasserne ikke har en explicit constructor så skal C vel heller ikke have en init funktion.

Med min C stil får jeg 7 + 12 * N.


#include <stdio.h>
#include <stdlib.h>

typedef struct
{
} hw1_t;

void hw1_put(hw1_t *o)
{
printf("HelloWorld1 in C\n");
}

typedef struct
{
} hw2_t;

void hw2_put(hw2_t *o)
{
printf("HelloWorld2 in C\n");
}

typedef struct
{
} hw3_t;

void hw3_put(hw3_t *o)
{
printf("HelloWorld3 in C\n");
}

int main()
{
hw1_t *o1 = malloc(sizeof(hw1_t));
hw1_put(o1);
free(o1);
hw2_t *o2 = malloc(sizeof(hw2_t));
hw2_put(o2);
free(o2);
hw3_t *o3 = malloc(sizeof(hw3_t));
hw3_put(o3);
free(o3);
return 0;
}

Gravatar #13 - arne_v
8. dec. 2023 14:26
#11

Hvis du kan leve med en no arg constructor, så er der ingen problemer i C++.


#include <iostream>

using namespace std;

class X
{
public:
X() { cout << "X ctor" << endl; }
virtual ~X() { cout << "X dtor" << endl; }
};

class Y
{
public:
Y() { cout << "Y ctor" << endl; }
virtual ~Y() { cout << "Y dtor" << endl; }
};

class Z
{
public:
Z() { cout << "Z ctor" << endl; }
virtual ~Z() { cout << "Z dtor" << endl; }
};

class W
{
public:
W() { cout << "W ctor" << endl; }
virtual ~W() { cout << "W dtor" << endl; }
};

int main()
{
X *x = new X();
delete x;
Y *y = new Y[3];
delete[] y;
Z z;
W w[3];
return 0;
}

Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login