LINUX.ORG.RU

Blaise - новый компилятор языка Pascal

 , ,


2

6

Грэм Гелденхейс (Graeme Geldenhuys), разработчик графического пользовательского интерфейса fpGUI, системы сборки PasBuild, системы тестирования FPTest и отладчика opdebugger представил Blaise - компилятор для диалекта языка программирования Object Pascal.

Целью автора было создать язык, свободный от накопившихся за десятки лет устаревших, и часто дублирующих друг друга, особенностей.

Основные черты нового диалекта:

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

  • Удален тип object, вместо него предлагается использовать record, для которого доступно определение методов.

  • Удалены устаревшие операторы ввода/вывода assign, reset, rewrite, blockread и типы file и text.

  • Предложен единственный строковый тип, заменяющий ShortString, AnsiString, WideString, OpenString и UnicodeString.

  • Удален оператор with, часто приводящий к трудно обнаруживаемым ошибкам.

  • Добавлено определение переменных в месте использования.

Для генерации машинного кода в компиляторе используется QBE (c9x.me), генератор на основе LLVM находится состоянии разработки.

В планах проекта создание LSP-сервера, поддержка языка в Visual Studio Code, а также создание инструмента для миграции с Delphi и Free Pascal.

>>> Blaise Pascal Compiler

★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)
Ответ на: комментарий от kaldeon

Разница в том, какой образ создают оба языка:

Это твои субъективные додумки. В питоне точно так же есть строгий синтаксис.

Она неявная. Неявное всегда сложнее освоить, чем явное.

Опять субъективное суждение. Для освоения любого языка нужны пояснения. В паскале нужно объяснять одно, в питоне - другое. Только вот паскаль мертв и объективно бесполезен, а питон - живой, юзабельным, и связки питон+си достаточно для вката в более продвинутые области, в то время как помимо паскаля тебе всё равно придется учить как минимум два нормальных языка.

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

Вопрос аудитории.

Вопроса так и не увидел, поэтому просто прокомментирую. :)

Если школьник ещё не определился с профессией, то ему Паскаль (ровно как и переход на Си), очевидно, не нужен

Не нужен, верно. Ему даже школа не нужна. Школьники, за редким исключением, вообще не испытывают потребности учиться - «Дети-с!..». :))

Но «определение с профессией» и школа - это «из разных миров». Школа - «Это другое!». :)

Как и чему таких учить — вопрос банальный и чисто практический

Всё это есть в учебных программах... ;)

Преподавателю даже самому не обязательно хорошо знать программирование

100% не нужно. Да они и не знают, в массе своей. Для преподавания в школе предмета «Информатика» знание программирования не требуется. «Я так думаю!» © :))

Я, когда меня 20+ лет «тому взад» попросили «довести» информатику в трёх из четырёх «наличных» десятых классах во втором учебном полугодии, был исключением. Просто потому, что пришёл туда «от станка» - с производства, где назывался «инженер минус программист» ( это мы сами так себя «обзывали», на самом деле - «инженер-программист», конечно же... :) ). Так что я был «программирующим преподавателем информатики» просто «по случаю». И именно программированию я «детей» не учил... :))

Меня же интересует, прежде всего, исключительно заинтересованный и вовлечённый ученик.

Бывает...:)

Меня волнует проявление уважения к его интересу, а не к социалистическим программам всеобщего благосостояния

Вот тут я не понял, о чём именно речь...

Но могу сказать, что лично я на уроках информатики никакие «интересы» не учитывал, а работал в соответствии с договором, учебной программой и прочими нормативными актами. То есть, преподавал информатику в соответствии с учебной программой для 10-х классов общеобразовательных школ. ВСЁ.

А вот после уроков... ;) Я вёл три «пары» - по паре уроков в каждом классе - по субботом, а четвёртой парой сделал этакие «консультации», куда, каждый, кто «недопонял» или «недосдал», мог прийти и «доспросить» у меня, либо «досдать» мне...

Не знаю, можно ли это было назвать «уважением интересов», но в итоге все - и учащиеся, и их родители - остались довольны. :))

Somebody ★★★★
()
Последнее исправление: Somebody (всего исправлений: 2)
Ответ на: комментарий от hobbit

with позволяет наплодить тяжёлых ошибок … аналогия с указателями

Есть ли способ сохранить мощь with, избежав конфликтов имён?

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

Применять осмотрительно. Если требуется зарываться слишком глубоко – это симптом того, что вместо записей надо делать объекты и делать обработку через методы (как и делают в плюсах, но там это единственный способ обращения, а здесь есть выбор).

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

