LINUX.ORG.RU
ФорумTalks

При сравнении хелловорлдов Паскаль не заборол разве что ассемблер

 ,


1

1

Собственно, сабж. Внимательные читатели опеннета могут уже об этом знать. Я же привожу свои собственные результаты соответствующего теста:

$ cat results_by_taskclock.txt
,10   Assembly Language: syscalls:     2 taskclock:     0,10 instructions:            9
,16              Pascal: syscalls:    12 taskclock:     0,16 instructions:            4
,26       /usr/bin/echo: syscalls:    33 taskclock:     0,26 instructions:          220
,39         C - syscall: syscalls:    24 taskclock:     0,39 instructions:          109
,46           C - stdio: syscalls:    27 taskclock:     0,46 instructions:          180
,47                 PHP: syscalls:    73 taskclock:     0,47 instructions:          460
,99                Rust: syscalls:    91 taskclock:     0,99 instructions:          524
,41                Perl: syscalls:   307 taskclock:     1,41 instructions:            2
,53                  Go: syscalls:   182 taskclock:     1,53 instructions:          606
,55                 C++: syscalls:    59 taskclock:     1,55 instructions:            2
,92                Bash: syscalls:   178 taskclock:     1,92 instructions:            1
,85                 TCL: syscalls:   215 taskclock:     2,85 instructions:            6
,76              Python: syscalls:   789 taskclock:    11,76 instructions:           39
,22                Ruby: syscalls:  1127 taskclock:    39,22 instructions:          158
,90              NodeJS: syscalls:  1287 taskclock:    74,90 instructions:          250
,22                Java: syscalls:  3773 taskclock:    78,22 instructions:          192

★★★★★
Ответ на: комментарий от Darth_Revan

Все что умеет генератор, можно сделать руками :) Иначе генератора просто не было бы. Импорты библиотек в том или ином виде есть в любом изводе поцкаля, который вообще имеет смысл использовать для чего-то практического. Алсо нигде про именно лазарус я не писал. Так что перепутал ты :)

Под «cpp» ты, видимо, имеешь в виду C, а Qt перепутал с WinAPI.

extern «C» {} религия зопретила :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от Darth_Revan

ЧТД, собственно и в этом твоем лазарусе велосипедостроение прослоек вращается вокруг построений типа таких:

function QObject_hook_create(handle : QObjectH) : QObject_hookH; cdecl; external Qt4PasLib name ‘QObject_hook_create’;

только они еще навелосипедили *_hook_c.cpp файлов – эти их всякие Qt4Pas, Qt5Pas далее везде хороши, когда не очень ясно как работает биндинг и потыкать надо что-то в Qt, или если тебе явно нужен весь комбаен со всем-всем искаропки - ну ок. А если тебе не нужен весь Qt – нафиг это все тащить :)

Открываем еще например заголовок pascalbind.h и что мы видим? Классическое объявление:

#if defined(__WIN32__)
#define C_EXPORT extern "C" __declspec( dllexport )
#else
#define C_EXPORT extern "C"
#endif

которое

а) никто не запретит сделать руками

б) чаще всего уже в каком-то виде есть в cpp-библиотеке, которая не прибита гвоздями к одной платформе :)

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 4)
Ответ на: комментарий от Darth_Revan

«…но мы должны пойти глубжЭ» (с)

Открываем сорцы Qt5:

#if !defined(QT_NAMESPACE) && defined(__cplusplus) && !defined(Q_QDOC)
extern "C" <-- this
#endif
Q_CORE_EXPORT const char *qVersion() Q_DECL_NOTHROW;

А Q_CORE_EXPORT это что? А например вот что:

#if defined(QT_SHARED) || !defined(QT_STATIC)
#  ifdef QT_STATIC
#    error "Both QT_SHARED and QT_STATIC defined, please make up your mind"
#  endif
#  ifndef QT_SHARED
#    define QT_SHARED
#  endif
#  if defined(QT_BUILD_CORE_LIB)
#    define Q_CORE_EXPORT Q_DECL_EXPORT   <-- this
#  else
#    define Q_CORE_EXPORT Q_DECL_IMPORT   
#  endif
#else
#  define Q_CORE_EXPORT
#endif

ХМ… а что такое Q_DECL_EXPORT… А в файле qcomilerdetection.h это старый добрый бородатый классический макрос:

$ grep Q_DECL_EXPORT qcompilerdetection.h 


#  define Q_DECL_EXPORT __declspec(dllexport)
#    define Q_DECL_EXPORT     __attribute__((visibility("default")))
#    define Q_DECL_EXPORT     __declspec(dllexport)
#    define Q_DECL_EXPORT     __declspec(dllexport)
#    define Q_DECL_EXPORT     __attribute__((visibility("default")))
#      define Q_DECL_EXPORT     __global
#      define Q_DECL_EXPORT     __declspec(dllexport)
#      define Q_DECL_EXPORT     __attribute__((visibility("default")))
#      define Q_DECL_IMPORT     Q_DECL_EXPORT
#ifndef Q_DECL_EXPORT
#  define Q_DECL_EXPORT

Итого, при прочих равных, когда нам не нужен весь Qt… нафиг надеяться на стороннего васю, когда можно покурить варианты сборки Qt и биндить только то, что явно нужно :) Потом тебе конечно расскажут про «магию moc» со слотаме и сигналаме… Но они просто жопы ленивые с магическим мышлением :)

slackwarrior ★★★★★
()
Ответ на: комментарий от Zhbert