Явное определение псевдонима решило бы проблемы с with:

with a := GetSomeObject() do begin
    a.Method1();
    a.Method2();
    a.Method3();
end;
No ★★★
() автор топика
Ответ на: комментарий от liksys

Банальная сишка выглядит лучше паскаля. Есть, что дорабатывать, но именно ее надо брать за основу.

Практически любая пост-алгольщина выглядит лучше сишки.

Ruby, Lua, Modula-2, Ada. Даже, прости господи, VB.NET.

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

Питон: хочешь написать программу — напиши её на английском языке. Не работает? Ну да, ведь есть строгий синтаксис, только после исправления ошибки его всё равно не видно, программа вновь стала прозой на английском языке.

Нет такого.

Ладно бы к Ruby кто-то с такой предъявой вышел. Она бы тоже была нелепа, но там я хотя бы могу предположить ход мыслей. Но в случае Питона…

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

В нормальном языке достаточно завернуть это в обычный блок.

В Blaise это можно записать как

begin
    var a := GetSomeObject();
    a.Method1();
    a.Method2();
    a.Method3();
end;

поэтому в нем и можно обойтись без with.

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

Во-первых, частный случай. Во-вторых, как раз эту часть можно и переработать.

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

Ну так. У меня лично от него ощущение, что он очень хочет быть си-подобным, но всякие уродские begin/end ему очень мешают.

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

В Lua нет ключевого слова begin.

Я думаю, на этом можно закончить «личные ощущения» и что-нибудь изучить ;)

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

Зато там do, then и прочие костыли, которые являются семантическим эквивалентом begin. Разница не принципиальна. Слишком много визуального мусора. Си с его {} и минимумом ключевых слов гораздо элегантнее.

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

А что касается сишки, то синтаксически фундаментально это был тот же самый паскаль. Если брать раннюю сишку и ранний паскаль.

Только вместо линейной записи выражений типа они зачем-то присрали запись «изнутри наружу», которая ломает мозги новичкам.

У Си никогда не было никаких преимуществ перед другими алголоидами именно в качестве языка как знаковой системы. Преимущества были чисто практические: распространённость и возможность компиляции на любом утюге.

Собственно так же как нет реальных преимуществ как знаковой системы у питухона. Просто индустрия тебе говорит: жри.

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

Не удивил. У тебя знания о синтаксисе как системе соответствуют средним знаниям о синтаксисе для типичного представителя подобных языковых холиваров.

Си с его {} и минимумом ключевых слов гораздо элегантнее.

Ага:

        }
      }
    }
  }
}

Еще элегантнее писать на перле, кстати.

задача текста, предназначенного для чтения - быть легко понятным, а не элегантным.

Именно поэтому end if из Васика оказывается лучше и паскаля, и си.

А Lua не дотянул, да.

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

Спорно. Просто не надо пользовать конченными двухпробельными отступами и городить большую вложенность. Если у тебя большая вложенность - скорее всего, что-то не так с композицией кода.

А когда у тебя в хвосте идет endfor/endif/endfor/endfor/endif - тебе это тоже мало о чем скажет, контекст ты не удержишь.

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

и чем такая конструкция будет выглядеть эстетичнее в паскале?

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

У меня иной личный опыт. Вполне помогает. При том что я и на {}-языках много писал (не только на Си, на той же JS, на PHP).

Вот что я могу сказать про Си, если не трогать семантику, а чисто синтаксис:

1

Выражения типов в Сишке - срань. Идея «как используется, так и пишется» хорошая, но реализоана через жопу. Во всяких современных «убийцах си» - это первое, что исправляют.

2

int* p , i;

Сколько новичков на этом мозг себе сломали.

3

Присваивание как операция внутри выражений - сколько ошибок в результате опечатки на этом случилось.

Сама идея писать присваивание внутри выражения - хорошая, но её следовало сделать более видимой, чтобы недопечатанный == не превращался в =, или скопированное в условие присваивание не оставалось там незамеченным.

Решение могло быть чисто синтаксическое:

a = x; // обычное присваивание
if (b := foo()) { // присваивание внутри выражения
   ...
}

4

Скобки {}. Скобки блока синтаксически это тот же самый begin end. Именно по смыслу тут нет никакой разницы. Разница чисто в количестве букв. То есть {} лучше чем begin end ровно на количество букв разницы. По смыслу разницы нет.

А вот языки, в которых блок является встроенной частью составного statement - иное дело.

По этому параметру Ada - лучше, VB - лучше.

Ruby, Lua - частично лучше. Они решают проблему висящего else, но не проблему удобства чтения конца блока.

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