Ну а вообще, если честно, то мифы о том, что паскаль тормозит сильно преувеличены.

Проблема паскаля заключается не в тормозах (которых нет), а в уродском многословном синтаксисе, там где в С\С++ ставится фигурная скобочка в паскале пишется begin и end.

BlackJack
()
Ответ на: комментарий от BlackJack

Да на самом деле к этому привыкаешь и как-то пофиг.
Хотя там надо еще переменные объявлять заранее и :=

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Хотя там надо еще переменные объявлять заранее

В C аналогично (правда я не помню можно ли объявлять в паскале переменные внутри цикла).

BlackJack
()
Ответ на: комментарий от BlackJack

Погодь-ка. Я хоть и давно уже на сишечке не писал, но все же...

for (int i = 0; i<10; i++) {}

Не? И как это вяжется с объявлением переменной в самом начале файла в виде i: integer;?

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Не? И как это вяжется с объявлением переменной в самом начале файла в виде i: integer;?

1)Не в начале файла, а в начале процедуры (функции).
2)int i при инициализации цикла ограничивает область видимости i самим циклом.Т.е. следующий код тождественен введенному вами.

{
int i=0;
 for(;i<10;i++){}
}

Я если честно не настолько помню Pascal чтоб четко писать сработает ли такой трюк в нем.

BlackJack
()
Ответ на: комментарий от Zhbert

переменные объявлять заранее

Если актуально разделить код на области видимости, то это в Паскале делается разделением кода на процедуры (в Си, собственно, аналогично).

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от BlackJack
многословном синтаксисе

Многословный синтаксис у COBOL'а, Вы ошиблись.

там где в С\С++ ставится фигурная скобочка в паскале пишется begin и end.
Ключевые слова в пределах 5-ти символов. Как будто бы от фигурных скобок всякие while, break, continue, default, return, switch,... и т.д. становятся в Си по одному символу.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Кстати, как спец по паскалю.
Поставил я себе лазарус, запускаю... И вижу ошибку, что он не может создать в /etc файл. Что логично, ведь не от рута запущен. Запускаю от рута - все норм. По логике - файл он уже создал, должно быть норм - но нет, при следующем запуске от юзера опять та же ошибка. Щта делать? Не гонять же его от рута.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Unable to create file «/etc/lazarus/editormacroscript.xml».

Нажмите 'OK', чтобы игнорировать и подвергнуться риску повреждения данных.
Нажмите 'Прервать' для закрытия программы.



Собственно, на прервать виснет, на ОК тоже.

Zhbert ★★★★★
()
Ответ на: комментарий от BlackJack

Я если честно не настолько помню Pascal чтоб четко писать сработает ли такой трюк в нем.

Не сработает:

Variables are typically declared at the beginning of a program, procedure, function or unit.

Написано «typically», потому проверим, чтобы полностью убедиться:

program main(output);

begin
  var
    i: integer;
  begin
    for i := 0 to 9 do
      ;
  end;
end.

fail.pas(5,5) Fatal: Syntax error, «;» expected but «identifier I» found

Не получилось.

Darth_Revan ★★★★★
()
Ответ на: комментарий от Darth_Revan
program main(output);

begin
  var
begin
  var
Должно быть
var
begin
end.

Может быть

var

процедуры и функции

begin
end.
Но begin до var быть не может.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

Криво поставлен. У меня, кстати, только /etc/lazarus/environmentoptions.xml, и принадлежит он пакету lazarus-2.0.6-1.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Контекст же.
Я специально так сделал, чтобы показать, что объявить переменную, как в C89, в блоке никак нельзя.

Darth_Revan ★★★★★
()
Ответ на: комментарий от Zhbert

А почему тогда /etc/lazarus/environmentoptions.xml не поставился при emerge от root'а? Где-то что-то пошло не так. Потому и установка получилась кривой. И её теперь надо переделывать.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Darth_Revan

А зачем Вы притащили идентификатор отдельной _секции_ var?

Более корректный пример:

program test;
begin
        i: Integer;
        for i := 0 to 9 do;
end.
test.pas(3,2) Error: Identifier not found "i"
test.pas(3,3) Fatal: Syntax error, ";" expected but ":" found
Fatal: Compilation aborted
А вот это уже компилируется, да:
program test;
var
        i: Integer;
begin
        for i := 0 to 9 do;
end.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Но ведь при запуске лазаруса от рута он должен его создать? От рута работает все, но от юзера уже нет.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

Lazarus не надо запускать от root'а. При его правильной установке соответствующий файл уже устанавливается в систему как принадлежащий пакету lazarus'а. И, соответственно, всё сразу работает от обычного юзера.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

А зачем Вы притащили идентификатор отдельной _секции_ var?

Потому что в каком-нибудь ином мире он мог бы прикрепляться к любому begin, примерно как с блоками в C89.
А если бы переменные можно было где угодно объявлять, как в «более корректном примере», тогда бы var просто не существовало.

Darth_Revan ★★★★★
()
Ответ на: комментарий от Darth_Revan

В Си просто нечего «прикреплять».

Сишному

int i;
соответствует Паскалевское
i: Integer;

А чтобы понять, что var - это отдельная секция - достаточно посмотреть на то, как выглядят процедуры и функции в Паскале.

Для того и сделана эта отдельная секция, чтобы декларировать переменные именно в ней. Либо для отдельных процедур и функций, либо глобально.

saahriktu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.