А чем это отличается от такого же каскада end-ов?

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

обычное присваивание
присваивание внутри выражения

Зачем разные то делать? Я пойму желание уменьшить вероятность опечаточного смешивания присваивания со сравнением (добавить двоеточие), но зачем при этом отличать присваивание само по себе от присваивания внутри выражения?

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

Чтобы уменьшить вероятность случайного копипаста из другой строки.

Это делает намерение программиста явным: я ТОЧНО хочу присвоить значение внутри другого выражения.

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

Выражения типов в Сишке - срань

Да.

Сколько новичков на этом мозг себе сломали.

Тоже да.

Присваивание как операция внутри выражений - сколько ошибок в результате опечатки на этом случилось.

И это - да.

Разница чисто в количестве букв. То есть {} лучше чем begin end ровно на количество букв разницы. По смыслу разницы нет.

Именно потому оно мне и нравится. Не замусоривает код %) Я по всем пунктам с тобой согласен, кроме скобок.

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

Она бы тоже была нелепа

Ну почему? Нам нужно в самом начале объяснить, что синтаксис в языках программирования строгий. Эта концепция не новая (в естественных языках синтаксис тоже строгий), но до изучения программирования мы её просто не замечаем.

Чтобы объяснить любую концепцию, нужен пример. Какой пример может дать Питон в самом начале? Напишешь квадратные скобки вместо круглых? Маловероятно. Искусственные примеры тоже плохи. Напишешь primt вместо print? Это опечатка, а не синтаксис. Выберешь одинарную кавычку вместо двойной? Это даже не ошибка.

И здесь у нас есть отличная возможность: показать, что команды должны быть разделены синтаксически. Как мы будем это делать? Для нового человека перевод строки — это типографика, но не синтаксис. И здесь Паскаль нам даёт отличный способ использовать имеющийся опыт в новой задаче: осязаемая точка с запятой, используемая по исходному назначению.

Это «нелепо» только для «крутых хакеров», которые привыкли спорить чей инструмент лучше. А для педагогических целей это очень весомое наблюдение.

kaldeon ★★
()
Последнее исправление: kaldeon (всего исправлений: 3)
Ответ на: комментарий от wandrien

То есть {} лучше чем begin end ровно на количество букв разницы

изначально это не эквиваленты, begin/end не создают область видимости
хз чё там в сабже

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

Забавно))

То есть со второй попытки им удалось скопировать виртовский язык без клоунады. =)

Первой попыткой был Си.

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

А что касается сишки, то синтаксически фундаментально это был тот же самый паскаль.

Это не так. Общее есть, но это не Паскаль. На Си можно писать почти как на Паскале, это правда.

У Си никогда не было никаких преимуществ перед другими алголоидами именно в качестве языка как знаковой системы.

А него было преимущество в том что на нём был написан UNIX, а позднее не только он. Поэтому в ОС гарантированно присутствовал компилятор, стандартная библиотека и довольно обширный тулчейн для этого языка.

Кроме того, на момент создания у него были и другие преимущества перед Паскалем, например развитый препроцессор, адресная арифметика и т.п.

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

городить большую вложенность

Моя любимая пословица: в теории между теорией и практикой нет разницы; а на практике разница есть.

На практике от реальных людей мы будем видеть такой код.

lay: помощник раскладки RU/EN по double Shift для GNOME Wayland (комментарий)

                                            }
                                        }
                                    });
                                }
                            }
                        }
                    }
                    _ => {}
                }
            };
wandrien ★★★★
()
Ответ на: комментарий от wandrien

На практике от реальных людей мы будем видеть такой код.

В таких случаях вообще ничего не поможет, и end* не сделают ситуацию сильно лучше.

Люди, которые пишут километровые функции, сами выбрали путь страданий.

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

Именно синтаксически Паскаль почти идеален. Хотя в него не помешало бы добавить кое-что из современных плюсов, а кое-что даже из Go (сопрограммы те же).

Вот необходимость разделения объявления и инициализации переменных раздражает. Причём не столько визуальной разнесённостью (в хорошо написанной программе без километровых функций это не бог весть какой недостаток), сколько тем, что какое-то время объявленная переменная остаётся неинициализированной. Программу на плюсах можно (и как правило, нужно) писать так, что неприсвоенных переменных в ней нет вообще.

Основные проблемы Паскаля лежат не в плоскости синтаксиса, а в плоскости инфраструктуры. Долгое время им, кроме Борланда (ныне Embarcadero), считай, никто не занимался. Потом, вроде, fpc ожил. Соответственно, батареек намного меньше, чем у плюсов, поддерживаемых архитектур у того же fpc хоть и много, но всё-таки меньше, чем у gcc и clang. Плюс психологический фактор – заскорузлые догмы дедов про «настоящие программисты не пишут на Паскале», хотя очевидно, что деды имели в виду оригинальный Паскаль из виртовского учебника, а не TP5.5+. Соответственно, имея исходник на паскале, шансов найти мейнтейнера свой проект под рандомный дистрибутив меньше, чем имея исходник на сишке, плюсах или питоне.

Новый Паскаль с очень неплохим синтаксисом – это Rust. Мне, конечно, не нравится отсутствие обязательного явного задания типа, но эта зараза сейчас везде. В плюсы тоже auto вкрячили. Я знаю только один use case, где применение auto однозначно уместно, и то элегантнее было бы, если его можно было бы писать не в левой части присвоения, а наоборот, справа от new. :) Да, я понимаю, если бы так можно было, разбор левой и правой части присвоения был бы намного сложнее нынешнего.

И если в Расте вместо let a = 10; всегда писать let a: u32 = 10;, то жить вполне можно.

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

сколько тем, что какое-то время объявленная переменная остаётся неинициализированной.

в известных мне относительно современных диалектах инициализировать при объявлении можно
даже не вспомню, где нельзя, кроме как в чисто академическом виртовском

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

Но при этом var всё равно должен оставаться перед началом блока?
Просто часто реально полезное значение появляется только посреди функции.
Инициализация ради инициализации нулём каким-нибудь – это такое себе.

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

А когда у тебя в хвосте идет endfor/endif/endfor/endfor/endif - тебе это тоже мало о чем скажет

Скажет. Я бы ещё потребовал для endfor указывать имя переменной (или контейнера), по которой этот for был.

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

Но при этом var всё равно должен оставаться перед началом блока?

либо const, вестимо

Просто часто реально полезное значение появляется только посреди функции.

в сабже такая возможность заявлена, если я правильно её понял
и тут логично было бы ожидать, что так же реализована концепция local scope для произвольных блоков, for/if итп

Инициализация ради инициализации нулём каким-нибудь – это такое себе.

так не инициализируй, в чём проблема

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

в сабже такая возможность заявлена, если я правильно её понял

В сабже да. Но ты же поначалу говорил про все известные тебе относительно современные диалекты. Если в fpc так можно – напиши пример.

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

Я бы ещё потребовал для endfor указывать имя переменной (или контейнера), по которой этот for был.

это тебе классический васик надо, там в цикле for/next переменная явным образом указывается
но в реальности циклы обычно чуть сложнее, чтобы вокруг этого придумывать синтаксис, удобнее в конце блока откомментировать, раз у тебя там такая простыня

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

я говорил про инициализацию при объявлении
а объявление после begin - это уже другое
конкретно fpc принципиально не умеет и не планирует, а у всяких delphi, pascalABC.NET это давно стандарт разработки

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

конкретно fpc принципиально не умеет и не планирует, а у всяких delphi, pascalABC.NET это давно стандарт разработки

Можешь ли ты (или ещё кто, у кого pascalABC.NET есть под рукой) привести пример кода? Интересно.

не планирует

Они где-то от этого принципиально отказывались, или просто руки не дошли? А то, как известно, "никогда не говори «никогда»…

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

Скажет. Я бы ещё потребовал для endfor указывать имя переменной (или контейнера), по которой этот for был.

В Васике такое было. Но мне кажется, что там это скорее от бедности было, потому что в те времена не было полноценного AST.

В моём проектируемом ЯП возможно такое

label loopName: while x < 10 loop
   foo();
   inc x;
end:loopName

Цикла for пока еще не завёз и пока сомневаюсь, стоит ли.

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

Именно синтаксически Паскаль почти идеален.

нет, конечно)) как такое вообще в голову приходит…

Новый Паскаль с очень неплохим синтаксисом – это Rust.

Вот это мощное утверждение. По каким параметрам он паскаль?

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

Можешь ли ты (или ещё кто, у кого pascalABC.NET есть под рукой) привести пример кода? Интересно.

ну ты ребячишь меня, сам же требуешь фичу, для которой не можешь придумать самоочевидные примеры?

begin
  var i: integer := 10; 
  Writeln(i);
  for var i := 1 to 5 do 
    Writeln(i);
  Writeln(i);
end.


Они где-то от этого принципиально отказывались, или просто руки не дошли? А то, как известно, «никогда не говори «никогда»…

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

madcore ★★★★★
()
Последнее исправление: madcore (всего исправлений: 2)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.